00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "pStatServer.h"
00016 #include "pStatReader.h"
00017 #include "thread.h"
00018 #include "config_pstats.h"
00019
00020
00021
00022
00023
00024
00025 PStatServer::
00026 PStatServer() {
00027 _listener = new PStatListener(this);
00028 _next_udp_port = 0;
00029 }
00030
00031
00032
00033
00034
00035
00036 PStatServer::
00037 ~PStatServer() {
00038 delete _listener;
00039 }
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 bool PStatServer::
00059 listen(int port) {
00060 if (port < 0) {
00061 port = pstats_port;
00062 }
00063
00064
00065 PT(Connection) rendezvous = open_TCP_server_rendezvous(port, 5);
00066
00067 if (rendezvous.is_null()) {
00068
00069 return false;
00070 }
00071
00072
00073 _listener->add_connection(rendezvous);
00074
00075 if (_next_udp_port == 0) {
00076 _next_udp_port = port + 1;
00077 }
00078 return true;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 void PStatServer::
00096 poll() {
00097
00098 while (!_lost_readers.empty()) {
00099 PStatReader *reader = _lost_readers.back();
00100 _lost_readers.pop_back();
00101
00102 reader->lost_connection();
00103 delete reader;
00104 }
00105 while (!_removed_readers.empty()) {
00106 PStatReader *reader = _removed_readers.back();
00107 _removed_readers.pop_back();
00108 delete reader;
00109 }
00110
00111 _listener->poll();
00112
00113 Readers::const_iterator ri = _readers.begin();
00114 while (ri != _readers.end()) {
00115
00116
00117 Readers::const_iterator rnext = ri;
00118 ++rnext;
00119 PStatReader *reader = (*ri).second;
00120
00121 reader->poll();
00122 reader->idle();
00123
00124 ri = rnext;
00125 }
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void PStatServer::
00142 main_loop(bool *interrupt_flag) {
00143 while (interrupt_flag == (bool *)NULL || !*interrupt_flag) {
00144 poll();
00145 Thread::sleep(0.1);
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154
00155 void PStatServer::
00156 add_reader(Connection *connection, PStatReader *reader) {
00157 _readers[connection] = reader;
00158 }
00159
00160
00161
00162
00163
00164
00165 void PStatServer::
00166 remove_reader(Connection *connection, PStatReader *reader) {
00167 Readers::iterator ri;
00168 ri = _readers.find(connection);
00169 if (ri == _readers.end() || (*ri).second != reader) {
00170 nout << "Attempt to remove undefined reader.\n";
00171 } else {
00172 _readers.erase(ri);
00173 _removed_readers.push_back(reader);
00174 }
00175 }
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 int PStatServer::
00186 get_udp_port() {
00187 if (_available_udp_ports.empty()) {
00188 return _next_udp_port++;
00189 }
00190 int udp_port = _available_udp_ports.front();
00191 _available_udp_ports.pop_front();
00192 return udp_port;
00193 }
00194
00195
00196
00197
00198
00199
00200
00201 void PStatServer::
00202 release_udp_port(int port) {
00203 _available_udp_ports.push_back(port);
00204 }
00205
00206
00207
00208
00209
00210
00211
00212 int PStatServer::
00213 get_num_user_guide_bars() const {
00214 return _user_guide_bars.size();
00215 }
00216
00217
00218
00219
00220
00221
00222 float PStatServer::
00223 get_user_guide_bar_height(int n) const {
00224 nassertr(n >= 0 && n < (int)_user_guide_bars.size(), 0.0f);
00225 return _user_guide_bars[n];
00226 }
00227
00228
00229
00230
00231
00232
00233 void PStatServer::
00234 move_user_guide_bar(int n, float height) {
00235 nassertv(n >= 0 && n < (int)_user_guide_bars.size());
00236 _user_guide_bars[n] = height;
00237 user_guide_bars_changed();
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 int PStatServer::
00247 add_user_guide_bar(float height) {
00248 int n = (int)_user_guide_bars.size();
00249 _user_guide_bars.push_back(height);
00250 user_guide_bars_changed();
00251
00252 return n;
00253 }
00254
00255
00256
00257
00258
00259
00260
00261
00262 void PStatServer::
00263 remove_user_guide_bar(int n) {
00264 nassertv(n >= 0 && n < (int)_user_guide_bars.size());
00265 _user_guide_bars.erase(_user_guide_bars.begin() + n);
00266 user_guide_bars_changed();
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276 int PStatServer::
00277 find_user_guide_bar(float from_height, float to_height) const {
00278 GuideBars::const_iterator gbi;
00279 for (gbi = _user_guide_bars.begin();
00280 gbi != _user_guide_bars.end();
00281 ++gbi) {
00282 float height = (*gbi);
00283 if (height >= from_height && height <= to_height) {
00284 return (int)(gbi - _user_guide_bars.begin());
00285 }
00286 }
00287
00288 return -1;
00289 }
00290
00291
00292
00293
00294
00295
00296 void PStatServer::
00297 user_guide_bars_changed() {
00298 Readers::iterator ri;
00299 for (ri = _readers.begin(); ri != _readers.end(); ++ri) {
00300 (*ri).second->get_monitor()->user_guide_bars_changed();
00301 }
00302 }
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 bool PStatServer::
00320 is_thread_safe() {
00321 return false;
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331 void PStatServer::
00332 connection_reset(const PT(Connection) &connection, bool okflag) {
00333
00334
00335 close_connection(connection);
00336
00337 Readers::iterator ri;
00338 ri = _readers.find(connection);
00339 if (ri != _readers.end()) {
00340 PStatReader *reader = (*ri).second;
00341 _readers.erase(ri);
00342
00343
00344
00345
00346 _lost_readers.push_back(reader);
00347 }
00348 }