]> git.mxchange.org Git - flightgear.git/blobdiff - src/Server/message.cxx
Tune up the starter torque to match the recent changes to engine
[flightgear.git] / src / Server / message.cxx
index e06964c5e673abd5f1401e37b8ecc5808c4f6cce..1844b434c5f7507b07f839dbbf2796aefa224aca 100644 (file)
@@ -22,6 +22,8 @@
 \r
 #include "message.hxx"\r
 \r
+FGMPSInstanceFuncMap   FGMPSMessage::funcmap;\r
+\r
 FGMPSMessage::FGMPSMessage() \r
 {\r
        msgid = 0x0000;\r
@@ -30,5 +32,118 @@ FGMPSMessage::FGMPSMessage()
        \r
 }\r
 \r
+string FGMPSMessage::encodemsg()\r
+{\r
+       FGMPSMsgElementEntry* ptr = getelements();\r
+\r
+       buf.clr();\r
+       if (msgid > 255) {\r
+               buf.put(fgmps_som16, true);\r
+               buf.write2(&msgid);\r
+       } else {\r
+               buf.put(fgmps_som8, true);\r
+               buf.write1(&msgid);\r
+       }\r
+       while (ptr->type != fgmps_null) {\r
+               buf.put(ptr->type, true);\r
+               //printf ("adding %02x\n", ptr->type);\r
+               switch (ptr->type) {\r
+               case fgmps_uchar:\r
+               case fgmps_char:\r
+                       buf.write1(ptr->data);\r
+                       break;\r
+               case fgmps_uint:\r
+               case fgmps_int:\r
+                       buf.write2(ptr->data);\r
+                       break;\r
+               case fgmps_ulong:\r
+               case fgmps_long:\r
+                       buf.write4(ptr->data);\r
+                       break;\r
+               case fgmps_float:\r
+                       buf.writef(*(float*)ptr->data);\r
+                       break;\r
+               case fgmps_double:\r
+                       buf.writed(*(double*)ptr->data);\r
+                       break;\r
+               case fgmps_string:\r
+                       buf.writes(*(string*)ptr->data);\r
+                       break;\r
+               }\r
+               ptr++;\r
+       }\r
+\r
+       buf.put(fgmps_eom, true);\r
+\r
+       return buf.str();\r
+}\r
+\r
+FGMPSMessage* FGMPSMessage::decodemsg(string msg)\r
+{\r
+       FGMPSMessageBuf                 buf;\r
+       unsigned char                   ch;\r
+       unsigned int                    mid;\r
+       FGMPSInstanceFuncMap::iterator  fmitr;\r
+\r
+       buf.set(msg);\r
+       buf.ofs(0);\r
+       ch = buf.get(true);\r
+       if (ch != fgmps_som8 && ch != fgmps_som16) {\r
+               throw FGMPSDataException("Invalid start of message");\r
+       }\r
+       if (ch == fgmps_som8) {\r
+               ch = buf.get();\r
+               mid = ch;\r
+       } else {\r
+               mid = *(unsigned int *)buf.read2();\r
+       }\r
+       \r
+       fmitr = funcmap.find(mid);\r
+       if (fmitr == funcmap.end()) {\r
+               throw FGMPSDataException("MessageID has no registered Message Class");\r
+       }\r
+       FGMPSMessage* msgclass = (fmitr->second)();\r
+       FGMPSMsgElementEntry* elements = msgclass->getelements();\r
+       while ((ch = buf.get()) != fgmps_eom) {\r
+               //printf("dump: ");\r
+               //for (int i=-1; i<16; i++) printf("%02x ", buf.peek(i));\r
+               //printf("\n");\r
+\r
+               if (ch != elements->type) {\r
+                       delete msgclass;\r
+                       throw FGMPSDataException("Decode: Message Structure Error");\r
+               }\r
+               switch (ch) {\r
+               case fgmps_uchar:\r
+               case fgmps_char:\r
+                       memcpy(elements->data, buf.read1(), 1);\r
+                       break;\r
+               case fgmps_uint:\r
+               case fgmps_int:\r
+                       memcpy(elements->data, buf.read2(), 2);\r
+                       break;\r
+               case fgmps_ulong:\r
+               case fgmps_long:\r
+                       memcpy(elements->data, buf.read4(), 4);\r
+                       break;\r
+               case fgmps_float:\r
+                       *(float*)elements->data = buf.readf();\r
+                       break;\r
+               case fgmps_double:\r
+                       *(double*)elements->data = buf.readd();\r
+                       break;\r
+               case fgmps_string:\r
+                       ch = buf.get();\r
+                       *(string*)elements->data = buf.reads(ch);\r
+                       break;\r
+               default:\r
+                       delete msgclass;\r
+                       throw FGMPSDataException("Decode: Unknown data type");\r
+                       break;\r
+               }\r
+               elements++;\r
+       }\r
+       return msgclass;\r
+}\r
 \r
 \r