00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "pandaSystem.h"
00016 #include "pandaVersion.h"
00017 #include "dtool_platform.h"
00018
00019 PandaSystem *PandaSystem::_global_ptr = NULL;
00020 TypeHandle PandaSystem::_type_handle;
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 PandaSystem::
00031 PandaSystem() :
00032 _systems(get_class_type())
00033 {
00034 _system_names_dirty = false;
00035
00036
00037
00038 _package_version_string = PANDA_PACKAGE_VERSION_STR;
00039 _package_host_url = PANDA_PACKAGE_HOST_URL;
00040 }
00041
00042
00043
00044
00045
00046
00047 PandaSystem::
00048 ~PandaSystem() {
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 string PandaSystem::
00060 get_version_string() {
00061 return PANDA_VERSION_STR;
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 string PandaSystem::
00088 get_package_version_string() {
00089 #ifdef NDEBUG
00090 return PANDA_PACKAGE_VERSION_STR;
00091 #else
00092 return get_global_ptr()->_package_version_string;
00093 #endif
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 string PandaSystem::
00113 get_package_host_url() {
00114 #ifdef NDEBUG
00115 return PANDA_PACKAGE_HOST_URL;
00116 #else
00117 return get_global_ptr()->_package_host_url;
00118 #endif
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 string PandaSystem::
00138 get_p3d_coreapi_version_string() {
00139 #ifndef P3D_COREAPI_VERSION_STR
00140 return "";
00141 #else
00142 return P3D_COREAPI_VERSION_STR;
00143 #endif
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 int PandaSystem::
00155 get_major_version() {
00156 return PANDA_MAJOR_VERSION;
00157 }
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 int PandaSystem::
00169 get_minor_version() {
00170 return PANDA_MINOR_VERSION;
00171 }
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 int PandaSystem::
00183 get_sequence_version() {
00184 return PANDA_SEQUENCE_VERSION;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 bool PandaSystem::
00201 is_official_version() {
00202 #ifdef PANDA_OFFICIAL_VERSION
00203 return true;
00204 #else
00205 return false;
00206 #endif
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 string PandaSystem::
00218 get_distributor() {
00219 return PANDA_DISTRIBUTOR;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229 string PandaSystem::
00230 get_compiler() {
00231 #if defined(_MSC_VER)
00232
00233 ostringstream strm;
00234 strm << "MSC v." << _MSC_VER;
00235
00236
00237
00238 #if defined(_M_IX86)
00239 #ifdef MS_WIN64
00240 strm << " 64 bit (Intel)";
00241 #else // MS_WIN64
00242 strm << " 32 bit (Intel)";
00243 #endif // MS_WIN64
00244 #elif defined(_M_IA64)
00245 strm << " 64 bit (Itanium)";
00246 #elif defined(_M_AMD64)
00247 strm << " 64 bit (AMD64)";
00248 #endif
00249
00250 return strm.str();
00251
00252 #elif defined(__GNUC__)
00253
00254 return "GCC " __VERSION__;
00255
00256 #else
00257
00258 return "unknown";
00259 #endif
00260 }
00261
00262
00263
00264
00265
00266
00267
00268
00269 string PandaSystem::
00270 get_build_date() {
00271 return __DATE__ " " __TIME__;
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 string PandaSystem::
00283 get_platform() {
00284 return DTOOL_PLATFORM;
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 bool PandaSystem::
00296 has_system(const string &system) const {
00297 Systems::const_iterator si;
00298 si = _systems.find(system);
00299 return (si != _systems.end());
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 int PandaSystem::
00311 get_num_systems() const {
00312 return _systems.size();
00313 }
00314
00315
00316
00317
00318
00319
00320
00321
00322 string PandaSystem::
00323 get_system(int n) const {
00324 if (n < 0 || n >= (int)_systems.size()) {
00325 return string();
00326 }
00327
00328 if (_system_names_dirty) {
00329 ((PandaSystem *)this)->reset_system_names();
00330 }
00331
00332 return _system_names[n];
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 string PandaSystem::
00349 get_system_tag(const string &system, const string &tag) const {
00350 Systems::const_iterator si;
00351 si = _systems.find(system);
00352 if (si != _systems.end()) {
00353 const SystemTags &tags = (*si).second;
00354 SystemTags::const_iterator ti;
00355 ti = tags.find(tag);
00356 if (ti != tags.end()) {
00357 return (*ti).second;
00358 }
00359 }
00360
00361 return string();
00362 }
00363
00364
00365
00366
00367
00368
00369
00370 void PandaSystem::
00371 add_system(const string &system) {
00372 bool inserted = _systems.insert(Systems::value_type(system, SystemTags(get_class_type()))).second;
00373 if (inserted) {
00374 _system_names_dirty = true;
00375 }
00376 }
00377
00378
00379
00380
00381
00382
00383
00384 void PandaSystem::
00385 set_system_tag(const string &system, const string &tag,
00386 const string &value) {
00387 pair<Systems::iterator, bool> result;
00388 result = _systems.insert(Systems::value_type(system, SystemTags(get_class_type())));
00389 if (result.second) {
00390 _system_names_dirty = true;
00391 }
00392
00393 SystemTags &tags = (*result.first).second;
00394 tags[tag] = value;
00395 }
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411 bool PandaSystem::
00412 heap_trim(size_t pad) {
00413
00414
00415
00416 return memory_hook->heap_trim(pad);
00417 }
00418
00419
00420
00421
00422
00423
00424 void PandaSystem::
00425 output(ostream &out) const {
00426 out << "Panda version " << get_version_string();
00427 }
00428
00429
00430
00431
00432
00433
00434 void PandaSystem::
00435 write(ostream &out) const {
00436 out << *this << "\n"
00437 << "compiled on " << get_build_date() << " by "
00438 << get_distributor() << "\n"
00439 << "with compiler " << PandaSystem::get_compiler() << "\n\n";
00440
00441 out << "Optional systems:\n";
00442 for (Systems::const_iterator si = _systems.begin();
00443 si != _systems.end();
00444 ++si) {
00445 out << " " << (*si).first << "\n";
00446 const SystemTags &tags = (*si).second;
00447 SystemTags::const_iterator ti;
00448 for (ti = tags.begin(); ti != tags.end(); ++ti) {
00449 out << " " << (*ti).first << " " << (*ti).second << "\n";
00450 }
00451 }
00452 }
00453
00454
00455
00456
00457
00458
00459
00460 PandaSystem *PandaSystem::
00461 get_global_ptr() {
00462 if (_global_ptr == (PandaSystem *)NULL) {
00463 _global_ptr = new PandaSystem;
00464 }
00465
00466 return _global_ptr;
00467 }
00468
00469
00470
00471
00472
00473
00474
00475
00476 void PandaSystem::
00477 reset_system_names() {
00478 _system_names.clear();
00479 _system_names.reserve(_systems.size());
00480
00481 Systems::const_iterator si;
00482 for (si = _systems.begin(); si != _systems.end(); ++si) {
00483 _system_names.push_back((*si).first);
00484 }
00485
00486 _system_names_dirty = false;
00487 }
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501 void PandaSystem::
00502 set_package_version_string(const string &package_version_string) {
00503 _package_version_string = PANDA_PACKAGE_VERSION_STR;
00504 if (_package_version_string.empty()) {
00505 _package_version_string = package_version_string;
00506 }
00507 }
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 void PandaSystem::
00522 set_package_host_url(const string &package_host_url) {
00523 _package_host_url = PANDA_PACKAGE_HOST_URL;
00524 if (_package_host_url.empty()) {
00525 _package_host_url = package_host_url;
00526 }
00527 }