00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00047 #include "../Include/Globals.h"
00048 #include "../Include/FlyLegacy.h"
00049 #include "../Include/Utility.h"
00050
00051
00052
00053
00054
00055
00056
00057
00058 static char* sgets (char* s, int maxLength, SStream *stream)
00059 {
00060 char* p = s;
00061
00062 bool keepGoing = true;
00063 while (keepGoing) {
00064 pgets (s, maxLength, (PODFILE*)stream->stream);
00065
00066
00067 p = s;
00068 while ((*p == ' ') || (*p == '\t')) p++;
00069
00070
00071 if (strncmp (p, "//", 2) != 0) keepGoing = false;
00072 }
00073
00074 return p;
00075 }
00076
00077
00078 static Tag snexttag (char* s, int maxLength, SStream *stream)
00079 {
00080 Tag tag = 0;
00081
00082 char *p;
00083 bool gotTag = false;
00084 while (!gotTag) {
00085 p = sgets (s, maxLength, stream);
00086
00087 if ((strlen(p) >= 6) && (p[0] == '<') && (p[5] == '>')) {
00088 char tagstring[5];
00089 strncpy (tagstring, (p+1), 4);
00090 tag = StringToTag (tagstring);
00091 gotTag = true;
00092 }
00093 }
00094 return tag;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00105
00106 int OpenStream(SStream *stream)
00107 {
00108 return OpenStream (&globals->pfs, stream);
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00119
00120 int OpenStream(PFS *pfs, SStream *stream)
00121 {
00122 int rc = 0;
00123
00124
00125 if (strcmp (stream->mode, "r") == 0) {
00126
00127 stream->stream = popen (pfs, stream->filename);
00128
00129 if (stream->stream != NULL) {
00130
00131 rc = 1;
00132 }
00133 }
00134
00135 return rc;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145 void CloseStream(SStream *stream)
00146 {
00147 pclose ((PODFILE*)stream->stream);
00148 stream->stream = NULL;
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 void ReadFrom(CStreamObject *object, SStream *stream)
00166 {
00167
00168
00169 char s[256];
00170 Tag tag;
00171 bool openingBgno = true;
00172
00173
00174
00175
00176 int nestCount = 0;
00177
00178
00179 while ( ! (((tag = snexttag (s, 256, stream)) == 'endo') && (nestCount == 0))) {
00180 if (tag == 'bgno') {
00181 if (openingBgno) {
00182
00183 } else {
00184
00185 nestCount++;
00186 object->Read (stream, tag);
00187 }
00188 } else if (tag == 'endo') {
00189
00190
00191 nestCount--;
00192 object->Read (stream, tag);
00193 } else {
00194
00195 object->Read (stream, tag);
00196 }
00197
00198
00199
00200 openingBgno = false;
00201 }
00202
00203
00204 object->ReadFinished();
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 void SkipObject(SStream *stream)
00219 {
00220
00221 char s[256];
00222 Tag tag;
00223 while ((tag = snexttag (s, 256, stream)) != 'bgno') {}
00224
00225
00226
00227 int nestCount = 0;
00228
00229
00230 bool keepGoing = true;
00231 while (keepGoing) {
00232 tag = snexttag (s, 256, stream);
00233
00234 if (tag == 'bgno') {
00235
00236 nestCount++;
00237 } else if (tag == 'endo') {
00238
00239
00240 if (nestCount > 0) {
00241 nestCount--;
00242 } else {
00243 keepGoing = false;
00244 }
00245 }
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254 void AdvanceToTag(unsigned int tag, SStream *stream)
00255 {
00256
00257 }
00258
00259
00260
00261
00262
00263
00264
00265 void ReadInt (int *value, SStream *stream)
00266 {
00267
00268 char s[256];
00269 char *p = sgets (s, 256, stream);
00270 *value = atoi (p);
00271 }
00272
00273
00274
00275
00276
00277
00278 void ReadUInt (unsigned int *value, SStream *stream)
00279 {
00280
00281 char s[256];
00282 char *p = sgets (s, 256, stream);
00283
00284
00285 *value = (unsigned int)(atoi(p));
00286 }
00287
00288
00289
00290
00291
00292 void ReadFloat (float *value, SStream *stream)
00293 {
00294
00295 char s[256];
00296 ReadString (s, 256, stream);
00297 *value = (float)(atof (s));
00298 }
00299
00300
00301
00302
00303
00304 void ReadDouble (double *value, SStream *stream)
00305 {
00306
00307 char s[256];
00308 ReadString (s, 256, stream);
00309 *value = atof (s);
00310 }
00311
00312
00313
00314
00315
00316 void ReadString (char *value, int maxLength, SStream *stream)
00317 {
00318
00319 char s[256];
00320 char *p = sgets (s, 256, stream);
00321
00322
00323
00324 char *q = p + strlen(p) - 1;
00325 while (isspace(*q)) q--;
00326 q++;
00327 *q = '\0';
00328
00329 if ((int)strlen(p) >= maxLength) {
00330
00331 globals->logWarning->Write ("ReadString : Line truncated (len=%d max=%d)\n%s",
00332 strlen(p), maxLength, p);
00333 strncpy (value, p, maxLength-1);
00334 } else {
00335 strcpy (value, p);
00336 }
00337 }
00338
00339
00340
00341
00342
00343 void ReadVector (SVector *value, SStream *stream)
00344 {
00345
00346 char s[256];
00347 char *p = sgets (s, 256, stream);
00348
00349
00350 float x, y, z;
00351 sscanf (p, "%f, %f, %f", &x, &y, &z);
00352 value->x = (double)x;
00353 value->y = (double)y;
00354 value->z = (double)z;
00355 }
00356
00357
00358
00359
00360
00361
00362
00363
00364 void ReadLatLon (SPosition *value, SStream *stream)
00365 {
00366
00367 char s[256];
00368 int deg, min;
00369 float sec;
00370 char hemi;
00371
00372
00373 ReadString (s, 256, stream);
00374 double lat = 0;
00375 if (sscanf (s, "%d %d %f %c", °, &min, &sec, &hemi) == 4) {
00376 switch (hemi) {
00377 case 'N':
00378 case 'n':
00379 lat = (deg * 3600.0) + (min * 60.0) + sec;
00380 break;
00381
00382 case 'S':
00383 case 's':
00384 lat = -((deg * 3600.0) + (min * 60.0) + sec);
00385 break;
00386
00387 default:
00388 gtfo ("ReadLatLon : Invalid latitude hemisphere <%c>", hemi);
00389 }
00390 } else {
00391 gtfo ("ReadLatLon : Malformed latitude string <%s>", s);
00392 }
00393 value->lat = lat;
00394
00395
00396 ReadString (s, 256, stream);
00397 double lon = 0;
00398 if (sscanf (s, "%d %d %f %c", °, &min, &sec, &hemi) == 4) {
00399 switch (hemi) {
00400 case 'E':
00401 case 'e':
00402 lon = (deg * 3600.0) + (min * 60.0) + sec;
00403 break;
00404
00405 case 'W':
00406 case 'w':
00407 lon = (360.0 * 3600.0) - ((deg * 3600.0) + (min * 60.0) + sec);
00408 break;
00409
00410 default:
00411 gtfo ("ReadPosition : Invalid longitude hemisphere <%c>", hemi);
00412 }
00413 } else {
00414 gtfo ("ReadPosition : Malformed longitude string <%s>", s);
00415 }
00416 value->lon = lon;
00417
00418
00419 value->alt = 0;
00420 }
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431 void ReadPosition (SPosition *value, SStream *stream)
00432 {
00433
00434 char s[256];
00435 int deg, min;
00436 float sec;
00437 char hemi;
00438
00439
00440 ReadString (s, 256, stream);
00441 double lat = 0;
00442 if (sscanf (s, "%d %d'%f\"%c", °, &min, &sec, &hemi) == 4) {
00443 switch (hemi) {
00444 case 'N':
00445 case 'n':
00446 lat = (deg * 3600.0) + (min * 60.0) + sec;
00447 break;
00448
00449 case 'S':
00450 case 's':
00451 lat = -((deg * 3600.0) + (min * 60.0) + sec);
00452 break;
00453
00454 default:
00455 gtfo ("ReadPosition : Invalid latitude hemisphere <%c>", hemi);
00456 }
00457 } else {
00458 gtfo ("ReadPosition : Malformed latitude string <%s>", s);
00459 }
00460 value->lat = lat;
00461
00462
00463 ReadString (s, 256, stream);
00464 double lon = 0;
00465 if (sscanf (s, "%d %d'%f\"%c", °, &min, &sec, &hemi) == 4) {
00466 switch (hemi) {
00467 case 'E':
00468 case 'e':
00469 lon = (deg * 3600.0) + (min * 60.0) + sec;
00470 break;
00471
00472 case 'W':
00473 case 'w':
00474 lon = (360.0 * 3600.0) - ((deg * 3600.0) + (min * 60.0) + sec);
00475 break;
00476
00477 default:
00478 gtfo ("ReadPosition : Invalid longitude hemisphere <%c>", hemi);
00479 }
00480 } else {
00481 gtfo ("ReadPosition : Malformed longitude string <%s>", s);
00482 }
00483 value->lon = lon;
00484
00485
00486 ReadDouble (&value->alt, stream);
00487 }
00488
00489
00490
00491
00492
00493 void ReadTime (SDateTime *value, SStream *stream)
00494 {
00495
00496 }
00497
00498
00499
00500
00501
00502 void ReadTimeDelta (SDateTimeDelta *value, SStream *stream)
00503 {
00504
00505 }
00506
00507
00508
00509
00510
00511 void ReadMessage (SMessage *msg, SStream *stream)
00512 {
00513
00514 char s[256];
00515 Tag tag;
00516
00517
00518
00519 while (((tag = snexttag (s, 256, stream)) != 'bgno') && (tag != 'bgmo')) {}
00520
00521
00522
00523 bool keepGoing = true;
00524 while (keepGoing) {
00525 tag = snexttag (s, 256, stream);
00526 switch (tag) {
00527 case 'grou':
00528 case 'conn':
00529
00530 {
00531 Tag grou;
00532 ReadTag (&grou, stream);
00533 msg->group = grou;
00534 }
00535 break;
00536
00537 case 'user':
00538 case 'usr1':
00539
00540 {
00541 char s[64];
00542 ReadString (s, 64, stream);
00543
00544 char dtag_string[16];
00545 char group_string[16];
00546 if (sscanf (s, "DATATAG,'%s'", dtag_string) == 1) {
00547 msg->user.u.datatag = StringToTag (dtag_string);
00548 } else if (sscanf (s, "GROUP,'%s'", group_string) == 1) {
00549 msg->group = StringToTag (group_string);
00550 }
00551 }
00552 break;
00553
00554 case 'dtag':
00555
00556 {
00557 Tag dtag;
00558 ReadTag (&dtag, stream);
00559 msg->user.u.datatag = dtag;
00560 }
00561 break;
00562
00563 case 'type':
00564
00565 {
00566 char s[64];
00567 ReadString (s, 64, stream);
00568
00570 }
00571 break;
00572
00573 case 'endo':
00574
00575 keepGoing = false;
00576 break;
00577
00578 default:
00579
00580 char s[64];
00581 TagToString (s, tag);
00582 globals->logWarning->Write ("ReadMessage : Unrecognized tag %s", s);
00583 }
00584 }
00585 }
00586
00587
00588
00589
00590
00591 void ReadTag (Tag *tag, SStream *stream)
00592 {
00593 char s[64];
00594 ReadString (s, 64, stream);
00595
00596
00597 while (strlen(s) < 4) {
00598 strcat (s, " ");
00599 }
00600
00601 *tag = StringToTag (s);
00602 }