forked from ni/grpc-labview
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrpc_client.h
More file actions
139 lines (121 loc) · 4.79 KB
/
grpc_client.h
File metadata and controls
139 lines (121 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//---------------------------------------------------------------------
// LabVIEW implementation of a gRPC Server
//---------------------------------------------------------------------
#pragma once
//---------------------------------------------------------------------
// IMPORTANT: lv_serialization_traits.h MUST be included BEFORE grpc headers
// This registers our custom SerializationTraits<LVMessage> specialization
//---------------------------------------------------------------------
#include <lv_serialization_traits.h>
#include <grpcpp/grpcpp.h>
#include <grpcpp/impl/codegen/sync_stream.h>
#include <metadata_owner.h>
#include <future>
#include <unordered_map>
namespace grpc_labview
{
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class LVMessage;
class ClientCall;
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class LabVIEWgRPCClient : public MessageElementMetadataOwner, public gRPCid
{
public:
LabVIEWgRPCClient();
void Connect(const char *address, const std::string &certificatePath);
public:
std::shared_ptr<grpc::Channel> Channel;
std::unordered_map<ClientCall *, bool> ActiveClientCalls;
std::mutex clientLock;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class ClientContext : public gRPCid
{
public:
void Cancel();
void set_deadline(int32_t timeoutMs);
grpc::ClientContext gRPCClientContext;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class ClientCall : public gRPCid
{
public:
virtual ~ClientCall();
virtual void Finish();
void Cancel();
public:
std::shared_ptr<grpc_labview::LabVIEWgRPCClient> _client;
std::string _methodName;
MagicCookie _occurrence;
std::shared_ptr<ClientContext> _context;
std::shared_ptr<LVMessage> _request;
std::shared_ptr<LVMessage> _response;
grpc::Status _status;
std::future<int> _runFuture;
bool _useLVEfficientMessage;
bool _cancelled = false;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class StreamWriter
{
public:
virtual bool Write(LVMessage *message) = 0;
virtual void WritesComplete() = 0;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class StreamReader
{
public:
std::future<bool> _readFuture;
public:
virtual bool Read(LVMessage *message) = 0;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class ServerStreamingClientCall : public ClientCall, public StreamReader
{
public:
~ServerStreamingClientCall() override;
bool Read(LVMessage *message) override;
void Finish() override;
public:
std::shared_ptr<grpc::ClientReaderInterface<grpc_labview::LVMessage>> _reader;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class ClientStreamingClientCall : public ClientCall, public StreamWriter
{
public:
ClientStreamingClientCall() { _writesComplete = false; }
~ClientStreamingClientCall();
void Finish() override;
bool Write(LVMessage *message) override;
void WritesComplete() override;
public:
std::shared_ptr<grpc::ClientWriterInterface<grpc_labview::LVMessage>> _writer;
private:
bool _writesComplete;
};
//---------------------------------------------------------------------
//---------------------------------------------------------------------
class BidiStreamingClientCall : public ClientCall, public StreamReader, public StreamWriter
{
public:
BidiStreamingClientCall() { _writesComplete = false; }
~BidiStreamingClientCall();
void Finish() override;
void WritesComplete() override;
bool Read(LVMessage *message) override;
bool Write(LVMessage *message) override;
public:
std::shared_ptr<grpc::ClientReaderWriterInterface<grpc_labview::LVMessage, grpc_labview::LVMessage>> _readerWriter;
private:
bool _writesComplete;
};
}