1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville"""DEPRECATED: Declares the RPC service interfaces. 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis module declares the abstract interfaces underlying proto2 RPC 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleservices. These are intended to be independent of any particular RPC 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimplementation, so that proto2 services can be used on top of a variety 36d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleof implementations. Starting with version 2.3.0, RPC implementations should 37d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillenot try to build on these, but should instead provide code generator plugins 38d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillewhich generate code specific to the particular RPC implementation. This way 39d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillethe generated code can be more appropriate for the implementation in use 40d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleand can avoid unnecessary layers of indirection. 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'petar@google.com (Petar Petrov)' 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RpcException(Exception): 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Exception raised on failed blocking RPC method call.""" 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pass 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Service(object): 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Abstract base interface for protocol-buffer-based RPC services. 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Services themselves are abstract classes (implemented either by servers or as 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville stubs), but they subclass this base interface. The methods of this 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville interface can be used to call the methods of the service without knowing 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville its exact type at compile time (analogous to the Message interface). 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def GetDescriptor(): 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Retrieves this service's descriptor.""" 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def CallMethod(self, method_descriptor, rpc_controller, 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville request, done): 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Calls a method of the service specified by method_descriptor. 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville If "done" is None then the call is blocking and the response 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message will be returned directly. Otherwise the call is asynchronous 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville and "done" will later be called with the response value. 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville In the blocking case, RpcException will be raised on error. 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Preconditions: 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * method_descriptor.service == GetDescriptor 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * request is of the exact same classes as returned by 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetRequestClass(method). 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * After the call has started, the request must not be modified. 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * "rpc_controller" is of the correct type for the RPC implementation being 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville used by this Service. For stubs, the "correct type" depends on the 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RpcChannel which the stub is using. 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Postconditions: 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * "done" will be called when the method is complete. This may be 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville before CallMethod() returns or it may be at some point in the future. 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * If the RPC failed, the response value passed to "done" will be None. 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Further details about the failure can be found by querying the 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RpcController. 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def GetRequestClass(self, method_descriptor): 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Returns the class of the request message for the specified method. 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CallMethod() requires that the request is of a particular subclass of 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message. GetRequestClass() gets the default instance of this required 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville type. 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Example: 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville method = service.GetDescriptor().FindMethodByName("Foo") 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville request = stub.GetRequestClass(method)() 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville request.ParseFromString(input) 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service.CallMethod(method, request, callback) 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def GetResponseClass(self, method_descriptor): 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Returns the class of the response message for the specified method. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville This method isn't really needed, as the RpcChannel's CallMethod constructs 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville the response protocol message. It's provided anyway in case it is useful 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for the caller to know the response type in advance. 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RpcController(object): 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """An RpcController mediates a single method call. 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville The primary purpose of the controller is to provide a way to manipulate 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville settings specific to the RPC implementation and to find out about RPC-level 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors. The methods provided by the RpcController interface are intended 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville to be a "least common denominator" set of features which we expect all 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville implementations to support. Specific implementations may provide more 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville advanced features (e.g. deadline propagation). 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Client-side methods below 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def Reset(self): 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Resets the RpcController to its initial state. 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville After the RpcController has been reset, it may be reused in 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a new call. Must not be called while an RPC is in progress. 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def Failed(self): 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Returns true if the call failed. 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville After a call has finished, returns true if the call failed. The possible 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reasons for failure depend on the RPC implementation. Failed() must not 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville be called before a call has finished. If Failed() returns true, the 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville contents of the response message are undefined. 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def ErrorText(self): 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """If Failed is true, returns a human-readable description of the error.""" 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def StartCancel(self): 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Initiate cancellation. 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Advises the RPC system that the caller desires that the RPC call be 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville canceled. The RPC system may cancel it immediately, may wait awhile and 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville then cancel it, or may not even cancel the call at all. If the call is 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville canceled, the "done" callback will still be called and the RpcController 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville will indicate that the call failed at that time. 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Server-side methods below 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def SetFailed(self, reason): 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Sets a failure reason. 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Causes Failed() to return true on the client side. "reason" will be 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville incorporated into the message returned by ErrorText(). If you find 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville you need to return machine-readable information about failures, you 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should incorporate it into your response protocol buffer and should 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville NOT call SetFailed(). 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def IsCanceled(self): 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Checks if the client cancelled the RPC. 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville If true, indicates that the client canceled the RPC, so the server may 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville as well give up on replying to it. The server should still call the 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final "done" callback. 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def NotifyOnCancel(self, callback): 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Sets a callback to invoke on cancel. 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Asks that the given callback be called when the RPC is canceled. The 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville callback will always be called exactly once. If the RPC completes without 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville being canceled, the callback will be called after completion. If the RPC 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville has already been canceled when NotifyOnCancel() is called, the callback 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville will be called immediately. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville NotifyOnCancel() must be called no more than once per request. 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RpcChannel(object): 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Abstract interface for an RPC channel. 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville An RpcChannel represents a communication line to a service which can be used 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville to call that service's methods. The service may be running on another 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville machine. Normally, you should not use an RpcChannel directly, but instead 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville construct a stub {@link Service} wrapping it. Example: 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Example: 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234") 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RpcController controller = rpcImpl.Controller() 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MyService service = MyService_Stub(channel) 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service.MyMethod(controller, request, callback) 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def CallMethod(self, method_descriptor, rpc_controller, 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville request, response_class, done): 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Calls the method identified by the descriptor. 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Call the given method of the remote service. The signature of this 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville procedure looks the same as Service.CallMethod(), but the requirements 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville are less strict in one important way: the request object doesn't have to 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville be of any specific class as long as its descriptor is method.input_type. 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise NotImplementedError 227