<!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 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 List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> <div class="navpath"><a class="el" href="dir_b47abd1aad201a152869566145babb61.html">src</a> » <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 "<a class="code" href="_main_window_8h.html">MainWindow.h</a>"</span> <a name="l00022"></a>00022 <span class="preprocessor">#include "<a class="code" href="_vidalia_8h.html">Vidalia.h</a>"</span> <a name="l00023"></a>00023 <span class="preprocessor">#include "<a class="code" href="_v_message_box_8h.html">VMessageBox.h</a>"</span> <a name="l00024"></a>00024 <span class="preprocessor">#include "<a class="code" href="_control_password_input_dialog_8h.html">ControlPasswordInputDialog.h</a>"</span> <a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="_tor_settings_8h.html">TorSettings.h</a>"</span> <a name="l00026"></a>00026 <span class="preprocessor">#include "<a class="code" href="_server_settings_8h.html">ServerSettings.h</a>"</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 "<a class="code" href="_updates_available_dialog_8h.html">UpdatesAvailableDialog.h</a>"</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 "<a class="code" href="_protocol_info_8h.html">ProtocolInfo.h</a>"</span> <a name="l00032"></a>00032 <a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="net_8h.html">net.h</a>"</span> <a name="l00034"></a>00034 <span class="preprocessor">#include "<a class="code" href="file_8h.html">file.h</a>"</span> <a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="html_8h.html">html.h</a>"</span> <a name="l00036"></a>00036 <span class="preprocessor">#include "<a class="code" href="stringutil_8h.html">stringutil.h</a>"</span> <a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="procutil_8h.html">procutil.h</a>"</span> <a name="l00038"></a>00038 <a name="l00039"></a>00039 <span class="preprocessor">#include <QMenuBar></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <QTimer></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <QTextStream></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 ":/images/16x16/utilities-system-monitor.png"</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 ":/images/16x16/system-run.png"</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 ":/images/16x16/format-justify-fill.png"</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 ":/images/16x16/preferences-system.png"</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 ":/images/16x16/view-media-artist.png"</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 ":/images/16x16/system-help.png"</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 ":/images/16x16/help-about.png"</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 ":/images/16x16/application-exit.png"</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 ":/images/16x16/applications-internet.png"</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 ":/images/16x16/media-playback-start.png"</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 ":/images/16x16/media-playback-stop.png"</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 ":/images/48x48/media-playback-start.png"</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 ":/images/48x48/media-playback-stop.png"</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 ":/images/48x48/tor-off.png"</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 ":/images/48x48/tor-on.png"</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 ":/images/48x48/tor-starting.png"</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 ":/images/48x48/tor-stopping.png"</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 ":/images/16x16/tor-off.png"</span> <a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING ":/images/16x16/tor-on.png"</span> <a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING ":/images/16x16/tor-starting.png"</span> <a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING ":/images/16x16/tor-stopping.png"</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 ":/images/128x128/tor-off.png"</span> <a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_RUNNING ":/images/128x128/tor-on.png"</span> <a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STARTING ":/images/128x128/tor-starting.png"</span> <a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define IMG_TOR_STOPPING ":/images/128x128/tor-stopping.png"</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 ":/images/22x22/tor-off.png"</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 ":/images/22x22/tor-on.png"</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 ":/images/22x22/tor-starting.png"</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 ":/images/22x22/tor-stopping.png"</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 'New Identity' 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">"MainWindow"</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 'Esc' or 'Ctrl+W' will close the window */</span> <a name="l00106"></a>00106 <a class="code" href="class_vidalia.html#a4f28d73e2f92e6656f7c1c06d41b3569">Vidalia::createShortcut</a>(<span class="stringliteral">"Ctrl+W"</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">"Esc"</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'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>-><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>-><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(&_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"> * "Check Now" 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(&_updateProcess, SIGNAL(downloadProgress(QString,<span class="keywordtype">int</span>,<span class="keywordtype">int</span>)), <a name="l00195"></a>00195 &_updateProgressDialog, SLOT(setDownloadProgress(QString,<span class="keywordtype">int</span>,<span class="keywordtype">int</span>))); <a name="l00196"></a>00196 connect(&_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(&_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(&_updateProcess, SIGNAL(installUpdatesFailed(QString)), <a name="l00201"></a>00201 <span class="keyword">this</span>, SLOT(installUpdatesFailed(QString))); <a name="l00202"></a>00202 connect(&_updateProgressDialog, SIGNAL(cancelUpdate()), <a name="l00203"></a>00203 &_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->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->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't let people hide the main window, since that's all they have. */</span> <a name="l00236"></a>00236 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.chkShowOnStartup->hide(); <a name="l00237"></a>00237 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.btnHide->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->height());</span> <a name="l00240"></a>00240 <span class="comment">//setMaximumHeight(height()-ui.btnHide->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>->setText(tr(<span class="stringliteral">"Start Tor"</span>)); <a name="l00254"></a>00254 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(tr(<span class="stringliteral">"Start Tor"</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>->setText(tr(<span class="stringliteral">"Starting Tor"</span>)); <a name="l00257"></a>00257 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(tr(<span class="stringliteral">"Starting Tor"</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>->setText(tr(<span class="stringliteral">"Stop Tor"</span>)); <a name="l00260"></a>00260 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(tr(<span class="stringliteral">"Stop Tor"</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>->setText(tr(<span class="stringliteral">"Bandwidth Graph"</span>)); <a name="l00264"></a>00264 <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>->setText(tr(<span class="stringliteral">"Message Log"</span>)); <a name="l00265"></a>00265 <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>->setText(tr(<span class="stringliteral">"Network Map"</span>)); <a name="l00266"></a>00266 <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>->setText(tr(<span class="stringliteral">"Control Panel"</span>)); <a name="l00267"></a>00267 <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>->setText(tr(<span class="stringliteral">"Help"</span>)); <a name="l00268"></a>00268 <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>->setText(tr(<span class="stringliteral">"New Identity"</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>->setText(tr(<span class="stringliteral">"About"</span>)); <a name="l00272"></a>00272 <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>->setText(tr(<span class="stringliteral">"Settings"</span>)); <a name="l00273"></a>00273 <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>->setText(tr(<span class="stringliteral">"Exit"</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>->readPasswordFromStdin()) { <a name="l00287"></a>00287 QTextStream in(stdin); <a name="l00288"></a>00288 in >> <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'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>() && ! <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><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'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">"Last checked for software updates at %1. Will check again at %2."</span>) <a name="l00329"></a>00329 .arg(lastCheckedAt.toLocalTime().toString(<span class="stringliteral">"dd-MM-yyyy hh:mm:ss"</span>)) <a name="l00330"></a>00330 .arg(nextCheckAt.toLocalTime().toString(<span class="stringliteral">"dd-MM-yyyy hh:mm:ss"</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">"Cleaning up before exiting."</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>-><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>-><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>->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>->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'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>->state() == QProcess::Running) <a name="l00369"></a>00369 <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>->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>->state() == QProcess::Running) <a name="l00377"></a>00377 <a class="code" href="class_main_window.html#a353059726abbdbf2bdaed72b1a8a1eab">_imProcess</a>->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'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 "Exit" from the tray</span> <a name="l00385"></a>00385 <span class="comment"> * menu. If we'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>-><a class="code" href="class_tor_control.html#a3b8daa188aa325d28d75c62219c56c71">isVidaliaRunningTor</a>()) { <a name="l00391"></a>00391 <span class="comment">/* If we'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>-><a class="code" href="class_tor_control.html#a5e39e327ca6c4ef5b4e2ce770a81a59f">isConnected</a>() && 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>->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">"Start Tor"</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">"Exit"</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">"Bandwidth Graph"</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">"Message Log"</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">"Network Map"</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">"Control Panel"</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">"Settings"</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">"About"</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">"Help"</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">"New Identity"</span>), <span class="keyword">this</span>); <a name="l00448"></a>00448 <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>->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'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>->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>->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>->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>->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>->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>->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>->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>->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>->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>->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(&<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->addAction(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>); <a name="l00494"></a>00494 menu->addSeparator(); <a name="l00495"></a>00495 menu->addAction(<a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>); <a name="l00496"></a>00496 menu->addAction(<a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>); <a name="l00497"></a>00497 menu->addAction(<a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>); <a name="l00498"></a>00498 menu->addAction(<a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>); <a name="l00499"></a>00499 menu->addSeparator(); <a name="l00500"></a>00500 menu->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'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->addAction(<a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>); <a name="l00506"></a>00506 menu->addAction(<a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>); <a name="l00507"></a>00507 menu->addAction(<a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>); <a name="l00508"></a>00508 menu->addSeparator(); <a name="l00509"></a>00509 menu->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 "default</span> <a name="l00515"></a>00515 <span class="comment"> * menubar" 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'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>->setShortcut(tr(<span class="stringliteral">"Ctrl+T"</span>)); <a name="l00525"></a>00525 <a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+B"</span>)); <a name="l00526"></a>00526 <a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+L"</span>)); <a name="l00527"></a>00527 <a class="code" href="class_main_window.html#a594cd5df2c293157781acaa55f1f6ee0">_actionShowNetworkMap</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+N"</span>)); <a name="l00528"></a>00528 <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+?"</span>)); <a name="l00529"></a>00529 <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+I"</span>)); <a name="l00530"></a>00530 <a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>->setShortcut(tr(<span class="stringliteral">"Ctrl+P"</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>->setText(<span class="stringliteral">"config"</span>); <a name="l00535"></a>00535 <a class="code" href="class_main_window.html#aa2a3368c02d56a77731b3c604e223259">_actionShowConfig</a>->setMenuRole(QAction::PreferencesRole); <a name="l00536"></a>00536 <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>->setText(<span class="stringliteral">"about"</span>); <a name="l00537"></a>00537 <a class="code" href="class_main_window.html#a33a8c953f1c46cd942d237d16b81d928">_actionShowAbout</a>->setMenuRole(QAction::AboutRole); <a name="l00538"></a>00538 <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>->setText(<span class="stringliteral">"quit"</span>); <a name="l00539"></a>00539 <a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>->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>->addMenu(<span class="stringliteral">"File"</span>); <a name="l00547"></a>00547 fileMenu->addAction(<a class="code" href="class_main_window.html#a2e0e9f46f96e323b68fa2330ec1f3d50">_actionExit</a>); <a name="l00548"></a>00548 fileMenu->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>->addMenu(tr(<span class="stringliteral">"Tor"</span>)); <a name="l00551"></a>00551 torMenu->addAction(<a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>); <a name="l00552"></a>00552 torMenu->addSeparator(); <a name="l00553"></a>00553 torMenu->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>->addMenu(tr(<span class="stringliteral">"View"</span>)); <a name="l00556"></a>00556 viewMenu->addAction(<a class="code" href="class_main_window.html#a7589737d65eec31ba4ac05987b6bbea1">_actionShowControlPanel</a>); <a name="l00557"></a>00557 viewMenu->addSeparator(); <a name="l00558"></a>00558 viewMenu->addAction(<a class="code" href="class_main_window.html#a931d73f48de646010a81127e77197327">_actionShowBandwidth</a>); <a name="l00559"></a>00559 viewMenu->addAction(<a class="code" href="class_main_window.html#a6f1dba68dc03ae9ae75f082bf9d82832">_actionShowMessageLog</a>); <a name="l00560"></a>00560 viewMenu->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>->addMenu(tr(<span class="stringliteral">"Help"</span>)); <a name="l00563"></a>00563 <a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>->setText(tr(<span class="stringliteral">"Vidalia Help"</span>)); <a name="l00564"></a>00564 helpMenu->addAction(<a class="code" href="class_main_window.html#aaf6ccfe7d958d61d425f00ca4b8e9728">_actionShowHelp</a>); <a name="l00565"></a>00565 helpMenu->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 <b>iconFile</b>. */</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 &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 << <span class="stringliteral">"TZ=UTC"</span>; <a name="l00602"></a>00602 env << <span class="stringliteral">"MOZ_NO_REMOTE=1"</span>; <a name="l00603"></a>00603 <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>->setEnvironment(env); <a name="l00604"></a>00604 <a name="l00605"></a>00605 <span class="comment">/* The browser is in <browserDirectory>/App/Firefox/<browserDirectoryFilename> */</span> <a name="l00606"></a>00606 QString browserExecutable = <a name="l00607"></a>00607 QDir::toNativeSeparators(browserDirectory + <span class="stringliteral">"/App/Firefox/"</span> + browserDirectoryFilename); <a name="l00608"></a>00608 <span class="comment">/* The profile is in <browserDirectory>/Data/profile */</span> <a name="l00609"></a>00609 QString profileDir = <a name="l00610"></a>00610 QDir::toNativeSeparators(browserDirectory + <span class="stringliteral">"/Data/profile"</span>); <a name="l00611"></a>00611 <a name="l00612"></a>00612 <span class="comment">/* Copy the profile directory if it'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's not already there */</span> <a name="l00616"></a>00616 <span class="keywordflow">if</span> (!browserDirObj.exists(<span class="stringliteral">"Data/profile"</span>)) { <a name="l00617"></a>00617 browserDirObj.mkdir(<span class="stringliteral">"Data/profile"</span>); <a name="l00618"></a>00618 <a class="code" href="file_8cpp.html#a80dd03f007cf94c4222a6b6e1f5b4c38">copy_dir</a>(browserDirectory + <span class="stringliteral">"/App/DefaultData/profile"</span>, browserDirectory + <span class="stringliteral">"/Data/profile"</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's not already there */</span> <a name="l00622"></a>00622 <span class="keywordflow">if</span> (!browserDirObj.exists(<span class="stringliteral">"Data/plugins"</span>)) { <a name="l00623"></a>00623 browserDirObj.mkdir(<span class="stringliteral">"Data/plugins"</span>); <a name="l00624"></a>00624 <a class="code" href="file_8cpp.html#a80dd03f007cf94c4222a6b6e1f5b4c38">copy_dir</a>(browserDirectory + <span class="stringliteral">"/App/DefaultData/plugins"</span>, browserDirectory + <span class="stringliteral">"/Data/plugins"</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 << "-no-remote";</span> <a name="l00631"></a>00631 commandLine << <span class="stringliteral">"-profile"</span>; <a name="l00632"></a>00632 commandLine << 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>-><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>->setEnvironment(QProcess::systemEnvironment() << <span class="stringliteral">"TZ=UTC"</span>); <a name="l00652"></a>00652 <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-><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>-><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 && browserDirectory.isEmpty()) <a name="l00678"></a>00678 || <a class="code" href="class_main_window.html#a253a6702cf254f80012fcc76ac17fb6a">_browserProcess</a>-><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>-><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 && 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>->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->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<qint64, QString> 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 <browserDirectoryFilename> */</span> <a name="l00716"></a>00716 QHashIterator<qint64, QString> <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't running, exit Vidalia */</span> <a name="l00726"></a>00726 <a class="code" href="_vidalia_8h.html#aef0a1c1e9430e6b86892ae28b1577294">vApp</a>->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'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">"Error starting web browser"</span>), <a name="l00739"></a>00739 tr(<span class="stringliteral">"Vidalia was unable to start the configured web browser"</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'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">"Error starting IM client"</span>), <a name="l00752"></a>00752 tr(<span class="stringliteral">"Vidalia was unable to start the configured IM client"</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>-><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'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">"Error starting proxy server"</span>), <a name="l00774"></a>00774 tr(<span class="stringliteral">"Vidalia was unable to start the configured proxy server"</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's bootstrapping status changes. <b>bse</b> represents</span> <a name="l00779"></a>00779 <span class="comment"> * Tor'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> &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> && <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">"Connecting to a relay directory"</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">"Establishing an encrypted directory connection"</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">"Retrieving network status"</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">"Loading network status"</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">"Loading authority certificates"</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">"Requesting relay information"</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">"Loading relay information"</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">"Connecting to the Tor network"</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">"Establishing a Tor circuit"</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">"Connected to the Tor network!"</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">"Unrecognized startup status"</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">"miscellaneous"</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">"identity mismatch"</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">"done"</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">"connection refused"</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">"connection timeout"</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">"read/write error"</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">"no route to host"</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">"insufficient resources"</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">"unknown"</span>); <a name="l00855"></a>00855 } <a name="l00856"></a>00856 description += tr(<span class="stringliteral">" failed (%1)"</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's current <b>status</b>. 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">"Tor status changed from '%1' to '%2'."</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">"Tor is not running"</span>); <a name="l00876"></a>00876 actionText = tr(<span class="stringliteral">"Start Tor"</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>->setEnabled(<span class="keyword">true</span>); <a name="l00880"></a>00880 <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>->setText(actionText); <a name="l00881"></a>00881 <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>->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->setEnabled(<span class="keyword">true</span>); <a name="l00883"></a>00883 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(actionText); <a name="l00884"></a>00884 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->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->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">"Your relay is shutting down.\n"</span> <a name="l00897"></a>00897 <span class="stringliteral">"Click 'Stop' again to stop your relay now."</span>); <a name="l00898"></a>00898 } <span class="keywordflow">else</span> { <a name="l00899"></a>00899 statusText = tr(<span class="stringliteral">"Tor is shutting down"</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->setStatusTip(tr(<span class="stringliteral">"Stop Tor Now"</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">"Stop Tor"</span>); <a name="l00907"></a>00907 <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>->setEnabled(<span class="keyword">true</span>); <a name="l00908"></a>00908 <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>->setText(actionText); <a name="l00909"></a>00909 <a class="code" href="class_main_window.html#ab7427c2fb74c3ac76fcced56628fad0c">_actionStartStopTor</a>->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->setEnabled(<span class="keyword">true</span>); <a name="l00911"></a>00911 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(actionText); <a name="l00912"></a>00912 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->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->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">"Starting the Tor software"</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>->setEnabled(<span class="keyword">false</span>); <a name="l00926"></a>00926 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setText(tr(<span class="stringliteral">"Starting Tor"</span>)); <a name="l00927"></a>00927 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->setEnabled(<span class="keyword">false</span>); <a name="l00928"></a>00928 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartStopTor->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">"Connected to the Tor network!"</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->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->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 "show on startup" 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"> * <b>visible</b>. */</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'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->setVisible(<span class="keyword">false</span>); <a name="l00969"></a>00969 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatusImg->setVisible(<span class="keyword">false</span>); <a name="l00970"></a>00970 repaint(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.grpStatus->rect()); <a name="l00971"></a>00971 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartupProgress->setVisible(<span class="keyword">true</span>); <a name="l00972"></a>00972 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar->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->setVisible(<span class="keyword">false</span>); <a name="l00975"></a>00975 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar->setVisible(<span class="keyword">false</span>); <a name="l00976"></a>00976 repaint(<a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.grpStatus->rect()); <a name="l00977"></a>00977 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatus->setVisible(<span class="keyword">true</span>); <a name="l00978"></a>00978 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblTorStatusImg->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 <b>progressValue</b> and sets</span> <a name="l00983"></a>00983 <span class="comment"> * the status text to <b>description</b>. */</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 &description) <a name="l00987"></a>00987 { <a name="l00988"></a>00988 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.progressBar->setValue(progressValue); <a name="l00989"></a>00989 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblStartupProgress->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 << <span class="stringliteral">"-f"</span> << torrc; <a name="l01016"></a>01016 } <a name="l01017"></a>01017 <a name="l01018"></a>01018 <span class="comment">/* Specify Tor'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 << <span class="stringliteral">"DataDirectory"</span> << <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 << <span class="stringliteral">"ControlPort"</span> << 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>->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 << <span class="stringliteral">"HashedControlPassword"</span> <a name="l01041"></a>01041 << <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 << <span class="stringliteral">"CookieAuthentication"</span> << <span class="stringliteral">"1"</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 << <span class="stringliteral">"CookieAuthentication"</span> << <span class="stringliteral">"0"</span>; <a name="l01048"></a>01048 } <a name="l01049"></a>01049 <a name="l01050"></a>01050 <span class="comment">/* This doesn't get set to false until Tor is actually up and running, so we</span> <a name="l01051"></a>01051 <span class="comment"> * don't yell at users twice if their Tor doesn'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'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>-><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'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'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 "Unknown Error". 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">"Error Starting Tor"</span>), <a name="l01073"></a>01073 tr(<span class="stringliteral">"Vidalia was unable to start Tor. Check your settings "</span> <a name="l01074"></a>01074 <span class="stringliteral">"to ensure the correct name and location of your Tor "</span> <a name="l01075"></a>01075 <span class="stringliteral">"executable is specified."</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'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">"troubleshooting.start"</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'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'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>-><a class="code" href="class_tor_control.html#a3b8daa188aa325d28d75c62219c56c71">isVidaliaRunningTor</a>(); <a name="l01106"></a>01106 <span class="comment">/* Try to connect to Tor's control port */</span> <a name="l01107"></a>01107 <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><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">"Connecting to Tor"</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'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">"Connection Error"</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'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>-><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">"troubleshooting.connect"</span>); <a name="l01133"></a>01133 <span class="comment">/* Since Vidalia can't connect, we can't really do much, so stop Tor. */</span> <a name="l01134"></a>01134 <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><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'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>() && !<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">"Relaying is Enabled"</span>), <a name="l01152"></a>01152 tr(<span class="stringliteral">"You are currently running a relay. "</span> <a name="l01153"></a>01153 <span class="stringliteral">"Terminating your relay will interrupt any "</span> <a name="l01154"></a>01154 <span class="stringliteral">"open connections from clients.\n\n"</span> <a name="l01155"></a>01155 <span class="stringliteral">"Would you like to shutdown gracefully and "</span> <a name="l01156"></a>01156 <span class="stringliteral">"give clients time to find a new relay?"</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>-><a class="code" href="class_tor_control.html#a373ecec8dbb7af273099d72a82a4d797">signal</a>(<a class="code" href="class_tor_signal.html#ab1820803604813483f918d131bcf281fa7a524d8ade4d072184e7b60e41753dde">TorSignal::Shutdown</a>, &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'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>-><a class="code" href="class_tor_control.html#ae4a495462e3aa5db88502c58d1fa771f">stop</a>(&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'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">"Error Shutting Down"</span>), <a name="l01179"></a>01179 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia was unable to stop the Tor software."</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">"troubleshooting.stop"</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'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'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">"Unexpected Error"</span>), <a name="l01211"></a>01211 tr(<span class="stringliteral">"Vidalia detected that the Tor software exited "</span> <a name="l01212"></a>01212 <span class="stringliteral">"unexpectedly.\n\n"</span> <a name="l01213"></a>01213 <span class="stringliteral">"Please check the message log for recent "</span> <a name="l01214"></a>01214 <span class="stringliteral">"warning or error messages."</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>-><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">"troubleshooting.torexited"</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>-><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't start our own Tor process, interpret losing the control</span> <a name="l01246"></a>01246 <span class="comment"> * connection as "Tor is stopped". */</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't intend to */</span> <a name="l01251"></a>01251 <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>->setEnabled(<span class="keyword">false</span>); <a name="l01252"></a>01252 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity->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'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">"Authenticating to Tor"</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>-><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">"COOKIE"</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">"HASHEDPASSWORD"</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">"NULL"</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">"Cookie Authentication Required"</span>), <a name="l01289"></a>01289 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"The Tor software requires Vidalia to send the "</span> <a name="l01290"></a>01290 <span class="stringliteral">"contents of an authentication cookie, but Vidalia "</span> <a name="l01291"></a>01291 <span class="stringliteral">"was unable to find one."</span>)) <a name="l01292"></a>01292 + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Would you like to browse for the file "</span> <a name="l01293"></a>01293 <span class="stringliteral">"'control_auth_cookie' yourself?"</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">"Data Directory"</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">"Control Cookie (control_auth_cookie)"</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">"Authenticating using 'cookie' authentication."</span>); <a name="l01309"></a>01309 <span class="keywordflow">return</span> <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><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">"Authenticating using 'hashed password' authentication."</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>-><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">"Authenticating using 'null' authentication."</span>); <a name="l01321"></a>01321 <span class="keywordflow">return</span> <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><a class="code" href="class_tor_control.html#a2aa1d6903e8180eb685963bbf8f62b19">authenticate</a>(QString(<span class="stringliteral">""</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">"Cancelling control authentication attempt."</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'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>-><a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() < 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">"Connecting to the Tor network"</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 "New Identity" button */</span> <a name="l01349"></a>01349 <a class="code" href="class_main_window.html#aa96aef37c3a45c2c0a0004072169aefe">_actionNewIdentity</a>->setEnabled(<span class="keyword">true</span>); <a name="l01350"></a>01350 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity->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>-><a class="code" href="class_tor_control.html#a303b58f6d75569ee54478d55ede26464">setEvents</a>(&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">"Error Registering for Events"</span>), <a name="l01355"></a>01355 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia was unable to register for some events. "</span> <a name="l01356"></a>01356 <span class="stringliteral">"Many of Vidalia's features may be unavailable."</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'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>-><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>-><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's version */</span> <a name="l01372"></a>01372 <span class="keywordflow">if</span> (<a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() >= 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>-><a class="code" href="class_tor_control.html#acd37862e652425dec4329acef6df4f3e">getTorVersion</a>() >= 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>-><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 <b>errmsg</b>. */</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">"Authentication failed: %1"</span>).arg(errmsg); <a name="l01389"></a>01389 <a name="l01390"></a>01390 <span class="comment">/* Parsing log messages is evil, but we're left with little option */</span> <a name="l01391"></a>01391 <span class="keywordflow">if</span> (errmsg.contains(<span class="stringliteral">"Password did not match"</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(&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<qint64, QString> 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">"tor.exe"</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 > 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">"Password Reset Failed"</span>), <a name="l01428"></a>01428 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia tried to reset Tor's control password, but was not "</span> <a name="l01429"></a>01429 <span class="stringliteral">"able to restart the Tor software. Please check your Task "</span> <a name="l01430"></a>01430 <span class="stringliteral">"Manager to ensure there are no other Tor processes running."</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">"Authentication Error"</span>), <a name="l01440"></a>01440 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia was unable to authenticate to the Tor software. "</span> <a name="l01441"></a>01441 <span class="stringliteral">"(%1)"</span>).arg(errmsg)) + <a name="l01442"></a>01442 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Please check your control port authentication "</span> <a name="l01443"></a>01443 <span class="stringliteral">"settings."</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>-><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 'control_auth_cookie'. If <b>cookiePath</b> 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. <b>cookiePath</b> 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 << 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 << 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 << <a class="code" href="file_8cpp.html#aaa3960262cc91df6d2400eb7ba888ae5">expand_filename</a>(<span class="stringliteral">"%APPDATA%\\Tor"</span>); <a name="l01482"></a>01482 <span class="preprocessor">#else</span> <a name="l01483"></a>01483 <span class="preprocessor"></span> pathList << <a class="code" href="file_8cpp.html#aaa3960262cc91df6d2400eb7ba888ae5">expand_filename</a>(<span class="stringliteral">"~/.tor"</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">"/control_auth_cookie"</span>; <a name="l01491"></a>01491 <a class="code" href="_vidalia_8h.html#ab2d9ba7f4501abfc0e0a2cb52d0f8105">vDebug</a>(<span class="stringliteral">"Checking for authentication cookie in '%1'"</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">"Reading authentication cookie from '%1'"</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">"Couldn't open cookie file '%1': %2"</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">"Couldn't find a readable authentication cookie."</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->maximum(), <a name="l01514"></a>01514 tr(<span class="stringliteral">"Connected to the Tor network!"</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'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>-><a class="code" href="class_tor_control.html#a7bb6236b41505b30e8708c9f5cf8e8f7">getInfo</a>(<span class="stringliteral">"status/version/current"</span>, status)) { <a name="l01537"></a>01537 <span class="keywordflow">if</span> (!status.compare(<span class="stringliteral">"old"</span>, Qt::CaseInsensitive) <a name="l01538"></a>01538 || !status.compare(<span class="stringliteral">"unrecommended"</span>, Qt::CaseInsensitive) <a name="l01539"></a>01539 || !status.compare(<span class="stringliteral">"obsolete"</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 &current, <a name="l01550"></a>01550 <span class="keyword">const</span> QStringList &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">"https://www.torproject.org/"</span>; <a name="l01570"></a>01570 <span class="preprocessor"># if QT_VERSION >= 0x040200</span> <a name="l01571"></a>01571 <span class="preprocessor"></span> website = QString(<span class="stringliteral">"<a href=\"%1\">%1</a>"</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">"Tor Update Available"</span>), <a name="l01575"></a>01575 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"The currently installed version of Tor is out of date or no longer "</span> <a name="l01576"></a>01576 <span class="stringliteral">"recommended. Please visit the Tor website to download the latest "</span> <a name="l01577"></a>01577 <span class="stringliteral">"version."</span>)) + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Tor website: %1"</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">"Tor Update Available"</span>), <a name="l01582"></a>01582 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"The currently installed version of Tor is out of date "</span> <a name="l01583"></a>01583 <span class="stringliteral">"or no longer recommended."</span>)) <a name="l01584"></a>01584 + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Would you like to check if a newer package is "</span> <a name="l01585"></a>01585 <span class="stringliteral">"available for installation?"</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 <b>port</b>. 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'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">", probably Telnet, "</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">", probably an email client, "</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">" "</span>; <a name="l01626"></a>01626 } <a name="l01627"></a>01627 <a name="l01628"></a>01628 QString text = tr(<span class="stringliteral">"One of your applications%1appears to be making a "</span> <a name="l01629"></a>01629 <span class="stringliteral">"potentially unencrypted and unsafe connection to port %2."</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">"Anything sent over this connection could be "</span> <a name="l01633"></a>01633 <span class="stringliteral">"monitored. Please check your application's "</span> <a name="l01634"></a>01634 <span class="stringliteral">"configuration and use only encrypted protocols, "</span> <a name="l01635"></a>01635 <span class="stringliteral">"such as SSL, if possible."</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">"Tor has automatically closed your connection in "</span> <a name="l01638"></a>01638 <span class="stringliteral">"order to protect your anonymity."</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">"Potentially Unsafe Connection"</span>), text, <a name="l01643"></a>01643 QMessageBox::Ok | QMessageBox::Ignore); <a name="l01644"></a>01644 dlg->setInformativeText(extraText); <a name="l01645"></a>01645 dlg->setDefaultButton(QMessageBox::Ok); <a name="l01646"></a>01646 dlg->setEscapeButton(QMessageBox::Ok); <a name="l01647"></a>01647 <a name="l01648"></a>01648 <span class="keywordtype">int</span> ret = dlg->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<quint16> 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 >= 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 << QString::number(port); <a name="l01664"></a>01664 } <a name="l01665"></a>01665 tc-><a class="code" href="class_tor_control.html#acd33beb0663b2a464a101c4efb425708">setConf</a>(<span class="stringliteral">"WarnPlaintextPorts"</span>, portList.join(<span class="stringliteral">","</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 >= 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 << QString::number(port); <a name="l01677"></a>01677 } <a name="l01678"></a>01678 tc-><a class="code" href="class_tor_control.html#acd33beb0663b2a464a101c4efb425708">setConf</a>(<span class="stringliteral">"RejectPlaintextPorts"</span>, portList.join(<span class="stringliteral">","</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'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">/**< Shows the help browser and displays the given help <b>topic</b>. */</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 &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-><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"> * <b>page</b>. */</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>-><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 "New Identity" 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'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>-><a class="code" href="class_tor_control.html#a373ecec8dbb7af273099d72a82a4d797">signal</a>(<a class="code" href="class_tor_signal.html#ab1820803604813483f918d131bcf281faecf437ddb63d4a0de9b716e4a551fb04">TorSignal::NewNym</a>, &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">"New Identity"</span>); <a name="l01738"></a>01738 QString message = tr(<span class="stringliteral">"All subsequent connections will "</span> <a name="l01739"></a>01739 <span class="stringliteral">"appear to be different than your "</span> <a name="l01740"></a>01740 <span class="stringliteral">"old connections."</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>->setEnabled(<span class="keyword">false</span>); <a name="l01744"></a>01744 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity->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">"Failed to Create New Identity"</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 'New Identity' button after a delay from the previous time</span> <a name="l01760"></a>01760 <span class="comment"> * 'New Identity' 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>-><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>->setEnabled(<span class="keyword">true</span>); <a name="l01766"></a>01766 <a class="code" href="class_main_window.html#afd8f577d944364a633983e5bc525b4b7">ui</a>.lblNewIdentity->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">"Unset"</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">"Stopping"</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">"Stopped"</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">"Starting"</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">"Started"</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">"Authenticating"</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">"Authenticated"</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">"Circuit Established"</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">"Unknown"</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">"Port Forwarding Failed"</span>), <a name="l01805"></a>01805 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia was unable to configure automatic port forwarding."</span>)) <a name="l01806"></a>01806 + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(UPNPControl::Instance()->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 'Check Now' 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>-><a class="code" href="class_tor_control.html#abe44c7f9281547aab2d317972519bd49">isRunning</a>() && <a class="code" href="class_main_window.html#a8f528cc4dfc50278137e051ad405ae17">_torControl</a>-><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>-><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 "Check for Updates" 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 &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">"Update Failed"</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> &packageList) <a name="l01876"></a>01876 { <a name="l01877"></a>01877 <a class="code" href="_vidalia_8h.html#a7743cb328f470aa8f382716fbcf61daa">vInfo</a>(<span class="stringliteral">"%1 software update(s) available"</span>).arg(packageList.size()); <a name="l01878"></a>01878 <span class="keywordflow">if</span> (packageList.size() > 0) { <a name="l01879"></a>01879 <a class="code" href="class_updates_available_dialog.html">UpdatesAvailableDialog</a> dlg(packageList, &_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">"Your software is up to date"</span>), <a name="l01894"></a>01894 tr(<span class="stringliteral">"There are no new Tor software packages "</span> <a name="l01895"></a>01895 <span class="stringliteral">"available for your computer at this time."</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 <b>bi</b>, 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>-><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 <b>numUpdates</b> 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. <b>errmsg</b> 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 &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">"Installation Failed"</span>), <a name="l01939"></a>01939 <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"Vidalia was unable to install your software updates."</span>)) <a name="l01940"></a>01940 + <a class="code" href="html_8cpp.html#a6859bd9e7f8c6a4ec0150749bac76c1d">p</a>(tr(<span class="stringliteral">"The following error occurred:"</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 <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address> </body> </html>