TinkoffInvestSDK
rpchandler.h
1 #ifndef RPCHANDLER_H
2 #define RPCHANDLER_H
3 
4 #include <queue>
5 #include <mutex>
6 #include <functional>
7 #include <grpcpp/grpcpp.h>
8 #include "marketdata.grpc.pb.h"
9 #include "servicereply.h"
10 
11 using namespace tinkoff::public_::invest::api::contract::v1;
12 
13 using grpc::ClientContext;
14 using grpc::CompletionQueue;
15 using grpc::ClientAsyncReaderWriter;
16 
22 class RpcHandler {
23 
24  struct TagData
25  {
26  enum class Type {
27  start_done,
28  read_done,
29  write_done
30  };
31 
32  RpcHandler *handler;
33  Type evt;
34  };
35 
36  struct TagSet
37  {
38  TagSet(RpcHandler *self)
39  : start_done {self, TagData::Type::start_done},
40  read_done {self, TagData::Type::read_done},
41  write_done {self, TagData::Type::write_done} {}
42  TagData start_done;
43  TagData read_done;
44  TagData write_done;
45  };
46 
47 public:
48 
49  RpcHandler();
50  virtual ~RpcHandler() = default;
51 
52  TagSet tags;
53  ClientContext context;
54 
55  virtual void on_ready() = 0;
56  virtual void on_recv() = 0;
57  virtual void on_write_done() = 0;
58 
59  static void handlingThread(CompletionQueue *cq);
60 
61 };
62 
63 class MarketDataHandler final : public RpcHandler
64 {
65 
66 public:
67  using responder_ptr = std::unique_ptr<ClientAsyncReaderWriter<MarketDataRequest, MarketDataResponse>>;
68 
69  MarketDataHandler(responder_ptr responder, std::function<void (ServiceReply)> callback);
70  MarketDataHandler(CompletionQueue &cq_, std::unique_ptr<MarketDataStreamService::Stub> &stub_, const std::string &token, std::function<void (ServiceReply)> callback);
72 
73  void send(const MarketDataRequest &msg);
74 
75 private:
76  void on_ready() override;
77  void on_recv() override;
78  void on_write_done() override;
79 
80  responder_ptr responder_;
81  MarketDataResponse incoming_;
82 
83  bool sending_ = false;
84  bool ready_ = false;
85  std::queue<MarketDataRequest> queued_msgs_;
86  std::function<void (ServiceReply)> callback_;
87  std::mutex mutex_;
88 };
89 
90 #endif // RPCHANDLER_H
ServiceReply
Класс-обертка над proto-ответами сервисов
Definition: servicereply.h:17
RpcHandler
Базовый класс для асинхронных двунаправленных RPC вызовов
Definition: rpchandler.h:22
MarketDataHandler
Definition: rpchandler.h:63