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