File: SessionManager.h

package info (click to toggle)
dc-qt 0.2.0.alpha-4
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 1,948 kB
  • ctags: 5,361
  • sloc: cpp: 28,936; makefile: 19
file content (100 lines) | stat: -rw-r--r-- 2,976 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#ifndef SESSION_MANAGER_H__
#define SESSION_MANAGER_H__

#include "../dcpp/stdinc.h"
#include "../dcpp/DCPlusPlus.h"
#include "../dcpp/User.h"
#include "../dcpp/Util.h"
#include "../dcpp/Client.h"
#include <dcpp/ClientManager.h>
#include "../dcpp/ClientManagerListener.h"
#include "../dcpp/HashManager.h"
#include "../dcpp/TimerManager.h"
#include <dcpp/HubManager.h>

#include "Session.h"
#include "User.h"

#include <pthread.h>
#include "Stack.h"
#include <ext/hash_map>
#include <boost/thread/recursive_mutex.hpp>

namespace dcqt_backend {

//! Provides mapping between dc++ Client objects and our own Session's.
class SessionManager : public ClientManagerListener, public TimerManagerListener, public HubManagerListener
{
public:

  virtual ~SessionManager();

  int createSession(const string& url);
  void closeSession(int);
  Session *getSession(int);
  Session *getSession(Client*);

  virtual void on(ClientManagerListener::ClientConnected, Client* c) throw();
  virtual void on(ClientManagerListener::ClientUpdated, Client* c) throw();
  virtual void on(ClientManagerListener::ClientDisconnected, Client* c) throw();
  virtual void on(TimerManagerListener::Second, u_int32_t) throw();
  virtual void on(HubManagerListener::DownloadStarting, const string&) throw();
  virtual void on(HubManagerListener::DownloadFailed, const string&) throw();
  virtual void on(HubManagerListener::DownloadFinished, const string&) throw();
  virtual void on(HubManagerListener::FavoriteAdded, const FavoriteHubEntry*) throw();
  virtual void on(HubManagerListener::FavoriteRemoved, const FavoriteHubEntry*) throw();
  
  static SessionManager* instance() {if(!inst) inst = new SessionManager;return inst;}

  map<int,Session*>* getSessionMap() { return &intSessionMap; }

  //void aquireLock();
  //void releaseLock();

  //! Used to map requests from the gui to a user, for example when clicking in the transfer view.
  typedef hash_map<int,::User::Ptr> IntUserPtrMap;
  //! Used to cache backend::User structs.
  typedef map< ::User::Ptr, dcqt_backend::User> UserPtrUserMap;

  UserPtrUserMap& getUserPtrMap() {return userPtrMap;}
  int generateUserId();
  IntUserPtrMap& getUserIdMap() {return userIdMap;}

	HubEntry::List getPublicHubs();
	void refreshHublist();
	FavoriteHubEntry::List& getFavouriteHubs();
    void addFavouriteHub(FavoriteHubEntry& entry);
    void removeFavouriteHub(string& server);
    
	boost::recursive_mutex sessionLock;
	
private:
  static SessionManager* inst;
  SessionManager();

  
  typedef map<Client*,Session*> ClientSessionMap;
  typedef map<int,Session*> IntSessionMap;


  ClientSessionMap clientSessionMap;
  IntSessionMap intSessionMap;

  int sessionIdCounter;

  // These two are part of the user id allocation scheme.
  int userIdCounter;
  Stack<int> userIdStack;
  IntUserPtrMap userIdMap;
  UserPtrUserMap userPtrMap;

  //pthread_mutex_t sessionLock;
  
  
  // Hashing
  int64_t hashBytesStart;
  bool hashingCompleted;
};
}

#endif