| 
					
				 | 
			
			
				@@ -609,6 +609,39 @@ void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor* service) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   out->Print("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void GenerateBindServiceWithBinderMethod(Printer* out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         const ServiceDescriptor* service) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "/// <summary>Register service method implementations with a service " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "binder. Useful when customizing the service binding logic.</summary>\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "/// <param name=\"serviceBinder\">Service methods will be bound by " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "calling <c>AddMethod</c> on this object." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "</param>\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "/// <param name=\"serviceImpl\">An object implementing the server-side" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      " handling logic.</param>\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "public static void BindService(grpc::ServiceBinderBase serviceBinder, " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "$implclass$ " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "serviceImpl)\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "implclass", GetServerClassName(service)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print("{\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Indent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < service->method_count(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const MethodDescriptor* method = service->method(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    out->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        "serviceBinder.AddMethod($methodfield$, serviceImpl.$methodname$);\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        "methodfield", GetMethodFieldName(method), "methodname", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        method->name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Outdent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print("}\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out->Print("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void GenerateService(Printer* out, const ServiceDescriptor* service, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      bool generate_client, bool generate_server, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      bool internal_access) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -637,6 +670,7 @@ void GenerateService(Printer* out, const ServiceDescriptor* service, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (generate_server) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     GenerateBindServiceMethod(out, service); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GenerateBindServiceWithBinderMethod(out, service); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   out->Outdent(); 
			 |