PageRenderTime 26ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/MT/MT_GUI/server/MT_Server.h

http://github.com/leonard-lab/MADTraC
C Header | 186 lines | 139 code | 43 blank | 4 comment | 1 complexity | 49f7065e28dda5895551a35d772b73bc MD5 | raw file
Possible License(s): GPL-2.0
  1. #ifndef MT_SERVER
  2. #define MT_SERVER
  3. #include "wx/socket.h"
  4. #include <vector>
  5. #include <string>
  6. class MT_ServerModule;
  7. class MT_Client;
  8. class MT_Server : public wxEvtHandler
  9. {
  10. friend class MT_ServerModule;
  11. public:
  12. typedef unsigned char t_cmd;
  13. typedef unsigned char t_msg;
  14. typedef struct t_msg_def
  15. {
  16. unsigned char server_code;
  17. unsigned char client_code;
  18. const char* description;
  19. MT_ServerModule* handler;
  20. } t_msg_def;
  21. static const long s_lDefaultPort = 3000;
  22. static const long s_lNoInit = -1;
  23. static const t_cmd cmd_Init = 0xFE;
  24. static const t_cmd cmd_Ping = 0xFD;
  25. static const t_cmd cmd_List = 0xFC;
  26. typedef enum
  27. {
  28. err_no_error,
  29. err_invalid_port,
  30. err_init_failed,
  31. err_ack_failed,
  32. err_connect_failed,
  33. err_msg_table_init_failed
  34. } err_code;
  35. /* NOTE: when adding a built-in message, you should add the code
  36. * here AND the definition in builtin_msgs in the source file */
  37. enum
  38. {
  39. msg_END = 1,
  40. msg_ACK,
  41. msg_OK,
  42. msg_ERR,
  43. msg_UNKNOWN,
  44. msg_UPTIME,
  45. msg_MOTD,
  46. } builtin_msg_codes;
  47. /* defined below */
  48. static const t_msg_def sentinel_msg;
  49. static t_msg_def builtin_msgs[];
  50. private:
  51. wxSocketServer* m_pSocketServer;
  52. bool m_bBusy;
  53. int m_iNumClients;
  54. static bool m_bDebugOutput;
  55. static FILE* m_pDebugFile;
  56. double m_dStartupTime;
  57. double getUptime();
  58. std::vector<t_msg_def> m_vMessageTable;
  59. std::vector<MT_ServerModule*> m_vpModules;
  60. bool addMessagesToTable(t_msg_def* p_msgs);
  61. bool initMessageTable();
  62. void onServerEvent(wxSocketEvent& event);
  63. void onSocketEvent(wxSocketEvent& event);
  64. /* Command responses */
  65. void Communicate(wxSocketBase* sock);
  66. void PingReply(wxSocketBase* sock);
  67. void SendMessageList(wxSocketBase* sock);
  68. void sendUptime(wxSocketBase* sock);
  69. void sendMOTD(wxSocketBase* sock);
  70. bool handleMessage(t_msg msg_code, wxSocketBase* sock);
  71. protected:
  72. long m_lPort;
  73. std::string m_sMOTD;
  74. t_msg ReceiveMessage(wxSocketBase* sock);
  75. err_code SendMessage(wxSocketBase* sock,
  76. t_msg message);
  77. static void SendAcknowledge(wxSocketBase* sock);
  78. static err_code GetAcknowledge(wxSocketBase* sock);
  79. t_msg getFirstAvailableMessageCode();
  80. public:
  81. MT_Server();
  82. ~MT_Server();
  83. err_code doInit(long port = s_lDefaultPort);
  84. static void enableDebugOutput(FILE* setfile = stdout)
  85. {m_bDebugOutput = true; m_pDebugFile = setfile;};
  86. static void disableDebugOutput(){m_bDebugOutput = false;};
  87. bool registerModule(MT_ServerModule* pModule);
  88. static int countNumMessages(t_msg_def* message_list);
  89. static bool isSentinelMessage(t_msg_def* p_message_def);
  90. static t_msg_def makeMessage(unsigned char server_code,
  91. unsigned char client_code,
  92. const char* desc,
  93. MT_ServerModule* handler);
  94. static void sendInt(int val, wxSocketBase* sock);
  95. static void sendString(std::string str, wxSocketBase* sock);
  96. static void sendCharArray(const char* arr,
  97. unsigned int length,
  98. wxSocketBase* sock);
  99. static int readInt(wxSocketBase* sock);
  100. private:
  101. DECLARE_EVENT_TABLE()
  102. };
  103. MT_Server::t_msg MT_SendCommand(MT_Server::t_cmd command, wxSocketBase* sock);
  104. bool MT_SendMessage(MT_Server::t_msg message, wxSocketBase* sock);
  105. MT_Server::t_msg MT_ReceiveMessage(wxSocketBase* sock, bool force_ack = false);
  106. void MT_SendAck(wxSocketBase* sock);
  107. bool MT_GetAck(wxSocketBase* sock);
  108. bool MT_SendInt(int val, wxSocketBase* sock);
  109. int MT_ReadInt(wxSocketBase* sock);
  110. bool MT_SendString(std::string str, wxSocketBase* sock);
  111. bool MT_SendCharArray(const char* arr,
  112. unsigned int length,
  113. wxSocketBase* sock);
  114. bool MT_SendDouble(double val, wxSocketBase* sock);
  115. bool MT_SendDoubleArray(double* arr, unsigned int num, wxSocketBase* sock);
  116. double MT_ReadDouble(wxSocketBase* sock);
  117. std::string MT_ReadString(wxSocketBase* sock);
  118. class MT_ServerModule
  119. {
  120. friend class MT_Server;
  121. friend class MT_Client;
  122. private:
  123. protected:
  124. MT_Server* m_pServer;
  125. MT_Server::t_msg_def* m_pMessages;
  126. std::string m_sName;
  127. virtual bool handleMessage(MT_Server::t_msg msg_code,
  128. wxSocketBase* sock)
  129. {return false;};
  130. std::vector<unsigned char> m_vMessageMap;
  131. virtual MT_Server::t_msg_def* getMessageDefs(){return m_pMessages;};
  132. virtual MT_Server::t_msg_def* setMessages(MT_Server::t_msg_def* messages);
  133. public:
  134. MT_ServerModule(const char* name)
  135. : m_pServer(NULL), m_pMessages(NULL), m_sName(name) {};
  136. MT_ServerModule(MT_Server* pServer, const char* name)
  137. : m_pServer(pServer), m_pMessages(NULL), m_sName(name) {};
  138. virtual ~MT_ServerModule(){if(m_pMessages) free(m_pMessages);};
  139. virtual bool doInit() {return true;};
  140. std::string getName(){return m_sName;};
  141. bool isForClient(){return (m_pServer == NULL);};
  142. };
  143. #endif