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
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// DEPRECATED:  This module declares the abstract interfaces underlying proto2
36d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// RPC services.  These are intented to be independent of any particular RPC
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implementation, so that proto2 services can be used on top of a variety
38d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// of implementations.  Starting with version 2.3.0, RPC implementations should
39d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// not try to build on these, but should instead provide code generator plugins
40d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// which generate code specific to the particular RPC implementation.  This way
41d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// the generated code can be more appropriate for the implementation in use
42d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// and can avoid unnecessary layers of indirection.
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// When you use the protocol compiler to compile a service definition, it
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generates two classes:  An abstract interface for the service (with
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// methods matching the service definition) and a "stub" implementation.
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A stub is just a type-safe wrapper around an RpcChannel which emulates a
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// local implementation of the service.
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For example, the service definition:
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   service MyService {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     rpc Foo(MyRequest) returns(MyResponse);
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   }
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// will generate abstract interface "MyService" and class "MyService::Stub".
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You could implement a MyService as follows:
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   class MyServiceImpl : public MyService {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    public:
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     MyServiceImpl() {}
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     ~MyServiceImpl() {}
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     // implements MyService ---------------------------------------
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     void Foo(google::protobuf::RpcController* controller,
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//              const MyRequest* request,
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//              MyResponse* response,
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//              Closure* done) {
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       // ... read request and fill in response ...
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       done->Run();
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     }
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   };
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You would then register an instance of MyServiceImpl with your RPC server
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implementation.  (How to do that depends on the implementation.)
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To call a remote MyServiceImpl, first you need an RpcChannel connected to it.
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// How to construct a channel depends, again, on your RPC implementation.
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Here we use a hypothentical "MyRpcChannel" as an example:
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   MyRpcChannel channel("rpc:hostname:1234/myservice");
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   MyRpcController controller;
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   MyServiceImpl::Stub stub(&channel);
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   FooRequest request;
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   FooRespnose response;
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   // ... fill in request ...
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   stub.Foo(&controller, request, &response, NewCallback(HandleResponse));
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// On Thread-Safety:
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Different RPC implementations may make different guarantees about what
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// threads they may run callbacks on, and what threads the application is
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// allowed to use to call the RPC system.  Portable software should be ready
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for callbacks to be called on any thread, but should not try to call the
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// RPC system from any thread except for the ones on which it received the
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// callbacks.  Realistically, though, simple software will probably want to
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// use a single-threaded RPC system while high-end software will want to
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// use multiple threads.  RPC implementations should provide multiple
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// choices.
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_SERVICE_H__
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_SERVICE_H__
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in this file.
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Service;
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RpcController;
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RpcChannel;
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in other files.
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Descriptor;            // descriptor.h
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptor;     // descriptor.h
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor;      // descriptor.h
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message;               // message.h
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Abstract base interface for protocol-buffer-based RPC services.  Services
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// themselves are abstract interfaces (implemented either by servers or as
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// stubs), but they subclass this base interface.  The methods of this
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// interface can be used to call the methods of the Service without knowing
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// its exact type at compile time (analogous to Reflection).
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Service {
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Service() {}
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~Service();
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // parameter to the constructor to tell it to delete its RpcChannel when
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // destroyed.
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum ChannelOwnership {
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    STUB_OWNS_CHANNEL,
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    STUB_DOESNT_OWN_CHANNEL
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the ServiceDescriptor describing this service and its methods.
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual const ServiceDescriptor* GetDescriptor() = 0;
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Call a method of the service specified by MethodDescriptor.  This is
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // normally implemented as a simple switch() that calls the standard
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // definitions of the service's methods.
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Preconditions:
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * method->service() == GetDescriptor()
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * request and response are of the exact same classes as the objects
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   returned by GetRequestPrototype(method) and
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   GetResponsePrototype(method).
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * After the call has started, the request must not be modified and the
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   response must not be accessed at all until "done" is called.
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * "controller" is of the correct type for the RPC implementation being
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   used by this Service.  For stubs, the "correct type" depends on the
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   RpcChannel which the stub is using.  Server-side Service
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   implementations are expected to accept whatever type of RpcController
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   the server-side RPC implementation uses.
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Postconditions:
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * "done" will be called when the method is complete.  This may be
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   before CallMethod() returns or it may be at some point in the future.
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * If the RPC succeeded, "response" contains the response returned by
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   the server.
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * If the RPC failed, "response"'s contents are undefined.  The
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   RpcController can be queried to determine if an error occurred and
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   possibly to get more information about the error.
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void CallMethod(const MethodDescriptor* method,
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          RpcController* controller,
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          const Message* request,
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          Message* response,
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          Closure* done) = 0;
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // CallMethod() requires that the request and response passed in are of a
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // particular subclass of Message.  GetRequestPrototype() and
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // GetResponsePrototype() get the default instances of these required types.
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // You can then call Message::New() on these instances to construct mutable
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // objects which you can then pass to CallMethod().
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Example:
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   const MethodDescriptor* method =
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //     service->GetDescriptor()->FindMethodByName("Foo");
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   Message* request  = stub->GetRequestPrototype (method)->New();
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   Message* response = stub->GetResponsePrototype(method)->New();
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   request->ParseFromString(input);
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   service->CallMethod(method, *request, response, callback);
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual const Message& GetRequestPrototype(
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const MethodDescriptor* method) const = 0;
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual const Message& GetResponsePrototype(
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const MethodDescriptor* method) const = 0;
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service);
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// An RpcController mediates a single method call.  The primary purpose of
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the controller is to provide a way to manipulate settings specific to the
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// RPC implementation and to find out about RPC-level errors.
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The methods provided by the RpcController interface are intended to be a
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "least common denominator" set of features which we expect all
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implementations to support.  Specific implementations may provide more
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// advanced features (e.g. deadline propagation).
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT RpcController {
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline RpcController() {}
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~RpcController();
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Client-side methods ---------------------------------------------
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These calls may be made from the client side only.  Their results
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // are undefined on the server side (may crash).
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Resets the RpcController to its initial state so that it may be reused in
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // a new call.  Must not be called while an RPC is in progress.
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void Reset() = 0;
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // After a call has finished, returns true if the call failed.  The possible
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // reasons for failure depend on the RPC implementation.  Failed() must not
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // be called before a call has finished.  If Failed() returns true, the
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // contents of the response message are undefined.
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool Failed() const = 0;
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If Failed() is true, returns a human-readable description of the error.
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual string ErrorText() const = 0;
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Advises the RPC system that the caller desires that the RPC call be
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // canceled.  The RPC system may cancel it immediately, may wait awhile and
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // then cancel it, or may not even cancel the call at all.  If the call is
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // canceled, the "done" callback will still be called and the RpcController
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // will indicate that the call failed at that time.
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void StartCancel() = 0;
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Server-side methods ---------------------------------------------
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These calls may be made from the server side only.  Their results
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // are undefined on the client side (may crash).
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Causes Failed() to return true on the client side.  "reason" will be
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // incorporated into the message returned by ErrorText().  If you find
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // you need to return machine-readable information about failures, you
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // should incorporate it into your response protocol buffer and should
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // NOT call SetFailed().
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetFailed(const string& reason) = 0;
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If true, indicates that the client canceled the RPC, so the server may
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // as well give up on replying to it.  The server should still call the
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // final "done" callback.
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual bool IsCanceled() const = 0;
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Asks that the given callback be called when the RPC is canceled.  The
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // callback will always be called exactly once.  If the RPC completes without
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // being canceled, the callback will be called after completion.  If the RPC
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // has already been canceled when NotifyOnCancel() is called, the callback
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // will be called immediately.
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // NotifyOnCancel() must be called no more than once per request.
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void NotifyOnCancel(Closure* callback) = 0;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController);
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Abstract interface for an RPC channel.  An RpcChannel represents a
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// communication line to a Service which can be used to call that Service's
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// methods.  The Service may be running on another machine.  Normally, you
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// should not call an RpcChannel directly, but instead construct a stub Service
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// wrapping it.  Example:
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234");
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   MyService* service = new MyService::Stub(channel);
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   service->MyMethod(request, &response, callback);
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT RpcChannel {
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline RpcChannel() {}
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~RpcChannel();
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Call the given method of the remote service.  The signature of this
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // procedure looks the same as Service::CallMethod(), but the requirements
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // are less strict in one important way:  the request and response objects
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // need not be of any specific class as long as their descriptors are
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // method->input_type() and method->output_type().
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void CallMethod(const MethodDescriptor* method,
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          RpcController* controller,
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          const Message* request,
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          Message* response,
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          Closure* done) = 0;
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_SERVICE_H__
292