00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _TMW_TOKENCOLLECTOR_HPP
00022 #define _TMW_TOKENCOLLECTOR_HPP
00023
00024 #include <string>
00025 #include <list>
00026 #include <time.h>
00027
00031 class TokenCollectorBase
00032 {
00033 struct Item
00034 {
00035 std::string token;
00036 intptr_t data;
00037 time_t timeStamp;
00038 };
00039
00044 std::list<Item> mPendingClients;
00045
00050 std::list<Item> mPendingConnects;
00051
00055 time_t mLastCheck;
00056
00057 protected:
00058
00059 virtual void removedClient(intptr_t) = 0;
00060 virtual void removedConnect(intptr_t) = 0;
00061 virtual void foundMatch(intptr_t client, intptr_t connect) = 0;
00062 TokenCollectorBase();
00063 virtual ~TokenCollectorBase();
00064 void insertClient(const std::string &, intptr_t);
00065 void removeClient(intptr_t);
00066 void insertConnect(const std::string &, intptr_t);
00067 void removeOutdated(time_t);
00068 };
00069
00074 template< class T > struct _TC_CheckData;
00075 template<> struct _TC_CheckData< int > {};
00076 template< class T > struct _TC_CheckData< T * > {};
00077
00089 template< class Handler, class Client, class ServerData >
00090 class TokenCollector: private TokenCollectorBase
00091 {
00092
00093 public:
00094
00095 TokenCollector(Handler *h): mHandler(h)
00096 {
00097 _TC_CheckData<Client> ClientMustBeSimple;
00098 (void)&ClientMustBeSimple;
00099 _TC_CheckData<ServerData> ServerDataMustBeSimple;
00100 (void)&ServerDataMustBeSimple;
00101 }
00102
00107 void addPendingClient(const std::string &token, Client data)
00108 { insertClient(token, (intptr_t)data); }
00109
00114 void addPendingConnect(const std::string &token, ServerData data)
00115 { insertConnect(token, (intptr_t)data); }
00116
00121 void deletePendingClient(Client data)
00122 { removeClient((intptr_t)data); }
00123
00124 private:
00125
00126 void removedClient(intptr_t data)
00127 { mHandler->deletePendingClient((Client)data); }
00128
00129 void removedConnect(intptr_t data)
00130 { mHandler->deletePendingConnect((ServerData)data); }
00131
00132 void foundMatch(intptr_t client, intptr_t data)
00133 { mHandler->tokenMatched((Client)client, (ServerData)data); }
00134
00135 Handler *mHandler;
00136 };
00137
00138 #endif // _TMW_TOKENCOLLECTOR_HPP