| 
					
				 | 
			
			
				@@ -760,6 +760,32 @@ PythonGrpcGenerator::PythonGrpcGenerator(const GeneratorConfiguration& config) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 PythonGrpcGenerator::~PythonGrpcGenerator() {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static bool GenerateGrpc(GeneratorContext* context, PrivateGenerator& generator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         grpc::string file_name, bool generate_in_pb2_grpc) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool success; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::unique_ptr<ZeroCopyOutputStream> output; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::unique_ptr<CodedOutputStream> coded_output; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc::string grpc_code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (generate_in_pb2_grpc) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    output.reset(context->Open(file_name)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    generator.generate_in_pb2_grpc = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    output.reset(context->OpenForInsert(file_name, "module_scope")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    generator.generate_in_pb2_grpc = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  coded_output.reset(new CodedOutputStream(output.get())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tie(success, grpc_code) = generator.GetGrpcServices(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    coded_output->WriteRaw(grpc_code.data(), grpc_code.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool PythonGrpcGenerator::Generate(const FileDescriptor* file, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    const grpc::string& parameter, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    GeneratorContext* context, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -780,28 +806,15 @@ bool PythonGrpcGenerator::Generate(const FileDescriptor* file, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   PrivateGenerator generator(config_, file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::unique_ptr<ZeroCopyOutputStream> pb2_output( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      context->OpenForAppend(pb2_file_name)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::unique_ptr<ZeroCopyOutputStream> grpc_output( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      context->Open(pb2_grpc_file_name)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CodedOutputStream pb2_coded_out(pb2_output.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CodedOutputStream grpc_coded_out(grpc_output.get()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  bool success = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc::string pb2_code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc::string grpc_code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  generator.generate_in_pb2_grpc = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tie(success, pb2_code) = generator.GetGrpcServices(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    generator.generate_in_pb2_grpc = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tie(success, grpc_code) = generator.GetGrpcServices(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      pb2_coded_out.WriteRaw(pb2_code.data(), pb2_code.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_coded_out.WriteRaw(grpc_code.data(), grpc_code.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (parameter == "grpc_2_0") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return GenerateGrpc(context, generator, pb2_grpc_file_name, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else if (parameter == "") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return GenerateGrpc(context, generator, pb2_grpc_file_name, true) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           GenerateGrpc(context, generator, pb2_file_name, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *error = "Invalid parameter '" + parameter + "'."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // namespace grpc_python_generator 
			 |