summaryrefslogtreecommitdiffabout
path: root/DipstickDlg.cpp
Unidiff
Diffstat (limited to 'DipstickDlg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--DipstickDlg.cpp62
1 files changed, 52 insertions, 10 deletions
diff --git a/DipstickDlg.cpp b/DipstickDlg.cpp
index ace2aff..f27b219 100644
--- a/DipstickDlg.cpp
+++ b/DipstickDlg.cpp
@@ -1,521 +1,524 @@
1// DipstickDlg.cpp : implementation file 1// DipstickDlg.cpp : implementation file
2// 2//
3 3
4#include "stdafx.h" 4#include "stdafx.h"
5#include "Dipstick.h" 5#include "Dipstick.h"
6#include "DipstickDlg.h" 6#include "DipstickDlg.h"
7#include "DragPad.h" 7#include "DragPad.h"
8#include "OptionsDlg.h" 8#include "OptionsDlg.h"
9#include "HostNameDlg.h" 9#include "HostNameDlg.h"
10#include "HostProperties.h" 10#include "HostProperties.h"
11#include "AutoBestDlg.h" 11#include "AutoBestDlg.h"
12#include "ddeml.h" 12#include "ddeml.h"
13 13
14#include "URLSource.h" 14#include "URLSource.h"
15#include "SelectURLsDlg.h" 15#include "SelectURLsDlg.h"
16 16
17#ifdef _DEBUG 17#ifdef _DEBUG
18#define new DEBUG_NEW 18#define new DEBUG_NEW
19#undef THIS_FILE 19#undef THIS_FILE
20static char THIS_FILE[] = __FILE__; 20static char THIS_FILE[] = __FILE__;
21#endif 21#endif
22 22
23///////////////////////////////////////////////////////////////////////////// 23/////////////////////////////////////////////////////////////////////////////
24// CAboutDlg dialog used for App About 24// CAboutDlg dialog used for App About
25 25
26class CAboutDlg : public CDialog 26class CAboutDlg : public CDialog
27{ 27{
28public: 28public:
29 CAboutDlg(); 29 CAboutDlg();
30 30
31// Dialog Data 31// Dialog Data
32 //{{AFX_DATA(CAboutDlg) 32 //{{AFX_DATA(CAboutDlg)
33 enum { IDD = IDD_ABOUTBOX }; 33 enum { IDD = IDD_ABOUTBOX };
34 //}}AFX_DATA 34 //}}AFX_DATA
35 35
36 // ClassWizard generated virtual function overrides 36 // ClassWizard generated virtual function overrides
37 //{{AFX_VIRTUAL(CAboutDlg) 37 //{{AFX_VIRTUAL(CAboutDlg)
38 protected: 38 protected:
39 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 39 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
40 //}}AFX_VIRTUAL 40 //}}AFX_VIRTUAL
41 41
42// Implementation 42// Implementation
43protected: 43protected:
44 virtual BOOL OnInitDialog(); 44 virtual BOOL OnInitDialog();
45 //{{AFX_MSG(CAboutDlg) 45 //{{AFX_MSG(CAboutDlg)
46 afx_msg void OnKlevernet(); 46 afx_msg void OnKlevernet();
47 //}}AFX_MSG 47 //}}AFX_MSG
48 DECLARE_MESSAGE_MAP() 48 DECLARE_MESSAGE_MAP()
49}; 49};
50 50
51CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 51CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
52{ 52{
53 //{{AFX_DATA_INIT(CAboutDlg) 53 //{{AFX_DATA_INIT(CAboutDlg)
54 //}}AFX_DATA_INIT 54 //}}AFX_DATA_INIT
55} 55}
56 56
57void CAboutDlg::DoDataExchange(CDataExchange* pDX) 57void CAboutDlg::DoDataExchange(CDataExchange* pDX)
58{ 58{
59 CDialog::DoDataExchange(pDX); 59 CDialog::DoDataExchange(pDX);
60 //{{AFX_DATA_MAP(CAboutDlg) 60 //{{AFX_DATA_MAP(CAboutDlg)
61 //}}AFX_DATA_MAP 61 //}}AFX_DATA_MAP
62} 62}
63 63
64BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 64BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
65 //{{AFX_MSG_MAP(CAboutDlg) 65 //{{AFX_MSG_MAP(CAboutDlg)
66 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) 66 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet)
67 //}}AFX_MSG_MAP 67 //}}AFX_MSG_MAP
68END_MESSAGE_MAP() 68END_MESSAGE_MAP()
69 69
70///////////////////////////////////////////////////////////////////////////// 70/////////////////////////////////////////////////////////////////////////////
71// CDipstickDlg dialog 71// CDipstickDlg dialog
72 72
73CDipstickDlg::CDipstickDlg(CWnd* pParent /*=NULL*/) 73CDipstickDlg::CDipstickDlg(CWnd* pParent /*=NULL*/)
74 : CDialog(CDipstickDlg::IDD, pParent), 74 : CDialog(CDipstickDlg::IDD, pParent),
75 m_DragPad(NULL), m_PingsPerHost(10), m_PingSize(32), m_TimeOut(5000), m_Interval(500), 75 m_DragPad(NULL), m_PingsPerHost(10), m_PingSize(32), m_TimeOut(5000), m_Interval(500),
76 m_SortCriteria(sortAvg), m_bShown(FALSE), m_MaxThreads(10), m_bExiting(FALSE), 76 m_SortCriteria(sortAvg), m_bShown(FALSE), m_MaxThreads(10), m_bExiting(FALSE),
77 m_bMSWorkAround(TRUE), m_MinSize(-1,-1), m_bAutoBest(TRUE), m_bSmartAdjust(TRUE), 77 m_bMSWorkAround(TRUE), m_MinSize(-1,-1), m_bAutoBest(TRUE), m_bSmartAdjust(TRUE),
78 m_bAdjustInnermost(TRUE), m_ActiveThreads(0), m_bIgnorelative(TRUE) 78 m_bAdjustInnermost(TRUE), m_ActiveThreads(0), m_bIgnorelative(TRUE)
79{ 79{
80CWinApp *app = AfxGetApp(); 80CWinApp *app = AfxGetApp();
81 ASSERT(app); 81 ASSERT(app);
82WORD hi,lo; 82WORD hi,lo;
83 hi=app->GetProfileInt("Options","IntervalHi",HIWORD(m_Interval)); 83 hi=app->GetProfileInt("Options","IntervalHi",HIWORD(m_Interval));
84 lo=app->GetProfileInt("Options","IntervalLo",LOWORD(m_Interval)); 84 lo=app->GetProfileInt("Options","IntervalLo",LOWORD(m_Interval));
85 m_Interval=MAKELONG(lo,hi); 85 m_Interval=MAKELONG(lo,hi);
86 m_MaxThreads=app->GetProfileInt("Options","MaxThreads",m_MaxThreads); 86 m_MaxThreads=app->GetProfileInt("Options","MaxThreads",m_MaxThreads);
87 m_PingSize=app->GetProfileInt("Options","PingSize",m_PingSize); 87 m_PingSize=app->GetProfileInt("Options","PingSize",m_PingSize);
88 m_PingsPerHost=app->GetProfileInt("Options","PingsPerHost",m_PingsPerHost); 88 m_PingsPerHost=app->GetProfileInt("Options","PingsPerHost",m_PingsPerHost);
89 m_SortCriteria=app->GetProfileInt("Options","SortBy",m_SortCriteria); 89 m_SortCriteria=app->GetProfileInt("Options","SortBy",m_SortCriteria);
90 hi=app->GetProfileInt("Options","TimeOutHi",HIWORD(m_TimeOut)); 90 hi=app->GetProfileInt("Options","TimeOutHi",HIWORD(m_TimeOut));
91 lo=app->GetProfileInt("Options","TimeOutLo",LOWORD(m_TimeOut)); 91 lo=app->GetProfileInt("Options","TimeOutLo",LOWORD(m_TimeOut));
92 m_TimeOut=MAKELONG(lo,hi); 92 m_TimeOut=MAKELONG(lo,hi);
93 m_bMSWorkAround = app->GetProfileInt("Options","InnermostURL",m_bMSWorkAround); 93 m_bMSWorkAround = app->GetProfileInt("Options","InnermostURL",m_bMSWorkAround);
94 m_bAutoBest = app->GetProfileInt("Options","AutoBest",m_bAutoBest); 94 m_bAutoBest = app->GetProfileInt("Options","AutoBest",m_bAutoBest);
95 m_bSmartAdjust = app->GetProfileInt("Options","SmartAdjust",m_bSmartAdjust); 95 m_bSmartAdjust = app->GetProfileInt("Options","SmartAdjust",m_bSmartAdjust);
96 m_bAdjustInnermost = app->GetProfileInt("Options","AdjustInnermost",m_bAdjustInnermost); 96 m_bAdjustInnermost = app->GetProfileInt("Options","AdjustInnermost",m_bAdjustInnermost);
97 m_bIgnorelative = app->GetProfileInt("Options","IgnoreRelative",m_bIgnorelative); 97 m_bIgnorelative = app->GetProfileInt("Options","IgnoreRelative",m_bIgnorelative);
98 m_impexPath = app->GetProfileString("Options","ImportExportPath",m_impexPath); 98 m_impexPath = app->GetProfileString("Options","ImportExportPath",m_impexPath);
99 //{{AFX_DATA_INIT(CDipstickDlg) 99 //{{AFX_DATA_INIT(CDipstickDlg)
100 //}}AFX_DATA_INIT 100 //}}AFX_DATA_INIT
101 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 101 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
102 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 102 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
103 m_bmpBack.LoadBitmap(IDB_DIABACK); 103 m_bmpBack.LoadBitmap(IDB_DIABACK);
104 m_bmpBack.GetBitmap(&m_bitmapBack); 104 m_bmpBack.GetBitmap(&m_bitmapBack);
105CString tmp; 105CString tmp;
106 VERIFY(tmp.LoadString(IDS_REGEX_HTMLURL)); 106 VERIFY(tmp.LoadString(IDS_REGEX_HTMLURL));
107 VERIFY(m_reHTMLURL.Compile(tmp,CRegEx::regExtended|CRegEx::regIgnoreCase)); 107 VERIFY(m_reHTMLURL.Compile(tmp,CRegEx::regExtended|CRegEx::regIgnoreCase));
108 VERIFY(tmp.LoadString(IDS_REGEX_URL));
109 VERIFY(m_reURL.Compile(tmp,CRegEx::regExtended|CRegEx::regIgnoreCase));
108} 110}
109 111
110CDipstickDlg::~CDipstickDlg() 112CDipstickDlg::~CDipstickDlg()
111{ 113{
112} 114}
113 115
114void CDipstickDlg::DoDataExchange(CDataExchange* pDX) 116void CDipstickDlg::DoDataExchange(CDataExchange* pDX)
115{ 117{
116 CDialog::DoDataExchange(pDX); 118 CDialog::DoDataExchange(pDX);
117 //{{AFX_DATA_MAP(CDipstickDlg) 119 //{{AFX_DATA_MAP(CDipstickDlg)
118 DDX_Control(pDX, IDC_ADVANCED, m_AdvancedCtl); 120 DDX_Control(pDX, IDC_ADVANCED, m_AdvancedCtl);
119 DDX_Control(pDX, ID_HELP, m_HelpCtl); 121 DDX_Control(pDX, ID_HELP, m_HelpCtl);
120 DDX_Control(pDX, IDC_EXIT, m_ExitCtl); 122 DDX_Control(pDX, IDC_EXIT, m_ExitCtl);
121 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); 123 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
122 DDX_Control(pDX, IDC_MANUALPING, m_ManualPingCtl); 124 DDX_Control(pDX, IDC_MANUALPING, m_ManualPingCtl);
123 DDX_Control(pDX, IDC_REMOVE, m_RemoveCtl); 125 DDX_Control(pDX, IDC_REMOVE, m_RemoveCtl);
124 DDX_Control(pDX, IDC_REPINGALL, m_RepingAllCtl); 126 DDX_Control(pDX, IDC_REPINGALL, m_RepingAllCtl);
125 DDX_Control(pDX, IDC_REPING, m_RepingCtl); 127 DDX_Control(pDX, IDC_REPING, m_RepingCtl);
126 DDX_Control(pDX, IDC_CLEAR, m_ClearListCtl); 128 DDX_Control(pDX, IDC_CLEAR, m_ClearListCtl);
127 DDX_Control(pDX, IDC_HOSTLIST, m_HostList); 129 DDX_Control(pDX, IDC_HOSTLIST, m_HostList);
128 //}}AFX_DATA_MAP 130 //}}AFX_DATA_MAP
129} 131}
130 132
131BEGIN_MESSAGE_MAP(CDipstickDlg, CDialog) 133BEGIN_MESSAGE_MAP(CDipstickDlg, CDialog)
132 //{{AFX_MSG_MAP(CDipstickDlg) 134 //{{AFX_MSG_MAP(CDipstickDlg)
133 ON_WM_SYSCOMMAND() 135 ON_WM_SYSCOMMAND()
134 ON_WM_PAINT() 136 ON_WM_PAINT()
135 ON_WM_QUERYDRAGICON() 137 ON_WM_QUERYDRAGICON()
136 ON_WM_DESTROY() 138 ON_WM_DESTROY()
137 ON_BN_CLICKED(IDC_OPTIONS, OnOptions) 139 ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
140 ON_MESSAGE(WM_DNP_URLSPING, OnURLSPing)
138 ON_MESSAGE(WM_DNP_URLPING, OnUrlPing) 141 ON_MESSAGE(WM_DNP_URLPING, OnUrlPing)
139 ON_MESSAGE(WM_DNP_ACTIVITYCOUNT, OnActivityCount) 142 ON_MESSAGE(WM_DNP_ACTIVITYCOUNT, OnActivityCount)
140 ON_MESSAGE(WM_DNP_UPDATEHOSTDATA, OnUpdateHostData) 143 ON_MESSAGE(WM_DNP_UPDATEHOSTDATA, OnUpdateHostData)
141 ON_MESSAGE(WM_DNP_HTML, OnHTMLTransfer) 144 ON_MESSAGE(WM_DNP_HTML, OnHTMLTransfer)
142 ON_NOTIFY(LVN_COLUMNCLICK, IDC_HOSTLIST, OnColumnclickHostlist) 145 ON_NOTIFY(LVN_COLUMNCLICK, IDC_HOSTLIST, OnColumnclickHostlist)
143 ON_WM_WINDOWPOSCHANGING() 146 ON_WM_WINDOWPOSCHANGING()
144 ON_COMMAND(ID_DRAGPAD_OPTIONS, OnDragpadOptions) 147 ON_COMMAND(ID_DRAGPAD_OPTIONS, OnDragpadOptions)
145 ON_COMMAND(ID_DRAGPAD_SHOWMAINWINDOW, OnDragpadShowmainwindow) 148 ON_COMMAND(ID_DRAGPAD_SHOWMAINWINDOW, OnDragpadShowmainwindow)
146 ON_COMMAND(ID_DRAGPAD_HELP, OnDragpadHelp) 149 ON_COMMAND(ID_DRAGPAD_HELP, OnDragpadHelp)
147 ON_COMMAND(ID_DRAGPAD_ABOUT, OnDragpadAbout) 150 ON_COMMAND(ID_DRAGPAD_ABOUT, OnDragpadAbout)
148 ON_COMMAND(ID_DRAGPAD_EXIT, OnDragpadExit) 151 ON_COMMAND(ID_DRAGPAD_EXIT, OnDragpadExit)
149 ON_BN_CLICKED(IDC_MANUALPING, OnManualping) 152 ON_BN_CLICKED(IDC_MANUALPING, OnManualping)
150 ON_COMMAND(ID_DRAGPAD_MANUALPING, OnDragpadManualping) 153 ON_COMMAND(ID_DRAGPAD_MANUALPING, OnDragpadManualping)
151 ON_COMMAND(ID_DRAGPAD_REPINGALL, OnDragpadRepingAll) 154 ON_COMMAND(ID_DRAGPAD_REPINGALL, OnDragpadRepingAll)
152 ON_COMMAND(ID_DRAGPAD_REMOVEALL, OnDragpadRemoveAll) 155 ON_COMMAND(ID_DRAGPAD_REMOVEALL, OnDragpadRemoveAll)
153 ON_BN_CLICKED(IDC_REPING, OnReping) 156 ON_BN_CLICKED(IDC_REPING, OnReping)
154 ON_BN_CLICKED(IDC_REPINGALL, OnRepingall) 157 ON_BN_CLICKED(IDC_REPINGALL, OnRepingall)
155 ON_BN_CLICKED(IDC_CLEAR, OnClear) 158 ON_BN_CLICKED(IDC_CLEAR, OnClear)
156 ON_NOTIFY(LVN_INSERTITEM, IDC_HOSTLIST, OnInsertitemHostlist) 159 ON_NOTIFY(LVN_INSERTITEM, IDC_HOSTLIST, OnInsertitemHostlist)
157 ON_NOTIFY(LVN_DELETEITEM, IDC_HOSTLIST, OnDeleteitemHostlist) 160 ON_NOTIFY(LVN_DELETEITEM, IDC_HOSTLIST, OnDeleteitemHostlist)
158 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_HOSTLIST, OnDeleteallitemsHostlist) 161 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_HOSTLIST, OnDeleteallitemsHostlist)
159 ON_BN_CLICKED(IDC_EXIT, OnExit) 162 ON_BN_CLICKED(IDC_EXIT, OnExit)
160 ON_NOTIFY(LVN_ITEMCHANGED, IDC_HOSTLIST, OnItemchangedHostlist) 163 ON_NOTIFY(LVN_ITEMCHANGED, IDC_HOSTLIST, OnItemchangedHostlist)
161 ON_BN_CLICKED(IDC_REMOVE, OnRemove) 164 ON_BN_CLICKED(IDC_REMOVE, OnRemove)
162 ON_NOTIFY(NM_RCLICK, IDC_HOSTLIST, OnRclickHostlist) 165 ON_NOTIFY(NM_RCLICK, IDC_HOSTLIST, OnRclickHostlist)
163 ON_COMMAND(ID_HOSTLIST_REPING, OnHostListReping) 166 ON_COMMAND(ID_HOSTLIST_REPING, OnHostListReping)
164 ON_COMMAND(ID_HOSTLIST_REMOVE, OnHostListRemove) 167 ON_COMMAND(ID_HOSTLIST_REMOVE, OnHostListRemove)
165 ON_COMMAND(ID_HOSTLIST_REPINGALL, OnHostListRepingAll) 168 ON_COMMAND(ID_HOSTLIST_REPINGALL, OnHostListRepingAll)
166 ON_COMMAND(ID_HOSTLIST_REMOVEALL, OnHostListRemoveAll) 169 ON_COMMAND(ID_HOSTLIST_REMOVEALL, OnHostListRemoveAll)
167 ON_COMMAND(ID_HOSTLIST_OPENURL, OnHostListOpenURL) 170 ON_COMMAND(ID_HOSTLIST_OPENURL, OnHostListOpenURL)
168 ON_COMMAND(ID_HOSTLIST_PROPERTIES, OnHostListProperties) 171 ON_COMMAND(ID_HOSTLIST_PROPERTIES, OnHostListProperties)
169 ON_NOTIFY(NM_DBLCLK, IDC_HOSTLIST, OnDblclkHostlist) 172 ON_NOTIFY(NM_DBLCLK, IDC_HOSTLIST, OnDblclkHostlist)
170 ON_WM_CLOSE() 173 ON_WM_CLOSE()
171 ON_WM_GETMINMAXINFO() 174 ON_WM_GETMINMAXINFO()
172 ON_WM_SIZE() 175 ON_WM_SIZE()
173 ON_BN_CLICKED(ID_HELP, OnHelp) 176 ON_BN_CLICKED(ID_HELP, OnHelp)
174 ON_NOTIFY(LVN_BEGINDRAG, IDC_HOSTLIST, OnBegindragHostlist) 177 ON_NOTIFY(LVN_BEGINDRAG, IDC_HOSTLIST, OnBegindragHostlist)
175 ON_COMMAND(ID_HOSTLIST_PASTEURL, OnPasteurl) 178 ON_COMMAND(ID_HOSTLIST_PASTEURL, OnPasteurl)
176 ON_COMMAND(ID_HOSTLIST_COPYURL, OnHostlistCopyurl) 179 ON_COMMAND(ID_HOSTLIST_COPYURL, OnHostlistCopyurl)
177 ON_WM_HELPINFO() 180 ON_WM_HELPINFO()
178 ON_WM_DROPFILES() 181 ON_WM_DROPFILES()
179 ON_BN_CLICKED(IDC_ADVANCED, OnAdvanced) 182 ON_BN_CLICKED(IDC_ADVANCED, OnAdvanced)
180 ON_COMMAND(ID_ADVANCED_EXPORTLIST, OnAdvancedExportlist) 183 ON_COMMAND(ID_ADVANCED_EXPORTLIST, OnAdvancedExportlist)
181 ON_COMMAND(ID_ADVANCED_IMPORTLIST, OnAdvancedImportlist) 184 ON_COMMAND(ID_ADVANCED_IMPORTLIST, OnAdvancedImportlist)
182 ON_COMMAND(ID_DRAGPAD_PASTEURL, OnPasteurl) 185 ON_COMMAND(ID_DRAGPAD_PASTEURL, OnPasteurl)
183 ON_COMMAND(ID_DRAGPAD_ADVANCED_EXPORTLIST, OnDragpadAdvancedExportlist) 186 ON_COMMAND(ID_DRAGPAD_ADVANCED_EXPORTLIST, OnDragpadAdvancedExportlist)
184 ON_COMMAND(ID_DRAGPAD_ADVANCED_IMPORTLIST, OnDragpadAdvancedImportlist) 187 ON_COMMAND(ID_DRAGPAD_ADVANCED_IMPORTLIST, OnDragpadAdvancedImportlist)
185 //}}AFX_MSG_MAP 188 //}}AFX_MSG_MAP
186END_MESSAGE_MAP() 189END_MESSAGE_MAP()
187 190
188///////////////////////////////////////////////////////////////////////////// 191/////////////////////////////////////////////////////////////////////////////
189// CDipstickDlg message handlers 192// CDipstickDlg message handlers
190 193
191BOOL CDipstickDlg::OnInitDialog() 194BOOL CDipstickDlg::OnInitDialog()
192{ 195{
193 CDialog::OnInitDialog(); 196 CDialog::OnInitDialog();
194 197
195 // Add "About..." menu item to system menu. 198 // Add "About..." menu item to system menu.
196 199
197 // IDM_ABOUTBOX must be in the system command range. 200 // IDM_ABOUTBOX must be in the system command range.
198 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 201 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
199 ASSERT(IDM_ABOUTBOX < 0xF000); 202 ASSERT(IDM_ABOUTBOX < 0xF000);
200 203
201 CMenu* pSysMenu = GetSystemMenu(FALSE); 204 CMenu* pSysMenu = GetSystemMenu(FALSE);
202 CString strAboutMenu; 205 CString strAboutMenu;
203 strAboutMenu.LoadString(IDS_ABOUTBOX); 206 strAboutMenu.LoadString(IDS_ABOUTBOX);
204 if (!strAboutMenu.IsEmpty()) 207 if (!strAboutMenu.IsEmpty())
205 { 208 {
206 pSysMenu->AppendMenu(MF_SEPARATOR); 209 pSysMenu->AppendMenu(MF_SEPARATOR);
207 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 210 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
208 } 211 }
209 212
210 // Set the icon for this dialog. The framework does this automatically 213 // Set the icon for this dialog. The framework does this automatically
211 // when the application's main window is not a dialog 214 // when the application's main window is not a dialog
212 SetIcon(m_hIcon, TRUE); // Set big icon 215 SetIcon(m_hIcon, TRUE); // Set big icon
213 SetIcon(m_hIcon, FALSE); // Set small icon 216 SetIcon(m_hIcon, FALSE); // Set small icon
214 217
215CRect wrci, wrco; 218CRect wrci, wrco;
216 GetWindowRect(&wrco); 219 GetWindowRect(&wrco);
217 GetClientRect(&wrci); 220 GetClientRect(&wrci);
218CRect brc1, brc2, lrc; 221CRect brc1, brc2, lrc;
219 m_HostList.GetWindowRect(&lrc); 222 m_HostList.GetWindowRect(&lrc);
220 ScreenToClient(&lrc); 223 ScreenToClient(&lrc);
221 m_ManualPingCtl.GetWindowRect(&brc1); 224 m_ManualPingCtl.GetWindowRect(&brc1);
222 ScreenToClient(brc1); 225 ScreenToClient(brc1);
223 m_RepingCtl.GetWindowRect(&brc2); 226 m_RepingCtl.GetWindowRect(&brc2);
224 ScreenToClient(&brc2); 227 ScreenToClient(&brc2);
225 m_OverX = lrc.left; 228 m_OverX = lrc.left;
226 m_OverY = lrc.top; 229 m_OverY = lrc.top;
227 m_GapY = brc2.top - brc1.bottom; 230 m_GapY = brc2.top - brc1.bottom;
228 m_MinSize.cx = m_OverX+m_OverX+m_OverX+brc1.Width()+m_OverX; 231 m_MinSize.cx = m_OverX+m_OverX+m_OverX+brc1.Width()+m_OverX;
229 m_MinSize.cy = m_OverY+(brc1.Height()+m_GapY)*6+(brc1.Height()+m_GapY)*3+m_OverY; 232 m_MinSize.cy = m_OverY+(brc1.Height()+m_GapY)*6+(brc1.Height()+m_GapY)*3+m_OverY;
230 m_MinSize.cx+=wrco.Width()-wrci.Width(); 233 m_MinSize.cx+=wrco.Width()-wrci.Width();
231 m_MinSize.cy+=wrco.Height()-wrci.Height(); 234 m_MinSize.cy+=wrco.Height()-wrci.Height();
232 235
233CWinApp *app = AfxGetApp(); 236CWinApp *app = AfxGetApp();
234 ASSERT(app); 237 ASSERT(app);
235CRect wrc; 238CRect wrc;
236 wrc.top=app->GetProfileInt("Windows","DlgTop",-1); 239 wrc.top=app->GetProfileInt("Windows","DlgTop",-1);
237 wrc.bottom=app->GetProfileInt("Windows","DlgBottom",-1); 240 wrc.bottom=app->GetProfileInt("Windows","DlgBottom",-1);
238 wrc.left=app->GetProfileInt("Windows","DlgLeft",-1); 241 wrc.left=app->GetProfileInt("Windows","DlgLeft",-1);
239 wrc.right=app->GetProfileInt("Windows","DlgRight",-1); 242 wrc.right=app->GetProfileInt("Windows","DlgRight",-1);
240 if((wrc.top!=-1|| wrc.bottom!=-1) && wrc.left!=-1&& wrc.right!=-1) 243 if((wrc.top!=-1|| wrc.bottom!=-1) && wrc.left!=-1&& wrc.right!=-1)
241 MoveWindow(&wrc); 244 MoveWindow(&wrc);
242 245
243 RecalcLayout(-1,-1); 246 RecalcLayout(-1,-1);
244 247
245 m_DragPad = new CDragPad(); 248 m_DragPad = new CDragPad();
246 m_DragPad->m_Daddy=this; 249 m_DragPad->m_Daddy=this;
247 m_DragPad->Create(CDragPad::IDD); 250 m_DragPad->Create(CDragPad::IDD);
248 m_Images.Create(16,16,TRUE,4,1); 251 m_Images.Create(16,16,TRUE,4,1);
249 m_iPending=m_Images.Add(app->LoadIcon(IDI_PENDING)); 252 m_iPending=m_Images.Add(app->LoadIcon(IDI_PENDING));
250 m_iPinging=m_Images.Add(app->LoadIcon(IDI_PINGING)); 253 m_iPinging=m_Images.Add(app->LoadIcon(IDI_PINGING));
251 m_iCompleted=m_Images.Add(app->LoadIcon(IDI_COMPLETED)); 254 m_iCompleted=m_Images.Add(app->LoadIcon(IDI_COMPLETED));
252 m_iUnreachable=m_Images.Add(app->LoadIcon(IDI_UNREACHABLE)); 255 m_iUnreachable=m_Images.Add(app->LoadIcon(IDI_UNREACHABLE));
253 ASSERT(!(m_iPending<0 || m_iPinging<0 || m_iCompleted<0 || m_iUnreachable<0)); 256 ASSERT(!(m_iPending<0 || m_iPinging<0 || m_iCompleted<0 || m_iUnreachable<0));
254 m_HostList.SetImageList(&m_Images,LVSIL_NORMAL); 257 m_HostList.SetImageList(&m_Images,LVSIL_NORMAL);
255 m_HostList.SetImageList(&m_Images,LVSIL_SMALL); 258 m_HostList.SetImageList(&m_Images,LVSIL_SMALL);
256 m_HostList.SetImageList(&m_Images,LVSIL_STATE); 259 m_HostList.SetImageList(&m_Images,LVSIL_STATE);
257 m_HostList.SetTextColor(RGB(255,255,0));// Yellow 260 m_HostList.SetTextColor(RGB(255,255,0));// Yellow
258 m_HostList.SetTextBkColor(RGB(12,167,0));// Green 261 m_HostList.SetTextBkColor(RGB(12,167,0));// Green
259 m_HostList.SetBkColor(RGB(12,167,0)); // Green 262 m_HostList.SetBkColor(RGB(12,167,0)); // Green
260CRect listrc; 263CRect listrc;
261 m_HostList.GetClientRect(&listrc); 264 m_HostList.GetClientRect(&listrc);
262 m_HostList.InsertColumn(0,"Host Name",LVCFMT_LEFT,app->GetProfileInt("Columns","HostName",listrc.Width()-(listrc.Width()*2/16)*4-(listrc.Width()*3/16)),subitemHost); 265 m_HostList.InsertColumn(0,"Host Name",LVCFMT_LEFT,app->GetProfileInt("Columns","HostName",listrc.Width()-(listrc.Width()*2/16)*4-(listrc.Width()*3/16)),subitemHost);
263 m_HostList.InsertColumn(1,"Host IP",LVCFMT_LEFT,app->GetProfileInt("Columns","HostIP",listrc.Width()*3/16),subitemIP); 266 m_HostList.InsertColumn(1,"Host IP",LVCFMT_LEFT,app->GetProfileInt("Columns","HostIP",listrc.Width()*3/16),subitemIP);
264 m_HostList.InsertColumn(2,"Min RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","MinRTT",listrc.Width()*2/16),subitemMin); 267 m_HostList.InsertColumn(2,"Min RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","MinRTT",listrc.Width()*2/16),subitemMin);
265 m_HostList.InsertColumn(3,"Avg RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","AvgRTT",listrc.Width()*2/16),subitemAvg); 268 m_HostList.InsertColumn(3,"Avg RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","AvgRTT",listrc.Width()*2/16),subitemAvg);
266 m_HostList.InsertColumn(4,"Max RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","MaxRTT",listrc.Width()*2/16),subitemMax); 269 m_HostList.InsertColumn(4,"Max RTT",LVCFMT_RIGHT,app->GetProfileInt("Columns","MaxRTT",listrc.Width()*2/16),subitemMax);
267 m_HostList.InsertColumn(5,"Pktloss", LVCFMT_RIGHT,app->GetProfileInt("Columns","PktLoss",listrc.Width()*2/16),subitemPacketloss); 270 m_HostList.InsertColumn(5,"Pktloss", LVCFMT_RIGHT,app->GetProfileInt("Columns","PktLoss",listrc.Width()*2/16),subitemPacketloss);
268 271
269 DragAcceptFiles(TRUE); 272 DragAcceptFiles(TRUE);
270 273
271 return TRUE; // return TRUE unless you set the focus to a control 274 return TRUE; // return TRUE unless you set the focus to a control
272} 275}
273 276
274void CDipstickDlg::OnSysCommand(UINT nID, LPARAM lParam) 277void CDipstickDlg::OnSysCommand(UINT nID, LPARAM lParam)
275{ 278{
276 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 279 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
277 { 280 {
278 CAboutDlg dlgAbout; 281 CAboutDlg dlgAbout;
279 dlgAbout.DoModal(); 282 dlgAbout.DoModal();
280 } 283 }
281 else 284 else
282 { 285 {
283 CDialog::OnSysCommand(nID, lParam); 286 CDialog::OnSysCommand(nID, lParam);
284 } 287 }
285} 288}
286 289
287// If you add a minimize button to your dialog, you will need the code below 290// If you add a minimize button to your dialog, you will need the code below
288// to draw the icon. For MFC applications using the document/view model, 291// to draw the icon. For MFC applications using the document/view model,
289// this is automatically done for you by the framework. 292// this is automatically done for you by the framework.
290 293
291void CDipstickDlg::OnPaint() 294void CDipstickDlg::OnPaint()
292{ 295{
293 if (IsIconic()) 296 if (IsIconic())
294 { 297 {
295 CPaintDC dc(this); // device context for painting 298 CPaintDC dc(this); // device context for painting
296 299
297 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 300 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
298 301
299 // Center icon in client rectangle 302 // Center icon in client rectangle
300 int cxIcon = GetSystemMetrics(SM_CXICON); 303 int cxIcon = GetSystemMetrics(SM_CXICON);
301 int cyIcon = GetSystemMetrics(SM_CYICON); 304 int cyIcon = GetSystemMetrics(SM_CYICON);
302 CRect rect; 305 CRect rect;
303 GetClientRect(&rect); 306 GetClientRect(&rect);
304 int x = (rect.Width() - cxIcon + 1) / 2; 307 int x = (rect.Width() - cxIcon + 1) / 2;
305 int y = (rect.Height() - cyIcon + 1) / 2; 308 int y = (rect.Height() - cyIcon + 1) / 2;
306 309
307 // Draw the icon 310 // Draw the icon
308 dc.DrawIcon(x, y, m_hIcon); 311 dc.DrawIcon(x, y, m_hIcon);
309 } 312 }
310 else 313 else
311 { 314 {
312 CPaintDC pDC(this); 315 CPaintDC pDC(this);
313 CDC bmpDC; 316 CDC bmpDC;
314 bmpDC.CreateCompatibleDC(&pDC); 317 bmpDC.CreateCompatibleDC(&pDC);
315 bmpDC.SelectObject(&m_bmpBack); 318 bmpDC.SelectObject(&m_bmpBack);
316 CRect rc; 319 CRect rc;
317 GetClientRect(&rc); 320 GetClientRect(&rc);
318 for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth) 321 for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth)
319 for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight) 322 for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight)
320 pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY); 323 pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY);
321 bmpDC.DeleteDC(); 324 bmpDC.DeleteDC();
322 CDialog::OnPaint(); 325 CDialog::OnPaint();
323 } 326 }
324} 327}
325 328
326// The system calls this to obtain the cursor to display while the user drags 329// The system calls this to obtain the cursor to display while the user drags
327// the minimized window. 330// the minimized window.
328HCURSOR CDipstickDlg::OnQueryDragIcon() 331HCURSOR CDipstickDlg::OnQueryDragIcon()
329{ 332{
330 return (HCURSOR) m_hIcon; 333 return (HCURSOR) m_hIcon;
331} 334}
332 335
333////////////////////////// 336//////////////////////////
334 337
335void CDipstickDlg::OnDestroy() 338void CDipstickDlg::OnDestroy()
336{ 339{
337 CDialog::OnDestroy(); 340 CDialog::OnDestroy();
338 TRACE0("DestroyMain\n"); 341 TRACE0("DestroyMain\n");
339 m_DragPad->DestroyWindow(); 342 m_DragPad->DestroyWindow();
340 delete m_DragPad; 343 delete m_DragPad;
341 m_DragPad=NULL; 344 m_DragPad=NULL;
342 // *** Eventually move the following code to separate function 345 // *** Eventually move the following code to separate function
343POSITION p = m_Hosts.GetHeadPosition(); 346POSITION p = m_Hosts.GetHeadPosition();
344 while(p){ 347 while(p){
345 POSITION pp = p; 348 POSITION pp = p;
346 CPingyHost *host = m_Hosts.GetNext(p); 349 CPingyHost *host = m_Hosts.GetNext(p);
347 ASSERT(host); 350 ASSERT(host);
348 m_Hosts.RemoveAt(pp); 351 m_Hosts.RemoveAt(pp);
349 host->Suicide(); 352 host->Suicide();
350 } 353 }
351 ASSERT(m_Hosts.IsEmpty()); 354 ASSERT(m_Hosts.IsEmpty());
352} 355}
353 356
354void CDipstickDlg::OnOptions() 357void CDipstickDlg::OnOptions()
355{ 358{
356COptionsDlg o(this); 359COptionsDlg o(this);
357 o.m_Pings = m_PingsPerHost; 360 o.m_Pings = m_PingsPerHost;
358 o.m_PingSize = m_PingSize; 361 o.m_PingSize = m_PingSize;
359 o.m_TimeOut = max(1,m_TimeOut/1000); 362 o.m_TimeOut = max(1,m_TimeOut/1000);
360 o.m_Interval = max(1,m_Interval/1000); 363 o.m_Interval = max(1,m_Interval/1000);
361 o.m_MaxThreads = m_MaxThreads; 364 o.m_MaxThreads = m_MaxThreads;
362 o.m_bMSWorkAround = m_bMSWorkAround; 365 o.m_bMSWorkAround = m_bMSWorkAround;
363 o.m_bAutoBest = m_bAutoBest; 366 o.m_bAutoBest = m_bAutoBest;
364 o.m_bAdjust = m_bSmartAdjust; 367 o.m_bAdjust = m_bSmartAdjust;
365 o.m_bAdjustInn = m_bAdjustInnermost; 368 o.m_bAdjustInn = m_bAdjustInnermost;
366 o.m_bIgnorelative = m_bIgnorelative; 369 o.m_bIgnorelative = m_bIgnorelative;
367 if(o.DoModal()==IDOK){ 370 if(o.DoModal()==IDOK){
368 m_PingsPerHost = o.m_Pings; 371 m_PingsPerHost = o.m_Pings;
369 m_PingSize = o.m_PingSize; 372 m_PingSize = o.m_PingSize;
370 m_TimeOut = o.m_TimeOut*1000; 373 m_TimeOut = o.m_TimeOut*1000;
371 m_Interval = o.m_Interval*1000; 374 m_Interval = o.m_Interval*1000;
372 m_MaxThreads = o.m_MaxThreads; 375 m_MaxThreads = o.m_MaxThreads;
373 m_bMSWorkAround = o.m_bMSWorkAround; 376 m_bMSWorkAround = o.m_bMSWorkAround;
374 m_bAutoBest = o.m_bAutoBest; 377 m_bAutoBest = o.m_bAutoBest;
375 m_bSmartAdjust = o.m_bAdjust; 378 m_bSmartAdjust = o.m_bAdjust;
376 m_bAdjustInnermost = o.m_bAdjustInn; 379 m_bAdjustInnermost = o.m_bAdjustInn;
377 m_bIgnorelative = o.m_bIgnorelative; 380 m_bIgnorelative = o.m_bIgnorelative;
378 } 381 }
379} 382}
380 383
381BOOL CDipstickDlg::AddPingyHost(CPingyHost *host) 384BOOL CDipstickDlg::AddPingyHost(CPingyHost *host)
382{ 385{
383 m_Hosts.AddTail(host); 386 m_Hosts.AddTail(host);
384int i = m_HostList.InsertItem(0,host->m_HostName); 387int i = m_HostList.InsertItem(0,host->m_HostName);
385 m_HostList.SetItemData(i,(DWORD)host); 388 m_HostList.SetItemData(i,(DWORD)host);
386 UpdateDragpadTitle(); 389 UpdateDragpadTitle();
387 return UpdatePingyHost(host,i);// *** Do someting if failed. 390 return UpdatePingyHost(host,i);// *** Do someting if failed.
388} 391}
389 392
390BOOL CDipstickDlg::UpdatePingyHost(CPingyHost *host,int index) 393BOOL CDipstickDlg::UpdatePingyHost(CPingyHost *host,int index)
391{ 394{
392 UpdateDragpadTitle(); 395 UpdateDragpadTitle();
393int i = index; 396int i = index;
394 if(i<0){ 397 if(i<0){
395 int is = m_HostList.GetItemCount(); 398 int is = m_HostList.GetItemCount();
396 for(i=0;i<is;i++) 399 for(i=0;i<is;i++)
397 if(m_HostList.GetItemData(i)==(DWORD)host) 400 if(m_HostList.GetItemData(i)==(DWORD)host)
398 break; 401 break;
399 if(!(i<is)) 402 if(!(i<is))
400 return FALSE; 403 return FALSE;
401 } 404 }
402 ASSERT(m_HostList.GetItemData(i)==(DWORD)host); 405 ASSERT(m_HostList.GetItemData(i)==(DWORD)host);
403 m_HostList.SetItemText(i,subitemHost,host->m_HostName.IsEmpty()?"...":host->m_HostName); 406 m_HostList.SetItemText(i,subitemHost,host->m_HostName.IsEmpty()?"...":host->m_HostName);
404 m_HostList.SetItemText(i,subitemIP,host->m_IP?inet_ntoa(*(in_addr*)&host->m_IP):"..."); 407 m_HostList.SetItemText(i,subitemIP,host->m_IP?inet_ntoa(*(in_addr*)&host->m_IP):"...");
405 if(host->m_Pinged && host->m_Packetloss>=0){ 408 if(host->m_Pinged && host->m_Packetloss>=0){
406 CString tmp; 409 CString tmp;
407 if(host->m_Packetloss==100){ 410 if(host->m_Packetloss==100){
408 m_HostList.SetItemText(i,subitemMin,"-"); 411 m_HostList.SetItemText(i,subitemMin,"-");
409 m_HostList.SetItemText(i,subitemAvg,"-"); 412 m_HostList.SetItemText(i,subitemAvg,"-");
410 m_HostList.SetItemText(i,subitemMax,"-"); 413 m_HostList.SetItemText(i,subitemMax,"-");
411 }else{ 414 }else{
412 tmp.Format("%lu",host->m_MinRTT); 415 tmp.Format("%lu",host->m_MinRTT);
413 m_HostList.SetItemText(i,subitemMin,tmp); 416 m_HostList.SetItemText(i,subitemMin,tmp);
414 tmp.Format("%lu",host->m_AvgRTT); 417 tmp.Format("%lu",host->m_AvgRTT);
415 m_HostList.SetItemText(i,subitemAvg,tmp); 418 m_HostList.SetItemText(i,subitemAvg,tmp);
416 tmp.Format("%lu",host->m_MaxRTT); 419 tmp.Format("%lu",host->m_MaxRTT);
417 m_HostList.SetItemText(i,subitemMax,tmp); 420 m_HostList.SetItemText(i,subitemMax,tmp);
418 } 421 }
419 tmp.Format("%d%%",host->m_Packetloss); 422 tmp.Format("%d%%",host->m_Packetloss);
420 m_HostList.SetItemText(i,subitemPacketloss,tmp); 423 m_HostList.SetItemText(i,subitemPacketloss,tmp);
421 }else{ 424 }else{
422 m_HostList.SetItemText(i,subitemMin,"..."); 425 m_HostList.SetItemText(i,subitemMin,"...");
423 m_HostList.SetItemText(i,subitemAvg,"..."); 426 m_HostList.SetItemText(i,subitemAvg,"...");
424 m_HostList.SetItemText(i,subitemMax,"..."); 427 m_HostList.SetItemText(i,subitemMax,"...");
425 m_HostList.SetItemText(i,subitemPacketloss,"..."); 428 m_HostList.SetItemText(i,subitemPacketloss,"...");
426 } 429 }
427 if(host->m_Pinging) 430 if(host->m_Pinging)
428 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPinging,0,0,0); 431 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPinging,0,0,0);
429 else{ 432 else{
430 if(host->m_bToPing) 433 if(host->m_bToPing)
431 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPending,0,0,0); 434 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPending,0,0,0);
432 else{ 435 else{
433 if(host->m_Pinged){ 436 if(host->m_Pinged){
434 if(host->m_Packetloss==100) 437 if(host->m_Packetloss==100)
435 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iUnreachable,0,0,0); 438 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iUnreachable,0,0,0);
436 else 439 else
437 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iCompleted,0,0,0); 440 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iCompleted,0,0,0);
438 }else 441 }else
439 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPending,0,0,0); 442 m_HostList.SetItem(i,subitemHost,LVIF_IMAGE,NULL,m_iPending,0,0,0);
440 } 443 }
441 } 444 }
442 m_HostList.SortItems(CompareItems,(DWORD)this); 445 m_HostList.SortItems(CompareItems,(DWORD)this);
443 UpdateControlButtons(); 446 UpdateControlButtons();
444 return TRUE; 447 return TRUE;
445} 448}
446 449
447BOOL CDipstickDlg::RemovePingyHost(CPingyHost *host,int index) 450BOOL CDipstickDlg::RemovePingyHost(CPingyHost *host,int index)
448{ 451{
449 if(host->m_Pinging) 452 if(host->m_Pinging)
450 return FALSE; 453 return FALSE;
451int i = index; 454int i = index;
452 if(i<0){ 455 if(i<0){
453 int is = m_HostList.GetItemCount(); 456 int is = m_HostList.GetItemCount();
454 for(i=0;i<is;i++) 457 for(i=0;i<is;i++)
455 if(m_HostList.GetItemData(i)==(DWORD)host) 458 if(m_HostList.GetItemData(i)==(DWORD)host)
456 break; 459 break;
457 if(!(i<is)) 460 if(!(i<is))
458 return FALSE; 461 return FALSE;
459 } 462 }
460 ASSERT(m_HostList.GetItemData(i)==(DWORD)host); 463 ASSERT(m_HostList.GetItemData(i)==(DWORD)host);
461POSITION p = m_Hosts.Find(host,NULL); 464POSITION p = m_Hosts.Find(host,NULL);
462 if(!p) 465 if(!p)
463 return FALSE; 466 return FALSE;
464 m_HostList.DeleteItem(i); 467 m_HostList.DeleteItem(i);
465 m_Hosts.RemoveAt(p); 468 m_Hosts.RemoveAt(p);
466 host->Suicide(); 469 host->Suicide();
467 UpdateControlButtons(); 470 UpdateControlButtons();
468 UpdateDragpadTitle(); 471 UpdateDragpadTitle();
469 return TRUE; 472 return TRUE;
470} 473}
471 474
472LRESULT CDipstickDlg::OnUrlPing(WPARAM wP, LPARAM lP) 475LRESULT CDipstickDlg::OnUrlPing(WPARAM wP, LPARAM lP)
473{ 476{
474 ASSERT(lP); 477 ASSERT(lP);
475CString *u = (CString*)lP; 478CString *u = (CString*)lP;
476CString hn; 479CString hn;
477CPingyHost *host; 480CPingyHost *host;
478 if(m_bMSWorkAround) 481 if(m_bMSWorkAround)
479 hn = CCrackURL::InnermostURL(*u); 482 hn = CCrackURL::InnermostURL(*u);
480 else 483 else
481 hn = *u; 484 hn = *u;
482 hn = CCrackURL::GetHostName(hn); 485 hn = CCrackURL::GetHostName(hn);
483DWORD ip = inet_addr(hn); 486DWORD ip = inet_addr(hn);
484 if(ip==INADDR_NONE) 487 if(ip==INADDR_NONE)
485 host = new CPingyHost(this,(char*)(LPCTSTR)hn); 488 host = new CPingyHost(this,(char*)(LPCTSTR)hn);
486 else 489 else
487 host = new CPingyHost(this,ip); 490 host = new CPingyHost(this,ip);
488 host->m_URL=*u; 491 host->m_URL=*u;
489 delete u; 492 delete u;
490 AddPingyHost(host); 493 AddPingyHost(host);
491 CheckForPendingRequests(); 494 CheckForPendingRequests();
492 return 0; 495 return 0;
493} 496}
494 497
495LRESULT CDipstickDlg::OnActivityCount(WPARAM wP,LPARAM) 498LRESULT CDipstickDlg::OnActivityCount(WPARAM wP,LPARAM)
496{ 499{
497 if(!wP) 500 if(!wP)
498 return 0; 501 return 0;
499 intcrement = (int)wP; 502 intcrement = (int)wP;
500 m_ActiveThreads+=crement; 503 m_ActiveThreads+=crement;
501 if(m_ActiveThreads<0){ 504 if(m_ActiveThreads<0){
502 TRACE0("C'est n'est pas possible!\n"); 505 TRACE0("C'est n'est pas possible!\n");
503 m_ActiveThreads=0; 506 m_ActiveThreads=0;
504 } 507 }
505 TRACE1("AC: %d\n",m_ActiveThreads); 508 TRACE1("AC: %d\n",m_ActiveThreads);
506 if(m_ActiveThreads){ 509 if(m_ActiveThreads){
507 m_DragPad->m_DragNDropTarget.Play(0,(UINT)-1,(UINT)-1); 510 m_DragPad->m_DragNDropTarget.Play(0,(UINT)-1,(UINT)-1);
508 m_ClearListCtl.EnableWindow(FALSE); 511 m_ClearListCtl.EnableWindow(FALSE);
509 }else{ 512 }else{
510 m_DragPad->m_DragNDropTarget.Stop(); 513 m_DragPad->m_DragNDropTarget.Stop();
511 m_DragPad->m_DragNDropTarget.Seek(0); 514 m_DragPad->m_DragNDropTarget.Seek(0);
512 if(m_HostList.GetItemCount()) 515 if(m_HostList.GetItemCount())
513 m_ClearListCtl.EnableWindow(TRUE); 516 m_ClearListCtl.EnableWindow(TRUE);
514 } 517 }
515 if(crement>0) 518 if(crement>0)
516 return 0; 519 return 0;
517 UpdateDragpadTitle(); 520 UpdateDragpadTitle();
518int items = m_HostList.GetItemCount(); 521int items = m_HostList.GetItemCount();
519 if((!CheckForPendingRequests()) && m_bAutoBest && items && !m_ActiveThreads){ 522 if((!CheckForPendingRequests()) && m_bAutoBest && items && !m_ActiveThreads){
520 // Come up with the best URL.. 523 // Come up with the best URL..
521 m_SortCriteria=sortAvg; 524 m_SortCriteria=sortAvg;
@@ -804,783 +807,822 @@ int items = m_HostList.GetItemCount();
804void CDipstickDlg::OnRepingall() 807void CDipstickDlg::OnRepingall()
805{ 808{
806POSITION p = m_Hosts.GetHeadPosition(); 809POSITION p = m_Hosts.GetHeadPosition();
807 while(p){ 810 while(p){
808 CPingyHost *host = m_Hosts.GetNext(p); 811 CPingyHost *host = m_Hosts.GetNext(p);
809 ASSERT(host); 812 ASSERT(host);
810 if(host->m_Pinged && !host->m_Pinging) 813 if(host->m_Pinged && !host->m_Pinging)
811 host->m_bToPing=TRUE; 814 host->m_bToPing=TRUE;
812 } 815 }
813 UpdateDragpadTitle(); 816 UpdateDragpadTitle();
814 CheckForPendingRequests(); 817 CheckForPendingRequests();
815} 818}
816 819
817void CDipstickDlg::OnClear() 820void CDipstickDlg::OnClear()
818{ 821{
819 if(m_ActiveThreads) 822 if(m_ActiveThreads)
820 return; 823 return;
821 m_HostList.DeleteAllItems(); 824 m_HostList.DeleteAllItems();
822 // *** Eventually move the following code to separate function 825 // *** Eventually move the following code to separate function
823POSITION p = m_Hosts.GetHeadPosition(); 826POSITION p = m_Hosts.GetHeadPosition();
824 while(p){ 827 while(p){
825 POSITION pp = p; 828 POSITION pp = p;
826 CPingyHost *host = (CPingyHost*)m_Hosts.GetNext(p); 829 CPingyHost *host = (CPingyHost*)m_Hosts.GetNext(p);
827 ASSERT(host); 830 ASSERT(host);
828 m_Hosts.RemoveAt(pp); 831 m_Hosts.RemoveAt(pp);
829 host->Suicide(); 832 host->Suicide();
830 } 833 }
831 ASSERT(m_Hosts.IsEmpty()); 834 ASSERT(m_Hosts.IsEmpty());
832 UpdateDragpadTitle(); 835 UpdateDragpadTitle();
833} 836}
834 837
835void CDipstickDlg::OnInsertitemHostlist(NMHDR* pNMHDR, LRESULT* pResult) 838void CDipstickDlg::OnInsertitemHostlist(NMHDR* pNMHDR, LRESULT* pResult)
836{ 839{
837NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 840NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
838 m_RepingCtl.EnableWindow(TRUE); 841 m_RepingCtl.EnableWindow(TRUE);
839 m_RepingAllCtl.EnableWindow(TRUE); 842 m_RepingAllCtl.EnableWindow(TRUE);
840 UpdateDragpadTitle(); 843 UpdateDragpadTitle();
841 *pResult = 0; 844 *pResult = 0;
842} 845}
843 846
844void CDipstickDlg::OnDeleteitemHostlist(NMHDR* pNMHDR, LRESULT* pResult) 847void CDipstickDlg::OnDeleteitemHostlist(NMHDR* pNMHDR, LRESULT* pResult)
845{ 848{
846NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 849NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
847 if(!m_HostList.GetItemCount()){ 850 if(!m_HostList.GetItemCount()){
848 m_RepingCtl.EnableWindow(FALSE); 851 m_RepingCtl.EnableWindow(FALSE);
849 m_RepingAllCtl.EnableWindow(FALSE); 852 m_RepingAllCtl.EnableWindow(FALSE);
850 m_ClearListCtl.EnableWindow(FALSE); 853 m_ClearListCtl.EnableWindow(FALSE);
851 } 854 }
852 UpdateDragpadTitle(); 855 UpdateDragpadTitle();
853 *pResult = 0; 856 *pResult = 0;
854} 857}
855 858
856void CDipstickDlg::OnDeleteallitemsHostlist(NMHDR* pNMHDR, LRESULT* pResult) 859void CDipstickDlg::OnDeleteallitemsHostlist(NMHDR* pNMHDR, LRESULT* pResult)
857{ 860{
858NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 861NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
859 m_RepingCtl.EnableWindow(FALSE); 862 m_RepingCtl.EnableWindow(FALSE);
860 m_RepingAllCtl.EnableWindow(FALSE); 863 m_RepingAllCtl.EnableWindow(FALSE);
861 m_ClearListCtl.EnableWindow(FALSE); 864 m_ClearListCtl.EnableWindow(FALSE);
862 UpdateDragpadTitle(); 865 UpdateDragpadTitle();
863 *pResult = 0; 866 *pResult = 0;
864} 867}
865 868
866void CDipstickDlg::OnExit() 869void CDipstickDlg::OnExit()
867{ 870{
868 OnOK(); 871 OnOK();
869} 872}
870 873
871void CDipstickDlg::OnItemchangedHostlist(NMHDR* pNMHDR, LRESULT* pResult) 874void CDipstickDlg::OnItemchangedHostlist(NMHDR* pNMHDR, LRESULT* pResult)
872{ 875{
873NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 876NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
874 if(pNMListView->uChanged&LVIF_STATE && (pNMListView->uOldState&LVIS_SELECTED)!=(pNMListView->uNewState&LVIS_SELECTED)) 877 if(pNMListView->uChanged&LVIF_STATE && (pNMListView->uOldState&LVIS_SELECTED)!=(pNMListView->uNewState&LVIS_SELECTED))
875 UpdateControlButtons(); 878 UpdateControlButtons();
876 UpdateDragpadTitle(); 879 UpdateDragpadTitle();
877 *pResult = 0; 880 *pResult = 0;
878} 881}
879 882
880void CDipstickDlg::UpdateControlButtons() 883void CDipstickDlg::UpdateControlButtons()
881{ 884{
882int items = m_HostList.GetItemCount(); 885int items = m_HostList.GetItemCount();
883 if(!items){ 886 if(!items){
884 m_ClearListCtl.EnableWindow(FALSE); 887 m_ClearListCtl.EnableWindow(FALSE);
885 m_RemoveCtl.EnableWindow(FALSE); 888 m_RemoveCtl.EnableWindow(FALSE);
886 m_RepingAllCtl.EnableWindow(FALSE); 889 m_RepingAllCtl.EnableWindow(FALSE);
887 m_RepingCtl.EnableWindow(FALSE); 890 m_RepingCtl.EnableWindow(FALSE);
888 return; 891 return;
889 } 892 }
890BOOL cl = m_ActiveThreads?FALSE:TRUE, rm = FALSE, ra = FALSE, rp = FALSE; 893BOOL cl = m_ActiveThreads?FALSE:TRUE, rm = FALSE, ra = FALSE, rp = FALSE;
891 for(int tmp=0;tmp<items;tmp++){ 894 for(int tmp=0;tmp<items;tmp++){
892 CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp); 895 CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp);
893 if(!host->m_Pinging){ 896 if(!host->m_Pinging){
894 ra=TRUE; 897 ra=TRUE;
895 if(m_HostList.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED){ 898 if(m_HostList.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED){
896 rp = TRUE; 899 rp = TRUE;
897 rm = TRUE; 900 rm = TRUE;
898 break; 901 break;
899 } 902 }
900 } 903 }
901 } 904 }
902 m_ClearListCtl.EnableWindow(cl); 905 m_ClearListCtl.EnableWindow(cl);
903 m_RemoveCtl.EnableWindow(rm); 906 m_RemoveCtl.EnableWindow(rm);
904 m_RepingAllCtl.EnableWindow(ra); 907 m_RepingAllCtl.EnableWindow(ra);
905 m_RepingCtl.EnableWindow(rp); 908 m_RepingCtl.EnableWindow(rp);
906} 909}
907 910
908void CDipstickDlg::OnRemove() 911void CDipstickDlg::OnRemove()
909{ 912{
910 if(!m_HostList.GetSelectedCount()) 913 if(!m_HostList.GetSelectedCount())
911 return; 914 return;
912 intitems = m_HostList.GetItemCount(); 915 intitems = m_HostList.GetItemCount();
913 for(int tmp=0;tmp<items;tmp++){ 916 for(int tmp=0;tmp<items;tmp++){
914 if(!(m_HostList.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED)) 917 if(!(m_HostList.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED))
915 continue; 918 continue;
916 CPingyHost *host = (CPingyHost*) m_HostList.GetItemData(tmp); 919 CPingyHost *host = (CPingyHost*) m_HostList.GetItemData(tmp);
917 ASSERT(host); 920 ASSERT(host);
918 if(!host->m_Pinging) 921 if(!host->m_Pinging)
919 RemovePingyHost(host,tmp); 922 RemovePingyHost(host,tmp);
920 } 923 }
921} 924}
922 925
923void CDipstickDlg::OnRclickHostlist(NMHDR* pNMHDR, LRESULT* pResult) 926void CDipstickDlg::OnRclickHostlist(NMHDR* pNMHDR, LRESULT* pResult)
924{ 927{
925 if(!m_HostList.GetSelectedCount()) 928 if(!m_HostList.GetSelectedCount())
926 return; 929 return;
927int items = m_HostList.GetItemCount(); 930int items = m_HostList.GetItemCount();
928int item = -1; 931int item = -1;
929 for(int tmp=0;tmp<items;tmp++){ 932 for(int tmp=0;tmp<items;tmp++){
930 ints = m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED); 933 ints = m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED);
931 if(s&LVIS_FOCUSED){ 934 if(s&LVIS_FOCUSED){
932 item = tmp; 935 item = tmp;
933 break; 936 break;
934 } 937 }
935 if(s&LVIS_SELECTED) 938 if(s&LVIS_SELECTED)
936 item=tmp; 939 item=tmp;
937 } 940 }
938 ASSERT(item>=0); 941 ASSERT(item>=0);
939CPoint p; 942CPoint p;
940 VERIFY(m_HostList.GetItemPosition(item,&p)); 943 VERIFY(m_HostList.GetItemPosition(item,&p));
941CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(item); 944CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(item);
942 ASSERT(host); 945 ASSERT(host);
943 m_HostList.ClientToScreen(&p); 946 m_HostList.ClientToScreen(&p);
944CMenu menus; 947CMenu menus;
945 VERIFY(menus.LoadMenu(IDR_MENU)); 948 VERIFY(menus.LoadMenu(IDR_MENU));
946CMenu *popUp = menus.GetSubMenu(1); 949CMenu *popUp = menus.GetSubMenu(1);
947 ASSERT(popUp); 950 ASSERT(popUp);
948 UpdateControlButtons(); 951 UpdateControlButtons();
949 popUp->EnableMenuItem(ID_HOSTLIST_REPING,MF_BYCOMMAND|(m_RepingCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED)); 952 popUp->EnableMenuItem(ID_HOSTLIST_REPING,MF_BYCOMMAND|(m_RepingCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED));
950 popUp->EnableMenuItem(ID_HOSTLIST_REMOVE,MF_BYCOMMAND|(m_RemoveCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED)); 953 popUp->EnableMenuItem(ID_HOSTLIST_REMOVE,MF_BYCOMMAND|(m_RemoveCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED));
951 popUp->EnableMenuItem(ID_HOSTLIST_REMOVEALL,MF_BYCOMMAND|(m_ClearListCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED)); 954 popUp->EnableMenuItem(ID_HOSTLIST_REMOVEALL,MF_BYCOMMAND|(m_ClearListCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED));
952 popUp->EnableMenuItem(ID_HOSTLIST_REPINGALL,MF_BYCOMMAND|(m_RepingAllCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED)); 955 popUp->EnableMenuItem(ID_HOSTLIST_REPINGALL,MF_BYCOMMAND|(m_RepingAllCtl.IsWindowEnabled()?MF_ENABLED:MF_GRAYED));
953 popUp->EnableMenuItem(ID_HOSTLIST_OPENURL,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1 && !host->m_URL.IsEmpty())?MF_ENABLED:MF_GRAYED)); 956 popUp->EnableMenuItem(ID_HOSTLIST_OPENURL,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1 && !host->m_URL.IsEmpty())?MF_ENABLED:MF_GRAYED));
954 popUp->EnableMenuItem(ID_HOSTLIST_COPYURL,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1 && !host->m_URL.IsEmpty())?MF_ENABLED:MF_GRAYED)); 957 popUp->EnableMenuItem(ID_HOSTLIST_COPYURL,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1 && !host->m_URL.IsEmpty())?MF_ENABLED:MF_GRAYED));
955 popUp->EnableMenuItem(ID_HOSTLIST_PROPERTIES,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1)?MF_ENABLED:MF_GRAYED)); 958 popUp->EnableMenuItem(ID_HOSTLIST_PROPERTIES,MF_BYCOMMAND|((m_HostList.GetSelectedCount()==1)?MF_ENABLED:MF_GRAYED));
956 popUp->EnableMenuItem(ID_HOSTLIST_PASTEURL,MF_BYCOMMAND|(IsPasteableClipboard()?MF_ENABLED:MF_GRAYED)); 959 popUp->EnableMenuItem(ID_HOSTLIST_PASTEURL,MF_BYCOMMAND|(IsPasteableClipboard()?MF_ENABLED:MF_GRAYED));
957 popUp->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,p.x,p.y,this); 960 popUp->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,p.x,p.y,this);
958 *pResult = 0; 961 *pResult = 0;
959} 962}
960 963
961void CDipstickDlg::OnHostListReping() 964void CDipstickDlg::OnHostListReping()
962{ 965{
963 OnReping(); 966 OnReping();
964} 967}
965void CDipstickDlg::OnHostListRemove() 968void CDipstickDlg::OnHostListRemove()
966{ 969{
967 OnRemove(); 970 OnRemove();
968} 971}
969void CDipstickDlg::OnHostListRepingAll() 972void CDipstickDlg::OnHostListRepingAll()
970{ 973{
971 OnRepingall(); 974 OnRepingall();
972} 975}
973void CDipstickDlg::OnHostListRemoveAll() 976void CDipstickDlg::OnHostListRemoveAll()
974{ 977{
975 OnClear(); 978 OnClear();
976} 979}
977void CDipstickDlg::OnHostListOpenURL() 980void CDipstickDlg::OnHostListOpenURL()
978{ 981{
979 if(m_HostList.GetSelectedCount()!=1) 982 if(m_HostList.GetSelectedCount()!=1)
980 return; 983 return;
981int items = m_HostList.GetItemCount(); 984int items = m_HostList.GetItemCount();
982 for(int tmp=0;tmp<items;tmp++){ 985 for(int tmp=0;tmp<items;tmp++){
983 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED) 986 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED)
984 break; 987 break;
985 } 988 }
986 ASSERT(tmp<items); 989 ASSERT(tmp<items);
987CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp); 990CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp);
988 ASSERT(host); 991 ASSERT(host);
989 if(!host->m_URL.IsEmpty()) 992 if(!host->m_URL.IsEmpty())
990 ShellExecute(::GetDesktopWindow(),NULL,host->m_URL,NULL,NULL,SW_SHOWMAXIMIZED); 993 ShellExecute(::GetDesktopWindow(),NULL,host->m_URL,NULL,NULL,SW_SHOWMAXIMIZED);
991} 994}
992 995
993void CDipstickDlg::OnHostListProperties() 996void CDipstickDlg::OnHostListProperties()
994{ 997{
995 if(m_HostList.GetSelectedCount()!=1) 998 if(m_HostList.GetSelectedCount()!=1)
996 return; 999 return;
997int items = m_HostList.GetItemCount(); 1000int items = m_HostList.GetItemCount();
998 for(int tmp=0;tmp<items;tmp++){ 1001 for(int tmp=0;tmp<items;tmp++){
999 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED) 1002 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED)
1000 break; 1003 break;
1001 } 1004 }
1002 ASSERT(tmp<items); 1005 ASSERT(tmp<items);
1003CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp); 1006CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp);
1004 ASSERT(host); 1007 ASSERT(host);
1005CHostProperties hp(this); 1008CHostProperties hp(this);
1006 hp.SetHost(host); 1009 hp.SetHost(host);
1007 hp.DoModal(); 1010 hp.DoModal();
1008} 1011}
1009 1012
1010void CDipstickDlg::OnDblclkHostlist(NMHDR* pNMHDR, LRESULT* pResult) 1013void CDipstickDlg::OnDblclkHostlist(NMHDR* pNMHDR, LRESULT* pResult)
1011{ 1014{
1012 OnHostListOpenURL(); 1015 OnHostListOpenURL();
1013 *pResult = 0; 1016 *pResult = 0;
1014} 1017}
1015 1018
1016void CDipstickDlg::OnClose() 1019void CDipstickDlg::OnClose()
1017{ 1020{
1018 m_bShown=FALSE; 1021 m_bShown=FALSE;
1019 ShowWindow(SW_HIDE); 1022 ShowWindow(SW_HIDE);
1020} 1023}
1021 1024
1022BOOL CAboutDlg::OnInitDialog() 1025BOOL CAboutDlg::OnInitDialog()
1023{ 1026{
1024 CDialog::OnInitDialog(); 1027 CDialog::OnInitDialog();
1025 return TRUE; 1028 return TRUE;
1026} 1029}
1027 1030
1028void CDipstickDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 1031void CDipstickDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
1029{ 1032{
1030 CDialog::OnGetMinMaxInfo(lpMMI); 1033 CDialog::OnGetMinMaxInfo(lpMMI);
1031 if(m_MinSize.cx>0 && m_MinSize.cy>0){ 1034 if(m_MinSize.cx>0 && m_MinSize.cy>0){
1032 lpMMI->ptMinTrackSize.x = m_MinSize.cx; 1035 lpMMI->ptMinTrackSize.x = m_MinSize.cx;
1033 lpMMI->ptMinTrackSize.y = m_MinSize.cy; 1036 lpMMI->ptMinTrackSize.y = m_MinSize.cy;
1034 } 1037 }
1035} 1038}
1036 1039
1037void CDipstickDlg::OnSize(UINT nType, int cx, int cy) 1040void CDipstickDlg::OnSize(UINT nType, int cx, int cy)
1038{ 1041{
1039 CDialog::OnSize(nType, cx, cy); 1042 CDialog::OnSize(nType, cx, cy);
1040 if(nType==SIZE_RESTORED) 1043 if(nType==SIZE_RESTORED)
1041 RecalcLayout(cx,cy); 1044 RecalcLayout(cx,cy);
1042} 1045}
1043 1046
1044void CDipstickDlg::RecalcLayout(int,int) 1047void CDipstickDlg::RecalcLayout(int,int)
1045{ 1048{
1046CRect wrc; 1049CRect wrc;
1047 GetClientRect(&wrc); 1050 GetClientRect(&wrc);
1048CRect brc; 1051CRect brc;
1049 m_ManualPingCtl.GetWindowRect(&brc); 1052 m_ManualPingCtl.GetWindowRect(&brc);
1050 m_HostList.SetWindowPos(NULL,m_OverX,m_OverY,wrc.Width()-m_OverX*3-brc.Width(),wrc.Height()-m_OverY*2,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER); 1053 m_HostList.SetWindowPos(NULL,m_OverX,m_OverY,wrc.Width()-m_OverX*3-brc.Width(),wrc.Height()-m_OverY*2,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
1051int xb = wrc.Width()-m_OverX-brc.Width(); 1054int xb = wrc.Width()-m_OverX-brc.Width();
1052int cyb = brc.Height()+m_GapY; 1055int cyb = brc.Height()+m_GapY;
1053 m_ManualPingCtl.SetWindowPos(NULL,xb,m_OverY,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1056 m_ManualPingCtl.SetWindowPos(NULL,xb,m_OverY,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1054 m_RepingCtl.SetWindowPos(NULL,xb,m_OverY+cyb,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1057 m_RepingCtl.SetWindowPos(NULL,xb,m_OverY+cyb,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1055 m_RepingAllCtl.SetWindowPos(NULL,xb,m_OverY+cyb*2,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1058 m_RepingAllCtl.SetWindowPos(NULL,xb,m_OverY+cyb*2,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1056 m_RemoveCtl.SetWindowPos(NULL,xb,m_OverY+cyb*3,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1059 m_RemoveCtl.SetWindowPos(NULL,xb,m_OverY+cyb*3,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1057 m_ClearListCtl.SetWindowPos(NULL,xb,m_OverY+cyb*4,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1060 m_ClearListCtl.SetWindowPos(NULL,xb,m_OverY+cyb*4,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1058 m_AdvancedCtl.SetWindowPos(NULL,xb,m_OverY+cyb*5,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1061 m_AdvancedCtl.SetWindowPos(NULL,xb,m_OverY+cyb*5,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1059 m_ExitCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1062 m_ExitCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1060 m_OptionsCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-cyb-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1063 m_OptionsCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-cyb-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1061 m_HelpCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-cyb*2-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); 1064 m_HelpCtl.SetWindowPos(NULL,xb,wrc.Height()-m_OverY-cyb*2-brc.Height(),0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS);
1062} 1065}
1063 1066
1064void CDipstickDlg::OnHelp() 1067void CDipstickDlg::OnHelp()
1065{ 1068{
1066 WinHelp(0,HELP_FINDER); 1069 WinHelp(0,HELP_FINDER);
1067} 1070}
1068 1071
1069void CDipstickDlg::UpdateDragpadTitle() 1072void CDipstickDlg::UpdateDragpadTitle()
1070{ 1073{
1071int ic = m_HostList.GetItemCount(); 1074int ic = m_HostList.GetItemCount();
1072CString title; 1075CString title;
1073 if(!ic){ 1076 if(!ic){
1074 VERIFY(title.LoadString(IDS_DRAGPAD_TITLE)); 1077 VERIFY(title.LoadString(IDS_DRAGPAD_TITLE));
1075 }else{ 1078 }else{
1076 int ip = 0; 1079 int ip = 0;
1077 POSITION p = m_Hosts.GetHeadPosition(); 1080 POSITION p = m_Hosts.GetHeadPosition();
1078 while(p){ 1081 while(p){
1079 CPingyHost *host = m_Hosts.GetNext(p); 1082 CPingyHost *host = m_Hosts.GetNext(p);
1080 ASSERT(host); 1083 ASSERT(host);
1081 if(!(host->m_Pinging || host->m_bToPing)) 1084 if(!(host->m_Pinging || host->m_bToPing))
1082 ip++; 1085 ip++;
1083 } 1086 }
1084 title.Format(IDS_DRAGPAD_URLS,ip,ic); 1087 title.Format(IDS_DRAGPAD_URLS,ip,ic);
1085 } 1088 }
1086 if(m_DragPad) 1089 if(m_DragPad)
1087 m_DragPad->SetWindowText(title); 1090 m_DragPad->SetWindowText(title);
1088} 1091}
1089 1092
1090void CDipstickDlg::OnBegindragHostlist(NMHDR* pNMHDR, LRESULT* pResult) 1093void CDipstickDlg::OnBegindragHostlist(NMHDR* pNMHDR, LRESULT* pResult)
1091{ 1094{
1092 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1095 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1093 1096
1094 if(pNMListView->iItem>=0){ 1097 if(pNMListView->iItem>=0){
1095 CPingyHost *host = (CPingyHost*) m_HostList.GetItemData(pNMListView->iItem); 1098 CPingyHost *host = (CPingyHost*) m_HostList.GetItemData(pNMListView->iItem);
1096 ASSERT(host); 1099 ASSERT(host);
1097 if(!host->m_URL.IsEmpty()){ 1100 if(!host->m_URL.IsEmpty()){
1098 CURLSource us(host->m_URL); 1101 CURLSource us(host->m_URL);
1099 us.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_LINK); 1102 us.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_LINK);
1100 } 1103 }
1101 } 1104 }
1102 1105
1103 *pResult = 0; 1106 *pResult = 0;
1104} 1107}
1105 1108
1106void CDipstickDlg::OnPasteurl() 1109void CDipstickDlg::OnPasteurl()
1107{ 1110{
1108COleDataObject odo; 1111COleDataObject odo;
1109 if(!odo.AttachClipboard()) 1112 if(!odo.AttachClipboard())
1110 return; 1113 return;
1111 CollectURLs(&odo,FALSE); 1114 CollectURLs(&odo,FALSE);
1112} 1115}
1113 1116
1114BOOL CDipstickDlg::IsPasteableClipboard() 1117BOOL CDipstickDlg::IsPasteableClipboard()
1115{ 1118{
1116COleDataObject odo; 1119COleDataObject odo;
1117 if(!odo.AttachClipboard()) 1120 if(!odo.AttachClipboard())
1118 return FALSE; 1121 return FALSE;
1119 if(CollectURLs(&odo,TRUE)) 1122 if(CollectURLs(&odo,TRUE))
1120 return TRUE; 1123 return TRUE;
1121 return FALSE; 1124 return FALSE;
1122} 1125}
1123 1126
1124BOOL CDipstickDlg::CollectURLs(COleDataObject* pDO,BOOL bTestOnly) 1127BOOL CDipstickDlg::CollectURLs(COleDataObject* pDO,BOOL bTestOnly)
1125{ 1128{
1126 UINTcfURL = RegisterClipboardFormat("UniformResourceLocator"); 1129 UINTcfURL = RegisterClipboardFormat("UniformResourceLocator");
1127 UINTcfHTML = RegisterClipboardFormat("HTML Format"); 1130 UINTcfHTML = RegisterClipboardFormat("HTML Format");
1128 UINTcfNIF = RegisterClipboardFormat("Netscape Image Format"); 1131 UINTcfNIF = RegisterClipboardFormat("Netscape Image Format");
1129 if(pDO->IsDataAvailable(cfURL)){ 1132 if(pDO->IsDataAvailable(cfURL)){
1130 if(!bTestOnly){ 1133 if(!bTestOnly){
1131 HGLOBAL hg = pDO->GetGlobalData(cfURL); 1134 HGLOBAL hg = pDO->GetGlobalData(cfURL);
1132 ASSERT(hg); 1135 ASSERT(hg);
1133 LPVOID lpv = GlobalLock(hg); 1136 LPVOID lpv = GlobalLock(hg);
1134 ASSERT(lpv); 1137 ASSERT(lpv);
1135 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)lpv)); 1138 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)lpv));
1136 GlobalUnlock(hg); 1139 GlobalUnlock(hg);
1137 GlobalFree(hg); 1140 GlobalFree(hg);
1138 } 1141 }
1139 return TRUE; 1142 return TRUE;
1140 } 1143 }
1141 if(pDO->IsDataAvailable(cfHTML)){ 1144 if(pDO->IsDataAvailable(cfHTML)){
1142 HGLOBAL hg = pDO->GetGlobalData(cfHTML); 1145 HGLOBAL hg = pDO->GetGlobalData(cfHTML);
1143 ASSERT(hg); 1146 ASSERT(hg);
1144 LPCTSTR lps = (LPCTSTR)GlobalLock(hg); 1147 LPCTSTR lps = (LPCTSTR)GlobalLock(hg);
1145 ASSERT(lps); 1148 ASSERT(lps);
1146 BOOL rv = FALSE; 1149 BOOL rv = FALSE;
1147 do{ 1150 do{
1148 static LPCTSTR v10 = "Version:1.0\r\n"; 1151 static LPCTSTR v10 = "Version:1.0\r\n";
1149 if(memcmp(v10,lps,strlen(v10))) 1152 if(memcmp(v10,lps,strlen(v10)))
1150 break; 1153 break;
1151 static LPCTSTR strStartSelection = "StartSelection:"; 1154 static LPCTSTR strStartSelection = "StartSelection:";
1152 static LPCTSTR strEndSelection = "EndSelection:"; 1155 static LPCTSTR strEndSelection = "EndSelection:";
1153 static LPCTSTR strSourceURL = "SourceURL:"; 1156 static LPCTSTR strSourceURL = "SourceURL:";
1154 LPTSTR subs = strstr(lps,strStartSelection); 1157 LPTSTR subs = strstr(lps,strStartSelection);
1155 if(!subs) 1158 if(!subs)
1156 break; 1159 break;
1157 LONG startSelection = atol(&subs[strlen(strStartSelection)]); 1160 LONG startSelection = atol(&subs[strlen(strStartSelection)]);
1158 if(!startSelection) 1161 if(!startSelection)
1159 break; 1162 break;
1160 if(!(subs=strstr(lps,strEndSelection))) 1163 if(!(subs=strstr(lps,strEndSelection)))
1161 break; 1164 break;
1162 LONG endSelection = atol(&subs[strlen(strEndSelection)]); 1165 LONG endSelection = atol(&subs[strlen(strEndSelection)]);
1163 if(!endSelection) 1166 if(!endSelection)
1164 break; 1167 break;
1165 if(!(subs=strstr(lps,strSourceURL))) 1168 if(!(subs=strstr(lps,strSourceURL)))
1166 break; 1169 break;
1167 subs = &subs[strlen(strSourceURL)]; 1170 subs = &subs[strlen(strSourceURL)];
1168 LPTSTR eol = strchr(subs,'\r'); 1171 LPTSTR eol = strchr(subs,'\r');
1169 if(!eol) 1172 if(!eol)
1170 break; 1173 break;
1171 (*eol)=0; 1174 (*eol)=0;
1172 CString sourceURL = subs; 1175 CString sourceURL = subs;
1173 if(!sourceURL.GetLength()) 1176 if(!sourceURL.GetLength())
1174 break; 1177 break;
1175 TRACE0("SourceURL = "+sourceURL+"\n"); 1178 TRACE0("SourceURL = "+sourceURL+"\n");
1176 _xferHTML* xf = new _xferHTML; 1179 _xferHTML* xf = new _xferHTML;
1177 VERIFY(xf->src.Crack(sourceURL)); 1180 VERIFY(xf->src.Crack(sourceURL));
1178 LPTSTR htmlBuff = xf->html.GetBuffer(endSelection-startSelection+2); 1181 LPTSTR htmlBuff = xf->html.GetBuffer(endSelection-startSelection+2);
1179 ASSERT(htmlBuff); 1182 ASSERT(htmlBuff);
1180 memmove(htmlBuff,&lps[startSelection],endSelection-startSelection+1); 1183 memmove(htmlBuff,&lps[startSelection],endSelection-startSelection+1);
1181 htmlBuff[endSelection-startSelection+1]=0; 1184 htmlBuff[endSelection-startSelection+1]=0;
1182 xf->html.ReleaseBuffer(); 1185 xf->html.ReleaseBuffer();
1183 if(bTestOnly){ 1186 if(bTestOnly){
1184 rv = m_reHTMLURL.Match(xf->html); 1187 rv = m_reHTMLURL.Match(xf->html);
1185 delete xf; 1188 delete xf;
1186 }else{ 1189 }else{
1187 PostMessage(WM_DNP_HTML,0,(LPARAM)xf); 1190 PostMessage(WM_DNP_HTML,0,(LPARAM)xf);
1191 rv = TRUE;
1188 } 1192 }
1189 }while(FALSE); 1193 }while(FALSE);
1190 GlobalUnlock(hg); 1194 GlobalUnlock(hg);
1191 GlobalFree(hg); 1195 GlobalFree(hg);
1192 return rv; 1196 return rv;
1193 } 1197 }
1194 if(pDO->IsDataAvailable(cfNIF)){ 1198 if(pDO->IsDataAvailable(cfNIF)){
1195 if(!bTestOnly){ 1199 if(!bTestOnly){
1196 HGLOBAL hg = pDO->GetGlobalData(cfNIF); 1200 HGLOBAL hg = pDO->GetGlobalData(cfNIF);
1197 ASSERT(hg); 1201 ASSERT(hg);
1198 LPVOID lpv = GlobalLock(hg); 1202 LPVOID lpv = GlobalLock(hg);
1199 ASSERT(lpv); 1203 ASSERT(lpv);
1200 struct _nif{ 1204 struct _nif{
1201 BYTE data[0x20]; 1205 BYTE data[0x20];
1202 DWORD m_offDescr; 1206 DWORD m_offDescr;
1203 DWORD m_offURL; 1207 DWORD m_offURL;
1204 DWORD m_offToImage; 1208 DWORD m_offToImage;
1205 } *nif = (_nif*)lpv; 1209 } *nif = (_nif*)lpv;
1206 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)&nif->data[nif->m_offURL])); 1210 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)&nif->data[nif->m_offURL]));
1207 GlobalUnlock(hg); 1211 GlobalUnlock(hg);
1208 GlobalFree(hg); 1212 GlobalFree(hg);
1209 } 1213 }
1210 return TRUE; 1214 return TRUE;
1211 } 1215 }
1212 if(pDO->IsDataAvailable(CF_TEXT)){ 1216 if(pDO->IsDataAvailable(CF_TEXT)){
1213 if(!bTestOnly){ 1217 BOOL rv = FALSE;
1214 HGLOBAL hg = pDO->GetGlobalData(CF_TEXT); 1218 HGLOBAL hg = pDO->GetGlobalData(CF_TEXT);
1215 ASSERT(hg); 1219 ASSERT(hg);
1216 LPVOID lpv = GlobalLock(hg); 1220 LPVOID lpv = GlobalLock(hg);
1217 ASSERT(lpv); 1221 ASSERT(lpv);
1218 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)lpv)); 1222 if(bTestOnly){
1219 GlobalUnlock(hg); 1223 rv = m_reURL.Match((LPCSTR)lpv);
1220 GlobalFree(hg); 1224 }else{
1225 CString sel = (LPCSTR)lpv;
1226 if(m_reURL.Match(sel)) {
1227 rv = TRUE;
1228 CString tmp = m_reURL.GetMatch(CRegEx::matchPostMatch);
1229 if(m_reURL.Match(tmp)) {
1230 PostMessage(WM_DNP_URLSPING,0,(LPARAM)new CString((LPCSTR)lpv));
1231 }else{
1232 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString((LPCTSTR)lpv));
1233 }
1234 }
1221 } 1235 }
1222 return TRUE; 1236 GlobalUnlock(hg);
1237 GlobalFree(hg);
1238 return rv;
1223 } 1239 }
1224 return FALSE; 1240 return FALSE;
1225} 1241}
1226 1242
1227LRESULT CDipstickDlg::OnHTMLTransfer(WPARAM wP, LPARAM lP) 1243LRESULT CDipstickDlg::OnHTMLTransfer(WPARAM wP, LPARAM lP)
1228{ 1244{
1229_xferHTML* xf = (_xferHTML*)lP; 1245_xferHTML* xf = (_xferHTML*)lP;
1230CSelectURLsDlg su; 1246CSelectURLsDlg su;
1231 su.m_bAdjust = m_bSmartAdjust; 1247 su.m_bAdjust = m_bSmartAdjust;
1232 su.m_bAdjustInnermost = m_bAdjustInnermost; 1248 su.m_bAdjustInnermost = m_bAdjustInnermost;
1233 BeginWaitCursor(); 1249 BeginWaitCursor();
1234 while(m_reHTMLURL.Match(xf->html)){ 1250 while(m_reHTMLURL.Match(xf->html)){
1235 CString url = m_reHTMLURL.GetMatch(1); 1251 CString url = m_reHTMLURL.GetMatch(1);
1236 xf->html = m_reHTMLURL.GetMatch(CRegEx::matchPostMatch); 1252 xf->html = m_reHTMLURL.GetMatch(CRegEx::matchPostMatch);
1237 if(CCrackURL::GetHostName(url)==url){ 1253 if(CCrackURL::GetHostName(url)==url){
1238 if(m_bIgnorelative) 1254 if(m_bIgnorelative)
1239 continue; 1255 continue;
1240 CCrackURL cracked; 1256 CCrackURL cracked;
1241 VERIFY(cracked.Crack(url)); 1257 VERIFY(cracked.Crack(url));
1242 cracked.Adjust(xf->src); 1258 cracked.Adjust(xf->src);
1243 url = cracked.Build(); 1259 url = cracked.Build();
1244 } 1260 }
1245 if(!su.m_URLs.Find(url)) 1261 if(!su.m_URLs.Find(url))
1246 VERIFY(su.m_URLs.AddTail(url)); 1262 VERIFY(su.m_URLs.AddTail(url));
1247 } 1263 }
1248 EndWaitCursor(); 1264 EndWaitCursor();
1249 delete xf; 1265 delete xf;
1250 if(su.DoModal()==IDOK){ 1266 if(su.DoModal()==IDOK){
1251 POSITION p = su.m_URLs.GetHeadPosition(); 1267 POSITION p = su.m_URLs.GetHeadPosition();
1252 while(p){ 1268 while(p){
1253 CString url = su.m_URLs.GetNext(p); 1269 CString url = su.m_URLs.GetNext(p);
1254 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString(url)); 1270 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString(url));
1255 } 1271 }
1256 } 1272 }
1257 return 0; 1273 return 0;
1258} 1274}
1259 1275
1276LRESULT CDipstickDlg::OnURLSPing(WPARAM wP,LPARAM lP)
1277{
1278CString *sel = (CString*)lP;
1279TRACE1("URLS: %s\n",(LPCTSTR)*sel);
1280CSelectURLsDlg su;
1281 su.m_bAdjust = m_bSmartAdjust;
1282 su.m_bAdjustInnermost = m_bAdjustInnermost;
1283 BeginWaitCursor();
1284 while(m_reURL.Match(*sel)){
1285 CString url = m_reURL.GetMatch(CRegEx::matchMatch);
1286 (*sel) = m_reURL.GetMatch(CRegEx::matchPostMatch);
1287 if(!su.m_URLs.Find(url))
1288 VERIFY(su.m_URLs.AddTail(url));
1289 }
1290 EndWaitCursor();
1291 delete sel;
1292 if(su.DoModal()==IDOK){
1293 POSITION p = su.m_URLs.GetHeadPosition();
1294 while(p){
1295 CString url = su.m_URLs.GetNext(p);
1296 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString(url));
1297 }
1298 }
1299 return 0;
1300}
1301
1260UINT CPingyHost::PingProc(LPVOID pParam) 1302UINT CPingyHost::PingProc(LPVOID pParam)
1261{ 1303{
1262CPingyHost* pThis = (CPingyHost*)pParam; 1304CPingyHost* pThis = (CPingyHost*)pParam;
1263 ASSERT(pThis->m_Daddy); 1305 ASSERT(pThis->m_Daddy);
1264 return pThis->DoPing(); 1306 return pThis->DoPing();
1265} 1307}
1266 1308
1267UINT CPingyHost::DoPing() 1309UINT CPingyHost::DoPing()
1268{ 1310{
1269CSingleLock slock(&m_mutex); 1311CSingleLock slock(&m_mutex);
1270 if(!slock.Lock(2000)){ 1312 if(!slock.Lock(2000)){
1271 m_Status.LoadString(IDS_PS_FAILEDTOLOCK); 1313 m_Status.LoadString(IDS_PS_FAILEDTOLOCK);
1272 return 1; 1314 return 1;
1273 } 1315 }
1274 m_Pinging = TRUE; 1316 m_Pinging = TRUE;
1275 m_bToPing = FALSE; 1317 m_bToPing = FALSE;
1276 VERIFY(m_Daddy->m_eveStartup.SetEvent()); 1318 VERIFY(m_Daddy->m_eveStartup.SetEvent());
1277 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this); 1319 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this);
1278in_addr ip; 1320in_addr ip;
1279UINT packets, lost; 1321UINT packets, lost;
1280 packets=lost=0; 1322 packets=lost=0;
1281CICMP* pICMP = NULL; 1323CICMP* pICMP = NULL;
1282UINT dataSize = m_Daddy->m_PingSize; 1324UINT dataSize = m_Daddy->m_PingSize;
1283 intploss = 100; 1325 intploss = 100;
1284 do{ 1326 do{
1285 if(m_HostName.IsEmpty()){ 1327 if(m_HostName.IsEmpty()){
1286 ip.s_addr = m_IP; 1328 ip.s_addr = m_IP;
1287 hostent *he = gethostbyaddr((char*)&ip,4,PF_INET); 1329 hostent *he = gethostbyaddr((char*)&ip,4,PF_INET);
1288 if(!he) 1330 if(!he)
1289 m_HostName.Empty(); 1331 m_HostName.Empty();
1290 else 1332 else
1291 m_HostName = he->h_name; 1333 m_HostName = he->h_name;
1292 }else{ 1334 }else{
1293 hostent *he = gethostbyname(m_HostName); 1335 hostent *he = gethostbyname(m_HostName);
1294 if(!he){ 1336 if(!he){
1295 m_Status.LoadString(IDS_PS_FAILEDTORESOLVE); 1337 m_Status.LoadString(IDS_PS_FAILEDTORESOLVE);
1296 m_IP = 0; 1338 m_IP = 0;
1297 break; 1339 break;
1298 } 1340 }
1299 memmove(&ip.s_addr,he->h_addr,sizeof(ip.s_addr)); 1341 memmove(&ip.s_addr,he->h_addr,sizeof(ip.s_addr));
1300 m_IP = ip.s_addr; 1342 m_IP = ip.s_addr;
1301 } 1343 }
1302 pICMP = CICMP::CreateICMP(); 1344 pICMP = CICMP::CreateICMP();
1303 if(!(pICMP && pICMP->Initialize())){ 1345 if(!(pICMP && pICMP->Initialize())){
1304 m_Status.LoadString(IDS_PS_UNABLETOICMP); 1346 m_Status.LoadString(IDS_PS_UNABLETOICMP);
1305 break; 1347 break;
1306 } 1348 }
1307 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this); 1349 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this);
1308 ULONG sum, num, pmin, pmax; 1350 ULONG sum, num, pmin, pmax;
1309 sum = num = 0; 1351 sum = num = 0;
1310 pmin = 0xFFFFFFFF; 1352 pmin = 0xFFFFFFFF;
1311 pmax = 0; 1353 pmax = 0;
1312 UINT seq; 1354 UINT seq;
1313 for(seq = 0;seq<m_Daddy->m_PingsPerHost;seq++){ 1355 for(seq = 0;seq<m_Daddy->m_PingsPerHost;seq++){
1314 INT status; 1356 INT status;
1315 LONG rtt = pICMP->Ping(ip,dataSize,m_Daddy->m_TimeOut,&status); 1357 LONG rtt = pICMP->Ping(ip,dataSize,m_Daddy->m_TimeOut,&status);
1316 UINT stString = 0; 1358 UINT stString = 0;
1317 switch(status){ 1359 switch(status){
1318 case CICMP::ipSuccess: 1360 case CICMP::ipSuccess:
1319 sum+=rtt; num++; 1361 sum+=rtt; num++;
1320 if(rtt<pmin) 1362 if(rtt<pmin)
1321 pmin=rtt; 1363 pmin=rtt;
1322 if(rtt>pmax) 1364 if(rtt>pmax)
1323 pmax=rtt; 1365 pmax=rtt;
1324 break; 1366 break;
1325 case CICMP::ipBuffTooSmall: stString = IDS_PS_INTERNALERROR; 1367 case CICMP::ipBuffTooSmall: stString = IDS_PS_INTERNALERROR;
1326 break; 1368 break;
1327 case CICMP::ipDestNetUnreachable: stString = IDS_PS_NETUNREACHABLE; 1369 case CICMP::ipDestNetUnreachable: stString = IDS_PS_NETUNREACHABLE;
1328 break; 1370 break;
1329 case CICMP::ipDestHostUnreachable: stString = IDS_PS_HOSTUNREACHABLE; 1371 case CICMP::ipDestHostUnreachable: stString = IDS_PS_HOSTUNREACHABLE;
1330 break; 1372 break;
1331 case CICMP::ipDestProtUnreachable: stString = IDS_PS_PROTUNREACHABLE; 1373 case CICMP::ipDestProtUnreachable: stString = IDS_PS_PROTUNREACHABLE;
1332 break; 1374 break;
1333 case CICMP::ipDestPortUnreachable: stString = IDS_PS_PORTUNREACHABLE; 1375 case CICMP::ipDestPortUnreachable: stString = IDS_PS_PORTUNREACHABLE;
1334 break; 1376 break;
1335 case CICMP::ipNoResources: stString = IDS_PS_NORESOURCES; 1377 case CICMP::ipNoResources: stString = IDS_PS_NORESOURCES;
1336 break; 1378 break;
1337 case CICMP::ipBadOption: stString = IDS_PS_INTERNALERROR; 1379 case CICMP::ipBadOption: stString = IDS_PS_INTERNALERROR;
1338 break; 1380 break;
1339 case CICMP::ipHWError: stString = IDS_PS_HWERROR; 1381 case CICMP::ipHWError: stString = IDS_PS_HWERROR;
1340 break; 1382 break;
1341 case CICMP::ipPacketTooBig: stString = IDS_PS_BIGPACKET; 1383 case CICMP::ipPacketTooBig: stString = IDS_PS_BIGPACKET;
1342 break; 1384 break;
1343 case CICMP::ipTimeOut: stString = IDS_PS_TIMEOUT; 1385 case CICMP::ipTimeOut: stString = IDS_PS_TIMEOUT;
1344 break; 1386 break;
1345 case CICMP::ipBadRequest: stString = IDS_PS_INTERNALERROR; 1387 case CICMP::ipBadRequest: stString = IDS_PS_INTERNALERROR;
1346 break; 1388 break;
1347 case CICMP::ipBadRoute: stString = IDS_PS_BADROUTE; 1389 case CICMP::ipBadRoute: stString = IDS_PS_BADROUTE;
1348 break; 1390 break;
1349 case CICMP::ipTTLExpiredInTransit: stString = IDS_PS_TTLEXPTRANSIT; 1391 case CICMP::ipTTLExpiredInTransit: stString = IDS_PS_TTLEXPTRANSIT;
1350 break; 1392 break;
1351 case CICMP::ipTTLExpiredInReasm: stString = IDS_PS_TTLEXPREASM; 1393 case CICMP::ipTTLExpiredInReasm: stString = IDS_PS_TTLEXPREASM;
1352 break; 1394 break;
1353 case CICMP::ipParamProblem: stString = IDS_PS_IPARAMP; 1395 case CICMP::ipParamProblem: stString = IDS_PS_IPARAMP;
1354 break; 1396 break;
1355 case CICMP::ipSourceQuench: stString = IDS_PS_SOURCEQUENCH; 1397 case CICMP::ipSourceQuench: stString = IDS_PS_SOURCEQUENCH;
1356 break; 1398 break;
1357 case CICMP::ipOptionTooBig: stString = IDS_PS_BIGOPTION; 1399 case CICMP::ipOptionTooBig: stString = IDS_PS_BIGOPTION;
1358 break; 1400 break;
1359 case CICMP::ipBadDest: stString = IDS_PS_BADDEST; 1401 case CICMP::ipBadDest: stString = IDS_PS_BADDEST;
1360 break; 1402 break;
1361 default: 1403 default:
1362 stString = IDS_PS_UNKNOWNERROR; 1404 stString = IDS_PS_UNKNOWNERROR;
1363 break; 1405 break;
1364 } 1406 }
1365 if(stString) 1407 if(stString)
1366 m_Status.LoadString(stString); 1408 m_Status.LoadString(stString);
1367 packets++; 1409 packets++;
1368 if(rtt<0) 1410 if(rtt<0)
1369 lost++; 1411 lost++;
1370 Sleep(m_Daddy->m_Interval); 1412 Sleep(m_Daddy->m_Interval);
1371 } 1413 }
1372 if(packets==lost || !packets){ 1414 if(packets==lost || !packets){
1373 ploss=100; 1415 ploss=100;
1374 }else{ 1416 }else{
1375 ploss = lost*100/packets; 1417 ploss = lost*100/packets;
1376 m_MinRTT = pmin; 1418 m_MinRTT = pmin;
1377 m_MaxRTT = pmax; 1419 m_MaxRTT = pmax;
1378 if(sum){ 1420 if(sum){
1379 ASSERT(num); 1421 ASSERT(num);
1380 m_AvgRTT = sum/num; 1422 m_AvgRTT = sum/num;
1381 }else{ 1423 }else{
1382 m_AvgRTT = 0; 1424 m_AvgRTT = 0;
1383 } 1425 }
1384 } 1426 }
1385 }while(FALSE); 1427 }while(FALSE);
1386 m_Packetloss=ploss; 1428 m_Packetloss=ploss;
1387 m_Pinged=TRUE; 1429 m_Pinged=TRUE;
1388 m_Pinging=FALSE; 1430 m_Pinging=FALSE;
1389 if(pICMP){ 1431 if(pICMP){
1390 pICMP->Deinitialize(); 1432 pICMP->Deinitialize();
1391 delete pICMP; 1433 delete pICMP;
1392 } 1434 }
1393 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this); 1435 m_Daddy->PostMessage(WM_DNP_UPDATEHOSTDATA,0,(LPARAM)this);
1394 m_Daddy->PostMessage(WM_DNP_ACTIVITYCOUNT,(WPARAM)-1); 1436 m_Daddy->PostMessage(WM_DNP_ACTIVITYCOUNT,(WPARAM)-1);
1395 return 0; 1437 return 0;
1396} 1438}
1397 1439
1398void CPingyHost::Ping() 1440void CPingyHost::Ping()
1399{ 1441{
1400 ASSERT(m_Daddy); 1442 ASSERT(m_Daddy);
1401 m_Daddy->m_eveStartup.ResetEvent(); 1443 m_Daddy->m_eveStartup.ResetEvent();
1402 if(!AfxBeginThread(CPingyHost::PingProc,this)){ 1444 if(!AfxBeginThread(CPingyHost::PingProc,this)){
1403 ASSERT(FALSE); 1445 ASSERT(FALSE);
1404 }else{ 1446 }else{
1405 CSingleLock sl(&m_Daddy->m_eveStartup); 1447 CSingleLock sl(&m_Daddy->m_eveStartup);
1406 sl.Lock(); 1448 sl.Lock();
1407 m_Daddy->SendMessage(WM_DNP_ACTIVITYCOUNT,(WPARAM)1);// *** AWFUL! Shouldn't be here! 1449 m_Daddy->SendMessage(WM_DNP_ACTIVITYCOUNT,(WPARAM)1);// *** AWFUL! Shouldn't be here!
1408 } 1450 }
1409} 1451}
1410 1452
1411void CDipstickDlg::OnHostlistCopyurl() 1453void CDipstickDlg::OnHostlistCopyurl()
1412{ 1454{
1413 if(m_HostList.GetSelectedCount()!=1) 1455 if(m_HostList.GetSelectedCount()!=1)
1414 return; 1456 return;
1415int items = m_HostList.GetItemCount(); 1457int items = m_HostList.GetItemCount();
1416 for(int tmp=0;tmp<items;tmp++){ 1458 for(int tmp=0;tmp<items;tmp++){
1417 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED) 1459 if((m_HostList.GetItemState(tmp,LVIS_SELECTED|LVIS_FOCUSED))&LVIS_SELECTED)
1418 break; 1460 break;
1419 } 1461 }
1420 ASSERT(tmp<items); 1462 ASSERT(tmp<items);
1421CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp); 1463CPingyHost *host = (CPingyHost*)m_HostList.GetItemData(tmp);
1422 ASSERT(host); 1464 ASSERT(host);
1423 if(!host->m_URL.IsEmpty()){ 1465 if(!host->m_URL.IsEmpty()){
1424 CURLSource *us = new CURLSource(host->m_URL); 1466 CURLSource *us = new CURLSource(host->m_URL);
1425 us->SetClipboard(); 1467 us->SetClipboard();
1426 us->FlushClipboard(); 1468 us->FlushClipboard();
1427 } 1469 }
1428} 1470}
1429 1471
1430BOOL CDipstickDlg::OnHelpInfo(HELPINFO* pHelpInfo) 1472BOOL CDipstickDlg::OnHelpInfo(HELPINFO* pHelpInfo)
1431{ 1473{
1432 WinHelp(IDD|0x20000l); 1474 WinHelp(IDD|0x20000l);
1433 return TRUE; 1475 return TRUE;
1434} 1476}
1435 1477
1436void CDipstickDlg::OnDropFiles(HDROP hDropInfo) 1478void CDipstickDlg::OnDropFiles(HDROP hDropInfo)
1437{ 1479{
1438 // *** Import only 1st file, but maybe we should fall into prompt mode if multiple files are dropped. 1480 // *** Import only 1st file, but maybe we should fall into prompt mode if multiple files are dropped.
1439CString fileName; 1481CString fileName;
1440int bufferSize = DragQueryFile(hDropInfo,0,NULL,0); 1482int bufferSize = DragQueryFile(hDropInfo,0,NULL,0);
1441 DragQueryFile(hDropInfo,0,fileName.GetBuffer(bufferSize+2),bufferSize+1); 1483 DragQueryFile(hDropInfo,0,fileName.GetBuffer(bufferSize+2),bufferSize+1);
1442 fileName.ReleaseBuffer(); 1484 fileName.ReleaseBuffer();
1443 if(fileName.IsEmpty()) 1485 if(fileName.IsEmpty())
1444 CDialog::OnDropFiles(hDropInfo); 1486 CDialog::OnDropFiles(hDropInfo);
1445 else 1487 else
1446 ImportLocations(fileName); 1488 ImportLocations(fileName);
1447} 1489}
1448 1490
1449BOOL CDipstickDlg::ImportLocations(LPCTSTR file) 1491BOOL CDipstickDlg::ImportLocations(LPCTSTR file)
1450{ 1492{
1451CString fileLine; 1493CString fileLine;
1452CString q; 1494CString q;
1453 try{ 1495 try{
1454 CStdioFile f(file,CFile::modeRead|CFile::typeText|CFile::shareDenyWrite); 1496 CStdioFile f(file,CFile::modeRead|CFile::typeText|CFile::shareDenyWrite);
1455 // *** Cleanup locations.. 1497 // *** Cleanup locations..
1456 while(f.ReadString(fileLine)){ 1498 while(f.ReadString(fileLine)){
1457 if(fileLine.IsEmpty()) 1499 if(fileLine.IsEmpty())
1458 continue; 1500 continue;
1459 if(fileLine[0]=='\"' || fileLine[0]=='\''){ 1501 if(fileLine[0]=='\"' || fileLine[0]=='\''){
1460 TCHAR q = fileLine[0]; 1502 TCHAR q = fileLine[0];
1461 fileLine=fileLine.Mid(1); 1503 fileLine=fileLine.Mid(1);
1462 for(int tmp=0;tmp<fileLine.GetLength();tmp++){ 1504 for(int tmp=0;tmp<fileLine.GetLength();tmp++){
1463 if(fileLine[tmp]!=q) 1505 if(fileLine[tmp]!=q)
1464 continue; 1506 continue;
1465 if(!tmp){ 1507 if(!tmp){
1466 fileLine.Empty(); 1508 fileLine.Empty();
1467 break; 1509 break;
1468 } 1510 }
1469 fileLine=fileLine.Left(tmp); 1511 fileLine=fileLine.Left(tmp);
1470 break; 1512 break;
1471 } 1513 }
1472 }else{ 1514 }else{
1473 int co = fileLine.Find(','); 1515 int co = fileLine.Find(',');
1474 if(co>=0) 1516 if(co>=0)
1475 fileLine=fileLine.Left(co); 1517 fileLine=fileLine.Left(co);
1476 } 1518 }
1477 if(fileLine.IsEmpty()) 1519 if(fileLine.IsEmpty())
1478 continue; 1520 continue;
1479 if(!fileLine.CompareNoCase("url")) 1521 if(!fileLine.CompareNoCase("url"))
1480 continue; 1522 continue;
1481 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString(fileLine)); 1523 PostMessage(WM_DNP_URLPING,0,(LPARAM)new CString(fileLine));
1482 } 1524 }
1483 }catch(CException* e){ 1525 }catch(CException* e){
1484 e->Delete(); 1526 e->Delete();
1485 TRACE0("Failed to import URLList file\n"); 1527 TRACE0("Failed to import URLList file\n");
1486 return FALSE; 1528 return FALSE;
1487 } 1529 }
1488 return TRUE; 1530 return TRUE;
1489} 1531}
1490 1532
1491void CDipstickDlg::OnAdvanced() 1533void CDipstickDlg::OnAdvanced()
1492{ 1534{
1493CRect rc; 1535CRect rc;
1494 m_AdvancedCtl.GetClientRect(rc); 1536 m_AdvancedCtl.GetClientRect(rc);
1495 m_AdvancedCtl.ClientToScreen(rc); 1537 m_AdvancedCtl.ClientToScreen(rc);
1496CMenu menus; 1538CMenu menus;
1497 VERIFY(menus.LoadMenu(IDR_MENU)); 1539 VERIFY(menus.LoadMenu(IDR_MENU));
1498CMenu *popUp = menus.GetSubMenu(2); 1540CMenu *popUp = menus.GetSubMenu(2);
1499 ASSERT(popUp); 1541 ASSERT(popUp);
1500 popUp->EnableMenuItem(ID_ADVANCED_EXPORTLIST,MF_BYCOMMAND|(m_HostList.GetItemCount()?MF_ENABLED:MF_GRAYED)); 1542 popUp->EnableMenuItem(ID_ADVANCED_EXPORTLIST,MF_BYCOMMAND|(m_HostList.GetItemCount()?MF_ENABLED:MF_GRAYED));
1501 popUp->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,(rc.left+rc.right)/2,rc.top,this); 1543 popUp->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,(rc.left+rc.right)/2,rc.top,this);
1502} 1544}
1503 1545
1504void CDipstickDlg::OnAdvancedExportlist() 1546void CDipstickDlg::OnAdvancedExportlist()
1505{ 1547{
1506CString filter; 1548CString filter;
1507 filter.LoadString(IDS_CSVFILTER); 1549 filter.LoadString(IDS_CSVFILTER);
1508CFileDialog cfd(FALSE,".csv",NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,filter,this); 1550CFileDialog cfd(FALSE,".csv",NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,filter,this);
1509 if(!m_impexPath.IsEmpty()) 1551 if(!m_impexPath.IsEmpty())
1510 SetCurrentDirectory(m_impexPath); 1552 SetCurrentDirectory(m_impexPath);
1511 if(cfd.DoModal()==IDOK){ 1553 if(cfd.DoModal()==IDOK){
1512 GetCurrentDirectory(2048,m_impexPath.GetBuffer(2048)); 1554 GetCurrentDirectory(2048,m_impexPath.GetBuffer(2048));
1513 m_impexPath.ReleaseBuffer(); 1555 m_impexPath.ReleaseBuffer();
1514 ExportLocations(cfd.GetPathName()); 1556 ExportLocations(cfd.GetPathName());
1515 } 1557 }
1516} 1558}
1517 1559
1518void CDipstickDlg::OnAdvancedImportlist() 1560void CDipstickDlg::OnAdvancedImportlist()
1519{ 1561{
1520CString filter; 1562CString filter;
1521 filter.LoadString(IDS_CSVFILTER); 1563 filter.LoadString(IDS_CSVFILTER);
1522CFileDialog cfd(TRUE,".csv",NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,filter,this); 1564CFileDialog cfd(TRUE,".csv",NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,filter,this);
1523 if(!m_impexPath.IsEmpty()) 1565 if(!m_impexPath.IsEmpty())
1524 SetCurrentDirectory(m_impexPath); 1566 SetCurrentDirectory(m_impexPath);
1525 if(cfd.DoModal()==IDOK){ 1567 if(cfd.DoModal()==IDOK){
1526 GetCurrentDirectory(2048,m_impexPath.GetBuffer(2048)); 1568 GetCurrentDirectory(2048,m_impexPath.GetBuffer(2048));
1527 m_impexPath.ReleaseBuffer(); 1569 m_impexPath.ReleaseBuffer();
1528 ImportLocations(cfd.GetPathName()); 1570 ImportLocations(cfd.GetPathName());
1529 } 1571 }
1530} 1572}
1531 1573
1532BOOL CDipstickDlg::ExportLocations(LPCTSTR file) 1574BOOL CDipstickDlg::ExportLocations(LPCTSTR file)
1533{ 1575{
1534 try{ 1576 try{
1535 CStdioFile f(file,CFile::modeCreate|CFile::modeWrite|CFile::typeText); 1577 CStdioFile f(file,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
1536 f.WriteString("URL,Host Name,IP Address, Min RTT,Avg RTT,Max RTT,Pktloss\n"); 1578 f.WriteString("URL,Host Name,IP Address, Min RTT,Avg RTT,Max RTT,Pktloss\n");
1537 POSITION p = m_Hosts.GetHeadPosition(); 1579 POSITION p = m_Hosts.GetHeadPosition();
1538 while(p){ 1580 while(p){
1539 CPingyHost *host = m_Hosts.GetNext(p); 1581 CPingyHost *host = m_Hosts.GetNext(p);
1540 ASSERT(host); 1582 ASSERT(host);
1541 CString ph; 1583 CString ph;
1542 ph.Format("\"%s\",%s,%s,%lu,%lu,%lu,%d%%\n",host->m_URL,host->m_HostName,inet_ntoa(*(in_addr*)&host->m_IP), 1584 ph.Format("\"%s\",%s,%s,%lu,%lu,%lu,%d%%\n",host->m_URL,host->m_HostName,inet_ntoa(*(in_addr*)&host->m_IP),
1543 host->m_MinRTT,host->m_AvgRTT,host->m_MaxRTT,host->m_Packetloss 1585 host->m_MinRTT,host->m_AvgRTT,host->m_MaxRTT,host->m_Packetloss
1544 ); 1586 );
1545 f.WriteString(ph); 1587 f.WriteString(ph);
1546 } 1588 }
1547 f.Close(); 1589 f.Close();
1548 }catch(CException* e){ 1590 }catch(CException* e){
1549 TRACE0("Failed to export URLList\n"); 1591 TRACE0("Failed to export URLList\n");
1550 e->Delete(); 1592 e->Delete();
1551 return FALSE; 1593 return FALSE;
1552 } 1594 }
1553 return TRUE; 1595 return TRUE;
1554} 1596}
1555 1597
1556void CDipstickDlg::OnDragpadAdvancedExportlist() 1598void CDipstickDlg::OnDragpadAdvancedExportlist()
1557{ 1599{
1558 OnAdvancedExportlist(); 1600 OnAdvancedExportlist();
1559} 1601}
1560 1602
1561void CDipstickDlg::OnDragpadAdvancedImportlist() 1603void CDipstickDlg::OnDragpadAdvancedImportlist()
1562{ 1604{
1563 OnAdvancedImportlist(); 1605 OnAdvancedImportlist();
1564} 1606}
1565 1607
1566void CPingyHost::Suicide() 1608void CPingyHost::Suicide()
1567{ 1609{
1568CSingleLock sl(&m_mutex); 1610CSingleLock sl(&m_mutex);
1569 if(sl.Lock(10)){ 1611 if(sl.Lock(10)){
1570 sl.Unlock(); 1612 sl.Unlock();
1571 delete this; 1613 delete this;
1572 }else{ 1614 }else{
1573 if(!AfxBeginThread(CPingyHost::SuicideProc,this)) 1615 if(!AfxBeginThread(CPingyHost::SuicideProc,this))
1574 ASSERT(FALSE); 1616 ASSERT(FALSE);
1575 } 1617 }
1576} 1618}
1577 1619
1578UINT CPingyHost::SuicideProc(LPVOID pParam) 1620UINT CPingyHost::SuicideProc(LPVOID pParam)
1579{ 1621{
1580CPingyHost* pThis = (CPingyHost*)pParam; 1622CPingyHost* pThis = (CPingyHost*)pParam;
1581CSingleLock sl(&pThis->m_mutex); 1623CSingleLock sl(&pThis->m_mutex);
1582 sl.Lock(); 1624 sl.Lock();
1583 VERIFY(sl.Unlock()); 1625 VERIFY(sl.Unlock());
1584 delete pThis; 1626 delete pThis;
1585 return 0; 1627 return 0;
1586} 1628} \ No newline at end of file