blob: a4fd9a684659557f1010d522f56875868a882c1c [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:
238 _this->onFTMenuCommand(LOWORD(wParam));
239 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000240 }
241 }
242 break;
243
244 case WM_NOTIFY:
245 switch (LOWORD(wParam))
246 {
247 case IDC_FTLOCALLIST:
248 switch (((LPNMHDR) lParam)->code)
249 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000250 case NM_CLICK:
251 case NM_SETFOCUS:
252 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000253 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000254 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000255 case LVN_GETDISPINFO:
256 _this->m_pLocalLV->onGetDispInfo((NMLVDISPINFO *) lParam);
257 return FALSE;
258 case LVN_ITEMACTIVATE:
259 _this->onLocalItemActivate((LPNMITEMACTIVATE) lParam);
260 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000261 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000262 _this->onLocalRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000263 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000264 }
265 break;
266 case IDC_FTREMOTELIST:
267 switch (((LPNMHDR) lParam)->code)
268 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000269 case NM_CLICK:
270 case NM_SETFOCUS:
271 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000272 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000273 case LVN_GETDISPINFO:
274 _this->m_pRemoteLV->onGetDispInfo((NMLVDISPINFO *) lParam);
275 return FALSE;
276 case LVN_ITEMACTIVATE:
277 _this->onRemoteItemActivate((LPNMITEMACTIVATE) lParam);
278 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000279 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000280 _this->onRemoteRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000281 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000282 }
283 break;
284 }
285 break;
286 case WM_CLOSE:
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000287 _this->onClose();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000288 return FALSE;
289 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000290
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000291 if (_this != NULL) {
292 if (uMsg == _this->m_msgCheckTransferQueue)
293 _this->m_pFileTransfer->checkTransferQueue();
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000294
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000295 if (uMsg == _this->m_msgUploadFilePortion)
296 _this->m_pFileTransfer->uploadFilePortion();
297
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000298 if (uMsg == _this->m_msgCheckDeleteQueue)
299 _this->m_pFileTransfer->checkDeleteQueue();
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000300 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000301
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000302 return FALSE;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000303}
304
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000305void
306FTDialog::onClose()
307{
308 if (m_pFileTransfer->isTransferEnable()) {
309 m_bCloseDlgAfterCancel = true;
310 onFTCancel();
311 } else {
312 closeFTDialog();
313 }
314}
315
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000316void
317FTDialog::onLocalItemActivate(LPNMITEMACTIVATE lpnmia)
318{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000319 if (strlen(m_szLocalPath) == 0) {
320 strcpy(m_szLocalPathTmp, m_pLocalLV->getActivateItemName(lpnmia));
321 } else {
322 sprintf(m_szLocalPathTmp, "%s\\%s", m_szLocalPath, m_pLocalLV->getActivateItemName(lpnmia));
323 }
324 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000325}
326
327void
328FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia)
329{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000330 if (strlen(m_szRemotePath) == 0) {
331 strcpy(m_szRemotePathTmp, m_pRemoteLV->getActivateItemName(lpnmia));
332 } else {
333 sprintf(m_szRemotePathTmp, "%s\\%s", m_szRemotePath, m_pRemoteLV->getActivateItemName(lpnmia));
334 }
335 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000336}
337
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000338void
339FTDialog::onLocalReload()
340{
341 strcpy(m_szLocalPathTmp, m_szLocalPath);
342 showLocalLVItems();
343}
344
345void
346FTDialog::onRemoteReload()
347{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000348 strcpy(m_szRemotePathTmp, m_szRemotePath);
349 showRemoteLVItems();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000350}
351
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000352void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000353FTDialog::showLocalLVItems()
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000354{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000355 FolderManager fm;
356 FileInfo fileInfo;
357 if (fm.getDirInfo(m_szLocalPathTmp, &fileInfo, 0)) {
358 fileInfo.sort();
359 m_pLocalLV->deleteAllItems();
360 m_pLocalLV->addItems(&fileInfo);
361 strcpy(m_szLocalPath, m_szLocalPathTmp);
362 SetWindowText(m_hwndLocalPath, m_szLocalPath);
363 }
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000364}
365
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000366void
367FTDialog::showRemoteLVItems()
368{
369 m_pFileTransfer->requestFileList(m_szRemotePathTmp, FT_FLR_DEST_MAIN, 0);
370}
371
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000372void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000373FTDialog::addRemoteLVItems(FileInfo *pFI)
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000374{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000375 pFI->sort();
376 m_pRemoteLV->deleteAllItems();
377 m_pRemoteLV->addItems(pFI);
378 strcpy(m_szRemotePath, m_szRemotePathTmp);
379 SetWindowText(m_hwndRemotePath, m_szRemotePath);
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +0000380 UpdateWindow(m_hwndFTDialog);
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000381}
382
383void
384FTDialog::onLocalOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000385{
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000386 strcpy(m_szLocalPathTmp, m_szLocalPath);
387 makeOneUpFolder(m_szLocalPathTmp);
388 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000389}
390
391void
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000392FTDialog::onRemoteOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000393{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000394 strcpy(m_szRemotePathTmp, m_szRemotePath);
395 makeOneUpFolder(m_szRemotePathTmp);
396 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000397}
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000398
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000399void
400FTDialog::reqFolderUnavailable()
401{
402 strcpy(m_szRemotePathTmp, m_szRemotePath);
403}
404
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000405int
406FTDialog::makeOneUpFolder(char *pPath)
407{
408 if (strcmp(pPath, "") == 0) return strlen(pPath);
409 for (int i=(strlen(pPath)-2); i>=0; i--) {
410 if (pPath[i] == '\\') {
411 pPath[i] = '\0';
412 break;
413 }
414 if (i == 0) pPath[0] = '\0';
415 }
416 return strlen(pPath);
417}
418
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000419void
420FTDialog::onUpload()
421{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000422 FileInfo fi;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000423 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
424 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_UPLOAD);
425 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000426 setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000427}
428
429void
430FTDialog::onDownload()
431{
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000432 FileInfo fi;
433 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
434 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_DOWNLOAD);
435 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000436 setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000437}
438
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000439void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000440FTDialog::onLocalRename()
441{
442 MessageBox(NULL, "onLocalRename", "FTDialog", MB_OK);
443
444}
445
446void
447FTDialog::onRemoteRename()
448{
449 MessageBox(NULL, "onRemoteRename", "FTDialog", MB_OK);
450
451}
452
453void
454FTDialog::onLocalDelete()
455{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000456 FileInfo fi;
457 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
458 m_pFileTransfer->addDeleteQueue(m_szLocalPath, &fi, FT_ATTR_DELETE_LOCAL);
459 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000460 setButtonsState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000461}
462
463void
464FTDialog::onRemoteDelete()
465{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000466 FileInfo fi;
467 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
468 m_pFileTransfer->addDeleteQueue(m_szRemotePath, &fi, FT_ATTR_DELETE_REMOTE);
469 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000470 setButtonsState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000471}
472
473void
474FTDialog::onFTCancel()
475{
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000476 if (m_pCancelingDlg != NULL) return;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000477
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000478 m_pCancelingDlg = new CancelingDlg(this);
479
480 m_pCancelingDlg->create();
481}
482
483void
484FTDialog::cancelTransfer(bool bResult)
485{
486 if (m_pCancelingDlg != NULL) {
487 delete m_pCancelingDlg;
488 m_pCancelingDlg = NULL;
489 }
490
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000491 setButtonsState();
492
493 if ((m_bCloseDlgAfterCancel) && (bResult)) {
494 m_bCloseDlgAfterCancel = false;
495 closeFTDialog();
496 }
497
498 m_pFileTransfer->m_bCancel = bResult;
499}
500
501void
502FTDialog::afterCancelTransfer()
503{
504 if (m_pCancelingDlg != NULL) {
505 delete m_pCancelingDlg;
506 m_pCancelingDlg = NULL;
507 }
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000508}
509
510void
511FTDialog::onFTMenuCommand(int command)
512{
513 switch (command)
514 {
515 case IDM_FTCOPY:
516 {
517 switch (m_FTMenuSource)
518 {
519 case IDC_FTLOCALLIST: onUpload(); break;
520 case IDC_FTREMOTELIST: onDownload(); break;
521 default: break;
522 }
523 }
524 break;
525 case IDM_FTRENAME:
526 {
527 switch (m_FTMenuSource)
528 {
529 case IDC_FTLOCALLIST: onLocalRename(); break;
530 case IDC_FTREMOTELIST: onRemoteRename(); break;
531 default: break;
532 }
533 }
534 break;
535 case IDM_FTDELETE:
536 {
537 switch (m_FTMenuSource)
538 {
539 case IDC_FTLOCALLIST: onLocalDelete(); break;
540 case IDC_FTREMOTELIST: onRemoteDelete(); break;
541 default: break;
542 }
543 }
544 break;
545 case IDM_FTCANCEL: onFTCancel(); break;
546 default:
547 break;
548 }
549}
550
551void
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000552FTDialog::onLocalRButton()
553{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000554 refreshBtnState();
555 m_FTMenuSource = IDC_FTLOCALLIST;
556 showFTMenu(m_BtnState.uploadBtn, m_BtnState.createLocalFldBtn,
557 m_BtnState.renameLocalBtn, m_BtnState.deleteLocalBtn,
558 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000559}
560
561void
562FTDialog::onRemoteRButton()
563{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000564 refreshBtnState();
565 m_FTMenuSource = IDC_FTREMOTELIST;
566 showFTMenu(m_BtnState.downloadBtn, m_BtnState.createRemoteFldBtn,
567 m_BtnState.renameRemoteBtn, m_BtnState.deleteRemoteBtn,
568 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000569}
570
571void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000572FTDialog::showFTMenu(bool copyBtnState, bool createFldBtnState, bool renameBtnState,
573 bool deleteBtnState, bool cancelBtnState)
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000574{
575 HMENU hMenu = LoadMenu(m_hInstance, MAKEINTRESOURCE(IDR_FTMENU));
576 HMENU hFTMenu = GetSubMenu(hMenu, 0);
577
578 SetMenuDefaultItem(hFTMenu, IDM_FTCOPY, FALSE);
579
580 SetForegroundWindow(m_hwndFTDialog);
581
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000582 if (copyBtnState) {
583 EnableMenuItem(hMenu, IDM_FTCOPY, MF_ENABLED);
584 } else {
585 EnableMenuItem(hMenu, IDM_FTCOPY, MF_DISABLED | MF_GRAYED);
586 }
587 if (createFldBtnState) {
588 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_ENABLED);
589 } else {
590 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_DISABLED | MF_GRAYED);
591 }
592 if (renameBtnState) {
593 EnableMenuItem(hMenu, IDM_FTRENAME, MF_ENABLED);
594 } else {
595 EnableMenuItem(hMenu, IDM_FTRENAME, MF_DISABLED | MF_GRAYED);
596 }
597 if (deleteBtnState) {
598 EnableMenuItem(hMenu, IDM_FTDELETE, MF_ENABLED);
599 } else {
600 EnableMenuItem(hMenu, IDM_FTDELETE, MF_DISABLED | MF_GRAYED);
601 }
602 if (cancelBtnState) {
603 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_ENABLED);
604 } else {
605 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_DISABLED | MF_GRAYED);
606 }
607 DrawMenuBar(m_hwndFTDialog);
608
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000609 POINT cursorPosition;
610 GetCursorPos(&cursorPosition);
611 TrackPopupMenu(hFTMenu, 0, cursorPosition.x, cursorPosition.y, 0, m_hwndFTDialog, 0);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000612 DestroyMenu(hFTMenu);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000613}
614
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000615void
616FTDialog::setIcon(int dest, int idIcon)
617{
618 HANDLE hIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(idIcon), IMAGE_ICON, 16, 16, LR_SHARED);
619 SendMessage(GetDlgItem(m_hwndFTDialog, dest), BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIcon);
620 DestroyIcon((HICON) hIcon);
621}
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000622
623void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000624FTDialog::refreshBtnState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000625{
626 if (!m_bDlgShown) return;
627
628 int locPathLen = strlen(m_szLocalPath);
629 int remPathLen = strlen(m_szRemotePath);
630
631 if (GetFocus() == m_pLocalLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000632 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000633 if (strlen(m_szLocalPath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000634 m_BtnState.createLocalFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000635 int nCount = ListView_GetSelectedCount(m_pLocalLV->getWndHandle());
636 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000637 m_BtnState.uploadBtn = false;
638 m_BtnState.deleteLocalBtn = false;
639 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000640 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000641 m_BtnState.deleteLocalBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000642 if (remPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000643 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000644 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000645 m_BtnState.uploadBtn = true;
646 }
647 if (nCount == 1) {
648 m_BtnState.renameLocalBtn = true;
649 } else {
650 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000651 }
652 }
653 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000654 m_BtnState.uploadBtn = false;
655 m_BtnState.createLocalFldBtn = false;
656 m_BtnState.deleteLocalBtn = false;
657 m_BtnState.renameLocalBtn = false;
658 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000659 }
660 } else {
661 if (GetFocus() == m_pRemoteLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000662 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000663 if (strlen(m_szRemotePath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000664 m_BtnState.createRemoteFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000665 int nCount = ListView_GetSelectedCount(m_pRemoteLV->getWndHandle());
666 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000667 m_BtnState.downloadBtn = false;
668 m_BtnState.deleteRemoteBtn = false;
669 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000670 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000671 m_BtnState.deleteRemoteBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000672 if (locPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000673 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000674 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000675 m_BtnState.downloadBtn = true;
676 }
677 if (nCount == 1) {
678 m_BtnState.renameRemoteBtn = true;
679 } else {
680 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000681 }
682 }
683 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000684 m_BtnState.downloadBtn = false;
685 m_BtnState.createRemoteFldBtn = false;
686 m_BtnState.deleteRemoteBtn = false;
687 m_BtnState.renameRemoteBtn = false;
688 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000689 }
690 } else {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000691 }
692 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000693 if (m_pFileTransfer->isTransferEnable())
694 m_BtnState.cancelBtn = true;
695 else
696 m_BtnState.cancelBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000697}
698
699void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000700FTDialog::setButtonsState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000701{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000702 refreshBtnState();
703
704 switch (m_BtnState.uploadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000705 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000706 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), FALSE); break;
707 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000708 }
709
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000710 switch (m_BtnState.downloadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000711 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000712 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), FALSE); break;
713 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000714 }
715
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000716 switch (m_BtnState.cancelBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000717 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000718 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break;
719 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000720 }
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000721
722 UpdateWindow(m_hwndFTDialog);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000723}
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000724
725void
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000726FTDialog::setStatusText(LPCSTR format,...)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000727{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000728 char text[1024];
729 va_list args;
730 va_start(args, format);
731 int nSize = _vsnprintf(text, sizeof(text), format, args);
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000732
733 HWND hStatusBox = GetDlgItem(m_hwndFTDialog, IDC_FTSTATUS);
734
735 LRESULT lRes = SendMessage(hStatusBox, (UINT) CB_INSERTSTRING, (WPARAM) 0, (LPARAM) text);
736 if ((lRes != CB_ERR) && (lRes != CB_ERRSPACE)) {
737 lRes = SendMessage(hStatusBox, (UINT) CB_SETCURSEL, (WPARAM) lRes, (LPARAM) 0);
738 }
739
740 m_dwNumStatusStrings++;
741 if (m_dwNumStatusStrings > FT_MAX_STATUS_STRINGS) {
742 int numItems = SendMessage(hStatusBox, (UINT) CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
743 if (numItems != CB_ERR) {
744 m_dwNumStatusStrings--;
745 SendMessage(hStatusBox, (UINT) CB_DELETESTRING, (WPARAM) numItems - 1, (LPARAM) 0);
746 }
747 }
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000748}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000749
750void
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000751FTDialog::processDlgMsgs()
752{
753 MSG msg;
754 while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) {
755 TranslateMessage(&msg);
756 DispatchMessage(&msg);
757 }
758}
759
760void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000761FTDialog::postCheckTransferQueueMsg()
762{
763 PostMessage(m_hwndFTDialog, m_msgCheckTransferQueue, 0, 0);
764}
765
766void
767FTDialog::postUploadFilePortionMsg()
768{
769 PostMessage(m_hwndFTDialog, m_msgUploadFilePortion, 0, 0);
770}
771
772void
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000773FTDialog::postCheckDeleteQueueMsg()
774{
775 PostMessage(m_hwndFTDialog, m_msgCheckDeleteQueue, 0, 0);
776}
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000777
778FTDialog::CancelingDlg::CancelingDlg(FTDialog *pFTDlg)
779{
780 m_pFTDlg = pFTDlg;
781 m_hwndDlg = NULL;
782}
783
784FTDialog::CancelingDlg::~CancelingDlg()
785{
786 destroy();
787}
788
789bool
790FTDialog::CancelingDlg::create()
791{
792 if (m_hwndDlg != NULL) return false;
793
794 m_hwndDlg = CreateDialogParam(GetModuleHandle(0),
795 MAKEINTRESOURCE(IDD_FTCANCELING),
796 NULL,
797 (DLGPROC) cancelingDlgProc,
798 (LONG) this);
799
800 if (m_hwndDlg == NULL) return false;
801
802 ShowWindow(m_hwndDlg, SW_SHOW);
803 DrawIcon(GetDC(m_hwndDlg), 15, 22, LoadIcon(NULL, IDI_QUESTION));
804 UpdateWindow(m_hwndDlg);
805
806 return true;
807}
808
809bool
810FTDialog::CancelingDlg::destroy()
811{
812 if (m_hwndDlg == NULL) return true;
813
814 if (DestroyWindow(m_hwndDlg)) {
815 m_hwndDlg = NULL;
816 return true;
817 } else {
818 return false;
819 }
820}
821
822bool
823FTDialog::CancelingDlg::close(bool bResult)
824{
825 if (m_hwndDlg == NULL) return true;
826
827 destroy();
828
829 m_pFTDlg->cancelTransfer(bResult);
830
831 return false;
832}
833
834BOOL CALLBACK
835FTDialog::CancelingDlg::cancelingDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
836{
837 FTDialog::CancelingDlg *_this = (FTDialog::CancelingDlg *) GetWindowLong(hwnd, GWL_USERDATA);
838 switch (uMsg)
839 {
840 case WM_INITDIALOG:
841 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
842 SetForegroundWindow(hwnd);
843 return TRUE;
844
845 case WM_COMMAND:
846 switch (LOWORD(wParam))
847 {
848 case IDOK:
849 _this->close(true);
850 return TRUE;
851 case IDCANCEL:
852 _this->close(false);
853 return TRUE;
854 }
855 break;
856 case WM_CLOSE:
857 _this->close(false);
858 return TRUE;
859 }
860 return FALSE;
861}