| Home | Trees | Indices | Help | 
 | 
|---|
|  | 
  1  # Software License Agreement (BSD License) 
  2  # 
  3  # Copyright (c) 2008, Willow Garage, Inc. 
  4  # All rights reserved. 
  5  # 
  6  # Redistribution and use in source and binary forms, with or without 
  7  # modification, are permitted provided that the following conditions 
  8  # are met: 
  9  # 
 10  #  * Redistributions of source code must retain the above copyright 
 11  #    notice, this list of conditions and the following disclaimer. 
 12  #  * Redistributions in binary form must reproduce the above 
 13  #    copyright notice, this list of conditions and the following 
 14  #    disclaimer in the documentation and/or other materials provided 
 15  #    with the distribution. 
 16  #  * Neither the name of Willow Garage, Inc. nor the names of its 
 17  #    contributors may be used to endorse or promote products derived 
 18  #    from this software without specific prior written permission. 
 19  # 
 20  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 21  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 22  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 23  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 24  # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 25  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 26  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 27  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 28  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 29  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 30  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 31  # POSSIBILITY OF SUCH DAMAGE. 
 32  # 
 33  # Revision $Id$ 
 34  """ 
 35  Base classes for rospy transports 
 36   
 37  These are the base underlying transport implementations, i.e. 
 38  TCP/IP connections, etc... 
 39   
 40  For topic implementations, see L{topics} 
 41  """ 
 42   
 43  import threading 
 44   
 45  # we need ids for the transports so we can send the IDs instead of 
 46  # full connection details 
 47  _transport_id = 0 
 48  _id_lock = threading.Lock() 
 50      global _transport_id 
 51      try: 
 52          _id_lock.acquire() 
 53          _transport_id += 1 
 54          return _transport_id 
 55      finally: 
 56          _id_lock.release() 
 57   
 58  INBOUND = 'i' 
 59  OUTBOUND = 'o' 
 60  BIDIRECTIONAL = 'b' 
 61   
 62  ## Base API of Transport implementations 
 64      transport_type = 'UNKNOWN' 
 65       
 66      ## @param self 
 67      ## @param direction str: INBOUND | OUTBOUND | BIDIRECTIONAL 
 68      ## @param name str 
 70          self.name       = name 
 71          self.direction  = direction 
 72          self.done       = False 
 73          self.cleanup_cb = None 
 74          self.endpoint_id = '' 
 75   
 76          #STATS 
 77          self.id           = _nextId()  
 78          self.stat_bytes   = 0 
 79          # Number of messages that have passed through this transport 
 80          self.stat_num_msg = 0          
 81       
 82          # Endpoint Details (IP, Port) 
 83          self.local_endpoint = (0, 0) 
 84          self.remote_endpoint = (0, 0) 
 85   
 91       
 92      ## callback function to invoke when this connection is 
 93      ## closed. Function will be passed this transport as an argument. 
 94      ## @param self 
 95      ## @param cleanup_callback fn(Transport): callback for when connection is closed 
 98   
 99      ## terminate i/o. Leaf subclasses should override and call this implementation 
100      ## @param self 
105   
106      ## Write raw data to transport 
107      ## @throws TransportInitialiationError could not be initialized 
108      ## @throws TransportTerminated no longer open for publishing 
111   
112      ## Implements the getTransportInfo() from roscpp 
113      ## Similar to getTransportInfo() in 'libros/transport/transport_tcp.cpp' 
116   
117  ## Shell class to hold stats about transport that is being killed off. 
118  ## This allows the information to stick around but the original Tranport to be gc'd 
120   
121      ## @param self 
122      ## @param transport str: transport name     
124          super(DeadTransport, self).__init__( 
125              transport.direction, transport.name) 
126          self.transport_type = transport.transport_type #class property 
127          self.id           = transport.id 
128          self.stat_bytes   = transport.stat_bytes 
129          self.stat_num_msg = transport.stat_num_msg 
130          self.done         = True 
131          self.endpoint_id  = transport.endpoint_id 
132          self.local_endpoint = transport.local_endpoint 
133          self.remote_endpoint = transport.remote_endpoint 
134   
135      ## @param self 
137          return "Closed %s connection on port %s to [%s:%s]" % (self.transport_type, self.local_endpoint[1], self.remote_endpoint[0], self.remote_endpoint[1]) 
138   
139  ## ProtocolHandler interface: implements topic communication for a 
140  ## particular protocol(s).  In order to understand the methods of this 
141  ## API, it is important to understand how topic communication is 
142  ## established: 
143  ## 
144  ## When a subscriber is notified of a new topic publisher, it contacts 
145  ## the publisher to establish a connection. The subscriber gathers a 
146  ## list of supported protocols (e.g. [['TCPROS'], ['MEMMAP']]) from 
147  ## its protocol handlers (L{get_supported}) and then passes these to 
148  ## the publisher.  Each of these protocols is actual a list, 
149  ## e.g. ['MPI', LaneWidth, BusSpeed], since a protocol may have 
150  ## associated parameters. This is considered the start of the 
151  ## 'negotiation phase'. 
152  ##         
153  ##    subscriber -> pub.requestTopic(protocols) 
154  ## 
155  ## The Publisher selects a protocol from the lists and tells the 
156  ## appropriate protocol handler to prepare the outbound connection: 
157  ##                 
158  ##    pub.requestTopic() -> pub.protocol_handler.init_publisher(selected_protocol) 
159  ## 
160  ## The protocol handler will return a new set of parameters 
161  ## representing connection parameters, e.g. [TCPROS, address, 
162  ## port]. These new parameters are passed back to the subscriber, 
163  ## which tells its protocol handler to establish the connection. 
164  ##                 
165  ##    subscriber -> subscriber.protocol_handler.create_transport(protocolParams)                
167   
168      ## shutdown any resources associated with handling this protocol 
169      ## @param self 
172   
173      ## Create a new Transport using the specified \a protocol_params 
174      ## returned from the Publisher \a pub_uri. 
175      ## @param self 
176      ## @param protocol_params [[str, val*]]: parameter list from Publisher. Actual 
177      ##   contents are protocol-specified. 
178      ## @param pub_uri str: publisher API URI 
179      ## @param topic str: topic name 
180      ## @return int, str, int: code, message, debug 
183   
184      ## @param self 
185      ## @param protocol str: protocol name. Must match string identifier used in 
186      ##    negotiation. 
187      ## @return bool: True if this handler supports the specified protocol""" 
190       
191      ## This method is called on subscribers and returns the protocol list 
192      ## @param self 
193      ## @return [[str, val*]]: list of supported protocol params. Each set of protocol params is a 
194      ##     list where the first element is the string identifier for the protocol. 
197           
198      ## Prepare a transport based on one of the supported protocols 
199      ## declared by a Subscriber. Subscribers supply a list of 
200      ## supported protocols, of which one is selected by the Publisher 
201      ## and passed to init_publisher(). init_publisher is responsible 
202      ## for initializing the publisher based on the selection. 
203      ## @param self 
204      ## @param topic str: name of topic 
205      ## @param protocol: selected protocol parameters from the Subscriber. 
206      ## @return (int, str, list): (code, statusMessage, params). params 
207      ## is protocol specific. These params will be sent to the Subscriber 
208      ## so that it can create_transport(). 
210          raise Exception("interface impl") 
211   
| Home | Trees | Indices | Help | 
 | 
|---|
| Generated by Epydoc 3.0.1 on Mon Nov 2 03:52:39 2020 | http://epydoc.sourceforge.net |