SipMSRPApi » History » Version 46
Luci Stanescu, 04/15/2010 01:51 PM
| 1 | 1 | Adrian Georgescu | = MSRP API = |
|---|---|---|---|
| 2 | |||
| 3 | 34 | Adrian Georgescu | [[TOC(SipMSRPApi, SipDeveloperGuide, depth=3)]] |
| 4 | 1 | Adrian Georgescu | |
| 5 | 31 | Adrian Georgescu | Message Session Relay Protocol (MSRP) is a protocol for transmitting a series of related Instant Messages in the context of a session. Message sessions are treated like any other media stream when set up via a rendezvous or session creation protocol such as the Session Initiation Protocol (SIP). |
| 6 | 1 | Adrian Georgescu | |
| 7 | 25 | Adrian Georgescu | * MSRP sessions are defined in [http://tools.ietf.org/html/rfc4975 RFC 4975] |
| 8 | * MSRP relay extension used for NAT traversal of instant messaging and file transfer sessions is defined in [http://tools.ietf.org/html/rfc4976 RFC 4976] |
||
| 9 | 1 | Adrian Georgescu | |
| 10 | 32 | Adrian Georgescu | The MSRP protocol stack is implemented by [http://devel.ag-projects.com/cgi-bin/darcsweb.cgi?r=python-msrplib;a=summary msrplib] Python package. |
| 11 | 4 | Oliver Bril | |
| 12 | 33 | Adrian Georgescu | {{{msrplib}}} is based upon [http://twistedmatrix.com twisted] and [http://download.ag-projects.com/SipClient/ eventlet] and provides a set of classes for establishing and managing MSRP connections. |
| 13 | 1 | Adrian Georgescu | |
| 14 | 28 | Adrian Georgescu | The library consists of the following modules: |
| 15 | 1 | Adrian Georgescu | |
| 16 | '''msrplib.transport''':: |
||
| 17 | 27 | Adrian Georgescu | Defines {{{MSRPTransport}}} class, which provides low level control over MSRP connections. |
| 18 | 2 | Redmine Admin | |
| 19 | 1 | Adrian Georgescu | '''msrplib.connect''':: |
| 20 | Defines means to establish a connection, bind it, and provide an initialized {{{MSRPTransport}}} instance. |
||
| 21 | |||
| 22 | '''msrplib.session''':: |
||
| 23 | Defines {{{MSRPSession}}} class, which provides high level control over a MSRP connection. |
||
| 24 | |||
| 25 | '''msrplib.protocol''':: |
||
| 26 | 42 | Luci Stanescu | Provides representation and parsing of MSRP entities - chunks and MSRP URIs. |
| 27 | 1 | Adrian Georgescu | |
| 28 | 39 | Luci Stanescu | == Classes == |
| 29 | 3 | Oliver Bril | |
| 30 | 39 | Luci Stanescu | === URI === |
| 31 | 1 | Adrian Georgescu | |
| 32 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.protocol}}} module and is used to represent an MSRP URI. |
| 33 | 1 | Adrian Georgescu | |
| 34 | 39 | Luci Stanescu | ==== Methods ==== |
| 35 | 1 | Adrian Georgescu | |
| 36 | 39 | Luci Stanescu | '''!__init!__'''(''self'', '''host'''={{{None}}}, '''use_tls'''={{{False}}}, '''user'''={{{None}}}, '''port'''={{{None}}}, '''session_id'''={{{None}}}, '''parameters'''={{{None}}}, '''credentials'''={{{None}}}):: |
| 37 | Constructs a new {{{URI}}}. All the arguments specified here are also attributes on the object. For more information on these attributes, see RFC4975. |
||
| 38 | [[BR]]''host'':[[BR]] |
||
| 39 | The hostname or IP address which forms the URI. |
||
| 40 | [[BR]]''use_tls'':[[BR]] |
||
| 41 | Whether this identifies an msrps or msrp URI. |
||
| 42 | [[BR]]''user'':[[BR]] |
||
| 43 | The user part of the URI. |
||
| 44 | [[BR]]''port'':[[BR]] |
||
| 45 | The port in the URI. |
||
| 46 | [[BR]]''session_id'':[[BR]] |
||
| 47 | The session identifier part of the URI. |
||
| 48 | [[BR]]''parameters'':[[BR]] |
||
| 49 | A {{{dict}}} containing the parameters which will be appended to the URI. |
||
| 50 | [[BR]]''credentials'':[[BR]] |
||
| 51 | A {{{gnutls.interfaces.twisted.X509Credentials}}} object which will be used if this identifies a TLS URI to authenticate to the other endpoint. |
||
| 52 | 1 | Adrian Georgescu | |
| 53 | 39 | Luci Stanescu | === MSRPRelaySettings === |
| 54 | 1 | Adrian Georgescu | |
| 55 | 45 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module and is used to specify the MSRP relay which will be used when connecting via a relay (using the {{{ConnectorRelay}}} or {{{AcceptorRelay}}} classes). |
| 56 | 39 | Luci Stanescu | |
| 57 | ==== Methods ==== |
||
| 58 | |||
| 59 | '''!__init!__'''(''self'', '''domain''', '''username''', '''password''', '''host'''={{{None}}}, '''use_tls'''={{{False}}}, '''port'''={{{None}}}, '''credentials'''={{{None}}}):: |
||
| 60 | Constructs a new {{{URI}}}. All the arguments specified here are also attributes on the object. For more information on these attributes, see RFC4975. |
||
| 61 | [[BR]]''domain'':[[BR]] |
||
| 62 | The DNS domain in which to search for a MSRP relay using SRV queries. |
||
| 63 | [[BR]]''username'':[[BR]] |
||
| 64 | The username which will be used to authenticate to the relay. |
||
| 65 | [[BR]]''password'':[[BR]] |
||
| 66 | The password which will be used to authenticate to the relay. |
||
| 67 | [[BR]]''host'':[[BR]] |
||
| 68 | The hostname or IP address of the MSRP relay. |
||
| 69 | [[BR]]''use_tls'':[[BR]] |
||
| 70 | Whether this identifies an msrps or msrp URI. |
||
| 71 | [[BR]]''port'':[[BR]] |
||
| 72 | The port in the URI. |
||
| 73 | [[BR]]''credentials'':[[BR]] |
||
| 74 | A {{{gnutls.interfaces.twisted.X509Credentials}}} object which will be used to authenticate to the relay if TLS is used. |
||
| 75 | |||
| 76 | === ConnectorDirect === |
||
| 77 | |||
| 78 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module and is used for outbound MSRP connections without a relay. |
| 79 | 39 | Luci Stanescu | |
| 80 | ==== Methods ==== |
||
| 81 | |||
| 82 | '''!__init!__'''(''self'', '''loger'''={{{None}}}):: |
||
| 83 | 44 | Luci Stanescu | Constructs a new ConnectorDirect. |
| 84 | 39 | Luci Stanescu | [[BR]]''logger'':[[BR]] |
| 85 | The logger which will be used for this MSRP connection. See the [wiki:SipMSRPApi#Logging Logging] section for more information. |
||
| 86 | |||
| 87 | '''prepare'''(''self'', '''local_uri'''={{{None}}}):: |
||
| 88 | This method returns a full local path - list of {{{protocol.URI}}} instances, suitable to be put in SDP {{{'a:path'}}} attribute. |
||
| 89 | [[BR]]''local_uri'':[[BR]] |
||
| 90 | This attribute will be used to construct the local path, but other than that it is not used anywhere else in case of the ConnectorDirect. If not provided, one |
||
| 91 | will be automatically generated |
||
| 92 | 1 | Adrian Georgescu | |
| 93 | 39 | Luci Stanescu | '''complete'''(''self'', '''full_remote_path'''):: |
| 94 | This method establishes the connection and binds it (sends an empty chunk to verify each other's From-Path and To-Path). It returns {{{transport.MSRPTransport}}} instance, ready to read and send chunks. |
||
| 95 | [[BR]]''full_remote_path'':[[BR]] |
||
| 96 | A list of {{{protocol.URI}}} instances, obtained by parsing {{{'a:path'}}} put in SDP by the remote party. |
||
| 97 | 1 | Adrian Georgescu | |
| 98 | 39 | Luci Stanescu | '''cleanup'''(''self''):: |
| 99 | This method cleans up after {{{prepare()}}}; it should be called if {{{complete()}}} will not be called for whatever reason. |
||
| 100 | 1 | Adrian Georgescu | |
| 101 | 39 | Luci Stanescu | === ConnectorRelay === |
| 102 | 1 | Adrian Georgescu | |
| 103 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module and is used for outbound MSRP connections using a relay. |
| 104 | 1 | Adrian Georgescu | |
| 105 | 39 | Luci Stanescu | ==== Methods ==== |
| 106 | |||
| 107 | '''!__init!__'''(''self'', '''relay''', '''loger'''={{{None}}}):: |
||
| 108 | Constructs a new ConnectorRelay. |
||
| 109 | [[BR]]''relay'':[[BR]] |
||
| 110 | An instance of {{{MSRPRelaySettings}}} which identifies the relay which is to be used. |
||
| 111 | [[BR]]''logger'':[[BR]] |
||
| 112 | The logger which will be used for this MSRP connection. See the [wiki:SipMSRPApi#Logging Logging] section for more information. |
||
| 113 | |||
| 114 | '''prepare'''(''self'', '''local_uri'''={{{None}}}):: |
||
| 115 | This method returns a full local path - list of {{{protocol.URI}}} instances, suitable to be put in SDP {{{'a:path'}}} attribute. |
||
| 116 | [[BR]]''local_uri'':[[BR]] |
||
| 117 | This attribute will be used to construct the local path, but other than that it is not used anywhere else in case of the ConnectorRelay. If not provided, one |
||
| 118 | will be automatically generated |
||
| 119 | |||
| 120 | '''complete'''(''self'', '''full_remote_path'''):: |
||
| 121 | This method establishes the connection to the relay and binds it (sends an empty chunk to verify each other's From-Path and To-Path). It returns {{{transport.MSRPTransport}}} instance, ready to read and send chunks. |
||
| 122 | [[BR]]''full_remote_path'':[[BR]] |
||
| 123 | A list of {{{protocol.URI}}} instances, obtained by parsing {{{'a:path'}}} put in SDP by the remote party. |
||
| 124 | |||
| 125 | 1 | Adrian Georgescu | '''cleanup'''(''self''):: |
| 126 | 39 | Luci Stanescu | This method cleans up after {{{prepare()}}}; it should be called if {{{complete()}}} will not be called for whatever reason. |
| 127 | 1 | Adrian Georgescu | |
| 128 | 39 | Luci Stanescu | === AcceptorDirect === |
| 129 | 1 | Adrian Georgescu | |
| 130 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module and is used for inbound MSRP connections without using a relay. |
| 131 | 1 | Adrian Georgescu | |
| 132 | 40 | Luci Stanescu | ==== Methods ==== |
| 133 | 39 | Luci Stanescu | |
| 134 | '''!__init!__'''(''self'', '''loger'''={{{None}}}):: |
||
| 135 | Constructs a new AcceptorDirect. |
||
| 136 | [[BR]]''logger'':[[BR]] |
||
| 137 | The logger which will be used for this MSRP connection. See the [wiki:SipMSRPApi#Logging Logging] section for more information. |
||
| 138 | |||
| 139 | '''prepare'''(''self'', '''local_uri'''={{{None}}}):: |
||
| 140 | This method starts listening on a socket identified by the parameters in the {{{local_uri}}} argument. It returns a full local path - list of {{{protocol.URI}}} instances, suitable to be put in SDP {{{'a:path'}}} attribute. |
||
| 141 | [[BR]]''local_uri'':[[BR]] |
||
| 142 | This attribute will be used to construct the local path and to listen for incomming connections. If not provided, one |
||
| 143 | will be automatically generated |
||
| 144 | |||
| 145 | '''complete'''(''self'', '''full_remote_path'''):: |
||
| 146 | This method waits for an incoming connection and a chunk sent by the other party. It returns {{{transport.MSRPTransport}}} instance, ready to read and send chunks. |
||
| 147 | [[BR]]''full_remote_path'':[[BR]] |
||
| 148 | A list of {{{protocol.URI}}} instances, obtained by parsing {{{'a:path'}}} put in SDP by the remote party. This is checked agains the From-Path header in the binding chunk. |
||
| 149 | |||
| 150 | '''cleanup'''(''self''):: |
||
| 151 | This method cleans up after {{{prepare()}}}; it should be called if {{{complete()}}} will not be called for whatever reason. |
||
| 152 | |||
| 153 | === AcceptorRelay === |
||
| 154 | |||
| 155 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module and is used for inbound MSRP connections using a relay. |
| 156 | 39 | Luci Stanescu | |
| 157 | ==== Methods ==== |
||
| 158 | |||
| 159 | '''!__init!__'''(''self'', '''relay''', '''loger'''={{{None}}}):: |
||
| 160 | Constructs a new AcceptorRelay. |
||
| 161 | [[BR]]''relay'':[[BR]] |
||
| 162 | An instance of {{{MSRPRelaySettings}}} which identifies the relay which is to be used. |
||
| 163 | [[BR]]''logger'':[[BR]] |
||
| 164 | The logger which will be used for this MSRP connection. See the [wiki:SipMSRPApi#Logging Logging] section for more information. |
||
| 165 | |||
| 166 | '''prepare'''(''self'', '''local_uri'''={{{None}}}):: |
||
| 167 | This method connects to the relay specified in {{{__init__}}}. It returns a full local path - list of {{{protocol.URI}}} instances, suitable to be put in SDP {{{'a:path'}}} attribute. |
||
| 168 | [[BR]]''local_uri'':[[BR]] |
||
| 169 | This attribute will be used to construct the local path. If not provided, one will be automatically generated |
||
| 170 | |||
| 171 | '''complete'''(''self'', '''full_remote_path'''):: |
||
| 172 | This method waits for an incoming chunk sent by the other party. It returns {{{transport.MSRPTransport}}} instance, ready to read and send chunks. |
||
| 173 | [[BR]]''full_remote_path'':[[BR]] |
||
| 174 | A list of {{{protocol.URI}}} instances, obtained by parsing {{{'a:path'}}} put in SDP by the remote party. This is checked agains the From-Path header in the binding chunk. |
||
| 175 | |||
| 176 | '''cleanup'''(''self''):: |
||
| 177 | This method cleans up after {{{prepare()}}}; it should be called if {{{complete()}}} will not be called for whatever reason. |
||
| 178 | |||
| 179 | === MSRPTransport === |
||
| 180 | |||
| 181 | 41 | Luci Stanescu | This class is implemented in the {{{msrplib.transport}}} module and provies low level access to the MSRP connection. This class should not be constructed directly, but rather its intances should be obtained by using the various connector/acceptor classes documented above |
| 182 | 39 | Luci Stanescu | |
| 183 | ==== Methods ==== |
||
| 184 | |||
| 185 | '''make_chunk'''(''self'', '''transaction_id'''={{{None}}}, '''method'''={{{'SEND'}}}, '''code'''={{{None}}}, '''comment'''={{{None}}}, '''data'''={{{''}}}, '''contflag'''={{{None}}}, '''start'''={{{1}}}, '''end'''={{{None}}}, '''length'''={{{None}}}, '''message_id'''={{{None}}}):: |
||
| 186 | 1 | Adrian Georgescu | Makes a new chunk ({{{protocol.MSRPData}}} instance) with proper {{{From-Path}}}, {{{To-Path}}}, {{{Byte-Range}}} and {{{Message-ID}}} headers set up based on MSRPTransport's state and the parameters provided. Use ''data'' for payload, and ''start''/''end''/''length'' to generate {{{Byte-Range}}} header. Generate new random strings for default values of ''transaction_id'' and ''message_id''. |
| 187 | [[BR]]''contflag'':[[BR]] |
||
| 188 | MSRP chunk's continuation flag ({{{'$'}}}, {{{'+'}}} or {{{'#'}}}). Default is {{{'$'}}}, unless you have a partial {{{SEND}}} chunk, in which case it is {{{'+'}}} |
||
| 189 | 14 | Oliver Bril | |
| 190 | 39 | Luci Stanescu | '''write'''(''self'', '''bytes''', '''sync'''={{{True}}}):: |
| 191 | 1 | Adrian Georgescu | Writes ''bytes'' to the socket. If ''sync'' is true, waits for an operation to complete. |
| 192 | |||
| 193 | 39 | Luci Stanescu | '''read_chunk'''(''self'', '''size'''={{{None}}}):: |
| 194 | 1 | Adrian Georgescu | Waits for a new chunk and returns it. |
| 195 | If there was an error, closes the connection and raises {{{ChunkParseError}}}. |
||
| 196 | |||
| 197 | 15 | Oliver Bril | In case of unintelligible input, loses the connection and returns {{{None}}}. |
| 198 | 1 | Adrian Georgescu | When the connection is closed, raises the reason of the closure (e.g. {{{ConnectionDone}}}). |
| 199 | 27 | Adrian Georgescu | |
| 200 | If the data already read exceeds ''size'', stops reading the data and returns |
||
| 201 | 38 | Adrian Georgescu | a "virtual" chunk, i.e. the one that does not actually correspond the the real |
| 202 | 1 | Adrian Georgescu | MSRP chunk. Such chunks have Byte-Range header changed to match the number of |
| 203 | 4 | Oliver Bril | bytes read and continuation that is {{{'+'}}}; they also possess {{{segment}}} attribute, |
| 204 | 1 | Adrian Georgescu | an integer, starting with 1 and increasing with every new segment of the chunk. |
| 205 | 15 | Oliver Bril | |
| 206 | 27 | Adrian Georgescu | Note, that ''size'' only hints when to interrupt the segment but does not affect |
| 207 | 1 | Adrian Georgescu | how the data is read from socket. You may have segments bigger than ''size'' and it's |
| 208 | 15 | Oliver Bril | legal to set ''size'' to zero (which would mean return a chunk as long as you get |
| 209 | 27 | Adrian Georgescu | some data, regardless how small). |
| 210 | 15 | Oliver Bril | |
| 211 | 39 | Luci Stanescu | '''check_incoming_SEND_chunk'''(''self'', '''chunk'''):: |
| 212 | 15 | Oliver Bril | Checks the 'To-Path' and 'From-Path' of the incoming SEND chunk. |
| 213 | 1 | Adrian Georgescu | Returns None is the paths are valid for this connection. |
| 214 | 15 | Oliver Bril | If an error is detected an MSRPError is created and returned. |
| 215 | 1 | Adrian Georgescu | |
| 216 | 39 | Luci Stanescu | === MSRPSession === |
| 217 | 15 | Oliver Bril | |
| 218 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.session}}} module and provides a high level API for MSRP sessions. |
| 219 | 39 | Luci Stanescu | |
| 220 | ==== Methods ==== |
||
| 221 | |||
| 222 | '''!__init!__'''(''self'', '''msrptransport''', '''accept_types'''={{{['*']}}}, '''on_incoming_cb'''={{{None}}}):: |
||
| 223 | 41 | Luci Stanescu | Initializes MSRPSession instance. The incoming chunks are reported through the ''on_incoming_cb'' callback, which must be a function which receives two arguments, both optional with default values of {{{None}}}: ''chunk'' and ''error''. |
| 224 | 1 | Adrian Georgescu | |
| 225 | 39 | Luci Stanescu | '''send_chunk'''(''self'', '''chunk''', '''response_cb'''={{{None}}}):: |
| 226 | 1 | Adrian Georgescu | Sends ''chunk''. Report the result via ''response_cb''. |
| 227 | |||
| 228 | When ''response_cb'' argument is present, it will be used to report |
||
| 229 | the transaction response to the caller. When a response is received or generated |
||
| 230 | locally, ''response_cb'' is called with one argument. The function must do something |
||
| 231 | quickly and must not block, because otherwise it would block the reader greenlet. |
||
| 232 | |||
| 233 | If no response was received after {{{RESPONSE_TIMEOUT}}} seconds, |
||
| 234 | * 408 response is generated if Failure-Report was {{{'yes'}}} or absent |
||
| 235 | * 200 response is generated if Failure-Report was {{{'partial'}}} or {{{'no'}}} |
||
| 236 | |||
| 237 | Note that it's rather wasteful to provide ''response_cb'' argument other than {{{None}}} |
||
| 238 | for chunks with Failure-Report='no' since it will always fire 30 seconds later |
||
| 239 | with 200 result (unless the other party is broken and ignores Failure-Report header) |
||
| 240 | |||
| 241 | If sending is impossible raise {{{MSRPSessionError}}}. |
||
| 242 | 38 | Adrian Georgescu | |
| 243 | 39 | Luci Stanescu | '''deliver_chunk'''(''self'', '''chunk''', '''event'''={{{None}}}):: |
| 244 | 1 | Adrian Georgescu | Sends the chunk, waits for the transaction response (if Failure-Report header is not {{{'no'}}}). |
| 245 | Returns the transaction response if it's a success, raise {{{MSRPTransactionError}}} if it's not. |
||
| 246 | |||
| 247 | If chunk's Failure-Report is {{{'no'}}}, returns {{{None}}} immediately. |
||
| 248 | |||
| 249 | 39 | Luci Stanescu | '''shutdown'''(''self'', '''sync'''={{{True}}}):: |
| 250 | 41 | Luci Stanescu | Sends the messages already in queue then closes the connection. |
| 251 | 1 | Adrian Georgescu | |
| 252 | 39 | Luci Stanescu | === MSRPServer === |
| 253 | 38 | Adrian Georgescu | |
| 254 | 44 | Luci Stanescu | This class is implemented in the {{{msrplib.connect}}} module. |
| 255 | 1 | Adrian Georgescu | |
| 256 | 44 | Luci Stanescu | MSRPServer solves the problem with AcceptorDirect: concurrent using of 2 |
| 257 | or more AcceptorDirect instances on the same non-zero port is not possible. |
||
| 258 | If you initialize() those instances, one after another, one will listen on |
||
| 259 | the socket and another will get BindError. |
||
| 260 | 1 | Adrian Georgescu | |
| 261 | 44 | Luci Stanescu | MSRPServer avoids the problem by sharing the listening socket between multiple connections. |
| 262 | It has a slightly different interface from AcceptorDirect, so it cannot be considered a drop-in |
||
| 263 | replacement. |
||
| 264 | 1 | Adrian Georgescu | |
| 265 | 44 | Luci Stanescu | It manages the listening sockets and binds incoming requests. |
| 266 | 39 | Luci Stanescu | |
| 267 | |||
| 268 | ==== Methods ==== |
||
| 269 | |||
| 270 | 46 | Luci Stanescu | '''!__init!__'''(''self'', '''logger'''):: |
| 271 | Constructs a new MSRPServer which will be using the specifed logger for its connections. See the [wiki:SipMSRPApi#Logging Logging] section for more information. |
||
| 272 | |||
| 273 | 1 | Adrian Georgescu | '''prepare'''(''self'', ''local_uri''={{{None}}}, ''logger''={{{None}}}):: |
| 274 | Starts a listening port specified by ''local_uri'' if there isn't one on that port/interface already. |
||
| 275 | Adds ''local_uri'' to the list of expected URIs, so that incoming connections featuring this URI won't be rejected. |
||
| 276 | If ''logger'' is provided, it uses it for this connection instead of the default one. |
||
| 277 | |||
| 278 | 15 | Oliver Bril | '''complete'''(''self'', ''full_remote_path''):: |
| 279 | 1 | Adrian Georgescu | Waits until one of the incoming connections binds using provided ''full_remote_path''. |
| 280 | 15 | Oliver Bril | Returns connected and bounds the {{{MSRPTransport}}} instance. |
| 281 | |||
| 282 | If no such binding was made within {{{MSRPBindSessionTimeout.seconds}}}, raise {{{MSRPBindSessionTimeout}}}. |
||
| 283 | 38 | Adrian Georgescu | ''full_remote_path'' should be a list of {{{protocol.URI}}} instances, obtained by parsing {{{'a:path'}}} put in SDP by the remote party. |
| 284 | |||
| 285 | '''cleanup'''(''self'', ''local_uri''):: |
||
| 286 | Removes ''local_uri'' from the list of expected URIs. |
||
| 287 | 46 | Luci Stanescu | |
| 288 | == Logging == |
||
| 289 | |||
| 290 | Logging is done throughout the library using objects defined by the application, called loggers. If logging is not desired, the {{{application.python.Null}}} object of {{{python-application}}} can be used. These loggers must define the following methods: |
||
| 291 | |||
| 292 | '''received_new_chunk'''('''data''', '''transport''', '''chunk'''):: |
||
| 293 | This method is called when the start of a new chunk is received. |
||
| 294 | [[BR]]''data'':[[BR]] |
||
| 295 | The data which came along with the start of the chunk. |
||
| 296 | [[BR]]''transport'':[[BR]] |
||
| 297 | The {{{MSRPTransport}}} instance on which the chunk was received. |
||
| 298 | [[BR]]''chunk'':[[BR]] |
||
| 299 | The actual chunk object. |
||
| 300 | |||
| 301 | '''received_chunk_data'''('''data''', '''transport''', '''transaction_id'''):: |
||
| 302 | This method is called when data is received as part of a chunk previously announced via '''received_new_chunk'''. |
||
| 303 | [[BR]]''data'':[[BR]] |
||
| 304 | The data received as part of the chunk. |
||
| 305 | [[BR]]''transport'':[[BR]] |
||
| 306 | The {{{MSRPTransport}}} instance on which the chunk was received. |
||
| 307 | [[BR]]''transaction_id'':[[BR]] |
||
| 308 | The transaction ID which identifies the chunk for which data was received. |
||
| 309 | |||
| 310 | '''received_chunk_end'''('''data''', '''transport''', transaction_id'''):: |
||
| 311 | This method is called when the last data of a chunk is received. The chunk was previously announced via '''received_new_chunk'''. |
||
| 312 | [[BR]]''data'':[[BR]] |
||
| 313 | The last data received as part of the chunk. |
||
| 314 | [[BR]]''transport'':[[BR]] |
||
| 315 | The {{{MSRPTransport}}} instance on which the chunk was received. |
||
| 316 | [[BR]]''transaction_id'':[[BR]] |
||
| 317 | The transaction ID which identifies the chunk which was ended. |
||
| 318 | |||
| 319 | '''sent_new_chunk'''('''data''', '''transport''', '''chunk'''):: |
||
| 320 | This method is called when the start of a new chunk is sent. |
||
| 321 | [[BR]]''data'':[[BR]] |
||
| 322 | The data which was sent along with the start of the chunk. |
||
| 323 | [[BR]]''transport'':[[BR]] |
||
| 324 | The {{{MSRPTransport}}} instance on which the chunk was sent. |
||
| 325 | [[BR]]''chunk'':[[BR]] |
||
| 326 | The actual chunk object. |
||
| 327 | |||
| 328 | '''sent_chunk_data'''('''data''', '''transport''', '''transaction_id'''):: |
||
| 329 | This method is called when data is sent as part of a chunk previously announced via '''sent_new_chunk'''. |
||
| 330 | [[BR]]''data'':[[BR]] |
||
| 331 | The data sent as part of the chunk. |
||
| 332 | [[BR]]''transport'':[[BR]] |
||
| 333 | The {{{MSRPTransport}}} instance on which the chunk was sent. |
||
| 334 | [[BR]]''transaction_id'':[[BR]] |
||
| 335 | The transaction ID which identifies the chunk for which data was sent. |
||
| 336 | |||
| 337 | '''sent_chunk_end'''('''data''', '''transport''', transaction_id'''):: |
||
| 338 | This method is called when the last data of a chunk is sent. The chunk was previously announced via '''sent_new_chunk'''. |
||
| 339 | [[BR]]''data'':[[BR]] |
||
| 340 | The last data sent as part of the chunk. |
||
| 341 | [[BR]]''transport'':[[BR]] |
||
| 342 | The {{{MSRPTransport}}} instance on which the chunk was sent. |
||
| 343 | [[BR]]''transaction_id'':[[BR]] |
||
| 344 | The transaction ID which identifies the chunk which was ended. |
||
| 345 | |||
| 346 | '''debug'''('''message'''):: |
||
| 347 | This method is called when a debug level message is sent by the library. |
||
| 348 | |||
| 349 | '''info'''('''message'''):: |
||
| 350 | This method is called when a info level message is sent by the library. |
||
| 351 | |||
| 352 | '''warn'''('''message'''):: |
||
| 353 | This method is called when a warning level message is sent by the library. |
||
| 354 | |||
| 355 | '''error'''('''message'''):: |
||
| 356 | This method is called when a error level message is sent by the library. |
||
| 357 | |||
| 358 | '''fatal'''('''message'''):: |
||
| 359 | This method is called when a fatal level message is sent by the library. |
||
| 360 | 38 | Adrian Georgescu | |
| 361 | 39 | Luci Stanescu | == Example == |
| 362 | 38 | Adrian Georgescu | |
| 363 | === Establish a connection === |
||
| 364 | |||
| 365 | {{{msrplib.connect}}} provides a number of classes to establish a connection, so the first |
||
| 366 | thing to do is to select which one applies to your situation: |
||
| 367 | |||
| 368 | 1. Calling endpoint, not using a relay ({{{ConnectorDirect}}}) |
||
| 369 | 2. Answering endpoint, not using a relay ({{{AcceptorDirect}}}) |
||
| 370 | 3. Calling endpoint, using a relay ({{{ConnectorRelay}}}) |
||
| 371 | 4. Answering endpoint, using a relay ({{{AcceptorRelay}}}) |
||
| 372 | |||
| 373 | The answering endpoint may skip using the relay if sure that it's accessible directly, e.g is not behind a NAT. To be sure it works in any network topology a called end-point should always use a relay. |
||
| 374 | |||
| 375 | The calling endpoint does not need a relay as the protocol mandates that it is establishing an outbound connection which always work from behind a NAT. |
||
| 376 | |||
| 377 | Once you have an instance of the right class (use the convenience functions |
||
| 378 | {{{get_connector()}}} and {{{get_acceptor()}}} to get one), the procedure to establish the |
||
| 379 | connection is the same: |
||
| 380 | |||
| 381 | {{{ |
||
| 382 | full_local_path = connector.prepare() |
||
| 383 | try: |
||
| 384 | ... put full_local_path in SDP 'a:path' attribute |
||
| 385 | ... get full_remote_path from remote's 'a:path: attribute |
||
| 386 | ... (the order of the above steps is reversed if you're the |
||
| 387 | ... answering party, but that does not affect connector's usage) |
||
| 388 | msrptransport = connector.complete(full_remote_path) |
||
| 389 | finally: |
||
| 390 | connector.cleanup() |
||
| 391 | }}} |
||
| 392 | |||
| 393 | To customize connection's parameters, creates a new {{{protocol.URI}}} object and passes |
||
| 394 | it to prepare() function, e.g. |
||
| 395 | {{{ |
||
| 396 | local_uri = protocol.URI(use_tls=False, port=5000) |
||
| 397 | connector.prepare(local_uri) |
||
| 398 | }}} |
||
| 399 | |||
| 400 | {{{prepare()}}} may update {{{local_uri}}} in place with the actual connection parameters |
||
| 401 | used (e.g. if you specified port=0). 'port' attribute of {{{local_uri}}} is currently |
||
| 402 | only respected by {{{AcceptorDirect}}}. |
||
| 403 | |||
| 404 | 1 | Adrian Georgescu | Note that, acceptors and connectors are one-use only. Which means, that {{{AcceptorDirect}}} |
| 405 | will open a port just to handle one incoming connection and close it right after. |
||
| 406 | If your application behaves more like a server, i.e. opens a port and listens on it |
||
| 407 | constantly, use {{{MSRPServer}}} class. |