request.h
上传用户:egreat
上传日期:2007-07-13
资源大小:29k
文件大小:4k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #ifndef _STOCK_REQUEST_H_
  2. #define _STOCK_REQUEST_H_
  3. #include "config.h"
  4. #include <queue>
  5. #include <loki/singleton.h>
  6. #include <loki/Factory.h>
  7. #include "tcpSocket.h"
  8. #include "stock.h"
  9. namespace StockMarket
  10. {
  11. using namespace std;
  12. using namespace boost;
  13. using namespace Loki;
  14. #pragma pack(push)
  15. #pragma pack(1)
  16. extern recursive_mutex req_queue_mutex;
  17. class Request
  18. {
  19. public:
  20. Request();
  21. virtual operator bool ();
  22. virtual void send(TcpSocket& soc);
  23. virtual ~Request();
  24. virtual char* buff() = 0;
  25. virtual ulong len() = 0;
  26. void next();
  27. static void res_seq_id(uint id);
  28. static bool ready();
  29. protected:
  30. virtual Request& operator++();
  31. private:
  32. bool first;
  33. static uint seq_id;
  34. static bool received;
  35. };
  36. struct ReqHead
  37. {
  38. public:
  39. friend class Request;
  40. ReqHead(){};
  41. ReqHead( ushort cmd_id, ushort packet_len/*the total packet len*/);
  42. void set_len(ushort payload_len);
  43. ushort get_len();
  44. uint get_seq_id();
  45. private:
  46. void set_seq_id(uint id);
  47. protected:
  48. char zip; // always 0x0c: data-uncompressed
  49. uint seq_id; // 同一种命令的 seq_id。
  50. char packet_type; // 00: 回应。 1,2,3... request count
  51. ushort len; // 数据长度
  52. ushort len1; //  数据长度重复
  53. ushort cmd; // b4 bf: 分钟线。。b5 bf 单笔成交
  54. };
  55. class StockHeartBeat : public Request
  56. {
  57. public:
  58. char* buff();
  59. ulong len();
  60. private:
  61. struct StockHeartBeatStruct
  62. {
  63. StockHeartBeatStruct() : header(CMD_HEART_BEAT, sizeof(StockHeartBeatStruct)), count(1)
  64. {
  65. memcpy(&stock_code[0],"000792", MarketInfo::StocksCodeLen);
  66. location = MarketInfo::get_market_location(&stock_code[0]);
  67. }
  68. ReqHead header;
  69. ushort count;
  70. char location;
  71. char stock_code[MarketInfo::StocksCodeLen];
  72. }s;
  73. };
  74. //   0c 22 07 0a 00 01 0c 00 0c 00 24 05 00 00 00 00 00 00 1e 00 00 00
  75. class StockListReq : public Request
  76. {
  77. public:
  78. StockListReq(MarketInfo::MarketType market_code, ushort record_offset = 0, ushort record_count = 200, ushort record_total = 0);
  79. char* buff();
  80. ulong len();
  81. operator bool ();
  82. StockListReq& operator++();
  83. protected:
  84. struct StockListStruct
  85. {
  86. StockListStruct(MarketInfo::MarketType market_code, ushort record_offset, ushort record_count)
  87. : header(CMD_STOCK_LIST, sizeof(StockListStruct)),
  88. offset(record_offset), count(record_count),unknown1(0),unknown2(0)
  89. {
  90. block = MarketInfo::get_block_from_market_type(market_code);
  91. }
  92. ReqHead header;
  93. ushort block; //  00 00 上A,  01 00 上B,  02 00 深A,  03 00 深B,  0x0d: 权证
  94. ushort unknown1;
  95. ushort offset;
  96. ushort count;
  97. ushort unknown2;
  98. }s;
  99. ushort total;
  100. };
  101. class StockHoldChgReq : public Request
  102. {
  103. public:
  104. StockHoldChgReq(){};
  105. StockHoldChgReq(const string& stock_code)
  106. {
  107. add_stock(stock_code);
  108. }
  109. char* buff();
  110. ulong len();
  111. bool add_stock(const string& stock_code);
  112. static const int max_stocks_a_request = 30;
  113. protected:
  114. struct StockHoldStruct
  115. {
  116. char market_locale;
  117. char stock_code[MarketInfo::StocksCodeLen];
  118. };
  119. struct StockHoldChgReqStruct
  120. {
  121. StockHoldChgReqStruct() : header(CMD_STOCKHOLD_CHANGE, 0), count(0){}
  122. bool add_one_stock(const string& stock_code)
  123. {
  124. if(count >= max_stocks_a_request)
  125. return false;
  126. s_buff[count].market_locale = MarketInfo::get_market_location(stock_code);
  127. memcpy(&s_buff[count].stock_code, stock_code.c_str(), MarketInfo::StocksCodeLen);
  128. count++;
  129. header.set_len( sizeof(StockHoldStruct) * count + 4);
  130. return true;
  131. }
  132. ReqHead header;
  133. ushort count;
  134. StockHoldStruct s_buff[max_stocks_a_request];
  135. }s;
  136. };
  137. #if 0
  138. struct DealReqHead
  139. {
  140. public:
  141. friend class Request;
  142. DealReqHead(){};
  143. DealReqHead( ushort cmd_id, ushort packet_len/*the total packet len*/);
  144. void set_len(ushort payload_len);
  145. ushort get_len();
  146. uint get_seq_id();
  147. private:
  148. void set_seq_id(uint id);
  149. protected:
  150. const uint flag; // always 0xfdfdfdfd
  151. char cmd[9]; // null-terminated, 8 byte long string
  152. };
  153. class DealConnectReq : public Request
  154. {
  155. public:
  156. private:
  157. static const char * data_ = "x04x01x1Fx42x3Dx9Ax0Cx34x23x32x00";
  158. };
  159. #endif
  160. #pragma pack(pop)
  161. typedef shared_ptr<Request> CmdData_t;
  162. typedef queue<CmdData_t > CmdQueue_t;
  163. typedef SingletonHolder< CmdQueue_t> CmdQueue;
  164. }
  165. #endif