Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > 9601c7beb4ff23e834bfa171795ed560 > files > 367

vidalia-0.2.9-1mdv2010.1.i586.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Vidalia: UPNPControl.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;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>
      <li><a href="dirs.html"><span>Directories</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
  <div class="navpath"><a class="el" href="dir_b47abd1aad201a152869566145babb61.html">src</a>&nbsp;&raquo;&nbsp;<a class="el" href="dir_695ba8f8357372e02d38c40b3c6dbe81.html">vidalia</a>&nbsp;&raquo;&nbsp;<a class="el" href="dir_738aec08306f4b898e01f7a551299457.html">config</a>
  </div>
</div>
<div class="contents">
<h1>UPNPControl.cpp</h1><a href="_u_p_n_p_control_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">**  This file is part of Vidalia, and is subject to the license terms in the</span>
<a name="l00003"></a>00003 <span class="comment">**  LICENSE file, found in the top level directory of this distribution. If </span>
<a name="l00004"></a>00004 <span class="comment">**  you did not receive the LICENSE file with this file, you may obtain it</span>
<a name="l00005"></a>00005 <span class="comment">**  from the Vidalia source package distributed by the Vidalia Project at</span>
<a name="l00006"></a>00006 <span class="comment">**  http://www.vidalia-project.net/. No part of Vidalia, including this file,</span>
<a name="l00007"></a>00007 <span class="comment">**  may be copied, modified, propagated, or distributed except according to</span>
<a name="l00008"></a>00008 <span class="comment">**  the terms described in the LICENSE file.</span>
<a name="l00009"></a>00009 <span class="comment">*/</span>
<a name="l00010"></a>00010 
<a name="l00011"></a>00011 <span class="comment">/* </span>
<a name="l00012"></a>00012 <span class="comment">** \file UPNPControl.cpp</span>
<a name="l00013"></a>00013 <span class="comment">** \version $Id: UPNPControl.cpp 3803 2009-05-31 00:12:09Z edmanm $</span>
<a name="l00014"></a>00014 <span class="comment">** \brief Singleton object for interacting with UPNP device</span>
<a name="l00015"></a>00015 <span class="comment">*/</span>
<a name="l00016"></a>00016 
<a name="l00017"></a>00017 <span class="preprocessor">#include &quot;<a class="code" href="_u_p_n_p_control_8h.html">UPNPControl.h</a>&quot;</span>
<a name="l00018"></a>00018 <span class="preprocessor">#include &quot;<a class="code" href="_u_p_n_p_control_thread_8h.html">UPNPControlThread.h</a>&quot;</span>
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="preprocessor">#include &lt;QMutex&gt;</span>
<a name="l00021"></a>00021 <span class="preprocessor">#include &lt;QMetaType&gt;</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#ifdef Q_OS_WIN32</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#include &lt;winsock2.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#endif</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="comment"></span>
<a name="l00028"></a>00028 <span class="comment">/** UPNPControl singleton instance. */</span>
<a name="l00029"></a>00029 <a class="code" href="class_u_p_n_p_control.html">UPNPControl</a>* <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">UPNPControl::_instance</a> = 0;
<a name="l00030"></a>00030 <span class="comment"></span>
<a name="l00031"></a>00031 <span class="comment">/** Returns a pointer to this object&#39;s singleton instance. */</span>
<a name="l00032"></a><a class="code" href="class_u_p_n_p_control.html#a5046fdfc0449019c8d1e21ac0918dbb1">00032</a> <a class="code" href="class_u_p_n_p_control.html">UPNPControl</a>* <a class="code" href="class_u_p_n_p_control.html#a5046fdfc0449019c8d1e21ac0918dbb1">UPNPControl::instance</a>()
<a name="l00033"></a>00033 {
<a name="l00034"></a>00034   <span class="keywordflow">if</span> (0 == <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a>) {
<a name="l00035"></a>00035     <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a> = <span class="keyword">new</span> <a class="code" href="class_u_p_n_p_control.html#ac823462f9671ea83b352e43422a8a6c2">UPNPControl</a>();
<a name="l00036"></a>00036     <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a>-&gt;<a class="code" href="class_u_p_n_p_control.html#af01229e146c92e268509cf2a2de436cb">_controlThread</a>-&gt;start();
<a name="l00037"></a>00037   }
<a name="l00038"></a>00038   <span class="keywordflow">return</span> <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a>;
<a name="l00039"></a>00039 }
<a name="l00040"></a>00040 <span class="comment"></span>
<a name="l00041"></a>00041 <span class="comment">/** Constructor. Initializes and starts a thread in which all blocking UPnP</span>
<a name="l00042"></a>00042 <span class="comment"> * operations will be performed. */</span>
<a name="l00043"></a><a class="code" href="class_u_p_n_p_control.html#ac823462f9671ea83b352e43422a8a6c2">00043</a> <a class="code" href="class_u_p_n_p_control.html#ac823462f9671ea83b352e43422a8a6c2">UPNPControl::UPNPControl</a>()
<a name="l00044"></a>00044 {
<a name="l00045"></a>00045   <a class="code" href="class_u_p_n_p_control.html#a326849504aec23443ff2dd59d6569be9">_forwardedORPort</a> = 0;
<a name="l00046"></a>00046   <a class="code" href="class_u_p_n_p_control.html#a78c6d73b9353be6f800738075fe50749">_forwardedDirPort</a> = 0;
<a name="l00047"></a>00047   <a class="code" href="class_u_p_n_p_control.html#aee3ca68e15bb7ffc3a7e546ad93f5b53">_error</a> = <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a988ad663d191e4ce0a10fd36325cfbba">UnknownError</a>;
<a name="l00048"></a>00048   <a class="code" href="class_u_p_n_p_control.html#a56a18baa17169a07f18a08d61da43468">_state</a> = <a class="code" href="class_u_p_n_p_control.html#acd04a19f042494f03791de43c9db7396abcc30c0282363489914cb22d1e4f9f69">IdleState</a>;
<a name="l00049"></a>00049   
<a name="l00050"></a>00050   qRegisterMetaType&lt;UPNPControl::UPNPError&gt;(<span class="stringliteral">&quot;UPNPControl::UPNPError&quot;</span>);
<a name="l00051"></a>00051   qRegisterMetaType&lt;UPNPControl::UPNPState&gt;(<span class="stringliteral">&quot;UPNPControl::UPNPState&quot;</span>);
<a name="l00052"></a>00052 
<a name="l00053"></a>00053   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a> = <span class="keyword">new</span> QMutex();
<a name="l00054"></a>00054   <a class="code" href="class_u_p_n_p_control.html#af01229e146c92e268509cf2a2de436cb">_controlThread</a> = <span class="keyword">new</span> <a class="code" href="class_u_p_n_p_control.html#af20ee7c151c1a53c16eaa9416e4dd1f1">UPNPControlThread</a>(<span class="keyword">this</span>);
<a name="l00055"></a>00055 }
<a name="l00056"></a>00056 <span class="comment"></span>
<a name="l00057"></a>00057 <span class="comment">/** Destructor. cleanup() should be called before the object is destroyed.</span>
<a name="l00058"></a>00058 <span class="comment"> * \sa cleanup()</span>
<a name="l00059"></a>00059 <span class="comment"> */</span>
<a name="l00060"></a><a class="code" href="class_u_p_n_p_control.html#a467e7ccd9fe3d8229407176283e24870">00060</a> <a class="code" href="class_u_p_n_p_control.html#a467e7ccd9fe3d8229407176283e24870">UPNPControl::~UPNPControl</a>()
<a name="l00061"></a>00061 {
<a name="l00062"></a>00062   <span class="keyword">delete</span> <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>;
<a name="l00063"></a>00063   <span class="keyword">delete</span> <a class="code" href="class_u_p_n_p_control.html#af01229e146c92e268509cf2a2de436cb">_controlThread</a>;
<a name="l00064"></a>00064 }
<a name="l00065"></a>00065 <span class="comment"></span>
<a name="l00066"></a>00066 <span class="comment">/** Terminates the UPnP control thread and frees memory allocated to this</span>
<a name="l00067"></a>00067 <span class="comment"> * object&#39;s singleton instance. */</span>
<a name="l00068"></a>00068 <span class="keywordtype">void</span>
<a name="l00069"></a><a class="code" href="class_u_p_n_p_control.html#a08d919527cbffb92e9025d97f726ffbf">00069</a> <a class="code" href="class_u_p_n_p_control.html#a08d919527cbffb92e9025d97f726ffbf">UPNPControl::cleanup</a>()
<a name="l00070"></a>00070 {
<a name="l00071"></a>00071   <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a>-&gt;<a class="code" href="class_u_p_n_p_control.html#af01229e146c92e268509cf2a2de436cb">_controlThread</a>-&gt;<a class="code" href="class_u_p_n_p_control_thread.html#a40f18f372042ea896ea1b84327baa715">stop</a>();
<a name="l00072"></a>00072   <span class="keyword">delete</span> <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a>;
<a name="l00073"></a>00073   <a class="code" href="class_u_p_n_p_control.html#afc461959262012319ff4cfd81b325ef0">_instance</a> = 0;
<a name="l00074"></a>00074 }  
<a name="l00075"></a>00075 <span class="comment"></span>
<a name="l00076"></a>00076 <span class="comment">/** Sets &lt;b&gt;desiredDirPort&lt;/b&gt; and &lt;b&gt;desiredOrPort&lt;/b&gt; to the currently</span>
<a name="l00077"></a>00077 <span class="comment"> * forwarded DirPort and ORPort values. */</span>
<a name="l00078"></a>00078 <span class="keywordtype">void</span>
<a name="l00079"></a><a class="code" href="class_u_p_n_p_control.html#a59027db8f6d2b6ffa35b15c8546b75e2">00079</a> <a class="code" href="class_u_p_n_p_control.html#a59027db8f6d2b6ffa35b15c8546b75e2">UPNPControl::getDesiredState</a>(quint16 *desiredDirPort, quint16 *desiredOrPort)
<a name="l00080"></a>00080 {
<a name="l00081"></a>00081   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;lock();
<a name="l00082"></a>00082   *desiredDirPort = <a class="code" href="class_u_p_n_p_control.html#a78c6d73b9353be6f800738075fe50749">_forwardedDirPort</a>;
<a name="l00083"></a>00083   *desiredOrPort = <a class="code" href="class_u_p_n_p_control.html#a326849504aec23443ff2dd59d6569be9">_forwardedORPort</a>;
<a name="l00084"></a>00084   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;unlock();
<a name="l00085"></a>00085 }
<a name="l00086"></a>00086 <span class="comment"></span>
<a name="l00087"></a>00087 <span class="comment">/** Sets the desired DirPort and ORPort port mappings to &lt;b&gt;desiredDirPort&lt;/b&gt;</span>
<a name="l00088"></a>00088 <span class="comment"> * and &lt;b&gt;desiredOrPort&lt;/b&gt;, respectively. */</span>
<a name="l00089"></a>00089 <span class="keywordtype">void</span>
<a name="l00090"></a><a class="code" href="class_u_p_n_p_control.html#a32326c4e812a710434a747e89bdce54f">00090</a> <a class="code" href="class_u_p_n_p_control.html#a32326c4e812a710434a747e89bdce54f">UPNPControl::setDesiredState</a>(quint16 desiredDirPort, quint16 desiredOrPort)
<a name="l00091"></a>00091 {
<a name="l00092"></a>00092   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;lock();
<a name="l00093"></a>00093   <a class="code" href="class_u_p_n_p_control.html#a78c6d73b9353be6f800738075fe50749">_forwardedDirPort</a> = desiredDirPort;
<a name="l00094"></a>00094   <a class="code" href="class_u_p_n_p_control.html#a326849504aec23443ff2dd59d6569be9">_forwardedORPort</a> = desiredOrPort;
<a name="l00095"></a>00095   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;unlock();
<a name="l00096"></a>00096   
<a name="l00097"></a>00097   <a class="code" href="class_u_p_n_p_control.html#af01229e146c92e268509cf2a2de436cb">_controlThread</a>-&gt;<a class="code" href="class_u_p_n_p_control_thread.html#a6b124158f9496b2da905c405aba7c321">wakeup</a>();
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099 <span class="comment"></span>
<a name="l00100"></a>00100 <span class="comment">/** Sets the most recent UPnP-related error to &lt;b&gt;error&lt;/b&gt; and emits the</span>
<a name="l00101"></a>00101 <span class="comment"> * error() signal. */</span>
<a name="l00102"></a>00102 <span class="keywordtype">void</span>
<a name="l00103"></a><a class="code" href="class_u_p_n_p_control.html#a895b541c8a1d9a027c22e2abd25ffdd5">00103</a> <a class="code" href="class_u_p_n_p_control.html#a895b541c8a1d9a027c22e2abd25ffdd5">UPNPControl::setError</a>(<a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPError</a> upnpError)
<a name="l00104"></a>00104 {
<a name="l00105"></a>00105   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;lock();
<a name="l00106"></a>00106   <a class="code" href="class_u_p_n_p_control.html#aee3ca68e15bb7ffc3a7e546ad93f5b53">_error</a> = upnpError;
<a name="l00107"></a>00107   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;unlock();
<a name="l00108"></a>00108   
<a name="l00109"></a>00109   emit <a class="code" href="class_u_p_n_p_control.html#a941024fcfa7f67304e11c7fe2ce7f8d7">error</a>(upnpError);
<a name="l00110"></a>00110 }
<a name="l00111"></a>00111 <span class="comment"></span>
<a name="l00112"></a>00112 <span class="comment">/** Sets the current UPnP state to &lt;b&gt;state&lt;/b&gt; and emits the stateChanged()</span>
<a name="l00113"></a>00113 <span class="comment"> * signal. */</span>
<a name="l00114"></a>00114 <span class="keywordtype">void</span>
<a name="l00115"></a><a class="code" href="class_u_p_n_p_control.html#a0fe4d42fd0dd95787db3ba26e56b29fc">00115</a> <a class="code" href="class_u_p_n_p_control.html#a0fe4d42fd0dd95787db3ba26e56b29fc">UPNPControl::setState</a>(<a class="code" href="class_u_p_n_p_control.html#acd04a19f042494f03791de43c9db7396">UPNPState</a> state)
<a name="l00116"></a>00116 {
<a name="l00117"></a>00117   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;lock();
<a name="l00118"></a>00118   <a class="code" href="class_u_p_n_p_control.html#a56a18baa17169a07f18a08d61da43468">_state</a> = state;
<a name="l00119"></a>00119   <a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>-&gt;unlock();
<a name="l00120"></a>00120 
<a name="l00121"></a>00121   emit <a class="code" href="class_u_p_n_p_control.html#a56257a858317cab629205b1e1011bf9f">stateChanged</a>(state);
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123 <span class="comment"></span>
<a name="l00124"></a>00124 <span class="comment">/** Returns the type of error that occurred last. */</span>
<a name="l00125"></a>00125 <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPControl::UPNPError</a>
<a name="l00126"></a><a class="code" href="class_u_p_n_p_control.html#a941024fcfa7f67304e11c7fe2ce7f8d7">00126</a> <a class="code" href="class_u_p_n_p_control.html#a941024fcfa7f67304e11c7fe2ce7f8d7">UPNPControl::error</a>()<span class="keyword"> const</span>
<a name="l00127"></a>00127 <span class="keyword"></span>{
<a name="l00128"></a>00128   QMutexLocker locker(<a class="code" href="class_u_p_n_p_control.html#a744ffebc1be3852ba49efdae2d1d057a">_mutex</a>);
<a name="l00129"></a>00129   <span class="keywordflow">return</span> <a class="code" href="class_u_p_n_p_control.html#aee3ca68e15bb7ffc3a7e546ad93f5b53">_error</a>;
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131 <span class="comment"></span>
<a name="l00132"></a>00132 <span class="comment">/** Returns a QString describing the type of error that occurred last. */</span>
<a name="l00133"></a>00133 QString
<a name="l00134"></a><a class="code" href="class_u_p_n_p_control.html#af61f6a46d938bbccf68b760fa69e3da6">00134</a> <a class="code" href="class_u_p_n_p_control.html#af61f6a46d938bbccf68b760fa69e3da6">UPNPControl::errorString</a>()<span class="keyword"> const</span>
<a name="l00135"></a>00135 <span class="keyword"></span>{
<a name="l00136"></a>00136   <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPError</a> <a class="code" href="class_u_p_n_p_control.html#a941024fcfa7f67304e11c7fe2ce7f8d7">error</a> = this-&gt;<a class="code" href="class_u_p_n_p_control.html#a941024fcfa7f67304e11c7fe2ce7f8d7">error</a>();
<a name="l00137"></a>00137 
<a name="l00138"></a>00138   <span class="keywordflow">switch</span> (error) {
<a name="l00139"></a>00139     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5aefc2ed7fb13975e2e50dcb4d78909c7b">Success</a>:
<a name="l00140"></a>00140       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;Success&quot;</span>);
<a name="l00141"></a>00141     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a355b28f8cc5e9f5572db67eea459a033">NoUPNPDevicesFound</a>:
<a name="l00142"></a>00142       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;No UPnP-enabled devices found&quot;</span>);
<a name="l00143"></a>00143     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a93e496450844e546109dfd030ad799d2">NoValidIGDsFound</a>:
<a name="l00144"></a>00144       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;No valid UPnP-enabled Internet gateway devices found&quot;</span>);
<a name="l00145"></a>00145     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5aa9294f6e82c07e7fb68e10140613d8fd">WSAStartupFailed</a>:
<a name="l00146"></a>00146       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;WSAStartup failed&quot;</span>);
<a name="l00147"></a>00147     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a2919dfdd27c25dcfea14b998bff48ad8">AddPortMappingFailed</a>:
<a name="l00148"></a>00148       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;Failed to add a port mapping&quot;</span>);
<a name="l00149"></a>00149     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a30741c851bc477d550f8ff35c8ab7c95">GetPortMappingFailed</a>:
<a name="l00150"></a>00150       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;Failed to retrieve a port mapping&quot;</span>);
<a name="l00151"></a>00151     <span class="keywordflow">case</span> <a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5a8e86abceff27323e95ed817172b0d8aa">DeletePortMappingFailed</a>:
<a name="l00152"></a>00152       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;Failed to remove a port mapping&quot;</span>);
<a name="l00153"></a>00153     <span class="keywordflow">default</span>:
<a name="l00154"></a>00154       <span class="keywordflow">return</span> tr(<span class="stringliteral">&quot;Unknown error&quot;</span>);
<a name="l00155"></a>00155   }
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157 <span class="comment"></span>
<a name="l00158"></a>00158 <span class="comment">/** Returns the number of milliseconds to wait for devices to respond</span>
<a name="l00159"></a>00159 <span class="comment"> * when attempting to discover UPnP-enabled IGDs. */</span>
<a name="l00160"></a>00160 <span class="keywordtype">int</span>
<a name="l00161"></a><a class="code" href="class_u_p_n_p_control.html#a07279abb8640c54c0febd7c9bea2212a">00161</a> <a class="code" href="class_u_p_n_p_control.html#a07279abb8640c54c0febd7c9bea2212a">UPNPControl::discoverTimeout</a>()<span class="keyword"> const</span>
<a name="l00162"></a>00162 <span class="keyword"></span>{
<a name="l00163"></a>00163   <span class="keywordflow">return</span> <a class="code" href="class_u_p_n_p_control_thread.html#afd5cb7c165c3094a209905ec860f750b">UPNPControlThread::UPNPCONTROL_DISCOVER_TIMEOUT</a>;
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165 
</pre></div></div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Mon Aug 30 22:58:55 2010 for Vidalia by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>