1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker *
3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker *
5*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker *
9*cc02d7e2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker *
11*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker *
17*cc02d7e2SAndroid Build Coastguard Worker */
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/cpp_generator.h"
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard Worker #include <map>
22*cc02d7e2SAndroid Build Coastguard Worker #include <sstream>
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Worker namespace grpc_cpp_generator {
25*cc02d7e2SAndroid Build Coastguard Worker namespace {
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker template <class T>
as_string(T x)28*cc02d7e2SAndroid Build Coastguard Worker std::string as_string(T x) {
29*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream out;
30*cc02d7e2SAndroid Build Coastguard Worker out << x;
31*cc02d7e2SAndroid Build Coastguard Worker return out.str();
32*cc02d7e2SAndroid Build Coastguard Worker }
33*cc02d7e2SAndroid Build Coastguard Worker
ClientOnlyStreaming(const grpc_generator::Method * method)34*cc02d7e2SAndroid Build Coastguard Worker inline bool ClientOnlyStreaming(const grpc_generator::Method* method) {
35*cc02d7e2SAndroid Build Coastguard Worker return method->ClientStreaming() && !method->ServerStreaming();
36*cc02d7e2SAndroid Build Coastguard Worker }
37*cc02d7e2SAndroid Build Coastguard Worker
ServerOnlyStreaming(const grpc_generator::Method * method)38*cc02d7e2SAndroid Build Coastguard Worker inline bool ServerOnlyStreaming(const grpc_generator::Method* method) {
39*cc02d7e2SAndroid Build Coastguard Worker return !method->ClientStreaming() && method->ServerStreaming();
40*cc02d7e2SAndroid Build Coastguard Worker }
41*cc02d7e2SAndroid Build Coastguard Worker
FilenameIdentifier(const std::string & filename)42*cc02d7e2SAndroid Build Coastguard Worker std::string FilenameIdentifier(const std::string& filename) {
43*cc02d7e2SAndroid Build Coastguard Worker std::string result;
44*cc02d7e2SAndroid Build Coastguard Worker for (unsigned i = 0; i < filename.size(); i++) {
45*cc02d7e2SAndroid Build Coastguard Worker char c = filename[i];
46*cc02d7e2SAndroid Build Coastguard Worker if (isalnum(c)) {
47*cc02d7e2SAndroid Build Coastguard Worker result.push_back(c);
48*cc02d7e2SAndroid Build Coastguard Worker } else {
49*cc02d7e2SAndroid Build Coastguard Worker static char hex[] = "0123456789abcdef";
50*cc02d7e2SAndroid Build Coastguard Worker result.push_back('_');
51*cc02d7e2SAndroid Build Coastguard Worker result.push_back(hex[(c >> 4) & 0xf]);
52*cc02d7e2SAndroid Build Coastguard Worker result.push_back(hex[c & 0xf]);
53*cc02d7e2SAndroid Build Coastguard Worker }
54*cc02d7e2SAndroid Build Coastguard Worker }
55*cc02d7e2SAndroid Build Coastguard Worker return result;
56*cc02d7e2SAndroid Build Coastguard Worker }
57*cc02d7e2SAndroid Build Coastguard Worker
58*cc02d7e2SAndroid Build Coastguard Worker } // namespace
59*cc02d7e2SAndroid Build Coastguard Worker
60*cc02d7e2SAndroid Build Coastguard Worker template <class T, size_t N>
array_end(T (& array)[N])61*cc02d7e2SAndroid Build Coastguard Worker T* array_end(T (&array)[N]) {
62*cc02d7e2SAndroid Build Coastguard Worker return array + N;
63*cc02d7e2SAndroid Build Coastguard Worker }
64*cc02d7e2SAndroid Build Coastguard Worker
PrintIncludes(grpc_generator::Printer * printer,const std::vector<std::string> & headers,bool use_system_headers,const std::string & search_path)65*cc02d7e2SAndroid Build Coastguard Worker void PrintIncludes(grpc_generator::Printer* printer,
66*cc02d7e2SAndroid Build Coastguard Worker const std::vector<std::string>& headers,
67*cc02d7e2SAndroid Build Coastguard Worker bool use_system_headers, const std::string& search_path) {
68*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard Worker vars["l"] = use_system_headers ? '<' : '"';
71*cc02d7e2SAndroid Build Coastguard Worker vars["r"] = use_system_headers ? '>' : '"';
72*cc02d7e2SAndroid Build Coastguard Worker
73*cc02d7e2SAndroid Build Coastguard Worker if (!search_path.empty()) {
74*cc02d7e2SAndroid Build Coastguard Worker vars["l"] += search_path;
75*cc02d7e2SAndroid Build Coastguard Worker if (search_path[search_path.size() - 1] != '/') {
76*cc02d7e2SAndroid Build Coastguard Worker vars["l"] += '/';
77*cc02d7e2SAndroid Build Coastguard Worker }
78*cc02d7e2SAndroid Build Coastguard Worker }
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard Worker for (auto i = headers.begin(); i != headers.end(); i++) {
81*cc02d7e2SAndroid Build Coastguard Worker vars["h"] = *i;
82*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include $l$$h$$r$\n");
83*cc02d7e2SAndroid Build Coastguard Worker }
84*cc02d7e2SAndroid Build Coastguard Worker }
85*cc02d7e2SAndroid Build Coastguard Worker
GetHeaderPrologue(grpc_generator::File * file,const Parameters & params)86*cc02d7e2SAndroid Build Coastguard Worker std::string GetHeaderPrologue(grpc_generator::File* file,
87*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
88*cc02d7e2SAndroid Build Coastguard Worker std::string output;
89*cc02d7e2SAndroid Build Coastguard Worker {
90*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
91*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
92*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
93*cc02d7e2SAndroid Build Coastguard Worker
94*cc02d7e2SAndroid Build Coastguard Worker vars["filename"] = file->filename();
95*cc02d7e2SAndroid Build Coastguard Worker vars["filename_identifier"] = FilenameIdentifier(file->filename());
96*cc02d7e2SAndroid Build Coastguard Worker vars["filename_base"] = file->filename_without_ext();
97*cc02d7e2SAndroid Build Coastguard Worker vars["message_header_ext"] = params.message_header_extension.empty()
98*cc02d7e2SAndroid Build Coastguard Worker ? kCppGeneratorMessageHeaderExt
99*cc02d7e2SAndroid Build Coastguard Worker : params.message_header_extension;
100*cc02d7e2SAndroid Build Coastguard Worker
101*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// Generated by the gRPC C++ plugin.\n");
102*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars,
103*cc02d7e2SAndroid Build Coastguard Worker "// If you make any local change, they will be lost.\n");
104*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// source: $filename$\n");
105*cc02d7e2SAndroid Build Coastguard Worker std::string leading_comments = file->GetLeadingComments("//");
106*cc02d7e2SAndroid Build Coastguard Worker if (!leading_comments.empty()) {
107*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// Original file comments:\n");
108*cc02d7e2SAndroid Build Coastguard Worker printer->PrintRaw(leading_comments.c_str());
109*cc02d7e2SAndroid Build Coastguard Worker }
110*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#ifndef GRPC_$filename_identifier$__INCLUDED\n");
111*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#define GRPC_$filename_identifier$__INCLUDED\n");
112*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
113*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n");
114*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, file->additional_headers().c_str());
115*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
116*cc02d7e2SAndroid Build Coastguard Worker }
117*cc02d7e2SAndroid Build Coastguard Worker return output;
118*cc02d7e2SAndroid Build Coastguard Worker }
119*cc02d7e2SAndroid Build Coastguard Worker
120*cc02d7e2SAndroid Build Coastguard Worker // Convert from "a/b/c.proto" to "#include \"a/b/c$message_header_ext$\"\n"
ImportInludeFromProtoName(const std::string & proto_name)121*cc02d7e2SAndroid Build Coastguard Worker std::string ImportInludeFromProtoName(const std::string& proto_name) {
122*cc02d7e2SAndroid Build Coastguard Worker return std::string("#include \"") +
123*cc02d7e2SAndroid Build Coastguard Worker proto_name.substr(0, proto_name.size() - 6) +
124*cc02d7e2SAndroid Build Coastguard Worker std::string("$message_header_ext$\"\n");
125*cc02d7e2SAndroid Build Coastguard Worker }
126*cc02d7e2SAndroid Build Coastguard Worker
GetHeaderIncludes(grpc_generator::File * file,const Parameters & params)127*cc02d7e2SAndroid Build Coastguard Worker std::string GetHeaderIncludes(grpc_generator::File* file,
128*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
129*cc02d7e2SAndroid Build Coastguard Worker std::string output;
130*cc02d7e2SAndroid Build Coastguard Worker {
131*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
132*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
133*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
134*cc02d7e2SAndroid Build Coastguard Worker
135*cc02d7e2SAndroid Build Coastguard Worker if (!params.additional_header_includes.empty()) {
136*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), params.additional_header_includes, false,
137*cc02d7e2SAndroid Build Coastguard Worker "");
138*cc02d7e2SAndroid Build Coastguard Worker }
139*cc02d7e2SAndroid Build Coastguard Worker static const char* headers_strs[] = {
140*cc02d7e2SAndroid Build Coastguard Worker "functional",
141*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/generic/async_generic_service.h",
142*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/async_stream.h",
143*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/async_unary_call.h",
144*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/client_callback.h",
145*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/client_context.h",
146*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/completion_queue.h",
147*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/message_allocator.h",
148*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/method_handler.h",
149*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/proto_utils.h",
150*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/rpc_method.h",
151*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/server_callback.h",
152*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/server_callback_handlers.h",
153*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/server_context.h",
154*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/service_type.h",
155*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/status.h",
156*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/stub_options.h",
157*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/sync_stream.h",
158*cc02d7e2SAndroid Build Coastguard Worker };
159*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> headers(headers_strs, array_end(headers_strs));
160*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), headers, params.use_system_headers,
161*cc02d7e2SAndroid Build Coastguard Worker params.grpc_search_path);
162*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
163*cc02d7e2SAndroid Build Coastguard Worker
164*cc02d7e2SAndroid Build Coastguard Worker vars["message_header_ext"] = params.message_header_extension.empty()
165*cc02d7e2SAndroid Build Coastguard Worker ? kCppGeneratorMessageHeaderExt
166*cc02d7e2SAndroid Build Coastguard Worker : params.message_header_extension;
167*cc02d7e2SAndroid Build Coastguard Worker
168*cc02d7e2SAndroid Build Coastguard Worker if (params.include_import_headers) {
169*cc02d7e2SAndroid Build Coastguard Worker const std::vector<std::string> import_names = file->GetImportNames();
170*cc02d7e2SAndroid Build Coastguard Worker for (const auto& import_name : import_names) {
171*cc02d7e2SAndroid Build Coastguard Worker const std::string include_name = ImportInludeFromProtoName(import_name);
172*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, include_name.c_str());
173*cc02d7e2SAndroid Build Coastguard Worker }
174*cc02d7e2SAndroid Build Coastguard Worker printer->PrintRaw("\n");
175*cc02d7e2SAndroid Build Coastguard Worker }
176*cc02d7e2SAndroid Build Coastguard Worker
177*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
178*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
179*cc02d7e2SAndroid Build Coastguard Worker
180*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.begin(); part != parts.end(); part++) {
181*cc02d7e2SAndroid Build Coastguard Worker vars["part"] = *part;
182*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "namespace $part$ {\n");
183*cc02d7e2SAndroid Build Coastguard Worker }
184*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
185*cc02d7e2SAndroid Build Coastguard Worker }
186*cc02d7e2SAndroid Build Coastguard Worker }
187*cc02d7e2SAndroid Build Coastguard Worker return output;
188*cc02d7e2SAndroid Build Coastguard Worker }
189*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodInterfaces(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars,bool is_public)190*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodInterfaces(grpc_generator::Printer* printer,
191*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
192*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars,
193*cc02d7e2SAndroid Build Coastguard Worker bool is_public) {
194*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
195*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
196*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
197*cc02d7e2SAndroid Build Coastguard Worker
198*cc02d7e2SAndroid Build Coastguard Worker struct {
199*cc02d7e2SAndroid Build Coastguard Worker std::string prefix;
200*cc02d7e2SAndroid Build Coastguard Worker std::string method_params; // extra arguments to method
201*cc02d7e2SAndroid Build Coastguard Worker std::string raw_args; // extra arguments to raw version of method
202*cc02d7e2SAndroid Build Coastguard Worker } async_prefixes[] = {{"Async", ", void* tag", ", tag"},
203*cc02d7e2SAndroid Build Coastguard Worker {"PrepareAsync", "", ""}};
204*cc02d7e2SAndroid Build Coastguard Worker
205*cc02d7e2SAndroid Build Coastguard Worker if (is_public) {
206*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
207*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
208*cc02d7e2SAndroid Build Coastguard Worker *vars,
209*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status $Method$(::grpc::ClientContext* context, "
210*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, $Response$* response) = 0;\n");
211*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
212*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
213*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
214*cc02d7e2SAndroid Build Coastguard Worker *vars,
215*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< "
216*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReaderInterface< $Response$>> "
217*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$(::grpc::ClientContext* context, "
218*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
219*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) {\n");
220*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
221*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
222*cc02d7e2SAndroid Build Coastguard Worker *vars,
223*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
224*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReaderInterface< $Response$>>("
225*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, request, cq));\n");
226*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
227*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
228*cc02d7e2SAndroid Build Coastguard Worker }
229*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
230*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
231*cc02d7e2SAndroid Build Coastguard Worker *vars,
232*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>"
233*cc02d7e2SAndroid Build Coastguard Worker " $Method$("
234*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response) {\n");
235*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
236*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
237*cc02d7e2SAndroid Build Coastguard Worker *vars,
238*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>"
239*cc02d7e2SAndroid Build Coastguard Worker "($Method$Raw(context, response));\n");
240*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
241*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
242*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
243*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
244*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
245*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
246*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
247*cc02d7e2SAndroid Build Coastguard Worker *vars,
248*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncWriterInterface< $Request$>>"
249*cc02d7e2SAndroid Build Coastguard Worker " $AsyncPrefix$$Method$(::grpc::ClientContext* context, "
250*cc02d7e2SAndroid Build Coastguard Worker "$Response$* "
251*cc02d7e2SAndroid Build Coastguard Worker "response, "
252*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
253*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
254*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
255*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
256*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncWriterInterface< $Request$>>("
257*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, response, "
258*cc02d7e2SAndroid Build Coastguard Worker "cq$AsyncRawArgs$));\n");
259*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
260*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
261*cc02d7e2SAndroid Build Coastguard Worker }
262*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
263*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
264*cc02d7e2SAndroid Build Coastguard Worker *vars,
265*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>"
266*cc02d7e2SAndroid Build Coastguard Worker " $Method$(::grpc::ClientContext* context, const $Request$& request)"
267*cc02d7e2SAndroid Build Coastguard Worker " {\n");
268*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
269*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
270*cc02d7e2SAndroid Build Coastguard Worker *vars,
271*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>"
272*cc02d7e2SAndroid Build Coastguard Worker "($Method$Raw(context, request));\n");
273*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
274*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
275*cc02d7e2SAndroid Build Coastguard Worker for (auto& async_prefix : async_prefixes) {
276*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
277*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
278*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
279*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
280*cc02d7e2SAndroid Build Coastguard Worker *vars,
281*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncReaderInterface< $Response$>> "
282*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$("
283*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request, "
284*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
285*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
286*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
287*cc02d7e2SAndroid Build Coastguard Worker *vars,
288*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
289*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderInterface< $Response$>>("
290*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\n");
291*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
292*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
293*cc02d7e2SAndroid Build Coastguard Worker }
294*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
295*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
296*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientReaderWriterInterface< "
297*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$>> "
298*cc02d7e2SAndroid Build Coastguard Worker "$Method$(::grpc::ClientContext* context) {\n");
299*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
300*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
301*cc02d7e2SAndroid Build Coastguard Worker *vars,
302*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
303*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderWriterInterface< $Request$, $Response$>>("
304*cc02d7e2SAndroid Build Coastguard Worker "$Method$Raw(context));\n");
305*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
306*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
307*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
308*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
309*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
310*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
311*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
312*cc02d7e2SAndroid Build Coastguard Worker *vars,
313*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< "
314*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>> "
315*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$(::grpc::ClientContext* context, "
316*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
317*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
318*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
319*cc02d7e2SAndroid Build Coastguard Worker *vars,
320*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
321*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>>("
322*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\n");
323*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
324*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
325*cc02d7e2SAndroid Build Coastguard Worker }
326*cc02d7e2SAndroid Build Coastguard Worker }
327*cc02d7e2SAndroid Build Coastguard Worker } else {
328*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
329*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
330*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
331*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
332*cc02d7e2SAndroid Build Coastguard Worker *vars,
333*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientAsyncResponseReaderInterface< $Response$>* "
334*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, "
335*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
336*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) = 0;\n");
337*cc02d7e2SAndroid Build Coastguard Worker }
338*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
339*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
340*cc02d7e2SAndroid Build Coastguard Worker *vars,
341*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientWriterInterface< $Request$>*"
342*cc02d7e2SAndroid Build Coastguard Worker " $Method$Raw("
343*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response) = 0;\n");
344*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
345*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
346*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
347*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
348*cc02d7e2SAndroid Build Coastguard Worker *vars,
349*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientAsyncWriterInterface< $Request$>*"
350*cc02d7e2SAndroid Build Coastguard Worker " $AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, "
351*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response, "
352*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n");
353*cc02d7e2SAndroid Build Coastguard Worker }
354*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
355*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
356*cc02d7e2SAndroid Build Coastguard Worker *vars,
357*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientReaderInterface< $Response$>* "
358*cc02d7e2SAndroid Build Coastguard Worker "$Method$Raw("
359*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request) = 0;\n");
360*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
361*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
362*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
363*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
364*cc02d7e2SAndroid Build Coastguard Worker *vars,
365*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientAsyncReaderInterface< $Response$>* "
366*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw("
367*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request, "
368*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n");
369*cc02d7e2SAndroid Build Coastguard Worker }
370*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
371*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
372*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientReaderWriterInterface< $Request$, "
373*cc02d7e2SAndroid Build Coastguard Worker "$Response$>* "
374*cc02d7e2SAndroid Build Coastguard Worker "$Method$Raw(::grpc::ClientContext* context) = 0;\n");
375*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
376*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
377*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
378*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
379*cc02d7e2SAndroid Build Coastguard Worker *vars,
380*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ClientAsyncReaderWriterInterface< "
381*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$>* "
382*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, "
383*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n");
384*cc02d7e2SAndroid Build Coastguard Worker }
385*cc02d7e2SAndroid Build Coastguard Worker }
386*cc02d7e2SAndroid Build Coastguard Worker }
387*cc02d7e2SAndroid Build Coastguard Worker }
388*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethod(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars,bool is_public)389*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethod(grpc_generator::Printer* printer,
390*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
391*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars,
392*cc02d7e2SAndroid Build Coastguard Worker bool is_public) {
393*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
394*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
395*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
396*cc02d7e2SAndroid Build Coastguard Worker struct {
397*cc02d7e2SAndroid Build Coastguard Worker std::string prefix;
398*cc02d7e2SAndroid Build Coastguard Worker std::string method_params; // extra arguments to method
399*cc02d7e2SAndroid Build Coastguard Worker std::string raw_args; // extra arguments to raw version of method
400*cc02d7e2SAndroid Build Coastguard Worker } async_prefixes[] = {{"Async", ", void* tag", ", tag"},
401*cc02d7e2SAndroid Build Coastguard Worker {"PrepareAsync", "", ""}};
402*cc02d7e2SAndroid Build Coastguard Worker
403*cc02d7e2SAndroid Build Coastguard Worker if (is_public) {
404*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
405*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
406*cc02d7e2SAndroid Build Coastguard Worker *vars,
407*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$(::grpc::ClientContext* context, "
408*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, $Response$* response) override;\n");
409*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
410*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
411*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
412*cc02d7e2SAndroid Build Coastguard Worker *vars,
413*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
414*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$(::grpc::ClientContext* context, "
415*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
416*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) {\n");
417*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
418*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
419*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
420*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReader< $Response$>>("
421*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, request, cq));\n");
422*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
423*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
424*cc02d7e2SAndroid Build Coastguard Worker }
425*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
426*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
427*cc02d7e2SAndroid Build Coastguard Worker *vars,
428*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientWriter< $Request$>>"
429*cc02d7e2SAndroid Build Coastguard Worker " $Method$("
430*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response) {\n");
431*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
432*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
433*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientWriter< $Request$>>"
434*cc02d7e2SAndroid Build Coastguard Worker "($Method$Raw(context, response));\n");
435*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
436*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
437*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
438*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
439*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
440*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
441*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
442*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>"
443*cc02d7e2SAndroid Build Coastguard Worker " $AsyncPrefix$$Method$(::grpc::ClientContext* context, "
444*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response, "
445*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
446*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
447*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
448*cc02d7e2SAndroid Build Coastguard Worker *vars,
449*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>("
450*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, response, "
451*cc02d7e2SAndroid Build Coastguard Worker "cq$AsyncRawArgs$));\n");
452*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
453*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
454*cc02d7e2SAndroid Build Coastguard Worker }
455*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
456*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
457*cc02d7e2SAndroid Build Coastguard Worker *vars,
458*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientReader< $Response$>>"
459*cc02d7e2SAndroid Build Coastguard Worker " $Method$(::grpc::ClientContext* context, const $Request$& request)"
460*cc02d7e2SAndroid Build Coastguard Worker " {\n");
461*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
462*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
463*cc02d7e2SAndroid Build Coastguard Worker *vars,
464*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientReader< $Response$>>"
465*cc02d7e2SAndroid Build Coastguard Worker "($Method$Raw(context, request));\n");
466*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
467*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
468*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
469*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
470*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
471*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
472*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
473*cc02d7e2SAndroid Build Coastguard Worker *vars,
474*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> "
475*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$("
476*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request, "
477*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
478*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
479*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
480*cc02d7e2SAndroid Build Coastguard Worker *vars,
481*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>>("
482*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\n");
483*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
484*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
485*cc02d7e2SAndroid Build Coastguard Worker }
486*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
487*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
488*cc02d7e2SAndroid Build Coastguard Worker *vars,
489*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>>"
490*cc02d7e2SAndroid Build Coastguard Worker " $Method$(::grpc::ClientContext* context) {\n");
491*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
492*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
493*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
494*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderWriter< $Request$, $Response$>>("
495*cc02d7e2SAndroid Build Coastguard Worker "$Method$Raw(context));\n");
496*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
497*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
498*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
499*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
500*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
501*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
502*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
503*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< ::grpc::ClientAsyncReaderWriter< "
504*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$>> "
505*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$(::grpc::ClientContext* context, "
506*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
507*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
508*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
509*cc02d7e2SAndroid Build Coastguard Worker *vars,
510*cc02d7e2SAndroid Build Coastguard Worker "return std::unique_ptr< "
511*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>>("
512*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\n");
513*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
514*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
515*cc02d7e2SAndroid Build Coastguard Worker }
516*cc02d7e2SAndroid Build Coastguard Worker }
517*cc02d7e2SAndroid Build Coastguard Worker } else {
518*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
519*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
520*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
521*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
522*cc02d7e2SAndroid Build Coastguard Worker *vars,
523*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReader< $Response$>* "
524*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, "
525*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
526*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) override;\n");
527*cc02d7e2SAndroid Build Coastguard Worker }
528*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
529*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
530*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriter< $Request$>* $Method$Raw("
531*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response) "
532*cc02d7e2SAndroid Build Coastguard Worker "override;\n");
533*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
534*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
535*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
536*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
537*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
538*cc02d7e2SAndroid Build Coastguard Worker *vars,
539*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncWriter< $Request$>* $AsyncPrefix$$Method$Raw("
540*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response, "
541*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n");
542*cc02d7e2SAndroid Build Coastguard Worker }
543*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
544*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
545*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReader< $Response$>* $Method$Raw("
546*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request)"
547*cc02d7e2SAndroid Build Coastguard Worker " override;\n");
548*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
549*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
550*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
551*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
552*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
553*cc02d7e2SAndroid Build Coastguard Worker *vars,
554*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReader< $Response$>* $AsyncPrefix$$Method$Raw("
555*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request, "
556*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n");
557*cc02d7e2SAndroid Build Coastguard Worker }
558*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
559*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
560*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderWriter< $Request$, $Response$>* "
561*cc02d7e2SAndroid Build Coastguard Worker "$Method$Raw(::grpc::ClientContext* context) override;\n");
562*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
563*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
564*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
565*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncRawArgs"] = async_prefix.raw_args;
566*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
567*cc02d7e2SAndroid Build Coastguard Worker *vars,
568*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* "
569*cc02d7e2SAndroid Build Coastguard Worker "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, "
570*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n");
571*cc02d7e2SAndroid Build Coastguard Worker }
572*cc02d7e2SAndroid Build Coastguard Worker }
573*cc02d7e2SAndroid Build Coastguard Worker }
574*cc02d7e2SAndroid Build Coastguard Worker }
575*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallbackInterfacesStart(grpc_generator::Printer * printer,std::map<std::string,std::string> *)576*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallbackInterfacesStart(
577*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer,
578*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* /*vars*/) {
579*cc02d7e2SAndroid Build Coastguard Worker // This declares the interface for the callback-based API. The components
580*cc02d7e2SAndroid Build Coastguard Worker // are pure; even though this is new (post-1.0) API, it can be pure because
581*cc02d7e2SAndroid Build Coastguard Worker // it is an entirely new interface that happens to be scoped within
582*cc02d7e2SAndroid Build Coastguard Worker // StubInterface, not new additions to StubInterface itself
583*cc02d7e2SAndroid Build Coastguard Worker printer->Print("class async_interface {\n");
584*cc02d7e2SAndroid Build Coastguard Worker // All methods in this new interface are public. There is no need for private
585*cc02d7e2SAndroid Build Coastguard Worker // "Raw" methods since the callback-based API returns unowned raw pointers
586*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
587*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
588*cc02d7e2SAndroid Build Coastguard Worker printer->Print("virtual ~async_interface() {}\n");
589*cc02d7e2SAndroid Build Coastguard Worker }
590*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallbackInterfaces(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)591*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallbackInterfaces(
592*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
593*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
594*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
595*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
596*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
597*cc02d7e2SAndroid Build Coastguard Worker
598*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
599*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
600*cc02d7e2SAndroid Build Coastguard Worker "virtual void $Method$(::grpc::ClientContext* context, "
601*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
602*cc02d7e2SAndroid Build Coastguard Worker "std::function<void(::grpc::Status)>) = 0;\n");
603*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
604*cc02d7e2SAndroid Build Coastguard Worker "virtual void $Method$(::grpc::ClientContext* context, "
605*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
606*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientUnaryReactor* reactor) = 0;\n");
607*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
608*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
609*cc02d7e2SAndroid Build Coastguard Worker "virtual void $Method$(::grpc::ClientContext* context, "
610*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response, "
611*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriteReactor< $Request$>* "
612*cc02d7e2SAndroid Build Coastguard Worker "reactor) = 0;\n");
613*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
614*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
615*cc02d7e2SAndroid Build Coastguard Worker "virtual void $Method$(::grpc::ClientContext* context, "
616*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, "
617*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReadReactor< $Response$>* "
618*cc02d7e2SAndroid Build Coastguard Worker "reactor) = 0;\n");
619*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
620*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
621*cc02d7e2SAndroid Build Coastguard Worker "virtual void $Method$(::grpc::ClientContext* context, "
622*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientBidiReactor< "
623*cc02d7e2SAndroid Build Coastguard Worker "$Request$,$Response$>* reactor) = 0;\n");
624*cc02d7e2SAndroid Build Coastguard Worker }
625*cc02d7e2SAndroid Build Coastguard Worker }
626*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallbackInterfacesEnd(grpc_generator::Printer * printer,std::map<std::string,std::string> *)627*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallbackInterfacesEnd(
628*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer,
629*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* /*vars*/) {
630*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
631*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
632*cc02d7e2SAndroid Build Coastguard Worker // TODO: Remove typedef when all uses of experimental_async are migrated off.
633*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
634*cc02d7e2SAndroid Build Coastguard Worker "typedef class async_interface experimental_async_interface;\n");
635*cc02d7e2SAndroid Build Coastguard Worker
636*cc02d7e2SAndroid Build Coastguard Worker // Declare a function to give the async stub contents. It can't be pure
637*cc02d7e2SAndroid Build Coastguard Worker // since this is a new API in StubInterface, but it is meaningless by default
638*cc02d7e2SAndroid Build Coastguard Worker // (since any stub that wants to use it must have its own implementation of
639*cc02d7e2SAndroid Build Coastguard Worker // the callback functions therein), so make the default return value nullptr.
640*cc02d7e2SAndroid Build Coastguard Worker // Intentionally include the word "class" to avoid possible shadowing.
641*cc02d7e2SAndroid Build Coastguard Worker // TODO: Remove experimental_async call when possible, replace with nullptr.
642*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
643*cc02d7e2SAndroid Build Coastguard Worker "virtual class async_interface* async() { return nullptr; }\n");
644*cc02d7e2SAndroid Build Coastguard Worker
645*cc02d7e2SAndroid Build Coastguard Worker // TODO: Remove experimental_async call when possible.
646*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
647*cc02d7e2SAndroid Build Coastguard Worker "class async_interface* experimental_async() { return async(); }\n");
648*cc02d7e2SAndroid Build Coastguard Worker }
649*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallbackStart(grpc_generator::Printer * printer,std::map<std::string,std::string> *)650*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallbackStart(
651*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer,
652*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* /*vars*/) {
653*cc02d7e2SAndroid Build Coastguard Worker // This declares the stub entry for the callback-based API.
654*cc02d7e2SAndroid Build Coastguard Worker printer->Print("class async final :\n");
655*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public StubInterface::async_interface {\n");
656*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
657*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
658*cc02d7e2SAndroid Build Coastguard Worker }
659*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallback(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)660*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallback(grpc_generator::Printer* printer,
661*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
662*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
663*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
664*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
665*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
666*cc02d7e2SAndroid Build Coastguard Worker
667*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
668*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
669*cc02d7e2SAndroid Build Coastguard Worker "void $Method$(::grpc::ClientContext* context, "
670*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
671*cc02d7e2SAndroid Build Coastguard Worker "std::function<void(::grpc::Status)>) override;\n");
672*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
673*cc02d7e2SAndroid Build Coastguard Worker "void $Method$(::grpc::ClientContext* context, "
674*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
675*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientUnaryReactor* reactor) override;\n");
676*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
677*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
678*cc02d7e2SAndroid Build Coastguard Worker "void $Method$(::grpc::ClientContext* context, "
679*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response, "
680*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriteReactor< $Request$>* "
681*cc02d7e2SAndroid Build Coastguard Worker "reactor) override;\n");
682*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
683*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
684*cc02d7e2SAndroid Build Coastguard Worker "void $Method$(::grpc::ClientContext* context, "
685*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, "
686*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReadReactor< $Response$>* "
687*cc02d7e2SAndroid Build Coastguard Worker "reactor) override;\n");
688*cc02d7e2SAndroid Build Coastguard Worker
689*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
690*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
691*cc02d7e2SAndroid Build Coastguard Worker "void $Method$(::grpc::ClientContext* context, "
692*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientBidiReactor< "
693*cc02d7e2SAndroid Build Coastguard Worker "$Request$,$Response$>* reactor) override;\n");
694*cc02d7e2SAndroid Build Coastguard Worker }
695*cc02d7e2SAndroid Build Coastguard Worker }
696*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodCallbackEnd(grpc_generator::Printer * printer,std::map<std::string,std::string> *)697*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodCallbackEnd(
698*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer,
699*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* /*vars*/) {
700*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
701*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" private:\n");
702*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
703*cc02d7e2SAndroid Build Coastguard Worker printer->Print("friend class Stub;\n");
704*cc02d7e2SAndroid Build Coastguard Worker printer->Print("explicit async(Stub* stub): stub_(stub) { }\n");
705*cc02d7e2SAndroid Build Coastguard Worker // include a function with a phony use of stub_ to avoid an unused
706*cc02d7e2SAndroid Build Coastguard Worker // private member warning for service with no methods
707*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Stub* stub() { return stub_; }\n");
708*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Stub* stub_;\n");
709*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
710*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
711*cc02d7e2SAndroid Build Coastguard Worker
712*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
713*cc02d7e2SAndroid Build Coastguard Worker "class async* async() override { "
714*cc02d7e2SAndroid Build Coastguard Worker "return &async_stub_; }\n");
715*cc02d7e2SAndroid Build Coastguard Worker }
716*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderClientMethodData(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)717*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderClientMethodData(grpc_generator::Printer* printer,
718*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
719*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
720*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
721*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
722*cc02d7e2SAndroid Build Coastguard Worker "const ::grpc::internal::RpcMethod rpcmethod_$Method$_;\n");
723*cc02d7e2SAndroid Build Coastguard Worker }
724*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodSync(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)725*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodSync(grpc_generator::Printer* printer,
726*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
727*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
728*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
729*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
730*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
731*cc02d7e2SAndroid Build Coastguard Worker printer->Print(method->GetLeadingComments("//").c_str());
732*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
733*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
734*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status $Method$("
735*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, const $Request$* request, "
736*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response);\n");
737*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
738*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
739*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status $Method$("
740*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
741*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReader< $Request$>* reader, "
742*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response);\n");
743*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
744*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
745*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status $Method$("
746*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, const $Request$* request, "
747*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* writer);\n");
748*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
749*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
750*cc02d7e2SAndroid Build Coastguard Worker *vars,
751*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status $Method$("
752*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
753*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReaderWriter< $Response$, $Request$>* stream);"
754*cc02d7e2SAndroid Build Coastguard Worker "\n");
755*cc02d7e2SAndroid Build Coastguard Worker }
756*cc02d7e2SAndroid Build Coastguard Worker printer->Print(method->GetTrailingComments("//").c_str());
757*cc02d7e2SAndroid Build Coastguard Worker }
758*cc02d7e2SAndroid Build Coastguard Worker
759*cc02d7e2SAndroid Build Coastguard Worker // Helper generator. Disables the sync API for Request and Response, then adds
760*cc02d7e2SAndroid Build Coastguard Worker // in an async API for RealRequest and RealResponse types. This is to be used
761*cc02d7e2SAndroid Build Coastguard Worker // to generate async and raw async APIs.
PrintHeaderServerAsyncMethodsHelper(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)762*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerAsyncMethodsHelper(
763*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
764*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
765*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
766*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
767*cc02d7e2SAndroid Build Coastguard Worker *vars,
768*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
769*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
770*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
771*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
772*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
773*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
774*cc02d7e2SAndroid Build Coastguard Worker "}\n");
775*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
776*cc02d7e2SAndroid Build Coastguard Worker *vars,
777*cc02d7e2SAndroid Build Coastguard Worker "void Request$Method$("
778*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, $RealRequest$* request, "
779*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerAsyncResponseWriter< $RealResponse$>* response, "
780*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* new_call_cq, "
781*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
782*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
783*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::RequestAsyncUnary($Idx$, context, "
784*cc02d7e2SAndroid Build Coastguard Worker "request, response, new_call_cq, notification_cq, tag);\n");
785*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
786*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
787*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
788*cc02d7e2SAndroid Build Coastguard Worker *vars,
789*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
790*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
791*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
792*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReader< $Request$>* /*reader*/, "
793*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
794*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
795*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
796*cc02d7e2SAndroid Build Coastguard Worker "}\n");
797*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
798*cc02d7e2SAndroid Build Coastguard Worker *vars,
799*cc02d7e2SAndroid Build Coastguard Worker "void Request$Method$("
800*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
801*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerAsyncReader< $RealResponse$, $RealRequest$>* reader, "
802*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* new_call_cq, "
803*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
804*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
805*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::RequestAsyncClientStreaming($Idx$, "
806*cc02d7e2SAndroid Build Coastguard Worker "context, reader, new_call_cq, notification_cq, tag);\n");
807*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
808*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
809*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
810*cc02d7e2SAndroid Build Coastguard Worker *vars,
811*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
812*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
813*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
814*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* /*writer*/) override "
815*cc02d7e2SAndroid Build Coastguard Worker "{\n"
816*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
817*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
818*cc02d7e2SAndroid Build Coastguard Worker "}\n");
819*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
820*cc02d7e2SAndroid Build Coastguard Worker *vars,
821*cc02d7e2SAndroid Build Coastguard Worker "void Request$Method$("
822*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, $RealRequest$* request, "
823*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerAsyncWriter< $RealResponse$>* writer, "
824*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* new_call_cq, "
825*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
826*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
827*cc02d7e2SAndroid Build Coastguard Worker *vars,
828*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::RequestAsyncServerStreaming($Idx$, "
829*cc02d7e2SAndroid Build Coastguard Worker "context, request, writer, new_call_cq, notification_cq, tag);\n");
830*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
831*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
832*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
833*cc02d7e2SAndroid Build Coastguard Worker *vars,
834*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
835*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
836*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
837*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
838*cc02d7e2SAndroid Build Coastguard Worker " override {\n"
839*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
840*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
841*cc02d7e2SAndroid Build Coastguard Worker "}\n");
842*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
843*cc02d7e2SAndroid Build Coastguard Worker *vars,
844*cc02d7e2SAndroid Build Coastguard Worker "void Request$Method$("
845*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
846*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerAsyncReaderWriter< $RealResponse$, $RealRequest$>* "
847*cc02d7e2SAndroid Build Coastguard Worker "stream, "
848*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* new_call_cq, "
849*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n");
850*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
851*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::RequestAsyncBidiStreaming($Idx$, "
852*cc02d7e2SAndroid Build Coastguard Worker "context, stream, new_call_cq, notification_cq, tag);\n");
853*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n");
854*cc02d7e2SAndroid Build Coastguard Worker }
855*cc02d7e2SAndroid Build Coastguard Worker }
856*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodAsync(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)857*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodAsync(grpc_generator::Printer* printer,
858*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
859*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
860*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
861*cc02d7e2SAndroid Build Coastguard Worker // These will be disabled
862*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
863*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
864*cc02d7e2SAndroid Build Coastguard Worker // These will be used for the async API
865*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealRequest"] = method->input_type_name();
866*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealResponse"] = method->output_type_name();
867*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
868*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
869*cc02d7e2SAndroid Build Coastguard Worker "class WithAsyncMethod_$Method$ : public BaseClass {\n");
870*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
871*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
872*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
873*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
874*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
875*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
876*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
877*cc02d7e2SAndroid Build Coastguard Worker "WithAsyncMethod_$Method$() {\n"
878*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodAsync($Idx$);\n"
879*cc02d7e2SAndroid Build Coastguard Worker "}\n");
880*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
881*cc02d7e2SAndroid Build Coastguard Worker "~WithAsyncMethod_$Method$() override {\n"
882*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
883*cc02d7e2SAndroid Build Coastguard Worker "}\n");
884*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerAsyncMethodsHelper(printer, method, vars);
885*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
886*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
887*cc02d7e2SAndroid Build Coastguard Worker }
888*cc02d7e2SAndroid Build Coastguard Worker
889*cc02d7e2SAndroid Build Coastguard Worker // Helper generator. Disables the sync API for Request and Response, then adds
890*cc02d7e2SAndroid Build Coastguard Worker // in a callback API for RealRequest and RealResponse types. This is to be used
891*cc02d7e2SAndroid Build Coastguard Worker // to generate callback and raw callback APIs.
PrintHeaderServerCallbackMethodsHelper(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)892*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerCallbackMethodsHelper(
893*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
894*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
895*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
896*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
897*cc02d7e2SAndroid Build Coastguard Worker *vars,
898*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
899*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
900*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
901*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
902*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
903*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
904*cc02d7e2SAndroid Build Coastguard Worker "}\n");
905*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
906*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ServerUnaryReactor* $Method$(\n"
907*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* /*context*/, "
908*cc02d7e2SAndroid Build Coastguard Worker "const $RealRequest$* /*request*/, "
909*cc02d7e2SAndroid Build Coastguard Worker "$RealResponse$* /*response*/)"
910*cc02d7e2SAndroid Build Coastguard Worker " { return nullptr; }\n");
911*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
912*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
913*cc02d7e2SAndroid Build Coastguard Worker *vars,
914*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
915*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
916*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
917*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReader< $Request$>* /*reader*/, "
918*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
919*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
920*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
921*cc02d7e2SAndroid Build Coastguard Worker "}\n");
922*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
923*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ServerReadReactor< "
924*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$>* $Method$(\n"
925*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* "
926*cc02d7e2SAndroid Build Coastguard Worker "/*context*/, $RealResponse$* /*response*/)"
927*cc02d7e2SAndroid Build Coastguard Worker " { return nullptr; }\n");
928*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
929*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
930*cc02d7e2SAndroid Build Coastguard Worker *vars,
931*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
932*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
933*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
934*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* /*writer*/) override "
935*cc02d7e2SAndroid Build Coastguard Worker "{\n"
936*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
937*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
938*cc02d7e2SAndroid Build Coastguard Worker "}\n");
939*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
940*cc02d7e2SAndroid Build Coastguard Worker *vars,
941*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ServerWriteReactor< $RealResponse$>* $Method$(\n"
942*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* "
943*cc02d7e2SAndroid Build Coastguard Worker "/*context*/, const $RealRequest$* /*request*/)"
944*cc02d7e2SAndroid Build Coastguard Worker " { return nullptr; }\n");
945*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
946*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
947*cc02d7e2SAndroid Build Coastguard Worker *vars,
948*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
949*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
950*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
951*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
952*cc02d7e2SAndroid Build Coastguard Worker " override {\n"
953*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
954*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
955*cc02d7e2SAndroid Build Coastguard Worker "}\n");
956*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
957*cc02d7e2SAndroid Build Coastguard Worker *vars,
958*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::ServerBidiReactor< $RealRequest$, $RealResponse$>* "
959*cc02d7e2SAndroid Build Coastguard Worker "$Method$(\n"
960*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* /*context*/)\n"
961*cc02d7e2SAndroid Build Coastguard Worker " { return nullptr; }\n");
962*cc02d7e2SAndroid Build Coastguard Worker }
963*cc02d7e2SAndroid Build Coastguard Worker }
964*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodCallback(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)965*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodCallback(grpc_generator::Printer* printer,
966*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
967*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
968*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
969*cc02d7e2SAndroid Build Coastguard Worker // These will be disabled
970*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
971*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
972*cc02d7e2SAndroid Build Coastguard Worker // These will be used for the callback API
973*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealRequest"] = method->input_type_name();
974*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealResponse"] = method->output_type_name();
975*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
976*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
977*cc02d7e2SAndroid Build Coastguard Worker "class WithCallbackMethod_$Method$ : public BaseClass {\n");
978*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
979*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
980*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
981*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
982*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
983*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
984*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithCallbackMethod_$Method$() {\n");
985*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
986*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
987*cc02d7e2SAndroid Build Coastguard Worker *vars,
988*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodCallback($Idx$,\n"
989*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackUnaryHandler< "
990*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
991*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
992*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
993*cc02d7e2SAndroid Build Coastguard Worker "const $RealRequest$* "
994*cc02d7e2SAndroid Build Coastguard Worker "request, "
995*cc02d7e2SAndroid Build Coastguard Worker "$RealResponse$* response) { "
996*cc02d7e2SAndroid Build Coastguard Worker "return this->$Method$(context, request, response); }));}\n");
997*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
998*cc02d7e2SAndroid Build Coastguard Worker "void SetMessageAllocatorFor_$Method$(\n"
999*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::MessageAllocator< "
1000*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>* allocator) {\n"
1001*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::MethodHandler* const handler = "
1002*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Service::GetHandler($Idx$);\n"
1003*cc02d7e2SAndroid Build Coastguard Worker " static_cast<::grpc::internal::CallbackUnaryHandler< "
1004*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>*>(handler)\n"
1005*cc02d7e2SAndroid Build Coastguard Worker " ->SetMessageAllocator(allocator);\n");
1006*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
1007*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1008*cc02d7e2SAndroid Build Coastguard Worker *vars,
1009*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodCallback($Idx$,\n"
1010*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackClientStreamingHandler< "
1011*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1012*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1013*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
1014*cc02d7e2SAndroid Build Coastguard Worker "$RealResponse$* "
1015*cc02d7e2SAndroid Build Coastguard Worker "response) { "
1016*cc02d7e2SAndroid Build Coastguard Worker "return this->$Method$(context, response); }));\n");
1017*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
1018*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1019*cc02d7e2SAndroid Build Coastguard Worker *vars,
1020*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodCallback($Idx$,\n"
1021*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackServerStreamingHandler< "
1022*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1023*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1024*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
1025*cc02d7e2SAndroid Build Coastguard Worker "const $RealRequest$* "
1026*cc02d7e2SAndroid Build Coastguard Worker "request) { "
1027*cc02d7e2SAndroid Build Coastguard Worker "return this->$Method$(context, request); }));\n");
1028*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
1029*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1030*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodCallback($Idx$,\n"
1031*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackBidiHandler< "
1032*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1033*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1034*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context) "
1035*cc02d7e2SAndroid Build Coastguard Worker "{ return this->$Method$(context); }));\n");
1036*cc02d7e2SAndroid Build Coastguard Worker }
1037*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "}\n");
1038*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1039*cc02d7e2SAndroid Build Coastguard Worker "~WithCallbackMethod_$Method$() override {\n"
1040*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1041*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1042*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerCallbackMethodsHelper(printer, method, vars);
1043*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1044*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1045*cc02d7e2SAndroid Build Coastguard Worker }
1046*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodRawCallback(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1047*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodRawCallback(
1048*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
1049*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1050*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1051*cc02d7e2SAndroid Build Coastguard Worker // These will be disabled
1052*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1053*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1054*cc02d7e2SAndroid Build Coastguard Worker // These will be used for raw API
1055*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealRequest"] = "::grpc::ByteBuffer";
1056*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealResponse"] = "::grpc::ByteBuffer";
1057*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
1058*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1059*cc02d7e2SAndroid Build Coastguard Worker "class WithRawCallbackMethod_$Method$ : public "
1060*cc02d7e2SAndroid Build Coastguard Worker "BaseClass {\n");
1061*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1062*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
1063*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
1064*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
1065*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
1066*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1067*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithRawCallbackMethod_$Method$() {\n");
1068*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1069*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1070*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodRawCallback($Idx$,\n"
1071*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackUnaryHandler< "
1072*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1073*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1074*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
1075*cc02d7e2SAndroid Build Coastguard Worker "const $RealRequest$* "
1076*cc02d7e2SAndroid Build Coastguard Worker "request, "
1077*cc02d7e2SAndroid Build Coastguard Worker "$RealResponse$* response) { return "
1078*cc02d7e2SAndroid Build Coastguard Worker "this->$Method$(context, request, response); }));\n");
1079*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
1080*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1081*cc02d7e2SAndroid Build Coastguard Worker *vars,
1082*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodRawCallback($Idx$,\n"
1083*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackClientStreamingHandler< "
1084*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1085*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1086*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
1087*cc02d7e2SAndroid Build Coastguard Worker "$RealResponse$* response) "
1088*cc02d7e2SAndroid Build Coastguard Worker "{ return this->$Method$(context, response); }));\n");
1089*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
1090*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1091*cc02d7e2SAndroid Build Coastguard Worker *vars,
1092*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodRawCallback($Idx$,\n"
1093*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackServerStreamingHandler< "
1094*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1095*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1096*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context, "
1097*cc02d7e2SAndroid Build Coastguard Worker "const"
1098*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$* request) { return "
1099*cc02d7e2SAndroid Build Coastguard Worker "this->$Method$(context, request); }));\n");
1100*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
1101*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1102*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodRawCallback($Idx$,\n"
1103*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::CallbackBidiHandler< "
1104*cc02d7e2SAndroid Build Coastguard Worker "$RealRequest$, $RealResponse$>(\n"
1105*cc02d7e2SAndroid Build Coastguard Worker " [this](\n"
1106*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::CallbackServerContext* context) "
1107*cc02d7e2SAndroid Build Coastguard Worker "{ return this->$Method$(context); }));\n");
1108*cc02d7e2SAndroid Build Coastguard Worker }
1109*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "}\n");
1110*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1111*cc02d7e2SAndroid Build Coastguard Worker "~WithRawCallbackMethod_$Method$() override {\n"
1112*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1113*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1114*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerCallbackMethodsHelper(printer, method, vars);
1115*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1116*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1117*cc02d7e2SAndroid Build Coastguard Worker }
1118*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodStreamedUnary(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1119*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodStreamedUnary(
1120*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
1121*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1122*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1123*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1124*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1125*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1126*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
1127*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1128*cc02d7e2SAndroid Build Coastguard Worker "class WithStreamedUnaryMethod_$Method$ : "
1129*cc02d7e2SAndroid Build Coastguard Worker "public BaseClass {\n");
1130*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1131*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
1132*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
1133*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
1134*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
1135*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1136*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1137*cc02d7e2SAndroid Build Coastguard Worker "WithStreamedUnaryMethod_$Method$() {\n"
1138*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodStreamed($Idx$,\n"
1139*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::StreamedUnaryHandler<\n"
1140*cc02d7e2SAndroid Build Coastguard Worker " $Request$, $Response$>(\n"
1141*cc02d7e2SAndroid Build Coastguard Worker " [this](::grpc::ServerContext* context,\n"
1142*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerUnaryStreamer<\n"
1143*cc02d7e2SAndroid Build Coastguard Worker " $Request$, $Response$>* streamer) {\n"
1144*cc02d7e2SAndroid Build Coastguard Worker " return this->Streamed$Method$(context,\n"
1145*cc02d7e2SAndroid Build Coastguard Worker " streamer);\n"
1146*cc02d7e2SAndroid Build Coastguard Worker " }));\n"
1147*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1148*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1149*cc02d7e2SAndroid Build Coastguard Worker "~WithStreamedUnaryMethod_$Method$() override {\n"
1150*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1151*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1152*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1153*cc02d7e2SAndroid Build Coastguard Worker *vars,
1154*cc02d7e2SAndroid Build Coastguard Worker "// disable regular version of this method\n"
1155*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1156*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
1157*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
1158*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1159*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1160*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1161*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1162*cc02d7e2SAndroid Build Coastguard Worker "// replace default version of method with streamed unary\n"
1163*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status Streamed$Method$("
1164*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1165*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerUnaryStreamer< "
1166*cc02d7e2SAndroid Build Coastguard Worker "$Request$,$Response$>* server_unary_streamer)"
1167*cc02d7e2SAndroid Build Coastguard Worker " = 0;\n");
1168*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1169*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1170*cc02d7e2SAndroid Build Coastguard Worker }
1171*cc02d7e2SAndroid Build Coastguard Worker }
1172*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodSplitStreaming(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1173*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodSplitStreaming(
1174*cc02d7e2SAndroid Build Coastguard Worker grpc_generator::Printer* printer, const grpc_generator::Method* method,
1175*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1176*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1177*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1178*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1179*cc02d7e2SAndroid Build Coastguard Worker if (ServerOnlyStreaming(method)) {
1180*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
1181*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1182*cc02d7e2SAndroid Build Coastguard Worker "class WithSplitStreamingMethod_$Method$ : "
1183*cc02d7e2SAndroid Build Coastguard Worker "public BaseClass {\n");
1184*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1185*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
1186*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
1187*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
1188*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
1189*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1190*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1191*cc02d7e2SAndroid Build Coastguard Worker "WithSplitStreamingMethod_$Method$() {\n"
1192*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodStreamed($Idx$,\n"
1193*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::SplitServerStreamingHandler<\n"
1194*cc02d7e2SAndroid Build Coastguard Worker " $Request$, $Response$>(\n"
1195*cc02d7e2SAndroid Build Coastguard Worker " [this](::grpc::ServerContext* context,\n"
1196*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerSplitStreamer<\n"
1197*cc02d7e2SAndroid Build Coastguard Worker " $Request$, $Response$>* streamer) {\n"
1198*cc02d7e2SAndroid Build Coastguard Worker " return this->Streamed$Method$(context,\n"
1199*cc02d7e2SAndroid Build Coastguard Worker " streamer);\n"
1200*cc02d7e2SAndroid Build Coastguard Worker " }));\n"
1201*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1202*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1203*cc02d7e2SAndroid Build Coastguard Worker "~WithSplitStreamingMethod_$Method$() override {\n"
1204*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1205*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1206*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1207*cc02d7e2SAndroid Build Coastguard Worker *vars,
1208*cc02d7e2SAndroid Build Coastguard Worker "// disable regular version of this method\n"
1209*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1210*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
1211*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* /*writer*/) override "
1212*cc02d7e2SAndroid Build Coastguard Worker "{\n"
1213*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1214*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1215*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1216*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1217*cc02d7e2SAndroid Build Coastguard Worker "// replace default version of method with split streamed\n"
1218*cc02d7e2SAndroid Build Coastguard Worker "virtual ::grpc::Status Streamed$Method$("
1219*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1220*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerSplitStreamer< "
1221*cc02d7e2SAndroid Build Coastguard Worker "$Request$,$Response$>* server_split_streamer)"
1222*cc02d7e2SAndroid Build Coastguard Worker " = 0;\n");
1223*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1224*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1225*cc02d7e2SAndroid Build Coastguard Worker }
1226*cc02d7e2SAndroid Build Coastguard Worker }
1227*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodGeneric(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1228*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodGeneric(grpc_generator::Printer* printer,
1229*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
1230*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1231*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1232*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1233*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1234*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
1235*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1236*cc02d7e2SAndroid Build Coastguard Worker "class WithGenericMethod_$Method$ : public BaseClass {\n");
1237*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1238*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
1239*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
1240*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
1241*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
1242*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1243*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1244*cc02d7e2SAndroid Build Coastguard Worker "WithGenericMethod_$Method$() {\n"
1245*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodGeneric($Idx$);\n"
1246*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1247*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1248*cc02d7e2SAndroid Build Coastguard Worker "~WithGenericMethod_$Method$() override {\n"
1249*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1250*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1251*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1252*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1253*cc02d7e2SAndroid Build Coastguard Worker *vars,
1254*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
1255*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1256*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
1257*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
1258*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1259*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1260*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1261*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
1262*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1263*cc02d7e2SAndroid Build Coastguard Worker *vars,
1264*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
1265*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1266*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
1267*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReader< $Request$>* /*reader*/, "
1268*cc02d7e2SAndroid Build Coastguard Worker "$Response$* /*response*/) override {\n"
1269*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1270*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1271*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1272*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
1273*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1274*cc02d7e2SAndroid Build Coastguard Worker *vars,
1275*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
1276*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1277*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, const $Request$* /*request*/, "
1278*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* /*writer*/) override "
1279*cc02d7e2SAndroid Build Coastguard Worker "{\n"
1280*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1281*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1282*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1283*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
1284*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1285*cc02d7e2SAndroid Build Coastguard Worker *vars,
1286*cc02d7e2SAndroid Build Coastguard Worker "// disable synchronous version of this method\n"
1287*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $Method$("
1288*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* /*context*/, "
1289*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReaderWriter< $Response$, $Request$>* /*stream*/) "
1290*cc02d7e2SAndroid Build Coastguard Worker " override {\n"
1291*cc02d7e2SAndroid Build Coastguard Worker " abort();\n"
1292*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"
1293*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1294*cc02d7e2SAndroid Build Coastguard Worker }
1295*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1296*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1297*cc02d7e2SAndroid Build Coastguard Worker }
1298*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderServerMethodRaw(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1299*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderServerMethodRaw(grpc_generator::Printer* printer,
1300*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
1301*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1302*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1303*cc02d7e2SAndroid Build Coastguard Worker // These will be disabled
1304*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1305*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1306*cc02d7e2SAndroid Build Coastguard Worker // These will be used for raw API
1307*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealRequest"] = "::grpc::ByteBuffer";
1308*cc02d7e2SAndroid Build Coastguard Worker (*vars)["RealResponse"] = "::grpc::ByteBuffer";
1309*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "template <class BaseClass>\n");
1310*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "class WithRawMethod_$Method$ : public BaseClass {\n");
1311*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1312*cc02d7e2SAndroid Build Coastguard Worker " private:\n"
1313*cc02d7e2SAndroid Build Coastguard Worker " void BaseClassMustBeDerivedFromService(const Service* /*service*/) "
1314*cc02d7e2SAndroid Build Coastguard Worker "{}\n");
1315*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" public:\n");
1316*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1317*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1318*cc02d7e2SAndroid Build Coastguard Worker "WithRawMethod_$Method$() {\n"
1319*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::Service::MarkMethodRaw($Idx$);\n"
1320*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1321*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1322*cc02d7e2SAndroid Build Coastguard Worker "~WithRawMethod_$Method$() override {\n"
1323*cc02d7e2SAndroid Build Coastguard Worker " BaseClassMustBeDerivedFromService(this);\n"
1324*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1325*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerAsyncMethodsHelper(printer, method, vars);
1326*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1327*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n");
1328*cc02d7e2SAndroid Build Coastguard Worker }
1329*cc02d7e2SAndroid Build Coastguard Worker
PrintHeaderService(grpc_generator::Printer * printer,const grpc_generator::Service * service,std::map<std::string,std::string> * vars)1330*cc02d7e2SAndroid Build Coastguard Worker void PrintHeaderService(grpc_generator::Printer* printer,
1331*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Service* service,
1332*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1333*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Service"] = service->name();
1334*cc02d7e2SAndroid Build Coastguard Worker
1335*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->GetLeadingComments("//").c_str());
1336*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1337*cc02d7e2SAndroid Build Coastguard Worker "class $Service$ final {\n"
1338*cc02d7e2SAndroid Build Coastguard Worker " public:\n");
1339*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1340*cc02d7e2SAndroid Build Coastguard Worker
1341*cc02d7e2SAndroid Build Coastguard Worker // Service metadata
1342*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1343*cc02d7e2SAndroid Build Coastguard Worker "static constexpr char const* service_full_name() {\n"
1344*cc02d7e2SAndroid Build Coastguard Worker " return \"$Package$$Service$\";\n"
1345*cc02d7e2SAndroid Build Coastguard Worker "}\n");
1346*cc02d7e2SAndroid Build Coastguard Worker
1347*cc02d7e2SAndroid Build Coastguard Worker // Client side
1348*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1349*cc02d7e2SAndroid Build Coastguard Worker "class StubInterface {\n"
1350*cc02d7e2SAndroid Build Coastguard Worker " public:\n");
1351*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1352*cc02d7e2SAndroid Build Coastguard Worker printer->Print("virtual ~StubInterface() {}\n");
1353*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1354*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->method(i)->GetLeadingComments("//").c_str());
1355*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars,
1356*cc02d7e2SAndroid Build Coastguard Worker true);
1357*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->method(i)->GetTrailingComments("//").c_str());
1358*cc02d7e2SAndroid Build Coastguard Worker }
1359*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallbackInterfacesStart(printer, vars);
1360*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1361*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->method(i)->GetLeadingComments("//").c_str());
1362*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallbackInterfaces(printer, service->method(i).get(),
1363*cc02d7e2SAndroid Build Coastguard Worker vars);
1364*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->method(i)->GetTrailingComments("//").c_str());
1365*cc02d7e2SAndroid Build Coastguard Worker }
1366*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallbackInterfacesEnd(printer, vars);
1367*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1368*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" private:\n");
1369*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1370*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1371*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars,
1372*cc02d7e2SAndroid Build Coastguard Worker false);
1373*cc02d7e2SAndroid Build Coastguard Worker }
1374*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1375*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
1376*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1377*cc02d7e2SAndroid Build Coastguard Worker "class Stub final : public StubInterface"
1378*cc02d7e2SAndroid Build Coastguard Worker " {\n public:\n");
1379*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1380*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1381*cc02d7e2SAndroid Build Coastguard Worker "Stub(const std::shared_ptr< ::grpc::ChannelInterface>& "
1382*cc02d7e2SAndroid Build Coastguard Worker "channel, const ::grpc::StubOptions& options = "
1383*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StubOptions());\n");
1384*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1385*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethod(printer, service->method(i).get(), vars, true);
1386*cc02d7e2SAndroid Build Coastguard Worker }
1387*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallbackStart(printer, vars);
1388*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1389*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallback(printer, service->method(i).get(), vars);
1390*cc02d7e2SAndroid Build Coastguard Worker }
1391*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodCallbackEnd(printer, vars);
1392*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1393*cc02d7e2SAndroid Build Coastguard Worker printer->Print("\n private:\n");
1394*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1395*cc02d7e2SAndroid Build Coastguard Worker printer->Print("std::shared_ptr< ::grpc::ChannelInterface> channel_;\n");
1396*cc02d7e2SAndroid Build Coastguard Worker printer->Print("class async async_stub_{this};\n");
1397*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1398*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethod(printer, service->method(i).get(), vars, false);
1399*cc02d7e2SAndroid Build Coastguard Worker }
1400*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1401*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderClientMethodData(printer, service->method(i).get(), vars);
1402*cc02d7e2SAndroid Build Coastguard Worker }
1403*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1404*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
1405*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1406*cc02d7e2SAndroid Build Coastguard Worker "static std::unique_ptr<Stub> NewStub(const std::shared_ptr< "
1407*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ChannelInterface>& channel, "
1408*cc02d7e2SAndroid Build Coastguard Worker "const ::grpc::StubOptions& options = ::grpc::StubOptions());\n");
1409*cc02d7e2SAndroid Build Coastguard Worker
1410*cc02d7e2SAndroid Build Coastguard Worker printer->Print("\n");
1411*cc02d7e2SAndroid Build Coastguard Worker
1412*cc02d7e2SAndroid Build Coastguard Worker // Server side - base
1413*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1414*cc02d7e2SAndroid Build Coastguard Worker "class Service : public ::grpc::Service {\n"
1415*cc02d7e2SAndroid Build Coastguard Worker " public:\n");
1416*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1417*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service();\n");
1418*cc02d7e2SAndroid Build Coastguard Worker printer->Print("virtual ~Service();\n");
1419*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1420*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodSync(printer, service->method(i).get(), vars);
1421*cc02d7e2SAndroid Build Coastguard Worker }
1422*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1423*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
1424*cc02d7e2SAndroid Build Coastguard Worker
1425*cc02d7e2SAndroid Build Coastguard Worker // Server side - Asynchronous
1426*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1427*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1428*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodAsync(printer, service->method(i).get(), vars);
1429*cc02d7e2SAndroid Build Coastguard Worker }
1430*cc02d7e2SAndroid Build Coastguard Worker
1431*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef ");
1432*cc02d7e2SAndroid Build Coastguard Worker
1433*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1434*cc02d7e2SAndroid Build Coastguard Worker (*vars)["method_name"] = service->method(i)->name();
1435*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithAsyncMethod_$method_name$<");
1436*cc02d7e2SAndroid Build Coastguard Worker }
1437*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service");
1438*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1439*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" >");
1440*cc02d7e2SAndroid Build Coastguard Worker }
1441*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" AsyncService;\n");
1442*cc02d7e2SAndroid Build Coastguard Worker
1443*cc02d7e2SAndroid Build Coastguard Worker // Server side - Callback
1444*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1445*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1446*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodCallback(printer, service->method(i).get(), vars);
1447*cc02d7e2SAndroid Build Coastguard Worker }
1448*cc02d7e2SAndroid Build Coastguard Worker
1449*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef ");
1450*cc02d7e2SAndroid Build Coastguard Worker
1451*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1452*cc02d7e2SAndroid Build Coastguard Worker (*vars)["method_name"] = service->method(i)->name();
1453*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithCallbackMethod_$method_name$<");
1454*cc02d7e2SAndroid Build Coastguard Worker }
1455*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service");
1456*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1457*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" >");
1458*cc02d7e2SAndroid Build Coastguard Worker }
1459*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" CallbackService;\n");
1460*cc02d7e2SAndroid Build Coastguard Worker
1461*cc02d7e2SAndroid Build Coastguard Worker // TODO: Remove following typedef once all uses of ExperimentalCallbackService
1462*cc02d7e2SAndroid Build Coastguard Worker // are migrated to CallbackService
1463*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef CallbackService ExperimentalCallbackService;\n");
1464*cc02d7e2SAndroid Build Coastguard Worker
1465*cc02d7e2SAndroid Build Coastguard Worker // Server side - Generic
1466*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1467*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1468*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodGeneric(printer, service->method(i).get(), vars);
1469*cc02d7e2SAndroid Build Coastguard Worker }
1470*cc02d7e2SAndroid Build Coastguard Worker
1471*cc02d7e2SAndroid Build Coastguard Worker // Server side - Raw
1472*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1473*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1474*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodRaw(printer, service->method(i).get(), vars);
1475*cc02d7e2SAndroid Build Coastguard Worker }
1476*cc02d7e2SAndroid Build Coastguard Worker
1477*cc02d7e2SAndroid Build Coastguard Worker // Server side - Raw Callback
1478*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1479*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1480*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodRawCallback(printer, service->method(i).get(), vars);
1481*cc02d7e2SAndroid Build Coastguard Worker }
1482*cc02d7e2SAndroid Build Coastguard Worker
1483*cc02d7e2SAndroid Build Coastguard Worker // Server side - Streamed Unary
1484*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1485*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1486*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodStreamedUnary(printer, service->method(i).get(),
1487*cc02d7e2SAndroid Build Coastguard Worker vars);
1488*cc02d7e2SAndroid Build Coastguard Worker }
1489*cc02d7e2SAndroid Build Coastguard Worker
1490*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef ");
1491*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1492*cc02d7e2SAndroid Build Coastguard Worker (*vars)["method_name"] = service->method(i)->name();
1493*cc02d7e2SAndroid Build Coastguard Worker if (service->method(i)->NoStreaming()) {
1494*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithStreamedUnaryMethod_$method_name$<");
1495*cc02d7e2SAndroid Build Coastguard Worker }
1496*cc02d7e2SAndroid Build Coastguard Worker }
1497*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service");
1498*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1499*cc02d7e2SAndroid Build Coastguard Worker if (service->method(i)->NoStreaming()) {
1500*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" >");
1501*cc02d7e2SAndroid Build Coastguard Worker }
1502*cc02d7e2SAndroid Build Coastguard Worker }
1503*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" StreamedUnaryService;\n");
1504*cc02d7e2SAndroid Build Coastguard Worker
1505*cc02d7e2SAndroid Build Coastguard Worker // Server side - controlled server-side streaming
1506*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1507*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1508*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderServerMethodSplitStreaming(printer, service->method(i).get(),
1509*cc02d7e2SAndroid Build Coastguard Worker vars);
1510*cc02d7e2SAndroid Build Coastguard Worker }
1511*cc02d7e2SAndroid Build Coastguard Worker
1512*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef ");
1513*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1514*cc02d7e2SAndroid Build Coastguard Worker (*vars)["method_name"] = service->method(i)->name();
1515*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
1516*cc02d7e2SAndroid Build Coastguard Worker if (ServerOnlyStreaming(method.get())) {
1517*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithSplitStreamingMethod_$method_name$<");
1518*cc02d7e2SAndroid Build Coastguard Worker }
1519*cc02d7e2SAndroid Build Coastguard Worker }
1520*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service");
1521*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1522*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
1523*cc02d7e2SAndroid Build Coastguard Worker if (ServerOnlyStreaming(method.get())) {
1524*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" >");
1525*cc02d7e2SAndroid Build Coastguard Worker }
1526*cc02d7e2SAndroid Build Coastguard Worker }
1527*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" SplitStreamedService;\n");
1528*cc02d7e2SAndroid Build Coastguard Worker
1529*cc02d7e2SAndroid Build Coastguard Worker // Server side - typedef for controlled both unary and server-side streaming
1530*cc02d7e2SAndroid Build Coastguard Worker printer->Print("typedef ");
1531*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1532*cc02d7e2SAndroid Build Coastguard Worker (*vars)["method_name"] = service->method(i)->name();
1533*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
1534*cc02d7e2SAndroid Build Coastguard Worker if (ServerOnlyStreaming(method.get())) {
1535*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithSplitStreamingMethod_$method_name$<");
1536*cc02d7e2SAndroid Build Coastguard Worker }
1537*cc02d7e2SAndroid Build Coastguard Worker if (service->method(i)->NoStreaming()) {
1538*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "WithStreamedUnaryMethod_$method_name$<");
1539*cc02d7e2SAndroid Build Coastguard Worker }
1540*cc02d7e2SAndroid Build Coastguard Worker }
1541*cc02d7e2SAndroid Build Coastguard Worker printer->Print("Service");
1542*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1543*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
1544*cc02d7e2SAndroid Build Coastguard Worker if (service->method(i)->NoStreaming() ||
1545*cc02d7e2SAndroid Build Coastguard Worker ServerOnlyStreaming(method.get())) {
1546*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" >");
1547*cc02d7e2SAndroid Build Coastguard Worker }
1548*cc02d7e2SAndroid Build Coastguard Worker }
1549*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" StreamedService;\n");
1550*cc02d7e2SAndroid Build Coastguard Worker
1551*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
1552*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
1553*cc02d7e2SAndroid Build Coastguard Worker printer->Print(service->GetTrailingComments("//").c_str());
1554*cc02d7e2SAndroid Build Coastguard Worker }
1555*cc02d7e2SAndroid Build Coastguard Worker
GetHeaderServices(grpc_generator::File * file,const Parameters & params)1556*cc02d7e2SAndroid Build Coastguard Worker std::string GetHeaderServices(grpc_generator::File* file,
1557*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
1558*cc02d7e2SAndroid Build Coastguard Worker std::string output;
1559*cc02d7e2SAndroid Build Coastguard Worker {
1560*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
1561*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
1562*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
1563*cc02d7e2SAndroid Build Coastguard Worker // Package string is empty or ends with a dot. It is used to fully qualify
1564*cc02d7e2SAndroid Build Coastguard Worker // method names.
1565*cc02d7e2SAndroid Build Coastguard Worker vars["Package"] = file->package();
1566*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
1567*cc02d7e2SAndroid Build Coastguard Worker vars["Package"].append(".");
1568*cc02d7e2SAndroid Build Coastguard Worker }
1569*cc02d7e2SAndroid Build Coastguard Worker
1570*cc02d7e2SAndroid Build Coastguard Worker if (!params.services_namespace.empty()) {
1571*cc02d7e2SAndroid Build Coastguard Worker vars["services_namespace"] = params.services_namespace;
1572*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\nnamespace $services_namespace$ {\n\n");
1573*cc02d7e2SAndroid Build Coastguard Worker }
1574*cc02d7e2SAndroid Build Coastguard Worker
1575*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < file->service_count(); ++i) {
1576*cc02d7e2SAndroid Build Coastguard Worker PrintHeaderService(printer.get(), file->service(i).get(), &vars);
1577*cc02d7e2SAndroid Build Coastguard Worker printer->Print("\n");
1578*cc02d7e2SAndroid Build Coastguard Worker }
1579*cc02d7e2SAndroid Build Coastguard Worker
1580*cc02d7e2SAndroid Build Coastguard Worker if (!params.services_namespace.empty()) {
1581*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "} // namespace $services_namespace$\n\n");
1582*cc02d7e2SAndroid Build Coastguard Worker }
1583*cc02d7e2SAndroid Build Coastguard Worker }
1584*cc02d7e2SAndroid Build Coastguard Worker return output;
1585*cc02d7e2SAndroid Build Coastguard Worker }
1586*cc02d7e2SAndroid Build Coastguard Worker
GetHeaderEpilogue(grpc_generator::File * file,const Parameters &)1587*cc02d7e2SAndroid Build Coastguard Worker std::string GetHeaderEpilogue(grpc_generator::File* file,
1588*cc02d7e2SAndroid Build Coastguard Worker const Parameters& /*params*/) {
1589*cc02d7e2SAndroid Build Coastguard Worker std::string output;
1590*cc02d7e2SAndroid Build Coastguard Worker {
1591*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
1592*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
1593*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
1594*cc02d7e2SAndroid Build Coastguard Worker
1595*cc02d7e2SAndroid Build Coastguard Worker vars["filename"] = file->filename();
1596*cc02d7e2SAndroid Build Coastguard Worker vars["filename_identifier"] = FilenameIdentifier(file->filename());
1597*cc02d7e2SAndroid Build Coastguard Worker
1598*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
1599*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
1600*cc02d7e2SAndroid Build Coastguard Worker
1601*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.rbegin(); part != parts.rend(); part++) {
1602*cc02d7e2SAndroid Build Coastguard Worker vars["part"] = *part;
1603*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "} // namespace $part$\n");
1604*cc02d7e2SAndroid Build Coastguard Worker }
1605*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
1606*cc02d7e2SAndroid Build Coastguard Worker }
1607*cc02d7e2SAndroid Build Coastguard Worker
1608*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
1609*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#endif // GRPC_$filename_identifier$__INCLUDED\n");
1610*cc02d7e2SAndroid Build Coastguard Worker
1611*cc02d7e2SAndroid Build Coastguard Worker printer->Print(file->GetTrailingComments("//").c_str());
1612*cc02d7e2SAndroid Build Coastguard Worker }
1613*cc02d7e2SAndroid Build Coastguard Worker return output;
1614*cc02d7e2SAndroid Build Coastguard Worker }
1615*cc02d7e2SAndroid Build Coastguard Worker
GetSourcePrologue(grpc_generator::File * file,const Parameters & params)1616*cc02d7e2SAndroid Build Coastguard Worker std::string GetSourcePrologue(grpc_generator::File* file,
1617*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
1618*cc02d7e2SAndroid Build Coastguard Worker std::string output;
1619*cc02d7e2SAndroid Build Coastguard Worker {
1620*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
1621*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
1622*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
1623*cc02d7e2SAndroid Build Coastguard Worker
1624*cc02d7e2SAndroid Build Coastguard Worker vars["filename"] = file->filename();
1625*cc02d7e2SAndroid Build Coastguard Worker vars["filename_base"] = file->filename_without_ext();
1626*cc02d7e2SAndroid Build Coastguard Worker vars["message_header_ext"] = params.message_header_extension.empty()
1627*cc02d7e2SAndroid Build Coastguard Worker ? kCppGeneratorMessageHeaderExt
1628*cc02d7e2SAndroid Build Coastguard Worker : params.message_header_extension;
1629*cc02d7e2SAndroid Build Coastguard Worker vars["service_header_ext"] = kCppGeneratorServiceHeaderExt;
1630*cc02d7e2SAndroid Build Coastguard Worker
1631*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// Generated by the gRPC C++ plugin.\n");
1632*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars,
1633*cc02d7e2SAndroid Build Coastguard Worker "// If you make any local change, they will be lost.\n");
1634*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// source: $filename$\n\n");
1635*cc02d7e2SAndroid Build Coastguard Worker
1636*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n");
1637*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n");
1638*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
1639*cc02d7e2SAndroid Build Coastguard Worker }
1640*cc02d7e2SAndroid Build Coastguard Worker return output;
1641*cc02d7e2SAndroid Build Coastguard Worker }
1642*cc02d7e2SAndroid Build Coastguard Worker
GetSourceIncludes(grpc_generator::File * file,const Parameters & params)1643*cc02d7e2SAndroid Build Coastguard Worker std::string GetSourceIncludes(grpc_generator::File* file,
1644*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
1645*cc02d7e2SAndroid Build Coastguard Worker std::string output;
1646*cc02d7e2SAndroid Build Coastguard Worker {
1647*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
1648*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
1649*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
1650*cc02d7e2SAndroid Build Coastguard Worker static const char* headers_strs[] = {
1651*cc02d7e2SAndroid Build Coastguard Worker "functional",
1652*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/async_stream.h",
1653*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/async_unary_call.h",
1654*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/channel_interface.h",
1655*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/client_unary_call.h",
1656*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/client_callback.h",
1657*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/message_allocator.h",
1658*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/method_handler.h",
1659*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/rpc_service_method.h",
1660*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/server_callback.h",
1661*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/server_callback_handlers.h",
1662*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/server_context.h",
1663*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/impl/service_type.h",
1664*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/sync_stream.h"};
1665*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> headers(headers_strs, array_end(headers_strs));
1666*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), headers, params.use_system_headers,
1667*cc02d7e2SAndroid Build Coastguard Worker params.grpc_search_path);
1668*cc02d7e2SAndroid Build Coastguard Worker
1669*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
1670*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
1671*cc02d7e2SAndroid Build Coastguard Worker
1672*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.begin(); part != parts.end(); part++) {
1673*cc02d7e2SAndroid Build Coastguard Worker vars["part"] = *part;
1674*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "namespace $part$ {\n");
1675*cc02d7e2SAndroid Build Coastguard Worker }
1676*cc02d7e2SAndroid Build Coastguard Worker }
1677*cc02d7e2SAndroid Build Coastguard Worker
1678*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
1679*cc02d7e2SAndroid Build Coastguard Worker }
1680*cc02d7e2SAndroid Build Coastguard Worker return output;
1681*cc02d7e2SAndroid Build Coastguard Worker }
1682*cc02d7e2SAndroid Build Coastguard Worker
PrintSourceClientMethod(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1683*cc02d7e2SAndroid Build Coastguard Worker void PrintSourceClientMethod(grpc_generator::Printer* printer,
1684*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
1685*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1686*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1687*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1688*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1689*cc02d7e2SAndroid Build Coastguard Worker struct {
1690*cc02d7e2SAndroid Build Coastguard Worker std::string prefix;
1691*cc02d7e2SAndroid Build Coastguard Worker std::string start; // bool literal expressed as string
1692*cc02d7e2SAndroid Build Coastguard Worker std::string method_params; // extra arguments to method
1693*cc02d7e2SAndroid Build Coastguard Worker std::string create_args; // extra arguments to creator
1694*cc02d7e2SAndroid Build Coastguard Worker } async_prefixes[] = {{"Async", "true", ", void* tag", ", tag"},
1695*cc02d7e2SAndroid Build Coastguard Worker {"PrepareAsync", "false", "", ", nullptr"}};
1696*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1697*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1698*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $ns$$Service$::Stub::$Method$("
1699*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, "
1700*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, $Response$* response) {\n");
1701*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1702*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::BlockingUnaryCall"
1703*cc02d7e2SAndroid Build Coastguard Worker "< $Request$, $Response$, ::grpc::protobuf::MessageLite, "
1704*cc02d7e2SAndroid Build Coastguard Worker "::grpc::protobuf::MessageLite>"
1705*cc02d7e2SAndroid Build Coastguard Worker "(channel_.get(), rpcmethod_$Method$_, "
1706*cc02d7e2SAndroid Build Coastguard Worker "context, request, response);\n}\n\n");
1707*cc02d7e2SAndroid Build Coastguard Worker
1708*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1709*cc02d7e2SAndroid Build Coastguard Worker "void $ns$$Service$::Stub::async::$Method$("
1710*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, "
1711*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
1712*cc02d7e2SAndroid Build Coastguard Worker "std::function<void(::grpc::Status)> f) {\n");
1713*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1714*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::CallbackUnaryCall"
1715*cc02d7e2SAndroid Build Coastguard Worker "< $Request$, $Response$, ::grpc::protobuf::MessageLite, "
1716*cc02d7e2SAndroid Build Coastguard Worker "::grpc::protobuf::MessageLite>"
1717*cc02d7e2SAndroid Build Coastguard Worker "(stub_->channel_.get(), stub_->rpcmethod_$Method$_, "
1718*cc02d7e2SAndroid Build Coastguard Worker "context, request, response, std::move(f));\n}\n\n");
1719*cc02d7e2SAndroid Build Coastguard Worker
1720*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1721*cc02d7e2SAndroid Build Coastguard Worker "void $ns$$Service$::Stub::async::$Method$("
1722*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, "
1723*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response, "
1724*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientUnaryReactor* reactor) {\n");
1725*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1726*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::ClientCallbackUnaryFactory::Create"
1727*cc02d7e2SAndroid Build Coastguard Worker "< ::grpc::protobuf::MessageLite, "
1728*cc02d7e2SAndroid Build Coastguard Worker "::grpc::protobuf::MessageLite>"
1729*cc02d7e2SAndroid Build Coastguard Worker "(stub_->channel_.get(), stub_->rpcmethod_$Method$_, "
1730*cc02d7e2SAndroid Build Coastguard Worker "context, request, response, reactor);\n}\n\n");
1731*cc02d7e2SAndroid Build Coastguard Worker
1732*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1733*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReader< $Response$>* "
1734*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::PrepareAsync$Method$Raw(::grpc::"
1735*cc02d7e2SAndroid Build Coastguard Worker "ClientContext* context, "
1736*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
1737*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) {\n");
1738*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1739*cc02d7e2SAndroid Build Coastguard Worker " return "
1740*cc02d7e2SAndroid Build Coastguard Worker "::grpc::internal::ClientAsyncResponseReaderHelper::Create"
1741*cc02d7e2SAndroid Build Coastguard Worker "< $Response$, $Request$, ::grpc::protobuf::MessageLite, "
1742*cc02d7e2SAndroid Build Coastguard Worker "::grpc::protobuf::MessageLite>"
1743*cc02d7e2SAndroid Build Coastguard Worker "(channel_.get(), cq, rpcmethod_$Method$_, "
1744*cc02d7e2SAndroid Build Coastguard Worker "context, request);\n"
1745*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1746*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1747*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReader< $Response$>* "
1748*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::Async$Method$Raw(::grpc::"
1749*cc02d7e2SAndroid Build Coastguard Worker "ClientContext* context, "
1750*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, "
1751*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq) {\n");
1752*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1753*cc02d7e2SAndroid Build Coastguard Worker " auto* result =\n"
1754*cc02d7e2SAndroid Build Coastguard Worker " this->PrepareAsync$Method$Raw(context, request, cq);\n"
1755*cc02d7e2SAndroid Build Coastguard Worker " result->StartCall();\n"
1756*cc02d7e2SAndroid Build Coastguard Worker " return result;\n"
1757*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1758*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
1759*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1760*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriter< $Request$>* "
1761*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$Method$Raw("
1762*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response) {\n");
1763*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1764*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::ClientWriterFactory< "
1765*cc02d7e2SAndroid Build Coastguard Worker "$Request$>::Create("
1766*cc02d7e2SAndroid Build Coastguard Worker "channel_.get(), "
1767*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1768*cc02d7e2SAndroid Build Coastguard Worker "context, response);\n"
1769*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1770*cc02d7e2SAndroid Build Coastguard Worker
1771*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1772*cc02d7e2SAndroid Build Coastguard Worker "void $ns$$Service$::"
1773*cc02d7e2SAndroid Build Coastguard Worker "Stub::async::$Method$(::grpc::ClientContext* context, "
1774*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response, "
1775*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriteReactor< $Request$>* reactor) {\n");
1776*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1777*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::ClientCallbackWriterFactory< "
1778*cc02d7e2SAndroid Build Coastguard Worker "$Request$>::Create("
1779*cc02d7e2SAndroid Build Coastguard Worker "stub_->channel_.get(), "
1780*cc02d7e2SAndroid Build Coastguard Worker "stub_->rpcmethod_$Method$_, "
1781*cc02d7e2SAndroid Build Coastguard Worker "context, response, reactor);\n"
1782*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1783*cc02d7e2SAndroid Build Coastguard Worker
1784*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
1785*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
1786*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncStart"] = async_prefix.start;
1787*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
1788*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncCreateArgs"] = async_prefix.create_args;
1789*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1790*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncWriter< $Request$>* "
1791*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw("
1792*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, $Response$* response, "
1793*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
1794*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1795*cc02d7e2SAndroid Build Coastguard Worker *vars,
1796*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::ClientAsyncWriterFactory< $Request$>"
1797*cc02d7e2SAndroid Build Coastguard Worker "::Create(channel_.get(), cq, "
1798*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1799*cc02d7e2SAndroid Build Coastguard Worker "context, response, $AsyncStart$$AsyncCreateArgs$);\n"
1800*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1801*cc02d7e2SAndroid Build Coastguard Worker }
1802*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
1803*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1804*cc02d7e2SAndroid Build Coastguard Worker *vars,
1805*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReader< $Response$>* "
1806*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$Method$Raw("
1807*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request) {\n");
1808*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1809*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::ClientReaderFactory< "
1810*cc02d7e2SAndroid Build Coastguard Worker "$Response$>::Create("
1811*cc02d7e2SAndroid Build Coastguard Worker "channel_.get(), "
1812*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1813*cc02d7e2SAndroid Build Coastguard Worker "context, request);\n"
1814*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1815*cc02d7e2SAndroid Build Coastguard Worker
1816*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1817*cc02d7e2SAndroid Build Coastguard Worker "void $ns$$Service$::Stub::async::$Method$(::grpc::"
1818*cc02d7e2SAndroid Build Coastguard Worker "ClientContext* context, "
1819*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, "
1820*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReadReactor< $Response$>* reactor) {\n");
1821*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1822*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::ClientCallbackReaderFactory< "
1823*cc02d7e2SAndroid Build Coastguard Worker "$Response$>::Create("
1824*cc02d7e2SAndroid Build Coastguard Worker "stub_->channel_.get(), "
1825*cc02d7e2SAndroid Build Coastguard Worker "stub_->rpcmethod_$Method$_, "
1826*cc02d7e2SAndroid Build Coastguard Worker "context, request, reactor);\n"
1827*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1828*cc02d7e2SAndroid Build Coastguard Worker
1829*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
1830*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
1831*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncStart"] = async_prefix.start;
1832*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
1833*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncCreateArgs"] = async_prefix.create_args;
1834*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1835*cc02d7e2SAndroid Build Coastguard Worker *vars,
1836*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReader< $Response$>* "
1837*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw("
1838*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientContext* context, const $Request$& request, "
1839*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
1840*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1841*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::ClientAsyncReaderFactory< "
1842*cc02d7e2SAndroid Build Coastguard Worker "$Response$>"
1843*cc02d7e2SAndroid Build Coastguard Worker "::Create(channel_.get(), cq, "
1844*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1845*cc02d7e2SAndroid Build Coastguard Worker "context, request, $AsyncStart$$AsyncCreateArgs$);\n"
1846*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1847*cc02d7e2SAndroid Build Coastguard Worker }
1848*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
1849*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1850*cc02d7e2SAndroid Build Coastguard Worker *vars,
1851*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderWriter< $Request$, $Response$>* "
1852*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\n");
1853*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1854*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::internal::ClientReaderWriterFactory< "
1855*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$>::Create("
1856*cc02d7e2SAndroid Build Coastguard Worker "channel_.get(), "
1857*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1858*cc02d7e2SAndroid Build Coastguard Worker "context);\n"
1859*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1860*cc02d7e2SAndroid Build Coastguard Worker
1861*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1862*cc02d7e2SAndroid Build Coastguard Worker "void $ns$$Service$::Stub::async::$Method$(::grpc::"
1863*cc02d7e2SAndroid Build Coastguard Worker "ClientContext* context, "
1864*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientBidiReactor< $Request$,$Response$>* "
1865*cc02d7e2SAndroid Build Coastguard Worker "reactor) {\n");
1866*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1867*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::ClientCallbackReaderWriterFactory< "
1868*cc02d7e2SAndroid Build Coastguard Worker "$Request$,$Response$>::Create("
1869*cc02d7e2SAndroid Build Coastguard Worker "stub_->channel_.get(), "
1870*cc02d7e2SAndroid Build Coastguard Worker "stub_->rpcmethod_$Method$_, "
1871*cc02d7e2SAndroid Build Coastguard Worker "context, reactor);\n"
1872*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1873*cc02d7e2SAndroid Build Coastguard Worker
1874*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
1875*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
1876*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncStart"] = async_prefix.start;
1877*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
1878*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncCreateArgs"] = async_prefix.create_args;
1879*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1880*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* "
1881*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::"
1882*cc02d7e2SAndroid Build Coastguard Worker "ClientContext* context, "
1883*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
1884*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1885*cc02d7e2SAndroid Build Coastguard Worker " return "
1886*cc02d7e2SAndroid Build Coastguard Worker "::grpc::internal::ClientAsyncReaderWriterFactory< "
1887*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$>::Create("
1888*cc02d7e2SAndroid Build Coastguard Worker "channel_.get(), cq, "
1889*cc02d7e2SAndroid Build Coastguard Worker "rpcmethod_$Method$_, "
1890*cc02d7e2SAndroid Build Coastguard Worker "context, $AsyncStart$$AsyncCreateArgs$);\n"
1891*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1892*cc02d7e2SAndroid Build Coastguard Worker }
1893*cc02d7e2SAndroid Build Coastguard Worker }
1894*cc02d7e2SAndroid Build Coastguard Worker }
1895*cc02d7e2SAndroid Build Coastguard Worker
PrintSourceServerMethod(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)1896*cc02d7e2SAndroid Build Coastguard Worker void PrintSourceServerMethod(grpc_generator::Printer* printer,
1897*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
1898*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1899*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1900*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
1901*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
1902*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1903*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1904*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $ns$$Service$::Service::$Method$("
1905*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1906*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, $Response$* response) {\n");
1907*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) context;\n");
1908*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) request;\n");
1909*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) response;\n");
1910*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1911*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status("
1912*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
1913*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n\n");
1914*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
1915*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1916*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $ns$$Service$::Service::$Method$("
1917*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1918*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReader< $Request$>* reader, "
1919*cc02d7e2SAndroid Build Coastguard Worker "$Response$* response) {\n");
1920*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) context;\n");
1921*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) reader;\n");
1922*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) response;\n");
1923*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1924*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status("
1925*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
1926*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n\n");
1927*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
1928*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1929*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $ns$$Service$::Service::$Method$("
1930*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1931*cc02d7e2SAndroid Build Coastguard Worker "const $Request$* request, "
1932*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerWriter< $Response$>* writer) {\n");
1933*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) context;\n");
1934*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) request;\n");
1935*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) writer;\n");
1936*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1937*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status("
1938*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
1939*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n\n");
1940*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
1941*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1942*cc02d7e2SAndroid Build Coastguard Worker "::grpc::Status $ns$$Service$::Service::$Method$("
1943*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerContext* context, "
1944*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ServerReaderWriter< $Response$, $Request$>* "
1945*cc02d7e2SAndroid Build Coastguard Worker "stream) {\n");
1946*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) context;\n");
1947*cc02d7e2SAndroid Build Coastguard Worker printer->Print(" (void) stream;\n");
1948*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
1949*cc02d7e2SAndroid Build Coastguard Worker " return ::grpc::Status("
1950*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n");
1951*cc02d7e2SAndroid Build Coastguard Worker printer->Print("}\n\n");
1952*cc02d7e2SAndroid Build Coastguard Worker }
1953*cc02d7e2SAndroid Build Coastguard Worker }
1954*cc02d7e2SAndroid Build Coastguard Worker
PrintSourceService(grpc_generator::Printer * printer,const grpc_generator::Service * service,std::map<std::string,std::string> * vars)1955*cc02d7e2SAndroid Build Coastguard Worker void PrintSourceService(grpc_generator::Printer* printer,
1956*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Service* service,
1957*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
1958*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Service"] = service->name();
1959*cc02d7e2SAndroid Build Coastguard Worker
1960*cc02d7e2SAndroid Build Coastguard Worker if (service->method_count() > 0) {
1961*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1962*cc02d7e2SAndroid Build Coastguard Worker "static const char* $prefix$$Service$_method_names[] = {\n");
1963*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1964*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = service->method(i)->name();
1965*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, " \"/$Package$$Service$/$Method$\",\n");
1966*cc02d7e2SAndroid Build Coastguard Worker }
1967*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "};\n\n");
1968*cc02d7e2SAndroid Build Coastguard Worker }
1969*cc02d7e2SAndroid Build Coastguard Worker
1970*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1971*cc02d7e2SAndroid Build Coastguard Worker "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub("
1972*cc02d7e2SAndroid Build Coastguard Worker "const std::shared_ptr< ::grpc::ChannelInterface>& channel, "
1973*cc02d7e2SAndroid Build Coastguard Worker "const ::grpc::StubOptions& options) {\n"
1974*cc02d7e2SAndroid Build Coastguard Worker " (void)options;\n"
1975*cc02d7e2SAndroid Build Coastguard Worker " std::unique_ptr< $ns$$Service$::Stub> stub(new "
1976*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub(channel, options));\n"
1977*cc02d7e2SAndroid Build Coastguard Worker " return stub;\n"
1978*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
1979*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
1980*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Stub::Stub(const std::shared_ptr< "
1981*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ChannelInterface>& channel, const "
1982*cc02d7e2SAndroid Build Coastguard Worker "::grpc::StubOptions& options)\n");
1983*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
1984*cc02d7e2SAndroid Build Coastguard Worker printer->Print(": channel_(channel)");
1985*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
1986*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
1987*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
1988*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
1989*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
1990*cc02d7e2SAndroid Build Coastguard Worker (*vars)["StreamingType"] = "NORMAL_RPC";
1991*cc02d7e2SAndroid Build Coastguard Worker // NOTE: There is no reason to consider streamed-unary as a separate
1992*cc02d7e2SAndroid Build Coastguard Worker // category here since this part is setting up the client-side stub
1993*cc02d7e2SAndroid Build Coastguard Worker // and this appears as a NORMAL_RPC from the client-side.
1994*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method.get())) {
1995*cc02d7e2SAndroid Build Coastguard Worker (*vars)["StreamingType"] = "CLIENT_STREAMING";
1996*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method.get())) {
1997*cc02d7e2SAndroid Build Coastguard Worker (*vars)["StreamingType"] = "SERVER_STREAMING";
1998*cc02d7e2SAndroid Build Coastguard Worker } else {
1999*cc02d7e2SAndroid Build Coastguard Worker (*vars)["StreamingType"] = "BIDI_STREAMING";
2000*cc02d7e2SAndroid Build Coastguard Worker }
2001*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2002*cc02d7e2SAndroid Build Coastguard Worker *vars,
2003*cc02d7e2SAndroid Build Coastguard Worker ", rpcmethod_$Method$_("
2004*cc02d7e2SAndroid Build Coastguard Worker "$prefix$$Service$_method_names[$Idx$], options.suffix_for_stats(),"
2005*cc02d7e2SAndroid Build Coastguard Worker "::grpc::internal::RpcMethod::$StreamingType$, "
2006*cc02d7e2SAndroid Build Coastguard Worker "channel"
2007*cc02d7e2SAndroid Build Coastguard Worker ")\n");
2008*cc02d7e2SAndroid Build Coastguard Worker }
2009*cc02d7e2SAndroid Build Coastguard Worker printer->Print("{}\n\n");
2010*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
2011*cc02d7e2SAndroid Build Coastguard Worker
2012*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
2013*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
2014*cc02d7e2SAndroid Build Coastguard Worker PrintSourceClientMethod(printer, service->method(i).get(), vars);
2015*cc02d7e2SAndroid Build Coastguard Worker }
2016*cc02d7e2SAndroid Build Coastguard Worker
2017*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "$ns$$Service$::Service::Service() {\n");
2018*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
2019*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
2020*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
2021*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
2022*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
2023*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
2024*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
2025*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
2026*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2027*cc02d7e2SAndroid Build Coastguard Worker *vars,
2028*cc02d7e2SAndroid Build Coastguard Worker "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
2029*cc02d7e2SAndroid Build Coastguard Worker " $prefix$$Service$_method_names[$Idx$],\n"
2030*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::RpcMethod::NORMAL_RPC,\n"
2031*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, "
2032*cc02d7e2SAndroid Build Coastguard Worker "$Request$, $Response$, ::grpc::protobuf::MessageLite, "
2033*cc02d7e2SAndroid Build Coastguard Worker "::grpc::protobuf::MessageLite>(\n"
2034*cc02d7e2SAndroid Build Coastguard Worker " []($ns$$Service$::Service* service,\n"
2035*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerContext* ctx,\n"
2036*cc02d7e2SAndroid Build Coastguard Worker " const $Request$* req,\n"
2037*cc02d7e2SAndroid Build Coastguard Worker " $Response$* resp) {\n"
2038*cc02d7e2SAndroid Build Coastguard Worker " return service->$Method$(ctx, req, resp);\n"
2039*cc02d7e2SAndroid Build Coastguard Worker " }, this)));\n");
2040*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method.get())) {
2041*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2042*cc02d7e2SAndroid Build Coastguard Worker *vars,
2043*cc02d7e2SAndroid Build Coastguard Worker "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
2044*cc02d7e2SAndroid Build Coastguard Worker " $prefix$$Service$_method_names[$Idx$],\n"
2045*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n"
2046*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::ClientStreamingHandler< "
2047*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Service, $Request$, $Response$>(\n"
2048*cc02d7e2SAndroid Build Coastguard Worker " []($ns$$Service$::Service* service,\n"
2049*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerContext* ctx,\n"
2050*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerReader<$Request$>* reader,\n"
2051*cc02d7e2SAndroid Build Coastguard Worker " $Response$* resp) {\n"
2052*cc02d7e2SAndroid Build Coastguard Worker " return service->$Method$(ctx, reader, resp);\n"
2053*cc02d7e2SAndroid Build Coastguard Worker " }, this)));\n");
2054*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method.get())) {
2055*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2056*cc02d7e2SAndroid Build Coastguard Worker *vars,
2057*cc02d7e2SAndroid Build Coastguard Worker "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
2058*cc02d7e2SAndroid Build Coastguard Worker " $prefix$$Service$_method_names[$Idx$],\n"
2059*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::RpcMethod::SERVER_STREAMING,\n"
2060*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::ServerStreamingHandler< "
2061*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Service, $Request$, $Response$>(\n"
2062*cc02d7e2SAndroid Build Coastguard Worker " []($ns$$Service$::Service* service,\n"
2063*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerContext* ctx,\n"
2064*cc02d7e2SAndroid Build Coastguard Worker " const $Request$* req,\n"
2065*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerWriter<$Response$>* writer) {\n"
2066*cc02d7e2SAndroid Build Coastguard Worker " return service->$Method$(ctx, req, writer);\n"
2067*cc02d7e2SAndroid Build Coastguard Worker " }, this)));\n");
2068*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
2069*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
2070*cc02d7e2SAndroid Build Coastguard Worker "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
2071*cc02d7e2SAndroid Build Coastguard Worker " $prefix$$Service$_method_names[$Idx$],\n"
2072*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::internal::RpcMethod::BIDI_STREAMING,\n"
2073*cc02d7e2SAndroid Build Coastguard Worker " new ::grpc::internal::BidiStreamingHandler< "
2074*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Service, $Request$, $Response$>(\n"
2075*cc02d7e2SAndroid Build Coastguard Worker " []($ns$$Service$::Service* service,\n"
2076*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerContext* ctx,\n"
2077*cc02d7e2SAndroid Build Coastguard Worker " ::grpc::ServerReaderWriter<$Response$,\n"
2078*cc02d7e2SAndroid Build Coastguard Worker " $Request$>* stream) {\n"
2079*cc02d7e2SAndroid Build Coastguard Worker " return service->$Method$(ctx, stream);\n"
2080*cc02d7e2SAndroid Build Coastguard Worker " }, this)));\n");
2081*cc02d7e2SAndroid Build Coastguard Worker }
2082*cc02d7e2SAndroid Build Coastguard Worker }
2083*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
2084*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars, "}\n\n");
2085*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
2086*cc02d7e2SAndroid Build Coastguard Worker "$ns$$Service$::Service::~Service() {\n"
2087*cc02d7e2SAndroid Build Coastguard Worker "}\n\n");
2088*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
2089*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Idx"] = as_string(i);
2090*cc02d7e2SAndroid Build Coastguard Worker PrintSourceServerMethod(printer, service->method(i).get(), vars);
2091*cc02d7e2SAndroid Build Coastguard Worker }
2092*cc02d7e2SAndroid Build Coastguard Worker }
2093*cc02d7e2SAndroid Build Coastguard Worker
GetSourceServices(grpc_generator::File * file,const Parameters & params)2094*cc02d7e2SAndroid Build Coastguard Worker std::string GetSourceServices(grpc_generator::File* file,
2095*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
2096*cc02d7e2SAndroid Build Coastguard Worker std::string output;
2097*cc02d7e2SAndroid Build Coastguard Worker {
2098*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
2099*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
2100*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
2101*cc02d7e2SAndroid Build Coastguard Worker // Package string is empty or ends with a dot. It is used to fully qualify
2102*cc02d7e2SAndroid Build Coastguard Worker // method names.
2103*cc02d7e2SAndroid Build Coastguard Worker vars["Package"] = file->package();
2104*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
2105*cc02d7e2SAndroid Build Coastguard Worker vars["Package"].append(".");
2106*cc02d7e2SAndroid Build Coastguard Worker }
2107*cc02d7e2SAndroid Build Coastguard Worker if (!params.services_namespace.empty()) {
2108*cc02d7e2SAndroid Build Coastguard Worker vars["ns"] = params.services_namespace + "::";
2109*cc02d7e2SAndroid Build Coastguard Worker vars["prefix"] = params.services_namespace;
2110*cc02d7e2SAndroid Build Coastguard Worker } else {
2111*cc02d7e2SAndroid Build Coastguard Worker vars["ns"] = "";
2112*cc02d7e2SAndroid Build Coastguard Worker vars["prefix"] = "";
2113*cc02d7e2SAndroid Build Coastguard Worker }
2114*cc02d7e2SAndroid Build Coastguard Worker
2115*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < file->service_count(); ++i) {
2116*cc02d7e2SAndroid Build Coastguard Worker PrintSourceService(printer.get(), file->service(i).get(), &vars);
2117*cc02d7e2SAndroid Build Coastguard Worker printer->Print("\n");
2118*cc02d7e2SAndroid Build Coastguard Worker }
2119*cc02d7e2SAndroid Build Coastguard Worker }
2120*cc02d7e2SAndroid Build Coastguard Worker return output;
2121*cc02d7e2SAndroid Build Coastguard Worker }
2122*cc02d7e2SAndroid Build Coastguard Worker
GetSourceEpilogue(grpc_generator::File * file,const Parameters &)2123*cc02d7e2SAndroid Build Coastguard Worker std::string GetSourceEpilogue(grpc_generator::File* file,
2124*cc02d7e2SAndroid Build Coastguard Worker const Parameters& /*params*/) {
2125*cc02d7e2SAndroid Build Coastguard Worker std::string temp;
2126*cc02d7e2SAndroid Build Coastguard Worker
2127*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
2128*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
2129*cc02d7e2SAndroid Build Coastguard Worker
2130*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.begin(); part != parts.end(); part++) {
2131*cc02d7e2SAndroid Build Coastguard Worker temp.append("} // namespace ");
2132*cc02d7e2SAndroid Build Coastguard Worker temp.append(*part);
2133*cc02d7e2SAndroid Build Coastguard Worker temp.append("\n");
2134*cc02d7e2SAndroid Build Coastguard Worker }
2135*cc02d7e2SAndroid Build Coastguard Worker temp.append("\n");
2136*cc02d7e2SAndroid Build Coastguard Worker }
2137*cc02d7e2SAndroid Build Coastguard Worker
2138*cc02d7e2SAndroid Build Coastguard Worker return temp;
2139*cc02d7e2SAndroid Build Coastguard Worker }
2140*cc02d7e2SAndroid Build Coastguard Worker
2141*cc02d7e2SAndroid Build Coastguard Worker // TODO(mmukhi): Make sure we need parameters or not.
GetMockPrologue(grpc_generator::File * file,const Parameters & params)2142*cc02d7e2SAndroid Build Coastguard Worker std::string GetMockPrologue(grpc_generator::File* file,
2143*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
2144*cc02d7e2SAndroid Build Coastguard Worker std::string output;
2145*cc02d7e2SAndroid Build Coastguard Worker {
2146*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
2147*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
2148*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
2149*cc02d7e2SAndroid Build Coastguard Worker
2150*cc02d7e2SAndroid Build Coastguard Worker vars["filename"] = file->filename();
2151*cc02d7e2SAndroid Build Coastguard Worker vars["filename_identifier"] = FilenameIdentifier(file->filename());
2152*cc02d7e2SAndroid Build Coastguard Worker vars["filename_base"] = file->filename_without_ext();
2153*cc02d7e2SAndroid Build Coastguard Worker vars["message_header_ext"] = params.message_header_extension.empty()
2154*cc02d7e2SAndroid Build Coastguard Worker ? kCppGeneratorMessageHeaderExt
2155*cc02d7e2SAndroid Build Coastguard Worker : params.message_header_extension;
2156*cc02d7e2SAndroid Build Coastguard Worker vars["service_header_ext"] = kCppGeneratorServiceHeaderExt;
2157*cc02d7e2SAndroid Build Coastguard Worker
2158*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// Generated by the gRPC C++ plugin.\n");
2159*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars,
2160*cc02d7e2SAndroid Build Coastguard Worker "// If you make any local change, they will be lost.\n");
2161*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "// source: $filename$\n\n");
2162*cc02d7e2SAndroid Build Coastguard Worker
2163*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#ifndef GRPC_MOCK_$filename_identifier$__INCLUDED\n");
2164*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#define GRPC_MOCK_$filename_identifier$__INCLUDED\n");
2165*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
2166*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n");
2167*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n");
2168*cc02d7e2SAndroid Build Coastguard Worker if (params.include_import_headers) {
2169*cc02d7e2SAndroid Build Coastguard Worker const std::vector<std::string> import_names = file->GetImportNames();
2170*cc02d7e2SAndroid Build Coastguard Worker for (const auto& import_name : import_names) {
2171*cc02d7e2SAndroid Build Coastguard Worker const std::string include_name = ImportInludeFromProtoName(import_name);
2172*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, include_name.c_str());
2173*cc02d7e2SAndroid Build Coastguard Worker }
2174*cc02d7e2SAndroid Build Coastguard Worker printer->PrintRaw("\n");
2175*cc02d7e2SAndroid Build Coastguard Worker }
2176*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, file->additional_headers().c_str());
2177*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
2178*cc02d7e2SAndroid Build Coastguard Worker }
2179*cc02d7e2SAndroid Build Coastguard Worker return output;
2180*cc02d7e2SAndroid Build Coastguard Worker }
2181*cc02d7e2SAndroid Build Coastguard Worker
2182*cc02d7e2SAndroid Build Coastguard Worker // TODO(mmukhi): Add client-stream and completion-queue headers.
GetMockIncludes(grpc_generator::File * file,const Parameters & params)2183*cc02d7e2SAndroid Build Coastguard Worker std::string GetMockIncludes(grpc_generator::File* file,
2184*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
2185*cc02d7e2SAndroid Build Coastguard Worker std::string output;
2186*cc02d7e2SAndroid Build Coastguard Worker {
2187*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
2188*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
2189*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
2190*cc02d7e2SAndroid Build Coastguard Worker
2191*cc02d7e2SAndroid Build Coastguard Worker static const char* headers_strs[] = {
2192*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/async_stream.h",
2193*cc02d7e2SAndroid Build Coastguard Worker "grpcpp/support/sync_stream.h",
2194*cc02d7e2SAndroid Build Coastguard Worker };
2195*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> headers(headers_strs, array_end(headers_strs));
2196*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), headers, params.use_system_headers,
2197*cc02d7e2SAndroid Build Coastguard Worker params.grpc_search_path);
2198*cc02d7e2SAndroid Build Coastguard Worker
2199*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> gmock_header;
2200*cc02d7e2SAndroid Build Coastguard Worker if (params.gmock_search_path.empty()) {
2201*cc02d7e2SAndroid Build Coastguard Worker gmock_header.push_back("gmock/gmock.h");
2202*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), gmock_header, params.use_system_headers,
2203*cc02d7e2SAndroid Build Coastguard Worker params.grpc_search_path);
2204*cc02d7e2SAndroid Build Coastguard Worker } else {
2205*cc02d7e2SAndroid Build Coastguard Worker gmock_header.push_back("gmock.h");
2206*cc02d7e2SAndroid Build Coastguard Worker // We use local includes when a gmock_search_path is given
2207*cc02d7e2SAndroid Build Coastguard Worker PrintIncludes(printer.get(), gmock_header, false,
2208*cc02d7e2SAndroid Build Coastguard Worker params.gmock_search_path);
2209*cc02d7e2SAndroid Build Coastguard Worker }
2210*cc02d7e2SAndroid Build Coastguard Worker
2211*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
2212*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
2213*cc02d7e2SAndroid Build Coastguard Worker
2214*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.begin(); part != parts.end(); part++) {
2215*cc02d7e2SAndroid Build Coastguard Worker vars["part"] = *part;
2216*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "namespace $part$ {\n");
2217*cc02d7e2SAndroid Build Coastguard Worker }
2218*cc02d7e2SAndroid Build Coastguard Worker }
2219*cc02d7e2SAndroid Build Coastguard Worker
2220*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
2221*cc02d7e2SAndroid Build Coastguard Worker }
2222*cc02d7e2SAndroid Build Coastguard Worker return output;
2223*cc02d7e2SAndroid Build Coastguard Worker }
2224*cc02d7e2SAndroid Build Coastguard Worker
PrintMockClientMethods(grpc_generator::Printer * printer,const grpc_generator::Method * method,std::map<std::string,std::string> * vars)2225*cc02d7e2SAndroid Build Coastguard Worker void PrintMockClientMethods(grpc_generator::Printer* printer,
2226*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Method* method,
2227*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
2228*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Method"] = method->name();
2229*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Request"] = method->input_type_name();
2230*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Response"] = method->output_type_name();
2231*cc02d7e2SAndroid Build Coastguard Worker
2232*cc02d7e2SAndroid Build Coastguard Worker struct {
2233*cc02d7e2SAndroid Build Coastguard Worker std::string prefix;
2234*cc02d7e2SAndroid Build Coastguard Worker std::string method_params; // extra arguments to method
2235*cc02d7e2SAndroid Build Coastguard Worker int extra_method_param_count;
2236*cc02d7e2SAndroid Build Coastguard Worker } async_prefixes[] = {{"Async", ", void* tag", 1}, {"PrepareAsync", "", 0}};
2237*cc02d7e2SAndroid Build Coastguard Worker
2238*cc02d7e2SAndroid Build Coastguard Worker if (method->NoStreaming()) {
2239*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2240*cc02d7e2SAndroid Build Coastguard Worker *vars,
2241*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD3($Method$, ::grpc::Status(::grpc::ClientContext* context, "
2242*cc02d7e2SAndroid Build Coastguard Worker "const $Request$& request, $Response$* response));\n");
2243*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
2244*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
2245*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2246*cc02d7e2SAndroid Build Coastguard Worker *vars,
2247*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD3($AsyncPrefix$$Method$Raw, "
2248*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncResponseReaderInterface< $Response$>*"
2249*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, const $Request$& request, "
2250*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq));\n");
2251*cc02d7e2SAndroid Build Coastguard Worker }
2252*cc02d7e2SAndroid Build Coastguard Worker } else if (ClientOnlyStreaming(method)) {
2253*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2254*cc02d7e2SAndroid Build Coastguard Worker *vars,
2255*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD2($Method$Raw, "
2256*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientWriterInterface< $Request$>*"
2257*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, $Response$* response));\n");
2258*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
2259*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
2260*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
2261*cc02d7e2SAndroid Build Coastguard Worker (*vars)["MockArgs"] =
2262*cc02d7e2SAndroid Build Coastguard Worker std::to_string(3 + async_prefix.extra_method_param_count);
2263*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
2264*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, "
2265*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncWriterInterface< $Request$>*"
2266*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, $Response$* response, "
2267*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$));\n");
2268*cc02d7e2SAndroid Build Coastguard Worker }
2269*cc02d7e2SAndroid Build Coastguard Worker } else if (ServerOnlyStreaming(method)) {
2270*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2271*cc02d7e2SAndroid Build Coastguard Worker *vars,
2272*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD2($Method$Raw, "
2273*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderInterface< $Response$>*"
2274*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, const $Request$& request));\n");
2275*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
2276*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
2277*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
2278*cc02d7e2SAndroid Build Coastguard Worker (*vars)["MockArgs"] =
2279*cc02d7e2SAndroid Build Coastguard Worker std::to_string(3 + async_prefix.extra_method_param_count);
2280*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2281*cc02d7e2SAndroid Build Coastguard Worker *vars,
2282*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, "
2283*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderInterface< $Response$>*"
2284*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, const $Request$& request, "
2285*cc02d7e2SAndroid Build Coastguard Worker "::grpc::CompletionQueue* cq$AsyncMethodParams$));\n");
2286*cc02d7e2SAndroid Build Coastguard Worker }
2287*cc02d7e2SAndroid Build Coastguard Worker } else if (method->BidiStreaming()) {
2288*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2289*cc02d7e2SAndroid Build Coastguard Worker *vars,
2290*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD1($Method$Raw, "
2291*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientReaderWriterInterface< $Request$, $Response$>*"
2292*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context));\n");
2293*cc02d7e2SAndroid Build Coastguard Worker for (auto async_prefix : async_prefixes) {
2294*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncPrefix"] = async_prefix.prefix;
2295*cc02d7e2SAndroid Build Coastguard Worker (*vars)["AsyncMethodParams"] = async_prefix.method_params;
2296*cc02d7e2SAndroid Build Coastguard Worker (*vars)["MockArgs"] =
2297*cc02d7e2SAndroid Build Coastguard Worker std::to_string(2 + async_prefix.extra_method_param_count);
2298*cc02d7e2SAndroid Build Coastguard Worker printer->Print(
2299*cc02d7e2SAndroid Build Coastguard Worker *vars,
2300*cc02d7e2SAndroid Build Coastguard Worker "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, "
2301*cc02d7e2SAndroid Build Coastguard Worker "::grpc::ClientAsyncReaderWriterInterface<$Request$, "
2302*cc02d7e2SAndroid Build Coastguard Worker "$Response$>*"
2303*cc02d7e2SAndroid Build Coastguard Worker "(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq"
2304*cc02d7e2SAndroid Build Coastguard Worker "$AsyncMethodParams$));\n");
2305*cc02d7e2SAndroid Build Coastguard Worker }
2306*cc02d7e2SAndroid Build Coastguard Worker }
2307*cc02d7e2SAndroid Build Coastguard Worker }
2308*cc02d7e2SAndroid Build Coastguard Worker
PrintMockService(grpc_generator::Printer * printer,const grpc_generator::Service * service,std::map<std::string,std::string> * vars)2309*cc02d7e2SAndroid Build Coastguard Worker void PrintMockService(grpc_generator::Printer* printer,
2310*cc02d7e2SAndroid Build Coastguard Worker const grpc_generator::Service* service,
2311*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string>* vars) {
2312*cc02d7e2SAndroid Build Coastguard Worker (*vars)["Service"] = service->name();
2313*cc02d7e2SAndroid Build Coastguard Worker
2314*cc02d7e2SAndroid Build Coastguard Worker printer->Print(*vars,
2315*cc02d7e2SAndroid Build Coastguard Worker "class Mock$Service$Stub : public $Service$::StubInterface {\n"
2316*cc02d7e2SAndroid Build Coastguard Worker " public:\n");
2317*cc02d7e2SAndroid Build Coastguard Worker printer->Indent();
2318*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); ++i) {
2319*cc02d7e2SAndroid Build Coastguard Worker PrintMockClientMethods(printer, service->method(i).get(), vars);
2320*cc02d7e2SAndroid Build Coastguard Worker }
2321*cc02d7e2SAndroid Build Coastguard Worker printer->Outdent();
2322*cc02d7e2SAndroid Build Coastguard Worker printer->Print("};\n");
2323*cc02d7e2SAndroid Build Coastguard Worker }
2324*cc02d7e2SAndroid Build Coastguard Worker
GetMockServices(grpc_generator::File * file,const Parameters & params)2325*cc02d7e2SAndroid Build Coastguard Worker std::string GetMockServices(grpc_generator::File* file,
2326*cc02d7e2SAndroid Build Coastguard Worker const Parameters& params) {
2327*cc02d7e2SAndroid Build Coastguard Worker std::string output;
2328*cc02d7e2SAndroid Build Coastguard Worker {
2329*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
2330*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
2331*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
2332*cc02d7e2SAndroid Build Coastguard Worker // Package string is empty or ends with a dot. It is used to fully qualify
2333*cc02d7e2SAndroid Build Coastguard Worker // method names.
2334*cc02d7e2SAndroid Build Coastguard Worker vars["Package"] = file->package();
2335*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
2336*cc02d7e2SAndroid Build Coastguard Worker vars["Package"].append(".");
2337*cc02d7e2SAndroid Build Coastguard Worker }
2338*cc02d7e2SAndroid Build Coastguard Worker
2339*cc02d7e2SAndroid Build Coastguard Worker if (!params.services_namespace.empty()) {
2340*cc02d7e2SAndroid Build Coastguard Worker vars["services_namespace"] = params.services_namespace;
2341*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\nnamespace $services_namespace$ {\n\n");
2342*cc02d7e2SAndroid Build Coastguard Worker }
2343*cc02d7e2SAndroid Build Coastguard Worker
2344*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < file->service_count(); i++) {
2345*cc02d7e2SAndroid Build Coastguard Worker PrintMockService(printer.get(), file->service(i).get(), &vars);
2346*cc02d7e2SAndroid Build Coastguard Worker printer->Print("\n");
2347*cc02d7e2SAndroid Build Coastguard Worker }
2348*cc02d7e2SAndroid Build Coastguard Worker
2349*cc02d7e2SAndroid Build Coastguard Worker if (!params.services_namespace.empty()) {
2350*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "} // namespace $services_namespace$\n\n");
2351*cc02d7e2SAndroid Build Coastguard Worker }
2352*cc02d7e2SAndroid Build Coastguard Worker }
2353*cc02d7e2SAndroid Build Coastguard Worker return output;
2354*cc02d7e2SAndroid Build Coastguard Worker }
2355*cc02d7e2SAndroid Build Coastguard Worker
GetMockEpilogue(grpc_generator::File * file,const Parameters &)2356*cc02d7e2SAndroid Build Coastguard Worker std::string GetMockEpilogue(grpc_generator::File* file,
2357*cc02d7e2SAndroid Build Coastguard Worker const Parameters& /*params*/) {
2358*cc02d7e2SAndroid Build Coastguard Worker std::string output;
2359*cc02d7e2SAndroid Build Coastguard Worker {
2360*cc02d7e2SAndroid Build Coastguard Worker // Scope the output stream so it closes and finalizes output to the string.
2361*cc02d7e2SAndroid Build Coastguard Worker auto printer = file->CreatePrinter(&output);
2362*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> vars;
2363*cc02d7e2SAndroid Build Coastguard Worker vars["filename_identifier"] = FilenameIdentifier(file->filename());
2364*cc02d7e2SAndroid Build Coastguard Worker
2365*cc02d7e2SAndroid Build Coastguard Worker if (!file->package().empty()) {
2366*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> parts = file->package_parts();
2367*cc02d7e2SAndroid Build Coastguard Worker for (auto part = parts.rbegin(); part != parts.rend(); part++) {
2368*cc02d7e2SAndroid Build Coastguard Worker vars["part"] = *part;
2369*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "} // namespace $part$\n");
2370*cc02d7e2SAndroid Build Coastguard Worker }
2371*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
2372*cc02d7e2SAndroid Build Coastguard Worker }
2373*cc02d7e2SAndroid Build Coastguard Worker
2374*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars, "\n");
2375*cc02d7e2SAndroid Build Coastguard Worker printer->Print(vars,
2376*cc02d7e2SAndroid Build Coastguard Worker "#endif // GRPC_MOCK_$filename_identifier$__INCLUDED\n");
2377*cc02d7e2SAndroid Build Coastguard Worker }
2378*cc02d7e2SAndroid Build Coastguard Worker return output;
2379*cc02d7e2SAndroid Build Coastguard Worker }
2380*cc02d7e2SAndroid Build Coastguard Worker
2381*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc_cpp_generator
2382