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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/*
* Copyright (C) 2001-2005 Jacek Sieka, arnetheduck on gmail point com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#if !defined(AFX_CLIENTMANAGER_H__8EF173E1_F7DC_40B5_B2F3_F92297701034__INCLUDED_)
#define AFX_CLIENTMANAGER_H__8EF173E1_F7DC_40B5_B2F3_F92297701034__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "TimerManager.h"
#include "Client.h"
#include "Singleton.h"
#include "ClientManagerListener.h"
class ClientManager : public Speaker<ClientManagerListener>,
private ClientListener, public Singleton<ClientManager>,
private TimerManagerListener
{
public:
Client* getClient(const string& aHubURL);
void putClient(Client* aClient);
size_t getUserCount() {
Lock l(cs);
size_t c = 0;
for(Client::Iter i = clients.begin(); i != clients.end(); ++i) {
c+=(*i)->getUserCount();
}
return c;
}
int64_t getAvailable() {
Lock l(cs);
int64_t c = 0;
for(Client::Iter i = clients.begin(); i != clients.end(); ++i) {
c+=(*i)->getAvailable();
}
return c;
}
bool isConnected(const string& aAddress, short port) {
Lock l(cs);
for(Client::Iter i = clients.begin(); i != clients.end(); ++i) {
if(((*i)->getAddress() == aAddress || (*i)->getIp() == aAddress) && (*i)->getPort() == port) {
return true;
}
}
return false;
}
void search(int aSizeMode, int64_t aSize, int aFileType, const string& aString, const string& aToken);
void search(StringList& who, int aSizeMode, int64_t aSize, int aFileType, const string& aString, const string& aToken);
void infoUpdated();
User::Ptr getUser(const CID& cid, bool createUser);
User::Ptr getUser(const CID& cid, Client* aClient, bool putOnline = true);
User::Ptr getUser(const string& aNick, const string& aHint = Util::emptyString);
User::Ptr getUser(const string& aNick, Client* aClient, bool putOnline = true);
bool isOnline(const string& aNick) {
Lock l(cs);
UserPair i = users.equal_range(aNick);
for(UserIter j = i.first; j != i.second; ++j) {
if(j->second->isOnline())
return true;
}
return false;
}
/**
* A user went offline. Must be called whenever a user quits a hub.
* @param quitHub The user went offline because (s)he disconnected from the hub.
*/
void putUserOffline(User::Ptr& aUser, bool quitHub = false);
void lock() throw() { cs.enter(); }
void unlock() throw() { cs.leave(); }
Client::List& getClients() { return clients; }
void removeClientListener(ClientListener* listener) {
Lock l(cs);
Client::Iter endIt = clients.end();
for(Client::Iter it = clients.begin(); it != endIt; ++it) {
Client* client = *it;
client->removeListener(listener);
}
}
private:
typedef HASH_MULTIMAP_X(string, User::Ptr, noCaseStringHash, noCaseStringEq, noCaseStringLess) UserMap;
typedef UserMap::iterator UserIter;
typedef pair<UserIter, UserIter> UserPair;
typedef HASH_MULTIMAP_X(CID, User::Ptr, CID::Hash, equal_to<CID>, less<CID>) AdcMap;
typedef AdcMap::iterator AdcIter;
typedef pair<AdcIter, AdcIter> AdcPair;
Client::List clients;
CriticalSection cs;
UserMap users;
AdcMap adcUsers;
Socket s;
friend class Singleton<ClientManager>;
ClientManager() {
TimerManager::getInstance()->addListener(this);
};
virtual ~ClientManager() throw() { TimerManager::getInstance()->removeListener(this); };
// ClientListener
virtual void on(Connected, Client* c) throw() { fire(ClientManagerListener::ClientConnected(), c); }
virtual void on(UsersUpdated, Client* c, const User::List&) throw() { fire(ClientManagerListener::ClientUpdated(), c); }
virtual void on(Failed, Client*, const string&) throw();
virtual void on(HubUpdated, Client* c) throw() { fire(ClientManagerListener::ClientUpdated(), c); }
virtual void on(UserCommand, Client*, int, int, const string&, const string&) throw();
virtual void on(NmdcSearch, Client* aClient, const string& aSeeker, int aSearchType, int64_t aSize,
int aFileType, const string& aString) throw();
virtual void on(AdcSearch, Client* c, const AdcCommand& adc) throw();
// TimerManagerListener
virtual void on(TimerManagerListener::Minute, u_int32_t aTick) throw();
};
#endif // !defined(AFX_CLIENTMANAGER_H__8EF173E1_F7DC_40B5_B2F3_F92297701034__INCLUDED_)
/**
* @file
* $Id: ClientManager.h,v 1.2 2005/08/21 14:03:43 olof Exp $
*/
|