Sophie

Sophie

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

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: MainWindow.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>
  </div>
</div>
<div class="contents">
<h1>MainWindow.cpp</h1><a href="_main_window_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 you</span>
<a name="l00004"></a>00004 <span class="comment">**  did not receive the LICENSE file with this file, you may obtain it from the</span>
<a name="l00005"></a>00005 <span class="comment">**  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 the</span>
<a name="l00008"></a>00008 <span class="comment">**  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 MainWindow.cpp</span>
<a name="l00013"></a>00013 <span class="comment">** \version $Id: MainWindow.cpp 4227 2010-02-25 04:03:32Z edmanm $</span>
<a name="l00014"></a>00014 <span class="comment">** \brief Main (hidden) window. Creates tray menu and child windows</span>
<a name="l00015"></a>00015 <span class="comment">**</span>
<a name="l00016"></a>00016 <span class="comment">** Implements the main window. The main window is a hidden window that serves</span>
<a name="l00017"></a>00017 <span class="comment">** as the parent of the tray icon and popup menu, as well as other application</span>
<a name="l00018"></a>00018 <span class="comment">** dialogs.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 <span class="preprocessor">#include &quot;<a class="code" href="_main_window_8h.html">MainWindow.h</a>&quot;</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include &quot;<a class="code" href="_vidalia_8h.html">Vidalia.h</a>&quot;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &quot;<a class="code" href="_v_message_box_8h.html">VMessageBox.h</a>&quot;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &quot;<a class="code" href="_control_password_input_dialog_8h.html">ControlPasswordInputDialog.h</a>&quot;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;<a class="code" href="_tor_settings_8h.html">TorSettings.h</a>&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &quot;<a class="code" href="_server_settings_8h.html">ServerSettings.h</a>&quot;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#ifdef USE_AUTOUPDATE</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="_updates_available_dialog_8h.html">UpdatesAvailableDialog.h</a>&quot;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &quot;<a class="code" href="_protocol_info_8h.html">ProtocolInfo.h</a>&quot;</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="preprocessor">#include &quot;<a class="code" href="net_8h.html">net.h</a>&quot;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &quot;<a class="code" href="file_8h.html">file.h</a>&quot;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &quot;<a class="code" href="html_8h.html">html.h</a>&quot;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &quot;<a class="code" href="stringutil_8h.html">stringutil.h</a>&quot;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &quot;<a class="code" href="procutil_8h.html">procutil.h</a>&quot;</span>
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;QMenuBar&gt;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;QTimer&gt;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &lt;QTextStream&gt;</span>
<a name="l00042"></a>00042 
<a name="l00043"></a><a class="code" href="_main_window_8cpp.html#a045a90b6bbb08b84fed00af0648273ff">00043</a> <span class="preprocessor">#define IMG_BWGRAPH        &quot;:/images/16x16/utilities-system-monitor.png&quot;</span>
<a name="l00044"></a><a class="code" href="_main_window_8cpp.html#a8a13a53652d88f090625765ba63b94bb">00044</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_CONTROL_PANEL  &quot;:/images/16x16/system-run.png&quot;</span>
<a name="l00045"></a><a class="code" href="_main_window_8cpp.html#aa700f74731e94657f68c61777fde6b65">00045</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_MESSAGELOG     &quot;:/images/16x16/format-justify-fill.png&quot;</span>
<a name="l00046"></a><a class="code" href="_main_window_8cpp.html#a899a03e423fd4fe2788aa3e27927be8c">00046</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_CONFIG         &quot;:/images/16x16/preferences-system.png&quot;</span>
<a name="l00047"></a><a class="code" href="_main_window_8cpp.html#ae1c01101c40d140f8f029fdfd5a3b9d0">00047</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_IDENTITY       &quot;:/images/16x16/view-media-artist.png&quot;</span>
<a name="l00048"></a><a class="code" href="_main_window_8cpp.html#a5245ed0c06968f3e5558757155f4077c">00048</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_HELP           &quot;:/images/16x16/system-help.png&quot;</span>
<a name="l00049"></a><a class="code" href="_main_window_8cpp.html#a4d14a8389fc1e8e23b5569fa112f277e">00049</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_ABOUT          &quot;:/images/16x16/help-about.png&quot;</span>
<a name="l00050"></a><a class="code" href="_main_window_8cpp.html#afa5764360dd9ef0a59894b177e55c4eb">00050</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_EXIT           &quot;:/images/16x16/application-exit.png&quot;</span>
<a name="l00051"></a><a class="code" href="_main_window_8cpp.html#a179e56e7837f8aa5138505b758ede80b">00051</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_NETWORK        &quot;:/images/16x16/applications-internet.png&quot;</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span>
<a name="l00053"></a><a class="code" href="_main_window_8cpp.html#a6d07dc2f522cb6a2af85ea8dd1eb5aa2">00053</a> <span class="preprocessor">#define IMG_START_TOR_16     &quot;:/images/16x16/media-playback-start.png&quot;</span>
<a name="l00054"></a><a class="code" href="_main_window_8cpp.html#abf4eaa7a9958be4a9f08e426a053e1fa">00054</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_STOP_TOR_16      &quot;:/images/16x16/media-playback-stop.png&quot;</span>
<a name="l00055"></a><a class="code" href="_main_window_8cpp.html#af2706496f0bb49f7c4de05ca4006d5b6">00055</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_START_TOR_48     &quot;:/images/48x48/media-playback-start.png&quot;</span>
<a name="l00056"></a><a class="code" href="_main_window_8cpp.html#acfd3619cc4ff870cb449a34361b29eb3">00056</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_STOP_TOR_48      &quot;:/images/48x48/media-playback-stop.png&quot;</span>
<a name="l00057"></a><a class="code" href="_main_window_8cpp.html#a03f595d2ae395514e5e21ae0d367ef1b">00057</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPED_48   &quot;:/images/48x48/tor-off.png&quot;</span>
<a name="l00058"></a><a class="code" href="_main_window_8cpp.html#a58f61d2d3020f8835f2e8e0375afc25c">00058</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING_48   &quot;:/images/48x48/tor-on.png&quot;</span>
<a name="l00059"></a><a class="code" href="_main_window_8cpp.html#ad7a3492ca97d30f0addeb8d555897893">00059</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING_48  &quot;:/images/48x48/tor-starting.png&quot;</span>
<a name="l00060"></a><a class="code" href="_main_window_8cpp.html#a9e16a800c6629c796be65ebba396bf17">00060</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING_48  &quot;:/images/48x48/tor-stopping.png&quot;</span>
<a name="l00061"></a>00061 <span class="preprocessor"></span>
<a name="l00062"></a>00062 <span class="comment">/* Decide which of our four sets of tray icons to use. */</span>
<a name="l00063"></a>00063 <span class="preprocessor">#if defined(Q_WS_WIN)</span>
<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="comment">/* QSystemTrayIcon on Windows wants 16x16 .png files */</span>
<a name="l00065"></a>00065 <span class="preprocessor">#define IMG_TOR_STOPPED  &quot;:/images/16x16/tor-off.png&quot;</span>
<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING  &quot;:/images/16x16/tor-on.png&quot;</span>
<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING &quot;:/images/16x16/tor-starting.png&quot;</span>
<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING &quot;:/images/16x16/tor-stopping.png&quot;</span>
<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">#elif defined(Q_WS_MAC)</span>
<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="comment">/* On Mac, the dock icons look best at 128x128, otherwise they get blurry</span>
<a name="l00071"></a>00071 <span class="comment"> * if resized from a smaller image */</span>
<a name="l00072"></a>00072 <span class="preprocessor">#define IMG_TOR_STOPPED    &quot;:/images/128x128/tor-off.png&quot;</span>
<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING    &quot;:/images/128x128/tor-on.png&quot;</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING   &quot;:/images/128x128/tor-starting.png&quot;</span>
<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING   &quot;:/images/128x128/tor-stopping.png&quot;</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="keywordtype">void</span> qt_mac_set_dock_menu(QMenu *menu);
<a name="l00077"></a>00077 <span class="preprocessor">#else</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="comment">/* On X11, we just use always the 22x22 .png files */</span>
<a name="l00079"></a><a class="code" href="_main_window_8cpp.html#a20bf587fd524d3b78042503e6f351eed">00079</a> <span class="preprocessor">#define IMG_TOR_STOPPED    &quot;:/images/22x22/tor-off.png&quot;</span>
<a name="l00080"></a><a class="code" href="_main_window_8cpp.html#a487be156752666ac1b5bceff315ceebc">00080</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING    &quot;:/images/22x22/tor-on.png&quot;</span>
<a name="l00081"></a><a class="code" href="_main_window_8cpp.html#a3ef6ba1abb6e68e30ca070073daf1b7f">00081</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING   &quot;:/images/22x22/tor-starting.png&quot;</span>
<a name="l00082"></a><a class="code" href="_main_window_8cpp.html#ac3432d6232eb58995b8e47dab98b6f9b">00082</a> <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING   &quot;:/images/22x22/tor-stopping.png&quot;</span>
<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00085"></a>00085 <span class="comment">/** Only allow &#39;New Identity&#39; to be clicked once every 10 seconds. */</span>
<a name="l00086"></a><a class="code" href="_main_window_8cpp.html#a9294cc72470564d60b07d411b892cf8e">00086</a> <span class="preprocessor">#define MIN_NEWIDENTITY_INTERVAL   (10*1000)</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span>
<a name="l00088"></a>00088 <span class="comment">/* Startup progress milestones */</span>
<a name="l00089"></a><a class="code" href="_main_window_8cpp.html#a1a164e020d1d8485c6a5ffc9608022d7">00089</a> <span class="preprocessor">#define STARTUP_PROGRESS_STARTING          0</span>
<a name="l00090"></a><a class="code" href="_main_window_8cpp.html#a005d5b597965e382bb19900d14382086">00090</a> <span class="preprocessor"></span><span class="preprocessor">#define STARTUP_PROGRESS_CONNECTING       10</span>
<a name="l00091"></a><a class="code" href="_main_window_8cpp.html#a15aa337f73ec517f31dd9fec1e80119c">00091</a> <span class="preprocessor"></span><span class="preprocessor">#define STARTUP_PROGRESS_AUTHENTICATING   20</span>
<a name="l00092"></a><a class="code" href="_main_window_8cpp.html#a54d33d38b2080dfb533770861253ba06">00092</a> <span class="preprocessor"></span><span class="preprocessor">#define STARTUP_PROGRESS_BOOTSTRAPPING    30</span>
<a name="l00093"></a><a class="code" href="_main_window_8cpp.html#ac8406c5c56e12825d6b44415dab4c95a">00093</a> <span class="preprocessor"></span><span class="preprocessor">#define STARTUP_PROGRESS_CIRCUITBUILD     75</span>
<a name="l00094"></a><a class="code" href="_main_window_8cpp.html#a7559d1e6b2065bd330d1f7d199b1f82e">00094</a> <span class="preprocessor"></span><span class="preprocessor">#define STARTUP_PROGRESS_MAXIMUM          (STARTUP_PROGRESS_BOOTSTRAPPING+100)</span>
<a name="l00095"></a>00095 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00096"></a>00096 <span class="comment">/** Default constructor. It installs an icon in the system tray area and</span>
<a name="l00097"></a>00097 <span class="comment"> * creates the popup menu associated with that icon. */</span>
<a name="l00098"></a><a class="code" href="class_main_window.html#a34c4b4207b46d11a4100c9b19f0e81bb">00098</a> <a class="code" href="class_main_window.html#a34c4b4207b46d11a4100c9b19f0e81bb">MainWindow::MainWindow</a>()
<a name="l00099"></a>00099 : <a class="code" href="class_vidalia_window.html">VidaliaWindow</a>(<span class="stringliteral">&quot;MainWindow&quot;</span>)
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00102"></a>00102 
<a name="l00103"></a>00103   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.setupUi(<span class="keyword">this</span>);
<a name="l00104"></a>00104 
<a name="l00105"></a>00105   <span class="comment">/* Pressing &#39;Esc&#39; or &#39;Ctrl+W&#39; will close the window */</span>
<a name="l00106"></a>00106   <a class="code" href="class_vidalia.html#a4f28d73e2f92e6656f7c1c06d41b3569">Vidalia::createShortcut</a>(<span class="stringliteral">&quot;Ctrl+W&quot;</span>, <span class="keyword">this</span>, <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.btnHide, SLOT(click()));
<a name="l00107"></a>00107   <a class="code" href="class_vidalia.html#a4f28d73e2f92e6656f7c1c06d41b3569">Vidalia::createShortcut</a>(<span class="stringliteral">&quot;Esc&quot;</span>, <span class="keyword">this</span>, <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.btnHide, SLOT(click()));
<a name="l00108"></a>00108 
<a name="l00109"></a>00109   <span class="comment">/* Create all the dialogs of which we only want one instance */</span>
<a name="l00110"></a>00110   <a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>     = <span class="keyword">new</span> <a class="code" href="class_message_log.html">MessageLog</a>();
<a name="l00111"></a>00111   <a class="code" href="class_main_window.html#a8f07eb54991ddcde2b65df02654ef42d">_bandwidthGraph</a> = <span class="keyword">new</span> <a class="code" href="class_bandwidth_graph.html">BandwidthGraph</a>();
<a name="l00112"></a>00112   <a class="code" href="class_main_window.html#aef5538e4a008aea0ca0fec62ccbfdd6c">_netViewer</a>      = <span class="keyword">new</span> <a class="code" href="class_net_viewer.html">NetViewer</a>();
<a name="l00113"></a>00113   <a class="code" href="class_main_window.html#ab6fc7e274755ae4273226fb34ea3dbb4">_configDialog</a>   = <span class="keyword">new</span> <a class="code" href="class_config_dialog.html">ConfigDialog</a>();
<a name="l00114"></a>00114   <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>        = 0;
<a name="l00115"></a>00115   connect(<a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>, SIGNAL(<a class="code" href="class_vidalia_window.html#add0cc6c3beec0d1e18a3dd467a903e6c">helpRequested</a>(QString)),
<a name="l00116"></a>00116           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(QString)));
<a name="l00117"></a>00117   connect(<a class="code" href="class_main_window.html#aef5538e4a008aea0ca0fec62ccbfdd6c">_netViewer</a>, SIGNAL(<a class="code" href="class_vidalia_window.html#add0cc6c3beec0d1e18a3dd467a903e6c">helpRequested</a>(QString)),
<a name="l00118"></a>00118           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(QString)));
<a name="l00119"></a>00119   connect(<a class="code" href="class_main_window.html#ab6fc7e274755ae4273226fb34ea3dbb4">_configDialog</a>, SIGNAL(<a class="code" href="class_vidalia_window.html#add0cc6c3beec0d1e18a3dd467a903e6c">helpRequested</a>(QString)),
<a name="l00120"></a>00120           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(QString)));
<a name="l00121"></a>00121 
<a name="l00122"></a>00122   <span class="comment">/* Create the actions that will go in the tray menu */</span>
<a name="l00123"></a>00123   <a class="code" href="class_main_window.html#a62cd8712fb41a754298f6f60eead2cb0">createActions</a>();
<a name="l00124"></a>00124   <span class="comment">/* Creates a tray icon with a context menu and adds it to the system&#39;s</span>
<a name="l00125"></a>00125 <span class="comment">   * notification area. */</span>
<a name="l00126"></a>00126   <a class="code" href="class_main_window.html#aab6c1e834f96b09efe9c42766f171a74">createTrayIcon</a>();
<a name="l00127"></a>00127   <span class="comment">/* Start with Tor initially stopped */</span>
<a name="l00128"></a>00128   <a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a> = <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a064926bb857598a484dec9f867e12008">Unset</a>;
<a name="l00129"></a>00129   <a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a> = <span class="keyword">false</span>;
<a name="l00130"></a>00130   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>);
<a name="l00131"></a>00131 
<a name="l00132"></a>00132   <span class="comment">/* Create a new TorControl object, used to communicate with Tor */</span>
<a name="l00133"></a>00133   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a> = <a class="code" href="class_vidalia.html#a24c23bc8e35fcf66370d31ef176412d5">Vidalia::torControl</a>(); 
<a name="l00134"></a>00134   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a1669a3fdc8cc2ccf8afa534500af6b1c">started</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a1669a3fdc8cc2ccf8afa534500af6b1c">started</a>()));
<a name="l00135"></a>00135   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">startFailed</a>(QString)),
<a name="l00136"></a>00136           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">startFailed</a>(QString)));
<a name="l00137"></a>00137   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">stopped</a>(<span class="keywordtype">int</span>, QProcess::ExitStatus)),
<a name="l00138"></a>00138           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">stopped</a>(<span class="keywordtype">int</span>, QProcess::ExitStatus)));
<a name="l00139"></a>00139   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#ab0f207dba0ad81324d034d29988f8fd3">connected</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#ab0f207dba0ad81324d034d29988f8fd3">connected</a>()));
<a name="l00140"></a>00140   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#aa4f105b7d0e0c56c5051e89710c852d6">disconnected</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#aa4f105b7d0e0c56c5051e89710c852d6">disconnected</a>()));
<a name="l00141"></a>00141   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a5ea672c219719ce6cbf7a0386483123f">connectFailed</a>(QString)), 
<a name="l00142"></a>00142           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a5ea672c219719ce6cbf7a0386483123f">connectFailed</a>(QString)));
<a name="l00143"></a>00143   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a0f7533abcb80a89098b9c15a56c752b9">authenticated</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a0f7533abcb80a89098b9c15a56c752b9">authenticated</a>()));
<a name="l00144"></a>00144   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#aeb84f73e494a051fb3d06a87481d3af7">authenticationFailed</a>(QString)),
<a name="l00145"></a>00145           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#aeb84f73e494a051fb3d06a87481d3af7">authenticationFailed</a>(QString)));
<a name="l00146"></a>00146 
<a name="l00147"></a>00147   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ab3dd744e5f82c562ef380a8ca447c3a3">setEvent</a>(<a class="code" href="class_tor_events.html#a08aed30fd27832e89f96114617da72bfa0f4ce116650cb34661bfe23344562765">TorEvents::GeneralStatus</a>);
<a name="l00148"></a>00148   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a9a68029a06e5afdf7ab60ce3f36bd7a7">dangerousTorVersion</a>(<a class="code" href="namespacetc.html#a8389db682e80cb6921e26b529e2ec52c">tc::TorVersionStatus</a>,
<a name="l00149"></a>00149                                                   QString, QStringList)),
<a name="l00150"></a>00150           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a9a68029a06e5afdf7ab60ce3f36bd7a7">dangerousTorVersion</a>(<a class="code" href="namespacetc.html#a8389db682e80cb6921e26b529e2ec52c">tc::TorVersionStatus</a>,
<a name="l00151"></a>00151                                          QString, QStringList)));
<a name="l00152"></a>00152 
<a name="l00153"></a>00153   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ab3dd744e5f82c562ef380a8ca447c3a3">setEvent</a>(<a class="code" href="class_tor_events.html#a08aed30fd27832e89f96114617da72bfa5f1d41f1693f31d72e3e6c037cf7ff01">TorEvents::ClientStatus</a>);
<a name="l00154"></a>00154   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a2f43d1533e8e5fc43332c99d9eaad8c5">bootstrapStatusChanged</a>(<a class="code" href="class_bootstrap_status.html">BootstrapStatus</a>)),
<a name="l00155"></a>00155           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a2f43d1533e8e5fc43332c99d9eaad8c5">bootstrapStatusChanged</a>(<a class="code" href="class_bootstrap_status.html">BootstrapStatus</a>)));
<a name="l00156"></a>00156   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#aa7b2a36723485c373a6bf36c4ed1c6df">circuitEstablished</a>()),
<a name="l00157"></a>00157           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#aa7b2a36723485c373a6bf36c4ed1c6df">circuitEstablished</a>()));
<a name="l00158"></a>00158   connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(dangerousPort(quint16, <span class="keywordtype">bool</span>)),
<a name="l00159"></a>00159           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#aaa5ac1cb0792df8165ec6188934de4d6">warnDangerousPort</a>(quint16, <span class="keywordtype">bool</span>)));
<a name="l00160"></a>00160 
<a name="l00161"></a>00161   <span class="comment">/* Create a new HelperProcess object, used to start the web browser */</span>
<a name="l00162"></a>00162   <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a> = <span class="keyword">new</span> <a class="code" href="class_helper_process.html">HelperProcess</a>(<span class="keyword">this</span>);
<a name="l00163"></a>00163   connect(<a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>, SIGNAL(finished(<span class="keywordtype">int</span>, QProcess::ExitStatus)),
<a name="l00164"></a>00164            <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a3f32e7c0f9fc4649aa700fc6132fa49b">onSubprocessFinished</a>(<span class="keywordtype">int</span>, QProcess::ExitStatus)));
<a name="l00165"></a>00165   connect(<a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>, SIGNAL(<a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">startFailed</a>(QString)),
<a name="l00166"></a>00166            <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a58c1dd30917a3d5be1af521c2844d0a1">onBrowserFailed</a>(QString)));
<a name="l00167"></a>00167 
<a name="l00168"></a>00168   <span class="comment">/* Create a new HelperProcess object, used to start the IM client */</span>
<a name="l00169"></a>00169   <a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a> = <span class="keyword">new</span> <a class="code" href="class_helper_process.html">HelperProcess</a>(<span class="keyword">this</span>);
<a name="l00170"></a>00170   connect(<a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>, SIGNAL(finished(<span class="keywordtype">int</span>, QProcess::ExitStatus)),
<a name="l00171"></a>00171            <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a3f32e7c0f9fc4649aa700fc6132fa49b">onSubprocessFinished</a>(<span class="keywordtype">int</span>, QProcess::ExitStatus)));
<a name="l00172"></a>00172   connect(<a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>, SIGNAL(<a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">startFailed</a>(QString)),
<a name="l00173"></a>00173            <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a7af3556f8a648c4ac4950f77de4f34b0">onIMFailed</a>(QString)));
<a name="l00174"></a>00174 
<a name="l00175"></a>00175   <span class="comment">/* Create a new HelperProcess object, used to start the proxy server */</span>
<a name="l00176"></a>00176   <a class="code" href="class_main_window.html#a19191a300dd76182e4a9b4c48e325f35">_proxyProcess</a> = <span class="keyword">new</span> <a class="code" href="class_helper_process.html">HelperProcess</a>(<span class="keyword">this</span>);
<a name="l00177"></a>00177   connect(<a class="code" href="class_main_window.html#a19191a300dd76182e4a9b4c48e325f35">_proxyProcess</a>, SIGNAL(<a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">startFailed</a>(QString)),
<a name="l00178"></a>00178            <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#ac6105a0c68473d566f3b220f2120f218">onProxyFailed</a>(QString)));
<a name="l00179"></a>00179 
<a name="l00180"></a>00180   <span class="comment">/* Catch signals when the application is running or shutting down */</span>
<a name="l00181"></a>00181   connect(<a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>, SIGNAL(<a class="code" href="class_main_window.html#a47cf89888de073428a8fda741fd5aa42">running</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a47cf89888de073428a8fda741fd5aa42">running</a>()));
<a name="l00182"></a>00182   connect(<a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>, SIGNAL(<a class="code" href="class_main_window.html#a41395b3febf4c123816a19157633baaf">aboutToQuit</a>()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a41395b3febf4c123816a19157633baaf">aboutToQuit</a>()));
<a name="l00183"></a>00183 
<a name="l00184"></a>00184 <span class="preprocessor">#if defined(USE_AUTOUPDATE)</span>
<a name="l00185"></a>00185 <span class="preprocessor"></span>  <span class="comment">/* Create a timer used to remind us to check for software updates */</span>
<a name="l00186"></a>00186   connect(&amp;_updateTimer, SIGNAL(timeout()), <span class="keyword">this</span>, SLOT(checkForUpdates()));
<a name="l00187"></a>00187 
<a name="l00188"></a>00188   <span class="comment">/* Also check for updates in the foreground when the user clicks the</span>
<a name="l00189"></a>00189 <span class="comment">   * &quot;Check Now&quot; button in the config dialog. */</span>
<a name="l00190"></a>00190   connect(<a class="code" href="class_main_window.html#ab6fc7e274755ae4273226fb34ea3dbb4">_configDialog</a>, SIGNAL(checkForUpdates()),
<a name="l00191"></a>00191           <span class="keyword">this</span>, SLOT(checkForUpdatesWithUi()));
<a name="l00192"></a>00192 
<a name="l00193"></a>00193   <span class="comment">/* The rest of these slots are called as the update process executes. */</span>
<a name="l00194"></a>00194   connect(&amp;_updateProcess, SIGNAL(downloadProgress(QString,<span class="keywordtype">int</span>,<span class="keywordtype">int</span>)),
<a name="l00195"></a>00195           &amp;_updateProgressDialog, SLOT(setDownloadProgress(QString,<span class="keywordtype">int</span>,<span class="keywordtype">int</span>)));
<a name="l00196"></a>00196   connect(&amp;_updateProcess, SIGNAL(updatesAvailable(<a class="code" href="class_update_process.html#a7f96e69b1f212525d935655e9c00505a">UpdateProcess::BundleInfo</a>,<a class="code" href="_package_info_8h.html#ae1b3835486d49f6ee4483714e49f019b">PackageList</a>)),
<a name="l00197"></a>00197           <span class="keyword">this</span>, SLOT(updatesAvailable(<a class="code" href="class_update_process.html#a7f96e69b1f212525d935655e9c00505a">UpdateProcess::BundleInfo</a>,<a class="code" href="_package_info_8h.html#ae1b3835486d49f6ee4483714e49f019b">PackageList</a>)));
<a name="l00198"></a>00198   connect(&amp;_updateProcess, SIGNAL(updatesInstalled(<span class="keywordtype">int</span>)),
<a name="l00199"></a>00199           <span class="keyword">this</span>, SLOT(updatesInstalled(<span class="keywordtype">int</span>)));
<a name="l00200"></a>00200   connect(&amp;_updateProcess, SIGNAL(installUpdatesFailed(QString)),
<a name="l00201"></a>00201           <span class="keyword">this</span>, SLOT(installUpdatesFailed(QString)));
<a name="l00202"></a>00202   connect(&amp;_updateProgressDialog, SIGNAL(cancelUpdate()),
<a name="l00203"></a>00203           &amp;_updateProcess, SLOT(cancel()));
<a name="l00204"></a>00204 <span class="preprocessor">#endif</span>
<a name="l00205"></a>00205 <span class="preprocessor"></span>
<a name="l00206"></a>00206 <span class="preprocessor">#if defined(USE_MINIUPNPC)</span>
<a name="l00207"></a>00207 <span class="preprocessor"></span>  <span class="comment">/* Catch UPnP-related signals */</span>
<a name="l00208"></a>00208   connect(<a class="code" href="class_u_p_n_p_control.html#a5046fdfc0449019c8d1e21ac0918dbb1">UPNPControl::instance</a>(), SIGNAL(<a class="code" href="namespacetc.html#aa7353218fd7baef0876bbb422ce818af">error</a>(<a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPControl::UPNPError</a>)),
<a name="l00209"></a>00209          <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a0525cb43d1299bd8233a1f95cd91554c">upnpError</a>(<a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPControl::UPNPError</a>)));
<a name="l00210"></a>00210 <span class="preprocessor">#endif</span>
<a name="l00211"></a>00211 <span class="preprocessor"></span>
<a name="l00212"></a>00212   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.chkShowOnStartup-&gt;setChecked(settings.<a class="code" href="class_vidalia_settings.html#a98fa98788ec9c815ab355c4eb590c2bd">showMainWindowAtStart</a>());
<a name="l00213"></a>00213   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.chkShowOnStartup-&gt;isChecked())
<a name="l00214"></a>00214     show(); 
<a name="l00215"></a>00215   <span class="comment">/* Optimistically hope that the tray icon gets added. */</span>
<a name="l00216"></a>00216   <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.show();
<a name="l00217"></a>00217 }
<a name="l00218"></a>00218 <span class="comment"></span>
<a name="l00219"></a>00219 <span class="comment">/** Destructor. */</span>
<a name="l00220"></a><a class="code" href="class_main_window.html#ae98d00a93bc118200eeef9f9bba1dba7">00220</a> <a class="code" href="class_main_window.html#ae98d00a93bc118200eeef9f9bba1dba7">MainWindow::~MainWindow</a>()
<a name="l00221"></a>00221 {
<a name="l00222"></a>00222   <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.hide();
<a name="l00223"></a>00223   <span class="keyword">delete</span> <a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>;
<a name="l00224"></a>00224   <span class="keyword">delete</span> <a class="code" href="class_main_window.html#a8f07eb54991ddcde2b65df02654ef42d">_bandwidthGraph</a>;
<a name="l00225"></a>00225   <span class="keyword">delete</span> <a class="code" href="class_main_window.html#aef5538e4a008aea0ca0fec62ccbfdd6c">_netViewer</a>;
<a name="l00226"></a>00226   <span class="keyword">delete</span> <a class="code" href="class_main_window.html#ab6fc7e274755ae4273226fb34ea3dbb4">_configDialog</a>;
<a name="l00227"></a>00227 }
<a name="l00228"></a>00228 
<a name="l00229"></a>00229 <span class="keywordtype">void</span>
<a name="l00230"></a><a class="code" href="class_main_window.html#aa3af9699689c768277e5512d80ad54c6">00230</a> <a class="code" href="class_main_window.html#aa3af9699689c768277e5512d80ad54c6">MainWindow::setVisible</a>(<span class="keywordtype">bool</span> visible)
<a name="l00231"></a>00231 {
<a name="l00232"></a>00232   <span class="keywordflow">if</span> (visible) {
<a name="l00233"></a>00233     <span class="comment">/* In Gnome, will hide buttons if Vidalia is run on startup. */</span>
<a name="l00234"></a>00234     <span class="keywordflow">if</span> (!QSystemTrayIcon::isSystemTrayAvailable()) {
<a name="l00235"></a>00235       <span class="comment">/* Don&#39;t let people hide the main window, since that&#39;s all they have. */</span>
<a name="l00236"></a>00236       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.chkShowOnStartup-&gt;hide();
<a name="l00237"></a>00237       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.btnHide-&gt;hide();
<a name="l00238"></a>00238       <span class="comment">/* Causes window to not appear in Enlightenment. */</span>
<a name="l00239"></a>00239       <span class="comment">//setMinimumHeight(height()-ui.btnHide-&gt;height());</span>
<a name="l00240"></a>00240       <span class="comment">//setMaximumHeight(height()-ui.btnHide-&gt;height());</span>
<a name="l00241"></a>00241     }
<a name="l00242"></a>00242   }
<a name="l00243"></a>00243   <a class="code" href="class_main_window.html#aa3af9699689c768277e5512d80ad54c6">VidaliaWindow::setVisible</a>(visible);
<a name="l00244"></a>00244 }
<a name="l00245"></a>00245 
<a name="l00246"></a>00246 <span class="keywordtype">void</span>
<a name="l00247"></a><a class="code" href="class_main_window.html#a2836e718ab96e25231b80d346a7841ad">00247</a> <a class="code" href="class_main_window.html#a2836e718ab96e25231b80d346a7841ad">MainWindow::retranslateUi</a>()
<a name="l00248"></a>00248 {
<a name="l00249"></a>00249   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.retranslateUi(<span class="keyword">this</span>);
<a name="l00250"></a>00250 
<a name="l00251"></a>00251   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a>);
<a name="l00252"></a>00252   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a> == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>) {
<a name="l00253"></a>00253     <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setText(tr(<span class="stringliteral">&quot;Start Tor&quot;</span>));
<a name="l00254"></a>00254     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(tr(<span class="stringliteral">&quot;Start Tor&quot;</span>));
<a name="l00255"></a>00255   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a> == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29ab3362701808cf4c449b0300d82cc7050">Starting</a>) {
<a name="l00256"></a>00256     <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setText(tr(<span class="stringliteral">&quot;Starting Tor&quot;</span>));
<a name="l00257"></a>00257     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(tr(<span class="stringliteral">&quot;Starting Tor&quot;</span>));
<a name="l00258"></a>00258   } <span class="keywordflow">else</span> {
<a name="l00259"></a>00259     <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setText(tr(<span class="stringliteral">&quot;Stop Tor&quot;</span>));
<a name="l00260"></a>00260     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(tr(<span class="stringliteral">&quot;Stop Tor&quot;</span>));
<a name="l00261"></a>00261   }
<a name="l00262"></a>00262 
<a name="l00263"></a>00263   <a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>-&gt;setText(tr(<span class="stringliteral">&quot;Bandwidth Graph&quot;</span>));
<a name="l00264"></a>00264   <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>-&gt;setText(tr(<span class="stringliteral">&quot;Message Log&quot;</span>));
<a name="l00265"></a>00265   <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>-&gt;setText(tr(<span class="stringliteral">&quot;Network Map&quot;</span>));
<a name="l00266"></a>00266   <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>-&gt;setText(tr(<span class="stringliteral">&quot;Control Panel&quot;</span>));
<a name="l00267"></a>00267   <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>-&gt;setText(tr(<span class="stringliteral">&quot;Help&quot;</span>));
<a name="l00268"></a>00268   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setText(tr(<span class="stringliteral">&quot;New Identity&quot;</span>));
<a name="l00269"></a>00269 
<a name="l00270"></a>00270 <span class="preprocessor">#if !defined(Q_WS_MAC)</span>
<a name="l00271"></a>00271 <span class="preprocessor"></span>  <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>-&gt;setText(tr(<span class="stringliteral">&quot;About&quot;</span>));
<a name="l00272"></a>00272   <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>-&gt;setText(tr(<span class="stringliteral">&quot;Settings&quot;</span>));
<a name="l00273"></a>00273   <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>-&gt;setText(tr(<span class="stringliteral">&quot;Exit&quot;</span>));
<a name="l00274"></a>00274 <span class="preprocessor">#else</span>
<a name="l00275"></a>00275 <span class="preprocessor"></span>  <a class="code" href="class_main_window.html#a2305527bb5d827ae07967ea1c86ee6fb">createMenuBar</a>();
<a name="l00276"></a>00276 <span class="preprocessor">#endif</span>
<a name="l00277"></a>00277 <span class="preprocessor"></span>}
<a name="l00278"></a>00278 <span class="comment"></span>
<a name="l00279"></a>00279 <span class="comment">/** Called when the application has started and the main event loop is</span>
<a name="l00280"></a>00280 <span class="comment"> * running. */</span>
<a name="l00281"></a>00281 <span class="keywordtype">void</span>
<a name="l00282"></a><a class="code" href="class_main_window.html#a47cf89888de073428a8fda741fd5aa42">00282</a> <a class="code" href="class_main_window.html#a47cf89888de073428a8fda741fd5aa42">MainWindow::running</a>()
<a name="l00283"></a>00283 {
<a name="l00284"></a>00284   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00285"></a>00285 
<a name="l00286"></a>00286   <span class="keywordflow">if</span> (<a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>-&gt;readPasswordFromStdin()) {
<a name="l00287"></a>00287     QTextStream in(stdin);
<a name="l00288"></a>00288     in &gt;&gt; <a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a>;
<a name="l00289"></a>00289     <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">false</span>;
<a name="l00290"></a>00290   } <span class="keywordflow">else</span> {
<a name="l00291"></a>00291     <span class="comment">/* Initialize _useSavedPassword to true. If Tor is already running when</span>
<a name="l00292"></a>00292 <span class="comment">     * Vidalia starts, then there is no point in generating a random password.</span>
<a name="l00293"></a>00293 <span class="comment">     * If Tor is not already running, then this will be set according to the</span>
<a name="l00294"></a>00294 <span class="comment">     * current configuration in the start() method.</span>
<a name="l00295"></a>00295 <span class="comment">     */</span>
<a name="l00296"></a>00296     <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">true</span>;
<a name="l00297"></a>00297   }
<a name="l00298"></a>00298 
<a name="l00299"></a>00299   <span class="keywordflow">if</span> (settings.<a class="code" href="class_vidalia_settings.html#aa22127fb3b026f34d90fd8efe2fa61a5">runTorAtStart</a>()) {
<a name="l00300"></a>00300     <span class="comment">/* If we&#39;re supposed to start Tor when Vidalia starts, then do it now */</span>
<a name="l00301"></a>00301     <a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>();
<a name="l00302"></a>00302   }
<a name="l00303"></a>00303 
<a name="l00304"></a>00304   <span class="comment">/* Start the proxy server, if configured */</span>
<a name="l00305"></a>00305   <span class="keywordflow">if</span> (settings.<a class="code" href="class_vidalia_settings.html#a4962d603a7ad491e2035fe90c661cbf1">runProxyAtStart</a>())
<a name="l00306"></a>00306     <a class="code" href="class_main_window.html#a4fea909e5fb250c39d2f499a7e41b3c4">startProxy</a>();
<a name="l00307"></a>00307 
<a name="l00308"></a>00308 <span class="preprocessor">#if defined(USE_AUTOUPDATE)</span>
<a name="l00309"></a>00309 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (settings.<a class="code" href="class_vidalia_settings.html#a516d1a7fc2eab785eb6ae55365f6b2c1">isAutoUpdateEnabled</a>()) {
<a name="l00310"></a>00310     QDateTime lastCheckedAt = settings.<a class="code" href="class_vidalia_settings.html#a83dc08182ffcef59d8f2fea85ed46f82">lastCheckedForUpdates</a>();
<a name="l00311"></a>00311     <span class="keywordflow">if</span> (<a class="code" href="class_update_process.html#afe8256e9bfeac91f946b73036fbec004">UpdateProcess::shouldCheckForUpdates</a>(lastCheckedAt)) {
<a name="l00312"></a>00312       <span class="keywordflow">if</span> (settings.<a class="code" href="class_vidalia_settings.html#aa22127fb3b026f34d90fd8efe2fa61a5">runTorAtStart</a>() &amp;&amp; ! <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a2b389a9436a6beb699dac04b95ace7ac">isCircuitEstablished</a>()) {
<a name="l00313"></a>00313         <span class="comment">/* We started Tor but it hasn&#39;t bootstrapped yet, so give it a bit</span>
<a name="l00314"></a>00314 <span class="comment">         * before we decide to check for updates. If Tor manages to build a</span>
<a name="l00315"></a>00315 <span class="comment">         * circuit before this timer times out, we will stop the timer and</span>
<a name="l00316"></a>00316 <span class="comment">         * launch a check for updates immediately. (see circuitEstablished()).</span>
<a name="l00317"></a>00317 <span class="comment">         */</span>
<a name="l00318"></a>00318         _updateTimer.start(5*60*1000);
<a name="l00319"></a>00319       } <span class="keywordflow">else</span> {
<a name="l00320"></a>00320         <span class="comment">/* Initiate a background check for updates now */</span>
<a name="l00321"></a>00321         checkForUpdates();
<a name="l00322"></a>00322       }
<a name="l00323"></a>00323     } <span class="keywordflow">else</span> {
<a name="l00324"></a>00324       <span class="comment">/* Schedule the next time to check for updates */</span>
<a name="l00325"></a>00325       QDateTime nextCheckAt = <a class="code" href="class_update_process.html#acc5db0f95435463db6229a12c6b33b47">UpdateProcess::nextCheckForUpdates</a>(lastCheckedAt);
<a name="l00326"></a>00326       QDateTime now = QDateTime::currentDateTime().toUTC();
<a name="l00327"></a>00327 
<a name="l00328"></a>00328       <a class="code" href="_vidalia_8h.html#a7743cb328f470aa8f382716fbcf61daa">vInfo</a>(<span class="stringliteral">&quot;Last checked for software updates at %1. Will check again at %2.&quot;</span>)
<a name="l00329"></a>00329         .arg(lastCheckedAt.toLocalTime().toString(<span class="stringliteral">&quot;dd-MM-yyyy hh:mm:ss&quot;</span>))
<a name="l00330"></a>00330         .arg(nextCheckAt.toLocalTime().toString(<span class="stringliteral">&quot;dd-MM-yyyy hh:mm:ss&quot;</span>));
<a name="l00331"></a>00331       _updateTimer.start((nextCheckAt.toTime_t() - now.toTime_t()) * 1000);
<a name="l00332"></a>00332     }
<a name="l00333"></a>00333   }
<a name="l00334"></a>00334 <span class="preprocessor">#endif</span>
<a name="l00335"></a>00335 <span class="preprocessor"></span>}
<a name="l00336"></a>00336 <span class="comment"></span>
<a name="l00337"></a>00337 <span class="comment">/** Terminate the Tor process if it is being run under Vidalia, disconnect all</span>
<a name="l00338"></a>00338 <span class="comment"> * TorControl signals, and exit Vidalia. */</span>
<a name="l00339"></a>00339 <span class="keywordtype">void</span>
<a name="l00340"></a><a class="code" href="class_main_window.html#a41395b3febf4c123816a19157633baaf">00340</a> <a class="code" href="class_main_window.html#a41395b3febf4c123816a19157633baaf">MainWindow::aboutToQuit</a>()
<a name="l00341"></a>00341 {
<a name="l00342"></a>00342   <a class="code" href="_vidalia_8h.html#a61e4319b31bbbc7eb1a5724b487be75f">vNotice</a>(<span class="stringliteral">&quot;Cleaning up before exiting.&quot;</span>);
<a name="l00343"></a>00343 
<a name="l00344"></a>00344   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a3b8daa188aa325d28d75c62219c56c71">isVidaliaRunningTor</a>()) {
<a name="l00345"></a>00345     <span class="comment">/* Kill our Tor process now */</span> 
<a name="l00346"></a>00346     <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ae4a495462e3aa5db88502c58d1fa771f">stop</a>();
<a name="l00347"></a>00347   }
<a name="l00348"></a>00348 
<a name="l00349"></a>00349   <span class="comment">/* Disable port forwarding */</span>
<a name="l00350"></a>00350   <a class="code" href="class_server_settings.html">ServerSettings</a> settings(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>);
<a name="l00351"></a>00351   settings.<a class="code" href="class_server_settings.html#a7ad953b22dcd629061e11b2a86d1c98f">cleanupPortForwarding</a>();
<a name="l00352"></a>00352 
<a name="l00353"></a>00353   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a19191a300dd76182e4a9b4c48e325f35">_proxyProcess</a>-&gt;state() != QProcess::NotRunning) {
<a name="l00354"></a>00354     <span class="comment">/* Close the proxy server (Polipo ignores the WM_CLOSE event sent by</span>
<a name="l00355"></a>00355 <span class="comment">     * terminate() so we have to kill() it) */</span>
<a name="l00356"></a>00356     <a class="code" href="class_main_window.html#a19191a300dd76182e4a9b4c48e325f35">_proxyProcess</a>-&gt;kill();
<a name="l00357"></a>00357   }
<a name="l00358"></a>00358 
<a name="l00359"></a>00359   <span class="comment">/* Kill the browser and IM client if using the new launcher */</span>
<a name="l00360"></a>00360   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> vidalia_settings;
<a name="l00361"></a>00361 
<a name="l00362"></a>00362   <span class="keywordflow">if</span> (! vidalia_settings.<a class="code" href="class_vidalia_settings.html#abfc51d913b2b5074ae328839ceb7ea9d">getBrowserDirectory</a>().isEmpty()) {
<a name="l00363"></a>00363     <span class="comment">/* Disconnect the finished signals so that we won&#39;t try to exit Vidalia again */</span>
<a name="l00364"></a>00364     <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>, SIGNAL(finished(<span class="keywordtype">int</span>, QProcess::ExitStatus)), 0, 0);
<a name="l00365"></a>00365     <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>, SIGNAL(finished(<span class="keywordtype">int</span>, QProcess::ExitStatus)), 0, 0);
<a name="l00366"></a>00366 
<a name="l00367"></a>00367     <span class="comment">/* Use QProcess terminate function */</span>
<a name="l00368"></a>00368     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;state() == QProcess::Running)
<a name="l00369"></a>00369       <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;terminate();
<a name="l00370"></a>00370 
<a name="l00371"></a>00371 <span class="preprocessor">#if defined(Q_OS_WIN)</span>
<a name="l00372"></a>00372 <span class="preprocessor"></span>    <span class="comment">/* Kill any processes which might have been forked off */</span>
<a name="l00373"></a>00373     <a class="code" href="win32_8cpp.html#a546813bc9cee9692be35c062e1502bca">win32_end_process_by_filename</a>(vidalia_settings.<a class="code" href="class_vidalia_settings.html#a615c852e4d25a8041d3cde69db28e2c5">getBrowserExecutable</a>());
<a name="l00374"></a>00374 <span class="preprocessor">#endif</span>
<a name="l00375"></a>00375 <span class="preprocessor"></span>
<a name="l00376"></a>00376     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>-&gt;state() == QProcess::Running)
<a name="l00377"></a>00377       <a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>-&gt;terminate();    
<a name="l00378"></a>00378   }
<a name="l00379"></a>00379 
<a name="l00380"></a>00380   <span class="comment">/* Disconnect all of the TorControl object&#39;s signals */</span>
<a name="l00381"></a>00381   <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, 0, 0, 0);
<a name="l00382"></a>00382 }
<a name="l00383"></a>00383 <span class="comment"></span>
<a name="l00384"></a>00384 <span class="comment">/** Called when the application is closing, by selecting &quot;Exit&quot; from the tray</span>
<a name="l00385"></a>00385 <span class="comment"> * menu. If we&#39;re running a Tor server, then ask if we want to kill Tor now,</span>
<a name="l00386"></a>00386 <span class="comment"> * or do a delayed shutdown. */</span>
<a name="l00387"></a>00387 <span class="keywordtype">void</span>
<a name="l00388"></a><a class="code" href="class_main_window.html#a6ce4eb489a32f1a18c306b99e0cbb82e">00388</a> <a class="code" href="class_main_window.html#a6ce4eb489a32f1a18c306b99e0cbb82e">MainWindow::close</a>()
<a name="l00389"></a>00389 {
<a name="l00390"></a>00390   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a3b8daa188aa325d28d75c62219c56c71">isVidaliaRunningTor</a>()) {
<a name="l00391"></a>00391     <span class="comment">/* If we&#39;re running a server currently, ask if we want to do a delayed</span>
<a name="l00392"></a>00392 <span class="comment">     * shutdown. If we do, then close Vidalia only when Tor stops. Otherwise,</span>
<a name="l00393"></a>00393 <span class="comment">     * kill Tor and bail now. */</span>
<a name="l00394"></a>00394     <a class="code" href="class_server_settings.html">ServerSettings</a> settings(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>);
<a name="l00395"></a>00395     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a5e39e327ca6c4ef5b4e2ce770a81a59f">isConnected</a>() &amp;&amp; settings.<a class="code" href="class_server_settings.html#ad8d3c25facf05765a5379421a5f80da5">isServerEnabled</a>()) {
<a name="l00396"></a>00396       connect(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">stopped</a>()), <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>, SLOT(quit()));
<a name="l00397"></a>00397       <span class="keywordflow">if</span> (!<a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">stop</a>())
<a name="l00398"></a>00398         <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>, SIGNAL(<a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">stopped</a>()), <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>, SLOT(quit()));
<a name="l00399"></a>00399       <span class="keywordflow">return</span>;
<a name="l00400"></a>00400     }
<a name="l00401"></a>00401   }
<a name="l00402"></a>00402   <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>-&gt;quit();
<a name="l00403"></a>00403 }
<a name="l00404"></a>00404 <span class="comment"></span>
<a name="l00405"></a>00405 <span class="comment">/** Create and bind actions to events. Setup for initial</span>
<a name="l00406"></a>00406 <span class="comment"> * tray menu configuration. */</span>
<a name="l00407"></a>00407 <span class="keywordtype">void</span> 
<a name="l00408"></a><a class="code" href="class_main_window.html#a62cd8712fb41a754298f6f60eead2cb0">00408</a> <a class="code" href="class_main_window.html#a62cd8712fb41a754298f6f60eead2cb0">MainWindow::createActions</a>()
<a name="l00409"></a>00409 {
<a name="l00410"></a>00410   <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Start Tor&quot;</span>), <span class="keyword">this</span>);
<a name="l00411"></a>00411   connect(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>()));
<a name="l00412"></a>00412 
<a name="l00413"></a>00413   <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Exit&quot;</span>), <span class="keyword">this</span>);
<a name="l00414"></a>00414   connect(<a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a6ce4eb489a32f1a18c306b99e0cbb82e">close</a>()));
<a name="l00415"></a>00415 
<a name="l00416"></a>00416   <a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Bandwidth Graph&quot;</span>), <span class="keyword">this</span>);
<a name="l00417"></a>00417   connect(<a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>, SIGNAL(triggered()), 
<a name="l00418"></a>00418           <a class="code" href="class_main_window.html#a8f07eb54991ddcde2b65df02654ef42d">_bandwidthGraph</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00419"></a>00419   connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblBandwidthGraph, SIGNAL(clicked()),
<a name="l00420"></a>00420           <a class="code" href="class_main_window.html#a8f07eb54991ddcde2b65df02654ef42d">_bandwidthGraph</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00421"></a>00421 
<a name="l00422"></a>00422   <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Message Log&quot;</span>), <span class="keyword">this</span>);
<a name="l00423"></a>00423   connect(<a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>, SIGNAL(triggered()),
<a name="l00424"></a>00424           <a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00425"></a>00425   connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblMessageLog, SIGNAL(clicked()),
<a name="l00426"></a>00426           <a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00427"></a>00427 
<a name="l00428"></a>00428   <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Network Map&quot;</span>), <span class="keyword">this</span>);
<a name="l00429"></a>00429   connect(<a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>, SIGNAL(triggered()), 
<a name="l00430"></a>00430           <a class="code" href="class_main_window.html#aef5538e4a008aea0ca0fec62ccbfdd6c">_netViewer</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00431"></a>00431   connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblViewNetwork, SIGNAL(clicked()),
<a name="l00432"></a>00432           <a class="code" href="class_main_window.html#aef5538e4a008aea0ca0fec62ccbfdd6c">_netViewer</a>, SLOT(<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>()));
<a name="l00433"></a>00433 
<a name="l00434"></a>00434   <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Control Panel&quot;</span>), <span class="keyword">this</span>);
<a name="l00435"></a>00435   connect(<a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(show()));
<a name="l00436"></a>00436 
<a name="l00437"></a>00437   <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Settings&quot;</span>), <span class="keyword">this</span>);
<a name="l00438"></a>00438   connect(<a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">showConfigDialog</a>()));
<a name="l00439"></a>00439   
<a name="l00440"></a>00440   <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;About&quot;</span>), <span class="keyword">this</span>);
<a name="l00441"></a>00441   connect(<a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a63c95190fa305627c29ec601ed10a2f0">showAboutDialog</a>()));
<a name="l00442"></a>00442 
<a name="l00443"></a>00443   <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;Help&quot;</span>), <span class="keyword">this</span>);
<a name="l00444"></a>00444   connect(<a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>()));
<a name="l00445"></a>00445   connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblHelpBrowser, SIGNAL(clicked()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>()));
<a name="l00446"></a>00446 
<a name="l00447"></a>00447   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a> = <span class="keyword">new</span> QAction(tr(<span class="stringliteral">&quot;New Identity&quot;</span>), <span class="keyword">this</span>);
<a name="l00448"></a>00448   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l00449"></a>00449   connect(<a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#ad743a187b9e876c3368f2e03ec4e88a6">newIdentity</a>()));
<a name="l00450"></a>00450 
<a name="l00451"></a>00451 <span class="preprocessor">#if !defined(Q_WS_MAC)</span>
<a name="l00452"></a>00452 <span class="preprocessor"></span>  <span class="comment">/* Don&#39;t give the menu items icons on OS X, since they end up in the</span>
<a name="l00453"></a>00453 <span class="comment">   * application menu bar. Menu bar items on OS X typically do not have</span>
<a name="l00454"></a>00454 <span class="comment">   * icons. */</span>
<a name="l00455"></a>00455   <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a6d07dc2f522cb6a2af85ea8dd1eb5aa2">IMG_START_TOR_16</a>));
<a name="l00456"></a>00456   <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#afa5764360dd9ef0a59894b177e55c4eb">IMG_EXIT</a>));
<a name="l00457"></a>00457   <a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a045a90b6bbb08b84fed00af0648273ff">IMG_BWGRAPH</a>));
<a name="l00458"></a>00458   <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#aa700f74731e94657f68c61777fde6b65">IMG_MESSAGELOG</a>));
<a name="l00459"></a>00459   <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a179e56e7837f8aa5138505b758ede80b">IMG_NETWORK</a>));
<a name="l00460"></a>00460   <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a8a13a53652d88f090625765ba63b94bb">IMG_CONTROL_PANEL</a>));
<a name="l00461"></a>00461   <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a899a03e423fd4fe2788aa3e27927be8c">IMG_CONFIG</a>));
<a name="l00462"></a>00462   <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a4d14a8389fc1e8e23b5569fa112f277e">IMG_ABOUT</a>));
<a name="l00463"></a>00463   <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a5245ed0c06968f3e5558757155f4077c">IMG_HELP</a>));
<a name="l00464"></a>00464   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#ae1c01101c40d140f8f029fdfd5a3b9d0">IMG_IDENTITY</a>));
<a name="l00465"></a>00465 <span class="preprocessor">#endif</span>
<a name="l00466"></a>00466 <span class="preprocessor"></span>}
<a name="l00467"></a>00467 <span class="comment"></span>
<a name="l00468"></a>00468 <span class="comment">/** Creates a tray icon with a context menu and adds it to the system</span>
<a name="l00469"></a>00469 <span class="comment"> * notification area. On Mac, we also set up an application menubar. */</span>
<a name="l00470"></a>00470 <span class="keywordtype">void</span>
<a name="l00471"></a><a class="code" href="class_main_window.html#aab6c1e834f96b09efe9c42766f171a74">00471</a> <a class="code" href="class_main_window.html#aab6c1e834f96b09efe9c42766f171a74">MainWindow::createTrayIcon</a>()
<a name="l00472"></a>00472 {
<a name="l00473"></a>00473   QMenu *menu = <a class="code" href="class_main_window.html#a88401f3c2a7a39e14b2532b080b322f8">createTrayMenu</a>();
<a name="l00474"></a>00474 
<a name="l00475"></a>00475   <span class="comment">/* Add the menu it to the tray icon */</span>
<a name="l00476"></a>00476   <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.setContextMenu(menu);
<a name="l00477"></a>00477 
<a name="l00478"></a>00478   connect(&amp;<a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
<a name="l00479"></a>00479           <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a66874cc9ab0780b8571a9c4ebb167bd2">trayIconActivated</a>(QSystemTrayIcon::ActivationReason)));
<a name="l00480"></a>00480 
<a name="l00481"></a>00481 <span class="preprocessor">#if defined(Q_WS_MAC)</span>
<a name="l00482"></a>00482 <span class="preprocessor"></span>  <a class="code" href="class_main_window.html#a2305527bb5d827ae07967ea1c86ee6fb">createMenuBar</a>();
<a name="l00483"></a>00483   qt_mac_set_dock_menu(menu);
<a name="l00484"></a>00484 <span class="preprocessor">#endif</span>
<a name="l00485"></a>00485 <span class="preprocessor"></span>}
<a name="l00486"></a>00486 <span class="comment"></span>
<a name="l00487"></a>00487 <span class="comment">/** Creates a QMenu object that contains QActions which compose the system </span>
<a name="l00488"></a>00488 <span class="comment"> * tray menu. */</span>
<a name="l00489"></a>00489 QMenu* 
<a name="l00490"></a><a class="code" href="class_main_window.html#a88401f3c2a7a39e14b2532b080b322f8">00490</a> <a class="code" href="class_main_window.html#a88401f3c2a7a39e14b2532b080b322f8">MainWindow::createTrayMenu</a>()
<a name="l00491"></a>00491 {
<a name="l00492"></a>00492   QMenu *menu = <span class="keyword">new</span> QMenu(<span class="keyword">this</span>);
<a name="l00493"></a>00493   menu-&gt;addAction(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>);
<a name="l00494"></a>00494   menu-&gt;addSeparator();
<a name="l00495"></a>00495   menu-&gt;addAction(<a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>);
<a name="l00496"></a>00496   menu-&gt;addAction(<a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>);
<a name="l00497"></a>00497   menu-&gt;addAction(<a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>);
<a name="l00498"></a>00498   menu-&gt;addAction(<a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>);
<a name="l00499"></a>00499   menu-&gt;addSeparator();
<a name="l00500"></a>00500   menu-&gt;addAction(<a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>);
<a name="l00501"></a>00501   
<a name="l00502"></a>00502 <span class="preprocessor">#if !defined(Q_WS_MAC)</span>
<a name="l00503"></a>00503 <span class="preprocessor"></span>  <span class="comment">/* These aren&#39;t added to the dock menu on Mac, since they are in the</span>
<a name="l00504"></a>00504 <span class="comment">   * standard Mac locations in the menu bar. */</span>
<a name="l00505"></a>00505   menu-&gt;addAction(<a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>);
<a name="l00506"></a>00506   menu-&gt;addAction(<a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>);
<a name="l00507"></a>00507   menu-&gt;addAction(<a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>);
<a name="l00508"></a>00508   menu-&gt;addSeparator();
<a name="l00509"></a>00509   menu-&gt;addAction(<a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>);
<a name="l00510"></a>00510 <span class="preprocessor">#endif</span>
<a name="l00511"></a>00511 <span class="preprocessor"></span>  <span class="keywordflow">return</span> menu;
<a name="l00512"></a>00512 }
<a name="l00513"></a>00513 <span class="comment"></span>
<a name="l00514"></a>00514 <span class="comment">/** Creates a new menubar with no parent, so Qt will use this as the &quot;default</span>
<a name="l00515"></a>00515 <span class="comment"> * menubar&quot; on Mac. This adds on to the existing actions from the createMens()</span>
<a name="l00516"></a>00516 <span class="comment"> * method. */</span>
<a name="l00517"></a>00517 <span class="keywordtype">void</span>
<a name="l00518"></a><a class="code" href="class_main_window.html#a2305527bb5d827ae07967ea1c86ee6fb">00518</a> <a class="code" href="class_main_window.html#a2305527bb5d827ae07967ea1c86ee6fb">MainWindow::createMenuBar</a>()
<a name="l00519"></a>00519 {
<a name="l00520"></a>00520 <span class="preprocessor">#if defined(Q_WS_MAC)</span>
<a name="l00521"></a>00521 <span class="preprocessor"></span>  <span class="comment">/* Mac users sure like their shortcuts. Actions NOT mentioned below</span>
<a name="l00522"></a>00522 <span class="comment">   * don&#39;t explicitly need shortcuts, since they are merged to the default</span>
<a name="l00523"></a>00523 <span class="comment">   * menubar and get the default shortcuts anyway. */</span>
<a name="l00524"></a>00524   <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+T&quot;</span>));
<a name="l00525"></a>00525   <a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+B&quot;</span>));
<a name="l00526"></a>00526   <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+L&quot;</span>));
<a name="l00527"></a>00527   <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+N&quot;</span>));
<a name="l00528"></a>00528   <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+?&quot;</span>));
<a name="l00529"></a>00529   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+I&quot;</span>));
<a name="l00530"></a>00530   <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>-&gt;setShortcut(tr(<span class="stringliteral">&quot;Ctrl+P&quot;</span>));
<a name="l00531"></a>00531 
<a name="l00532"></a>00532   <span class="comment">/* Force Qt to put merge the Exit, Configure, and About menubar options into</span>
<a name="l00533"></a>00533 <span class="comment">   * the default menu, even if Vidalia is currently not speaking English. */</span>
<a name="l00534"></a>00534   <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>-&gt;setText(<span class="stringliteral">&quot;config&quot;</span>);
<a name="l00535"></a>00535   <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>-&gt;setMenuRole(QAction::PreferencesRole);
<a name="l00536"></a>00536   <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>-&gt;setText(<span class="stringliteral">&quot;about&quot;</span>);
<a name="l00537"></a>00537   <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>-&gt;setMenuRole(QAction::AboutRole);
<a name="l00538"></a>00538   <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>-&gt;setText(<span class="stringliteral">&quot;quit&quot;</span>);
<a name="l00539"></a>00539   <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>-&gt;setMenuRole(QAction::QuitRole);
<a name="l00540"></a>00540 
<a name="l00541"></a>00541   <span class="comment">/* The File, Help, and Configure menus will get merged into the application</span>
<a name="l00542"></a>00542 <span class="comment">   * menu by Qt. */</span>
<a name="l00543"></a>00543   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>)
<a name="l00544"></a>00544     <span class="keyword">delete</span> <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>;
<a name="l00545"></a>00545   <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a> = <span class="keyword">new</span> QMenuBar(0);
<a name="l00546"></a>00546   QMenu *fileMenu = <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>-&gt;addMenu(<span class="stringliteral">&quot;File&quot;</span>);
<a name="l00547"></a>00547   fileMenu-&gt;addAction(<a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>);
<a name="l00548"></a>00548   fileMenu-&gt;addAction(<a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>);
<a name="l00549"></a>00549 
<a name="l00550"></a>00550   QMenu *torMenu = <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>-&gt;addMenu(tr(<span class="stringliteral">&quot;Tor&quot;</span>));
<a name="l00551"></a>00551   torMenu-&gt;addAction(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>);
<a name="l00552"></a>00552   torMenu-&gt;addSeparator();
<a name="l00553"></a>00553   torMenu-&gt;addAction(<a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>);
<a name="l00554"></a>00554 
<a name="l00555"></a>00555   QMenu *viewMenu = <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>-&gt;addMenu(tr(<span class="stringliteral">&quot;View&quot;</span>));
<a name="l00556"></a>00556   viewMenu-&gt;addAction(<a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>);
<a name="l00557"></a>00557   viewMenu-&gt;addSeparator();
<a name="l00558"></a>00558   viewMenu-&gt;addAction(<a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>);
<a name="l00559"></a>00559   viewMenu-&gt;addAction(<a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>);
<a name="l00560"></a>00560   viewMenu-&gt;addAction(<a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>);
<a name="l00561"></a>00561   
<a name="l00562"></a>00562   QMenu *helpMenu = <a class="code" href="class_main_window.html#adc30b7ac5d5f3fa9a7af6d466d6130b5">_menuBar</a>-&gt;addMenu(tr(<span class="stringliteral">&quot;Help&quot;</span>));
<a name="l00563"></a>00563   <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>-&gt;setText(tr(<span class="stringliteral">&quot;Vidalia Help&quot;</span>));
<a name="l00564"></a>00564   helpMenu-&gt;addAction(<a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>);
<a name="l00565"></a>00565   helpMenu-&gt;addAction(<a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>);
<a name="l00566"></a>00566 <span class="preprocessor">#endif</span>
<a name="l00567"></a>00567 <span class="preprocessor"></span>}
<a name="l00568"></a>00568 <span class="comment"></span>
<a name="l00569"></a>00569 <span class="comment">/** Sets the current tray or dock icon image to &lt;b&gt;iconFile&lt;/b&gt;. */</span>
<a name="l00570"></a>00570 <span class="keywordtype">void</span>
<a name="l00571"></a><a class="code" href="class_main_window.html#aeedbe43391b97b0e1a4d7839b9c9b1f6">00571</a> <a class="code" href="class_main_window.html#aeedbe43391b97b0e1a4d7839b9c9b1f6">MainWindow::setTrayIcon</a>(<span class="keyword">const</span> QString &amp;iconFile)
<a name="l00572"></a>00572 {
<a name="l00573"></a>00573 <span class="preprocessor">#if defined(Q_WS_MAC)</span>
<a name="l00574"></a>00574 <span class="preprocessor"></span>  QApplication::setWindowIcon(QPixmap(iconFile));
<a name="l00575"></a>00575 <span class="preprocessor">#else</span>
<a name="l00576"></a>00576 <span class="preprocessor"></span>  <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.setIcon(QIcon(iconFile));
<a name="l00577"></a>00577 <span class="preprocessor">#endif</span>
<a name="l00578"></a>00578 <span class="preprocessor"></span>}
<a name="l00579"></a>00579 <span class="comment"></span>
<a name="l00580"></a>00580 <span class="comment">/** Respond to a double-click on the tray icon by opening the Control Panel</span>
<a name="l00581"></a>00581 <span class="comment"> * window. */</span>
<a name="l00582"></a>00582 <span class="keywordtype">void</span>
<a name="l00583"></a><a class="code" href="class_main_window.html#a66874cc9ab0780b8571a9c4ebb167bd2">00583</a> <a class="code" href="class_main_window.html#a66874cc9ab0780b8571a9c4ebb167bd2">MainWindow::trayIconActivated</a>(QSystemTrayIcon::ActivationReason reason)
<a name="l00584"></a>00584 {
<a name="l00585"></a>00585   <span class="keywordflow">if</span> (reason == QSystemTrayIcon::DoubleClick)
<a name="l00586"></a>00586     <a class="code" href="class_main_window.html#aa3af9699689c768277e5512d80ad54c6">setVisible</a>(<span class="keyword">true</span>);
<a name="l00587"></a>00587 }
<a name="l00588"></a>00588 <span class="comment"></span>
<a name="l00589"></a>00589 <span class="comment">/** Start a web browser when given the directory containing the executable and profile */</span>
<a name="l00590"></a>00590 <span class="keywordtype">void</span>
<a name="l00591"></a><a class="code" href="class_main_window.html#ab8521ab88438a3f7bdef89a913d58518">00591</a> <a class="code" href="class_main_window.html#ab8521ab88438a3f7bdef89a913d58518">MainWindow::launchBrowserFromDirectory</a>()
<a name="l00592"></a>00592 {
<a name="l00593"></a>00593   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00594"></a>00594 
<a name="l00595"></a>00595   QString browserDirectory = settings.<a class="code" href="class_vidalia_settings.html#abfc51d913b2b5074ae328839ceb7ea9d">getBrowserDirectory</a>();
<a name="l00596"></a>00596   QString browserDirectoryFilename = settings.<a class="code" href="class_vidalia_settings.html#a615c852e4d25a8041d3cde69db28e2c5">getBrowserExecutable</a>();
<a name="l00597"></a>00597 
<a name="l00598"></a>00598   <span class="comment">/* Set TZ=UTC (to stop leaking timezone information) and</span>
<a name="l00599"></a>00599 <span class="comment">   * MOZ_NO_REMOTE=1 (to allow multiple instances of Firefox */</span>
<a name="l00600"></a>00600   QStringList env = QProcess::systemEnvironment();
<a name="l00601"></a>00601   env &lt;&lt; <span class="stringliteral">&quot;TZ=UTC&quot;</span>;
<a name="l00602"></a>00602   env &lt;&lt; <span class="stringliteral">&quot;MOZ_NO_REMOTE=1&quot;</span>;
<a name="l00603"></a>00603   <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;setEnvironment(env);
<a name="l00604"></a>00604 
<a name="l00605"></a>00605   <span class="comment">/* The browser is in &lt;browserDirectory&gt;/App/Firefox/&lt;browserDirectoryFilename&gt; */</span>
<a name="l00606"></a>00606   QString browserExecutable =
<a name="l00607"></a>00607     QDir::toNativeSeparators(browserDirectory + <span class="stringliteral">&quot;/App/Firefox/&quot;</span> + browserDirectoryFilename);
<a name="l00608"></a>00608   <span class="comment">/* The profile is in &lt;browserDirectory&gt;/Data/profile */</span>
<a name="l00609"></a>00609   QString profileDir =
<a name="l00610"></a>00610     QDir::toNativeSeparators(browserDirectory + <span class="stringliteral">&quot;/Data/profile&quot;</span>);
<a name="l00611"></a>00611 
<a name="l00612"></a>00612   <span class="comment">/* Copy the profile directory if it&#39;s not already there */</span>
<a name="l00613"></a>00613   QDir browserDirObj = QDir(browserDirectory);
<a name="l00614"></a>00614 
<a name="l00615"></a>00615   <span class="comment">/* Copy the profile directory if it&#39;s not already there */</span>
<a name="l00616"></a>00616   <span class="keywordflow">if</span> (!browserDirObj.exists(<span class="stringliteral">&quot;Data/profile&quot;</span>)) {
<a name="l00617"></a>00617     browserDirObj.mkdir(<span class="stringliteral">&quot;Data/profile&quot;</span>);
<a name="l00618"></a>00618     <a class="code" href="file_8cpp.html#a80dd03f007cf94c4222a6b6e1f5b4c38">copy_dir</a>(browserDirectory + <span class="stringliteral">&quot;/App/DefaultData/profile&quot;</span>, browserDirectory + <span class="stringliteral">&quot;/Data/profile&quot;</span>);
<a name="l00619"></a>00619   }
<a name="l00620"></a>00620 
<a name="l00621"></a>00621   <span class="comment">/* Copy the plugins directory if it&#39;s not already there */</span>
<a name="l00622"></a>00622   <span class="keywordflow">if</span> (!browserDirObj.exists(<span class="stringliteral">&quot;Data/plugins&quot;</span>)) {
<a name="l00623"></a>00623     browserDirObj.mkdir(<span class="stringliteral">&quot;Data/plugins&quot;</span>);
<a name="l00624"></a>00624     <a class="code" href="file_8cpp.html#a80dd03f007cf94c4222a6b6e1f5b4c38">copy_dir</a>(browserDirectory + <span class="stringliteral">&quot;/App/DefaultData/plugins&quot;</span>, browserDirectory + <span class="stringliteral">&quot;/Data/plugins&quot;</span>);
<a name="l00625"></a>00625   }
<a name="l00626"></a>00626 
<a name="l00627"></a>00627   <span class="comment">/* Build the command line arguments */</span>
<a name="l00628"></a>00628   QStringList commandLine;
<a name="l00629"></a>00629   <span class="comment">// Is this better or worse than MOZ_NO_REMOTE?</span>
<a name="l00630"></a>00630   <span class="comment">//commandLine &lt;&lt; &quot;-no-remote&quot;;</span>
<a name="l00631"></a>00631   commandLine &lt;&lt; <span class="stringliteral">&quot;-profile&quot;</span>;
<a name="l00632"></a>00632   commandLine &lt;&lt; profileDir;
<a name="l00633"></a>00633 
<a name="l00634"></a>00634   <span class="comment">/* Launch the browser */</span>
<a name="l00635"></a>00635   <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;<a class="code" href="class_helper_process.html#ab6c6620186ec1929e35219fe98ee0b82">start</a>(browserExecutable, commandLine);
<a name="l00636"></a>00636 }
<a name="l00637"></a>00637 <span class="comment"></span>
<a name="l00638"></a>00638 <span class="comment">/** Starts the web browser and IM client, if appropriately configured */</span>
<a name="l00639"></a>00639 <span class="keywordtype">void</span>
<a name="l00640"></a><a class="code" href="class_main_window.html#a224db3c16da30ed5cf7b3fd29e83bd1d">00640</a> <a class="code" href="class_main_window.html#a224db3c16da30ed5cf7b3fd29e83bd1d">MainWindow::startSubprocesses</a>()
<a name="l00641"></a>00641 {
<a name="l00642"></a>00642   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00643"></a>00643   QString subprocess;
<a name="l00644"></a>00644 
<a name="l00645"></a>00645   <span class="comment">/* Launch the web browser */</span>
<a name="l00646"></a>00646   <span class="keywordflow">if</span> (!(subprocess = settings.<a class="code" href="class_vidalia_settings.html#abfc51d913b2b5074ae328839ceb7ea9d">getBrowserDirectory</a>()).isEmpty()) {
<a name="l00647"></a>00647     <span class="comment">/* The user has set BrowserDirectory; use this */</span>
<a name="l00648"></a>00648     <a class="code" href="class_main_window.html#ab8521ab88438a3f7bdef89a913d58518">launchBrowserFromDirectory</a>();
<a name="l00649"></a>00649   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!(subprocess = settings.<a class="code" href="class_vidalia_settings.html#a615c852e4d25a8041d3cde69db28e2c5">getBrowserExecutable</a>()).isEmpty()) {
<a name="l00650"></a>00650     <span class="comment">/* BrowserDirectory is not set, but BrowserExecutable is; use this */</span>
<a name="l00651"></a>00651     <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;setEnvironment(QProcess::systemEnvironment() &lt;&lt; <span class="stringliteral">&quot;TZ=UTC&quot;</span>);
<a name="l00652"></a>00652     <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;<a class="code" href="class_helper_process.html#ab6c6620186ec1929e35219fe98ee0b82">start</a>(subprocess, QStringList());
<a name="l00653"></a>00653   }
<a name="l00654"></a>00654 
<a name="l00655"></a>00655   <span class="comment">/* Launch the IM client */</span>
<a name="l00656"></a>00656   subprocess = settings.<a class="code" href="class_vidalia_settings.html#a2b7497e536126460682af7722c580d56">getIMExecutable</a>();
<a name="l00657"></a>00657 
<a name="l00658"></a>00658   <span class="keywordflow">if</span> (!subprocess.isEmpty())
<a name="l00659"></a>00659     <a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>-&gt;<a class="code" href="class_helper_process.html#ab6c6620186ec1929e35219fe98ee0b82">start</a>(subprocess, QStringList());
<a name="l00660"></a>00660 }
<a name="l00661"></a>00661 <span class="comment"></span>
<a name="l00662"></a>00662 <span class="comment">/** Called when browser or IM client have exited */</span>
<a name="l00663"></a>00663 <span class="keywordtype">void</span>
<a name="l00664"></a><a class="code" href="class_main_window.html#a3f32e7c0f9fc4649aa700fc6132fa49b">00664</a> <a class="code" href="class_main_window.html#a3f32e7c0f9fc4649aa700fc6132fa49b">MainWindow::onSubprocessFinished</a>(<span class="keywordtype">int</span> exitCode, QProcess::ExitStatus exitStatus)
<a name="l00665"></a>00665 {
<a name="l00666"></a>00666   Q_UNUSED(exitCode)
<a name="l00667"></a>00667   Q_UNUSED(exitStatus)
<a name="l00668"></a>00668 
<a name="l00669"></a>00669   <span class="comment">/* Get path to browser and IM client */</span>
<a name="l00670"></a>00670   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00671"></a>00671   QString browserExecutable = settings.<a class="code" href="class_vidalia_settings.html#a615c852e4d25a8041d3cde69db28e2c5">getBrowserExecutable</a>();
<a name="l00672"></a>00672   QString browserDirectory = settings.<a class="code" href="class_vidalia_settings.html#abfc51d913b2b5074ae328839ceb7ea9d">getBrowserDirectory</a>();
<a name="l00673"></a>00673   QString imExecutable = settings.<a class="code" href="class_vidalia_settings.html#a2b7497e536126460682af7722c580d56">getIMExecutable</a>();
<a name="l00674"></a>00674 
<a name="l00675"></a>00675   <span class="comment">/* A subprocess is finished if it successfully exited or was never asked to start */</span>
<a name="l00676"></a>00676   <span class="keywordtype">bool</span> browserDone = (browserExecutable.isEmpty()
<a name="l00677"></a>00677                         &amp;&amp; browserDirectory.isEmpty())
<a name="l00678"></a>00678                         || <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-&gt;<a class="code" href="class_helper_process.html#a05a44b514ed96838bba66523c9d5d4e6">isDone</a>();
<a name="l00679"></a>00679   <span class="keywordtype">bool</span> imDone = imExecutable.isEmpty() || <a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>-&gt;<a class="code" href="class_helper_process.html#a05a44b514ed96838bba66523c9d5d4e6">isDone</a>();
<a name="l00680"></a>00680 
<a name="l00681"></a>00681   <span class="comment">/* Exit if both subprocesses are finished */</span>
<a name="l00682"></a>00682   <span class="keywordflow">if</span> (browserDone &amp;&amp; imDone) {
<a name="l00683"></a>00683     <span class="keywordflow">if</span> (browserDirectory.isEmpty()) {
<a name="l00684"></a>00684       <span class="comment">/* We are using the standard launcher, exit immediately */</span>
<a name="l00685"></a>00685       <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>-&gt;quit();
<a name="l00686"></a>00686     } <span class="keywordflow">else</span> {
<a name="l00687"></a>00687       <span class="comment">/* We are using the alternate launcher, wait until the browser has really died */</span>
<a name="l00688"></a>00688       QTimer *browserWatcher = <span class="keyword">new</span> QTimer(<span class="keyword">this</span>);
<a name="l00689"></a>00689       connect(browserWatcher, SIGNAL(timeout()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#aa343601c0b6f379a729dab58a61bd4f3">onCheckForBrowser</a>()));
<a name="l00690"></a>00690       browserWatcher-&gt;start(2000);
<a name="l00691"></a>00691     }
<a name="l00692"></a>00692   }
<a name="l00693"></a>00693 }
<a name="l00694"></a>00694 <span class="comment"></span>
<a name="l00695"></a>00695 <span class="comment">/** Called periodically to check if the browser is running. If it is not,</span>
<a name="l00696"></a>00696 <span class="comment"> * exit Vidalia cleanly */</span>
<a name="l00697"></a>00697 <span class="keywordtype">void</span>
<a name="l00698"></a><a class="code" href="class_main_window.html#aa343601c0b6f379a729dab58a61bd4f3">00698</a> <a class="code" href="class_main_window.html#aa343601c0b6f379a729dab58a61bd4f3">MainWindow::onCheckForBrowser</a>()
<a name="l00699"></a>00699 {
<a name="l00700"></a>00700 <span class="comment">/* This only works on Windows for now */</span>
<a name="l00701"></a>00701 <span class="preprocessor">#if defined(Q_OS_WIN)</span>
<a name="l00702"></a>00702 <span class="preprocessor"></span>
<a name="l00703"></a>00703   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00704"></a>00704   QString browserDirectoryFilename = settings.<a class="code" href="class_vidalia_settings.html#a615c852e4d25a8041d3cde69db28e2c5">getBrowserExecutable</a>();
<a name="l00705"></a>00705 
<a name="l00706"></a>00706   <span class="comment">/* Get list of running processes */</span>
<a name="l00707"></a>00707   QHash&lt;qint64, QString&gt; procList = <a class="code" href="win32_8cpp.html#a8af39b060612b54ccf604ccbf9c4c415">win32_process_list</a>();
<a name="l00708"></a>00708 
<a name="l00709"></a>00709   <span class="comment">/* On old versions of Windows win32_process_list() will return</span>
<a name="l00710"></a>00710 <span class="comment">     an empty list. In this case, just keep Vidalia open */</span>
<a name="l00711"></a>00711   <span class="keywordflow">if</span> (procList.isEmpty()) {
<a name="l00712"></a>00712     <span class="keywordflow">return</span>;
<a name="l00713"></a>00713   }
<a name="l00714"></a>00714 
<a name="l00715"></a>00715   <span class="comment">/* Loop over all processes or until we find &lt;browserDirectoryFilename&gt; */</span>
<a name="l00716"></a>00716   QHashIterator&lt;qint64, QString&gt; <a class="code" href="html_8cpp.html#a4a5dba6492ea149585950c59c210ff47">i</a>(procList);
<a name="l00717"></a>00717   <span class="keywordflow">while</span> (i.hasNext()) {
<a name="l00718"></a>00718     i.next();
<a name="l00719"></a>00719     <span class="keywordflow">if</span> (i.value().toLower() == browserDirectoryFilename) {
<a name="l00720"></a>00720       <span class="comment">/* The browser is still running, so Vidalia should keep running too */</span>
<a name="l00721"></a>00721       <span class="keywordflow">return</span>;
<a name="l00722"></a>00722     }
<a name="l00723"></a>00723   }
<a name="l00724"></a>00724 
<a name="l00725"></a>00725   <span class="comment">/* The browser isn&#39;t running, exit Vidalia */</span>
<a name="l00726"></a>00726   <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>-&gt;quit();
<a name="l00727"></a>00727 <span class="preprocessor">#endif  </span>
<a name="l00728"></a>00728 <span class="preprocessor"></span>}
<a name="l00729"></a>00729 <span class="comment"></span>
<a name="l00730"></a>00730 <span class="comment">/** Called when the web browser failed to start, for example, because the path</span>
<a name="l00731"></a>00731 <span class="comment"> * specified to the web browser executable didn&#39;t lead to an executable. */</span>
<a name="l00732"></a>00732 <span class="keywordtype">void</span>
<a name="l00733"></a><a class="code" href="class_main_window.html#a58c1dd30917a3d5be1af521c2844d0a1">00733</a> <a class="code" href="class_main_window.html#a58c1dd30917a3d5be1af521c2844d0a1">MainWindow::onBrowserFailed</a>(QString errmsg)
<a name="l00734"></a>00734 {
<a name="l00735"></a>00735   Q_UNUSED(errmsg);
<a name="l00736"></a>00736  
<a name="l00737"></a>00737   <span class="comment">/* Display an error message and see if the user wants some help */</span>
<a name="l00738"></a>00738   <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error starting web browser&quot;</span>),
<a name="l00739"></a>00739               tr(<span class="stringliteral">&quot;Vidalia was unable to start the configured web browser&quot;</span>),
<a name="l00740"></a>00740               <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default|VMessageBox::Escape);
<a name="l00741"></a>00741 }
<a name="l00742"></a>00742 <span class="comment"></span>
<a name="l00743"></a>00743 <span class="comment">/** Called when the IM client failed to start, for example, because the path</span>
<a name="l00744"></a>00744 <span class="comment"> * specified to the IM client executable didn&#39;t lead to an executable. */</span>
<a name="l00745"></a>00745 <span class="keywordtype">void</span>
<a name="l00746"></a><a class="code" href="class_main_window.html#a7af3556f8a648c4ac4950f77de4f34b0">00746</a> <a class="code" href="class_main_window.html#a7af3556f8a648c4ac4950f77de4f34b0">MainWindow::onIMFailed</a>(QString errmsg)
<a name="l00747"></a>00747 {
<a name="l00748"></a>00748   Q_UNUSED(errmsg);
<a name="l00749"></a>00749  
<a name="l00750"></a>00750   <span class="comment">/* Display an error message and see if the user wants some help */</span>
<a name="l00751"></a>00751   <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error starting IM client&quot;</span>),
<a name="l00752"></a>00752               tr(<span class="stringliteral">&quot;Vidalia was unable to start the configured IM client&quot;</span>),
<a name="l00753"></a>00753               <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default|VMessageBox::Escape);
<a name="l00754"></a>00754 }
<a name="l00755"></a>00755 <span class="comment"></span>
<a name="l00756"></a>00756 <span class="comment">/** Starts the proxy server, if appropriately configured */</span>
<a name="l00757"></a>00757 <span class="keywordtype">void</span>
<a name="l00758"></a><a class="code" href="class_main_window.html#a4fea909e5fb250c39d2f499a7e41b3c4">00758</a> <a class="code" href="class_main_window.html#a4fea909e5fb250c39d2f499a7e41b3c4">MainWindow::startProxy</a>()
<a name="l00759"></a>00759 {
<a name="l00760"></a>00760   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00761"></a>00761   QString executable = settings.<a class="code" href="class_vidalia_settings.html#a3aa6fb5d3feff1bc65eab366e363b612">getProxyExecutable</a>();
<a name="l00762"></a>00762   <a class="code" href="class_main_window.html#a19191a300dd76182e4a9b4c48e325f35">_proxyProcess</a>-&gt;<a class="code" href="class_helper_process.html#ab6c6620186ec1929e35219fe98ee0b82">start</a>(executable, settings.<a class="code" href="class_vidalia_settings.html#a7ebbac11d8f24da3995e349a39678746">getProxyExecutableArguments</a>());
<a name="l00763"></a>00763 }
<a name="l00764"></a>00764 <span class="comment"></span>
<a name="l00765"></a>00765 <span class="comment">/** Called when the proxy server fails to start, for example, because</span>
<a name="l00766"></a>00766 <span class="comment"> * the path specified didn&#39;t lead to an executable. */</span>
<a name="l00767"></a>00767 <span class="keywordtype">void</span>
<a name="l00768"></a><a class="code" href="class_main_window.html#ac6105a0c68473d566f3b220f2120f218">00768</a> <a class="code" href="class_main_window.html#ac6105a0c68473d566f3b220f2120f218">MainWindow::onProxyFailed</a>(QString errmsg)
<a name="l00769"></a>00769 {
<a name="l00770"></a>00770   Q_UNUSED(errmsg);
<a name="l00771"></a>00771  
<a name="l00772"></a>00772   <span class="comment">/* Display an error message and see if the user wants some help */</span>
<a name="l00773"></a>00773   <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error starting proxy server&quot;</span>),
<a name="l00774"></a>00774               tr(<span class="stringliteral">&quot;Vidalia was unable to start the configured proxy server&quot;</span>),
<a name="l00775"></a>00775               <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default|VMessageBox::Escape);
<a name="l00776"></a>00776 }
<a name="l00777"></a>00777 <span class="comment"></span>
<a name="l00778"></a>00778 <span class="comment">/** Called when Tor&#39;s bootstrapping status changes. &lt;b&gt;bse&lt;/b&gt; represents</span>
<a name="l00779"></a>00779 <span class="comment"> * Tor&#39;s current estimate of its bootstrapping progress. */</span>
<a name="l00780"></a>00780 <span class="keywordtype">void</span>
<a name="l00781"></a><a class="code" href="class_main_window.html#a2f43d1533e8e5fc43332c99d9eaad8c5">00781</a> <a class="code" href="class_main_window.html#a2f43d1533e8e5fc43332c99d9eaad8c5">MainWindow::bootstrapStatusChanged</a>(<span class="keyword">const</span> <a class="code" href="class_bootstrap_status.html">BootstrapStatus</a> &amp;bs)
<a name="l00782"></a>00782 {
<a name="l00783"></a>00783   <span class="keywordtype">int</span> percentComplete = <a class="code" href="_main_window_8cpp.html#a54d33d38b2080dfb533770861253ba06">STARTUP_PROGRESS_BOOTSTRAPPING</a> + bs.<a class="code" href="class_bootstrap_status.html#aa1b90b3a22ded2b968780294cc44ec39">percentComplete</a>();
<a name="l00784"></a>00784   <span class="keywordtype">bool</span> <a class="code" href="namespacetc.html#a161e534a110ff1f23f8a13a9ebdc00ee">warn</a> = (bs.<a class="code" href="class_bootstrap_status.html#a382d887ba971aa0126fd800cce0b2f38">severity</a>() == <a class="code" href="namespacetc.html#abb893107129c283d2eb0238e46eb3d4caf725bd8cec9af5609e47aea4e9ec5011">tc::WarnSeverity</a> &amp;&amp; 
<a name="l00785"></a>00785                bs.<a class="code" href="class_bootstrap_status.html#aa2ac6853be585932117f6cd0bf85c011">recommendedAction</a>() != <a class="code" href="class_bootstrap_status.html#ac3041b0d23ad064b535fe1b7c2775379a064682bacf9c31b563e1790c011b65bd">BootstrapStatus::RecommendIgnore</a>);
<a name="l00786"></a>00786 
<a name="l00787"></a>00787   QString description;
<a name="l00788"></a>00788   <span class="keywordflow">switch</span> (bs.<a class="code" href="class_bootstrap_status.html#ac943142b016a87884aa2b20d7794c865">status</a>()) {
<a name="l00789"></a>00789     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca2862f2ba521d70bc06f84c18a7218154">BootstrapStatus::ConnectingToDirMirror</a>:
<a name="l00790"></a>00790       description = tr(<span class="stringliteral">&quot;Connecting to a relay directory&quot;</span>);
<a name="l00791"></a>00791       <span class="keywordflow">break</span>;
<a name="l00792"></a>00792     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca2bcc13d893ffbd2669fb65d9c0e9a487">BootstrapStatus::HandshakingWithDirMirror</a>:
<a name="l00793"></a>00793     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca0642fb0582453b611a696a141720a2be">BootstrapStatus::CreatingOneHopCircuit</a>:
<a name="l00794"></a>00794       description = tr(<span class="stringliteral">&quot;Establishing an encrypted directory connection&quot;</span>);
<a name="l00795"></a>00795       <span class="keywordflow">break</span>;
<a name="l00796"></a>00796     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca2010f508d843698b616d1b58406a2317">BootstrapStatus::RequestingNetworkStatus</a>:
<a name="l00797"></a>00797       description = tr(<span class="stringliteral">&quot;Retrieving network status&quot;</span>);
<a name="l00798"></a>00798       <span class="keywordflow">break</span>;
<a name="l00799"></a>00799     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07caa42d7c854a5f6d9a06819049aa14f48b">BootstrapStatus::LoadingNetworkStatus</a>:
<a name="l00800"></a>00800       description = tr(<span class="stringliteral">&quot;Loading network status&quot;</span>);
<a name="l00801"></a>00801       <span class="keywordflow">break</span>;
<a name="l00802"></a>00802     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07caea9083e377e8bcf1e865ec39c73ed51a">BootstrapStatus::LoadingAuthorityCertificates</a>:
<a name="l00803"></a>00803       description = tr(<span class="stringliteral">&quot;Loading authority certificates&quot;</span>);
<a name="l00804"></a>00804       <span class="keywordflow">break</span>;
<a name="l00805"></a>00805     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca324fa30665efc9fd3072d052dd045f5e">BootstrapStatus::RequestingDescriptors</a>:
<a name="l00806"></a>00806       description = tr(<span class="stringliteral">&quot;Requesting relay information&quot;</span>);
<a name="l00807"></a>00807       <span class="keywordflow">break</span>;
<a name="l00808"></a>00808     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07caa7966c5713f72191165b5baf1f62ae0c">BootstrapStatus::LoadingDescriptors</a>:
<a name="l00809"></a>00809       description = tr(<span class="stringliteral">&quot;Loading relay information&quot;</span>);
<a name="l00810"></a>00810       <span class="keywordflow">break</span>;
<a name="l00811"></a>00811     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca85945314be06d1e2c98ae9ba0dc8a875">BootstrapStatus::ConnectingToEntryGuard</a>:
<a name="l00812"></a>00812       description = tr(<span class="stringliteral">&quot;Connecting to the Tor network&quot;</span>);
<a name="l00813"></a>00813       <span class="keywordflow">break</span>;
<a name="l00814"></a>00814     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca4795ecadfe4df263654c1617116c2def">BootstrapStatus::HandshakingWithEntryGuard</a>:
<a name="l00815"></a>00815     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07cad3ef48a5ffbec3c4e5ad7369a405d6df">BootstrapStatus::EstablishingCircuit</a>:
<a name="l00816"></a>00816       description = tr(<span class="stringliteral">&quot;Establishing a Tor circuit&quot;</span>);
<a name="l00817"></a>00817       <span class="keywordflow">break</span>;
<a name="l00818"></a>00818     <span class="keywordflow">case</span> <a class="code" href="class_bootstrap_status.html#a5bbbece8d729bd2e788bb9f427b9e07ca3ed55e3a430a43b666c881c2e277b882">BootstrapStatus::BootstrappingDone</a>:
<a name="l00819"></a>00819       description = tr(<span class="stringliteral">&quot;Connected to the Tor network!&quot;</span>);
<a name="l00820"></a>00820       warn = <span class="keyword">false</span>; <span class="comment">/* probably false anyway */</span>
<a name="l00821"></a>00821       <span class="keywordflow">break</span>;
<a name="l00822"></a>00822     <span class="keywordflow">default</span>:
<a name="l00823"></a>00823       description = tr(<span class="stringliteral">&quot;Unrecognized startup status&quot;</span>);
<a name="l00824"></a>00824   }
<a name="l00825"></a>00825   <span class="keywordflow">if</span> (warn) {
<a name="l00826"></a>00826     QString reason;
<a name="l00827"></a>00827     <span class="comment">/* Is it really a good idea to translate these? */</span>
<a name="l00828"></a>00828     <span class="keywordflow">switch</span> (bs.<a class="code" href="class_bootstrap_status.html#acaf13f36f764a8e3c8144b4d547e842d">reason</a>()) {
<a name="l00829"></a>00829       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340a8128348f436229aafbadf3df7356ab61">tc::MiscellaneousReason</a>:
<a name="l00830"></a>00830         reason = tr(<span class="stringliteral">&quot;miscellaneous&quot;</span>);
<a name="l00831"></a>00831         <span class="keywordflow">break</span>;
<a name="l00832"></a>00832       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340aabf68c3903e915e7996dd3768a3f06ca">tc::IdentityMismatch</a>:
<a name="l00833"></a>00833         reason = tr(<span class="stringliteral">&quot;identity mismatch&quot;</span>);
<a name="l00834"></a>00834         <span class="keywordflow">break</span>;
<a name="l00835"></a>00835       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340aface678685afb3816c80153c5a6adb3e">tc::ConnectionDone</a>:
<a name="l00836"></a>00836         reason = tr(<span class="stringliteral">&quot;done&quot;</span>);
<a name="l00837"></a>00837         <span class="keywordflow">break</span>;
<a name="l00838"></a>00838       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340a7827aa6f38156aaa53396012a722e8b3">tc::ConnectionRefused</a>:
<a name="l00839"></a>00839         reason = tr(<span class="stringliteral">&quot;connection refused&quot;</span>);
<a name="l00840"></a>00840         <span class="keywordflow">break</span>;
<a name="l00841"></a>00841       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340a72b2451b94dc06ba08fee48d756f3880">tc::ConnectionTimeout</a>:
<a name="l00842"></a>00842         reason = tr(<span class="stringliteral">&quot;connection timeout&quot;</span>);
<a name="l00843"></a>00843         <span class="keywordflow">break</span>;
<a name="l00844"></a>00844       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340aa0053c933cae6b5e63439036303c8d0e">tc::ConnectionIoError</a>:
<a name="l00845"></a>00845         reason = tr(<span class="stringliteral">&quot;read/write error&quot;</span>);
<a name="l00846"></a>00846         <span class="keywordflow">break</span>;
<a name="l00847"></a>00847       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340a44c4ac391553d57a0bb74803f5910411">tc::NoRouteToHost</a>:
<a name="l00848"></a>00848         reason = tr(<span class="stringliteral">&quot;no route to host&quot;</span>);
<a name="l00849"></a>00849         <span class="keywordflow">break</span>;
<a name="l00850"></a>00850       <span class="keywordflow">case</span> <a class="code" href="namespacetc.html#aa91b304576e66914f8090e682d499340a5015f84b11c73cf9f2859374e1bc5bab">tc::ResourceLimitReached</a>:
<a name="l00851"></a>00851         reason = tr(<span class="stringliteral">&quot;insufficient resources&quot;</span>);
<a name="l00852"></a>00852         <span class="keywordflow">break</span>;
<a name="l00853"></a>00853       <span class="keywordflow">default</span>:
<a name="l00854"></a>00854         reason = tr(<span class="stringliteral">&quot;unknown&quot;</span>);
<a name="l00855"></a>00855     }
<a name="l00856"></a>00856     description += tr(<span class="stringliteral">&quot; failed (%1)&quot;</span>).arg(reason);
<a name="l00857"></a>00857   }
<a name="l00858"></a>00858   <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(percentComplete, description);
<a name="l00859"></a>00859 }
<a name="l00860"></a>00860 <span class="comment"></span>
<a name="l00861"></a>00861 <span class="comment">/** Updates the UI to reflect Tor&#39;s current &lt;b&gt;status&lt;/b&gt;. Returns the</span>
<a name="l00862"></a>00862 <span class="comment"> * previously set TorStatus value.*/</span>
<a name="l00863"></a>00863 <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29">MainWindow::TorStatus</a>
<a name="l00864"></a><a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">00864</a> <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">MainWindow::updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29">TorStatus</a> status)
<a name="l00865"></a>00865 {
<a name="l00866"></a>00866   QString statusText, actionText;
<a name="l00867"></a>00867   QString trayIconFile, statusIconFile;
<a name="l00868"></a>00868   <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29">TorStatus</a> prevStatus = <a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a>;
<a name="l00869"></a>00869  
<a name="l00870"></a>00870   <a class="code" href="_vidalia_8h.html#a61e4319b31bbbc7eb1a5724b487be75f">vNotice</a>(<span class="stringliteral">&quot;Tor status changed from &#39;%1&#39; to &#39;%2&#39;.&quot;</span>)
<a name="l00871"></a>00871     .arg(<a class="code" href="class_main_window.html#a3c49ca983127780cfd74955ae3c16cd4">toString</a>(prevStatus)).arg(<a class="code" href="class_main_window.html#a3c49ca983127780cfd74955ae3c16cd4">toString</a>(status));
<a name="l00872"></a>00872   <a class="code" href="class_main_window.html#ae293562ab86f5870df4f01d7c6155125">_status</a> = status;
<a name="l00873"></a>00873 
<a name="l00874"></a>00874   <span class="keywordflow">if</span> (status == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>) {
<a name="l00875"></a>00875       statusText = tr(<span class="stringliteral">&quot;Tor is not running&quot;</span>);
<a name="l00876"></a>00876       actionText = tr(<span class="stringliteral">&quot;Start Tor&quot;</span>);
<a name="l00877"></a>00877       trayIconFile = <a class="code" href="_main_window_8cpp.html#a20bf587fd524d3b78042503e6f351eed">IMG_TOR_STOPPED</a>;
<a name="l00878"></a>00878       statusIconFile = <a class="code" href="_main_window_8cpp.html#a03f595d2ae395514e5e21ae0d367ef1b">IMG_TOR_STOPPED_48</a>;
<a name="l00879"></a>00879       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l00880"></a>00880       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setText(actionText);
<a name="l00881"></a>00881       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#a6d07dc2f522cb6a2af85ea8dd1eb5aa2">IMG_START_TOR_16</a>));
<a name="l00882"></a>00882       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l00883"></a>00883       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(actionText);
<a name="l00884"></a>00884       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setPixmap(QPixmap(<a class="code" href="_main_window_8cpp.html#af2706496f0bb49f7c4de05ca4006d5b6">IMG_START_TOR_48</a>));
<a name="l00885"></a>00885       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setStatusTip(actionText);
<a name="l00886"></a>00886 
<a name="l00887"></a>00887       <span class="comment">/* XXX: This might need to be smarter if we ever start connecting other</span>
<a name="l00888"></a>00888 <span class="comment">       * slots to these triggered() and clicked() signals. */</span>
<a name="l00889"></a>00889       <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>, SIGNAL(triggered()), <span class="keyword">this</span>, 0);
<a name="l00890"></a>00890       <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor, SIGNAL(clicked()), <span class="keyword">this</span>, 0);
<a name="l00891"></a>00891       connect(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>()));
<a name="l00892"></a>00892       connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor, SIGNAL(clicked()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>()));
<a name="l00893"></a>00893       <a class="code" href="class_main_window.html#ad859d65589f83ce68e6a029d03cb03a2">setStartupProgressVisible</a>(<span class="keyword">false</span>);
<a name="l00894"></a>00894   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a1428963975ee498a98af8e6caaf411e8">Stopping</a>) {
<a name="l00895"></a>00895       <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a>) {
<a name="l00896"></a>00896         statusText = tr(<span class="stringliteral">&quot;Your relay is shutting down.\n&quot;</span> 
<a name="l00897"></a>00897                         <span class="stringliteral">&quot;Click &#39;Stop&#39; again to stop your relay now.&quot;</span>);
<a name="l00898"></a>00898       } <span class="keywordflow">else</span> {
<a name="l00899"></a>00899         statusText = tr(<span class="stringliteral">&quot;Tor is shutting down&quot;</span>);
<a name="l00900"></a>00900       }
<a name="l00901"></a>00901       trayIconFile = <a class="code" href="_main_window_8cpp.html#ac3432d6232eb58995b8e47dab98b6f9b">IMG_TOR_STOPPING</a>;
<a name="l00902"></a>00902       statusIconFile = <a class="code" href="_main_window_8cpp.html#a9e16a800c6629c796be65ebba396bf17">IMG_TOR_STOPPING_48</a>;
<a name="l00903"></a>00903       
<a name="l00904"></a>00904       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setStatusTip(tr(<span class="stringliteral">&quot;Stop Tor Now&quot;</span>));
<a name="l00905"></a>00905   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a42855235adf7ea9ce6d3b77da9282182">Started</a>) {
<a name="l00906"></a>00906       actionText = tr(<span class="stringliteral">&quot;Stop Tor&quot;</span>);
<a name="l00907"></a>00907       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l00908"></a>00908       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setText(actionText);
<a name="l00909"></a>00909       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setIcon(QIcon(<a class="code" href="_main_window_8cpp.html#abf4eaa7a9958be4a9f08e426a053e1fa">IMG_STOP_TOR_16</a>));
<a name="l00910"></a>00910       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l00911"></a>00911       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(actionText);
<a name="l00912"></a>00912       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setPixmap(QPixmap(<a class="code" href="_main_window_8cpp.html#acfd3619cc4ff870cb449a34361b29eb3">IMG_STOP_TOR_48</a>));
<a name="l00913"></a>00913       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setStatusTip(actionText);
<a name="l00914"></a>00914             
<a name="l00915"></a>00915       <span class="comment">/* XXX: This might need to be smarter if we ever start connecting other</span>
<a name="l00916"></a>00916 <span class="comment">       * slots to these triggered() and clicked() signals. */</span>
<a name="l00917"></a>00917       <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>, SIGNAL(triggered()), <span class="keyword">this</span>, 0);
<a name="l00918"></a>00918       <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">QObject::disconnect</a>(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor, SIGNAL(clicked()), <span class="keyword">this</span>, 0);
<a name="l00919"></a>00919       connect(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>, SIGNAL(triggered()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">stop</a>()));
<a name="l00920"></a>00920       connect(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor, SIGNAL(clicked()), <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">stop</a>()));
<a name="l00921"></a>00921   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29ab3362701808cf4c449b0300d82cc7050">Starting</a>)  {
<a name="l00922"></a>00922       statusText = tr(<span class="stringliteral">&quot;Starting the Tor software&quot;</span>);
<a name="l00923"></a>00923       trayIconFile = <a class="code" href="_main_window_8cpp.html#a3ef6ba1abb6e68e30ca070073daf1b7f">IMG_TOR_STARTING</a>;
<a name="l00924"></a>00924       statusIconFile = <a class="code" href="_main_window_8cpp.html#ad7a3492ca97d30f0addeb8d555897893">IMG_TOR_STARTING_48</a>;
<a name="l00925"></a>00925       <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l00926"></a>00926       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setText(tr(<span class="stringliteral">&quot;Starting Tor&quot;</span>));
<a name="l00927"></a>00927       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l00928"></a>00928       <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor-&gt;setStatusTip(statusText);
<a name="l00929"></a>00929       <a class="code" href="class_main_window.html#ad859d65589f83ce68e6a029d03cb03a2">setStartupProgressVisible</a>(<span class="keyword">true</span>);
<a name="l00930"></a>00930       <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(<a class="code" href="_main_window_8cpp.html#a1a164e020d1d8485c6a5ffc9608022d7">STARTUP_PROGRESS_STARTING</a>, statusText);
<a name="l00931"></a>00931   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29abf1c80d80297659c5b78b8ecc8d74600">CircuitEstablished</a>) {
<a name="l00932"></a>00932       statusText = tr(<span class="stringliteral">&quot;Connected to the Tor network!&quot;</span>);
<a name="l00933"></a>00933       trayIconFile = <a class="code" href="_main_window_8cpp.html#a487be156752666ac1b5bceff315ceebc">IMG_TOR_RUNNING</a>;
<a name="l00934"></a>00934       statusIconFile = <a class="code" href="_main_window_8cpp.html#a58f61d2d3020f8835f2e8e0375afc25c">IMG_TOR_RUNNING_48</a>;
<a name="l00935"></a>00935       <a class="code" href="class_main_window.html#ad859d65589f83ce68e6a029d03cb03a2">setStartupProgressVisible</a>(<span class="keyword">false</span>);
<a name="l00936"></a>00936   }
<a name="l00937"></a>00937 
<a name="l00938"></a>00938   <span class="comment">/* Update the tray icon */</span>
<a name="l00939"></a>00939   <span class="keywordflow">if</span> (!trayIconFile.isEmpty()) {
<a name="l00940"></a>00940     <a class="code" href="class_main_window.html#aeedbe43391b97b0e1a4d7839b9c9b1f6">setTrayIcon</a>(trayIconFile);
<a name="l00941"></a>00941   }
<a name="l00942"></a>00942   <span class="comment">/* Update the status banner on the control panel */</span>
<a name="l00943"></a>00943   <span class="keywordflow">if</span> (!statusIconFile.isEmpty())
<a name="l00944"></a>00944     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatusImg-&gt;setPixmap(QPixmap(statusIconFile));
<a name="l00945"></a>00945   <span class="keywordflow">if</span> (!statusText.isEmpty()) {
<a name="l00946"></a>00946     <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.setToolTip(statusText);
<a name="l00947"></a>00947     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatus-&gt;setText(statusText);
<a name="l00948"></a>00948   }
<a name="l00949"></a>00949   <span class="keywordflow">return</span> prevStatus;
<a name="l00950"></a>00950 }
<a name="l00951"></a>00951 <span class="comment"></span>
<a name="l00952"></a>00952 <span class="comment">/** Called when the &quot;show on startup&quot; checkbox is toggled. */</span>
<a name="l00953"></a>00953 <span class="keywordtype">void</span>
<a name="l00954"></a><a class="code" href="class_main_window.html#ae4871e91abdb1d41394045fe6de868f2">00954</a> <a class="code" href="class_main_window.html#ae4871e91abdb1d41394045fe6de868f2">MainWindow::toggleShowOnStartup</a>(<span class="keywordtype">bool</span> checked)
<a name="l00955"></a>00955 {
<a name="l00956"></a>00956   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l00957"></a>00957   settings.<a class="code" href="class_vidalia_settings.html#add32270eee0d962b1f99d5e9d9085244">setShowMainWindowAtStart</a>(checked);
<a name="l00958"></a>00958 }
<a name="l00959"></a>00959 <span class="comment"></span>
<a name="l00960"></a>00960 <span class="comment">/** Sets the visibility of the startup status description and progress bar to</span>
<a name="l00961"></a>00961 <span class="comment"> * &lt;b&gt;visible&lt;/b&gt;. */</span>
<a name="l00962"></a>00962 <span class="keywordtype">void</span>
<a name="l00963"></a><a class="code" href="class_main_window.html#ad859d65589f83ce68e6a029d03cb03a2">00963</a> <a class="code" href="class_main_window.html#ad859d65589f83ce68e6a029d03cb03a2">MainWindow::setStartupProgressVisible</a>(<span class="keywordtype">bool</span> visible)
<a name="l00964"></a>00964 {
<a name="l00965"></a>00965   <span class="comment">/* XXX: We force a repaint() to make sure the progress bar and onion status</span>
<a name="l00966"></a>00966 <span class="comment">   * icon don&#39;t overlap briefly. This is pretty hacktastic. */</span>
<a name="l00967"></a>00967   <span class="keywordflow">if</span> (visible) {
<a name="l00968"></a>00968     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatus-&gt;setVisible(<span class="keyword">false</span>);
<a name="l00969"></a>00969     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatusImg-&gt;setVisible(<span class="keyword">false</span>);
<a name="l00970"></a>00970     repaint(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.grpStatus-&gt;rect());
<a name="l00971"></a>00971     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartupProgress-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00972"></a>00972     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00973"></a>00973   } <span class="keywordflow">else</span> {
<a name="l00974"></a>00974     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartupProgress-&gt;setVisible(<span class="keyword">false</span>);
<a name="l00975"></a>00975     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar-&gt;setVisible(<span class="keyword">false</span>);
<a name="l00976"></a>00976     repaint(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.grpStatus-&gt;rect());
<a name="l00977"></a>00977     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatus-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00978"></a>00978     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatusImg-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00979"></a>00979   }
<a name="l00980"></a>00980 }
<a name="l00981"></a>00981 <span class="comment"></span>
<a name="l00982"></a>00982 <span class="comment">/** Sets the progress bar completion value to &lt;b&gt;progressValue&lt;/b&gt; and sets</span>
<a name="l00983"></a>00983 <span class="comment"> * the status text to &lt;b&gt;description&lt;/b&gt;. */</span>
<a name="l00984"></a>00984 <span class="keywordtype">void</span>
<a name="l00985"></a><a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">00985</a> <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">MainWindow::setStartupProgress</a>(<span class="keywordtype">int</span> progressValue,
<a name="l00986"></a>00986                                <span class="keyword">const</span> QString &amp;description)
<a name="l00987"></a>00987 {
<a name="l00988"></a>00988   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar-&gt;setValue(progressValue);
<a name="l00989"></a>00989   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartupProgress-&gt;setText(description);
<a name="l00990"></a>00990   <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.setToolTip(description);
<a name="l00991"></a>00991 }
<a name="l00992"></a>00992 <span class="comment"></span>
<a name="l00993"></a>00993 <span class="comment">/** Attempts to start Tor. If Tor fails to start, then startFailed() will be</span>
<a name="l00994"></a>00994 <span class="comment"> * called with an error message containing the reason. */</span>
<a name="l00995"></a>00995 <span class="keywordtype">void</span> 
<a name="l00996"></a><a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">00996</a> <a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">MainWindow::start</a>()
<a name="l00997"></a>00997 {
<a name="l00998"></a>00998   <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l00999"></a>00999   QStringList args;
<a name="l01000"></a>01000 
<a name="l01001"></a>01001   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29ab3362701808cf4c449b0300d82cc7050">Starting</a>);
<a name="l01002"></a>01002 
<a name="l01003"></a>01003   <span class="comment">/* Check if Tor is already running separately */</span>
<a name="l01004"></a>01004   <span class="keywordflow">if</span> (<a class="code" href="net_8cpp.html#a320f9980ada2552fab0fa84330e02a8d">net_test_connect</a>(settings.<a class="code" href="class_tor_settings.html#a8c8e7b8fdfcf66b296027699be9df8c0">getControlAddress</a>(),
<a name="l01005"></a>01005                        settings.<a class="code" href="class_tor_settings.html#ac56fca68ce51ed303554b14ab840fbe9">getControlPort</a>())) {
<a name="l01006"></a>01006     <a class="code" href="class_main_window.html#a1669a3fdc8cc2ccf8afa534500af6b1c">started</a>();
<a name="l01007"></a>01007     <span class="keywordflow">return</span>;
<a name="l01008"></a>01008   }
<a name="l01009"></a>01009 
<a name="l01010"></a>01010   <span class="comment">/* Make sure the torrc we want to use really exists. */</span>
<a name="l01011"></a>01011   QString torrc = settings.<a class="code" href="class_tor_settings.html#a7a4536abf52cdfd8aa505b37b07c7812">getTorrc</a>();
<a name="l01012"></a>01012   <span class="keywordflow">if</span> (!torrc.isEmpty()) {
<a name="l01013"></a>01013     <span class="keywordflow">if</span> (!QFileInfo(torrc).exists())
<a name="l01014"></a>01014       <a class="code" href="file_8cpp.html#a78d929c62dc850cf52672fa1904729b5">touch_file</a>(torrc, <span class="keyword">true</span>);
<a name="l01015"></a>01015     args &lt;&lt; <span class="stringliteral">&quot;-f&quot;</span> &lt;&lt; torrc;
<a name="l01016"></a>01016   }
<a name="l01017"></a>01017 
<a name="l01018"></a>01018   <span class="comment">/* Specify Tor&#39;s data directory, if different from the default */</span>
<a name="l01019"></a>01019   QString dataDirectory = settings.<a class="code" href="class_tor_settings.html#ad633bcf9223274b69a2b47cbf6299564">getDataDirectory</a>();
<a name="l01020"></a>01020   <span class="keywordflow">if</span> (!dataDirectory.isEmpty())
<a name="l01021"></a>01021     args &lt;&lt; <span class="stringliteral">&quot;DataDirectory&quot;</span> &lt;&lt; <a class="code" href="file_8cpp.html#aaa3960262cc91df6d2400eb7ba888ae5">expand_filename</a>(dataDirectory);
<a name="l01022"></a>01022   
<a name="l01023"></a>01023   <span class="comment">/* Add the intended control port value */</span>
<a name="l01024"></a>01024   quint16 controlPort = settings.<a class="code" href="class_tor_settings.html#ac56fca68ce51ed303554b14ab840fbe9">getControlPort</a>();
<a name="l01025"></a>01025   <span class="keywordflow">if</span> (controlPort)
<a name="l01026"></a>01026     args &lt;&lt; <span class="stringliteral">&quot;ControlPort&quot;</span> &lt;&lt; QString::number(controlPort);
<a name="l01027"></a>01027   
<a name="l01028"></a>01028   <span class="comment">/* Add the control port authentication arguments */</span>
<a name="l01029"></a>01029   <span class="keywordflow">switch</span> (settings.<a class="code" href="class_tor_settings.html#a0f3b0120adc4431eb94191c32004c585">getAuthenticationMethod</a>()) {
<a name="l01030"></a>01030     <span class="keywordflow">case</span> <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1ae49465a79f8372aba78a866ef2502a3e">TorSettings::PasswordAuth</a>:
<a name="l01031"></a>01031       <span class="keywordflow">if</span> (! <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>-&gt;readPasswordFromStdin()) {
<a name="l01032"></a>01032         <span class="keywordflow">if</span> (settings.<a class="code" href="class_tor_settings.html#aca0acbd8f89e1f5e6325dbb1ac2ea125">useRandomPassword</a>()) {
<a name="l01033"></a>01033           <a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a> = <a class="code" href="class_tor_settings.html#a1cc2e9149f5840a8b81a99f6710c4b00">TorSettings::randomPassword</a>();
<a name="l01034"></a>01034           <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">false</span>;
<a name="l01035"></a>01035         } <span class="keywordflow">else</span> {
<a name="l01036"></a>01036           <a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a> = settings.<a class="code" href="class_tor_settings.html#a28dccb2d34d4dff1a808f7573c001d18">getControlPassword</a>();
<a name="l01037"></a>01037           <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">true</span>;
<a name="l01038"></a>01038         }
<a name="l01039"></a>01039       }
<a name="l01040"></a>01040       args &lt;&lt; <span class="stringliteral">&quot;HashedControlPassword&quot;</span>
<a name="l01041"></a>01041            &lt;&lt; <a class="code" href="class_tor_settings.html#afb3a530555b3eaa1c9cb47b2ad3eb62d">TorSettings::hashPassword</a>(<a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a>);
<a name="l01042"></a>01042       <span class="keywordflow">break</span>;
<a name="l01043"></a>01043     <span class="keywordflow">case</span> <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1a435fe035b1a8fd9c131d67e94ee37fe8">TorSettings::CookieAuth</a>:
<a name="l01044"></a>01044       args &lt;&lt; <span class="stringliteral">&quot;CookieAuthentication&quot;</span>  &lt;&lt; <span class="stringliteral">&quot;1&quot;</span>;
<a name="l01045"></a>01045       <span class="keywordflow">break</span>;
<a name="l01046"></a>01046     <span class="keywordflow">default</span>:
<a name="l01047"></a>01047       args &lt;&lt; <span class="stringliteral">&quot;CookieAuthentication&quot;</span>  &lt;&lt; <span class="stringliteral">&quot;0&quot;</span>;
<a name="l01048"></a>01048   }
<a name="l01049"></a>01049 
<a name="l01050"></a>01050   <span class="comment">/* This doesn&#39;t get set to false until Tor is actually up and running, so we</span>
<a name="l01051"></a>01051 <span class="comment">   * don&#39;t yell at users twice if their Tor doesn&#39;t even start, due to the fact</span>
<a name="l01052"></a>01052 <span class="comment">   * that QProcess::stopped() is emitted even if the process didn&#39;t even</span>
<a name="l01053"></a>01053 <span class="comment">   * start. */</span>
<a name="l01054"></a>01054   <a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a> = <span class="keyword">true</span>;
<a name="l01055"></a>01055   <span class="comment">/* Kick off the Tor process */</span>
<a name="l01056"></a>01056   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a473cddffe582b00988f58a7e8cd8d12d">start</a>(settings.<a class="code" href="class_tor_settings.html#ae2a2125f7135926245a68ed1a9c59f91">getExecutable</a>(), args);
<a name="l01057"></a>01057 }
<a name="l01058"></a>01058 <span class="comment"></span>
<a name="l01059"></a>01059 <span class="comment">/** Called when the Tor process fails to start, for example, because the path</span>
<a name="l01060"></a>01060 <span class="comment"> * specified to the Tor executable didn&#39;t lead to an executable. */</span>
<a name="l01061"></a>01061 <span class="keywordtype">void</span>
<a name="l01062"></a><a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">01062</a> <a class="code" href="class_main_window.html#a8a967a19a0fce1e10a10d670e91ebc68">MainWindow::startFailed</a>(QString errmsg)
<a name="l01063"></a>01063 {
<a name="l01064"></a>01064   <span class="comment">/* We don&#39;t display the error message for now, because the error message</span>
<a name="l01065"></a>01065 <span class="comment">   * that Qt gives us in this instance is almost always &quot;Unknown Error&quot;. That</span>
<a name="l01066"></a>01066 <span class="comment">   * will make users sad. */</span>
<a name="l01067"></a>01067   Q_UNUSED(errmsg);
<a name="l01068"></a>01068  
<a name="l01069"></a>01069   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>);
<a name="l01070"></a>01070 
<a name="l01071"></a>01071   <span class="comment">/* Display an error message and see if the user wants some help */</span>
<a name="l01072"></a>01072   <span class="keywordtype">int</span> response = <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error Starting Tor&quot;</span>),
<a name="l01073"></a>01073                    tr(<span class="stringliteral">&quot;Vidalia was unable to start Tor. Check your settings &quot;</span>
<a name="l01074"></a>01074                         <span class="stringliteral">&quot;to ensure the correct name and location of your Tor &quot;</span>
<a name="l01075"></a>01075                         <span class="stringliteral">&quot;executable is specified.&quot;</span>),
<a name="l01076"></a>01076                    <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa4585cee521bc7bf3576babf9f4321800">VMessageBox::ShowSettings</a>|VMessageBox::Default,
<a name="l01077"></a>01077                    <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>|VMessageBox::Escape,
<a name="l01078"></a>01078                    <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>);
<a name="l01079"></a>01079 
<a name="l01080"></a>01080   <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa4585cee521bc7bf3576babf9f4321800">VMessageBox::ShowSettings</a>) {
<a name="l01081"></a>01081     <span class="comment">/* Show the settings dialog so the user can make sure they&#39;re pointing to</span>
<a name="l01082"></a>01082 <span class="comment">     * the correct Tor. */</span>
<a name="l01083"></a>01083      <a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">showConfigDialog</a>();
<a name="l01084"></a>01084   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>) {
<a name="l01085"></a>01085     <span class="comment">/* Show troubleshooting information about starting Tor */</span>
<a name="l01086"></a>01086     <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(<span class="stringliteral">&quot;troubleshooting.start&quot;</span>);
<a name="l01087"></a>01087   }
<a name="l01088"></a>01088 }
<a name="l01089"></a>01089 <span class="comment"></span>
<a name="l01090"></a>01090 <span class="comment">/** Slot: Called when the Tor process is started. It will connect the control</span>
<a name="l01091"></a>01091 <span class="comment"> * socket and set the icons and tooltips accordingly. */</span>
<a name="l01092"></a>01092 <span class="keywordtype">void</span> 
<a name="l01093"></a><a class="code" href="class_main_window.html#a1669a3fdc8cc2ccf8afa534500af6b1c">01093</a> <a class="code" href="class_main_window.html#a1669a3fdc8cc2ccf8afa534500af6b1c">MainWindow::started</a>()
<a name="l01094"></a>01094 {
<a name="l01095"></a>01095   <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01096"></a>01096 
<a name="l01097"></a>01097   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a42855235adf7ea9ce6d3b77da9282182">Started</a>);
<a name="l01098"></a>01098 
<a name="l01099"></a>01099   <span class="comment">/* Now that Tor is running, we want to know if it dies when we didn&#39;t want</span>
<a name="l01100"></a>01100 <span class="comment">   * it to. */</span>
<a name="l01101"></a>01101   <a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a> = <span class="keyword">false</span>;
<a name="l01102"></a>01102   <span class="comment">/* We haven&#39;t started a delayed shutdown yet. */</span>
<a name="l01103"></a>01103   <a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a> = <span class="keyword">false</span>;
<a name="l01104"></a>01104   <span class="comment">/* Remember whether we started Tor or not */</span>
<a name="l01105"></a>01105   <a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a> = <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a3b8daa188aa325d28d75c62219c56c71">isVidaliaRunningTor</a>();
<a name="l01106"></a>01106   <span class="comment">/* Try to connect to Tor&#39;s control port */</span>
<a name="l01107"></a>01107   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a5395e9f73ba5686b50763f23b63c2741">connect</a>(settings.<a class="code" href="class_tor_settings.html#a8c8e7b8fdfcf66b296027699be9df8c0">getControlAddress</a>(),
<a name="l01108"></a>01108                        settings.<a class="code" href="class_tor_settings.html#ac56fca68ce51ed303554b14ab840fbe9">getControlPort</a>());
<a name="l01109"></a>01109   <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(<a class="code" href="_main_window_8cpp.html#a005d5b597965e382bb19900d14382086">STARTUP_PROGRESS_CONNECTING</a>, tr(<span class="stringliteral">&quot;Connecting to Tor&quot;</span>));
<a name="l01110"></a>01110 }
<a name="l01111"></a>01111 <span class="comment"></span>
<a name="l01112"></a>01112 <span class="comment">/** Called when the connection to the control socket fails. The reason will be</span>
<a name="l01113"></a>01113 <span class="comment"> * given in the errmsg parameter. */</span>
<a name="l01114"></a>01114 <span class="keywordtype">void</span>
<a name="l01115"></a><a class="code" href="class_main_window.html#a5ea672c219719ce6cbf7a0386483123f">01115</a> <a class="code" href="class_main_window.html#a5ea672c219719ce6cbf7a0386483123f">MainWindow::connectFailed</a>(QString errmsg)
<a name="l01116"></a>01116 {
<a name="l01117"></a>01117   <span class="comment">/* Ok, ok. It really isn&#39;t going to connect. I give up. */</span>
<a name="l01118"></a>01118   <span class="keywordtype">int</span> response = <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, 
<a name="l01119"></a>01119                    tr(<span class="stringliteral">&quot;Connection Error&quot;</span>), <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(errmsg),
<a name="l01120"></a>01120                    <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default|VMessageBox::Escape, 
<a name="l01121"></a>01121                    <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa5230f2ab252df55b2bd88744e8127612">VMessageBox::Retry</a>, <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>);
<a name="l01122"></a>01122 
<a name="l01123"></a>01123 
<a name="l01124"></a>01124   <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa5230f2ab252df55b2bd88744e8127612">VMessageBox::Retry</a>) {
<a name="l01125"></a>01125     <span class="comment">/* Let&#39;s give it another try. */</span>
<a name="l01126"></a>01126     <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01127"></a>01127     <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a5395e9f73ba5686b50763f23b63c2741">connect</a>(settings.<a class="code" href="class_tor_settings.html#a8c8e7b8fdfcf66b296027699be9df8c0">getControlAddress</a>(),
<a name="l01128"></a>01128                          settings.<a class="code" href="class_tor_settings.html#ac56fca68ce51ed303554b14ab840fbe9">getControlPort</a>());
<a name="l01129"></a>01129   } <span class="keywordflow">else</span> {
<a name="l01130"></a>01130     <span class="comment">/* Show the help browser (if requested) */</span>
<a name="l01131"></a>01131     <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>)
<a name="l01132"></a>01132       <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(<span class="stringliteral">&quot;troubleshooting.connect&quot;</span>);
<a name="l01133"></a>01133     <span class="comment">/* Since Vidalia can&#39;t connect, we can&#39;t really do much, so stop Tor. */</span>
<a name="l01134"></a>01134     <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ae4a495462e3aa5db88502c58d1fa771f">stop</a>();
<a name="l01135"></a>01135   }
<a name="l01136"></a>01136 }
<a name="l01137"></a>01137 <span class="comment"></span>
<a name="l01138"></a>01138 <span class="comment">/** Disconnects the control socket and stops the Tor process. */</span>
<a name="l01139"></a>01139 <span class="keywordtype">bool</span>
<a name="l01140"></a><a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">01140</a> <a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">MainWindow::stop</a>()
<a name="l01141"></a>01141 {
<a name="l01142"></a>01142   <a class="code" href="class_server_settings.html">ServerSettings</a> server(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>);
<a name="l01143"></a>01143   QString errmsg;
<a name="l01144"></a>01144   <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29">TorStatus</a> prevStatus;
<a name="l01145"></a>01145   <span class="keywordtype">bool</span> rc;
<a name="l01146"></a>01146 
<a name="l01147"></a>01147   <span class="comment">/* If we&#39;re running a server, give users the option of terminating</span>
<a name="l01148"></a>01148 <span class="comment">   * gracefully so clients have time to find new servers. */</span>
<a name="l01149"></a>01149   <span class="keywordflow">if</span> (server.<a class="code" href="class_server_settings.html#ad8d3c25facf05765a5379421a5f80da5">isServerEnabled</a>() &amp;&amp; !<a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a>) {
<a name="l01150"></a>01150     <span class="comment">/* Ask the user if they want to shutdown nicely. */</span>
<a name="l01151"></a>01151     <span class="keywordtype">int</span> response = <a class="code" href="class_v_message_box.html#a93d207010ff4260cdb0f7b07f4ec35c5">VMessageBox::question</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Relaying is Enabled&quot;</span>),
<a name="l01152"></a>01152                      tr(<span class="stringliteral">&quot;You are currently running a relay. &quot;</span>
<a name="l01153"></a>01153                         <span class="stringliteral">&quot;Terminating your relay will interrupt any &quot;</span>
<a name="l01154"></a>01154                         <span class="stringliteral">&quot;open connections from clients.\n\n&quot;</span>
<a name="l01155"></a>01155                         <span class="stringliteral">&quot;Would you like to shutdown gracefully and &quot;</span>
<a name="l01156"></a>01156                         <span class="stringliteral">&quot;give clients time to find a new relay?&quot;</span>),
<a name="l01157"></a>01157                         <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa577bff592dc54f371a778c2da4371531">VMessageBox::Yes</a>|VMessageBox::Default, 
<a name="l01158"></a>01158                         <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa2f751522b897d818813d04087e3ca181">VMessageBox::No</a>, 
<a name="l01159"></a>01159                         <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>|VMessageBox::Escape);
<a name="l01160"></a>01160     <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa577bff592dc54f371a778c2da4371531">VMessageBox::Yes</a>)
<a name="l01161"></a>01161       <a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a> = <span class="keyword">true</span>;
<a name="l01162"></a>01162     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>)
<a name="l01163"></a>01163       <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01164"></a>01164   }
<a name="l01165"></a>01165   
<a name="l01166"></a>01166   prevStatus = <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a1428963975ee498a98af8e6caaf411e8">Stopping</a>);  
<a name="l01167"></a>01167   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a>) {
<a name="l01168"></a>01168     <span class="comment">/* Start a delayed shutdown */</span>
<a name="l01169"></a>01169     rc = <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a373ecec8dbb7af273099d72a82a4d797">signal</a>(<a class="code" href="class_tor_signal.html#ab1820803604813483f918d131bcf281fa7a524d8ade4d072184e7b60e41753dde">TorSignal::Shutdown</a>, &amp;errmsg);
<a name="l01170"></a>01170   } <span class="keywordflow">else</span> {
<a name="l01171"></a>01171     <span class="comment">/* We want Tor to stop now, regardless of whether we&#39;re a server. */</span>
<a name="l01172"></a>01172     <a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a> = <span class="keyword">true</span>;
<a name="l01173"></a>01173     rc = <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ae4a495462e3aa5db88502c58d1fa771f">stop</a>(&amp;errmsg);
<a name="l01174"></a>01174   }
<a name="l01175"></a>01175   
<a name="l01176"></a>01176   <span class="keywordflow">if</span> (!rc) {
<a name="l01177"></a>01177     <span class="comment">/* We couldn&#39;t tell Tor to stop, for some reason. */</span>
<a name="l01178"></a>01178     <span class="keywordtype">int</span> response = <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error Shutting Down&quot;</span>),
<a name="l01179"></a>01179                      <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia was unable to stop the Tor software.&quot;</span>)) 
<a name="l01180"></a>01180                        + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(errmsg),
<a name="l01181"></a>01181                      <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default|VMessageBox::Escape, 
<a name="l01182"></a>01182                      <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>);
<a name="l01183"></a>01183       
<a name="l01184"></a>01184     <span class="keywordflow">if</span> (response == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>) {
<a name="l01185"></a>01185       <span class="comment">/* Show some troubleshooting help */</span>
<a name="l01186"></a>01186       <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(<span class="stringliteral">&quot;troubleshooting.stop&quot;</span>);
<a name="l01187"></a>01187     }
<a name="l01188"></a>01188     <span class="comment">/* Tor is still running since stopping failed */</span>
<a name="l01189"></a>01189     <a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a> = <span class="keyword">false</span>;
<a name="l01190"></a>01190     <a class="code" href="class_main_window.html#a9bd36b1c31a6bd9b2c142c79ef70bcaa">_delayedShutdownStarted</a> = <span class="keyword">false</span>;
<a name="l01191"></a>01191     <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(prevStatus);
<a name="l01192"></a>01192   }
<a name="l01193"></a>01193   <span class="keywordflow">return</span> rc;
<a name="l01194"></a>01194 }
<a name="l01195"></a>01195 <span class="comment"></span>
<a name="l01196"></a>01196 <span class="comment">/** Slot: Called when the Tor process has exited. It will adjust the tray</span>
<a name="l01197"></a>01197 <span class="comment"> * icons and tooltips accordingly. */</span>
<a name="l01198"></a>01198 <span class="keywordtype">void</span> 
<a name="l01199"></a><a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">01199</a> <a class="code" href="class_main_window.html#a62134556f87428be16742440c244cabe">MainWindow::stopped</a>(<span class="keywordtype">int</span> exitCode, QProcess::ExitStatus exitStatus)
<a name="l01200"></a>01200 {
<a name="l01201"></a>01201   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>);
<a name="l01202"></a>01202 
<a name="l01203"></a>01203   <span class="comment">/* If we didn&#39;t intentionally close Tor, then check to see if it crashed or</span>
<a name="l01204"></a>01204 <span class="comment">   * if it closed itself and returned an error code. */</span>
<a name="l01205"></a>01205   <span class="keywordflow">if</span> (!<a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a>) {
<a name="l01206"></a>01206     <span class="comment">/* A quick overview of Tor&#39;s code tells me that if it catches a SIGTERM or</span>
<a name="l01207"></a>01207 <span class="comment">     * SIGINT, Tor will exit(0). We might need to change this warning message</span>
<a name="l01208"></a>01208 <span class="comment">     * if this turns out to not be the case. */</span>
<a name="l01209"></a>01209     <span class="keywordflow">if</span> (exitStatus == QProcess::CrashExit || exitCode != 0) {
<a name="l01210"></a>01210       <span class="keywordtype">int</span> ret = <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Unexpected Error&quot;</span>),
<a name="l01211"></a>01211                   tr(<span class="stringliteral">&quot;Vidalia detected that the Tor software exited &quot;</span>
<a name="l01212"></a>01212                      <span class="stringliteral">&quot;unexpectedly.\n\n&quot;</span>
<a name="l01213"></a>01213                      <span class="stringliteral">&quot;Please check the message log for recent &quot;</span>
<a name="l01214"></a>01214                      <span class="stringliteral">&quot;warning or error messages.&quot;</span>),
<a name="l01215"></a>01215                   <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Escape, 
<a name="l01216"></a>01216                   <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa86d321b14db59f70d818d09220a21ae9">VMessageBox::ShowLog</a>|VMessageBox::Default,
<a name="l01217"></a>01217                   <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>);
<a name="l01218"></a>01218       <span class="keywordflow">if</span> (ret == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa86d321b14db59f70d818d09220a21ae9">VMessageBox::ShowLog</a>)
<a name="l01219"></a>01219         <a class="code" href="class_main_window.html#aff9b5348700b0560eebdd7ca38c1a70a">_messageLog</a>-&gt;<a class="code" href="class_vidalia_window.html#a58aa3cff3f3cd54497431cef227df8b6">showWindow</a>();  
<a name="l01220"></a>01220       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa68f832e8b6b8e204234b95741e1ebadc">VMessageBox::Help</a>)
<a name="l01221"></a>01221         <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(<span class="stringliteral">&quot;troubleshooting.torexited&quot;</span>);
<a name="l01222"></a>01222     }
<a name="l01223"></a>01223   }
<a name="l01224"></a>01224 }
<a name="l01225"></a>01225 <span class="comment"></span>
<a name="l01226"></a>01226 <span class="comment">/** Called when the control socket has successfully connected to Tor. */</span>
<a name="l01227"></a>01227 <span class="keywordtype">void</span>
<a name="l01228"></a><a class="code" href="class_main_window.html#ab0f207dba0ad81324d034d29988f8fd3">01228</a> <a class="code" href="class_main_window.html#ab0f207dba0ad81324d034d29988f8fd3">MainWindow::connected</a>()
<a name="l01229"></a>01229 {
<a name="l01230"></a>01230   <a class="code" href="class_main_window.html#aa21835d4d00bced00ba61ff23f1f725c">authenticate</a>();
<a name="l01231"></a>01231 }
<a name="l01232"></a>01232 <span class="comment"></span>
<a name="l01233"></a>01233 <span class="comment">/** Called when Vidalia wants to disconnect from a Tor it did not start. */</span>
<a name="l01234"></a>01234 <span class="keywordtype">void</span>
<a name="l01235"></a><a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">01235</a> <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">MainWindow::disconnect</a>()
<a name="l01236"></a>01236 {
<a name="l01237"></a>01237   <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a60f52470bbc94d0939b08e0d022e138e">disconnect</a>();
<a name="l01238"></a>01238 }
<a name="l01239"></a>01239 <span class="comment"></span>
<a name="l01240"></a>01240 <span class="comment">/** Called when the control socket has been disconnected. */</span>
<a name="l01241"></a>01241 <span class="keywordtype">void</span>
<a name="l01242"></a><a class="code" href="class_main_window.html#aa4f105b7d0e0c56c5051e89710c852d6">01242</a> <a class="code" href="class_main_window.html#aa4f105b7d0e0c56c5051e89710c852d6">MainWindow::disconnected</a>()
<a name="l01243"></a>01243 {
<a name="l01244"></a>01244   <span class="keywordflow">if</span> (!<a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a>) {
<a name="l01245"></a>01245     <span class="comment">/* If we didn&#39;t start our own Tor process, interpret losing the control</span>
<a name="l01246"></a>01246 <span class="comment">     * connection as &quot;Tor is stopped&quot;. */</span>
<a name="l01247"></a>01247     <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>);
<a name="l01248"></a>01248   }
<a name="l01249"></a>01249   
<a name="l01250"></a>01250   <span class="comment">/*XXX We should warn here if we get disconnected when we didn&#39;t intend to */</span>
<a name="l01251"></a>01251   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l01252"></a>01252   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l01253"></a>01253   <a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a> = <span class="keyword">false</span>;
<a name="l01254"></a>01254 }
<a name="l01255"></a>01255 <span class="comment"></span>
<a name="l01256"></a>01256 <span class="comment">/** Attempts to authenticate to Tor&#39;s control port, depending on the</span>
<a name="l01257"></a>01257 <span class="comment"> * authentication method specified in TorSettings::getAuthenticationMethod().</span>
<a name="l01258"></a>01258 <span class="comment"> */</span>
<a name="l01259"></a>01259 <span class="keywordtype">bool</span>
<a name="l01260"></a><a class="code" href="class_main_window.html#aa21835d4d00bced00ba61ff23f1f725c">01260</a> <a class="code" href="class_main_window.html#aa21835d4d00bced00ba61ff23f1f725c">MainWindow::authenticate</a>()
<a name="l01261"></a>01261 {
<a name="l01262"></a>01262   <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1">TorSettings::AuthenticationMethod</a> authMethod;
<a name="l01263"></a>01263   <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01264"></a>01264   <a class="code" href="class_protocol_info.html">ProtocolInfo</a> pi;
<a name="l01265"></a>01265   
<a name="l01266"></a>01266   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a446b3ab93538bbb846c07874203d314c">Authenticating</a>);
<a name="l01267"></a>01267   <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(<a class="code" href="_main_window_8cpp.html#a15aa337f73ec517f31dd9fec1e80119c">STARTUP_PROGRESS_AUTHENTICATING</a>,
<a name="l01268"></a>01268                      tr(<span class="stringliteral">&quot;Authenticating to Tor&quot;</span>));
<a name="l01269"></a>01269 
<a name="l01270"></a>01270   authMethod = settings.<a class="code" href="class_tor_settings.html#a0f3b0120adc4431eb94191c32004c585">getAuthenticationMethod</a>(); 
<a name="l01271"></a>01271   pi = <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ae8585adc887fffe1aa2ce276b01dd99d">protocolInfo</a>();
<a name="l01272"></a>01272   <span class="keywordflow">if</span> (!pi.<a class="code" href="class_protocol_info.html#a354cf24304445c92ee83a35ff6561d3c">isEmpty</a>()) {
<a name="l01273"></a>01273     QStringList authMethods = pi.<a class="code" href="class_protocol_info.html#acd18be6390cb6d5a8bd3e8632e56fffb">authMethods</a>();
<a name="l01274"></a>01274     <span class="keywordflow">if</span> (authMethods.contains(<span class="stringliteral">&quot;COOKIE&quot;</span>))
<a name="l01275"></a>01275       authMethod = <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1a435fe035b1a8fd9c131d67e94ee37fe8">TorSettings::CookieAuth</a>;
<a name="l01276"></a>01276     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (authMethods.contains(<span class="stringliteral">&quot;HASHEDPASSWORD&quot;</span>))
<a name="l01277"></a>01277       authMethod = <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1ae49465a79f8372aba78a866ef2502a3e">TorSettings::PasswordAuth</a>;
<a name="l01278"></a>01278     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (authMethods.contains(<span class="stringliteral">&quot;NULL&quot;</span>))
<a name="l01279"></a>01279       authMethod = <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1a79d67ba56428df159a0def329d86b42d">TorSettings::NullAuth</a>;
<a name="l01280"></a>01280   }
<a name="l01281"></a>01281   
<a name="l01282"></a>01282   <span class="keywordflow">if</span> (authMethod == <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1a435fe035b1a8fd9c131d67e94ee37fe8">TorSettings::CookieAuth</a>) {
<a name="l01283"></a>01283     <span class="comment">/* Try to load an auth cookie and send it to Tor */</span>
<a name="l01284"></a>01284     QByteArray cookie = <a class="code" href="class_main_window.html#a95924c0577a8e434fbdd4a7c17722a99">loadControlCookie</a>(pi.<a class="code" href="class_protocol_info.html#aa6316295d55f5b2d82984b2ed1c3ec17">cookieAuthFile</a>());
<a name="l01285"></a>01285     <span class="keywordflow">while</span> (cookie.isEmpty()) {
<a name="l01286"></a>01286       <span class="comment">/* Prompt the user to find their control_auth_cookie */</span>
<a name="l01287"></a>01287       <span class="keywordtype">int</span> ret = <a class="code" href="class_v_message_box.html#a93d207010ff4260cdb0f7b07f4ec35c5">VMessageBox::question</a>(<span class="keyword">this</span>,
<a name="l01288"></a>01288                   tr(<span class="stringliteral">&quot;Cookie Authentication Required&quot;</span>),
<a name="l01289"></a>01289                   <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;The Tor software requires Vidalia to send the &quot;</span>
<a name="l01290"></a>01290                        <span class="stringliteral">&quot;contents of an authentication cookie, but Vidalia &quot;</span>
<a name="l01291"></a>01291                        <span class="stringliteral">&quot;was unable to find one.&quot;</span>))
<a name="l01292"></a>01292                   + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Would you like to browse for the file &quot;</span>
<a name="l01293"></a>01293                          <span class="stringliteral">&quot;&#39;control_auth_cookie&#39; yourself?&quot;</span>)),
<a name="l01294"></a>01294                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa7c333a4810dd939154c8735522ab3960">VMessageBox::Browse</a>|VMessageBox::Default,
<a name="l01295"></a>01295                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>|VMessageBox::Escape);
<a name="l01296"></a>01296       
<a name="l01297"></a>01297       <span class="keywordflow">if</span> (ret == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>)
<a name="l01298"></a>01298         <span class="keywordflow">goto</span> cancel;
<a name="l01299"></a>01299       QString cookieDir = QFileDialog::getOpenFileName(<span class="keyword">this</span>,
<a name="l01300"></a>01300                             tr(<span class="stringliteral">&quot;Data Directory&quot;</span>),
<a name="l01301"></a>01301                             settings.<a class="code" href="class_tor_settings.html#ad633bcf9223274b69a2b47cbf6299564">getDataDirectory</a>(),
<a name="l01302"></a>01302                             tr(<span class="stringliteral">&quot;Control Cookie (control_auth_cookie)&quot;</span>));
<a name="l01303"></a>01303       <span class="keywordflow">if</span> (cookieDir.isEmpty())
<a name="l01304"></a>01304         <span class="keywordflow">goto</span> cancel;
<a name="l01305"></a>01305       cookieDir = QFileInfo(cookieDir).absolutePath();
<a name="l01306"></a>01306       cookie = <a class="code" href="class_main_window.html#a95924c0577a8e434fbdd4a7c17722a99">loadControlCookie</a>(cookieDir);
<a name="l01307"></a>01307     }
<a name="l01308"></a>01308     <a class="code" href="_vidalia_8h.html#a61e4319b31bbbc7eb1a5724b487be75f">vNotice</a>(<span class="stringliteral">&quot;Authenticating using &#39;cookie&#39; authentication.&quot;</span>);
<a name="l01309"></a>01309     <span class="keywordflow">return</span> <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a2aa1d6903e8180eb685963bbf8f62b19">authenticate</a>(cookie);
<a name="l01310"></a>01310   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (authMethod == <a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1ae49465a79f8372aba78a866ef2502a3e">TorSettings::PasswordAuth</a>) {
<a name="l01311"></a>01311     <span class="comment">/* Get the control password and send it to Tor */</span>
<a name="l01312"></a>01312     <a class="code" href="_vidalia_8h.html#a61e4319b31bbbc7eb1a5724b487be75f">vNotice</a>(<span class="stringliteral">&quot;Authenticating using &#39;hashed password&#39; authentication.&quot;</span>);
<a name="l01313"></a>01313     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a>) {
<a name="l01314"></a>01314       <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01315"></a>01315       <a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a> = settings.<a class="code" href="class_tor_settings.html#a28dccb2d34d4dff1a808f7573c001d18">getControlPassword</a>();
<a name="l01316"></a>01316     }
<a name="l01317"></a>01317     <span class="keywordflow">return</span> <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a2aa1d6903e8180eb685963bbf8f62b19">authenticate</a>(<a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a>);
<a name="l01318"></a>01318   }
<a name="l01319"></a>01319   <span class="comment">/* No authentication. Send an empty password. */</span>
<a name="l01320"></a>01320   <a class="code" href="_vidalia_8h.html#a61e4319b31bbbc7eb1a5724b487be75f">vNotice</a>(<span class="stringliteral">&quot;Authenticating using &#39;null&#39; authentication.&quot;</span>);
<a name="l01321"></a>01321   <span class="keywordflow">return</span> <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a2aa1d6903e8180eb685963bbf8f62b19">authenticate</a>(QString(<span class="stringliteral">&quot;&quot;</span>));
<a name="l01322"></a>01322 
<a name="l01323"></a>01323 cancel:
<a name="l01324"></a>01324   <a class="code" href="_vidalia_8h.html#a6d8c1ad992d06eece6f19b8246219779">vWarn</a>(<span class="stringliteral">&quot;Cancelling control authentication attempt.&quot;</span>);
<a name="l01325"></a>01325   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a>)
<a name="l01326"></a>01326     <a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">stop</a>();
<a name="l01327"></a>01327   <span class="keywordflow">else</span>
<a name="l01328"></a>01328     <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">disconnect</a>();
<a name="l01329"></a>01329   <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01330"></a>01330 }
<a name="l01331"></a>01331 <span class="comment"></span>
<a name="l01332"></a>01332 <span class="comment">/** Called when Vidalia has successfully authenticated to Tor. */</span>
<a name="l01333"></a>01333 <span class="keywordtype">void</span>
<a name="l01334"></a><a class="code" href="class_main_window.html#a0f7533abcb80a89098b9c15a56c752b9">01334</a> <a class="code" href="class_main_window.html#a0f7533abcb80a89098b9c15a56c752b9">MainWindow::authenticated</a>()
<a name="l01335"></a>01335 {
<a name="l01336"></a>01336   <a class="code" href="class_server_settings.html">ServerSettings</a> serverSettings(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>);
<a name="l01337"></a>01337   QString errmsg;
<a name="l01338"></a>01338 
<a name="l01339"></a>01339   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a08635eaaf5abe009e2ec0d3628b31704">Authenticated</a>);
<a name="l01340"></a>01340   
<a name="l01341"></a>01341   <span class="comment">/* If Tor doesn&#39;t have bootstrapping events, then update the current</span>
<a name="l01342"></a>01342 <span class="comment">   * status string and bump the progress bar along a bit. */</span>
<a name="l01343"></a>01343   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() &lt; 0x020101) {
<a name="l01344"></a>01344     <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(<a class="code" href="_main_window_8cpp.html#ac8406c5c56e12825d6b44415dab4c95a">STARTUP_PROGRESS_CIRCUITBUILD</a>,
<a name="l01345"></a>01345                        tr(<span class="stringliteral">&quot;Connecting to the Tor network&quot;</span>));
<a name="l01346"></a>01346   }
<a name="l01347"></a>01347   
<a name="l01348"></a>01348   <span class="comment">/* Let people click on their beloved &quot;New Identity&quot; button */</span>
<a name="l01349"></a>01349   <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l01350"></a>01350   <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l01351"></a>01351 
<a name="l01352"></a>01352   <span class="comment">/* Register for any pertinent asynchronous events. */</span>
<a name="l01353"></a>01353   <span class="keywordflow">if</span> (!<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a303b58f6d75569ee54478d55ede26464">setEvents</a>(&amp;errmsg)) {
<a name="l01354"></a>01354     <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Error Registering for Events&quot;</span>),
<a name="l01355"></a>01355       <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia was unable to register for some events. &quot;</span>
<a name="l01356"></a>01356            <span class="stringliteral">&quot;Many of Vidalia&#39;s features may be unavailable.&quot;</span>))
<a name="l01357"></a>01357          + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(errmsg),
<a name="l01358"></a>01358       <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01359"></a>01359   } <span class="keywordflow">else</span> {
<a name="l01360"></a>01360     <span class="comment">/* Stop reading from Tor&#39;s stdout immediately, since we successfully</span>
<a name="l01361"></a>01361 <span class="comment">     * registered for Tor events, including any desired log events. */</span>
<a name="l01362"></a>01362     <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#aff3b0c7fe437bbfc27c0705b5ac569ee">closeTorStdout</a>();
<a name="l01363"></a>01363   }
<a name="l01364"></a>01364 
<a name="l01365"></a>01365   <span class="comment">/* Configure UPnP port forwarding if needed */</span>
<a name="l01366"></a>01366   serverSettings.<a class="code" href="class_server_settings.html#a23f08c9a01e392157a092edefa9fcae0">configurePortForwarding</a>();
<a name="l01367"></a>01367 
<a name="l01368"></a>01368   <span class="comment">/* Check if Tor has a circuit established */</span>
<a name="l01369"></a>01369   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a2b389a9436a6beb699dac04b95ace7ac">isCircuitEstablished</a>())
<a name="l01370"></a>01370     <a class="code" href="class_main_window.html#aa7b2a36723485c373a6bf36c4ed1c6df">circuitEstablished</a>();
<a name="l01371"></a>01371   <span class="comment">/* Check the status of Tor&#39;s version */</span>
<a name="l01372"></a>01372   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() &gt;= 0x020001)
<a name="l01373"></a>01373     <a class="code" href="class_main_window.html#a80a4ae6c3749c2248580361b621a1b67">checkTorVersion</a>();
<a name="l01374"></a>01374   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() &gt;= 0x020102) {
<a name="l01375"></a>01375     <a class="code" href="class_bootstrap_status.html">BootstrapStatus</a> status = <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a1f43146b9e125f2229a23f3509f73cf7">bootstrapStatus</a>();
<a name="l01376"></a>01376     <span class="keywordflow">if</span> (status.<a class="code" href="class_bootstrap_status.html#a32190fbb16214f74e7d68d4527d6ef2a">isValid</a>())
<a name="l01377"></a>01377       <a class="code" href="class_main_window.html#a2f43d1533e8e5fc43332c99d9eaad8c5">bootstrapStatusChanged</a>(status);
<a name="l01378"></a>01378   }
<a name="l01379"></a>01379 }
<a name="l01380"></a>01380 <span class="comment"></span>
<a name="l01381"></a>01381 <span class="comment">/** Called when Vidalia fails to authenticate to Tor. The failure reason is</span>
<a name="l01382"></a>01382 <span class="comment"> * specified in &lt;b&gt;errmsg&lt;/b&gt;. */</span>
<a name="l01383"></a>01383 <span class="keywordtype">void</span>
<a name="l01384"></a><a class="code" href="class_main_window.html#aeb84f73e494a051fb3d06a87481d3af7">01384</a> <a class="code" href="class_main_window.html#aeb84f73e494a051fb3d06a87481d3af7">MainWindow::authenticationFailed</a>(QString errmsg)
<a name="l01385"></a>01385 {
<a name="l01386"></a>01386   <span class="keywordtype">bool</span> retry = <span class="keyword">false</span>;
<a name="l01387"></a>01387   
<a name="l01388"></a>01388   <a class="code" href="_vidalia_8h.html#a6d8c1ad992d06eece6f19b8246219779">vWarn</a>(<span class="stringliteral">&quot;Authentication failed: %1&quot;</span>).arg(errmsg);
<a name="l01389"></a>01389 
<a name="l01390"></a>01390   <span class="comment">/* Parsing log messages is evil, but we&#39;re left with little option */</span>
<a name="l01391"></a>01391   <span class="keywordflow">if</span> (errmsg.contains(<span class="stringliteral">&quot;Password did not match&quot;</span>)) {
<a name="l01392"></a>01392     <a class="code" href="class_control_password_input_dialog.html">ControlPasswordInputDialog</a> dlg;
<a name="l01393"></a>01393     connect(&amp;dlg, SIGNAL(<a class="code" href="class_vidalia_window.html#add0cc6c3beec0d1e18a3dd467a903e6c">helpRequested</a>(QString)),
<a name="l01394"></a>01394             <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(QString)));
<a name="l01395"></a>01395 
<a name="l01396"></a>01396     qint64 torPid = 0;
<a name="l01397"></a>01397 
<a name="l01398"></a>01398 <span class="preprocessor">#if defined(Q_OS_WIN32)</span>
<a name="l01399"></a>01399 <span class="preprocessor"></span>    QHash&lt;qint64, QString&gt; procs = <a class="code" href="procutil_8cpp.html#ab7841f8a13c52978844e7ac73fffce3e">process_list</a>();
<a name="l01400"></a>01400     <span class="keywordflow">foreach</span> (qint64 pid, procs.keys()) {
<a name="l01401"></a>01401       <span class="keywordflow">if</span> (! procs.value(pid).compare(<span class="stringliteral">&quot;tor.exe&quot;</span>, Qt::CaseInsensitive)) {
<a name="l01402"></a>01402         torPid = pid;
<a name="l01403"></a>01403         <span class="keywordflow">break</span>;
<a name="l01404"></a>01404       }
<a name="l01405"></a>01405     }
<a name="l01406"></a>01406     dlg.<a class="code" href="class_control_password_input_dialog.html#ad9500b899b0c8adc18ec16616033c869">setResetEnabled</a>(torPid &gt; 0);
<a name="l01407"></a>01407 <span class="preprocessor">#else</span>
<a name="l01408"></a>01408 <span class="preprocessor"></span>    dlg.<a class="code" href="class_control_password_input_dialog.html#ad9500b899b0c8adc18ec16616033c869">setResetEnabled</a>(<span class="keyword">false</span>);
<a name="l01409"></a>01409 <span class="preprocessor">#endif</span>
<a name="l01410"></a>01410 <span class="preprocessor"></span>
<a name="l01411"></a>01411     <span class="keywordtype">int</span> ret = dlg.exec();
<a name="l01412"></a>01412     <span class="keywordflow">if</span> (ret == QDialogButtonBox::Ok) {
<a name="l01413"></a>01413       <span class="keywordflow">if</span> (dlg.<a class="code" href="class_control_password_input_dialog.html#a2093f4bed3877f194ddeee3dbf7b5577">isSavePasswordChecked</a>()) {
<a name="l01414"></a>01414         <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01415"></a>01415         settings.<a class="code" href="class_tor_settings.html#a8ff01f3a19743f26426819f80dd6ce57">setAuthenticationMethod</a>(<a class="code" href="class_tor_settings.html#a6b7351447aa44b7f19761e14544beff1ae49465a79f8372aba78a866ef2502a3e">TorSettings::PasswordAuth</a>);
<a name="l01416"></a>01416         settings.<a class="code" href="class_tor_settings.html#a12d6d3a7cee7e93c329ac821151017af">setUseRandomPassword</a>(<span class="keyword">false</span>);
<a name="l01417"></a>01417         settings.<a class="code" href="class_tor_settings.html#a0095d806557ebc89ff5e4c77a29da2f4">setControlPassword</a>(dlg.<a class="code" href="class_control_password_input_dialog.html#a06a4f947b33a6ccb40d0ee10e23cc363">password</a>());
<a name="l01418"></a>01418         <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">true</span>;
<a name="l01419"></a>01419       } <span class="keywordflow">else</span> {
<a name="l01420"></a>01420         <a class="code" href="class_main_window.html#a8277e96bf077a6cd6d8280d39e7d97a6">_controlPassword</a> = dlg.<a class="code" href="class_control_password_input_dialog.html#a06a4f947b33a6ccb40d0ee10e23cc363">password</a>();
<a name="l01421"></a>01421         <a class="code" href="class_main_window.html#a9703f47f99043f7ded1b761bd1cb0feb">_useSavedPassword</a> = <span class="keyword">false</span>;
<a name="l01422"></a>01422       }
<a name="l01423"></a>01423       retry = <span class="keyword">true</span>;
<a name="l01424"></a>01424     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == QDialogButtonBox::Reset) {
<a name="l01425"></a>01425       <span class="keywordflow">if</span> (! <a class="code" href="procutil_8cpp.html#adaca84b3676f00dc1318fb38a5f8d376">process_kill</a>(torPid)) {
<a name="l01426"></a>01426         <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>,
<a name="l01427"></a>01427           tr(<span class="stringliteral">&quot;Password Reset Failed&quot;</span>),
<a name="l01428"></a>01428           <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia tried to reset Tor&#39;s control password, but was not &quot;</span>
<a name="l01429"></a>01429                <span class="stringliteral">&quot;able to restart the Tor software. Please check your Task &quot;</span>
<a name="l01430"></a>01430                <span class="stringliteral">&quot;Manager to ensure there are no other Tor processes running.&quot;</span>)),
<a name="l01431"></a>01431                <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>|VMessageBox::Default);
<a name="l01432"></a>01432       } <span class="keywordflow">else</span> {
<a name="l01433"></a>01433         retry = <span class="keyword">true</span>;
<a name="l01434"></a>01434       }
<a name="l01435"></a>01435     }
<a name="l01436"></a>01436   } <span class="keywordflow">else</span> {
<a name="l01437"></a>01437     <span class="comment">/* Something else went wrong */</span>
<a name="l01438"></a>01438     <span class="keywordtype">int</span> ret = <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, 
<a name="l01439"></a>01439                 tr(<span class="stringliteral">&quot;Authentication Error&quot;</span>),
<a name="l01440"></a>01440                 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia was unable to authenticate to the Tor software. &quot;</span>
<a name="l01441"></a>01441                      <span class="stringliteral">&quot;(%1)&quot;</span>).arg(errmsg)) + 
<a name="l01442"></a>01442                 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Please check your control port authentication &quot;</span>
<a name="l01443"></a>01443                      <span class="stringliteral">&quot;settings.&quot;</span>)),
<a name="l01444"></a>01444                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa4585cee521bc7bf3576babf9f4321800">VMessageBox::ShowSettings</a>|VMessageBox::Default,
<a name="l01445"></a>01445                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa59f97f6727d326522ba5b132be867d52">VMessageBox::Cancel</a>|VMessageBox::Escape);
<a name="l01446"></a>01446     
<a name="l01447"></a>01447     <span class="keywordflow">if</span> (ret == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa4585cee521bc7bf3576babf9f4321800">VMessageBox::ShowSettings</a>)
<a name="l01448"></a>01448       <a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">showConfigDialog</a>(<a class="code" href="class_config_dialog.html#a76a284ede76eb7d829a5a50c3d2bbc53a01203a45dba0c35f1eeaabe79d890203">ConfigDialog::Advanced</a>);
<a name="l01449"></a>01449   }
<a name="l01450"></a>01450   
<a name="l01451"></a>01451   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#abe44c7f9281547aab2d317972519bd49">isRunning</a>())
<a name="l01452"></a>01452     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a>) 
<a name="l01453"></a>01453       <a class="code" href="class_main_window.html#a31cd81cd6f092480e02672dcab81338e">stop</a>();
<a name="l01454"></a>01454     <span class="keywordflow">else</span>
<a name="l01455"></a>01455       <a class="code" href="class_main_window.html#ac2886ac3cabca51c9b4ff8643dfbeff8">disconnect</a>();
<a name="l01456"></a>01456   <span class="keywordflow">if</span> (retry)
<a name="l01457"></a>01457     <a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>();
<a name="l01458"></a>01458 }
<a name="l01459"></a>01459 <span class="comment"></span>
<a name="l01460"></a>01460 <span class="comment">/** Searches for and attempts to load the control authentication cookie. This</span>
<a name="l01461"></a>01461 <span class="comment"> * assumes the cookie is named &#39;control_auth_cookie&#39;. If &lt;b&gt;cookiePath&lt;/b&gt; is</span>
<a name="l01462"></a>01462 <span class="comment"> * empty, this method will search some default locations depending on the</span>
<a name="l01463"></a>01463 <span class="comment"> * current platform. &lt;b&gt;cookiePath&lt;/b&gt; can point to either a cookie file or a</span>
<a name="l01464"></a>01464 <span class="comment"> * directory containing the cookie file. */</span>
<a name="l01465"></a>01465 QByteArray
<a name="l01466"></a><a class="code" href="class_main_window.html#a95924c0577a8e434fbdd4a7c17722a99">01466</a> <a class="code" href="class_main_window.html#a95924c0577a8e434fbdd4a7c17722a99">MainWindow::loadControlCookie</a>(QString cookiePath)
<a name="l01467"></a>01467 {
<a name="l01468"></a>01468   QFile authCookie;
<a name="l01469"></a>01469   QStringList pathList;
<a name="l01470"></a>01470 
<a name="l01471"></a>01471   <span class="keywordflow">if</span> (!cookiePath.isEmpty()) {
<a name="l01472"></a>01472     pathList &lt;&lt; cookiePath;
<a name="l01473"></a>01473   } <span class="keywordflow">else</span> {
<a name="l01474"></a>01474     <span class="comment">/* Try some default locations */</span>
<a name="l01475"></a>01475     <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01476"></a>01476     QString dataDir = settings.<a class="code" href="class_tor_settings.html#ad633bcf9223274b69a2b47cbf6299564">getDataDirectory</a>();
<a name="l01477"></a>01477     <span class="keywordflow">if</span> (!dataDir.isEmpty())
<a name="l01478"></a>01478       pathList &lt;&lt; dataDir;
<a name="l01479"></a>01479       
<a name="l01480"></a>01480 <span class="preprocessor">#if defined(Q_WS_WIN)</span>
<a name="l01481"></a>01481 <span class="preprocessor"></span>    pathList &lt;&lt; <a class="code" href="file_8cpp.html#aaa3960262cc91df6d2400eb7ba888ae5">expand_filename</a>(<span class="stringliteral">&quot;%APPDATA%\\Tor&quot;</span>);
<a name="l01482"></a>01482 <span class="preprocessor">#else</span>
<a name="l01483"></a>01483 <span class="preprocessor"></span>    pathList &lt;&lt; <a class="code" href="file_8cpp.html#aaa3960262cc91df6d2400eb7ba888ae5">expand_filename</a>(<span class="stringliteral">&quot;~/.tor&quot;</span>);
<a name="l01484"></a>01484 <span class="preprocessor">#endif</span>
<a name="l01485"></a>01485 <span class="preprocessor"></span>  }
<a name="l01486"></a>01486   
<a name="l01487"></a>01487   <span class="comment">/* Search for the cookie file */</span>
<a name="l01488"></a>01488   <span class="keywordflow">foreach</span> (QString path, pathList) {
<a name="l01489"></a>01489     QString cookieFile = QFileInfo(path).isFile() ?
<a name="l01490"></a>01490                           path : path + <span class="stringliteral">&quot;/control_auth_cookie&quot;</span>;
<a name="l01491"></a>01491     <a class="code" href="_vidalia_8h.html#ab2d9ba7f4501abfc0e0a2cb52d0f8105">vDebug</a>(<span class="stringliteral">&quot;Checking for authentication cookie in &#39;%1&#39;&quot;</span>).arg(cookieFile);
<a name="l01492"></a>01492     <span class="keywordflow">if</span> (!QFileInfo(cookieFile).exists())
<a name="l01493"></a>01493       <span class="keywordflow">continue</span>;
<a name="l01494"></a>01494     
<a name="l01495"></a>01495     authCookie.setFileName(cookieFile);
<a name="l01496"></a>01496     <span class="keywordflow">if</span> (authCookie.open(QIODevice::ReadOnly)) {
<a name="l01497"></a>01497       <a class="code" href="_vidalia_8h.html#a7743cb328f470aa8f382716fbcf61daa">vInfo</a>(<span class="stringliteral">&quot;Reading authentication cookie from &#39;%1&#39;&quot;</span>).arg(cookieFile);
<a name="l01498"></a>01498       <span class="keywordflow">return</span> authCookie.readAll();
<a name="l01499"></a>01499     } <span class="keywordflow">else</span> {
<a name="l01500"></a>01500       <a class="code" href="_vidalia_8h.html#a6d8c1ad992d06eece6f19b8246219779">vWarn</a>(<span class="stringliteral">&quot;Couldn&#39;t open cookie file &#39;%1&#39;: %2&quot;</span>)
<a name="l01501"></a>01501         .arg(cookieFile).arg(authCookie.errorString());
<a name="l01502"></a>01502     }
<a name="l01503"></a>01503   }
<a name="l01504"></a>01504   <a class="code" href="_vidalia_8h.html#a6d8c1ad992d06eece6f19b8246219779">vWarn</a>(<span class="stringliteral">&quot;Couldn&#39;t find a readable authentication cookie.&quot;</span>);
<a name="l01505"></a>01505   <span class="keywordflow">return</span> QByteArray();
<a name="l01506"></a>01506 }
<a name="l01507"></a>01507 <span class="comment"></span>
<a name="l01508"></a>01508 <span class="comment">/** Called when Tor has successfully established a circuit. */</span>
<a name="l01509"></a>01509 <span class="keywordtype">void</span>
<a name="l01510"></a><a class="code" href="class_main_window.html#aa7b2a36723485c373a6bf36c4ed1c6df">01510</a> <a class="code" href="class_main_window.html#aa7b2a36723485c373a6bf36c4ed1c6df">MainWindow::circuitEstablished</a>()
<a name="l01511"></a>01511 {
<a name="l01512"></a>01512   <a class="code" href="class_main_window.html#aced2319e61fe797840cccadbc25cb946">updateTorStatus</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29abf1c80d80297659c5b78b8ecc8d74600">CircuitEstablished</a>);
<a name="l01513"></a>01513   <a class="code" href="class_main_window.html#a856bd3de23b675c1877a686bf23eb026">setStartupProgress</a>(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar-&gt;maximum(),
<a name="l01514"></a>01514                      tr(<span class="stringliteral">&quot;Connected to the Tor network!&quot;</span>));
<a name="l01515"></a>01515   <a class="code" href="class_main_window.html#a224db3c16da30ed5cf7b3fd29e83bd1d">startSubprocesses</a>();
<a name="l01516"></a>01516 
<a name="l01517"></a>01517 <span class="preprocessor">#if defined(USE_AUTOUPDATE)</span>
<a name="l01518"></a>01518 <span class="preprocessor"></span>  <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l01519"></a>01519   <span class="keywordflow">if</span> (settings.<a class="code" href="class_vidalia_settings.html#a516d1a7fc2eab785eb6ae55365f6b2c1">isAutoUpdateEnabled</a>()) {
<a name="l01520"></a>01520     QDateTime lastCheckedAt = settings.<a class="code" href="class_vidalia_settings.html#a83dc08182ffcef59d8f2fea85ed46f82">lastCheckedForUpdates</a>();
<a name="l01521"></a>01521     <span class="keywordflow">if</span> (<a class="code" href="class_update_process.html#afe8256e9bfeac91f946b73036fbec004">UpdateProcess::shouldCheckForUpdates</a>(lastCheckedAt)) {
<a name="l01522"></a>01522       <span class="comment">/* Initiate a background check for updates now */</span>
<a name="l01523"></a>01523       _updateTimer.stop();
<a name="l01524"></a>01524       checkForUpdates();
<a name="l01525"></a>01525     }
<a name="l01526"></a>01526   }
<a name="l01527"></a>01527 <span class="preprocessor">#endif</span>
<a name="l01528"></a>01528 <span class="preprocessor"></span>}
<a name="l01529"></a>01529 <span class="comment"></span>
<a name="l01530"></a>01530 <span class="comment">/** Checks the status of the current version of Tor to see if it&#39;s old,</span>
<a name="l01531"></a>01531 <span class="comment"> * unrecommended, or obsolete. */</span>
<a name="l01532"></a>01532 <span class="keywordtype">void</span>
<a name="l01533"></a><a class="code" href="class_main_window.html#a80a4ae6c3749c2248580361b621a1b67">01533</a> <a class="code" href="class_main_window.html#a80a4ae6c3749c2248580361b621a1b67">MainWindow::checkTorVersion</a>()
<a name="l01534"></a>01534 {
<a name="l01535"></a>01535   QString status;
<a name="l01536"></a>01536   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a7bb6236b41505b30e8708c9f5cf8e8f7">getInfo</a>(<span class="stringliteral">&quot;status/version/current&quot;</span>, status)) {
<a name="l01537"></a>01537     <span class="keywordflow">if</span> (!status.compare(<span class="stringliteral">&quot;old&quot;</span>, Qt::CaseInsensitive)
<a name="l01538"></a>01538           || !status.compare(<span class="stringliteral">&quot;unrecommended&quot;</span>, Qt::CaseInsensitive)
<a name="l01539"></a>01539           || !status.compare(<span class="stringliteral">&quot;obsolete&quot;</span>, Qt::CaseInsensitive)) {
<a name="l01540"></a>01540       <a class="code" href="class_main_window.html#ab4d3f82e0ed6182676967298247035af">displayTorVersionWarning</a>();
<a name="l01541"></a>01541     }
<a name="l01542"></a>01542   }
<a name="l01543"></a>01543 }
<a name="l01544"></a>01544 <span class="comment"></span>
<a name="l01545"></a>01545 <span class="comment">/** Called when Tor thinks its version is old or unrecommended, and displays</span>
<a name="l01546"></a>01546 <span class="comment"> * a message notifying the user. */</span>
<a name="l01547"></a>01547 <span class="keywordtype">void</span>
<a name="l01548"></a><a class="code" href="class_main_window.html#a9a68029a06e5afdf7ab60ce3f36bd7a7">01548</a> <a class="code" href="class_main_window.html#a9a68029a06e5afdf7ab60ce3f36bd7a7">MainWindow::dangerousTorVersion</a>(<a class="code" href="namespacetc.html#a8389db682e80cb6921e26b529e2ec52c">tc::TorVersionStatus</a> reason,
<a name="l01549"></a>01549                                 <span class="keyword">const</span> QString &amp;current,
<a name="l01550"></a>01550                                 <span class="keyword">const</span> QStringList &amp;recommended)
<a name="l01551"></a>01551 {
<a name="l01552"></a>01552   Q_UNUSED(current);
<a name="l01553"></a>01553   Q_UNUSED(recommended);
<a name="l01554"></a>01554 
<a name="l01555"></a>01555   <span class="keywordflow">if</span> (reason == <a class="code" href="namespacetc.html#a8389db682e80cb6921e26b529e2ec52cae640350a91e5d706c041b20d8209946c">tc::ObsoleteTorVersion</a>
<a name="l01556"></a>01556         || reason == <a class="code" href="namespacetc.html#a8389db682e80cb6921e26b529e2ec52ca2edcd3c836745226bda504279710e413">tc::UnrecommendedTorVersion</a>)
<a name="l01557"></a>01557     <a class="code" href="class_main_window.html#ab4d3f82e0ed6182676967298247035af">displayTorVersionWarning</a>();
<a name="l01558"></a>01558 }
<a name="l01559"></a>01559 <span class="comment"></span>
<a name="l01560"></a>01560 <span class="comment">/** Called when Tor thinks its version is old or unrecommended, and displays a</span>
<a name="l01561"></a>01561 <span class="comment"> * message notifying the user. */</span>
<a name="l01562"></a>01562 <span class="keywordtype">void</span>
<a name="l01563"></a><a class="code" href="class_main_window.html#ab4d3f82e0ed6182676967298247035af">01563</a> <a class="code" href="class_main_window.html#ab4d3f82e0ed6182676967298247035af">MainWindow::displayTorVersionWarning</a>()
<a name="l01564"></a>01564 {
<a name="l01565"></a>01565   <span class="keyword">static</span> <span class="keywordtype">bool</span> alreadyWarned = <span class="keyword">false</span>;
<a name="l01566"></a>01566 
<a name="l01567"></a>01567   <span class="keywordflow">if</span> (!alreadyWarned) {
<a name="l01568"></a>01568 <span class="preprocessor">#if !defined(USE_AUTOUPDATE)</span>
<a name="l01569"></a>01569 <span class="preprocessor"></span>    QString website = <span class="stringliteral">&quot;https://www.torproject.org/&quot;</span>;
<a name="l01570"></a>01570 <span class="preprocessor"># if QT_VERSION &gt;= 0x040200</span>
<a name="l01571"></a>01571 <span class="preprocessor"></span>    website = QString(<span class="stringliteral">&quot;&lt;a href=\&quot;%1\&quot;&gt;%1&lt;/a&gt;&quot;</span>).arg(website);
<a name="l01572"></a>01572 <span class="preprocessor"># endif</span>
<a name="l01573"></a>01573 <span class="preprocessor"></span>
<a name="l01574"></a>01574     <a class="code" href="class_v_message_box.html#a3fa399ecd05615e0b8df5db3b1f08742">VMessageBox::information</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Tor Update Available&quot;</span>),
<a name="l01575"></a>01575       <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;The currently installed version of Tor is out of date or no longer &quot;</span>
<a name="l01576"></a>01576            <span class="stringliteral">&quot;recommended. Please visit the Tor website to download the latest &quot;</span>
<a name="l01577"></a>01577            <span class="stringliteral">&quot;version.&quot;</span>)) + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Tor website: %1&quot;</span>).arg(website)),
<a name="l01578"></a>01578       <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01579"></a>01579 <span class="preprocessor">#else</span>
<a name="l01580"></a>01580 <span class="preprocessor"></span>    <span class="keywordtype">int</span> ret = <a class="code" href="class_v_message_box.html#a3fa399ecd05615e0b8df5db3b1f08742">VMessageBox::information</a>(<span class="keyword">this</span>,
<a name="l01581"></a>01581                 tr(<span class="stringliteral">&quot;Tor Update Available&quot;</span>),
<a name="l01582"></a>01582                 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;The currently installed version of Tor is out of date &quot;</span>
<a name="l01583"></a>01583                      <span class="stringliteral">&quot;or no longer recommended.&quot;</span>))
<a name="l01584"></a>01584                   + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Would you like to check if a newer package is &quot;</span>
<a name="l01585"></a>01585                          <span class="stringliteral">&quot;available for installation?&quot;</span>)),
<a name="l01586"></a>01586                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa577bff592dc54f371a778c2da4371531">VMessageBox::Yes</a>|VMessageBox::Default,
<a name="l01587"></a>01587                 <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa2f751522b897d818813d04087e3ca181">VMessageBox::No</a>|VMessageBox::Escape);
<a name="l01588"></a>01588 
<a name="l01589"></a>01589     <span class="keywordflow">if</span> (ret == <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aa577bff592dc54f371a778c2da4371531">VMessageBox::Yes</a>)
<a name="l01590"></a>01590       checkForUpdatesWithUi();
<a name="l01591"></a>01591 <span class="preprocessor">#endif</span>
<a name="l01592"></a>01592 <span class="preprocessor"></span>    alreadyWarned = <span class="keyword">true</span>;
<a name="l01593"></a>01593   }
<a name="l01594"></a>01594 }
<a name="l01595"></a>01595 <span class="comment"></span>
<a name="l01596"></a>01596 <span class="comment">/** Called when Tor thinks the user has tried to connect to a port that</span>
<a name="l01597"></a>01597 <span class="comment"> * typically is used for unencrypted applications. Warns the user and allows</span>
<a name="l01598"></a>01598 <span class="comment"> * them to ignore future warnings on &lt;b&gt;port&lt;/b&gt;. It is possible that Tor</span>
<a name="l01599"></a>01599 <span class="comment"> * will produce multiple asynchronous status events warning of dangerous ports</span>
<a name="l01600"></a>01600 <span class="comment"> * while the message box is displayed (for example, while the user is away</span>
<a name="l01601"></a>01601 <span class="comment"> * from the keyboard), so subsequent messages will be discarded until the</span>
<a name="l01602"></a>01602 <span class="comment"> * first message box is dismissed. */</span>
<a name="l01603"></a>01603 <span class="keywordtype">void</span>
<a name="l01604"></a><a class="code" href="class_main_window.html#aaa5ac1cb0792df8165ec6188934de4d6">01604</a> <a class="code" href="class_main_window.html#aaa5ac1cb0792df8165ec6188934de4d6">MainWindow::warnDangerousPort</a>(quint16 port, <span class="keywordtype">bool</span> rejected)
<a name="l01605"></a>01605 {
<a name="l01606"></a>01606   <span class="keyword">static</span> QMessageBox *dlg = 0;
<a name="l01607"></a>01607 
<a name="l01608"></a>01608   <span class="comment">/* Don&#39;t display another message box until the first one is dismissed */</span>
<a name="l01609"></a>01609   <span class="keywordflow">if</span> (dlg)
<a name="l01610"></a>01610     <span class="keywordflow">return</span>;
<a name="l01611"></a>01611 
<a name="l01612"></a>01612   QString application;
<a name="l01613"></a>01613   <span class="keywordflow">switch</span> (port) {
<a name="l01614"></a>01614     <span class="keywordflow">case</span>  23:
<a name="l01615"></a>01615      application = tr(<span class="stringliteral">&quot;, probably Telnet, &quot;</span>);
<a name="l01616"></a>01616      <span class="keywordflow">break</span>;
<a name="l01617"></a>01617 
<a name="l01618"></a>01618     <span class="keywordflow">case</span> 109:
<a name="l01619"></a>01619     <span class="keywordflow">case</span> 110:
<a name="l01620"></a>01620     <span class="keywordflow">case</span> 143:
<a name="l01621"></a>01621       application = tr(<span class="stringliteral">&quot;, probably an email client, &quot;</span>); 
<a name="l01622"></a>01622       <span class="keywordflow">break</span>;
<a name="l01623"></a>01623 
<a name="l01624"></a>01624     <span class="keywordflow">default</span>:
<a name="l01625"></a>01625       application = <span class="stringliteral">&quot; &quot;</span>;
<a name="l01626"></a>01626   }
<a name="l01627"></a>01627 
<a name="l01628"></a>01628   QString text = tr(<span class="stringliteral">&quot;One of your applications%1appears to be making a &quot;</span>
<a name="l01629"></a>01629                     <span class="stringliteral">&quot;potentially unencrypted and unsafe connection to port %2.&quot;</span>)
<a name="l01630"></a>01630                     .arg(application).arg(port);
<a name="l01631"></a>01631 
<a name="l01632"></a>01632   QString extraText = <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Anything sent over this connection could be &quot;</span>
<a name="l01633"></a>01633                            <span class="stringliteral">&quot;monitored. Please check your application&#39;s &quot;</span>
<a name="l01634"></a>01634                            <span class="stringliteral">&quot;configuration and use only encrypted protocols, &quot;</span>
<a name="l01635"></a>01635                            <span class="stringliteral">&quot;such as SSL, if possible.&quot;</span>));
<a name="l01636"></a>01636   <span class="keywordflow">if</span> (rejected) {
<a name="l01637"></a>01637     extraText.append(<a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Tor has automatically closed your connection in &quot;</span>
<a name="l01638"></a>01638                           <span class="stringliteral">&quot;order to protect your anonymity.&quot;</span>)));
<a name="l01639"></a>01639   }
<a name="l01640"></a>01640 
<a name="l01641"></a>01641   dlg = <span class="keyword">new</span> QMessageBox(QMessageBox::Warning,
<a name="l01642"></a>01642                         tr(<span class="stringliteral">&quot;Potentially Unsafe Connection&quot;</span>), text,
<a name="l01643"></a>01643                         QMessageBox::Ok | QMessageBox::Ignore);
<a name="l01644"></a>01644   dlg-&gt;setInformativeText(extraText);
<a name="l01645"></a>01645   dlg-&gt;setDefaultButton(QMessageBox::Ok);
<a name="l01646"></a>01646   dlg-&gt;setEscapeButton(QMessageBox::Ok);
<a name="l01647"></a>01647 
<a name="l01648"></a>01648   <span class="keywordtype">int</span> ret = dlg-&gt;exec();
<a name="l01649"></a>01649   <span class="keywordflow">if</span> (ret == QMessageBox::Ignore) {
<a name="l01650"></a>01650     <a class="code" href="class_tor_control.html">TorControl</a> *tc = <a class="code" href="class_vidalia.html#a24c23bc8e35fcf66370d31ef176412d5">Vidalia::torControl</a>();
<a name="l01651"></a>01651     <a class="code" href="class_tor_settings.html">TorSettings</a> settings;
<a name="l01652"></a>01652     QStringList portList;
<a name="l01653"></a>01653     QList&lt;quint16&gt; ports;
<a name="l01654"></a>01654     <span class="keywordtype">int</span> idx;
<a name="l01655"></a>01655 
<a name="l01656"></a>01656     ports = settings.<a class="code" href="class_tor_settings.html#ae341a44c8f55a8674119220af4d5e9e3">getWarnPlaintextPorts</a>();
<a name="l01657"></a>01657     idx   = ports.indexOf(port);
<a name="l01658"></a>01658     <span class="keywordflow">if</span> (idx &gt;= 0) {
<a name="l01659"></a>01659       ports.removeAt(idx);
<a name="l01660"></a>01660       settings.<a class="code" href="class_tor_settings.html#ad216e21e84955a170f0bb463b8a133dd">setWarnPlaintextPorts</a>(ports);
<a name="l01661"></a>01661 
<a name="l01662"></a>01662       <span class="keywordflow">foreach</span> (quint16 port, ports) {
<a name="l01663"></a>01663         portList &lt;&lt; QString::number(port);
<a name="l01664"></a>01664       }
<a name="l01665"></a>01665       tc-&gt;<a class="code" href="class_tor_control.html#acd33beb0663b2a464a101c4efb425708">setConf</a>(<span class="stringliteral">&quot;WarnPlaintextPorts&quot;</span>, portList.join(<span class="stringliteral">&quot;,&quot;</span>));
<a name="l01666"></a>01666       portList.clear();
<a name="l01667"></a>01667     }
<a name="l01668"></a>01668 
<a name="l01669"></a>01669     ports = settings.<a class="code" href="class_tor_settings.html#a9016f8716785364ceeef6ee4b17358d4">getRejectPlaintextPorts</a>();
<a name="l01670"></a>01670     idx   = ports.indexOf(port);
<a name="l01671"></a>01671     <span class="keywordflow">if</span> (idx &gt;= 0) {
<a name="l01672"></a>01672       ports.removeAt(idx);
<a name="l01673"></a>01673       settings.<a class="code" href="class_tor_settings.html#ad02f4a3de3d45b4b8bd45d94057cd98e">setRejectPlaintextPorts</a>(ports);
<a name="l01674"></a>01674 
<a name="l01675"></a>01675       <span class="keywordflow">foreach</span> (quint16 port, ports) {
<a name="l01676"></a>01676         portList &lt;&lt; QString::number(port);
<a name="l01677"></a>01677       }
<a name="l01678"></a>01678       tc-&gt;<a class="code" href="class_tor_control.html#acd33beb0663b2a464a101c4efb425708">setConf</a>(<span class="stringliteral">&quot;RejectPlaintextPorts&quot;</span>, portList.join(<span class="stringliteral">&quot;,&quot;</span>));
<a name="l01679"></a>01679     }
<a name="l01680"></a>01680   }
<a name="l01681"></a>01681   <span class="keyword">delete</span> dlg;
<a name="l01682"></a>01682   dlg = 0;
<a name="l01683"></a>01683 }
<a name="l01684"></a>01684 <span class="comment"></span>
<a name="l01685"></a>01685 <span class="comment">/** Creates and displays Vidalia&#39;s About dialog. */</span>
<a name="l01686"></a>01686 <span class="keywordtype">void</span>
<a name="l01687"></a><a class="code" href="class_main_window.html#a63c95190fa305627c29ec601ed10a2f0">01687</a> <a class="code" href="class_main_window.html#a63c95190fa305627c29ec601ed10a2f0">MainWindow::showAboutDialog</a>()
<a name="l01688"></a>01688 {
<a name="l01689"></a>01689   <a class="code" href="class_about_dialog.html">AboutDialog</a> dlg(<span class="keyword">this</span>);
<a name="l01690"></a>01690   dlg.exec();
<a name="l01691"></a>01691 }
<a name="l01692"></a>01692 <span class="comment"></span>
<a name="l01693"></a>01693 <span class="comment">/** Displays the help browser and displays the most recently viewed help</span>
<a name="l01694"></a>01694 <span class="comment"> * topic. */</span>
<a name="l01695"></a>01695 <span class="keywordtype">void</span>
<a name="l01696"></a><a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">01696</a> <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">MainWindow::showHelpDialog</a>()
<a name="l01697"></a>01697 {
<a name="l01698"></a>01698   <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">showHelpDialog</a>(QString());
<a name="l01699"></a>01699 }
<a name="l01700"></a>01700 <span class="comment"></span>
<a name="l01701"></a>01701 <span class="comment">/**&lt; Shows the help browser and displays the given help &lt;b&gt;topic&lt;/b&gt;. */</span>
<a name="l01702"></a>01702 <span class="keywordtype">void</span>
<a name="l01703"></a><a class="code" href="class_main_window.html#a4ca6161896c401a783c3c53e94c1a5a5">01703</a> <a class="code" href="class_main_window.html#a267af458809fd42db2025145bad659f0">MainWindow::showHelpDialog</a>(<span class="keyword">const</span> QString &amp;topic)
<a name="l01704"></a>01704 {
<a name="l01705"></a>01705   <span class="keyword">static</span> <a class="code" href="class_help_browser.html">HelpBrowser</a> *helpBrowser = 0;
<a name="l01706"></a>01706   <span class="keywordflow">if</span> (!helpBrowser)
<a name="l01707"></a>01707     helpBrowser = <span class="keyword">new</span> <a class="code" href="class_help_browser.html">HelpBrowser</a>(<span class="keyword">this</span>);
<a name="l01708"></a>01708   helpBrowser-&gt;<a class="code" href="class_help_browser.html#aec97ccd1c00a10949bb485ed312cbe81">showWindow</a>(topic);
<a name="l01709"></a>01709 }
<a name="l01710"></a>01710 <span class="comment"></span>
<a name="l01711"></a>01711 <span class="comment">/** Creates and displays the Configuration dialog with the current page set to</span>
<a name="l01712"></a>01712 <span class="comment"> * &lt;b&gt;page&lt;/b&gt;. */</span>
<a name="l01713"></a>01713 <span class="keywordtype">void</span>
<a name="l01714"></a><a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">01714</a> <a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">MainWindow::showConfigDialog</a>(<a class="code" href="class_config_dialog.html#a76a284ede76eb7d829a5a50c3d2bbc53">ConfigDialog::Page</a> page)
<a name="l01715"></a>01715 {
<a name="l01716"></a>01716   <a class="code" href="class_main_window.html#ab6fc7e274755ae4273226fb34ea3dbb4">_configDialog</a>-&gt;<a class="code" href="class_config_dialog.html#a5c45b78319a81b4d007f27ce2e6892e3">showWindow</a>(page);
<a name="l01717"></a>01717 }
<a name="l01718"></a>01718 <span class="comment"></span>
<a name="l01719"></a>01719 <span class="comment">/** Displays the Configuration dialog, set to the Server page. */</span>
<a name="l01720"></a>01720 <span class="keywordtype">void</span>
<a name="l01721"></a><a class="code" href="class_main_window.html#a2b93867062d3c275f1d2609c57920db0">01721</a> <a class="code" href="class_main_window.html#a2b93867062d3c275f1d2609c57920db0">MainWindow::showServerConfigDialog</a>()
<a name="l01722"></a>01722 {
<a name="l01723"></a>01723   <a class="code" href="class_main_window.html#ad7ea86b759200a79ca7b1e26d08a9ae7">showConfigDialog</a>(<a class="code" href="class_config_dialog.html#a76a284ede76eb7d829a5a50c3d2bbc53a4330dcd7578ffc4dee2db10ef8e87613">ConfigDialog::Server</a>);
<a name="l01724"></a>01724 }
<a name="l01725"></a>01725 <span class="comment"></span>
<a name="l01726"></a>01726 <span class="comment">/** Called when the user selects the &quot;New Identity&quot; action from the menu. */</span>
<a name="l01727"></a>01727 <span class="keywordtype">void</span>
<a name="l01728"></a><a class="code" href="class_main_window.html#ad743a187b9e876c3368f2e03ec4e88a6">01728</a> <a class="code" href="class_main_window.html#ad743a187b9e876c3368f2e03ec4e88a6">MainWindow::newIdentity</a>()
<a name="l01729"></a>01729 {
<a name="l01730"></a>01730   QString errmsg;
<a name="l01731"></a>01731 
<a name="l01732"></a>01732   <span class="comment">/* Send the NEWNYM signal. If message balloons are supported and the NEWNYM</span>
<a name="l01733"></a>01733 <span class="comment">   * is successful, we will show the result as a balloon. Otherwise, we&#39;ll </span>
<a name="l01734"></a>01734 <span class="comment">   * just use a message box. */</span>
<a name="l01735"></a>01735   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a373ecec8dbb7af273099d72a82a4d797">signal</a>(<a class="code" href="class_tor_signal.html#ab1820803604813483f918d131bcf281faecf437ddb63d4a0de9b716e4a551fb04">TorSignal::NewNym</a>, &amp;errmsg)) {
<a name="l01736"></a>01736     <span class="comment">/* NEWNYM signal was successful */</span>
<a name="l01737"></a>01737     QString title = tr(<span class="stringliteral">&quot;New Identity&quot;</span>);
<a name="l01738"></a>01738     QString message = tr(<span class="stringliteral">&quot;All subsequent connections will &quot;</span>
<a name="l01739"></a>01739                          <span class="stringliteral">&quot;appear to be different than your &quot;</span>
<a name="l01740"></a>01740                          <span class="stringliteral">&quot;old connections.&quot;</span>);
<a name="l01741"></a>01741 
<a name="l01742"></a>01742     <span class="comment">/* Disable the New Identity button for MIN_NEWIDENTITY_INTERVAL */</span>
<a name="l01743"></a>01743     <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l01744"></a>01744     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity-&gt;setEnabled(<span class="keyword">false</span>);
<a name="l01745"></a>01745     QTimer::singleShot(<a class="code" href="_main_window_8cpp.html#a9294cc72470564d60b07d411b892cf8e">MIN_NEWIDENTITY_INTERVAL</a>, 
<a name="l01746"></a>01746                        <span class="keyword">this</span>, SLOT(<a class="code" href="class_main_window.html#a04947820757d570f73985900c0728b8e">enableNewIdentity</a>()));
<a name="l01747"></a>01747 
<a name="l01748"></a>01748     <span class="keywordflow">if</span> (QSystemTrayIcon::supportsMessages())
<a name="l01749"></a>01749       <a class="code" href="class_main_window.html#aedf919605a2e2e959c505e42328947a4">_trayIcon</a>.showMessage(title, message, QSystemTrayIcon::Information);
<a name="l01750"></a>01750     <span class="keywordflow">else</span>
<a name="l01751"></a>01751       <a class="code" href="class_v_message_box.html#a3fa399ecd05615e0b8df5db3b1f08742">VMessageBox::information</a>(<span class="keyword">this</span>, title, message, <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01752"></a>01752   } <span class="keywordflow">else</span> {
<a name="l01753"></a>01753     <span class="comment">/* NEWNYM signal failed */</span>
<a name="l01754"></a>01754     <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, 
<a name="l01755"></a>01755       tr(<span class="stringliteral">&quot;Failed to Create New Identity&quot;</span>), errmsg, <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01756"></a>01756   }
<a name="l01757"></a>01757 }
<a name="l01758"></a>01758 <span class="comment"></span>
<a name="l01759"></a>01759 <span class="comment">/** Re-enables the &#39;New Identity&#39; button after a delay from the previous time</span>
<a name="l01760"></a>01760 <span class="comment"> * &#39;New Identity&#39; was used. */</span>
<a name="l01761"></a>01761 <span class="keywordtype">void</span>
<a name="l01762"></a><a class="code" href="class_main_window.html#a04947820757d570f73985900c0728b8e">01762</a> <a class="code" href="class_main_window.html#a04947820757d570f73985900c0728b8e">MainWindow::enableNewIdentity</a>()
<a name="l01763"></a>01763 {
<a name="l01764"></a>01764   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a5e39e327ca6c4ef5b4e2ce770a81a59f">isConnected</a>()) {
<a name="l01765"></a>01765     <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l01766"></a>01766     <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity-&gt;setEnabled(<span class="keyword">true</span>);
<a name="l01767"></a>01767   }
<a name="l01768"></a>01768 }
<a name="l01769"></a>01769 <span class="comment"></span>
<a name="l01770"></a>01770 <span class="comment">/** Converts a TorStatus enum value to a string for debug logging purposes. */</span>
<a name="l01771"></a>01771 QString
<a name="l01772"></a><a class="code" href="class_main_window.html#a3c49ca983127780cfd74955ae3c16cd4">01772</a> <a class="code" href="class_main_window.html#a3c49ca983127780cfd74955ae3c16cd4">MainWindow::toString</a>(<a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29">TorStatus</a> status)
<a name="l01773"></a>01773 {
<a name="l01774"></a>01774   <span class="keywordflow">switch</span> (status) {
<a name="l01775"></a>01775     <span class="comment">/* These strings only appear in debug logs, so they should not be</span>
<a name="l01776"></a>01776 <span class="comment">     * translated. */</span>
<a name="l01777"></a>01777     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a064926bb857598a484dec9f867e12008">Unset</a>:     <span class="keywordflow">return</span> <span class="stringliteral">&quot;Unset&quot;</span>;
<a name="l01778"></a>01778     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a1428963975ee498a98af8e6caaf411e8">Stopping</a>:  <span class="keywordflow">return</span> <span class="stringliteral">&quot;Stopping&quot;</span>;
<a name="l01779"></a>01779     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a8d64e0d654b69d2959a0a612dfa3979b">Stopped</a>:   <span class="keywordflow">return</span> <span class="stringliteral">&quot;Stopped&quot;</span>;
<a name="l01780"></a>01780     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29ab3362701808cf4c449b0300d82cc7050">Starting</a>:  <span class="keywordflow">return</span> <span class="stringliteral">&quot;Starting&quot;</span>;
<a name="l01781"></a>01781     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a42855235adf7ea9ce6d3b77da9282182">Started</a>:   <span class="keywordflow">return</span> <span class="stringliteral">&quot;Started&quot;</span>;
<a name="l01782"></a>01782     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a446b3ab93538bbb846c07874203d314c">Authenticating</a>:  <span class="keywordflow">return</span> <span class="stringliteral">&quot;Authenticating&quot;</span>;
<a name="l01783"></a>01783     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29a08635eaaf5abe009e2ec0d3628b31704">Authenticated</a>:   <span class="keywordflow">return</span> <span class="stringliteral">&quot;Authenticated&quot;</span>;
<a name="l01784"></a>01784     <span class="keywordflow">case</span> <a class="code" href="class_main_window.html#a55160677c418d9a67c268469ec769c29abf1c80d80297659c5b78b8ecc8d74600">CircuitEstablished</a>: <span class="keywordflow">return</span> <span class="stringliteral">&quot;Circuit Established&quot;</span>;
<a name="l01785"></a>01785     <span class="keywordflow">default</span>: <span class="keywordflow">break</span>;
<a name="l01786"></a>01786   }
<a name="l01787"></a>01787   <span class="keywordflow">return</span> <span class="stringliteral">&quot;Unknown&quot;</span>;
<a name="l01788"></a>01788 }
<a name="l01789"></a>01789 
<a name="l01790"></a>01790 <span class="preprocessor">#if defined(USE_MINIUPNPC)</span>
<a name="l01791"></a>01791 <span class="preprocessor"></span><span class="comment">/** Called when a UPnP error occurs. */</span>
<a name="l01792"></a>01792 <span class="keywordtype">void</span>
<a name="l01793"></a>01793 <a class="code" href="class_main_window.html#a0525cb43d1299bd8233a1f95cd91554c">MainWindow::upnpError</a>(<a class="code" href="class_u_p_n_p_control.html#a8a2e746cc9e991fec8b724f7a388b7c5">UPNPControl::UPNPError</a> <a class="code" href="namespacetc.html#aa7353218fd7baef0876bbb422ce818af">error</a>)
<a name="l01794"></a>01794 {
<a name="l01795"></a>01795   Q_UNUSED(error);
<a name="l01796"></a>01796 
<a name="l01797"></a>01797 <span class="preprocessor">#if 0</span>
<a name="l01798"></a>01798 <span class="preprocessor"></span>  <span class="comment">/* XXX: Is there a better way to do this? Currently, this could get called</span>
<a name="l01799"></a>01799 <span class="comment">   * if there is an error when testing UPnP support, and again when attempting</span>
<a name="l01800"></a>01800 <span class="comment">   * to reset the UPnP state when the test dialog is closed. The user would</span>
<a name="l01801"></a>01801 <span class="comment">   * not be amused with all the warning dialogs. */</span>
<a name="l01802"></a>01802 
<a name="l01803"></a>01803   <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>,
<a name="l01804"></a>01804     tr(<span class="stringliteral">&quot;Port Forwarding Failed&quot;</span>),
<a name="l01805"></a>01805     <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia was unable to configure automatic port forwarding.&quot;</span>))
<a name="l01806"></a>01806       + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(UPNPControl::Instance()-&gt;errorString()),
<a name="l01807"></a>01807     <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01808"></a>01808 <span class="preprocessor">#endif</span>
<a name="l01809"></a>01809 <span class="preprocessor"></span>}
<a name="l01810"></a>01810 <span class="preprocessor">#endif</span>
<a name="l01811"></a>01811 <span class="preprocessor"></span>
<a name="l01812"></a>01812 <span class="preprocessor">#if defined(USE_AUTOUPDATE)</span>
<a name="l01813"></a>01813 <span class="preprocessor"></span><span class="comment">/** Called when the user clicks the &#39;Check Now&#39; button in the General</span>
<a name="l01814"></a>01814 <span class="comment"> * settings page. */</span>
<a name="l01815"></a>01815 <span class="keywordtype">void</span>
<a name="l01816"></a>01816 MainWindow::checkForUpdatesWithUi()
<a name="l01817"></a>01817 {
<a name="l01818"></a>01818   checkForUpdates(<span class="keyword">true</span>);
<a name="l01819"></a>01819 }
<a name="l01820"></a>01820 <span class="comment"></span>
<a name="l01821"></a>01821 <span class="comment">/** Called when the update interval timer expires, notifying Vidalia that</span>
<a name="l01822"></a>01822 <span class="comment"> * we should check for updates again. */</span>
<a name="l01823"></a>01823 <span class="keywordtype">void</span>
<a name="l01824"></a>01824 MainWindow::checkForUpdates(<span class="keywordtype">bool</span> showProgress)
<a name="l01825"></a>01825 {
<a name="l01826"></a>01826   <a class="code" href="class_vidalia_settings.html">VidaliaSettings</a> settings;
<a name="l01827"></a>01827 
<a name="l01828"></a>01828   <span class="keywordflow">if</span> (_updateProcess.isRunning()) {
<a name="l01829"></a>01829     <span class="keywordflow">if</span> (showProgress) {
<a name="l01830"></a>01830       <span class="comment">/* A check for updates is already in progress, so just bring the update</span>
<a name="l01831"></a>01831 <span class="comment">       * progress dialog into focus.</span>
<a name="l01832"></a>01832 <span class="comment">       */</span>
<a name="l01833"></a>01833       _updateProgressDialog.show();
<a name="l01834"></a>01834     }
<a name="l01835"></a>01835   } <span class="keywordflow">else</span> {
<a name="l01836"></a>01836     <span class="comment">/* If Tor is running and bootstrapped, then use Tor to check for updates */</span>
<a name="l01837"></a>01837     <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#abe44c7f9281547aab2d317972519bd49">isRunning</a>() &amp;&amp; <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#a28b4b60a0092a39dbe1484e3193dcb83">circuitEstablished</a>())
<a name="l01838"></a>01838       _updateProcess.setSocksPort(<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ac58ed8ff6dc3a7fdf7fe16779e444b9a">getSocksPort</a>());
<a name="l01839"></a>01839     <span class="keywordflow">else</span>
<a name="l01840"></a>01840       _updateProcess.setSocksPort(0);
<a name="l01841"></a>01841 
<a name="l01842"></a>01842     <span class="comment">/* Initialize the UpdateProgressDialog and display it, if necessary. */</span>
<a name="l01843"></a>01843     _updateProgressDialog.setStatus(<a class="code" href="class_update_progress_dialog.html#ace6055d2fe0986a44150b8be996ea7c0a2fcec584472a54aed9260f423b3946f9">UpdateProgressDialog::CheckingForUpdates</a>);
<a name="l01844"></a>01844     <span class="keywordflow">if</span> (showProgress)
<a name="l01845"></a>01845       _updateProgressDialog.show();
<a name="l01846"></a>01846 
<a name="l01847"></a>01847     <span class="comment">/* Initiate a check for available software updates. This check will</span>
<a name="l01848"></a>01848 <span class="comment">     * be done in the background, notifying the user only if there are</span>
<a name="l01849"></a>01849 <span class="comment">     * updates to be installed.</span>
<a name="l01850"></a>01850 <span class="comment">     */</span>
<a name="l01851"></a>01851     _updateProcess.checkForUpdates(<a class="code" href="class_update_process.html#a7f96e69b1f212525d935655e9c00505aaeedc102a1d827bd521456d530472ffa4">UpdateProcess::TorBundleInfo</a>);
<a name="l01852"></a>01852 
<a name="l01853"></a>01853     <span class="comment">/* Remember when we last checked for software updates */</span>
<a name="l01854"></a>01854     settings.<a class="code" href="class_vidalia_settings.html#a508c144e30bcdecf8f6e5f239c0a8782">setLastCheckedForUpdates</a>(QDateTime::currentDateTime().toUTC());
<a name="l01855"></a>01855 
<a name="l01856"></a>01856     <span class="comment">/* Restart the &quot;Check for Updates&quot; timer */</span>
<a name="l01857"></a>01857     _updateTimer.start(<a class="code" href="class_update_process.html#a54d4d22cb36b1690d3c476f908681878">UpdateProcess::checkForUpdatesInterval</a>() * 1000);
<a name="l01858"></a>01858   }
<a name="l01859"></a>01859 }
<a name="l01860"></a>01860 <span class="comment"></span>
<a name="l01861"></a>01861 <span class="comment">/** Called when the check for software updates fails. */</span>
<a name="l01862"></a>01862 <span class="keywordtype">void</span>
<a name="l01863"></a>01863 MainWindow::checkForUpdatesFailed(<span class="keyword">const</span> QString &amp;errmsg)
<a name="l01864"></a>01864 {
<a name="l01865"></a>01865   <span class="keywordflow">if</span> (_updateProgressDialog.isVisible()) {
<a name="l01866"></a>01866     _updateProgressDialog.hide();
<a name="l01867"></a>01867     <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Update Failed&quot;</span>), errmsg,
<a name="l01868"></a>01868                          <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01869"></a>01869   }
<a name="l01870"></a>01870 }
<a name="l01871"></a>01871 <span class="comment"></span>
<a name="l01872"></a>01872 <span class="comment">/** Called when there is an update available for installation. */</span>
<a name="l01873"></a>01873 <span class="keywordtype">void</span>
<a name="l01874"></a>01874 MainWindow::updatesAvailable(<a class="code" href="class_update_process.html#a7f96e69b1f212525d935655e9c00505a">UpdateProcess::BundleInfo</a> bi,
<a name="l01875"></a>01875                              <span class="keyword">const</span> <a class="code" href="_package_info_8h.html#ae1b3835486d49f6ee4483714e49f019b">PackageList</a> &amp;packageList)
<a name="l01876"></a>01876 {
<a name="l01877"></a>01877   <a class="code" href="_vidalia_8h.html#a7743cb328f470aa8f382716fbcf61daa">vInfo</a>(<span class="stringliteral">&quot;%1 software update(s) available&quot;</span>).arg(packageList.size());
<a name="l01878"></a>01878   <span class="keywordflow">if</span> (packageList.size() &gt; 0) {
<a name="l01879"></a>01879     <a class="code" href="class_updates_available_dialog.html">UpdatesAvailableDialog</a> dlg(packageList, &amp;_updateProgressDialog);
<a name="l01880"></a>01880 
<a name="l01881"></a>01881     <span class="keywordflow">switch</span> (dlg.exec()) {
<a name="l01882"></a>01882       <span class="keywordflow">case</span> <a class="code" href="class_updates_available_dialog.html#ac5f3970359cd36104603264279f6f525a9b0bbcd1e17b0c0c3590f09f04b4396a">UpdatesAvailableDialog::InstallUpdatesNow</a>:
<a name="l01883"></a>01883         installUpdates(bi);
<a name="l01884"></a>01884         <span class="keywordflow">break</span>;
<a name="l01885"></a>01885 
<a name="l01886"></a>01886       <span class="keywordflow">default</span>:
<a name="l01887"></a>01887         _updateProgressDialog.hide();
<a name="l01888"></a>01888         <span class="keywordflow">break</span>;
<a name="l01889"></a>01889     }
<a name="l01890"></a>01890   } <span class="keywordflow">else</span> {
<a name="l01891"></a>01891     <span class="keywordflow">if</span> (_updateProgressDialog.isVisible()) {
<a name="l01892"></a>01892       _updateProgressDialog.hide();
<a name="l01893"></a>01893       <a class="code" href="class_v_message_box.html#a3fa399ecd05615e0b8df5db3b1f08742">VMessageBox::information</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Your software is up to date&quot;</span>),
<a name="l01894"></a>01894                                tr(<span class="stringliteral">&quot;There are no new Tor software packages &quot;</span>
<a name="l01895"></a>01895                                   <span class="stringliteral">&quot;available for your computer at this time.&quot;</span>),
<a name="l01896"></a>01896                                <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01897"></a>01897     }
<a name="l01898"></a>01898   }
<a name="l01899"></a>01899 }
<a name="l01900"></a>01900 <span class="comment"></span>
<a name="l01901"></a>01901 <span class="comment">/** Stops Tor (if necessary), installs any available for &lt;b&gt;bi&lt;/b&gt;, and</span>
<a name="l01902"></a>01902 <span class="comment"> * restarts Tor (if necessary). */</span>
<a name="l01903"></a>01903 <span class="keywordtype">void</span>
<a name="l01904"></a>01904 MainWindow::installUpdates(<a class="code" href="class_update_process.html#a7f96e69b1f212525d935655e9c00505a">UpdateProcess::BundleInfo</a> bi)
<a name="l01905"></a>01905 {
<a name="l01906"></a>01906   _updateProgressDialog.setStatus(<a class="code" href="class_update_progress_dialog.html#ace6055d2fe0986a44150b8be996ea7c0a9f2610f29b13e5c5884bce273c4752e6">UpdateProgressDialog::InstallingUpdates</a>);
<a name="l01907"></a>01907   _updateProgressDialog.show();
<a name="l01908"></a>01908 
<a name="l01909"></a>01909   <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#afeaeadb72f2caaf0a46d365a1afaec4c">_isVidaliaRunningTor</a>) {
<a name="l01910"></a>01910     _restartTorAfterUpgrade = <span class="keyword">true</span>;
<a name="l01911"></a>01911     <a class="code" href="class_main_window.html#a1963cbd039adcc632183a51ca1eaab73">_isIntentionalExit</a> = <span class="keyword">true</span>;
<a name="l01912"></a>01912     <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-&gt;<a class="code" href="class_tor_control.html#ae4a495462e3aa5db88502c58d1fa771f">stop</a>();
<a name="l01913"></a>01913   } <span class="keywordflow">else</span> {
<a name="l01914"></a>01914     _restartTorAfterUpgrade = <span class="keyword">false</span>;
<a name="l01915"></a>01915   }
<a name="l01916"></a>01916   _updateProcess.installUpdates(bi);
<a name="l01917"></a>01917 }
<a name="l01918"></a>01918 <span class="comment"></span>
<a name="l01919"></a>01919 <span class="comment">/** Called when all &lt;b&gt;numUpdates&lt;/b&gt; software updates have been installed</span>
<a name="l01920"></a>01920 <span class="comment"> * successfully. */</span>
<a name="l01921"></a>01921 <span class="keywordtype">void</span>
<a name="l01922"></a>01922 MainWindow::updatesInstalled(<span class="keywordtype">int</span> numUpdates)
<a name="l01923"></a>01923 {
<a name="l01924"></a>01924   _updateProgressDialog.setStatus(<a class="code" href="class_update_progress_dialog.html#ace6055d2fe0986a44150b8be996ea7c0afdd9051b71dff7e79abc8ba530f7b31b">UpdateProgressDialog::UpdatesInstalled</a>);
<a name="l01925"></a>01925   _updateProgressDialog.show();
<a name="l01926"></a>01926 
<a name="l01927"></a>01927   <span class="keywordflow">if</span> (_restartTorAfterUpgrade)
<a name="l01928"></a>01928     <a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>();
<a name="l01929"></a>01929 }
<a name="l01930"></a>01930 <span class="comment"></span>
<a name="l01931"></a>01931 <span class="comment">/** Called when an update fails to install. &lt;b&gt;errmsg&lt;/b&gt; contains details</span>
<a name="l01932"></a>01932 <span class="comment"> * about the failure. */</span>
<a name="l01933"></a>01933 <span class="keywordtype">void</span>
<a name="l01934"></a>01934 MainWindow::installUpdatesFailed(<span class="keyword">const</span> QString &amp;errmsg)
<a name="l01935"></a>01935 {
<a name="l01936"></a>01936   _updateProgressDialog.hide();
<a name="l01937"></a>01937 
<a name="l01938"></a>01938   <a class="code" href="class_v_message_box.html#ab13cdbaf47040d9c0312ba5854185b15">VMessageBox::warning</a>(<span class="keyword">this</span>, tr(<span class="stringliteral">&quot;Installation Failed&quot;</span>),
<a name="l01939"></a>01939                        <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;Vidalia was unable to install your software updates.&quot;</span>))
<a name="l01940"></a>01940                          + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">&quot;The following error occurred:&quot;</span>)) 
<a name="l01941"></a>01941                          + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(errmsg),
<a name="l01942"></a>01942                        <a class="code" href="class_v_message_box.html#ad9a3aafc6d9076268b6b4b6b1357fe0aafc0d4bb792dca848f92d28e60dec4fe4">VMessageBox::Ok</a>);
<a name="l01943"></a>01943 
<a name="l01944"></a>01944   <span class="keywordflow">if</span> (_restartTorAfterUpgrade)
<a name="l01945"></a>01945     <a class="code" href="class_main_window.html#a5edcbc314e782645cdf4db101eeb247d">start</a>();
<a name="l01946"></a>01946 }
<a name="l01947"></a>01947 
<a name="l01948"></a>01948 <span class="preprocessor">#endif</span>
<a name="l01949"></a>01949 <span class="preprocessor"></span>
</pre></div></div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Mon Aug 30 22:58:54 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>