1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker *
3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2016 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 <map>
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard Worker #include <google/protobuf/compiler/php/php_generator.h>
22*cc02d7e2SAndroid Build Coastguard Worker
23*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/config.h"
24*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/generator_helpers.h"
25*cc02d7e2SAndroid Build Coastguard Worker #include "src/compiler/php_generator_helpers.h"
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker using google::protobuf::compiler::php::GeneratedClassName;
28*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::Descriptor;
29*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::FileDescriptor;
30*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::MethodDescriptor;
31*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::ServiceDescriptor;
32*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::io::Printer;
33*cc02d7e2SAndroid Build Coastguard Worker using grpc::protobuf::io::StringOutputStream;
34*cc02d7e2SAndroid Build Coastguard Worker using std::map;
35*cc02d7e2SAndroid Build Coastguard Worker
36*cc02d7e2SAndroid Build Coastguard Worker namespace grpc_php_generator {
37*cc02d7e2SAndroid Build Coastguard Worker namespace {
38*cc02d7e2SAndroid Build Coastguard Worker
ConvertToPhpNamespace(const std::string & name)39*cc02d7e2SAndroid Build Coastguard Worker std::string ConvertToPhpNamespace(const std::string& name) {
40*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> tokens = grpc_generator::tokenize(name, ".");
41*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream oss;
42*cc02d7e2SAndroid Build Coastguard Worker for (unsigned int i = 0; i < tokens.size(); i++) {
43*cc02d7e2SAndroid Build Coastguard Worker oss << (i == 0 ? "" : "\\")
44*cc02d7e2SAndroid Build Coastguard Worker << grpc_generator::CapitalizeFirstLetter(tokens[i]);
45*cc02d7e2SAndroid Build Coastguard Worker }
46*cc02d7e2SAndroid Build Coastguard Worker return oss.str();
47*cc02d7e2SAndroid Build Coastguard Worker }
48*cc02d7e2SAndroid Build Coastguard Worker
PackageName(const FileDescriptor * file)49*cc02d7e2SAndroid Build Coastguard Worker std::string PackageName(const FileDescriptor* file) {
50*cc02d7e2SAndroid Build Coastguard Worker if (file->options().has_php_namespace()) {
51*cc02d7e2SAndroid Build Coastguard Worker return file->options().php_namespace();
52*cc02d7e2SAndroid Build Coastguard Worker } else {
53*cc02d7e2SAndroid Build Coastguard Worker return ConvertToPhpNamespace(file->package());
54*cc02d7e2SAndroid Build Coastguard Worker }
55*cc02d7e2SAndroid Build Coastguard Worker }
56*cc02d7e2SAndroid Build Coastguard Worker
MessageIdentifierName(const std::string & name,const FileDescriptor * file)57*cc02d7e2SAndroid Build Coastguard Worker std::string MessageIdentifierName(const std::string& name,
58*cc02d7e2SAndroid Build Coastguard Worker const FileDescriptor* file) {
59*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> tokens = grpc_generator::tokenize(name, ".");
60*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream oss;
61*cc02d7e2SAndroid Build Coastguard Worker if (PackageName(file) != "") {
62*cc02d7e2SAndroid Build Coastguard Worker oss << PackageName(file) << "\\";
63*cc02d7e2SAndroid Build Coastguard Worker }
64*cc02d7e2SAndroid Build Coastguard Worker oss << grpc_generator::CapitalizeFirstLetter(tokens[tokens.size() - 1]);
65*cc02d7e2SAndroid Build Coastguard Worker return oss.str();
66*cc02d7e2SAndroid Build Coastguard Worker }
67*cc02d7e2SAndroid Build Coastguard Worker
PrintMethod(const MethodDescriptor * method,Printer * out)68*cc02d7e2SAndroid Build Coastguard Worker void PrintMethod(const MethodDescriptor* method, Printer* out) {
69*cc02d7e2SAndroid Build Coastguard Worker const Descriptor* input_type = method->input_type();
70*cc02d7e2SAndroid Build Coastguard Worker const Descriptor* output_type = method->output_type();
71*cc02d7e2SAndroid Build Coastguard Worker map<std::string, std::string> vars;
72*cc02d7e2SAndroid Build Coastguard Worker vars["service_name"] = method->service()->full_name();
73*cc02d7e2SAndroid Build Coastguard Worker vars["name"] = method->name();
74*cc02d7e2SAndroid Build Coastguard Worker vars["input_type_id"] =
75*cc02d7e2SAndroid Build Coastguard Worker MessageIdentifierName(GeneratedClassName(input_type), input_type->file());
76*cc02d7e2SAndroid Build Coastguard Worker vars["output_type_id"] = MessageIdentifierName(
77*cc02d7e2SAndroid Build Coastguard Worker GeneratedClassName(output_type), output_type->file());
78*cc02d7e2SAndroid Build Coastguard Worker
79*cc02d7e2SAndroid Build Coastguard Worker out->Print("/**\n");
80*cc02d7e2SAndroid Build Coastguard Worker if (method->options().deprecated()) {
81*cc02d7e2SAndroid Build Coastguard Worker out->Print(" * @deprecated\n");
82*cc02d7e2SAndroid Build Coastguard Worker }
83*cc02d7e2SAndroid Build Coastguard Worker out->Print(GetPHPComments(method, " *").c_str());
84*cc02d7e2SAndroid Build Coastguard Worker if (method->client_streaming()) {
85*cc02d7e2SAndroid Build Coastguard Worker if (method->server_streaming()) {
86*cc02d7e2SAndroid Build Coastguard Worker vars["return_type_id"] = "\\Grpc\\BidiStreamingCall";
87*cc02d7e2SAndroid Build Coastguard Worker } else {
88*cc02d7e2SAndroid Build Coastguard Worker vars["return_type_id"] = "\\Grpc\\ClientStreamingCall";
89*cc02d7e2SAndroid Build Coastguard Worker }
90*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars,
91*cc02d7e2SAndroid Build Coastguard Worker " * @param array $$metadata metadata\n"
92*cc02d7e2SAndroid Build Coastguard Worker " * @param array $$options call options\n"
93*cc02d7e2SAndroid Build Coastguard Worker " * @return $return_type_id$\n */\n"
94*cc02d7e2SAndroid Build Coastguard Worker "public function $name$($$metadata = [], "
95*cc02d7e2SAndroid Build Coastguard Worker "$$options = []) {\n");
96*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
97*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
98*cc02d7e2SAndroid Build Coastguard Worker if (method->server_streaming()) {
99*cc02d7e2SAndroid Build Coastguard Worker out->Print("return $$this->_bidiRequest(");
100*cc02d7e2SAndroid Build Coastguard Worker } else {
101*cc02d7e2SAndroid Build Coastguard Worker out->Print("return $$this->_clientStreamRequest(");
102*cc02d7e2SAndroid Build Coastguard Worker }
103*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars,
104*cc02d7e2SAndroid Build Coastguard Worker "'/$service_name$/$name$',\n"
105*cc02d7e2SAndroid Build Coastguard Worker "['\\$output_type_id$','decode'],\n"
106*cc02d7e2SAndroid Build Coastguard Worker "$$metadata, $$options);\n");
107*cc02d7e2SAndroid Build Coastguard Worker } else {
108*cc02d7e2SAndroid Build Coastguard Worker if (method->server_streaming()) {
109*cc02d7e2SAndroid Build Coastguard Worker vars["return_type_id"] = "\\Grpc\\ServerStreamingCall";
110*cc02d7e2SAndroid Build Coastguard Worker } else {
111*cc02d7e2SAndroid Build Coastguard Worker vars["return_type_id"] = "\\Grpc\\UnaryCall";
112*cc02d7e2SAndroid Build Coastguard Worker }
113*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars,
114*cc02d7e2SAndroid Build Coastguard Worker " * @param \\$input_type_id$ $$argument input argument\n"
115*cc02d7e2SAndroid Build Coastguard Worker " * @param array $$metadata metadata\n"
116*cc02d7e2SAndroid Build Coastguard Worker " * @param array $$options call options\n"
117*cc02d7e2SAndroid Build Coastguard Worker " * @return $return_type_id$\n */\n"
118*cc02d7e2SAndroid Build Coastguard Worker "public function $name$(\\$input_type_id$ $$argument,\n"
119*cc02d7e2SAndroid Build Coastguard Worker " $$metadata = [], $$options = []) {\n");
120*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
121*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
122*cc02d7e2SAndroid Build Coastguard Worker if (method->server_streaming()) {
123*cc02d7e2SAndroid Build Coastguard Worker out->Print("return $$this->_serverStreamRequest(");
124*cc02d7e2SAndroid Build Coastguard Worker } else {
125*cc02d7e2SAndroid Build Coastguard Worker out->Print("return $$this->_simpleRequest(");
126*cc02d7e2SAndroid Build Coastguard Worker }
127*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars,
128*cc02d7e2SAndroid Build Coastguard Worker "'/$service_name$/$name$',\n"
129*cc02d7e2SAndroid Build Coastguard Worker "$$argument,\n"
130*cc02d7e2SAndroid Build Coastguard Worker "['\\$output_type_id$', 'decode'],\n"
131*cc02d7e2SAndroid Build Coastguard Worker "$$metadata, $$options);\n");
132*cc02d7e2SAndroid Build Coastguard Worker }
133*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
134*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
135*cc02d7e2SAndroid Build Coastguard Worker out->Print("}\n\n");
136*cc02d7e2SAndroid Build Coastguard Worker }
137*cc02d7e2SAndroid Build Coastguard Worker
PrintServerMethod(const MethodDescriptor * method,Printer * out)138*cc02d7e2SAndroid Build Coastguard Worker void PrintServerMethod(const MethodDescriptor* method, Printer* out) {
139*cc02d7e2SAndroid Build Coastguard Worker map<std::string, std::string> vars;
140*cc02d7e2SAndroid Build Coastguard Worker const Descriptor* input_type = method->input_type();
141*cc02d7e2SAndroid Build Coastguard Worker const Descriptor* output_type = method->output_type();
142*cc02d7e2SAndroid Build Coastguard Worker vars["service_name"] = method->service()->full_name();
143*cc02d7e2SAndroid Build Coastguard Worker vars["method_name"] = method->name();
144*cc02d7e2SAndroid Build Coastguard Worker vars["input_type_id"] =
145*cc02d7e2SAndroid Build Coastguard Worker MessageIdentifierName(GeneratedClassName(input_type), input_type->file());
146*cc02d7e2SAndroid Build Coastguard Worker vars["output_type_id"] = MessageIdentifierName(
147*cc02d7e2SAndroid Build Coastguard Worker GeneratedClassName(output_type), output_type->file());
148*cc02d7e2SAndroid Build Coastguard Worker
149*cc02d7e2SAndroid Build Coastguard Worker out->Print("/**\n");
150*cc02d7e2SAndroid Build Coastguard Worker if (method->options().deprecated()) {
151*cc02d7e2SAndroid Build Coastguard Worker out->Print(" * @deprecated\n");
152*cc02d7e2SAndroid Build Coastguard Worker }
153*cc02d7e2SAndroid Build Coastguard Worker out->Print(GetPHPComments(method, " *").c_str());
154*cc02d7e2SAndroid Build Coastguard Worker
155*cc02d7e2SAndroid Build Coastguard Worker const char* method_template;
156*cc02d7e2SAndroid Build Coastguard Worker if (method->client_streaming() && method->server_streaming()) {
157*cc02d7e2SAndroid Build Coastguard Worker method_template =
158*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerCallReader $$reader read client request data "
159*cc02d7e2SAndroid Build Coastguard Worker "of \\$input_type_id$\n"
160*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerCallWriter $$writer write response data of "
161*cc02d7e2SAndroid Build Coastguard Worker "\\$output_type_id$\n"
162*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerContext $$context server request context\n"
163*cc02d7e2SAndroid Build Coastguard Worker " * @return void\n"
164*cc02d7e2SAndroid Build Coastguard Worker " */\n"
165*cc02d7e2SAndroid Build Coastguard Worker "public function $method_name$(\n"
166*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerCallReader $$reader,\n"
167*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerCallWriter $$writer,\n"
168*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerContext $$context\n"
169*cc02d7e2SAndroid Build Coastguard Worker "): void {\n"
170*cc02d7e2SAndroid Build Coastguard Worker " $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
171*cc02d7e2SAndroid Build Coastguard Worker " $$writer->finish();\n"
172*cc02d7e2SAndroid Build Coastguard Worker "}\n\n";
173*cc02d7e2SAndroid Build Coastguard Worker } else if (method->client_streaming()) {
174*cc02d7e2SAndroid Build Coastguard Worker method_template =
175*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerCallReader $$reader read client request data "
176*cc02d7e2SAndroid Build Coastguard Worker "of \\$input_type_id$\n"
177*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerContext $$context server request context\n"
178*cc02d7e2SAndroid Build Coastguard Worker " * @return \\$output_type_id$ for response data, null if if error "
179*cc02d7e2SAndroid Build Coastguard Worker "occured\n"
180*cc02d7e2SAndroid Build Coastguard Worker " * initial metadata (if any) and status (if not ok) should be set "
181*cc02d7e2SAndroid Build Coastguard Worker "to $$context\n"
182*cc02d7e2SAndroid Build Coastguard Worker " */\n"
183*cc02d7e2SAndroid Build Coastguard Worker "public function $method_name$(\n"
184*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerCallReader $$reader,\n"
185*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerContext $$context\n"
186*cc02d7e2SAndroid Build Coastguard Worker "): ?\\$output_type_id$ {\n"
187*cc02d7e2SAndroid Build Coastguard Worker " $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
188*cc02d7e2SAndroid Build Coastguard Worker " return null;\n"
189*cc02d7e2SAndroid Build Coastguard Worker "}\n\n";
190*cc02d7e2SAndroid Build Coastguard Worker } else if (method->server_streaming()) {
191*cc02d7e2SAndroid Build Coastguard Worker method_template =
192*cc02d7e2SAndroid Build Coastguard Worker " * @param \\$input_type_id$ $$request client request\n"
193*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerCallWriter $$writer write response data of "
194*cc02d7e2SAndroid Build Coastguard Worker "\\$output_type_id$\n"
195*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerContext $$context server request context\n"
196*cc02d7e2SAndroid Build Coastguard Worker " * @return void\n"
197*cc02d7e2SAndroid Build Coastguard Worker " */\n"
198*cc02d7e2SAndroid Build Coastguard Worker "public function $method_name$(\n"
199*cc02d7e2SAndroid Build Coastguard Worker " \\$input_type_id$ $$request,\n"
200*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerCallWriter $$writer,\n"
201*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerContext $$context\n"
202*cc02d7e2SAndroid Build Coastguard Worker "): void {\n"
203*cc02d7e2SAndroid Build Coastguard Worker " $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
204*cc02d7e2SAndroid Build Coastguard Worker " $$writer->finish();\n"
205*cc02d7e2SAndroid Build Coastguard Worker "}\n\n";
206*cc02d7e2SAndroid Build Coastguard Worker } else {
207*cc02d7e2SAndroid Build Coastguard Worker method_template =
208*cc02d7e2SAndroid Build Coastguard Worker " * @param \\$input_type_id$ $$request client request\n"
209*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\ServerContext $$context server request context\n"
210*cc02d7e2SAndroid Build Coastguard Worker " * @return \\$output_type_id$ for response data, null if if error "
211*cc02d7e2SAndroid Build Coastguard Worker "occured\n"
212*cc02d7e2SAndroid Build Coastguard Worker " * initial metadata (if any) and status (if not ok) should be set "
213*cc02d7e2SAndroid Build Coastguard Worker "to $$context\n"
214*cc02d7e2SAndroid Build Coastguard Worker " */\n"
215*cc02d7e2SAndroid Build Coastguard Worker "public function $method_name$(\n"
216*cc02d7e2SAndroid Build Coastguard Worker " \\$input_type_id$ $$request,\n"
217*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\ServerContext $$context\n"
218*cc02d7e2SAndroid Build Coastguard Worker "): ?\\$output_type_id$ {\n"
219*cc02d7e2SAndroid Build Coastguard Worker " $$context->setStatus(\\Grpc\\Status::unimplemented());\n"
220*cc02d7e2SAndroid Build Coastguard Worker " return null;\n"
221*cc02d7e2SAndroid Build Coastguard Worker "}\n\n";
222*cc02d7e2SAndroid Build Coastguard Worker }
223*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars, method_template);
224*cc02d7e2SAndroid Build Coastguard Worker }
225*cc02d7e2SAndroid Build Coastguard Worker
PrintServerMethodDescriptors(const ServiceDescriptor * service,Printer * out)226*cc02d7e2SAndroid Build Coastguard Worker void PrintServerMethodDescriptors(const ServiceDescriptor* service,
227*cc02d7e2SAndroid Build Coastguard Worker Printer* out) {
228*cc02d7e2SAndroid Build Coastguard Worker map<std::string, std::string> vars;
229*cc02d7e2SAndroid Build Coastguard Worker vars["service_name"] = service->full_name();
230*cc02d7e2SAndroid Build Coastguard Worker
231*cc02d7e2SAndroid Build Coastguard Worker out->Print("/**\n");
232*cc02d7e2SAndroid Build Coastguard Worker if (service->options().deprecated()) {
233*cc02d7e2SAndroid Build Coastguard Worker out->Print(" * @deprecated\n");
234*cc02d7e2SAndroid Build Coastguard Worker }
235*cc02d7e2SAndroid Build Coastguard Worker out->Print(
236*cc02d7e2SAndroid Build Coastguard Worker " * Get the method descriptors of the service for server registration\n"
237*cc02d7e2SAndroid Build Coastguard Worker " *\n"
238*cc02d7e2SAndroid Build Coastguard Worker " * @return array of \\Grpc\\MethodDescriptor for the service methods\n"
239*cc02d7e2SAndroid Build Coastguard Worker " */\n"
240*cc02d7e2SAndroid Build Coastguard Worker "public final function getMethodDescriptors(): array\n{\n");
241*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
242*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
243*cc02d7e2SAndroid Build Coastguard Worker out->Print("return [\n");
244*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
245*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
246*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); i++) {
247*cc02d7e2SAndroid Build Coastguard Worker auto method = service->method(i);
248*cc02d7e2SAndroid Build Coastguard Worker auto input_type = method->input_type();
249*cc02d7e2SAndroid Build Coastguard Worker vars["method_name"] = method->name();
250*cc02d7e2SAndroid Build Coastguard Worker vars["input_type_id"] = MessageIdentifierName(
251*cc02d7e2SAndroid Build Coastguard Worker GeneratedClassName(input_type), input_type->file());
252*cc02d7e2SAndroid Build Coastguard Worker if (method->client_streaming() && method->server_streaming()) {
253*cc02d7e2SAndroid Build Coastguard Worker vars["call_type"] = "BIDI_STREAMING_CALL";
254*cc02d7e2SAndroid Build Coastguard Worker } else if (method->client_streaming()) {
255*cc02d7e2SAndroid Build Coastguard Worker vars["call_type"] = "CLIENT_STREAMING_CALL";
256*cc02d7e2SAndroid Build Coastguard Worker } else if (method->server_streaming()) {
257*cc02d7e2SAndroid Build Coastguard Worker vars["call_type"] = "SERVER_STREAMING_CALL";
258*cc02d7e2SAndroid Build Coastguard Worker } else {
259*cc02d7e2SAndroid Build Coastguard Worker vars["call_type"] = "UNARY_CALL";
260*cc02d7e2SAndroid Build Coastguard Worker }
261*cc02d7e2SAndroid Build Coastguard Worker out->Print(
262*cc02d7e2SAndroid Build Coastguard Worker vars,
263*cc02d7e2SAndroid Build Coastguard Worker "'/$service_name$/$method_name$' => new \\Grpc\\MethodDescriptor(\n"
264*cc02d7e2SAndroid Build Coastguard Worker " $$this,\n"
265*cc02d7e2SAndroid Build Coastguard Worker " '$method_name$',\n"
266*cc02d7e2SAndroid Build Coastguard Worker " '\\$input_type_id$',\n"
267*cc02d7e2SAndroid Build Coastguard Worker " \\Grpc\\MethodDescriptor::$call_type$\n"
268*cc02d7e2SAndroid Build Coastguard Worker "),\n");
269*cc02d7e2SAndroid Build Coastguard Worker }
270*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
271*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
272*cc02d7e2SAndroid Build Coastguard Worker out->Print("];\n");
273*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
274*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
275*cc02d7e2SAndroid Build Coastguard Worker out->Print("}\n\n");
276*cc02d7e2SAndroid Build Coastguard Worker }
277*cc02d7e2SAndroid Build Coastguard Worker
278*cc02d7e2SAndroid Build Coastguard Worker // Prints out the service descriptor object
PrintService(const ServiceDescriptor * service,const std::string & class_suffix,bool is_server,Printer * out)279*cc02d7e2SAndroid Build Coastguard Worker void PrintService(const ServiceDescriptor* service,
280*cc02d7e2SAndroid Build Coastguard Worker const std::string& class_suffix, bool is_server,
281*cc02d7e2SAndroid Build Coastguard Worker Printer* out) {
282*cc02d7e2SAndroid Build Coastguard Worker map<std::string, std::string> vars;
283*cc02d7e2SAndroid Build Coastguard Worker out->Print("/**\n");
284*cc02d7e2SAndroid Build Coastguard Worker if (service->options().deprecated()) {
285*cc02d7e2SAndroid Build Coastguard Worker out->Print(" * @deprecated\n");
286*cc02d7e2SAndroid Build Coastguard Worker }
287*cc02d7e2SAndroid Build Coastguard Worker out->Print(GetPHPComments(service, " *").c_str());
288*cc02d7e2SAndroid Build Coastguard Worker out->Print(" */\n");
289*cc02d7e2SAndroid Build Coastguard Worker vars["name"] = GetPHPServiceClassname(service, class_suffix, is_server);
290*cc02d7e2SAndroid Build Coastguard Worker vars["extends"] = is_server ? "" : "extends \\Grpc\\BaseStub ";
291*cc02d7e2SAndroid Build Coastguard Worker out->Print(vars, "class $name$ $extends${\n\n");
292*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
293*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
294*cc02d7e2SAndroid Build Coastguard Worker if (!is_server) {
295*cc02d7e2SAndroid Build Coastguard Worker out->Print(
296*cc02d7e2SAndroid Build Coastguard Worker "/**\n * @param string $$hostname hostname\n"
297*cc02d7e2SAndroid Build Coastguard Worker " * @param array $$opts channel options\n"
298*cc02d7e2SAndroid Build Coastguard Worker " * @param \\Grpc\\Channel $$channel (optional) re-use channel object\n"
299*cc02d7e2SAndroid Build Coastguard Worker " */\n"
300*cc02d7e2SAndroid Build Coastguard Worker "public function __construct($$hostname, $$opts, "
301*cc02d7e2SAndroid Build Coastguard Worker "$$channel = null) {\n");
302*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
303*cc02d7e2SAndroid Build Coastguard Worker out->Indent();
304*cc02d7e2SAndroid Build Coastguard Worker out->Print("parent::__construct($$hostname, $$opts, $$channel);\n");
305*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
306*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
307*cc02d7e2SAndroid Build Coastguard Worker out->Print("}\n\n");
308*cc02d7e2SAndroid Build Coastguard Worker }
309*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < service->method_count(); i++) {
310*cc02d7e2SAndroid Build Coastguard Worker if (is_server) {
311*cc02d7e2SAndroid Build Coastguard Worker PrintServerMethod(service->method(i), out);
312*cc02d7e2SAndroid Build Coastguard Worker } else {
313*cc02d7e2SAndroid Build Coastguard Worker PrintMethod(service->method(i), out);
314*cc02d7e2SAndroid Build Coastguard Worker }
315*cc02d7e2SAndroid Build Coastguard Worker }
316*cc02d7e2SAndroid Build Coastguard Worker if (is_server) {
317*cc02d7e2SAndroid Build Coastguard Worker PrintServerMethodDescriptors(service, out);
318*cc02d7e2SAndroid Build Coastguard Worker }
319*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
320*cc02d7e2SAndroid Build Coastguard Worker out->Outdent();
321*cc02d7e2SAndroid Build Coastguard Worker out->Print("}\n");
322*cc02d7e2SAndroid Build Coastguard Worker }
323*cc02d7e2SAndroid Build Coastguard Worker } // namespace
324*cc02d7e2SAndroid Build Coastguard Worker
GenerateFile(const FileDescriptor * file,const ServiceDescriptor * service,const std::string & class_suffix,bool is_server)325*cc02d7e2SAndroid Build Coastguard Worker std::string GenerateFile(const FileDescriptor* file,
326*cc02d7e2SAndroid Build Coastguard Worker const ServiceDescriptor* service,
327*cc02d7e2SAndroid Build Coastguard Worker const std::string& class_suffix, bool is_server) {
328*cc02d7e2SAndroid Build Coastguard Worker std::string output;
329*cc02d7e2SAndroid Build Coastguard Worker {
330*cc02d7e2SAndroid Build Coastguard Worker StringOutputStream output_stream(&output);
331*cc02d7e2SAndroid Build Coastguard Worker Printer out(&output_stream, '$');
332*cc02d7e2SAndroid Build Coastguard Worker
333*cc02d7e2SAndroid Build Coastguard Worker out.Print("<?php\n");
334*cc02d7e2SAndroid Build Coastguard Worker out.Print("// GENERATED CODE -- DO NOT EDIT!\n\n");
335*cc02d7e2SAndroid Build Coastguard Worker
336*cc02d7e2SAndroid Build Coastguard Worker std::string leading_comments = GetPHPComments(file, "//");
337*cc02d7e2SAndroid Build Coastguard Worker if (!leading_comments.empty()) {
338*cc02d7e2SAndroid Build Coastguard Worker out.Print("// Original file comments:\n");
339*cc02d7e2SAndroid Build Coastguard Worker out.PrintRaw(leading_comments.c_str());
340*cc02d7e2SAndroid Build Coastguard Worker }
341*cc02d7e2SAndroid Build Coastguard Worker
342*cc02d7e2SAndroid Build Coastguard Worker map<std::string, std::string> vars;
343*cc02d7e2SAndroid Build Coastguard Worker std::string php_namespace = PackageName(file);
344*cc02d7e2SAndroid Build Coastguard Worker vars["package"] = php_namespace;
345*cc02d7e2SAndroid Build Coastguard Worker out.Print(vars, "namespace $package$;\n\n");
346*cc02d7e2SAndroid Build Coastguard Worker
347*cc02d7e2SAndroid Build Coastguard Worker PrintService(service, class_suffix, is_server, &out);
348*cc02d7e2SAndroid Build Coastguard Worker }
349*cc02d7e2SAndroid Build Coastguard Worker return output;
350*cc02d7e2SAndroid Build Coastguard Worker }
351*cc02d7e2SAndroid Build Coastguard Worker
352*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc_php_generator
353