forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
ClientTable.h
Go to the documentation of this file.
1 
9 #ifndef CLIENTTABLE_H
10 #define CLIENTTABLE_H
11 
12 #include <map>
13 #include "Forest.h"
14 #include "RateSpec.h"
15 #include "UiClist.h"
16 #include "UiSetPair.h"
17 #include "IdMap.h"
18 
19 namespace forest {
20 
29 class ClientTable {
30 public:
31  ClientTable(int,int);
32  ~ClientTable();
33  bool init();
34 
35  enum sessionState { NUL_STATE, IDLE, PENDING, SUSPENDED, CONNECTED };
36  enum privileges { NUL_PRIV, LIMITED, STANDARD, ADMIN, ROOT };
37 
38  // global parameters
39  const RateSpec& getDefRates() const;
40  const RateSpec& getTotalRates() const;
41 
42  bool validClient(int) const;
43 
44  // iteration methods
45  int firstClient();
46  int nextClient(int);
47  int firstSession(int) const;
48  int nextSession(int, int) const;
49 
50  // access routines for client info
51  bool isLocked(int) const;
52  int getClient(const string&);
53  void releaseClient(int);
54  int getSession(fAdr_t);
55  const string& getPassword(int) const;
56  const string& getClientName(int) const;
57  const string& getRealName(int) const;
58  const string& getEmail(int) const;
59  privileges getPrivileges(int) const;
60  RateSpec& getDefRates(int) const;
61  RateSpec& getTotalRates(int) const;
62  RateSpec& getAvailRates(int) const;
63  int getNumSess(int) const;
64  bool checkPassword(int,string&) const;
65 
66  // for session info
67  int getNumClients() const;
68  int getMaxClients() const;
69  int getMaxClx() const;
70  int getClientIndex(int) const;
71  fAdr_t getClientAdr(int) const;
72  ipa_t getClientIp(int) const;
73  fAdr_t getRouterAdr(int) const;
74  sessionState getState(int) const;
75  time_t getStartTime(int) const;
76  RateSpec& getSessRates(int) const;
77 
78  // add/remove/modify table entries
79  int addClient(string&, string&, privileges, int=0);
80  void removeClient(int);
81  int addSession(fAdr_t, fAdr_t, int);
82  void removeSession(int);
83 
84  void setClientName(int, const string&);
85  void setPassword(int, const string&);
86  void setPrivileges(int, privileges);
87  void setRealName(int, const string&);
88  void setEmail(int, const string&);
89  void setClientIndex(int,int);
90  //void setClientAdr(int,fAdr_t);
91  void setClientIp(int,ipa_t);
92  void setRouterAdr(int,fAdr_t);
93  void setState(int,sessionState);
94  void setStartTime(int, time_t);
95 
96  // input/output of table contents
97  //bool readRecord(NetBuffer&, int);
98  bool readEntry(istream&, int=0);
99  bool read(istream&);
100  string& toString(string&, bool=false);
101  string& client2string(int, string&, bool=false) const;
102  string& session2string(int, string&) const;
103  void write(ostream&, bool=false);
104 
105  // locking/unlocking the internal maps
106  // (client name-to-index, client address-to-session)
107  void lockMap();
108  void unlockMap();
109 private:
110  int maxCli;
111  int maxSess;
112  int maxClx;
113 
114  struct Session {
116  ipa_t cliIp;
118  int clx;
119  sessionState state;
120  time_t start;
121  RateSpec rates;
123  };
125  UiClist *sessLists;
126 
127  struct Client {
128  string cname;
129  string pwd;
130  privileges priv;
131  string realName;
132  string email;
136  int numSess;
137  int firstSess;
138  bool busyBit;
139  pthread_cond_t busyCond;
140  };
141 
144 
146 
147  static const int RECORD_SIZE = 256;
148  fstream clientFile;
149 
150  UiSetPair *clients;
151  IdMap *sessMap;
152  map<string, int> *nameMap;
153 
154  pthread_mutex_t mapLock;
155 
158  uint64_t key(fAdr_t) const;
159  bool readEntry(istream&);
160  int fileSize();
161 
162 };
163 
164 inline bool ClientTable::validClient(int clx) const {
165  return clients->isIn(clx);
166 }
167 
168 inline int ClientTable::getNumClients() const {
169  return clients->getNumIn();
170 }
171 
172 inline int ClientTable::getMaxClients() const { return maxCli; }
173 inline int ClientTable::getMaxClx() const { return maxClx; }
174 
178 inline const RateSpec& ClientTable::getDefRates() const {
179  return defRates;
180 }
181 
185 inline const RateSpec& ClientTable::getTotalRates() const {
186  return totalRates;
187 }
188 
189 inline bool ClientTable::isLocked(int clx) const {
190  return cvec[clx].busyBit;
191 }
192 
201 inline int ClientTable::firstSession(int clx) const {
202  return cvec[clx].firstSess;
203 }
204 
214 inline int ClientTable::nextSession(int sess, int clx) const {
215  return (sessLists->suc(sess) == cvec[clx].firstSess ?
216  0 : sessLists->suc(sess));
217 }
218 
224 inline const string& ClientTable::getPassword(int clx) const {
225  return cvec[clx].pwd;
226 }
227 
232 inline const string& ClientTable::getClientName(int clx) const {
233  return cvec[clx].cname;
234 }
235 
240 inline int ClientTable::getNumSess(int clx) const {
241  return cvec[clx].numSess;
242 }
243 
249 inline bool ClientTable::checkPassword(int clx, string& pwd) const {
250  return cvec[clx].pwd == pwd;
251 }
252 
257 inline const string& ClientTable::getRealName(int clx) const {
258  return cvec[clx].realName;
259 }
260 
265 inline const string& ClientTable::getEmail(int clx) const {
266  return cvec[clx].email;
267 }
268 
273 inline ClientTable::privileges ClientTable::getPrivileges(int clx) const {
274  return cvec[clx].priv;
275 }
276 
281 inline RateSpec& ClientTable::getDefRates(int clx) const {
282  return cvec[clx].defRates;
283 }
284 
289 inline RateSpec& ClientTable::getAvailRates(int clx) const {
290  return cvec[clx].availRates;
291 }
292 
297 inline RateSpec& ClientTable::getTotalRates(int clx) const {
298  return cvec[clx].totalRates;
299 }
300 
305 inline fAdr_t ClientTable::getClientAdr(int sess) const {
306  return svec[sess].cliAdr;
307 }
308 
313 inline ipa_t ClientTable::getClientIp(int sess) const {
314  return svec[sess].cliIp;
315 }
316 
321 inline int ClientTable::getClientIndex(int sess) const {
322  return svec[sess].clx;
323 }
324 
329 inline fAdr_t ClientTable::getRouterAdr(int sess) const {
330  return svec[sess].rtrAdr;
331 }
332 
337 inline time_t ClientTable::getStartTime(int sess) const {
338  return svec[sess].start;
339 }
340 
345 inline RateSpec& ClientTable::getSessRates(int sess) const {
346  return svec[sess].rates;
347 }
348 
353 inline void ClientTable::setClientName(int clx, const string& cname) {
354  cvec[clx].cname = cname;
355 }
356 
361 inline void ClientTable::setPassword(int clx, const string& pwd) {
362  cvec[clx].pwd = pwd;
363 }
364 
369 inline void ClientTable::setRealName(int clx, const string& realName) {
370  cvec[clx].realName = realName;
371 }
372 
377 inline void ClientTable::setEmail(int clx, const string& email) {
378  cvec[clx].email = email;
379 }
380 
385 inline void ClientTable::setPrivileges(int clx, ClientTable::privileges priv) {
386  cvec[clx].priv = priv;
387 }
388 
399 inline void ClientTable::setClientIp(int sess, ipa_t ipa) {
400  svec[sess].cliIp = ipa;
401 }
402 
406 inline void ClientTable::setRouterAdr(int sess, fAdr_t radr) {
407  svec[sess].rtrAdr = radr;
408 }
409 
413 inline void ClientTable::setState(int sess, sessionState state) {
414  svec[sess].state = state;
415 }
416 
420 inline void ClientTable::setStartTime(int sess, time_t t) {
421  svec[sess].start = t;
422 }
423 
428 inline uint64_t ClientTable::key(fAdr_t cliAdr) const {
429  return (uint64_t(cliAdr) << 32) | cliAdr;
430 }
431 
438 inline void ClientTable::lockMap() { pthread_mutex_lock(&mapLock); }
439 
442 inline void ClientTable::unlockMap() { pthread_mutex_unlock(&mapLock); }
443 
444 } // ends namespace
445 
446 
447 #endif