00001 /* -*- c++ -*- */ 00002 /************************************************************************** 00003 Copyright (c) 2000-2001, Tony Garnock-Jones 00004 All rights reserved. 00005 00006 Redistribution and use in source and binary forms, with or without 00007 modification, are permitted provided that the following conditions are 00008 met: 00009 00010 * Redistributions of source code must retain the above copyright 00011 notice, this list of conditions and the following disclaimer. 00012 00013 * Redistributions in binary form must reproduce the above 00014 copyright notice, this list of conditions and the following 00015 disclaimer in the documentation and/or other materials provided 00016 with the distribution. 00017 00018 * Neither the names of the copyright holders nor the names of this 00019 software's contributors may be used to endorse or promote 00020 products derived from this software without specific prior 00021 written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00024 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00025 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00026 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 00027 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00028 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00029 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00030 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00031 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00032 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00033 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 **************************************************************************/ 00035 00036 #ifndef MPS_Transport_H 00037 #define MPS_Transport_H 00038 00039 namespace MPS { 00040 00041 /** 00042 * Represents a method of resolving names for, and connecting to 00043 * remote objects. Subclasses implement name-resolution and connection 00044 * facilities according to a particular transport protocol; examples 00045 * include InetTransport, SleeTransport, and FastmsgTransport. */ 00046 class Transport { 00047 private: 00048 typedef vector<Transport *> transportVec_t; ///< A list of Transports. 00049 static transportVec_t allTransports; ///< All registered Transports 00050 00051 private: 00052 string name; ///< Registered name of this transport ("inet", "slee", ..) 00053 00054 private: 00055 /** 00056 * Locate a Transport by name. 00057 * 00058 * @return a pointer to the named Transport. 00059 * @exception MPSException if the Transport name is not registered. */ 00060 static Transport *findTransport(string const &name); 00061 00062 public: 00063 /// Register a transport. 00064 static void registerTransport(Transport *t); 00065 00066 /** 00067 * Returns a message source/sink that can be used for communication 00068 * with the object at the address described by the 00069 * connectionSpec. Selects an appropriate Transport based on the 00070 * "transport" field of the Address. 00071 * 00072 * @param connectionSpec the address of the remote object 00073 * @return a connection handle for remote communication, or NULL if 00074 * none could be created 00075 * @exception MPSException if the transport name given is not 00076 * registered */ 00077 static ref<Connection> getConnectionTo(Address const &connectionSpec); 00078 00079 /** 00080 * Bind an object server to an interface provided by a transport. 00081 * 00082 * @param server the server to bind to the (about-to-be-created) transport-interface 00083 * 00084 * @param bindingSpec the suggested resolved name to bind to - 00085 * should be of the form "mps:transportname" or, if a greater degree 00086 * of control over the bind is desired, 00087 * "mps:transportname:param:param:..." (for instance, with the 00088 * "inet" transport, you use "mps:inet:hostname:portnumber"). 00089 * 00090 * @return the string of the newly-bound address, or empty-string if the bind failed */ 00091 static string bindServer(Server *server, string const &bindingSpec); 00092 00093 /** 00094 * Bind an object server to all available transports that currently 00095 * do not have a binding for this server. 00096 * 00097 * @param server the server to bind */ 00098 static void bindServer(Server *server); 00099 00100 /** 00101 * Unbind an object server from an interface provided by a transport. 00102 * 00103 * @param server the server to unbind to the (about-to-be-removed) transport-interface 00104 * 00105 * @param bindingSpec the suggested resolved name to unbind from - cf. bindServer() 00106 * @return the string of the newly-unbound address, or empty-string if the unbind failed */ 00107 static string unbindServer(Server *server, string const &bindingSpec); 00108 00109 /** 00110 * Unbind a previously-bound server. 00111 * @param server the server to unbind. */ 00112 static void unbindServer(Server *server); 00113 00114 protected: 00115 /** 00116 * For access by subclasses - initialises this class 00117 * 00118 * @param _name name to register the transport under 00119 */ 00120 Transport(string const &_name); 00121 00122 public: 00123 virtual ~Transport(); 00124 00125 /// Retrieves the transport's registered name. 00126 string const &getName() const; 00127 00128 protected: 00129 /** 00130 * Returns a message source/sink that can be used for communication 00131 * with the object at the address described by the 00132 * connectionSpec. The connectionSpec is the broken-down resolved 00133 * name of the remote object, and <b>must</b> match the address 00134 * format that this transport expects. 00135 * 00136 * @param connectionSpec the address of the remote object 00137 * @return a connection handle for remote communication, or NULL if 00138 * none could be created */ 00139 virtual ref<Connection> connectTo(Address const &connectionSpec) = 0; 00140 00141 /** 00142 * Attempt to register a server interface for access using this transport. 00143 * 00144 * @param server the server to register 00145 * @param spec the connection specification that the transport may 00146 * use as a hint in determining the final resolved name to use when 00147 * binding this object. 00148 * @return the canonical name of the server-bound-to-this-transport, 00149 * or "" if binding to this transport fails. */ 00150 virtual string registerServer(Server *server, Address const &spec) = 0; 00151 00152 /** 00153 * Attempt to deregister a server interface. 00154 * 00155 * @param server the server to deregister 00156 * @param spec the connection specification that the transport may 00157 * use as a hint in determining the final resolved name to use when 00158 * unbinding this object. 00159 * @return the canonical name of the server-that-was-bound-to-this-transport, 00160 * or "" if unbinding from this transport fails. */ 00161 virtual string deregisterServer(Server *server, Address const &spec) = 0; 00162 }; 00163 00164 } 00165 00166 #endif