1*cc02d7e2SAndroid Build Coastguard Worker // 2*cc02d7e2SAndroid Build Coastguard Worker // 3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2016 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker // 5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker // 9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker // 11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker // 17*cc02d7e2SAndroid Build Coastguard Worker // 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_IMPL_CHANNEL_INTERFACE_H 20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_IMPL_CHANNEL_INTERFACE_H 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/impl/connectivity_state.h> 23*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/call.h> 24*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/status.h> 25*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/time.h> 26*cc02d7e2SAndroid Build Coastguard Worker 27*cc02d7e2SAndroid Build Coastguard Worker namespace grpc { 28*cc02d7e2SAndroid Build Coastguard Worker template <class R> 29*cc02d7e2SAndroid Build Coastguard Worker class ClientReader; 30*cc02d7e2SAndroid Build Coastguard Worker template <class W> 31*cc02d7e2SAndroid Build Coastguard Worker class ClientWriter; 32*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 33*cc02d7e2SAndroid Build Coastguard Worker class ClientReaderWriter; 34*cc02d7e2SAndroid Build Coastguard Worker namespace internal { 35*cc02d7e2SAndroid Build Coastguard Worker template <class InputMessage, class OutputMessage> 36*cc02d7e2SAndroid Build Coastguard Worker class CallbackUnaryCallImpl; 37*cc02d7e2SAndroid Build Coastguard Worker template <class R> 38*cc02d7e2SAndroid Build Coastguard Worker class ClientAsyncReaderFactory; 39*cc02d7e2SAndroid Build Coastguard Worker template <class W> 40*cc02d7e2SAndroid Build Coastguard Worker class ClientAsyncWriterFactory; 41*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 42*cc02d7e2SAndroid Build Coastguard Worker class ClientAsyncReaderWriterFactory; 43*cc02d7e2SAndroid Build Coastguard Worker class ClientAsyncResponseReaderHelper; 44*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 45*cc02d7e2SAndroid Build Coastguard Worker class ClientCallbackReaderWriterFactory; 46*cc02d7e2SAndroid Build Coastguard Worker template <class R> 47*cc02d7e2SAndroid Build Coastguard Worker class ClientCallbackReaderFactory; 48*cc02d7e2SAndroid Build Coastguard Worker template <class W> 49*cc02d7e2SAndroid Build Coastguard Worker class ClientCallbackWriterFactory; 50*cc02d7e2SAndroid Build Coastguard Worker class ClientCallbackUnaryFactory; 51*cc02d7e2SAndroid Build Coastguard Worker } // namespace internal 52*cc02d7e2SAndroid Build Coastguard Worker 53*cc02d7e2SAndroid Build Coastguard Worker class ChannelInterface; 54*cc02d7e2SAndroid Build Coastguard Worker class ClientContext; 55*cc02d7e2SAndroid Build Coastguard Worker class CompletionQueue; 56*cc02d7e2SAndroid Build Coastguard Worker 57*cc02d7e2SAndroid Build Coastguard Worker namespace experimental { 58*cc02d7e2SAndroid Build Coastguard Worker class DelegatingChannel; 59*cc02d7e2SAndroid Build Coastguard Worker } 60*cc02d7e2SAndroid Build Coastguard Worker 61*cc02d7e2SAndroid Build Coastguard Worker namespace internal { 62*cc02d7e2SAndroid Build Coastguard Worker class Call; 63*cc02d7e2SAndroid Build Coastguard Worker class CallOpSetInterface; 64*cc02d7e2SAndroid Build Coastguard Worker class RpcMethod; 65*cc02d7e2SAndroid Build Coastguard Worker class InterceptedChannel; 66*cc02d7e2SAndroid Build Coastguard Worker template <class InputMessage, class OutputMessage> 67*cc02d7e2SAndroid Build Coastguard Worker class BlockingUnaryCallImpl; 68*cc02d7e2SAndroid Build Coastguard Worker } // namespace internal 69*cc02d7e2SAndroid Build Coastguard Worker 70*cc02d7e2SAndroid Build Coastguard Worker /// Codegen interface for \a grpc::Channel. 71*cc02d7e2SAndroid Build Coastguard Worker class ChannelInterface { 72*cc02d7e2SAndroid Build Coastguard Worker public: ~ChannelInterface()73*cc02d7e2SAndroid Build Coastguard Worker virtual ~ChannelInterface() {} 74*cc02d7e2SAndroid Build Coastguard Worker /// Get the current channel state. If the channel is in IDLE and 75*cc02d7e2SAndroid Build Coastguard Worker /// \a try_to_connect is set to true, try to connect. 76*cc02d7e2SAndroid Build Coastguard Worker virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; 77*cc02d7e2SAndroid Build Coastguard Worker 78*cc02d7e2SAndroid Build Coastguard Worker /// Return the \a tag on \a cq when the channel state is changed or \a 79*cc02d7e2SAndroid Build Coastguard Worker /// deadline expires. \a GetState needs to called to get the current state. 80*cc02d7e2SAndroid Build Coastguard Worker template <typename T> NotifyOnStateChange(grpc_connectivity_state last_observed,T deadline,grpc::CompletionQueue * cq,void * tag)81*cc02d7e2SAndroid Build Coastguard Worker void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline, 82*cc02d7e2SAndroid Build Coastguard Worker grpc::CompletionQueue* cq, void* tag) { 83*cc02d7e2SAndroid Build Coastguard Worker TimePoint<T> deadline_tp(deadline); 84*cc02d7e2SAndroid Build Coastguard Worker NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag); 85*cc02d7e2SAndroid Build Coastguard Worker } 86*cc02d7e2SAndroid Build Coastguard Worker 87*cc02d7e2SAndroid Build Coastguard Worker /// Blocking wait for channel state change or \a deadline expiration. 88*cc02d7e2SAndroid Build Coastguard Worker /// \a GetState needs to called to get the current state. 89*cc02d7e2SAndroid Build Coastguard Worker template <typename T> WaitForStateChange(grpc_connectivity_state last_observed,T deadline)90*cc02d7e2SAndroid Build Coastguard Worker bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) { 91*cc02d7e2SAndroid Build Coastguard Worker TimePoint<T> deadline_tp(deadline); 92*cc02d7e2SAndroid Build Coastguard Worker return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); 93*cc02d7e2SAndroid Build Coastguard Worker } 94*cc02d7e2SAndroid Build Coastguard Worker 95*cc02d7e2SAndroid Build Coastguard Worker /// Wait for this channel to be connected 96*cc02d7e2SAndroid Build Coastguard Worker template <typename T> WaitForConnected(T deadline)97*cc02d7e2SAndroid Build Coastguard Worker bool WaitForConnected(T deadline) { 98*cc02d7e2SAndroid Build Coastguard Worker grpc_connectivity_state state; 99*cc02d7e2SAndroid Build Coastguard Worker while ((state = GetState(true)) != GRPC_CHANNEL_READY) { 100*cc02d7e2SAndroid Build Coastguard Worker if (!WaitForStateChange(state, deadline)) return false; 101*cc02d7e2SAndroid Build Coastguard Worker } 102*cc02d7e2SAndroid Build Coastguard Worker return true; 103*cc02d7e2SAndroid Build Coastguard Worker } 104*cc02d7e2SAndroid Build Coastguard Worker 105*cc02d7e2SAndroid Build Coastguard Worker private: 106*cc02d7e2SAndroid Build Coastguard Worker template <class R> 107*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::ClientReader; 108*cc02d7e2SAndroid Build Coastguard Worker template <class W> 109*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::ClientWriter; 110*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 111*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::ClientReaderWriter; 112*cc02d7e2SAndroid Build Coastguard Worker template <class R> 113*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientAsyncReaderFactory; 114*cc02d7e2SAndroid Build Coastguard Worker template <class W> 115*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientAsyncWriterFactory; 116*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 117*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientAsyncReaderWriterFactory; 118*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientAsyncResponseReaderHelper; 119*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R> 120*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientCallbackReaderWriterFactory; 121*cc02d7e2SAndroid Build Coastguard Worker template <class R> 122*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientCallbackReaderFactory; 123*cc02d7e2SAndroid Build Coastguard Worker template <class W> 124*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientCallbackWriterFactory; 125*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::ClientCallbackUnaryFactory; 126*cc02d7e2SAndroid Build Coastguard Worker template <class InputMessage, class OutputMessage> 127*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::BlockingUnaryCallImpl; 128*cc02d7e2SAndroid Build Coastguard Worker template <class InputMessage, class OutputMessage> 129*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::CallbackUnaryCallImpl; 130*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::RpcMethod; 131*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::experimental::DelegatingChannel; 132*cc02d7e2SAndroid Build Coastguard Worker friend class grpc::internal::InterceptedChannel; 133*cc02d7e2SAndroid Build Coastguard Worker virtual internal::Call CreateCall(const internal::RpcMethod& method, 134*cc02d7e2SAndroid Build Coastguard Worker grpc::ClientContext* context, 135*cc02d7e2SAndroid Build Coastguard Worker grpc::CompletionQueue* cq) = 0; 136*cc02d7e2SAndroid Build Coastguard Worker virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, 137*cc02d7e2SAndroid Build Coastguard Worker internal::Call* call) = 0; 138*cc02d7e2SAndroid Build Coastguard Worker virtual void* RegisterMethod(const char* method) = 0; 139*cc02d7e2SAndroid Build Coastguard Worker virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, 140*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec deadline, 141*cc02d7e2SAndroid Build Coastguard Worker grpc::CompletionQueue* cq, 142*cc02d7e2SAndroid Build Coastguard Worker void* tag) = 0; 143*cc02d7e2SAndroid Build Coastguard Worker virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, 144*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec deadline) = 0; 145*cc02d7e2SAndroid Build Coastguard Worker 146*cc02d7e2SAndroid Build Coastguard Worker // EXPERIMENTAL 147*cc02d7e2SAndroid Build Coastguard Worker // This is needed to keep codegen_test_minimal happy. InterceptedChannel needs 148*cc02d7e2SAndroid Build Coastguard Worker // to make use of this but can't directly call Channel's implementation 149*cc02d7e2SAndroid Build Coastguard Worker // because of the test. 150*cc02d7e2SAndroid Build Coastguard Worker // Returns an empty Call object (rather than being pure) since this is a new 151*cc02d7e2SAndroid Build Coastguard Worker // method and adding a new pure method to an interface would be a breaking 152*cc02d7e2SAndroid Build Coastguard Worker // change (even though this is private and non-API) CreateCallInternal(const internal::RpcMethod &,grpc::ClientContext *,grpc::CompletionQueue *,size_t)153*cc02d7e2SAndroid Build Coastguard Worker virtual internal::Call CreateCallInternal( 154*cc02d7e2SAndroid Build Coastguard Worker const internal::RpcMethod& /*method*/, grpc::ClientContext* /*context*/, 155*cc02d7e2SAndroid Build Coastguard Worker grpc::CompletionQueue* /*cq*/, size_t /*interceptor_pos*/) { 156*cc02d7e2SAndroid Build Coastguard Worker return internal::Call(); 157*cc02d7e2SAndroid Build Coastguard Worker } 158*cc02d7e2SAndroid Build Coastguard Worker 159*cc02d7e2SAndroid Build Coastguard Worker // A method to get the callbackable completion queue associated with this 160*cc02d7e2SAndroid Build Coastguard Worker // channel. If the return value is nullptr, this channel doesn't support 161*cc02d7e2SAndroid Build Coastguard Worker // callback operations. 162*cc02d7e2SAndroid Build Coastguard Worker // TODO(vjpai): Consider a better default like using a global CQ 163*cc02d7e2SAndroid Build Coastguard Worker // Returns nullptr (rather than being pure) since this is a post-1.0 method 164*cc02d7e2SAndroid Build Coastguard Worker // and adding a new pure method to an interface would be a breaking change 165*cc02d7e2SAndroid Build Coastguard Worker // (even though this is private and non-API) CallbackCQ()166*cc02d7e2SAndroid Build Coastguard Worker virtual grpc::CompletionQueue* CallbackCQ() { return nullptr; } 167*cc02d7e2SAndroid Build Coastguard Worker }; 168*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc 169*cc02d7e2SAndroid Build Coastguard Worker 170*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPCPP_IMPL_CHANNEL_INTERFACE_H 171