\r
#include "message.hxx"\r
\r
+FGMPSInstanceFuncMap FGMPSMessage::funcmap;\r
+\r
FGMPSMessage::FGMPSMessage() \r
{\r
msgid = 0x0000;\r
\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