00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 INLINE DatagramIterator::
00022 DatagramIterator() :
00023 _datagram((Datagram *)NULL),
00024 _current_index(0) {
00025 }
00026
00027
00028
00029
00030
00031
00032 INLINE DatagramIterator::
00033 DatagramIterator(const Datagram &datagram, size_t offset) :
00034 _datagram(&datagram),
00035 _current_index(offset) {
00036 nassertv(_current_index <= _datagram->get_length());
00037 }
00038
00039
00040
00041
00042
00043
00044 INLINE DatagramIterator::
00045 DatagramIterator(const DatagramIterator ©) :
00046 _datagram(copy._datagram),
00047 _current_index(copy._current_index) {
00048 }
00049
00050
00051
00052
00053
00054
00055 INLINE void DatagramIterator::
00056 operator = (const DatagramIterator ©) {
00057 _datagram = copy._datagram;
00058 _current_index = copy._current_index;
00059 }
00060
00061
00062
00063
00064
00065 INLINE void DatagramIterator::assign(Datagram &datagram, size_t offset)
00066 {
00067 _datagram =&datagram;
00068 _current_index = offset;
00069 }
00070
00071
00072
00073
00074
00075 INLINE DatagramIterator::
00076 ~DatagramIterator() {
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 INLINE bool DatagramIterator::
00088 get_bool() {
00089 return get_uint8() != 0;
00090 }
00091
00092
00093
00094
00095
00096
00097 INLINE PN_int8 DatagramIterator::
00098 get_int8() {
00099 nassertr(_datagram != (const Datagram *)NULL, 0);
00100
00101 nassertr(_current_index < _datagram->get_length(), 0);
00102
00103 const char *ptr = (const char *)_datagram->get_data();
00104 PN_int8 tempvar = (PN_int8)ptr[_current_index];
00105 ++_current_index;
00106
00107 return tempvar;
00108 }
00109
00110
00111
00112
00113
00114
00115 INLINE PN_uint8 DatagramIterator::
00116 get_uint8() {
00117 nassertr(_datagram != (const Datagram *)NULL, 0);
00118
00119 nassertr(_current_index < _datagram->get_length(), 0);
00120
00121 const char *ptr = (const char *)_datagram->get_data();
00122 PN_uint8 tempvar = (PN_uint8)ptr[_current_index];
00123 ++_current_index;
00124
00125 return tempvar;
00126 }
00127
00128
00129
00130
00131
00132
00133 INLINE PN_int16 DatagramIterator::
00134 get_int16() {
00135 nassertr(_datagram != (const Datagram *)NULL, 0);
00136 nassertr(_current_index < _datagram->get_length(), 0);
00137
00138 PN_int16 tempvar;
00139
00140 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00141
00142 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00143 s.store_value(&tempvar, sizeof(tempvar));
00144 _current_index += sizeof(tempvar);
00145
00146 return tempvar;
00147 }
00148
00149
00150
00151
00152
00153
00154 INLINE PN_int32 DatagramIterator::
00155 get_int32() {
00156 nassertr(_datagram != (const Datagram *)NULL, 0);
00157 nassertr(_current_index < _datagram->get_length(), 0);
00158
00159 PN_int32 tempvar;
00160
00161 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00162
00163 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00164 s.store_value(&tempvar, sizeof(tempvar));
00165 _current_index += sizeof(tempvar);
00166
00167 return tempvar;
00168 }
00169
00170
00171
00172
00173
00174
00175 INLINE PN_int64 DatagramIterator::
00176 get_int64() {
00177 nassertr(_datagram != (const Datagram *)NULL, 0);
00178 nassertr(_current_index < _datagram->get_length(), 0);
00179
00180 PN_int64 tempvar;
00181
00182 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00183
00184 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00185 s.store_value(&tempvar, sizeof(tempvar));
00186 _current_index += sizeof(tempvar);
00187
00188 return tempvar;
00189 }
00190
00191
00192
00193
00194
00195
00196 INLINE PN_uint16 DatagramIterator::
00197 get_uint16() {
00198 nassertr(_datagram != (const Datagram *)NULL, 0);
00199 nassertr(_current_index < _datagram->get_length(), 0);
00200
00201 PN_uint16 tempvar;
00202
00203 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00204
00205 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00206 s.store_value(&tempvar, sizeof(tempvar));
00207 _current_index += sizeof(tempvar);
00208
00209 return tempvar;
00210 }
00211
00212
00213
00214
00215
00216
00217 INLINE PN_uint32 DatagramIterator::
00218 get_uint32() {
00219 nassertr(_datagram != (const Datagram *)NULL, 0);
00220 nassertr(_current_index < _datagram->get_length(), 0);
00221
00222 PN_uint32 tempvar;
00223
00224 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00225
00226 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00227 s.store_value(&tempvar, sizeof(tempvar));
00228 _current_index += sizeof(tempvar);
00229
00230 return tempvar;
00231 }
00232
00233
00234
00235
00236
00237
00238 INLINE PN_uint64 DatagramIterator::
00239 get_uint64() {
00240 nassertr(_datagram != (const Datagram *)NULL, 0);
00241 nassertr(_current_index < _datagram->get_length(), 0);
00242
00243 PN_uint64 tempvar;
00244
00245 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00246
00247 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00248 s.store_value(&tempvar, sizeof(tempvar));
00249 _current_index += sizeof(tempvar);
00250
00251 return tempvar;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 INLINE float DatagramIterator::
00263 get_float32() {
00264
00265
00266
00267 nassertr(sizeof(float) == 4, 0.0f);
00268 nassertr(_datagram != (const Datagram *)NULL, 0.0);
00269 nassertr(_current_index < _datagram->get_length(), 0.0);
00270
00271 float tempvar;
00272
00273 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0.0);
00274
00275 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00276 s.store_value(&tempvar, sizeof(tempvar));
00277 _current_index += sizeof(tempvar);
00278
00279 return tempvar;
00280 }
00281
00282
00283
00284
00285
00286
00287 INLINE PN_float64 DatagramIterator::
00288 get_float64() {
00289 nassertr(_datagram != (const Datagram *)NULL, 0.0);
00290 nassertr(_current_index < _datagram->get_length(), 0.0);
00291
00292 PN_float64 tempvar;
00293
00294 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0.0);
00295
00296 LittleEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00297 s.store_value(&tempvar, sizeof(tempvar));
00298 _current_index += sizeof(tempvar);
00299
00300 return tempvar;
00301 }
00302
00303
00304
00305
00306
00307
00308 INLINE PN_int16 DatagramIterator::
00309 get_be_int16() {
00310 nassertr(_datagram != (const Datagram *)NULL, 0);
00311 nassertr(_current_index < _datagram->get_length(), 0);
00312
00313 PN_int16 tempvar;
00314
00315 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00316
00317 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00318 s.store_value(&tempvar, sizeof(tempvar));
00319 _current_index += sizeof(tempvar);
00320
00321 return tempvar;
00322 }
00323
00324
00325
00326
00327
00328
00329 INLINE PN_int32 DatagramIterator::
00330 get_be_int32() {
00331 nassertr(_datagram != (const Datagram *)NULL, 0);
00332 nassertr(_current_index < _datagram->get_length(), 0);
00333
00334 PN_int32 tempvar;
00335
00336 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00337
00338 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00339 s.store_value(&tempvar, sizeof(tempvar));
00340 _current_index += sizeof(tempvar);
00341
00342 return tempvar;
00343 }
00344
00345
00346
00347
00348
00349
00350 INLINE PN_int64 DatagramIterator::
00351 get_be_int64() {
00352 nassertr(_datagram != (const Datagram *)NULL, 0);
00353 nassertr(_current_index < _datagram->get_length(), 0);
00354
00355 PN_int64 tempvar;
00356
00357 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00358
00359 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00360 s.store_value(&tempvar, sizeof(tempvar));
00361 _current_index += sizeof(tempvar);
00362
00363 return tempvar;
00364 }
00365
00366
00367
00368
00369
00370
00371 INLINE PN_uint16 DatagramIterator::
00372 get_be_uint16() {
00373 nassertr(_datagram != (const Datagram *)NULL, 0);
00374 nassertr(_current_index < _datagram->get_length(), 0);
00375
00376 PN_uint16 tempvar;
00377
00378 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00379
00380 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00381 s.store_value(&tempvar, sizeof(tempvar));
00382 _current_index += sizeof(tempvar);
00383
00384 return tempvar;
00385 }
00386
00387
00388
00389
00390
00391
00392 INLINE PN_uint32 DatagramIterator::
00393 get_be_uint32() {
00394 nassertr(_datagram != (const Datagram *)NULL, 0);
00395 nassertr(_current_index < _datagram->get_length(), 0);
00396
00397 PN_uint32 tempvar;
00398
00399 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00400
00401 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00402 s.store_value(&tempvar, sizeof(tempvar));
00403 _current_index += sizeof(tempvar);
00404
00405 return tempvar;
00406 }
00407
00408
00409
00410
00411
00412
00413 INLINE PN_uint64 DatagramIterator::
00414 get_be_uint64() {
00415 nassertr(_datagram != (const Datagram *)NULL, 0);
00416 nassertr(_current_index < _datagram->get_length(), 0);
00417
00418 PN_uint64 tempvar;
00419
00420 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00421
00422 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00423 s.store_value(&tempvar, sizeof(tempvar));
00424 _current_index += sizeof(tempvar);
00425
00426 return tempvar;
00427 }
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437 INLINE float DatagramIterator::
00438 get_be_float32() {
00439
00440
00441
00442 nassertr(sizeof(float) == 4, 0.0f);
00443 nassertr(_datagram != (const Datagram *)NULL, 0.0);
00444 nassertr(_current_index < _datagram->get_length(), 0.0);
00445
00446 float tempvar;
00447
00448 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0);
00449
00450 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00451 s.store_value(&tempvar, sizeof(tempvar));
00452 _current_index += sizeof(tempvar);
00453
00454 return tempvar;
00455 }
00456
00457
00458
00459
00460
00461
00462 INLINE PN_float64 DatagramIterator::
00463 get_be_float64() {
00464 nassertr(_datagram != (const Datagram *)NULL, 0.0);
00465 nassertr(_current_index < _datagram->get_length(), 0.0);
00466
00467 PN_float64 tempvar;
00468
00469 nassertr(_current_index + sizeof(tempvar) <= _datagram->get_length(), 0.0);
00470
00471 BigEndian s(_datagram->get_data(), _current_index, sizeof(tempvar));
00472 s.store_value(&tempvar, sizeof(tempvar));
00473 _current_index += sizeof(tempvar);
00474
00475 return tempvar;
00476 }
00477
00478
00479
00480
00481
00482
00483
00484 INLINE void DatagramIterator::
00485 skip_bytes(size_t size) {
00486 nassertv(_datagram != (const Datagram *)NULL);
00487 nassertv((int)size >= 0);
00488 #ifndef NDEBUG
00489 if (_current_index + size > _datagram->get_length()) {
00490 nout << "datagram overflow: current_index = " << _current_index
00491 << " size = " << size << " length = " << _datagram->get_length() << "\n";
00492 _datagram->dump_hex(nout);
00493 }
00494 #endif
00495 nassertv(_current_index + size <= _datagram->get_length());
00496 _current_index += size;
00497 }
00498
00499
00500
00501
00502
00503
00504
00505 INLINE string DatagramIterator::
00506 get_remaining_bytes() const {
00507 nassertr(_datagram != (const Datagram *)NULL, "");
00508 nassertr(_current_index <= _datagram->get_length(), "");
00509
00510 const char *ptr = (const char *)_datagram->get_data();
00511 int remaining_size = _datagram->get_length() - _current_index;
00512 return string(ptr + _current_index, remaining_size);
00513 }
00514
00515
00516
00517
00518
00519
00520 INLINE int DatagramIterator::
00521 get_remaining_size() const {
00522 return _datagram->get_length() - _current_index;
00523 }
00524
00525
00526
00527
00528
00529
00530 INLINE const Datagram &DatagramIterator::
00531 get_datagram() const {
00532 return *_datagram;
00533 }
00534
00535
00536
00537
00538
00539
00540
00541 INLINE size_t DatagramIterator::
00542 get_current_index() const {
00543 return _current_index;
00544 }
00545
00546 INLINE void
00547 generic_read_datagram(bool &result, DatagramIterator &source) {
00548 result = source.get_bool();
00549 }
00550
00551 INLINE void
00552 generic_read_datagram(int &result, DatagramIterator &source) {
00553 result = source.get_int32();
00554 }
00555
00556 INLINE void
00557 generic_read_datagram(float &result, DatagramIterator &source) {
00558 result = source.get_float32();
00559 }
00560
00561 INLINE void
00562 generic_read_datagram(double &result, DatagramIterator &source) {
00563 result = source.get_float64();
00564 }
00565
00566 INLINE void
00567 generic_read_datagram(string &result, DatagramIterator &source) {
00568 result = source.get_string();
00569 }
00570
00571 INLINE void
00572 generic_read_datagram(wstring &result, DatagramIterator &source) {
00573 result = source.get_wstring();
00574 }
00575
00576