//****************************************************************************** // RCF - Remote Call Framework // Copyright (c) 2005 - 2007. All rights reserved. // Consult your license for conditions of use. // Developed by Jarl Lindrud. // Contact: jlindrud@hotmail.com . //****************************************************************************** #ifndef INCLUDE_RCF_CLIENTSTUB_HPP #define INCLUDE_RCF_CLIENTSTUB_HPP #include #include #include #include #include #include #include #include #include #include #include #ifdef RCF_USE_SF_SERIALIZATION #include #include #endif #ifdef RCF_USE_BOOST_SERIALIZATION #include #endif namespace RCF { class ConnectionResetGuard; namespace IDL { class DoRequest; } // namespace IDL /// Indicates whether a client should use one-way or two-way semantics for remote calls. enum RemoteCallSemantics { Oneway, Twoway }; void setDefaultConnectTimeoutMs(unsigned int connectTimeoutMs); unsigned int getDefaultConnectTimeoutMs(); void setDefaultRemoteCallTimeoutMs(unsigned int remoteCallTimeoutMs); unsigned int getDefaultRemoteCallTimeoutMs(); class ClientStub; typedef boost::shared_ptr ClientStubPtr; class ClientProgress; typedef boost::shared_ptr ClientProgressPtr; class I_ClientTransport; typedef std::auto_ptr ClientTransportAutoPtr; /// Manages the client side of communications between server and client. class ClientStub { public: /// Constructor. ClientStub(const std::string &interfaceName); /// Constructor. /// \param objectName Name of the binding on the server which the client wants to invoke. ClientStub(const std::string &interfaceName, const std::string &objectName); /// Copy constructor. NB - transfers ownership of the client transport! ClientStub(const ClientStub &rhs); /// Assignment operator. NB - transfers ownership of the client transport! ClientStub &operator=(const ClientStub &rhs); /// Sets the server endpoint to which the client will call. /// \param endpoint Server endpoint. void setEndpoint(const I_Endpoint &endpoint); /// Sets the server endpoint to which the client will call. /// \param endpoint Server endpoint. void setEndpoint(EndpointPtr endpointPtr); /// Returns a copy of the currently set server endpoint. /// \return Shared pointer to an endpoint. EndpointPtr getEndpoint() const; // TODO: a lot of these get/set functions should not be publicly available /// Gets the token, if any, that the client is using. /// \return Returns a copy of the token the client is using. If none, then it returns a default constructed Token. Token getTargetToken() const; /// Sets the token that the client should use in its calls to the server. /// \param token Token that the client should pass in subsequent calls to the server. void setTargetToken(Token token); /// Gets the binding name on the server that the client is accessing. /// \return Name of the server binding. std::string getTargetName() const; /// Sets the binding name on the server that the client should access on subsequent calls. /// \param serverBindingName Name of the server binding. //void setServerBindingName(const std::string &serverBindingName); void setTargetName(const std::string &targetName); /// Gets the calling semantics that the client is currently using (oneway or twoway). /// \return Current calling semantics. RemoteCallSemantics getDefaultCallingSemantics() const; /// Sets the calling semantics that the client should use in subsequent calls (oneway or twoway). /// \param defaultCallingSemantics Calling semantics to be used. void setDefaultCallingSemantics(RemoteCallSemantics defaultCallingSemantics); /// Sets the serialization protocol. /// \param protocol Integer identifier of the desired serialization protocol. void setSerializationProtocol(int protocol); /// Gets the serialization protocol. /// \return Integer identifier of the currently set serialization protocol. int getSerializationProtocol() const; /// Enables pointer tracking for outbound SF serialization. /// \parameter Whether to enable or not. void enableSfSerializationPointerTracking(bool enable); /// Sets the client transport, releasing the currently configured transport. /// \param transport Client transport. void setTransport(ClientTransportAutoPtr transport); /// Returns a reference to currently configured client transport. /// \return Current client transport. I_ClientTransport& getTransport(); /// Releases and returns the currently configured client transport. /// \return Auto pointer to client transport. ClientTransportAutoPtr releaseTransport(); // /// Deletes the current client transport, and replaces it with a cloned copy. /// Calls reset() on the client transport. //void resetTransport(); /// Attempts to connect the underlying client transport. void createTransport(); // TODO: private? void verifyTransport(); void connect(); void disconnect(); /// Attempts to determine if the underlying client transport is connected. /// \return True if the transport is connected, false otherwise. bool isConnected(); /// Sets the payload filtering sequence. /// \param filters Vector of filters, enumerated in the order in which they should be applied to unfiltered data void setMessageFilters(const std::vector &filters); /// Sets the payload filtering sequence. /// \param filterPtr Single filter. void setMessageFilters(FilterPtr filterPtr); /// Sets the transport filtering sequence. /// \param filters Vector of filters, enumerated in the order in which they should be applied to unfiltered data //void setTransportFilters(const std::vector &filters); /// Sets the transport filtering sequence. /// \param filterPtr Single filter. //void setTransportFilters(FilterPtr filterPtr = FilterPtr()); void requestTransportFilters(const std::vector &filters); void requestTransportFilters(FilterPtr filterPtr); bool queryForTransportFilters(const std::vector &filters); bool queryForTransportFilters(FilterPtr filterPtr); void clearTransportFilters(); const std::vector &getMessageFilters(); /// Sets the remote call timeout value. By default, the timeout is set to 10 seconds. /// \param remoteCallTimeoutMs Timeout value, in milliseconds. void setRemoteCallTimeoutMs(unsigned int remoteCallTimeoutMs); /// Gets the remote call timeout value. /// \return Timeout value, in milliseconds. unsigned int getRemoteCallTimeoutMs() const; /// Sets the connect timeout value. By default, the timeout is set to xx seconds. /// \param connectTimeoutMs Timeout value, in milliseconds. void setConnectTimeoutMs(unsigned int connectTimeoutMs); /// Gets the connect timeout value. /// \return Timeout value, in milliseconds. unsigned int getConnectTimeoutMs() const; void setAutoReconnect(bool autoReconnect); bool getAutoReconnect() const; void setAutoVersioning(bool autoVersioning); bool getAutoVersioning() const; void setRcfRuntimeVersion(int version); int getRcfRuntimeVersion() const; void setClientProgressPtr(ClientProgressPtr ClientProgressPtr); ClientProgressPtr getClientProgressPtr() const; void setTries(std::size_t tries); std::size_t getTries() const; template void serialize(Archive &ar, const unsigned int) { ar & mToken & mDefaultCallingSemantics & mProtocol & mEndpointName & mObjectName & mInterfaceName & mRemoteCallTimeoutMs & mAutoReconnect & mEndpoint; } void createRemoteObject(const std::string &objectName = ""); void deleteRemoteObject(); void createRemoteSessionObject(const std::string &objectName = ""); void deleteRemoteSessionObject(); private: Token mToken; RemoteCallSemantics mDefaultCallingSemantics; int mProtocol; std::string mEndpointName; std::string mObjectName; std::string mInterfaceName; unsigned int mRemoteCallTimeoutMs; unsigned int mConnectTimeoutMs; bool mAutoReconnect; bool mConnected; std::size_t mTries; EndpointPtr mEndpoint; ClientTransportAutoPtr mTransport; //VectorFilter mTransportFilters; VectorFilter mMessageFilters; ClientProgressPtr mClientProgressPtr; bool mAutoVersioning; int mRcfRuntimeVersion; friend class IDL::DoRequest; // TODO: make these private public: MethodInvocationRequest mRequest; SerializationProtocolIn mIn; SerializationProtocolOut mOut; }; // thread specific client stub void setCurrentClientStubPtr(ClientStubPtr clientStubPtr); ClientStubPtr getCurrentClientStubPtr(); class CurrentClientStubPtrSentry { public: CurrentClientStubPtrSentry(ClientStubPtr clientStubPtr) { setCurrentClientStubPtr(clientStubPtr); } ~CurrentClientStubPtrSentry() { setCurrentClientStubPtr(ClientStubPtr()); } }; } // namespace RCF #ifdef RCF_USE_SF_SERIALIZATION namespace SF { SF_CTOR(RCF::ClientStub, RCF::ClientStub("", "")) } // namespace SF #endif #endif // ! INCLUDE_RCF_CLIENTSTUB_HPP