blob: 97295bed4518b9325d8d420f2045c4b93baa14f0 [file] [log] [blame]
nnobleebebb7e2014-12-10 16:31:01 -08001/*
2 *
yang-gf48766d2016-01-15 11:26:31 -08003 * Copyright 2015-2016, Google Inc.
nnobleebebb7e2014-12-10 16:31:01 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Nicolas "Pixel" Noble36f53232015-01-16 06:39:58 +010034#include <map>
35
nnobleebebb7e2014-12-10 16:31:01 -080036#include "src/compiler/cpp_generator.h"
nnobleebebb7e2014-12-10 16:31:01 -080037#include "src/compiler/cpp_generator_helpers.h"
Nicolas Nobled446eb82015-03-12 17:22:33 -070038
39#include "src/compiler/config.h"
40
Craig Tiller8c8d0aa2015-02-12 11:38:36 -080041#include <sstream>
nnobleebebb7e2014-12-10 16:31:01 -080042
43namespace grpc_cpp_generator {
44namespace {
45
Craig Tiller8c8d0aa2015-02-12 11:38:36 -080046template <class T>
Nicolas Nobled446eb82015-03-12 17:22:33 -070047grpc::string as_string(T x) {
Craig Tiller8c8d0aa2015-02-12 11:38:36 -080048 std::ostringstream out;
49 out << x;
50 return out.str();
51}
52
Nicolas Nobled446eb82015-03-12 17:22:33 -070053bool NoStreaming(const grpc::protobuf::MethodDescriptor *method) {
Craig Tillerb5dcec52015-01-13 11:13:42 -080054 return !method->client_streaming() && !method->server_streaming();
nnobleebebb7e2014-12-10 16:31:01 -080055}
56
Nicolas Nobled446eb82015-03-12 17:22:33 -070057bool ClientOnlyStreaming(const grpc::protobuf::MethodDescriptor *method) {
Craig Tillerb5dcec52015-01-13 11:13:42 -080058 return method->client_streaming() && !method->server_streaming();
nnobleebebb7e2014-12-10 16:31:01 -080059}
60
Nicolas Nobled446eb82015-03-12 17:22:33 -070061bool ServerOnlyStreaming(const grpc::protobuf::MethodDescriptor *method) {
yangg1b151092015-01-09 15:31:05 -080062 return !method->client_streaming() && method->server_streaming();
nnobleebebb7e2014-12-10 16:31:01 -080063}
64
Nicolas Nobled446eb82015-03-12 17:22:33 -070065bool BidiStreaming(const grpc::protobuf::MethodDescriptor *method) {
Craig Tillerb5dcec52015-01-13 11:13:42 -080066 return method->client_streaming() && method->server_streaming();
nnobleebebb7e2014-12-10 16:31:01 -080067}
68
Craig Tiller277d3cf2015-04-14 14:04:51 -070069grpc::string FilenameIdentifier(const grpc::string &filename) {
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020070 grpc::string result;
71 for (unsigned i = 0; i < filename.size(); i++) {
72 char c = filename[i];
73 if (isalnum(c)) {
74 result.push_back(c);
75 } else {
76 static char hex[] = "0123456789abcdef";
77 result.push_back('_');
78 result.push_back(hex[(c >> 4) & 0xf]);
79 result.push_back(hex[c & 0xf]);
80 }
81 }
82 return result;
83}
nnobleebebb7e2014-12-10 16:31:01 -080084} // namespace
85
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020086grpc::string GetHeaderPrologue(const grpc::protobuf::FileDescriptor *file,
87 const Parameters &params) {
88 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -070089 {
90 // Scope the output stream so it closes and finalizes output to the string.
91 grpc::protobuf::io::StringOutputStream output_stream(&output);
92 grpc::protobuf::io::Printer printer(&output_stream, '$');
93 std::map<grpc::string, grpc::string> vars;
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020094
Jan Tattermusch5dcebd92015-05-27 15:30:59 -070095 vars["filename"] = file->name();
96 vars["filename_identifier"] = FilenameIdentifier(file->name());
97 vars["filename_base"] = grpc_generator::StripProto(file->name());
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020098
Jan Tattermusch5dcebd92015-05-27 15:30:59 -070099 printer.Print(vars, "// Generated by the gRPC protobuf plugin.\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700100 printer.Print(vars,
101 "// If you make any local change, they will be lost.\n");
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700102 printer.Print(vars, "// source: $filename$\n");
103 printer.Print(vars, "#ifndef GRPC_$filename_identifier$__INCLUDED\n");
104 printer.Print(vars, "#define GRPC_$filename_identifier$__INCLUDED\n");
105 printer.Print(vars, "\n");
106 printer.Print(vars, "#include \"$filename_base$.pb.h\"\n");
107 printer.Print(vars, "\n");
108 }
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200109 return output;
110}
111
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +0100112grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file,
113 const Parameters &params) {
Nicolas Nobled446eb82015-03-12 17:22:33 -0700114 grpc::string temp =
David Garcia Quintas6a484052016-01-25 19:12:37 -0800115 "#include <grpc++/impl/codegen/async_stream.h>\n"
David Garcia Quintas6bd7b972016-01-27 19:21:12 -0800116 "#include <grpc++/impl/codegen/async_unary_call.h>\n"
David Garcia Quintas6a484052016-01-25 19:12:37 -0800117 "#include <grpc++/impl/codegen/proto_utils.h>\n"
David Garcia Quintas6bd7b972016-01-27 19:21:12 -0800118 "#include <grpc++/impl/codegen/rpc_method.h>\n"
119 "#include <grpc++/impl/codegen/service_type.h>\n"
120 "#include <grpc++/impl/codegen/status.h>\n"
David Garcia Quintas6a484052016-01-25 19:12:37 -0800121 "#include <grpc++/impl/codegen/stub_options.h>\n"
David Garcia Quintas6bd7b972016-01-27 19:21:12 -0800122 "#include <grpc++/impl/codegen/sync_stream.h>\n"
nnobleebebb7e2014-12-10 16:31:01 -0800123 "\n"
124 "namespace grpc {\n"
Craig Tiller8c8d0aa2015-02-12 11:38:36 -0800125 "class CompletionQueue;\n"
yangga4b6f5d2014-12-17 15:53:12 -0800126 "class RpcService;\n"
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700127 "class ServerCompletionQueue;\n"
Yang Gaoc6924c82015-05-05 10:42:51 -0700128 "class ServerContext;\n"
129 "} // namespace grpc\n\n";
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200130
Yang Gao1dc1a432015-04-10 13:53:11 -0700131 if (!file->package().empty()) {
132 std::vector<grpc::string> parts =
133 grpc_generator::tokenize(file->package(), ".");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200134
Yang Gao1dc1a432015-04-10 13:53:11 -0700135 for (auto part = parts.begin(); part != parts.end(); part++) {
136 temp.append("namespace ");
137 temp.append(*part);
138 temp.append(" {\n");
139 }
140 temp.append("\n");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200141 }
142
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200143 return temp;
nnobleebebb7e2014-12-10 16:31:01 -0800144}
145
Craig Tillerce40de52015-06-05 07:14:58 -0700146void PrintHeaderClientMethodInterfaces(
147 grpc::protobuf::io::Printer *printer,
148 const grpc::protobuf::MethodDescriptor *method,
149 std::map<grpc::string, grpc::string> *vars, bool is_public) {
nnobleebebb7e2014-12-10 16:31:01 -0800150 (*vars)["Method"] = method->name();
151 (*vars)["Request"] =
152 grpc_cpp_generator::ClassName(method->input_type(), true);
153 (*vars)["Response"] =
154 grpc_cpp_generator::ClassName(method->output_type(), true);
Yang Gaoc6924c82015-05-05 10:42:51 -0700155
156 if (is_public) {
157 if (NoStreaming(method)) {
158 printer->Print(
159 *vars,
160 "virtual ::grpc::Status $Method$(::grpc::ClientContext* context, "
161 "const $Request$& request, $Response$* response) = 0;\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700162 printer->Print(*vars,
163 "std::unique_ptr< "
164 "::grpc::ClientAsyncResponseReaderInterface< $Response$>> "
165 "Async$Method$(::grpc::ClientContext* context, "
166 "const $Request$& request, "
167 "::grpc::CompletionQueue* cq) {\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700168 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700169 printer->Print(*vars,
170 "return std::unique_ptr< "
171 "::grpc::ClientAsyncResponseReaderInterface< $Response$>>("
172 "Async$Method$Raw(context, request, cq));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700173 printer->Outdent();
174 printer->Print("}\n");
175 } else if (ClientOnlyStreaming(method)) {
176 printer->Print(
177 *vars,
178 "std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>"
179 " $Method$("
180 "::grpc::ClientContext* context, $Response$* response) {\n");
181 printer->Indent();
182 printer->Print(
183 *vars,
184 "return std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>"
185 "($Method$Raw(context, response));\n");
186 printer->Outdent();
187 printer->Print("}\n");
188 printer->Print(
189 *vars,
190 "std::unique_ptr< ::grpc::ClientAsyncWriterInterface< $Request$>>"
Craig Tillerce40de52015-06-05 07:14:58 -0700191 " Async$Method$(::grpc::ClientContext* context, $Response$* "
192 "response, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700193 "::grpc::CompletionQueue* cq, void* tag) {\n");
194 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700195 printer->Print(*vars,
196 "return std::unique_ptr< "
197 "::grpc::ClientAsyncWriterInterface< $Request$>>("
198 "Async$Method$Raw(context, response, cq, tag));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700199 printer->Outdent();
200 printer->Print("}\n");
201 } else if (ServerOnlyStreaming(method)) {
202 printer->Print(
203 *vars,
204 "std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>"
205 " $Method$(::grpc::ClientContext* context, const $Request$& request)"
206 " {\n");
207 printer->Indent();
208 printer->Print(
209 *vars,
210 "return std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>"
211 "($Method$Raw(context, request));\n");
212 printer->Outdent();
213 printer->Print("}\n");
214 printer->Print(
215 *vars,
216 "std::unique_ptr< ::grpc::ClientAsyncReaderInterface< $Response$>> "
217 "Async$Method$("
218 "::grpc::ClientContext* context, const $Request$& request, "
219 "::grpc::CompletionQueue* cq, void* tag) {\n");
220 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700221 printer->Print(*vars,
222 "return std::unique_ptr< "
223 "::grpc::ClientAsyncReaderInterface< $Response$>>("
224 "Async$Method$Raw(context, request, cq, tag));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700225 printer->Outdent();
226 printer->Print("}\n");
227 } else if (BidiStreaming(method)) {
Craig Tillerce40de52015-06-05 07:14:58 -0700228 printer->Print(*vars,
229 "std::unique_ptr< ::grpc::ClientReaderWriterInterface< "
230 "$Request$, $Response$>> "
231 "$Method$(::grpc::ClientContext* context) {\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700232 printer->Indent();
233 printer->Print(
234 *vars,
235 "return std::unique_ptr< "
236 "::grpc::ClientReaderWriterInterface< $Request$, $Response$>>("
237 "$Method$Raw(context));\n");
238 printer->Outdent();
239 printer->Print("}\n");
240 printer->Print(
241 *vars,
242 "std::unique_ptr< "
243 "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>> "
244 "Async$Method$(::grpc::ClientContext* context, "
245 "::grpc::CompletionQueue* cq, void* tag) {\n");
246 printer->Indent();
247 printer->Print(
248 *vars,
249 "return std::unique_ptr< "
250 "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>>("
251 "Async$Method$Raw(context, cq, tag));\n");
252 printer->Outdent();
253 printer->Print("}\n");
254 }
255 } else {
256 if (NoStreaming(method)) {
257 printer->Print(
258 *vars,
259 "virtual ::grpc::ClientAsyncResponseReaderInterface< $Response$>* "
260 "Async$Method$Raw(::grpc::ClientContext* context, "
261 "const $Request$& request, "
Craig Tiller5f871ac2015-05-08 13:05:51 -0700262 "::grpc::CompletionQueue* cq) = 0;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700263 } else if (ClientOnlyStreaming(method)) {
264 printer->Print(
265 *vars,
266 "virtual ::grpc::ClientWriterInterface< $Request$>*"
267 " $Method$Raw("
268 "::grpc::ClientContext* context, $Response$* response) = 0;\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700269 printer->Print(*vars,
270 "virtual ::grpc::ClientAsyncWriterInterface< $Request$>*"
271 " Async$Method$Raw(::grpc::ClientContext* context, "
272 "$Response$* response, "
273 "::grpc::CompletionQueue* cq, void* tag) = 0;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700274 } else if (ServerOnlyStreaming(method)) {
275 printer->Print(
276 *vars,
277 "virtual ::grpc::ClientReaderInterface< $Response$>* $Method$Raw("
278 "::grpc::ClientContext* context, const $Request$& request) = 0;\n");
279 printer->Print(
280 *vars,
281 "virtual ::grpc::ClientAsyncReaderInterface< $Response$>* "
282 "Async$Method$Raw("
283 "::grpc::ClientContext* context, const $Request$& request, "
284 "::grpc::CompletionQueue* cq, void* tag) = 0;\n");
285 } else if (BidiStreaming(method)) {
Craig Tillerce40de52015-06-05 07:14:58 -0700286 printer->Print(*vars,
287 "virtual ::grpc::ClientReaderWriterInterface< $Request$, "
288 "$Response$>* "
289 "$Method$Raw(::grpc::ClientContext* context) = 0;\n");
290 printer->Print(*vars,
291 "virtual ::grpc::ClientAsyncReaderWriterInterface< "
292 "$Request$, $Response$>* "
293 "Async$Method$Raw(::grpc::ClientContext* context, "
294 "::grpc::CompletionQueue* cq, void* tag) = 0;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700295 }
296 }
297}
298
299void PrintHeaderClientMethod(grpc::protobuf::io::Printer *printer,
300 const grpc::protobuf::MethodDescriptor *method,
301 std::map<grpc::string, grpc::string> *vars,
302 bool is_public) {
303 (*vars)["Method"] = method->name();
304 (*vars)["Request"] =
305 grpc_cpp_generator::ClassName(method->input_type(), true);
306 (*vars)["Response"] =
307 grpc_cpp_generator::ClassName(method->output_type(), true);
Yang Gaoc6924c82015-05-05 10:42:51 -0700308 if (is_public) {
309 if (NoStreaming(method)) {
310 printer->Print(
311 *vars,
312 "::grpc::Status $Method$(::grpc::ClientContext* context, "
313 "const $Request$& request, $Response$* response) GRPC_OVERRIDE;\n");
314 printer->Print(
315 *vars,
316 "std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
317 "Async$Method$(::grpc::ClientContext* context, "
318 "const $Request$& request, "
Craig Tiller5f871ac2015-05-08 13:05:51 -0700319 "::grpc::CompletionQueue* cq) {\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700320 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700321 printer->Print(*vars,
322 "return std::unique_ptr< "
323 "::grpc::ClientAsyncResponseReader< $Response$>>("
324 "Async$Method$Raw(context, request, cq));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700325 printer->Outdent();
326 printer->Print("}\n");
327 } else if (ClientOnlyStreaming(method)) {
328 printer->Print(
329 *vars,
330 "std::unique_ptr< ::grpc::ClientWriter< $Request$>>"
331 " $Method$("
332 "::grpc::ClientContext* context, $Response$* response) {\n");
333 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700334 printer->Print(*vars,
335 "return std::unique_ptr< ::grpc::ClientWriter< $Request$>>"
336 "($Method$Raw(context, response));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700337 printer->Outdent();
338 printer->Print("}\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700339 printer->Print(*vars,
340 "std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>"
341 " Async$Method$(::grpc::ClientContext* context, "
342 "$Response$* response, "
343 "::grpc::CompletionQueue* cq, void* tag) {\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700344 printer->Indent();
345 printer->Print(
346 *vars,
347 "return std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>("
348 "Async$Method$Raw(context, response, cq, tag));\n");
349 printer->Outdent();
350 printer->Print("}\n");
351 } else if (ServerOnlyStreaming(method)) {
352 printer->Print(
353 *vars,
354 "std::unique_ptr< ::grpc::ClientReader< $Response$>>"
355 " $Method$(::grpc::ClientContext* context, const $Request$& request)"
356 " {\n");
357 printer->Indent();
358 printer->Print(
359 *vars,
360 "return std::unique_ptr< ::grpc::ClientReader< $Response$>>"
361 "($Method$Raw(context, request));\n");
362 printer->Outdent();
363 printer->Print("}\n");
364 printer->Print(
365 *vars,
366 "std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> "
367 "Async$Method$("
368 "::grpc::ClientContext* context, const $Request$& request, "
369 "::grpc::CompletionQueue* cq, void* tag) {\n");
370 printer->Indent();
371 printer->Print(
372 *vars,
373 "return std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>>("
374 "Async$Method$Raw(context, request, cq, tag));\n");
375 printer->Outdent();
376 printer->Print("}\n");
377 } else if (BidiStreaming(method)) {
378 printer->Print(
379 *vars,
380 "std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>>"
381 " $Method$(::grpc::ClientContext* context) {\n");
382 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700383 printer->Print(*vars,
384 "return std::unique_ptr< "
385 "::grpc::ClientReaderWriter< $Request$, $Response$>>("
386 "$Method$Raw(context));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700387 printer->Outdent();
388 printer->Print("}\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700389 printer->Print(*vars,
390 "std::unique_ptr< ::grpc::ClientAsyncReaderWriter< "
391 "$Request$, $Response$>> "
392 "Async$Method$(::grpc::ClientContext* context, "
393 "::grpc::CompletionQueue* cq, void* tag) {\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700394 printer->Indent();
Craig Tillerce40de52015-06-05 07:14:58 -0700395 printer->Print(*vars,
396 "return std::unique_ptr< "
397 "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>>("
398 "Async$Method$Raw(context, cq, tag));\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700399 printer->Outdent();
400 printer->Print("}\n");
401 }
402 } else {
403 if (NoStreaming(method)) {
Craig Tillerce40de52015-06-05 07:14:58 -0700404 printer->Print(*vars,
405 "::grpc::ClientAsyncResponseReader< $Response$>* "
406 "Async$Method$Raw(::grpc::ClientContext* context, "
407 "const $Request$& request, "
408 "::grpc::CompletionQueue* cq) GRPC_OVERRIDE;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700409 } else if (ClientOnlyStreaming(method)) {
Craig Tillerce40de52015-06-05 07:14:58 -0700410 printer->Print(*vars,
411 "::grpc::ClientWriter< $Request$>* $Method$Raw("
412 "::grpc::ClientContext* context, $Response$* response) "
413 "GRPC_OVERRIDE;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700414 printer->Print(
415 *vars,
416 "::grpc::ClientAsyncWriter< $Request$>* Async$Method$Raw("
417 "::grpc::ClientContext* context, $Response$* response, "
418 "::grpc::CompletionQueue* cq, void* tag) GRPC_OVERRIDE;\n");
419 } else if (ServerOnlyStreaming(method)) {
Craig Tillerce40de52015-06-05 07:14:58 -0700420 printer->Print(*vars,
421 "::grpc::ClientReader< $Response$>* $Method$Raw("
422 "::grpc::ClientContext* context, const $Request$& request)"
423 " GRPC_OVERRIDE;\n");
Yang Gaoc6924c82015-05-05 10:42:51 -0700424 printer->Print(
425 *vars,
426 "::grpc::ClientAsyncReader< $Response$>* Async$Method$Raw("
427 "::grpc::ClientContext* context, const $Request$& request, "
428 "::grpc::CompletionQueue* cq, void* tag) GRPC_OVERRIDE;\n");
429 } else if (BidiStreaming(method)) {
430 printer->Print(
431 *vars,
432 "::grpc::ClientReaderWriter< $Request$, $Response$>* "
433 "$Method$Raw(::grpc::ClientContext* context) GRPC_OVERRIDE;\n");
434 printer->Print(
435 *vars,
436 "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* "
437 "Async$Method$Raw(::grpc::ClientContext* context, "
438 "::grpc::CompletionQueue* cq, void* tag) GRPC_OVERRIDE;\n");
439 }
nnobleebebb7e2014-12-10 16:31:01 -0800440 }
441}
442
Craig Tillerbd6c6182015-04-10 17:08:15 -0700443void PrintHeaderClientMethodData(grpc::protobuf::io::Printer *printer,
444 const grpc::protobuf::MethodDescriptor *method,
445 std::map<grpc::string, grpc::string> *vars) {
446 (*vars)["Method"] = method->name();
447 printer->Print(*vars, "const ::grpc::RpcMethod rpcmethod_$Method$_;\n");
448}
449
Craig Tiller277d3cf2015-04-14 14:04:51 -0700450void PrintHeaderServerMethodSync(grpc::protobuf::io::Printer *printer,
451 const grpc::protobuf::MethodDescriptor *method,
452 std::map<grpc::string, grpc::string> *vars) {
nnobleebebb7e2014-12-10 16:31:01 -0800453 (*vars)["Method"] = method->name();
454 (*vars)["Request"] =
455 grpc_cpp_generator::ClassName(method->input_type(), true);
456 (*vars)["Response"] =
457 grpc_cpp_generator::ClassName(method->output_type(), true);
458 if (NoStreaming(method)) {
459 printer->Print(*vars,
yangga4b6f5d2014-12-17 15:53:12 -0800460 "virtual ::grpc::Status $Method$("
461 "::grpc::ServerContext* context, const $Request$* request, "
nnobleebebb7e2014-12-10 16:31:01 -0800462 "$Response$* response);\n");
463 } else if (ClientOnlyStreaming(method)) {
464 printer->Print(*vars,
465 "virtual ::grpc::Status $Method$("
yangga4b6f5d2014-12-17 15:53:12 -0800466 "::grpc::ServerContext* context, "
Yang Gao1ff11f62015-01-14 11:45:32 -0800467 "::grpc::ServerReader< $Request$>* reader, "
nnobleebebb7e2014-12-10 16:31:01 -0800468 "$Response$* response);\n");
469 } else if (ServerOnlyStreaming(method)) {
470 printer->Print(*vars,
yangga4b6f5d2014-12-17 15:53:12 -0800471 "virtual ::grpc::Status $Method$("
472 "::grpc::ServerContext* context, const $Request$* request, "
Yang Gao1ff11f62015-01-14 11:45:32 -0800473 "::grpc::ServerWriter< $Response$>* writer);\n");
nnobleebebb7e2014-12-10 16:31:01 -0800474 } else if (BidiStreaming(method)) {
Yang Gao5680ff42015-01-14 12:14:21 -0800475 printer->Print(
476 *vars,
477 "virtual ::grpc::Status $Method$("
478 "::grpc::ServerContext* context, "
479 "::grpc::ServerReaderWriter< $Response$, $Request$>* stream);"
480 "\n");
nnobleebebb7e2014-12-10 16:31:01 -0800481 }
482}
483
Craig Tiller5ef5db12015-02-09 12:47:21 -0800484void PrintHeaderServerMethodAsync(
Nicolas Nobled446eb82015-03-12 17:22:33 -0700485 grpc::protobuf::io::Printer *printer,
486 const grpc::protobuf::MethodDescriptor *method,
487 std::map<grpc::string, grpc::string> *vars) {
Craig Tiller2dff17d2015-02-09 12:42:23 -0800488 (*vars)["Method"] = method->name();
489 (*vars)["Request"] =
490 grpc_cpp_generator::ClassName(method->input_type(), true);
491 (*vars)["Response"] =
492 grpc_cpp_generator::ClassName(method->output_type(), true);
Craig Tiller15f383c2016-01-07 12:45:32 -0800493 printer->Print(*vars, "template <class BaseClass>\n");
494 printer->Print(*vars,
495 "class WithAsyncMethod_$Method$ : public BaseClass {\n");
496 printer->Print(
497 " private:\n"
498 " void BaseClassMustBeDerivedFromService(Service *service) {}\n");
499 printer->Print(" public:\n");
500 printer->Indent();
501 printer->Print(*vars,
yang-gbef0d872016-01-13 15:27:33 -0800502 "WithAsyncMethod_$Method$() {\n"
yang-g0bbc87f2016-01-15 09:22:50 -0800503 " ::grpc::Service::MarkMethodAsync($Idx$);\n"
yang-gbef0d872016-01-13 15:27:33 -0800504 "}\n");
505 printer->Print(*vars,
506 "~WithAsyncMethod_$Method$() GRPC_OVERRIDE {\n"
Craig Tiller15f383c2016-01-07 12:45:32 -0800507 " BaseClassMustBeDerivedFromService(this);\n"
508 "}\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800509 if (NoStreaming(method)) {
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700510 printer->Print(
511 *vars,
Craig Tiller15f383c2016-01-07 12:45:32 -0800512 "// disable synchronous version of this method\n"
513 "::grpc::Status $Method$("
514 "::grpc::ServerContext* context, const $Request$* request, "
515 "$Response$* response) GRPC_FINAL GRPC_OVERRIDE {\n"
516 " abort();\n"
517 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
518 "}\n");
519 printer->Print(
520 *vars,
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700521 "void Request$Method$("
522 "::grpc::ServerContext* context, $Request$* request, "
523 "::grpc::ServerAsyncResponseWriter< $Response$>* response, "
524 "::grpc::CompletionQueue* new_call_cq, "
Craig Tiller15f383c2016-01-07 12:45:32 -0800525 "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
526 printer->Print(*vars,
527 " ::grpc::Service::RequestAsyncUnary($Idx$, context, "
528 "request, response, new_call_cq, notification_cq, tag);\n");
529 printer->Print("}\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800530 } else if (ClientOnlyStreaming(method)) {
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700531 printer->Print(
532 *vars,
Craig Tiller15f383c2016-01-07 12:45:32 -0800533 "// disable synchronous version of this method\n"
534 "::grpc::Status $Method$("
535 "::grpc::ServerContext* context, "
536 "::grpc::ServerReader< $Request$>* reader, "
537 "$Response$* response) GRPC_FINAL GRPC_OVERRIDE {\n"
538 " abort();\n"
539 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
540 "}\n");
541 printer->Print(
542 *vars,
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700543 "void Request$Method$("
544 "::grpc::ServerContext* context, "
545 "::grpc::ServerAsyncReader< $Response$, $Request$>* reader, "
546 "::grpc::CompletionQueue* new_call_cq, "
Craig Tiller15f383c2016-01-07 12:45:32 -0800547 "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
548 printer->Print(*vars,
549 " ::grpc::Service::RequestAsyncClientStreaming($Idx$, "
550 "context, reader, new_call_cq, notification_cq, tag);\n");
551 printer->Print("}\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800552 } else if (ServerOnlyStreaming(method)) {
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700553 printer->Print(
554 *vars,
Craig Tiller15f383c2016-01-07 12:45:32 -0800555 "// disable synchronous version of this method\n"
556 "::grpc::Status $Method$("
557 "::grpc::ServerContext* context, const $Request$* request, "
558 "::grpc::ServerWriter< $Response$>* writer) GRPC_FINAL GRPC_OVERRIDE "
559 "{\n"
560 " abort();\n"
561 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
562 "}\n");
563 printer->Print(
564 *vars,
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700565 "void Request$Method$("
566 "::grpc::ServerContext* context, $Request$* request, "
567 "::grpc::ServerAsyncWriter< $Response$>* writer, "
568 "::grpc::CompletionQueue* new_call_cq, "
Craig Tiller15f383c2016-01-07 12:45:32 -0800569 "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
570 printer->Print(
571 *vars,
572 " ::grpc::Service::RequestAsyncServerStreaming($Idx$, "
573 "context, request, writer, new_call_cq, notification_cq, tag);\n");
574 printer->Print("}\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800575 } else if (BidiStreaming(method)) {
576 printer->Print(
577 *vars,
Craig Tiller15f383c2016-01-07 12:45:32 -0800578 "// disable synchronous version of this method\n"
579 "::grpc::Status $Method$("
580 "::grpc::ServerContext* context, "
581 "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) "
582 "GRPC_FINAL GRPC_OVERRIDE {\n"
583 " abort();\n"
584 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
585 "}\n");
586 printer->Print(
587 *vars,
Yang Gaoca3cb3e2015-02-12 00:05:11 -0800588 "void Request$Method$("
Craig Tiller2dff17d2015-02-09 12:42:23 -0800589 "::grpc::ServerContext* context, "
Craig Tiller225f7be2015-02-09 22:32:37 -0800590 "::grpc::ServerAsyncReaderWriter< $Response$, $Request$>* stream, "
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700591 "::grpc::CompletionQueue* new_call_cq, "
Craig Tiller15f383c2016-01-07 12:45:32 -0800592 "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
593 printer->Print(*vars,
594 " ::grpc::Service::RequestAsyncBidiStreaming($Idx$, "
595 "context, stream, new_call_cq, notification_cq, tag);\n");
596 printer->Print("}\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800597 }
Craig Tiller15f383c2016-01-07 12:45:32 -0800598 printer->Outdent();
599 printer->Print(*vars, "};\n");
Craig Tiller2dff17d2015-02-09 12:42:23 -0800600}
601
yang-g0bbc87f2016-01-15 09:22:50 -0800602void PrintHeaderServerMethodGeneric(
603 grpc::protobuf::io::Printer *printer,
604 const grpc::protobuf::MethodDescriptor *method,
605 std::map<grpc::string, grpc::string> *vars) {
606 (*vars)["Method"] = method->name();
607 (*vars)["Request"] =
608 grpc_cpp_generator::ClassName(method->input_type(), true);
609 (*vars)["Response"] =
610 grpc_cpp_generator::ClassName(method->output_type(), true);
611 printer->Print(*vars, "template <class BaseClass>\n");
612 printer->Print(*vars,
613 "class WithGenericMethod_$Method$ : public BaseClass {\n");
614 printer->Print(
615 " private:\n"
616 " void BaseClassMustBeDerivedFromService(Service *service) {}\n");
617 printer->Print(" public:\n");
618 printer->Indent();
619 printer->Print(*vars,
620 "WithGenericMethod_$Method$() {\n"
621 " ::grpc::Service::MarkMethodGeneric($Idx$);\n"
622 "}\n");
623 printer->Print(*vars,
624 "~WithGenericMethod_$Method$() GRPC_OVERRIDE {\n"
625 " BaseClassMustBeDerivedFromService(this);\n"
626 "}\n");
627 if (NoStreaming(method)) {
628 printer->Print(
629 *vars,
630 "// disable synchronous version of this method\n"
631 "::grpc::Status $Method$("
632 "::grpc::ServerContext* context, const $Request$* request, "
633 "$Response$* response) GRPC_FINAL GRPC_OVERRIDE {\n"
634 " abort();\n"
635 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
636 "}\n");
637 } else if (ClientOnlyStreaming(method)) {
638 printer->Print(
639 *vars,
640 "// disable synchronous version of this method\n"
641 "::grpc::Status $Method$("
642 "::grpc::ServerContext* context, "
643 "::grpc::ServerReader< $Request$>* reader, "
644 "$Response$* response) GRPC_FINAL GRPC_OVERRIDE {\n"
645 " abort();\n"
646 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
647 "}\n");
648 } else if (ServerOnlyStreaming(method)) {
649 printer->Print(
650 *vars,
651 "// disable synchronous version of this method\n"
652 "::grpc::Status $Method$("
653 "::grpc::ServerContext* context, const $Request$* request, "
654 "::grpc::ServerWriter< $Response$>* writer) GRPC_FINAL GRPC_OVERRIDE "
655 "{\n"
656 " abort();\n"
657 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
658 "}\n");
659 } else if (BidiStreaming(method)) {
660 printer->Print(
661 *vars,
662 "// disable synchronous version of this method\n"
663 "::grpc::Status $Method$("
664 "::grpc::ServerContext* context, "
665 "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) "
666 "GRPC_FINAL GRPC_OVERRIDE {\n"
667 " abort();\n"
668 " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
669 "}\n");
670 }
671 printer->Outdent();
672 printer->Print(*vars, "};\n");
673}
674
Nicolas Nobled446eb82015-03-12 17:22:33 -0700675void PrintHeaderService(grpc::protobuf::io::Printer *printer,
676 const grpc::protobuf::ServiceDescriptor *service,
677 std::map<grpc::string, grpc::string> *vars) {
nnobleebebb7e2014-12-10 16:31:01 -0800678 (*vars)["Service"] = service->name();
679
680 printer->Print(*vars,
Craig Tillercf133f42015-02-26 14:05:56 -0800681 "class $Service$ GRPC_FINAL {\n"
nnobleebebb7e2014-12-10 16:31:01 -0800682 " public:\n");
683 printer->Indent();
684
685 // Client side
Craig Tillerb5dcec52015-01-13 11:13:42 -0800686 printer->Print(
Yang Gao72e0fb82015-05-01 16:24:07 -0700687 "class StubInterface {\n"
Craig Tillerb5dcec52015-01-13 11:13:42 -0800688 " public:\n");
nnobleebebb7e2014-12-10 16:31:01 -0800689 printer->Indent();
Yang Gao72e0fb82015-05-01 16:24:07 -0700690 printer->Print("virtual ~StubInterface() {}\n");
691 for (int i = 0; i < service->method_count(); ++i) {
Yang Gaoc6924c82015-05-05 10:42:51 -0700692 PrintHeaderClientMethodInterfaces(printer, service->method(i), vars, true);
693 }
694 printer->Outdent();
695 printer->Print("private:\n");
696 printer->Indent();
697 for (int i = 0; i < service->method_count(); ++i) {
698 PrintHeaderClientMethodInterfaces(printer, service->method(i), vars, false);
Yang Gao72e0fb82015-05-01 16:24:07 -0700699 }
700 printer->Outdent();
701 printer->Print("};\n");
702 printer->Print(
yang-gef003082015-08-20 11:40:51 -0700703 "class Stub GRPC_FINAL : public StubInterface"
704 " {\n public:\n");
Yang Gao72e0fb82015-05-01 16:24:07 -0700705 printer->Indent();
David Garcia Quintase50c6c22016-01-13 16:02:00 -0800706 printer->Print("Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n");
nnobleebebb7e2014-12-10 16:31:01 -0800707 for (int i = 0; i < service->method_count(); ++i) {
Yang Gaoc6924c82015-05-05 10:42:51 -0700708 PrintHeaderClientMethod(printer, service->method(i), vars, true);
nnobleebebb7e2014-12-10 16:31:01 -0800709 }
710 printer->Outdent();
Yang Gaoc6924c82015-05-05 10:42:51 -0700711 printer->Print("\n private:\n");
Craig Tillerbd6c6182015-04-10 17:08:15 -0700712 printer->Indent();
David Garcia Quintase50c6c22016-01-13 16:02:00 -0800713 printer->Print("std::shared_ptr< ::grpc::ChannelInterface> channel_;\n");
Craig Tillerbd6c6182015-04-10 17:08:15 -0700714 for (int i = 0; i < service->method_count(); ++i) {
Yang Gaoc6924c82015-05-05 10:42:51 -0700715 PrintHeaderClientMethod(printer, service->method(i), vars, false);
716 }
717 for (int i = 0; i < service->method_count(); ++i) {
Craig Tillerbd6c6182015-04-10 17:08:15 -0700718 PrintHeaderClientMethodData(printer, service->method(i), vars);
719 }
720 printer->Outdent();
nnobleebebb7e2014-12-10 16:31:01 -0800721 printer->Print("};\n");
722 printer->Print(
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800723 "static std::unique_ptr<Stub> NewStub(const std::shared_ptr< "
David Garcia Quintase50c6c22016-01-13 16:02:00 -0800724 "::grpc::ChannelInterface>& channel, "
yang-g297a25b2015-08-03 16:43:46 -0700725 "const ::grpc::StubOptions& options = ::grpc::StubOptions());\n");
nnobleebebb7e2014-12-10 16:31:01 -0800726
727 printer->Print("\n");
728
Craig Tiller15f383c2016-01-07 12:45:32 -0800729 // Server side - base
Craig Tillerb5dcec52015-01-13 11:13:42 -0800730 printer->Print(
Craig Tiller15f383c2016-01-07 12:45:32 -0800731 "class Service : public ::grpc::Service {\n"
Craig Tillerb5dcec52015-01-13 11:13:42 -0800732 " public:\n");
nnobleebebb7e2014-12-10 16:31:01 -0800733 printer->Indent();
Vijay Pai7f715702015-10-12 22:47:58 +0000734 printer->Print("Service();\n");
nnobleebebb7e2014-12-10 16:31:01 -0800735 printer->Print("virtual ~Service();\n");
736 for (int i = 0; i < service->method_count(); ++i) {
Craig Tiller2dff17d2015-02-09 12:42:23 -0800737 PrintHeaderServerMethodSync(printer, service->method(i), vars);
738 }
Craig Tiller2dff17d2015-02-09 12:42:23 -0800739 printer->Outdent();
Craig Tiller2dff17d2015-02-09 12:42:23 -0800740 printer->Print("};\n");
741
742 // Server side - Asynchronous
Craig Tiller2dff17d2015-02-09 12:42:23 -0800743 for (int i = 0; i < service->method_count(); ++i) {
Craig Tiller15f383c2016-01-07 12:45:32 -0800744 (*vars)["Idx"] = as_string(i);
Craig Tiller2dff17d2015-02-09 12:42:23 -0800745 PrintHeaderServerMethodAsync(printer, service->method(i), vars);
nnobleebebb7e2014-12-10 16:31:01 -0800746 }
Craig Tiller15f383c2016-01-07 12:45:32 -0800747
748 printer->Print("typedef ");
749
750 for (int i = 0; i < service->method_count(); ++i) {
751 (*vars)["method_name"] = service->method(i)->name();
752 printer->Print(*vars, "WithAsyncMethod_$method_name$<");
753 }
754 printer->Print("Service");
755 for (int i = 0; i < service->method_count(); ++i) {
756 printer->Print(" >");
757 }
758 printer->Print(" AsyncService;\n");
nnobleebebb7e2014-12-10 16:31:01 -0800759
yang-g0bbc87f2016-01-15 09:22:50 -0800760 // Server side - Generic
761 for (int i = 0; i < service->method_count(); ++i) {
762 (*vars)["Idx"] = as_string(i);
763 PrintHeaderServerMethodGeneric(printer, service->method(i), vars);
764 }
765
nnobleebebb7e2014-12-10 16:31:01 -0800766 printer->Outdent();
767 printer->Print("};\n");
768}
769
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +0100770grpc::string GetHeaderServices(const grpc::protobuf::FileDescriptor *file,
771 const Parameters &params) {
Nicolas Nobled446eb82015-03-12 17:22:33 -0700772 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700773 {
Craig Tillerce40de52015-06-05 07:14:58 -0700774 // Scope the output stream so it closes and finalizes output to the string.
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700775 grpc::protobuf::io::StringOutputStream output_stream(&output);
776 grpc::protobuf::io::Printer printer(&output_stream, '$');
777 std::map<grpc::string, grpc::string> vars;
yang-gbef0d872016-01-13 15:27:33 -0800778 // Package string is empty or ends with a dot. It is used to fully qualify
779 // method names.
780 vars["Package"] = file->package();
781 if (!file->package().empty()) {
782 vars["Package"].append(".");
783 }
nnobleebebb7e2014-12-10 16:31:01 -0800784
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700785 if (!params.services_namespace.empty()) {
786 vars["services_namespace"] = params.services_namespace;
787 printer.Print(vars, "\nnamespace $services_namespace$ {\n\n");
788 }
789
790 for (int i = 0; i < file->service_count(); ++i) {
791 PrintHeaderService(&printer, file->service(i), &vars);
792 printer.Print("\n");
793 }
794
795 if (!params.services_namespace.empty()) {
796 printer.Print(vars, "} // namespace $services_namespace$\n\n");
797 }
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +0100798 }
nnobleebebb7e2014-12-10 16:31:01 -0800799 return output;
800}
801
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200802grpc::string GetHeaderEpilogue(const grpc::protobuf::FileDescriptor *file,
803 const Parameters &params) {
804 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700805 {
806 // Scope the output stream so it closes and finalizes output to the string.
807 grpc::protobuf::io::StringOutputStream output_stream(&output);
808 grpc::protobuf::io::Printer printer(&output_stream, '$');
809 std::map<grpc::string, grpc::string> vars;
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200810
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700811 vars["filename"] = file->name();
812 vars["filename_identifier"] = FilenameIdentifier(file->name());
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200813
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700814 if (!file->package().empty()) {
815 std::vector<grpc::string> parts =
816 grpc_generator::tokenize(file->package(), ".");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200817
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700818 for (auto part = parts.rbegin(); part != parts.rend(); part++) {
819 vars["part"] = *part;
820 printer.Print(vars, "} // namespace $part$\n");
821 }
822 printer.Print(vars, "\n");
Yang Gao1dc1a432015-04-10 13:53:11 -0700823 }
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700824
Yang Gao1dc1a432015-04-10 13:53:11 -0700825 printer.Print(vars, "\n");
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700826 printer.Print(vars, "#endif // GRPC_$filename_identifier$__INCLUDED\n");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200827 }
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200828 return output;
829}
830
831grpc::string GetSourcePrologue(const grpc::protobuf::FileDescriptor *file,
832 const Parameters &params) {
833 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700834 {
835 // Scope the output stream so it closes and finalizes output to the string.
836 grpc::protobuf::io::StringOutputStream output_stream(&output);
837 grpc::protobuf::io::Printer printer(&output_stream, '$');
838 std::map<grpc::string, grpc::string> vars;
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200839
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700840 vars["filename"] = file->name();
841 vars["filename_base"] = grpc_generator::StripProto(file->name());
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200842
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700843 printer.Print(vars, "// Generated by the gRPC protobuf plugin.\n");
Craig Tillerce40de52015-06-05 07:14:58 -0700844 printer.Print(vars,
845 "// If you make any local change, they will be lost.\n");
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700846 printer.Print(vars, "// source: $filename$\n\n");
847 printer.Print(vars, "#include \"$filename_base$.pb.h\"\n");
848 printer.Print(vars, "#include \"$filename_base$.grpc.pb.h\"\n");
849 printer.Print(vars, "\n");
850 }
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200851 return output;
852}
853
854grpc::string GetSourceIncludes(const grpc::protobuf::FileDescriptor *file,
855 const Parameters &param) {
856 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700857 {
858 // Scope the output stream so it closes and finalizes output to the string.
859 grpc::protobuf::io::StringOutputStream output_stream(&output);
860 grpc::protobuf::io::Printer printer(&output_stream, '$');
861 std::map<grpc::string, grpc::string> vars;
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200862
David Garcia Quintas6a484052016-01-25 19:12:37 -0800863 printer.Print(vars, "#include <grpc++/impl/codegen/async_stream.h>\n");
David Garcia Quintas6bd7b972016-01-27 19:21:12 -0800864 printer.Print(vars, "#include <grpc++/impl/codegen/async_unary_call.h>\n");
865 printer.Print(vars, "#include <grpc++/impl/codegen/channel_interface.h>\n");
866 printer.Print(vars, "#include <grpc++/impl/codegen/client_unary_call.h>\n");
867 printer.Print(vars,
868 "#include <grpc++/impl/codegen/method_handler_impl.h>\n");
869 printer.Print(vars,
870 "#include <grpc++/impl/codegen/rpc_service_method.h>\n");
871 printer.Print(vars, "#include <grpc++/impl/codegen/service_type.h>\n");
872 printer.Print(vars, "#include <grpc++/impl/codegen/sync_stream.h>\n");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200873
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700874 if (!file->package().empty()) {
875 std::vector<grpc::string> parts =
876 grpc_generator::tokenize(file->package(), ".");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200877
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700878 for (auto part = parts.begin(); part != parts.end(); part++) {
879 vars["part"] = *part;
880 printer.Print(vars, "namespace $part$ {\n");
881 }
Yang Gao1dc1a432015-04-10 13:53:11 -0700882 }
Jan Tattermusch5dcebd92015-05-27 15:30:59 -0700883
884 printer.Print(vars, "\n");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200885 }
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +0200886 return output;
887}
888
Nicolas Nobled446eb82015-03-12 17:22:33 -0700889void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer,
890 const grpc::protobuf::MethodDescriptor *method,
891 std::map<grpc::string, grpc::string> *vars) {
nnobleebebb7e2014-12-10 16:31:01 -0800892 (*vars)["Method"] = method->name();
893 (*vars)["Request"] =
894 grpc_cpp_generator::ClassName(method->input_type(), true);
895 (*vars)["Response"] =
896 grpc_cpp_generator::ClassName(method->output_type(), true);
897 if (NoStreaming(method)) {
898 printer->Print(*vars,
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +0100899 "::grpc::Status $ns$$Service$::Stub::$Method$("
nnobleebebb7e2014-12-10 16:31:01 -0800900 "::grpc::ClientContext* context, "
901 "const $Request$& request, $Response$* response) {\n");
902 printer->Print(*vars,
yang-gef003082015-08-20 11:40:51 -0700903 " return ::grpc::BlockingUnaryCall(channel_.get(), "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700904 "rpcmethod_$Method$_, "
nnobleebebb7e2014-12-10 16:31:01 -0800905 "context, request, response);\n"
906 "}\n\n");
Yang Gao5680ff42015-01-14 12:14:21 -0800907 printer->Print(
908 *vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700909 "::grpc::ClientAsyncResponseReader< $Response$>* "
910 "$ns$$Service$::Stub::Async$Method$Raw(::grpc::ClientContext* context, "
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800911 "const $Request$& request, "
Craig Tiller3676b382015-05-06 13:01:05 -0700912 "::grpc::CompletionQueue* cq) {\n");
yangg5bcea0d2015-01-06 10:35:03 -0800913 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700914 " return new "
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800915 "::grpc::ClientAsyncResponseReader< $Response$>("
yang-gef003082015-08-20 11:40:51 -0700916 "channel_.get(), cq, "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700917 "rpcmethod_$Method$_, "
Craig Tiller5f871ac2015-05-08 13:05:51 -0700918 "context, request);\n"
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800919 "}\n\n");
920 } else if (ClientOnlyStreaming(method)) {
921 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700922 "::grpc::ClientWriter< $Request$>* "
923 "$ns$$Service$::Stub::$Method$Raw("
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800924 "::grpc::ClientContext* context, $Response$* response) {\n");
925 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700926 " return new ::grpc::ClientWriter< $Request$>("
yang-gef003082015-08-20 11:40:51 -0700927 "channel_.get(), "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700928 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700929 "context, response);\n"
yangg5bcea0d2015-01-06 10:35:03 -0800930 "}\n\n");
Yang Gao068c85b2015-02-12 15:21:24 -0800931 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700932 "::grpc::ClientAsyncWriter< $Request$>* "
933 "$ns$$Service$::Stub::Async$Method$Raw("
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800934 "::grpc::ClientContext* context, $Response$* response, "
935 "::grpc::CompletionQueue* cq, void* tag) {\n");
936 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700937 " return new ::grpc::ClientAsyncWriter< $Request$>("
yang-gef003082015-08-20 11:40:51 -0700938 "channel_.get(), cq, "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700939 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700940 "context, response, tag);\n"
Yang Gao068c85b2015-02-12 15:21:24 -0800941 "}\n\n");
nnobleebebb7e2014-12-10 16:31:01 -0800942 } else if (ServerOnlyStreaming(method)) {
943 printer->Print(
944 *vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700945 "::grpc::ClientReader< $Response$>* "
946 "$ns$$Service$::Stub::$Method$Raw("
Yang Gao07d83042015-02-13 14:11:31 -0800947 "::grpc::ClientContext* context, const $Request$& request) {\n");
yangg5bcea0d2015-01-06 10:35:03 -0800948 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700949 " return new ::grpc::ClientReader< $Response$>("
yang-gef003082015-08-20 11:40:51 -0700950 "channel_.get(), "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700951 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700952 "context, request);\n"
yangg5bcea0d2015-01-06 10:35:03 -0800953 "}\n\n");
Yang Gao068c85b2015-02-12 15:21:24 -0800954 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700955 "::grpc::ClientAsyncReader< $Response$>* "
956 "$ns$$Service$::Stub::Async$Method$Raw("
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800957 "::grpc::ClientContext* context, const $Request$& request, "
958 "::grpc::CompletionQueue* cq, void* tag) {\n");
959 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700960 " return new ::grpc::ClientAsyncReader< $Response$>("
yang-gef003082015-08-20 11:40:51 -0700961 "channel_.get(), cq, "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700962 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700963 "context, request, tag);\n"
Yang Gao068c85b2015-02-12 15:21:24 -0800964 "}\n\n");
nnobleebebb7e2014-12-10 16:31:01 -0800965 } else if (BidiStreaming(method)) {
966 printer->Print(
967 *vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700968 "::grpc::ClientReaderWriter< $Request$, $Response$>* "
969 "$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\n");
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800970 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700971 " return new ::grpc::ClientReaderWriter< "
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800972 "$Request$, $Response$>("
yang-gef003082015-08-20 11:40:51 -0700973 "channel_.get(), "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700974 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700975 "context);\n"
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800976 "}\n\n");
Craig Tiller277d3cf2015-04-14 14:04:51 -0700977 printer->Print(
978 *vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700979 "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* "
980 "$ns$$Service$::Stub::Async$Method$Raw(::grpc::ClientContext* context, "
Craig Tiller277d3cf2015-04-14 14:04:51 -0700981 "::grpc::CompletionQueue* cq, void* tag) {\n");
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800982 printer->Print(*vars,
Yang Gaoc6924c82015-05-05 10:42:51 -0700983 " return new "
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800984 "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>("
yang-gef003082015-08-20 11:40:51 -0700985 "channel_.get(), cq, "
Craig Tillerbd6c6182015-04-10 17:08:15 -0700986 "rpcmethod_$Method$_, "
Yang Gaoc6924c82015-05-05 10:42:51 -0700987 "context, tag);\n"
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800988 "}\n\n");
nnobleebebb7e2014-12-10 16:31:01 -0800989 }
990}
991
Nicolas Nobled446eb82015-03-12 17:22:33 -0700992void PrintSourceServerMethod(grpc::protobuf::io::Printer *printer,
993 const grpc::protobuf::MethodDescriptor *method,
994 std::map<grpc::string, grpc::string> *vars) {
nnobleebebb7e2014-12-10 16:31:01 -0800995 (*vars)["Method"] = method->name();
996 (*vars)["Request"] =
997 grpc_cpp_generator::ClassName(method->input_type(), true);
998 (*vars)["Response"] =
999 grpc_cpp_generator::ClassName(method->output_type(), true);
1000 if (NoStreaming(method)) {
1001 printer->Print(*vars,
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001002 "::grpc::Status $ns$$Service$::Service::$Method$("
yangga4b6f5d2014-12-17 15:53:12 -08001003 "::grpc::ServerContext* context, "
nnobleebebb7e2014-12-10 16:31:01 -08001004 "const $Request$* request, $Response$* response) {\n");
Nicolas "Pixel" Nobleb14fbf72015-06-10 23:49:23 +02001005 printer->Print(" (void) context;\n");
1006 printer->Print(" (void) request;\n");
1007 printer->Print(" (void) response;\n");
nnobleebebb7e2014-12-10 16:31:01 -08001008 printer->Print(
1009 " return ::grpc::Status("
Yang Gaoc1a2c312015-06-16 10:59:46 -07001010 "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
nnobleebebb7e2014-12-10 16:31:01 -08001011 printer->Print("}\n\n");
1012 } else if (ClientOnlyStreaming(method)) {
1013 printer->Print(*vars,
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001014 "::grpc::Status $ns$$Service$::Service::$Method$("
yangga4b6f5d2014-12-17 15:53:12 -08001015 "::grpc::ServerContext* context, "
Yang Gao1ff11f62015-01-14 11:45:32 -08001016 "::grpc::ServerReader< $Request$>* reader, "
nnobleebebb7e2014-12-10 16:31:01 -08001017 "$Response$* response) {\n");
Nicolas "Pixel" Nobleb14fbf72015-06-10 23:49:23 +02001018 printer->Print(" (void) context;\n");
1019 printer->Print(" (void) reader;\n");
1020 printer->Print(" (void) response;\n");
nnobleebebb7e2014-12-10 16:31:01 -08001021 printer->Print(
1022 " return ::grpc::Status("
Yang Gaoc1a2c312015-06-16 10:59:46 -07001023 "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
nnobleebebb7e2014-12-10 16:31:01 -08001024 printer->Print("}\n\n");
1025 } else if (ServerOnlyStreaming(method)) {
1026 printer->Print(*vars,
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001027 "::grpc::Status $ns$$Service$::Service::$Method$("
yangga4b6f5d2014-12-17 15:53:12 -08001028 "::grpc::ServerContext* context, "
nnobleebebb7e2014-12-10 16:31:01 -08001029 "const $Request$* request, "
Yang Gao1ff11f62015-01-14 11:45:32 -08001030 "::grpc::ServerWriter< $Response$>* writer) {\n");
Nicolas "Pixel" Nobleb14fbf72015-06-10 23:49:23 +02001031 printer->Print(" (void) context;\n");
1032 printer->Print(" (void) request;\n");
1033 printer->Print(" (void) writer;\n");
nnobleebebb7e2014-12-10 16:31:01 -08001034 printer->Print(
1035 " return ::grpc::Status("
Yang Gaoc1a2c312015-06-16 10:59:46 -07001036 "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
nnobleebebb7e2014-12-10 16:31:01 -08001037 printer->Print("}\n\n");
1038 } else if (BidiStreaming(method)) {
1039 printer->Print(*vars,
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001040 "::grpc::Status $ns$$Service$::Service::$Method$("
yangga4b6f5d2014-12-17 15:53:12 -08001041 "::grpc::ServerContext* context, "
Yang Gao1ff11f62015-01-14 11:45:32 -08001042 "::grpc::ServerReaderWriter< $Response$, $Request$>* "
nnobleebebb7e2014-12-10 16:31:01 -08001043 "stream) {\n");
Nicolas "Pixel" Nobleb14fbf72015-06-10 23:49:23 +02001044 printer->Print(" (void) context;\n");
1045 printer->Print(" (void) stream;\n");
nnobleebebb7e2014-12-10 16:31:01 -08001046 printer->Print(
1047 " return ::grpc::Status("
Yang Gaoc1a2c312015-06-16 10:59:46 -07001048 "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
nnobleebebb7e2014-12-10 16:31:01 -08001049 printer->Print("}\n\n");
1050 }
1051}
1052
Nicolas Nobled446eb82015-03-12 17:22:33 -07001053void PrintSourceService(grpc::protobuf::io::Printer *printer,
1054 const grpc::protobuf::ServiceDescriptor *service,
1055 std::map<grpc::string, grpc::string> *vars) {
nnobleebebb7e2014-12-10 16:31:01 -08001056 (*vars)["Service"] = service->name();
Craig Tiller8c8d0aa2015-02-12 11:38:36 -08001057
Craig Tiller277d3cf2015-04-14 14:04:51 -07001058 printer->Print(*vars,
1059 "static const char* $prefix$$Service$_method_names[] = {\n");
Craig Tiller8c8d0aa2015-02-12 11:38:36 -08001060 for (int i = 0; i < service->method_count(); ++i) {
1061 (*vars)["Method"] = service->method(i)->name();
1062 printer->Print(*vars, " \"/$Package$$Service$/$Method$\",\n");
1063 }
1064 printer->Print(*vars, "};\n\n");
1065
yang-g8c2be9f2015-08-19 16:28:09 -07001066 printer->Print(*vars,
1067 "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub("
David Garcia Quintase50c6c22016-01-13 16:02:00 -08001068 "const std::shared_ptr< ::grpc::ChannelInterface>& channel, "
yang-g8c2be9f2015-08-19 16:28:09 -07001069 "const ::grpc::StubOptions& options) {\n"
1070 " std::unique_ptr< $ns$$Service$::Stub> stub(new "
1071 "$ns$$Service$::Stub(channel));\n"
1072 " return stub;\n"
1073 "}\n\n");
Craig Tiller277d3cf2015-04-14 14:04:51 -07001074 printer->Print(*vars,
1075 "$ns$$Service$::Stub::Stub(const std::shared_ptr< "
David Garcia Quintase50c6c22016-01-13 16:02:00 -08001076 "::grpc::ChannelInterface>& channel)\n");
Craig Tillerbd6c6182015-04-10 17:08:15 -07001077 printer->Indent();
yang-gef003082015-08-20 11:40:51 -07001078 printer->Print(": channel_(channel)");
Craig Tillerbd6c6182015-04-10 17:08:15 -07001079 for (int i = 0; i < service->method_count(); ++i) {
1080 const grpc::protobuf::MethodDescriptor *method = service->method(i);
Craig Tillerbd6c6182015-04-10 17:08:15 -07001081 (*vars)["Method"] = method->name();
1082 (*vars)["Idx"] = as_string(i);
1083 if (NoStreaming(method)) {
1084 (*vars)["StreamingType"] = "NORMAL_RPC";
1085 } else if (ClientOnlyStreaming(method)) {
1086 (*vars)["StreamingType"] = "CLIENT_STREAMING";
1087 } else if (ServerOnlyStreaming(method)) {
1088 (*vars)["StreamingType"] = "SERVER_STREAMING";
1089 } else {
1090 (*vars)["StreamingType"] = "BIDI_STREAMING";
1091 }
yang-g431f8c22015-08-20 10:59:29 -07001092 printer->Print(*vars,
1093 ", rpcmethod_$Method$_("
1094 "$prefix$$Service$_method_names[$Idx$], "
1095 "::grpc::RpcMethod::$StreamingType$, "
1096 "channel"
1097 ")\n");
Craig Tillerbd6c6182015-04-10 17:08:15 -07001098 }
Craig Tiller3beef682015-04-14 13:55:03 -07001099 printer->Print("{}\n\n");
Craig Tillerbd6c6182015-04-10 17:08:15 -07001100 printer->Outdent();
1101
nnobleebebb7e2014-12-10 16:31:01 -08001102 for (int i = 0; i < service->method_count(); ++i) {
Craig Tiller8c8d0aa2015-02-12 11:38:36 -08001103 (*vars)["Idx"] = as_string(i);
nnobleebebb7e2014-12-10 16:31:01 -08001104 PrintSourceClientMethod(printer, service->method(i), vars);
1105 }
1106
yang-gbef0d872016-01-13 15:27:33 -08001107 printer->Print(*vars, "$ns$$Service$::Service::Service() {\n");
1108 printer->Indent();
yang-ge39cb742016-02-10 23:50:08 -08001109 printer->Print(*vars, "(void)$prefix$$Service$_method_names;\n");
nnobleebebb7e2014-12-10 16:31:01 -08001110 for (int i = 0; i < service->method_count(); ++i) {
Nicolas Nobled446eb82015-03-12 17:22:33 -07001111 const grpc::protobuf::MethodDescriptor *method = service->method(i);
Craig Tiller8c8d0aa2015-02-12 11:38:36 -08001112 (*vars)["Idx"] = as_string(i);
nnobleebebb7e2014-12-10 16:31:01 -08001113 (*vars)["Method"] = method->name();
1114 (*vars)["Request"] =
1115 grpc_cpp_generator::ClassName(method->input_type(), true);
1116 (*vars)["Response"] =
1117 grpc_cpp_generator::ClassName(method->output_type(), true);
1118 if (NoStreaming(method)) {
1119 printer->Print(
1120 *vars,
yang-gbef0d872016-01-13 15:27:33 -08001121 "AddMethod(new ::grpc::RpcServiceMethod(\n"
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001122 " $prefix$$Service$_method_names[$Idx$],\n"
yangg5bcea0d2015-01-06 10:35:03 -08001123 " ::grpc::RpcMethod::NORMAL_RPC,\n"
Craig Tiller277d3cf2015-04-14 14:04:51 -07001124 " new ::grpc::RpcMethodHandler< $ns$$Service$::Service, "
1125 "$Request$, "
nnobleebebb7e2014-12-10 16:31:01 -08001126 "$Response$>(\n"
Craig Tiller50a7a682015-06-04 12:53:40 -07001127 " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
nnobleebebb7e2014-12-10 16:31:01 -08001128 } else if (ClientOnlyStreaming(method)) {
1129 printer->Print(
1130 *vars,
yang-gbef0d872016-01-13 15:27:33 -08001131 "AddMethod(new ::grpc::RpcServiceMethod(\n"
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001132 " $prefix$$Service$_method_names[$Idx$],\n"
yangg5bcea0d2015-01-06 10:35:03 -08001133 " ::grpc::RpcMethod::CLIENT_STREAMING,\n"
Yang Gao1ff11f62015-01-14 11:45:32 -08001134 " new ::grpc::ClientStreamingHandler< "
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001135 "$ns$$Service$::Service, $Request$, $Response$>(\n"
Craig Tiller50a7a682015-06-04 12:53:40 -07001136 " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
nnobleebebb7e2014-12-10 16:31:01 -08001137 } else if (ServerOnlyStreaming(method)) {
1138 printer->Print(
1139 *vars,
yang-gbef0d872016-01-13 15:27:33 -08001140 "AddMethod(new ::grpc::RpcServiceMethod(\n"
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001141 " $prefix$$Service$_method_names[$Idx$],\n"
yangg5bcea0d2015-01-06 10:35:03 -08001142 " ::grpc::RpcMethod::SERVER_STREAMING,\n"
Yang Gao1ff11f62015-01-14 11:45:32 -08001143 " new ::grpc::ServerStreamingHandler< "
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001144 "$ns$$Service$::Service, $Request$, $Response$>(\n"
Craig Tiller50a7a682015-06-04 12:53:40 -07001145 " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
nnobleebebb7e2014-12-10 16:31:01 -08001146 } else if (BidiStreaming(method)) {
1147 printer->Print(
1148 *vars,
yang-gbef0d872016-01-13 15:27:33 -08001149 "AddMethod(new ::grpc::RpcServiceMethod(\n"
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001150 " $prefix$$Service$_method_names[$Idx$],\n"
yangg5bcea0d2015-01-06 10:35:03 -08001151 " ::grpc::RpcMethod::BIDI_STREAMING,\n"
Yang Gao1ff11f62015-01-14 11:45:32 -08001152 " new ::grpc::BidiStreamingHandler< "
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001153 "$ns$$Service$::Service, $Request$, $Response$>(\n"
Craig Tiller50a7a682015-06-04 12:53:40 -07001154 " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
nnobleebebb7e2014-12-10 16:31:01 -08001155 }
1156 }
nnobleebebb7e2014-12-10 16:31:01 -08001157 printer->Outdent();
yang-gbef0d872016-01-13 15:27:33 -08001158 printer->Print(*vars, "}\n\n");
1159 printer->Print(*vars,
1160 "$ns$$Service$::Service::~Service() {\n"
1161 "}\n\n");
1162 for (int i = 0; i < service->method_count(); ++i) {
1163 (*vars)["Idx"] = as_string(i);
1164 PrintSourceServerMethod(printer, service->method(i), vars);
1165 }
nnobleebebb7e2014-12-10 16:31:01 -08001166}
1167
Nicolas "Pixel" Noble375a82b2015-03-24 02:33:18 +01001168grpc::string GetSourceServices(const grpc::protobuf::FileDescriptor *file,
1169 const Parameters &params) {
Nicolas Nobled446eb82015-03-12 17:22:33 -07001170 grpc::string output;
Jan Tattermusch5dcebd92015-05-27 15:30:59 -07001171 {
1172 // Scope the output stream so it closes and finalizes output to the string.
1173 grpc::protobuf::io::StringOutputStream output_stream(&output);
1174 grpc::protobuf::io::Printer printer(&output_stream, '$');
1175 std::map<grpc::string, grpc::string> vars;
1176 // Package string is empty or ends with a dot. It is used to fully qualify
1177 // method names.
1178 vars["Package"] = file->package();
1179 if (!file->package().empty()) {
1180 vars["Package"].append(".");
1181 }
1182 if (!params.services_namespace.empty()) {
1183 vars["ns"] = params.services_namespace + "::";
1184 vars["prefix"] = params.services_namespace;
1185 } else {
1186 vars["ns"] = "";
1187 vars["prefix"] = "";
1188 }
nnobleebebb7e2014-12-10 16:31:01 -08001189
Jan Tattermusch5dcebd92015-05-27 15:30:59 -07001190 for (int i = 0; i < file->service_count(); ++i) {
1191 PrintSourceService(&printer, file->service(i), &vars);
1192 printer.Print("\n");
1193 }
nnobleebebb7e2014-12-10 16:31:01 -08001194 }
1195 return output;
1196}
1197
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +02001198grpc::string GetSourceEpilogue(const grpc::protobuf::FileDescriptor *file,
1199 const Parameters &params) {
1200 grpc::string temp;
1201
Yang Gao1dc1a432015-04-10 13:53:11 -07001202 if (!file->package().empty()) {
1203 std::vector<grpc::string> parts =
1204 grpc_generator::tokenize(file->package(), ".");
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +02001205
Yang Gao1dc1a432015-04-10 13:53:11 -07001206 for (auto part = parts.begin(); part != parts.end(); part++) {
1207 temp.append("} // namespace ");
1208 temp.append(*part);
1209 temp.append("\n");
1210 }
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +02001211 temp.append("\n");
1212 }
1213
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +02001214 return temp;
1215}
1216
Craig Tiller190d3602015-02-18 09:23:38 -08001217} // namespace grpc_cpp_generator