<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Yate: yatemgcp.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.5.7.1 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> </ul> </div> <h1>yatemgcp.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <a name="l00024"></a>00024 <span class="preprocessor">#ifndef __YATEMGCP_H</span> <a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __YATEMGCP_H</span> <a name="l00026"></a>00026 <span class="preprocessor"></span> <a name="l00027"></a>00027 <span class="preprocessor">#include <yateclass.h></span> <a name="l00028"></a>00028 <span class="preprocessor">#include <yatemime.h></span> <a name="l00029"></a>00029 <a name="l00030"></a>00030 <span class="preprocessor">#ifdef _WINDOWS</span> <a name="l00031"></a>00031 <span class="preprocessor"></span> <a name="l00032"></a>00032 <span class="preprocessor">#ifdef LIBYMGCP_EXPORTS</span> <a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define YMGCP_API __declspec(dllexport)</span> <a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#else</span> <a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#ifndef LIBYMGCP_STATIC</span> <a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define YMGCP_API __declspec(dllimport)</span> <a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00039"></a>00039 <span class="preprocessor"></span> <a name="l00040"></a>00040 <span class="preprocessor">#endif </span><span class="comment">/* _WINDOWS */</span> <a name="l00041"></a>00041 <a name="l00042"></a>00042 <span class="preprocessor">#ifndef YMGCP_API</span> <a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define YMGCP_API</span> <a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00045"></a>00045 <span class="preprocessor"></span> <a name="l00049"></a>00049 <span class="keyword">namespace </span>TelEngine { <a name="l00050"></a>00050 <a name="l00051"></a>00051 <span class="keyword">class </span>MGCPMessage; <a name="l00052"></a>00052 <span class="keyword">class </span>MGCPTransaction; <a name="l00053"></a>00053 <span class="keyword">class </span>MGCPEpInfo; <a name="l00054"></a>00054 <span class="keyword">class </span>MGCPEndpoint; <a name="l00055"></a>00055 <span class="keyword">class </span>MGCPEvent; <a name="l00056"></a>00056 <span class="keyword">class </span>MGCPEngine; <a name="l00057"></a>00057 <a name="l00063"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html">00063</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a> : <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1RefObject.html">RefObject</a> <a name="l00064"></a>00064 { <a name="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>; <a name="l00066"></a>00066 <span class="keyword">public</span>: <a name="l00077"></a>00077 <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>(<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine, <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* ep, <span class="keyword">const</span> <span class="keywordtype">char</span>* ver = <span class="stringliteral">"MGCP 1.0"</span>); <a name="l00078"></a>00078 <a name="l00087"></a>00087 <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>(<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* trans, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment = 0); <a name="l00088"></a>00088 <a name="l00092"></a>00092 <span class="keyword">virtual</span> ~<a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>(); <a name="l00093"></a>00093 <a name="l00098"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#8d985300b138b6c5556ab17ed4df3b38">00098</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> valid()<span class="keyword"> const</span> <a name="l00099"></a>00099 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_valid; } <a name="l00100"></a>00100 <a name="l00105"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#b31e7357671cfe484e3c3ed3cd6258e4">00105</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& name()<span class="keyword"> const</span> <a name="l00106"></a>00106 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_name; } <a name="l00107"></a>00107 <a name="l00112"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#9fbb542ce0dae274d40866ba432b411a">00112</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> code()<span class="keyword"> const</span> <a name="l00113"></a>00113 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_code; } <a name="l00114"></a>00114 <a name="l00119"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#be02834a1bc748fc318188e9e54c3c40">00119</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& version()<span class="keyword"> const</span> <a name="l00120"></a>00120 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_version; } <a name="l00121"></a>00121 <a name="l00126"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#299a3fd110c3eabb8adfc9f8235a2ec9">00126</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& comment()<span class="keyword"> const</span> <a name="l00127"></a>00127 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_comment; } <a name="l00128"></a>00128 <a name="l00133"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#cc6c7f58a3a1d7a0e4c7e5a6b43a8f49">00133</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isCommand()<span class="keyword"> const</span> <a name="l00134"></a>00134 <span class="keyword"> </span>{ <span class="keywordflow">return</span> code() < 0; } <a name="l00135"></a>00135 <a name="l00140"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#5f89a108755a6cb3e8185d85c850a816">00140</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isResponse()<span class="keyword"> const</span> <a name="l00141"></a>00141 <span class="keyword"> </span>{ <span class="keywordflow">return</span> 100 <= code(); } <a name="l00142"></a>00142 <a name="l00147"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#c443fdf72682a999d095f5bf11211f0a">00147</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isAck()<span class="keyword"> const</span> <a name="l00148"></a>00148 <span class="keyword"> </span>{ <span class="keywordflow">return</span> 0 <= code() && code() <= 99; } <a name="l00149"></a>00149 <a name="l00154"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#0c8e59e64cbab0c8af978c4f51bed6f9">00154</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> transactionId()<span class="keyword"> const</span> <a name="l00155"></a>00155 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_transaction; } <a name="l00156"></a>00156 <a name="l00161"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#3b22b772544eaaf874b63ca5807a0f78">00161</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& endpointId()<span class="keyword"> const</span> <a name="l00162"></a>00162 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_endpoint; } <a name="l00163"></a>00163 <a name="l00169"></a>00169 <span class="keywordtype">void</span> toString(<a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& dest) <span class="keyword">const</span>; <a name="l00170"></a>00170 <a name="l00183"></a>00183 <span class="keyword">static</span> <span class="keywordtype">bool</span> parse(<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine, <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a>& dest, <a name="l00184"></a>00184 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <a name="l00185"></a>00185 <span class="keyword">const</span> <span class="keywordtype">char</span>* sdpType = <span class="stringliteral">"application/sdp"</span>); <a name="l00186"></a>00186 <a name="l00190"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#843f74eb2ae35223b090dc55e73aab9c">00190</a> <a class="code" href="classTelEngine_1_1NamedList.html" title="A named string container class.">NamedList</a> params; <a name="l00191"></a>00191 <a name="l00195"></a><a class="code" href="classTelEngine_1_1MGCPMessage.html#7e8595a03399b14f9bddf86c8e12207e">00195</a> <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> sdp; <a name="l00196"></a>00196 <a name="l00197"></a>00197 <span class="keyword">protected</span>: <a name="l00208"></a>00208 <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>(<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine, <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">int</span> code, <a name="l00209"></a>00209 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> transId, <span class="keyword">const</span> <span class="keywordtype">char</span>* epId, <span class="keyword">const</span> <span class="keywordtype">char</span>* ver); <a name="l00210"></a>00210 <a name="l00211"></a>00211 <span class="keyword">private</span>: <a name="l00212"></a>00212 <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>() : params(<span class="stringliteral">""</span>) {} <span class="comment">// Avoid using default constructor</span> <a name="l00213"></a>00213 <span class="comment">// Decode the message line</span> <a name="l00214"></a>00214 <span class="keyword">static</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* decodeMessage(<span class="keyword">const</span> <span class="keywordtype">char</span>* line, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& trans, <a name="l00215"></a>00215 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& error, <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine); <a name="l00216"></a>00216 <span class="comment">// Decode message parameters. Return true if found a line containing a dot</span> <a name="l00217"></a>00217 <span class="keyword">static</span> <span class="keywordtype">bool</span> decodeParams(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <a name="l00218"></a>00218 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>& crt, <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg, <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& error, <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine); <a name="l00219"></a>00219 <a name="l00220"></a>00220 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_name; <span class="comment">// Command or string representation of response code</span> <a name="l00221"></a>00221 <span class="keywordtype">bool</span> m_valid; <span class="comment">// False if this message is invalid</span> <a name="l00222"></a>00222 <span class="keywordtype">int</span> m_code; <span class="comment">// Response code or -1 if this is a command</span> <a name="l00223"></a>00223 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_transaction; <span class="comment">// The id of the transaction this message belongs to</span> <a name="l00224"></a>00224 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_endpoint; <span class="comment">// The id of the endpoint issuing this message</span> <a name="l00225"></a>00225 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_version; <span class="comment">// The protocol version</span> <a name="l00226"></a>00226 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_comment; <span class="comment">// The comment attached to a response message</span> <a name="l00227"></a>00227 }; <a name="l00228"></a>00228 <a name="l00233"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html">00233</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a> : <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1RefObject.html">RefObject</a>, <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1Mutex.html" title="Mutex support.">Mutex</a> <a name="l00234"></a>00234 { <a name="l00235"></a>00235 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>; <span class="comment">// Process a received message</span> <a name="l00236"></a>00236 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>; <span class="comment">// Access to event termination notification</span> <a name="l00237"></a>00237 <span class="keyword">public</span>: <a name="l00241"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#5d74787dedbc4e11c1ab15bf487e61f8">00241</a> <span class="keyword">enum</span> <a class="code" href="classTelEngine_1_1MGCPTransaction.html#5d74787dedbc4e11c1ab15bf487e61f8">State</a> { <a name="l00242"></a>00242 Invalid = 0, <span class="comment">// This is an invalid transaction (constructor failed)</span> <a name="l00243"></a>00243 Initiated = 1, <span class="comment">// An initial command message was sent/received</span> <a name="l00244"></a>00244 Trying = 2, <span class="comment">// Sent or received a provisional response to the initial message</span> <a name="l00245"></a>00245 Responded = 3, <span class="comment">// Sent or received a final response to the initial message</span> <a name="l00246"></a>00246 Ack = 4, <span class="comment">// Response was ack'd</span> <a name="l00247"></a>00247 Destroying = 5, <span class="comment">// Waiting to be removed from the engine</span> <a name="l00248"></a>00248 }; <a name="l00249"></a>00249 <a name="l00257"></a>00257 <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>(<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine, <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg, <span class="keywordtype">bool</span> outgoing, <a name="l00258"></a>00258 <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& address); <a name="l00259"></a>00259 <a name="l00263"></a>00263 <span class="keyword">virtual</span> ~<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>(); <a name="l00264"></a>00264 <a name="l00269"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#3804c9648e6d1325751536cca350f2bf">00269</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPTransaction.html#5d74787dedbc4e11c1ab15bf487e61f8">State</a> state()<span class="keyword"> const</span> <a name="l00270"></a>00270 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_state; } <a name="l00271"></a>00271 <a name="l00276"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#fbee9fd63cc167498cd18e503c253e7c">00276</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> id()<span class="keyword"> const</span> <a name="l00277"></a>00277 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_id; } <a name="l00278"></a>00278 <a name="l00283"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#bf0a85f6a7ff9ab42c7f7d86b1bc0da8">00283</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> outgoing()<span class="keyword"> const</span> <a name="l00284"></a>00284 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_outgoing; } <a name="l00285"></a>00285 <a name="l00290"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#54b00cf5b655b1697be41ff469865b3b">00290</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& ep()<span class="keyword"> const</span> <a name="l00291"></a>00291 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_endpoint; } <a name="l00292"></a>00292 <a name="l00297"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#37daa045dcf7a1b182cda22f09ae61a4">00297</a> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& addr()<span class="keyword"> const</span> <a name="l00298"></a>00298 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_address; } <a name="l00299"></a>00299 <a name="l00304"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#bebc8e9f0ca79286f4b1e6b98b8d706d">00304</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine() <a name="l00305"></a>00305 { <span class="keywordflow">return</span> m_engine; } <a name="l00306"></a>00306 <a name="l00311"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#c70841b2d1baead65794c3377f0ec323">00311</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* initial()<span class="keyword"> const</span> <a name="l00312"></a>00312 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_cmd; } <a name="l00313"></a>00313 <a name="l00318"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#181fc688c52f38ca185fa4dc1cda18ba">00318</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msgProvisional()<span class="keyword"> const</span> <a name="l00319"></a>00319 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_provisional; } <a name="l00320"></a>00320 <a name="l00325"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#de81c066760cda17ec84b5a1769cc736">00325</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msgResponse()<span class="keyword"> const</span> <a name="l00326"></a>00326 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_response; } <a name="l00327"></a>00327 <a name="l00332"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#12a7d1f8c3f0c68edeb870316fc56e38">00332</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msgAck()<span class="keyword"> const</span> <a name="l00333"></a>00333 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_ack; } <a name="l00334"></a>00334 <a name="l00339"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#9c437d53bf2d1e353a45486af2fd3343">00339</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> timeout()<span class="keyword"> const</span> <a name="l00340"></a>00340 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_timeout; } <a name="l00341"></a>00341 <a name="l00346"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#8d042c8d2cd995d6eb10fce205231d65">00346</a> <span class="keyword">inline</span> <span class="keywordtype">void</span>* userData()<span class="keyword"> const</span> <a name="l00347"></a>00347 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_private; } <a name="l00348"></a>00348 <a name="l00353"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#720e116390cc3be7d7ea60599bceb686">00353</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> userData(<span class="keywordtype">void</span>* data) <a name="l00354"></a>00354 { m_private = data; } <a name="l00355"></a>00355 <a name="l00361"></a>00361 <a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* getEvent(u_int64_t time = <a class="code" href="classTelEngine_1_1Time.html" title="A time holding class.">Time</a>()); <a name="l00362"></a>00362 <a name="l00369"></a>00369 <span class="keywordtype">bool</span> sendProvisional(<span class="keywordtype">int</span> code = 100, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment = 0); <a name="l00370"></a>00370 <a name="l00378"></a><a class="code" href="classTelEngine_1_1MGCPTransaction.html#1d86cea62d00d6f86c99bf9386283823">00378</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> setResponse(<span class="keywordtype">int</span> code, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment = 0) <a name="l00379"></a>00379 { <span class="keywordflow">return</span> <a class="code" href="classTelEngine_1_1MGCPTransaction.html#1d86cea62d00d6f86c99bf9386283823">setResponse</a>(<span class="keyword">new</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>(<span class="keyword">this</span>,code,comment)); } <a name="l00380"></a>00380 <a name="l00391"></a>00391 <span class="keywordtype">bool</span> setResponse(<span class="keywordtype">int</span> code, <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1NamedList.html" title="A named string container class.">NamedList</a>* params, <a class="code" href="classTelEngine_1_1MimeSdpBody.html" title="MIME for application/sdp.">MimeSdpBody</a>* sdp1 = 0, <a name="l00392"></a>00392 <a class="code" href="classTelEngine_1_1MimeSdpBody.html" title="MIME for application/sdp.">MimeSdpBody</a>* sdp2 = 0); <a name="l00393"></a>00393 <a name="l00400"></a>00400 <span class="keywordtype">bool</span> setResponse(<a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg); <a name="l00401"></a>00401 <a name="l00402"></a>00402 <span class="keyword">protected</span>: <a name="l00406"></a>00406 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroyed(); <a name="l00407"></a>00407 <a name="l00412"></a>00412 <span class="keywordtype">void</span> processMessage(<a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg); <a name="l00413"></a>00413 <a name="l00419"></a>00419 <a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* checkTimeout(u_int64_t time); <a name="l00420"></a>00420 <a name="l00425"></a>00425 <span class="keywordtype">void</span> eventTerminated(<a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* event); <a name="l00426"></a>00426 <a name="l00431"></a>00431 <span class="keywordtype">void</span> changeState(State newState); <a name="l00432"></a>00432 <a name="l00437"></a>00437 <span class="keywordtype">void</span> setProvisional(<span class="keywordtype">int</span> code = 100); <a name="l00438"></a>00438 <a name="l00443"></a>00443 <span class="keywordtype">void</span> send(<a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg); <a name="l00444"></a>00444 <a name="l00445"></a>00445 <span class="keyword">private</span>: <a name="l00446"></a>00446 <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>() {} <span class="comment">// Avoid using default constructor</span> <a name="l00447"></a>00447 <span class="comment">// Check if received any final response. Create an event. Init timeout.</span> <a name="l00448"></a>00448 <span class="comment">// Send a response ACK if requested by the response</span> <a name="l00449"></a>00449 MGCPEvent* checkResponse(u_int64_t time); <a name="l00450"></a>00450 <span class="comment">// Init timeout for retransmission or transaction termination</span> <a name="l00451"></a>00451 <span class="keywordtype">void</span> initTimeout(u_int64_t time, <span class="keywordtype">bool</span> extra); <a name="l00452"></a>00452 <span class="comment">// Remove from engine. Create event. Deref the transaction</span> <a name="l00453"></a>00453 MGCPEvent* terminate(); <a name="l00454"></a>00454 <a name="l00455"></a>00455 State m_state; <span class="comment">// Current state</span> <a name="l00456"></a>00456 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_id; <span class="comment">// Transaction id</span> <a name="l00457"></a>00457 <span class="keywordtype">bool</span> m_outgoing; <span class="comment">// Transaction direction</span> <a name="l00458"></a>00458 SocketAddr m_address; <span class="comment">// Remote andpoint's address</span> <a name="l00459"></a>00459 MGCPEngine* m_engine; <span class="comment">// The engine owning this transaction</span> <a name="l00460"></a>00460 MGCPMessage* m_cmd; <span class="comment">// The command that created this transaction</span> <a name="l00461"></a>00461 MGCPMessage* m_provisional; <span class="comment">// The provisional response to the command that created this transaction</span> <a name="l00462"></a>00462 MGCPMessage* m_response; <span class="comment">// The response to the command that created this transaction</span> <a name="l00463"></a>00463 MGCPMessage* m_ack; <span class="comment">// The response aknowledgement message sent or received</span> <a name="l00464"></a>00464 MGCPEvent* m_lastEvent; <span class="comment">// The last generated event</span> <a name="l00465"></a>00465 String m_endpoint; <span class="comment">// The endpoint owning this transaction</span> <a name="l00466"></a>00466 u_int64_t m_nextRetrans; <span class="comment">// Retransission or destroy time</span> <a name="l00467"></a>00467 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_crtRetransInterval; <span class="comment">// Current retransmission interval</span> <a name="l00468"></a>00468 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_retransCount; <span class="comment">// Remainig number of retransmissions</span> <a name="l00469"></a>00469 <span class="keywordtype">bool</span> m_timeout; <span class="comment">// Transaction timeout flag</span> <a name="l00470"></a>00470 <span class="keywordtype">void</span>* m_private; <span class="comment">// Data used by this transaction's user</span> <a name="l00471"></a>00471 String m_debug; <span class="comment">// String used to identify the transaction in debug messages</span> <a name="l00472"></a>00472 }; <a name="l00473"></a>00473 <a name="l00478"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html">00478</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a> <a name="l00479"></a>00479 { <a name="l00480"></a>00480 <span class="keyword">public</span>: <a name="l00484"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#296382cb92e11d68f1fe3268d01d0c23">00484</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a>() <a name="l00485"></a>00485 : m_port(0) <a name="l00486"></a>00486 {} <a name="l00487"></a>00487 <a name="l00492"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#52085a058ea6e71e52a7e38186594a64">00492</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a>(<a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& src) <a name="l00493"></a>00493 : m_port(0) <a name="l00494"></a>00494 { <span class="keyword">set</span>(src); } <a name="l00495"></a>00495 <a name="l00502"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#627f9bf5aeb47c68d15115fa5d59c0cc">00502</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* endpoint, <span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keywordtype">int</span> port) <a name="l00503"></a>00503 : m_port(0) <a name="l00504"></a>00504 { <span class="keyword">set</span>(endpoint,host,port); } <a name="l00505"></a>00505 <a name="l00510"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#e537a056a2d8316444575696aa701bbd">00510</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& id()<span class="keyword"> const</span> <a name="l00511"></a>00511 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_id; } <a name="l00512"></a>00512 <a name="l00517"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#f58aed57b3bb7d77a8b91336dfaa4c27">00517</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& user()<span class="keyword"> const</span> <a name="l00518"></a>00518 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_endpoint; } <a name="l00519"></a>00519 <a name="l00524"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#ed2af6cf890f60ce6cc8b3c5b20e59c8">00524</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& host()<span class="keyword"> const</span> <a name="l00525"></a>00525 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_host; } <a name="l00526"></a>00526 <a name="l00531"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#1981d54240e9fac867f4de9ba7516c39">00531</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> port()<span class="keyword"> const</span> <a name="l00532"></a>00532 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_port; } <a name="l00533"></a>00533 <a name="l00538"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#225f9f30e3961216913b125873ba2779">00538</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> port(<span class="keywordtype">int</span> newPort) <a name="l00539"></a>00539 { <span class="keyword">set</span>(m_endpoint,m_host,newPort); } <a name="l00540"></a>00540 <a name="l00547"></a>00547 <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keyword">const</span> <span class="keywordtype">char</span>* endpoint, <span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keywordtype">int</span> port); <a name="l00548"></a>00548 <a name="l00553"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#8a8e7142fd66f3fc7cfe1a313f79a184">00553</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">set</span>(<a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& src) { <a name="l00554"></a>00554 <a class="code" href="classTelEngine_1_1URI.html" title="Encapsulation for an URI.">URI</a> uri(src); <a name="l00555"></a>00555 <span class="keyword">set</span>(uri.<a class="code" href="classTelEngine_1_1URI.html#84cfa277d639206187d49845667f9293">getUser</a>(),uri.<a class="code" href="classTelEngine_1_1URI.html#dea175962d1ecd0895a6381da1871d7b">getHost</a>(),uri.<a class="code" href="classTelEngine_1_1URI.html#5e4fc3488ccbe0511b7e7a1b3ca873cf">getPort</a>()); <a name="l00556"></a>00556 } <a name="l00557"></a>00557 <a name="l00564"></a><a class="code" href="classTelEngine_1_1MGCPEndpointId.html#8d985300b138b6c5556ab17ed4df3b38">00564</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html#8d985300b138b6c5556ab17ed4df3b38">valid</a>()<span class="keyword"> const </span>{ <a name="l00565"></a>00565 <span class="keywordflow">return</span> m_endpoint && m_endpoint.length() < 256 && <a name="l00566"></a>00566 m_host && m_host.length() < 256; <a name="l00567"></a>00567 } <a name="l00568"></a>00568 <a name="l00569"></a>00569 <span class="keyword">private</span>: <a name="l00570"></a>00570 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_id; <span class="comment">// The complete id</span> <a name="l00571"></a>00571 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_endpoint; <span class="comment">// The endpoint's name inside the host</span> <a name="l00572"></a>00572 <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a> m_host; <span class="comment">// Host of this endpoint</span> <a name="l00573"></a>00573 <span class="keywordtype">int</span> m_port; <span class="comment">// Port used by this endpoint</span> <a name="l00574"></a>00574 }; <a name="l00575"></a>00575 <a name="l00580"></a><a class="code" href="classTelEngine_1_1MGCPEpInfo.html">00580</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPEpInfo.html" title="Remote endpoint info class.">MGCPEpInfo</a> : <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a>, <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1GenObject.html">GenObject</a> <a name="l00581"></a>00581 { <a name="l00582"></a>00582 <span class="keyword">public</span>: <a name="l00589"></a><a class="code" href="classTelEngine_1_1MGCPEpInfo.html#b7209dc104947ce4b1c55aa133437e3b">00589</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEpInfo.html" title="Remote endpoint info class.">MGCPEpInfo</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* endpoint, <span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keywordtype">int</span> port) <a name="l00590"></a>00590 : <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a>(endpoint,host,port), address(AF_INET) { <a name="l00591"></a>00591 address.host(host); <a name="l00592"></a>00592 address.port(port); <a name="l00593"></a>00593 } <a name="l00594"></a>00594 <a name="l00599"></a><a class="code" href="classTelEngine_1_1MGCPEpInfo.html#4a7bd56fb99593ace9379ed699f2719c">00599</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& toString()<span class="keyword"> const</span> <a name="l00600"></a>00600 <span class="keyword"> </span>{ <span class="keywordflow">return</span> id(); } <a name="l00601"></a>00601 <a name="l00605"></a><a class="code" href="classTelEngine_1_1MGCPEpInfo.html#4a91609b6b1710f7f8f884e5f13ebbf7">00605</a> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a> address; <a name="l00606"></a>00606 }; <a name="l00607"></a>00607 <a name="l00614"></a><a class="code" href="classTelEngine_1_1MGCPEndpoint.html">00614</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a> : <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1RefObject.html">RefObject</a>, <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html" title="An endpoint id.">MGCPEndpointId</a> <a name="l00615"></a>00615 { <a name="l00616"></a>00616 <span class="keyword">public</span>: <a name="l00625"></a>00625 <a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>(<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine, <span class="keyword">const</span> <span class="keywordtype">char</span>* user, <span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keywordtype">int</span> port); <a name="l00626"></a>00626 <a name="l00630"></a>00630 <span class="keyword">virtual</span> ~<a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>(); <a name="l00631"></a>00631 <a name="l00636"></a><a class="code" href="classTelEngine_1_1MGCPEndpoint.html#4a7bd56fb99593ace9379ed699f2719c">00636</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& toString()<span class="keyword"> const</span> <a name="l00637"></a>00637 <span class="keyword"> </span>{ <span class="keywordflow">return</span> <a class="code" href="classTelEngine_1_1MGCPEndpointId.html#e537a056a2d8316444575696aa701bbd">MGCPEndpointId::id</a>(); } <a name="l00638"></a>00638 <a name="l00643"></a><a class="code" href="classTelEngine_1_1MGCPEndpoint.html#bebc8e9f0ca79286f4b1e6b98b8d706d">00643</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* engine() <a name="l00644"></a>00644 { <span class="keywordflow">return</span> m_engine; } <a name="l00645"></a>00645 <a name="l00656"></a>00656 <a class="code" href="classTelEngine_1_1MGCPEpInfo.html" title="Remote endpoint info class.">MGCPEpInfo</a>* append(<span class="keyword">const</span> <span class="keywordtype">char</span>* endpoint, <span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keywordtype">int</span> port = 0); <a name="l00657"></a>00657 <a name="l00661"></a><a class="code" href="classTelEngine_1_1MGCPEndpoint.html#c8bb3912a3ce86b15842e79d0b421204">00661</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> clear() <a name="l00662"></a>00662 { <a class="code" href="classTelEngine_1_1Lock.html" title="Ephemeral mutex locking object.">Lock</a> lock(m_mutex); m_remote.clear(); } <a name="l00663"></a>00663 <a name="l00669"></a>00669 <a class="code" href="classTelEngine_1_1MGCPEpInfo.html" title="Remote endpoint info class.">MGCPEpInfo</a>* find(<span class="keyword">const</span> <span class="keywordtype">char</span>* epId); <a name="l00670"></a>00670 <a name="l00675"></a>00675 <a class="code" href="classTelEngine_1_1MGCPEpInfo.html" title="Remote endpoint info class.">MGCPEpInfo</a>* peer(); <a name="l00676"></a>00676 <a name="l00677"></a>00677 <span class="keyword">private</span>: <a name="l00678"></a>00678 <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>* m_engine; <span class="comment">// The engine owning this endpoint</span> <a name="l00679"></a>00679 <a class="code" href="classTelEngine_1_1Mutex.html" title="Mutex support.">Mutex</a> m_mutex; <span class="comment">// Lock remote endpoint list</span> <a name="l00680"></a>00680 <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> m_remote; <span class="comment">// The remote endpoints</span> <a name="l00681"></a>00681 }; <a name="l00682"></a>00682 <a name="l00688"></a><a class="code" href="classTelEngine_1_1MGCPEvent.html">00688</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a> <a name="l00689"></a>00689 { <a name="l00690"></a>00690 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>; <a name="l00691"></a>00691 <span class="keyword">public</span>: <a name="l00695"></a>00695 ~<a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>(); <a name="l00696"></a>00696 <a name="l00701"></a><a class="code" href="classTelEngine_1_1MGCPEvent.html#df20c9bdd4d9770f07a73fc8ae4aeb0a">00701</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* transaction() <a name="l00702"></a>00702 { <span class="keywordflow">return</span> m_transaction; } <a name="l00703"></a>00703 <a name="l00708"></a><a class="code" href="classTelEngine_1_1MGCPEvent.html#e6e8d06bb5eee00a9ef972a41d42e773">00708</a> <span class="keyword">inline</span> <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* message()<span class="keyword"> const</span> <a name="l00709"></a>00709 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_message; } <a name="l00710"></a>00710 <a name="l00711"></a>00711 <span class="keyword">protected</span>: <a name="l00717"></a>00717 <a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>(<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* trans, <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg = 0); <a name="l00718"></a>00718 <a name="l00719"></a>00719 <span class="keyword">private</span>: <a name="l00720"></a>00720 <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* m_transaction; <span class="comment">// The transaction that generated this event</span> <a name="l00721"></a>00721 <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* m_message; <span class="comment">// The message carried by this event, if any</span> <a name="l00722"></a>00722 }; <a name="l00723"></a>00723 <a name="l00724"></a>00724 <span class="keyword">class </span>MGCPPrivateThread; <a name="l00725"></a>00725 <a name="l00735"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html">00735</a> <span class="keyword">class </span>YMGCP_API <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a> : <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1DebugEnabler.html" title="A holder for a debug level.">DebugEnabler</a>, <span class="keyword">public</span> <a class="code" href="classTelEngine_1_1Mutex.html" title="Mutex support.">Mutex</a> <a name="l00736"></a>00736 { <a name="l00737"></a>00737 <span class="keyword">friend</span> <span class="keyword">class </span>MGCPPrivateThread; <a name="l00738"></a>00738 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>; <a name="l00739"></a>00739 <span class="keyword">public</span>: <a name="l00747"></a>00747 <a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>(<span class="keywordtype">bool</span> gateway, <span class="keyword">const</span> <span class="keywordtype">char</span>* name = 0, <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1NamedList.html" title="A named string container class.">NamedList</a>* params = 0); <a name="l00748"></a>00748 <a name="l00752"></a>00752 <span class="keyword">virtual</span> ~<a class="code" href="classTelEngine_1_1MGCPEngine.html" title="An MGCP engine.">MGCPEngine</a>(); <a name="l00753"></a>00753 <a name="l00759"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#168174f35fe6d3d17c20839448376efb">00759</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> gateway()<span class="keyword"> const</span> <a name="l00760"></a>00760 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_gateway; } <a name="l00761"></a>00761 <a name="l00766"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#1a00da71a0c9df62d14f8d1e7114c021">00766</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& address()<span class="keyword"> const</span> <a name="l00767"></a>00767 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_address; } <a name="l00768"></a>00768 <a name="l00774"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#ac104bca0ab22dcd26b796eea471da91">00774</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxRecvPacket()<span class="keyword"> const</span> <a name="l00775"></a>00775 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_maxRecvPacket; } <a name="l00776"></a>00776 <a name="l00781"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#5d51bafd1d4e1dff30c40d6d52e4d844">00781</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> allowUnkCmd()<span class="keyword"> const</span> <a name="l00782"></a>00782 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_allowUnkCmd; } <a name="l00783"></a>00783 <a name="l00788"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#88c56d2063408582e7552ce192c90405">00788</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> retransInterval()<span class="keyword"> const</span> <a name="l00789"></a>00789 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_retransInterval; } <a name="l00790"></a>00790 <a name="l00795"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#2d304cf8c7eba13b49b81eab25d86bde">00795</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> retransCount()<span class="keyword"> const</span> <a name="l00796"></a>00796 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_retransCount; } <a name="l00797"></a>00797 <a name="l00802"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#f9c23c36f24050cebfcfc083cb1b36f9">00802</a> <span class="keyword">inline</span> u_int64_t extraTime()<span class="keyword"> const</span> <a name="l00803"></a>00803 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_extraTime; } <a name="l00804"></a>00804 <a name="l00809"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#6674c17b17efa7dcd0d131597958e24d">00809</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> parseParamToLower()<span class="keyword"> const</span> <a name="l00810"></a>00810 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_parseParamToLower; } <a name="l00811"></a>00811 <a name="l00816"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#4efabab8aab5d7b07d963fcfee88164b">00816</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> provisional()<span class="keyword"> const</span> <a name="l00817"></a>00817 <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_provisional; } <a name="l00818"></a>00818 <a name="l00823"></a>00823 <span class="keyword">virtual</span> <span class="keywordtype">void</span> initialize(<span class="keyword">const</span> <a class="code" href="classTelEngine_1_1NamedList.html" title="A named string container class.">NamedList</a>& params); <a name="l00824"></a>00824 <a name="l00830"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#976d53872adfb40020aed036ba20c1a3">00830</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> knownCommand(<span class="keyword">const</span> <span class="keywordtype">char</span>* cmd) <a name="l00831"></a>00831 { <a class="code" href="classTelEngine_1_1Lock.html" title="Ephemeral mutex locking object.">Lock</a> lock(<span class="keyword">this</span>); <span class="keywordflow">return</span> (m_knownCommands.find(cmd) != 0); } <a name="l00832"></a>00832 <a name="l00837"></a>00837 <span class="keywordtype">void</span> addCommand(<span class="keyword">const</span> <span class="keywordtype">char</span>* cmd); <a name="l00838"></a>00838 <a name="l00843"></a>00843 <span class="keywordtype">void</span> attach(<a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>* ep); <a name="l00844"></a>00844 <a name="l00852"></a>00852 <span class="keywordtype">void</span> detach(<a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>* ep, <span class="keywordtype">bool</span> del = <span class="keyword">false</span>, <span class="keywordtype">bool</span> delTrans = <span class="keyword">false</span>); <a name="l00853"></a>00853 <a name="l00859"></a>00859 <a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>* findEp(<a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>* ep); <a name="l00860"></a>00860 <a name="l00866"></a>00866 <a class="code" href="classTelEngine_1_1MGCPEndpoint.html" title="An MGCP endpoint.">MGCPEndpoint</a>* findEp(<span class="keyword">const</span> <span class="keywordtype">char</span>* epId); <a name="l00867"></a>00867 <a name="l00874"></a>00874 <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* findTrans(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <span class="keywordtype">id</span>, <span class="keywordtype">bool</span> outgoing); <a name="l00875"></a>00875 <a name="l00880"></a>00880 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getNextId(); <a name="l00881"></a>00881 <a name="l00889"></a>00889 <a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* sendCommand(<a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* cmd, <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& address); <a name="l00890"></a>00890 <a name="l00898"></a>00898 <span class="keywordtype">bool</span> receive(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& addr); <a name="l00899"></a>00899 <a name="l00908"></a>00908 <span class="keywordtype">bool</span> process(u_int64_t time = <a class="code" href="classTelEngine_1_1Time.html" title="A time holding class.">Time</a>()); <a name="l00909"></a>00909 <a name="l00913"></a>00913 <span class="keywordtype">void</span> runReceive(); <a name="l00914"></a>00914 <a name="l00918"></a>00918 <span class="keywordtype">void</span> runProcess(); <a name="l00919"></a>00919 <a name="l00925"></a>00925 <a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* getEvent(u_int64_t time = <a class="code" href="classTelEngine_1_1Time.html" title="A time holding class.">Time</a>()); <a name="l00926"></a>00926 <a name="l00935"></a>00935 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> processEvent(<a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* event); <a name="l00936"></a>00936 <a name="l00946"></a>00946 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> processEvent(<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* trans, <a class="code" href="classTelEngine_1_1MGCPMessage.html" title="An MGCP command or response.">MGCPMessage</a>* msg, <span class="keywordtype">void</span>* data); <a name="l00947"></a>00947 <a name="l00954"></a>00954 <span class="keywordtype">void</span> returnEvent(<a class="code" href="classTelEngine_1_1MGCPEvent.html" title="An MGCP event.">MGCPEvent</a>* event); <a name="l00955"></a>00955 <a name="l00965"></a>00965 <span class="keywordtype">void</span> cleanup(<span class="keywordtype">bool</span> gracefully = <span class="keyword">true</span>, <span class="keyword">const</span> <span class="keywordtype">char</span>* text = <span class="stringliteral">"Shutdown"</span>); <a name="l00966"></a>00966 <a name="l00973"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#bfd7758491f107aaedb7597005527947">00973</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> defaultPort(<span class="keywordtype">bool</span> gateway) <a name="l00974"></a>00974 { <span class="keywordflow">return</span> gateway ? 2427 : 2727; } <a name="l00975"></a>00975 <a name="l00979"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#2c711c367f67df7d917dda157c3fe7de">00979</a> <span class="keyword">static</span> <a class="code" href="structTelEngine_1_1TokenDict.html">TokenDict</a> mgcp_commands[]; <a name="l00980"></a>00980 <a name="l00984"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#6cac4026a904ddfd6fa3dd3d4ff820b4">00984</a> <span class="keyword">static</span> <a class="code" href="structTelEngine_1_1TokenDict.html">TokenDict</a> mgcp_responses[]; <a name="l00985"></a>00985 <a name="l00993"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#2f214ff6343dbc810542a7d08d4d20a8">00993</a> <span class="keyword">static</span> <a class="code" href="structTelEngine_1_1TokenDict.html">TokenDict</a> mgcp_reasons[]; <a name="l00994"></a>00994 <a name="l00995"></a>00995 <span class="keyword">protected</span>: <a name="l01002"></a>01002 <span class="keywordtype">bool</span> sendData(<span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& msg, <span class="keyword">const</span> <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a>& address); <a name="l01003"></a>01003 <a name="l01008"></a>01008 <span class="keywordtype">void</span> appendTrans(<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* trans); <a name="l01009"></a>01009 <a name="l01015"></a>01015 <span class="keywordtype">void</span> removeTrans(<a class="code" href="classTelEngine_1_1MGCPTransaction.html" title="An MGCP transaction.">MGCPTransaction</a>* trans, <span class="keywordtype">bool</span> del); <a name="l01016"></a>01016 <a name="l01020"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#3ba285e2c3097fca9bc29494e68e8b6d">01020</a> <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> m_endpoints; <a name="l01021"></a>01021 <a name="l01025"></a><a class="code" href="classTelEngine_1_1MGCPEngine.html#308f1907148deb68d7418dca6d7b662c">01025</a> <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> m_transactions; <a name="l01026"></a>01026 <a name="l01027"></a>01027 <span class="keyword">private</span>: <a name="l01028"></a>01028 <span class="comment">// Append a private thread to the list</span> <a name="l01029"></a>01029 <span class="keywordtype">void</span> appendThread(MGCPPrivateThread* thread); <a name="l01030"></a>01030 <span class="comment">// Remove private thread from the list without deleting it</span> <a name="l01031"></a>01031 <span class="keywordtype">void</span> removeThread(MGCPPrivateThread* thread); <a name="l01032"></a>01032 <span class="comment">// Process ACK received with a message or response</span> <a name="l01033"></a>01033 <span class="comment">// Return a list of ack'd transactions or 0 if the parameter is incorrect</span> <a name="l01034"></a>01034 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>* decodeAck(<span class="keyword">const</span> <a class="code" href="classTelEngine_1_1String.html" title="A C-style string handling class.">String</a>& param, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> & count); <a name="l01035"></a>01035 <a name="l01036"></a>01036 <span class="keywordtype">bool</span> m_gateway; <span class="comment">// True if this engine is an MGCP gateway, false if call agent</span> <a name="l01037"></a>01037 <span class="keywordtype">bool</span> m_initialized; <span class="comment">// True if the engine was already initialized</span> <a name="l01038"></a>01038 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_nextId; <span class="comment">// Next outgoing transaction id</span> <a name="l01039"></a>01039 <a class="code" href="classTelEngine_1_1Socket.html" title="A generic socket class.">Socket</a> m_socket; <span class="comment">// The socket used to send/receive data</span> <a name="l01040"></a>01040 <a class="code" href="classTelEngine_1_1SocketAddr.html" title="A socket address holder.">SocketAddr</a> m_address; <span class="comment">// The IP address used by this engine</span> <a name="l01041"></a>01041 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_maxRecvPacket; <span class="comment">// The maximum length or received packets</span> <a name="l01042"></a>01042 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* m_recvBuf; <span class="comment">// Receiving buffer</span> <a name="l01043"></a>01043 <span class="keywordtype">bool</span> m_allowUnkCmd; <span class="comment">// Allow this engine to send/accept unknown commands</span> <a name="l01044"></a>01044 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_retransInterval; <span class="comment">// Message retransmission interval</span> <a name="l01045"></a>01045 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_retransCount; <span class="comment">// Maximum number of retransmissions for a message</span> <a name="l01046"></a>01046 u_int64_t m_extraTime; <span class="comment">// Time to live after the transaction terminated gracefully</span> <a name="l01047"></a>01047 <span class="keywordtype">bool</span> m_parseParamToLower; <span class="comment">// Convert received messages' params to lower case</span> <a name="l01048"></a>01048 <span class="keywordtype">bool</span> m_provisional; <span class="comment">// Send provisional responses flag</span> <a name="l01049"></a>01049 <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> m_knownCommands; <span class="comment">// The list of known commands</span> <a name="l01050"></a>01050 <a class="code" href="classTelEngine_1_1ObjList.html" title="An object list class.">ObjList</a> m_threads; <a name="l01051"></a>01051 }; <a name="l01052"></a>01052 <a name="l01053"></a>01053 } <a name="l01054"></a>01054 <a name="l01055"></a>01055 <span class="preprocessor">#endif </span><span class="comment">/* __YATEMGCP_H */</span> <a name="l01056"></a>01056 <a name="l01057"></a>01057 <span class="comment">/* vi: set ts=8 sw=4 sts=4 noet: */</span> </pre></div></div> <hr size="1"><address style="text-align: right;"><small>Generated on Sun Dec 7 21:36:10 2008 for Yate by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.7.1 </small></address> </body> </html>