// ********************************************************************** // // Copyright (c) 2003-2004 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distirbution. // // ********************************************************************** #ifndef ICE_REFERENCE_H #define ICE_REFERENCE_H #include #include #include #include #include #include #include #include #include #include #include #include namespace IceInternal { class BasicStream; class Reference : public IceUtil::Shared { public: enum Mode { ModeTwoway, ModeOneway, ModeBatchOneway, ModeDatagram, ModeBatchDatagram, ModeLast = ModeBatchDatagram }; Mode getMode() const { return _mode; } const Ice::Identity& getIdentity() const { return _identity; } const std::string& getFacet() const { return _facet; } const InstancePtr& getInstance() const { return _instance; } const Ice::Context& getContext() const; ReferencePtr defaultContext() const; virtual bool getSecure() const = 0; virtual std::vector getEndpoints() const = 0; virtual bool getCollocationOptimization() const = 0; // // The change* methods (here and in derived classes) create // a new reference based on the existing one, with the // corresponding value changed. // ReferencePtr changeContext(const Ice::Context&) const; ReferencePtr changeMode(Mode) const; ReferencePtr changeIdentity(const Ice::Identity&) const; bool hasContext() const { return _hasContext; } ReferencePtr changeFacet(const std::string&) const; // // Return a reference in the default configuration. // virtual ReferencePtr changeDefault() const; virtual ReferencePtr changeSecure(bool) const = 0; virtual ReferencePtr changeRouter(const Ice::RouterPrx&) const = 0; virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const = 0; virtual ReferencePtr changeCompress(bool) const = 0; virtual ReferencePtr changeTimeout(int) const = 0; virtual ReferencePtr changeCollocationOptimization(bool) const = 0; int hash() const; // Conceptually const. // // Marshal the reference. // virtual void streamWrite(BasicStream*) const; // // Convert the reference to its string form. // virtual std::string toString() const; // // Get a suitable connection for this reference. // virtual Ice::ConnectionIPtr getConnection(bool&) const = 0; virtual bool operator==(const Reference&) const = 0; virtual bool operator!=(const Reference&) const = 0; virtual bool operator<(const Reference&) const = 0; virtual ReferencePtr clone() const = 0; protected: Reference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode); Reference(const Reference&); private: InstancePtr _instance; Mode _mode; Ice::Identity _identity; bool _hasContext; Ice::Context _context; std::string _facet; IceUtil::Mutex _hashMutex; // For lazy initialization of hash value. mutable Ice::Int _hashValue; mutable bool _hashInitialized; }; class FixedReference : public Reference { public: FixedReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, const std::vector&); const std::vector& getFixedConnections() const; virtual bool getSecure() const; virtual std::vector getEndpoints() const; virtual bool getCollocationOptimization() const; virtual ReferencePtr changeSecure(bool) const; virtual ReferencePtr changeRouter(const Ice::RouterPrx&) const; virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const; virtual ReferencePtr changeCollocationOptimization(bool) const; virtual ReferencePtr changeCompress(bool) const; virtual ReferencePtr changeTimeout(int) const; virtual void streamWrite(BasicStream*) const; virtual Ice::ConnectionIPtr getConnection(bool&) const; virtual bool operator==(const Reference&) const; virtual bool operator!=(const Reference&) const; virtual bool operator<(const Reference&) const; virtual ReferencePtr clone() const; protected: FixedReference(const FixedReference&); private: std::vector _fixedConnections; }; class RoutableReference : public Reference { public: const RouterInfoPtr& getRouterInfo() const { return _routerInfo; } std::vector getRoutedEndpoints() const; virtual bool getSecure() const; virtual bool getCollocationOptimization() const; virtual ReferencePtr changeDefault() const; virtual ReferencePtr changeSecure(bool) const; virtual ReferencePtr changeRouter(const Ice::RouterPrx&) const; virtual ReferencePtr changeCollocationOptimization(bool) const; virtual Ice::ConnectionIPtr getConnection(bool&) const = 0; virtual bool operator==(const Reference&) const = 0; virtual bool operator!=(const Reference&) const = 0; virtual bool operator<(const Reference&) const = 0; virtual ReferencePtr clone() const = 0; protected: RoutableReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool, const RouterInfoPtr&, bool); RoutableReference(const RoutableReference&); private: bool _secure; RouterInfoPtr _routerInfo; // Null if no router is used. bool _collocationOptimization; }; class DirectReference : public RoutableReference { public: DirectReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool, const std::vector&, const RouterInfoPtr&, bool); virtual std::vector getEndpoints() const; DirectReferencePtr changeEndpoints(const std::vector&) const; virtual ReferencePtr changeDefault() const; virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const; virtual ReferencePtr changeCompress(bool) const; virtual ReferencePtr changeTimeout(int) const; virtual void streamWrite(BasicStream*) const; virtual std::string toString() const; virtual Ice::ConnectionIPtr getConnection(bool&) const; virtual bool operator==(const Reference&) const; virtual bool operator!=(const Reference&) const; virtual bool operator<(const Reference&) const; virtual ReferencePtr clone() const; protected: DirectReference(const DirectReference&); private: std::vector _endpoints; }; class IndirectReference : public RoutableReference { public: IndirectReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool, const std::string&, const RouterInfoPtr&, const LocatorInfoPtr&, bool); const std::string& getAdapterId() const { return _adapterId; } const LocatorInfoPtr& getLocatorInfo() const { return _locatorInfo; } virtual std::vector getEndpoints() const; virtual ReferencePtr changeDefault() const; virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const; virtual ReferencePtr changeCompress(bool) const; virtual ReferencePtr changeTimeout(int) const; virtual void streamWrite(BasicStream*) const; virtual std::string toString() const; virtual Ice::ConnectionIPtr getConnection(bool&) const; virtual bool operator==(const Reference&) const; virtual bool operator!=(const Reference&) const; virtual bool operator<(const Reference&) const; virtual ReferencePtr clone() const; protected: IndirectReference(const IndirectReference&); private: std::string _adapterId; LocatorInfoPtr _locatorInfo; }; std::vector filterEndpoints(const std::vector&, Reference::Mode, bool); std::vector filterConnections(const std::vector&, Reference::Mode, bool); } #endif