blob: 11f24a0f4d37ab7ef67690d5c3fbebea71dd3e8b [file] [log] [blame]
Dennis Syrovatsky139d7832005-11-02 05:36:05 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 *
18 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
19 *
20 */
21
22// -=- FTDialog.cxx
23
24#include <vncviewer/FTDialog.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
Dennis Syrovatsky092d9982005-12-05 09:57:05 +000029const char FTDialog::szCheckDeleteQueueText[] = "TightVNC.Viewer.CheckDeleteQueue.Msg";
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000030const char FTDialog::szCheckTransferQueueText[] = "TightVNC.Viewer.CheckTransferQueue.Msg";
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000031const char FTDialog::szUploadFilePortionText[] = "TightVNC.Viewer.UploadFilePortion.Msg";
32
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000033FTDialog::FTDialog(HINSTANCE hInst, FileTransfer *pFT)
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000034{
35 m_pFileTransfer = pFT;
36 m_hInstance = hInst;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +000037
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000038 m_bDlgShown = false;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +000039 m_bCloseDlgAfterCancel = false;
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000040
41 m_pLocalLV = NULL;
42 m_pRemoteLV = NULL;
43 m_pProgress = NULL;
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +000044 m_pCancelingDlg = NULL;
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000045
Dennis Syrovatskyec906992005-11-07 09:56:06 +000046 m_hwndFTDialog = NULL;
Dennis Syrovatskyb595e032005-11-09 06:24:25 +000047 m_hwndLocalPath = NULL;
48 m_hwndRemotePath = NULL;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000049
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +000050 m_FTMenuSource = 0;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +000051 m_dwNumStatusStrings = 0;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +000052
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000053 m_szLocalPath[0] = '\0';
54 m_szRemotePath[0] = '\0';
55 m_szLocalPathTmp[0] = '\0';
56 m_szRemotePathTmp[0] = '\0';
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000057}
58
59FTDialog::~FTDialog()
60{
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000061 destroyFTDialog();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000062}
63
64bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000065FTDialog::createFTDialog(HWND hwndParent)
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000066{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000067 if (m_hwndFTDialog != NULL) {
68 ShowWindow(m_hwndFTDialog, SW_SHOW);
69 m_bDlgShown = true;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +000070 showLocalLVItems();
71 showRemoteLVItems();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000072 return true;
73 }
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000074
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000075 if (!initFTWndMsgs()) return false;
76
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000077 m_hwndFTDialog = CreateDialogParam(m_hInstance,
78 MAKEINTRESOURCE(IDD_FILETRANSFER_DLG),
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000079 hwndParent,
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000080 (DLGPROC) FTDialogProc,
81 (LONG) this);
82
83 if (m_hwndFTDialog == NULL) return false;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000084
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +000085 HWND hwndLocalList = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALLIST);
86 HWND hwndRemoteList = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTELIST);
87
88 if ((hwndLocalList == NULL) || (hwndRemoteList == NULL)) {
89 destroyFTDialog();
90 return false;
91 }
92
93 m_pLocalLV = new FTListView(hwndLocalList);
94 m_pRemoteLV = new FTListView(hwndRemoteList);
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000095
96 m_pProgress = new FTProgress(m_hwndFTDialog);
97
98 if ((m_pLocalLV == NULL) || (m_pRemoteLV == NULL) || (m_pProgress == NULL)) {
99 destroyFTDialog();
100 return false;
101 }
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +0000102
103 initFTDialog();
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000104
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000105 ShowWindow(m_hwndFTDialog, SW_SHOW);
106 UpdateWindow(m_hwndFTDialog);
107 m_bDlgShown = true;
108 return true;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000109}
110
111bool
112FTDialog::initFTDialog()
113{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +0000114 m_pLocalLV->initialize(m_hInstance);
115 m_pRemoteLV->initialize(m_hInstance);
116
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000117 m_hwndLocalPath = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALPATH);
118 m_hwndRemotePath = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTEPATH);
119
120 setIcon(IDC_FTLOCALUP, IDI_FTUP);
121 setIcon(IDC_FTREMOTEUP, IDI_FTUP);
122 setIcon(IDC_FTLOCALRELOAD, IDI_FTRELOAD);
123 setIcon(IDC_FTREMOTERELOAD, IDI_FTRELOAD);
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000124
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000125 showLocalLVItems();
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000126 showRemoteLVItems();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000127
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +0000128 return true;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000129}
130
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000131bool
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000132FTDialog::initFTWndMsgs()
133{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000134 m_msgCheckDeleteQueue = RegisterWindowMessage(szCheckDeleteQueueText);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000135 m_msgCheckTransferQueue = RegisterWindowMessage(szCheckTransferQueueText);
136 m_msgUploadFilePortion = RegisterWindowMessage(szUploadFilePortionText);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000137
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000138 if ((m_msgCheckDeleteQueue) &&
139 (m_msgCheckTransferQueue) &&
140 (m_msgUploadFilePortion)) return true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000141
142 return false;
143}
144
145bool
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000146FTDialog::closeFTDialog()
147{
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000148 ShowWindow(m_hwndFTDialog, SW_HIDE);
149 m_bDlgShown = false;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000150 return true;
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000151}
152
153void
154FTDialog::destroyFTDialog()
155{
156 if (m_pLocalLV != NULL) {
157 delete m_pLocalLV;
158 m_pLocalLV = NULL;
159 }
160
161 if (m_pRemoteLV != NULL) {
162 delete m_pRemoteLV;
163 m_pRemoteLV = NULL;
164 }
165
166 if (m_pProgress != NULL) {
167 delete m_pProgress;
168 m_pProgress = NULL;
169 }
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000170
171 if (DestroyWindow(m_hwndFTDialog)) m_hwndFTDialog = NULL;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000172}
173
174BOOL CALLBACK
175FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
176{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000177 FTDialog *_this = (FTDialog *) GetWindowLong(hwnd, GWL_USERDATA);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000178
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000179 switch (uMsg)
180 {
181 case WM_INITDIALOG:
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000182 _this = (FTDialog*)lParam;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000183 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
184 SetForegroundWindow(hwnd);
185 return TRUE;
186 case WM_COMMAND:
187 {
188 switch (LOWORD(wParam))
189 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000190 case IDC_FTLOCALPATH:
191 switch (HIWORD (wParam))
192 {
193 case CBN_SETFOCUS:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000194 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000195 return FALSE;
196 }
197 break;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000198 case IDC_FTREMOTEPATH:
199 switch (HIWORD (wParam))
200 {
201 case CBN_SETFOCUS:
202 _this->setButtonsState();
203 return FALSE;
204 }
205 break;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000206 case IDC_FTCLOSE:
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000207 _this->onClose();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000208 return FALSE;
209 case IDC_FTLOCALUP:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000210 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000211 _this->onLocalOneUpFolder();
212 return FALSE;
213 case IDC_FTREMOTEUP:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000214 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000215 _this->onRemoteOneUpFolder();
216 return FALSE;
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000217 case IDC_FTLOCALRELOAD:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000218 _this->setButtonsState();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000219 _this->onLocalReload();
220 return FALSE;
221 case IDC_FTREMOTERELOAD:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000222 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000223 _this->onRemoteReload();
224 return FALSE;
225 case IDC_FTUPLOAD:
226 _this->onUpload();
227 return FALSE;
228 case IDC_FTDOWNLOAD:
229 _this->onDownload();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000230 return FALSE;
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000231 case IDC_FTCANCEL:
232 _this->onFTCancel();
233 return FALSE;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000234 case IDM_FTCOPY:
235 case IDM_FTRENAME:
236 case IDM_FTDELETE:
237 case IDM_FTCANCEL:
Dennis Syrovatsky05c424e2005-12-14 11:19:19 +0000238 case IDM_FTCREATEFOLDER:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000239 _this->onFTMenuCommand(LOWORD(wParam));
240 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000241 }
242 }
243 break;
244
245 case WM_NOTIFY:
246 switch (LOWORD(wParam))
247 {
248 case IDC_FTLOCALLIST:
249 switch (((LPNMHDR) lParam)->code)
250 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000251 case NM_CLICK:
252 case NM_SETFOCUS:
253 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000254 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000255 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000256 case LVN_GETDISPINFO:
257 _this->m_pLocalLV->onGetDispInfo((NMLVDISPINFO *) lParam);
258 return FALSE;
259 case LVN_ITEMACTIVATE:
260 _this->onLocalItemActivate((LPNMITEMACTIVATE) lParam);
261 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000262 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000263 _this->onLocalRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000264 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000265 }
266 break;
267 case IDC_FTREMOTELIST:
268 switch (((LPNMHDR) lParam)->code)
269 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000270 case NM_CLICK:
271 case NM_SETFOCUS:
272 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000273 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000274 case LVN_GETDISPINFO:
275 _this->m_pRemoteLV->onGetDispInfo((NMLVDISPINFO *) lParam);
276 return FALSE;
277 case LVN_ITEMACTIVATE:
278 _this->onRemoteItemActivate((LPNMITEMACTIVATE) lParam);
279 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000280 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000281 _this->onRemoteRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000282 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000283 }
284 break;
285 }
286 break;
287 case WM_CLOSE:
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000288 _this->onClose();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000289 return FALSE;
290 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000291
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000292 if (_this != NULL) {
293 if (uMsg == _this->m_msgCheckTransferQueue)
294 _this->m_pFileTransfer->checkTransferQueue();
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000295
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000296 if (uMsg == _this->m_msgUploadFilePortion)
297 _this->m_pFileTransfer->uploadFilePortion();
298
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000299 if (uMsg == _this->m_msgCheckDeleteQueue)
300 _this->m_pFileTransfer->checkDeleteQueue();
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000301 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000302
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000303 return FALSE;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000304}
305
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000306void
307FTDialog::onClose()
308{
309 if (m_pFileTransfer->isTransferEnable()) {
310 m_bCloseDlgAfterCancel = true;
311 onFTCancel();
312 } else {
313 closeFTDialog();
314 }
315}
316
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000317void
318FTDialog::onLocalItemActivate(LPNMITEMACTIVATE lpnmia)
319{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000320 if (strlen(m_szLocalPath) == 0) {
321 strcpy(m_szLocalPathTmp, m_pLocalLV->getActivateItemName(lpnmia));
322 } else {
323 sprintf(m_szLocalPathTmp, "%s\\%s", m_szLocalPath, m_pLocalLV->getActivateItemName(lpnmia));
324 }
325 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000326}
327
328void
329FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia)
330{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000331 if (strlen(m_szRemotePath) == 0) {
332 strcpy(m_szRemotePathTmp, m_pRemoteLV->getActivateItemName(lpnmia));
333 } else {
334 sprintf(m_szRemotePathTmp, "%s\\%s", m_szRemotePath, m_pRemoteLV->getActivateItemName(lpnmia));
335 }
336 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000337}
338
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000339void
340FTDialog::onLocalReload()
341{
342 strcpy(m_szLocalPathTmp, m_szLocalPath);
343 showLocalLVItems();
344}
345
346void
347FTDialog::onRemoteReload()
348{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000349 strcpy(m_szRemotePathTmp, m_szRemotePath);
350 showRemoteLVItems();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000351}
352
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000353void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000354FTDialog::showLocalLVItems()
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000355{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000356 FolderManager fm;
357 FileInfo fileInfo;
358 if (fm.getDirInfo(m_szLocalPathTmp, &fileInfo, 0)) {
359 fileInfo.sort();
360 m_pLocalLV->deleteAllItems();
361 m_pLocalLV->addItems(&fileInfo);
362 strcpy(m_szLocalPath, m_szLocalPathTmp);
363 SetWindowText(m_hwndLocalPath, m_szLocalPath);
364 }
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000365}
366
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000367void
368FTDialog::showRemoteLVItems()
369{
370 m_pFileTransfer->requestFileList(m_szRemotePathTmp, FT_FLR_DEST_MAIN, 0);
371}
372
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000373void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000374FTDialog::addRemoteLVItems(FileInfo *pFI)
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000375{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000376 pFI->sort();
377 m_pRemoteLV->deleteAllItems();
378 m_pRemoteLV->addItems(pFI);
379 strcpy(m_szRemotePath, m_szRemotePathTmp);
380 SetWindowText(m_hwndRemotePath, m_szRemotePath);
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +0000381 UpdateWindow(m_hwndFTDialog);
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000382}
383
384void
385FTDialog::onLocalOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000386{
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000387 strcpy(m_szLocalPathTmp, m_szLocalPath);
388 makeOneUpFolder(m_szLocalPathTmp);
389 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000390}
391
392void
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000393FTDialog::onRemoteOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000394{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000395 strcpy(m_szRemotePathTmp, m_szRemotePath);
396 makeOneUpFolder(m_szRemotePathTmp);
397 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000398}
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000399
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000400void
401FTDialog::reqFolderUnavailable()
402{
403 strcpy(m_szRemotePathTmp, m_szRemotePath);
404}
405
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000406int
407FTDialog::makeOneUpFolder(char *pPath)
408{
409 if (strcmp(pPath, "") == 0) return strlen(pPath);
410 for (int i=(strlen(pPath)-2); i>=0; i--) {
411 if (pPath[i] == '\\') {
412 pPath[i] = '\0';
413 break;
414 }
415 if (i == 0) pPath[0] = '\0';
416 }
417 return strlen(pPath);
418}
419
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000420void
421FTDialog::onUpload()
422{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000423 FileInfo fi;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000424 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
425 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_UPLOAD);
426 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000427 setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000428}
429
430void
431FTDialog::onDownload()
432{
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000433 FileInfo fi;
434 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
435 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_DOWNLOAD);
436 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000437 setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000438}
439
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000440void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000441FTDialog::onLocalRename()
442{
443 MessageBox(NULL, "onLocalRename", "FTDialog", MB_OK);
444
445}
446
447void
448FTDialog::onRemoteRename()
449{
450 MessageBox(NULL, "onRemoteRename", "FTDialog", MB_OK);
451
452}
453
454void
455FTDialog::onLocalDelete()
456{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000457 FileInfo fi;
458 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
459 m_pFileTransfer->addDeleteQueue(m_szLocalPath, &fi, FT_ATTR_DELETE_LOCAL);
460 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000461 setButtonsState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000462}
463
464void
465FTDialog::onRemoteDelete()
466{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000467 FileInfo fi;
468 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
469 m_pFileTransfer->addDeleteQueue(m_szRemotePath, &fi, FT_ATTR_DELETE_REMOTE);
470 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000471 setButtonsState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000472}
473
474void
Dennis Syrovatsky05c424e2005-12-14 11:19:19 +0000475FTDialog::onLocalCreateFolder()
476{
477
478}
479
480void
481FTDialog::onRemoteCreateFolder()
482{
483
484}
485
486void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000487FTDialog::onFTCancel()
488{
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000489 if (m_pCancelingDlg != NULL) return;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000490
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000491 m_pCancelingDlg = new CancelingDlg(this);
492
493 m_pCancelingDlg->create();
494}
495
496void
497FTDialog::cancelTransfer(bool bResult)
498{
499 if (m_pCancelingDlg != NULL) {
500 delete m_pCancelingDlg;
501 m_pCancelingDlg = NULL;
502 }
503
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000504 setButtonsState();
505
506 if ((m_bCloseDlgAfterCancel) && (bResult)) {
507 m_bCloseDlgAfterCancel = false;
508 closeFTDialog();
509 }
510
511 m_pFileTransfer->m_bCancel = bResult;
512}
513
514void
515FTDialog::afterCancelTransfer()
516{
517 if (m_pCancelingDlg != NULL) {
518 delete m_pCancelingDlg;
519 m_pCancelingDlg = NULL;
520 }
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000521}
522
523void
524FTDialog::onFTMenuCommand(int command)
525{
526 switch (command)
527 {
528 case IDM_FTCOPY:
529 {
530 switch (m_FTMenuSource)
531 {
532 case IDC_FTLOCALLIST: onUpload(); break;
533 case IDC_FTREMOTELIST: onDownload(); break;
534 default: break;
535 }
536 }
537 break;
538 case IDM_FTRENAME:
539 {
540 switch (m_FTMenuSource)
541 {
542 case IDC_FTLOCALLIST: onLocalRename(); break;
543 case IDC_FTREMOTELIST: onRemoteRename(); break;
544 default: break;
545 }
546 }
547 break;
548 case IDM_FTDELETE:
549 {
550 switch (m_FTMenuSource)
551 {
552 case IDC_FTLOCALLIST: onLocalDelete(); break;
553 case IDC_FTREMOTELIST: onRemoteDelete(); break;
554 default: break;
555 }
556 }
557 break;
558 case IDM_FTCANCEL: onFTCancel(); break;
Dennis Syrovatsky05c424e2005-12-14 11:19:19 +0000559 case IDM_FTCREATEFOLDER:
560 {
561 switch (m_FTMenuSource)
562 {
563 case IDC_FTLOCALLIST: onLocalCreateFolder(); break;
564 case IDC_FTREMOTELIST: onRemoteCreateFolder(); break;
565 default: break;
566 }
567 }
568 break;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000569 default:
570 break;
571 }
572}
573
574void
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000575FTDialog::onLocalRButton()
576{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000577 refreshBtnState();
578 m_FTMenuSource = IDC_FTLOCALLIST;
579 showFTMenu(m_BtnState.uploadBtn, m_BtnState.createLocalFldBtn,
580 m_BtnState.renameLocalBtn, m_BtnState.deleteLocalBtn,
581 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000582}
583
584void
585FTDialog::onRemoteRButton()
586{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000587 refreshBtnState();
588 m_FTMenuSource = IDC_FTREMOTELIST;
589 showFTMenu(m_BtnState.downloadBtn, m_BtnState.createRemoteFldBtn,
590 m_BtnState.renameRemoteBtn, m_BtnState.deleteRemoteBtn,
591 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000592}
593
594void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000595FTDialog::showFTMenu(bool copyBtnState, bool createFldBtnState, bool renameBtnState,
596 bool deleteBtnState, bool cancelBtnState)
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000597{
598 HMENU hMenu = LoadMenu(m_hInstance, MAKEINTRESOURCE(IDR_FTMENU));
599 HMENU hFTMenu = GetSubMenu(hMenu, 0);
600
601 SetMenuDefaultItem(hFTMenu, IDM_FTCOPY, FALSE);
602
603 SetForegroundWindow(m_hwndFTDialog);
604
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000605 if (copyBtnState) {
606 EnableMenuItem(hMenu, IDM_FTCOPY, MF_ENABLED);
607 } else {
608 EnableMenuItem(hMenu, IDM_FTCOPY, MF_DISABLED | MF_GRAYED);
609 }
610 if (createFldBtnState) {
611 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_ENABLED);
612 } else {
613 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_DISABLED | MF_GRAYED);
614 }
615 if (renameBtnState) {
616 EnableMenuItem(hMenu, IDM_FTRENAME, MF_ENABLED);
617 } else {
618 EnableMenuItem(hMenu, IDM_FTRENAME, MF_DISABLED | MF_GRAYED);
619 }
620 if (deleteBtnState) {
621 EnableMenuItem(hMenu, IDM_FTDELETE, MF_ENABLED);
622 } else {
623 EnableMenuItem(hMenu, IDM_FTDELETE, MF_DISABLED | MF_GRAYED);
624 }
625 if (cancelBtnState) {
626 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_ENABLED);
627 } else {
628 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_DISABLED | MF_GRAYED);
629 }
630 DrawMenuBar(m_hwndFTDialog);
631
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000632 POINT cursorPosition;
633 GetCursorPos(&cursorPosition);
634 TrackPopupMenu(hFTMenu, 0, cursorPosition.x, cursorPosition.y, 0, m_hwndFTDialog, 0);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000635 DestroyMenu(hFTMenu);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000636}
637
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000638void
639FTDialog::setIcon(int dest, int idIcon)
640{
641 HANDLE hIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(idIcon), IMAGE_ICON, 16, 16, LR_SHARED);
642 SendMessage(GetDlgItem(m_hwndFTDialog, dest), BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIcon);
643 DestroyIcon((HICON) hIcon);
644}
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000645
646void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000647FTDialog::refreshBtnState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000648{
649 if (!m_bDlgShown) return;
650
651 int locPathLen = strlen(m_szLocalPath);
652 int remPathLen = strlen(m_szRemotePath);
653
654 if (GetFocus() == m_pLocalLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000655 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000656 if (strlen(m_szLocalPath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000657 m_BtnState.createLocalFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000658 int nCount = ListView_GetSelectedCount(m_pLocalLV->getWndHandle());
659 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000660 m_BtnState.uploadBtn = false;
661 m_BtnState.deleteLocalBtn = false;
662 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000663 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000664 m_BtnState.deleteLocalBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000665 if (remPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000666 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000667 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000668 m_BtnState.uploadBtn = true;
669 }
670 if (nCount == 1) {
671 m_BtnState.renameLocalBtn = true;
672 } else {
673 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000674 }
675 }
676 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000677 m_BtnState.uploadBtn = false;
678 m_BtnState.createLocalFldBtn = false;
679 m_BtnState.deleteLocalBtn = false;
680 m_BtnState.renameLocalBtn = false;
681 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000682 }
683 } else {
684 if (GetFocus() == m_pRemoteLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000685 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000686 if (strlen(m_szRemotePath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000687 m_BtnState.createRemoteFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000688 int nCount = ListView_GetSelectedCount(m_pRemoteLV->getWndHandle());
689 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000690 m_BtnState.downloadBtn = false;
691 m_BtnState.deleteRemoteBtn = false;
692 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000693 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000694 m_BtnState.deleteRemoteBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000695 if (locPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000696 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000697 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000698 m_BtnState.downloadBtn = true;
699 }
700 if (nCount == 1) {
701 m_BtnState.renameRemoteBtn = true;
702 } else {
703 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000704 }
705 }
706 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000707 m_BtnState.downloadBtn = false;
708 m_BtnState.createRemoteFldBtn = false;
709 m_BtnState.deleteRemoteBtn = false;
710 m_BtnState.renameRemoteBtn = false;
711 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000712 }
713 } else {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000714 }
715 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000716 if (m_pFileTransfer->isTransferEnable())
717 m_BtnState.cancelBtn = true;
718 else
719 m_BtnState.cancelBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000720}
721
722void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000723FTDialog::setButtonsState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000724{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000725 refreshBtnState();
726
727 switch (m_BtnState.uploadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000728 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000729 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), FALSE); break;
730 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000731 }
732
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000733 switch (m_BtnState.downloadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000734 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000735 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), FALSE); break;
736 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000737 }
738
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000739 switch (m_BtnState.cancelBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000740 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000741 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break;
742 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000743 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000744
745 UpdateWindow(m_hwndFTDialog);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000746}
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000747
748void
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000749FTDialog::setStatusText(LPCSTR format,...)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000750{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000751 char text[1024];
752 va_list args;
753 va_start(args, format);
754 int nSize = _vsnprintf(text, sizeof(text), format, args);
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000755
756 HWND hStatusBox = GetDlgItem(m_hwndFTDialog, IDC_FTSTATUS);
757
758 LRESULT lRes = SendMessage(hStatusBox, (UINT) CB_INSERTSTRING, (WPARAM) 0, (LPARAM) text);
759 if ((lRes != CB_ERR) && (lRes != CB_ERRSPACE)) {
760 lRes = SendMessage(hStatusBox, (UINT) CB_SETCURSEL, (WPARAM) lRes, (LPARAM) 0);
761 }
762
763 m_dwNumStatusStrings++;
764 if (m_dwNumStatusStrings > FT_MAX_STATUS_STRINGS) {
765 int numItems = SendMessage(hStatusBox, (UINT) CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
766 if (numItems != CB_ERR) {
767 m_dwNumStatusStrings--;
768 SendMessage(hStatusBox, (UINT) CB_DELETESTRING, (WPARAM) numItems - 1, (LPARAM) 0);
769 }
770 }
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000771}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000772
773void
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000774FTDialog::processDlgMsgs()
775{
776 MSG msg;
777 while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) {
778 TranslateMessage(&msg);
779 DispatchMessage(&msg);
780 }
781}
782
783void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000784FTDialog::postCheckTransferQueueMsg()
785{
786 PostMessage(m_hwndFTDialog, m_msgCheckTransferQueue, 0, 0);
787}
788
789void
790FTDialog::postUploadFilePortionMsg()
791{
792 PostMessage(m_hwndFTDialog, m_msgUploadFilePortion, 0, 0);
793}
794
795void
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000796FTDialog::postCheckDeleteQueueMsg()
797{
798 PostMessage(m_hwndFTDialog, m_msgCheckDeleteQueue, 0, 0);
799}
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000800
801FTDialog::CancelingDlg::CancelingDlg(FTDialog *pFTDlg)
802{
803 m_pFTDlg = pFTDlg;
804 m_hwndDlg = NULL;
805}
806
807FTDialog::CancelingDlg::~CancelingDlg()
808{
809 destroy();
810}
811
812bool
813FTDialog::CancelingDlg::create()
814{
815 if (m_hwndDlg != NULL) return false;
816
817 m_hwndDlg = CreateDialogParam(GetModuleHandle(0),
818 MAKEINTRESOURCE(IDD_FTCANCELING),
819 NULL,
820 (DLGPROC) cancelingDlgProc,
821 (LONG) this);
822
823 if (m_hwndDlg == NULL) return false;
824
825 ShowWindow(m_hwndDlg, SW_SHOW);
826 DrawIcon(GetDC(m_hwndDlg), 15, 22, LoadIcon(NULL, IDI_QUESTION));
827 UpdateWindow(m_hwndDlg);
828
829 return true;
830}
831
832bool
833FTDialog::CancelingDlg::destroy()
834{
835 if (m_hwndDlg == NULL) return true;
836
837 if (DestroyWindow(m_hwndDlg)) {
838 m_hwndDlg = NULL;
839 return true;
840 } else {
841 return false;
842 }
843}
844
845bool
846FTDialog::CancelingDlg::close(bool bResult)
847{
848 if (m_hwndDlg == NULL) return true;
849
850 destroy();
851
852 m_pFTDlg->cancelTransfer(bResult);
853
854 return false;
855}
856
857BOOL CALLBACK
858FTDialog::CancelingDlg::cancelingDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
859{
860 FTDialog::CancelingDlg *_this = (FTDialog::CancelingDlg *) GetWindowLong(hwnd, GWL_USERDATA);
861 switch (uMsg)
862 {
863 case WM_INITDIALOG:
864 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
865 SetForegroundWindow(hwnd);
866 return TRUE;
867
868 case WM_COMMAND:
869 switch (LOWORD(wParam))
870 {
871 case IDOK:
872 _this->close(true);
873 return TRUE;
874 case IDCANCEL:
875 _this->close(false);
876 return TRUE;
877 }
878 break;
879 case WM_CLOSE:
880 _this->close(false);
881 return TRUE;
882 }
883 return FALSE;
884}