blob: d958f5b056d459c7dbe1d2dfff0c262eb964e102 [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;
37 m_bDlgShown = false;
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000038
39 m_pLocalLV = NULL;
40 m_pRemoteLV = NULL;
41 m_pProgress = NULL;
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +000042 m_pCancelingDlg = NULL;
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000043
Dennis Syrovatskyec906992005-11-07 09:56:06 +000044 m_hwndFTDialog = NULL;
Dennis Syrovatskyb595e032005-11-09 06:24:25 +000045 m_hwndLocalPath = NULL;
46 m_hwndRemotePath = NULL;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000047
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +000048 m_FTMenuSource = 0;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +000049 m_dwNumStatusStrings = 0;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +000050
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000051 m_szLocalPath[0] = '\0';
52 m_szRemotePath[0] = '\0';
53 m_szLocalPathTmp[0] = '\0';
54 m_szRemotePathTmp[0] = '\0';
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000055}
56
57FTDialog::~FTDialog()
58{
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000059 destroyFTDialog();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000060}
61
62bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000063FTDialog::createFTDialog(HWND hwndParent)
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000064{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +000065 if (m_hwndFTDialog != NULL) {
66 ShowWindow(m_hwndFTDialog, SW_SHOW);
67 m_bDlgShown = true;
68 return true;
69 }
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000070
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000071 if (!initFTWndMsgs()) return false;
72
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000073 m_hwndFTDialog = CreateDialogParam(m_hInstance,
74 MAKEINTRESOURCE(IDD_FILETRANSFER_DLG),
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000075 hwndParent,
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000076 (DLGPROC) FTDialogProc,
77 (LONG) this);
78
79 if (m_hwndFTDialog == NULL) return false;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000080
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +000081 HWND hwndLocalList = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALLIST);
82 HWND hwndRemoteList = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTELIST);
83
84 if ((hwndLocalList == NULL) || (hwndRemoteList == NULL)) {
85 destroyFTDialog();
86 return false;
87 }
88
89 m_pLocalLV = new FTListView(hwndLocalList);
90 m_pRemoteLV = new FTListView(hwndRemoteList);
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000091
92 m_pProgress = new FTProgress(m_hwndFTDialog);
93
94 if ((m_pLocalLV == NULL) || (m_pRemoteLV == NULL) || (m_pProgress == NULL)) {
95 destroyFTDialog();
96 return false;
97 }
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000098
99 initFTDialog();
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000100
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000101 ShowWindow(m_hwndFTDialog, SW_SHOW);
102 UpdateWindow(m_hwndFTDialog);
103 m_bDlgShown = true;
104 return true;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000105}
106
107bool
108FTDialog::initFTDialog()
109{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +0000110 m_pLocalLV->initialize(m_hInstance);
111 m_pRemoteLV->initialize(m_hInstance);
112
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000113 m_hwndLocalPath = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALPATH);
114 m_hwndRemotePath = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTEPATH);
115
116 setIcon(IDC_FTLOCALUP, IDI_FTUP);
117 setIcon(IDC_FTREMOTEUP, IDI_FTUP);
118 setIcon(IDC_FTLOCALRELOAD, IDI_FTRELOAD);
119 setIcon(IDC_FTREMOTERELOAD, IDI_FTRELOAD);
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000120
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000121 showLocalLVItems();
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000122 showRemoteLVItems();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000123
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +0000124 return true;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000125}
126
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000127bool
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000128FTDialog::initFTWndMsgs()
129{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000130 m_msgCheckDeleteQueue = RegisterWindowMessage(szCheckDeleteQueueText);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000131 m_msgCheckTransferQueue = RegisterWindowMessage(szCheckTransferQueueText);
132 m_msgUploadFilePortion = RegisterWindowMessage(szUploadFilePortionText);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000133
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000134 if ((m_msgCheckDeleteQueue) &&
135 (m_msgCheckTransferQueue) &&
136 (m_msgUploadFilePortion)) return true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000137
138 return false;
139}
140
141bool
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000142FTDialog::closeFTDialog()
143{
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000144 ShowWindow(m_hwndFTDialog, SW_HIDE);
145 m_bDlgShown = false;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000146 return true;
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +0000147}
148
149void
150FTDialog::destroyFTDialog()
151{
152 if (m_pLocalLV != NULL) {
153 delete m_pLocalLV;
154 m_pLocalLV = NULL;
155 }
156
157 if (m_pRemoteLV != NULL) {
158 delete m_pRemoteLV;
159 m_pRemoteLV = NULL;
160 }
161
162 if (m_pProgress != NULL) {
163 delete m_pProgress;
164 m_pProgress = NULL;
165 }
Dennis Syrovatsky58a01ed2005-11-09 08:21:41 +0000166
167 if (DestroyWindow(m_hwndFTDialog)) m_hwndFTDialog = NULL;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000168}
169
170BOOL CALLBACK
171FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
172{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000173 FTDialog *_this = (FTDialog *) GetWindowLong(hwnd, GWL_USERDATA);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000174
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000175 switch (uMsg)
176 {
177 case WM_INITDIALOG:
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000178 _this = (FTDialog*)lParam;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000179 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
180 SetForegroundWindow(hwnd);
181 return TRUE;
182 case WM_COMMAND:
183 {
184 switch (LOWORD(wParam))
185 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000186 case IDC_FTLOCALPATH:
187 switch (HIWORD (wParam))
188 {
189 case CBN_SETFOCUS:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000190 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000191 return FALSE;
192 }
193 break;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000194 case IDC_FTREMOTEPATH:
195 switch (HIWORD (wParam))
196 {
197 case CBN_SETFOCUS:
198 _this->setButtonsState();
199 return FALSE;
200 }
201 break;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000202 case IDC_FTCLOSE:
203 _this->closeFTDialog();
204 return FALSE;
205 case IDC_FTLOCALUP:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000206 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000207 _this->onLocalOneUpFolder();
208 return FALSE;
209 case IDC_FTREMOTEUP:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000210 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000211 _this->onRemoteOneUpFolder();
212 return FALSE;
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000213 case IDC_FTLOCALRELOAD:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000214 _this->setButtonsState();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000215 _this->onLocalReload();
216 return FALSE;
217 case IDC_FTREMOTERELOAD:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000218 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000219 _this->onRemoteReload();
220 return FALSE;
221 case IDC_FTUPLOAD:
222 _this->onUpload();
223 return FALSE;
224 case IDC_FTDOWNLOAD:
225 _this->onDownload();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000226 return FALSE;
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000227 case IDC_FTCANCEL:
228 _this->onFTCancel();
229 return FALSE;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000230 case IDM_FTCOPY:
231 case IDM_FTRENAME:
232 case IDM_FTDELETE:
233 case IDM_FTCANCEL:
234 _this->onFTMenuCommand(LOWORD(wParam));
235 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000236 }
237 }
238 break;
239
240 case WM_NOTIFY:
241 switch (LOWORD(wParam))
242 {
243 case IDC_FTLOCALLIST:
244 switch (((LPNMHDR) lParam)->code)
245 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000246 case NM_CLICK:
247 case NM_SETFOCUS:
248 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000249 _this->setButtonsState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000250 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000251 case LVN_GETDISPINFO:
252 _this->m_pLocalLV->onGetDispInfo((NMLVDISPINFO *) lParam);
253 return FALSE;
254 case LVN_ITEMACTIVATE:
255 _this->onLocalItemActivate((LPNMITEMACTIVATE) lParam);
256 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000257 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000258 _this->onLocalRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000259 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000260 }
261 break;
262 case IDC_FTREMOTELIST:
263 switch (((LPNMHDR) lParam)->code)
264 {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000265 case NM_CLICK:
266 case NM_SETFOCUS:
267 case LVN_ITEMCHANGED:
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000268 _this->setButtonsState();
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000269 case LVN_GETDISPINFO:
270 _this->m_pRemoteLV->onGetDispInfo((NMLVDISPINFO *) lParam);
271 return FALSE;
272 case LVN_ITEMACTIVATE:
273 _this->onRemoteItemActivate((LPNMITEMACTIVATE) lParam);
274 return FALSE;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000275 case NM_RCLICK:
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000276 _this->onRemoteRButton();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000277 return FALSE;
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000278 }
279 break;
280 }
281 break;
282 case WM_CLOSE:
283 case WM_DESTROY:
284 _this->closeFTDialog();
285 return FALSE;
286 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000287
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000288 if (_this != NULL) {
289 if (uMsg == _this->m_msgCheckTransferQueue)
290 _this->m_pFileTransfer->checkTransferQueue();
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000291
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000292 if (uMsg == _this->m_msgUploadFilePortion)
293 _this->m_pFileTransfer->uploadFilePortion();
294
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000295 if (uMsg == _this->m_msgCheckDeleteQueue)
296 _this->m_pFileTransfer->checkDeleteQueue();
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000297 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000298
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000299 return FALSE;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000300}
301
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000302void
303FTDialog::onLocalItemActivate(LPNMITEMACTIVATE lpnmia)
304{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000305 if (strlen(m_szLocalPath) == 0) {
306 strcpy(m_szLocalPathTmp, m_pLocalLV->getActivateItemName(lpnmia));
307 } else {
308 sprintf(m_szLocalPathTmp, "%s\\%s", m_szLocalPath, m_pLocalLV->getActivateItemName(lpnmia));
309 }
310 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000311}
312
313void
314FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia)
315{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000316 if (strlen(m_szRemotePath) == 0) {
317 strcpy(m_szRemotePathTmp, m_pRemoteLV->getActivateItemName(lpnmia));
318 } else {
319 sprintf(m_szRemotePathTmp, "%s\\%s", m_szRemotePath, m_pRemoteLV->getActivateItemName(lpnmia));
320 }
321 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000322}
323
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000324void
325FTDialog::onLocalReload()
326{
327 strcpy(m_szLocalPathTmp, m_szLocalPath);
328 showLocalLVItems();
329}
330
331void
332FTDialog::onRemoteReload()
333{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000334 strcpy(m_szRemotePathTmp, m_szRemotePath);
335 showRemoteLVItems();
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000336}
337
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000338void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000339FTDialog::showLocalLVItems()
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000340{
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000341 FolderManager fm;
342 FileInfo fileInfo;
343 if (fm.getDirInfo(m_szLocalPathTmp, &fileInfo, 0)) {
344 fileInfo.sort();
345 m_pLocalLV->deleteAllItems();
346 m_pLocalLV->addItems(&fileInfo);
347 strcpy(m_szLocalPath, m_szLocalPathTmp);
348 SetWindowText(m_hwndLocalPath, m_szLocalPath);
349 }
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000350}
351
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000352void
353FTDialog::showRemoteLVItems()
354{
355 m_pFileTransfer->requestFileList(m_szRemotePathTmp, FT_FLR_DEST_MAIN, 0);
356}
357
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000358void
Dennis Syrovatskyd6febeb2005-11-10 04:27:49 +0000359FTDialog::addRemoteLVItems(FileInfo *pFI)
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000360{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000361 pFI->sort();
362 m_pRemoteLV->deleteAllItems();
363 m_pRemoteLV->addItems(pFI);
364 strcpy(m_szRemotePath, m_szRemotePathTmp);
365 SetWindowText(m_hwndRemotePath, m_szRemotePath);
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +0000366 UpdateWindow(m_hwndFTDialog);
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000367}
368
369void
370FTDialog::onLocalOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000371{
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000372 strcpy(m_szLocalPathTmp, m_szLocalPath);
373 makeOneUpFolder(m_szLocalPathTmp);
374 showLocalLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000375}
376
377void
Dennis Syrovatskyb595e032005-11-09 06:24:25 +0000378FTDialog::onRemoteOneUpFolder()
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000379{
Dennis Syrovatsky4d915dd2005-11-12 06:27:34 +0000380 strcpy(m_szRemotePathTmp, m_szRemotePath);
381 makeOneUpFolder(m_szRemotePathTmp);
382 showRemoteLVItems();
Dennis Syrovatsky139d7832005-11-02 05:36:05 +0000383}
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000384
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000385void
386FTDialog::reqFolderUnavailable()
387{
388 strcpy(m_szRemotePathTmp, m_szRemotePath);
389}
390
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000391int
392FTDialog::makeOneUpFolder(char *pPath)
393{
394 if (strcmp(pPath, "") == 0) return strlen(pPath);
395 for (int i=(strlen(pPath)-2); i>=0; i--) {
396 if (pPath[i] == '\\') {
397 pPath[i] = '\0';
398 break;
399 }
400 if (i == 0) pPath[0] = '\0';
401 }
402 return strlen(pPath);
403}
404
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000405void
406FTDialog::onUpload()
407{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000408 FileInfo fi;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000409 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
410 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_UPLOAD);
411 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000412 refreshBtnState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000413}
414
415void
416FTDialog::onDownload()
417{
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000418 FileInfo fi;
419 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
420 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_DOWNLOAD);
421 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000422 refreshBtnState();
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000423}
424
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000425void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000426FTDialog::onLocalRename()
427{
428 MessageBox(NULL, "onLocalRename", "FTDialog", MB_OK);
429
430}
431
432void
433FTDialog::onRemoteRename()
434{
435 MessageBox(NULL, "onRemoteRename", "FTDialog", MB_OK);
436
437}
438
439void
440FTDialog::onLocalDelete()
441{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000442 FileInfo fi;
443 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
444 m_pFileTransfer->addDeleteQueue(m_szLocalPath, &fi, FT_ATTR_DELETE_LOCAL);
445 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000446 refreshBtnState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000447}
448
449void
450FTDialog::onRemoteDelete()
451{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000452 FileInfo fi;
453 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
454 m_pFileTransfer->addDeleteQueue(m_szRemotePath, &fi, FT_ATTR_DELETE_REMOTE);
455 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000456 refreshBtnState();
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000457}
458
459void
460FTDialog::onFTCancel()
461{
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000462 if (m_pCancelingDlg != NULL) return;
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000463
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000464 m_pCancelingDlg = new CancelingDlg(this);
465
466 m_pCancelingDlg->create();
467}
468
469void
470FTDialog::cancelTransfer(bool bResult)
471{
472 if (m_pCancelingDlg != NULL) {
473 delete m_pCancelingDlg;
474 m_pCancelingDlg = NULL;
475 }
476
477 MessageBox(NULL, "FTDialog::cancelTransfer()", "FTDialog::cancelTransfer()", MB_OK);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000478}
479
480void
481FTDialog::onFTMenuCommand(int command)
482{
483 switch (command)
484 {
485 case IDM_FTCOPY:
486 {
487 switch (m_FTMenuSource)
488 {
489 case IDC_FTLOCALLIST: onUpload(); break;
490 case IDC_FTREMOTELIST: onDownload(); break;
491 default: break;
492 }
493 }
494 break;
495 case IDM_FTRENAME:
496 {
497 switch (m_FTMenuSource)
498 {
499 case IDC_FTLOCALLIST: onLocalRename(); break;
500 case IDC_FTREMOTELIST: onRemoteRename(); break;
501 default: break;
502 }
503 }
504 break;
505 case IDM_FTDELETE:
506 {
507 switch (m_FTMenuSource)
508 {
509 case IDC_FTLOCALLIST: onLocalDelete(); break;
510 case IDC_FTREMOTELIST: onRemoteDelete(); break;
511 default: break;
512 }
513 }
514 break;
515 case IDM_FTCANCEL: onFTCancel(); break;
516 default:
517 break;
518 }
519}
520
521void
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000522FTDialog::onLocalRButton()
523{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000524 refreshBtnState();
525 m_FTMenuSource = IDC_FTLOCALLIST;
526 showFTMenu(m_BtnState.uploadBtn, m_BtnState.createLocalFldBtn,
527 m_BtnState.renameLocalBtn, m_BtnState.deleteLocalBtn,
528 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000529}
530
531void
532FTDialog::onRemoteRButton()
533{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000534 refreshBtnState();
535 m_FTMenuSource = IDC_FTREMOTELIST;
536 showFTMenu(m_BtnState.downloadBtn, m_BtnState.createRemoteFldBtn,
537 m_BtnState.renameRemoteBtn, m_BtnState.deleteRemoteBtn,
538 m_BtnState.cancelBtn);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000539}
540
541void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000542FTDialog::showFTMenu(bool copyBtnState, bool createFldBtnState, bool renameBtnState,
543 bool deleteBtnState, bool cancelBtnState)
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000544{
545 HMENU hMenu = LoadMenu(m_hInstance, MAKEINTRESOURCE(IDR_FTMENU));
546 HMENU hFTMenu = GetSubMenu(hMenu, 0);
547
548 SetMenuDefaultItem(hFTMenu, IDM_FTCOPY, FALSE);
549
550 SetForegroundWindow(m_hwndFTDialog);
551
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000552 if (copyBtnState) {
553 EnableMenuItem(hMenu, IDM_FTCOPY, MF_ENABLED);
554 } else {
555 EnableMenuItem(hMenu, IDM_FTCOPY, MF_DISABLED | MF_GRAYED);
556 }
557 if (createFldBtnState) {
558 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_ENABLED);
559 } else {
560 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_DISABLED | MF_GRAYED);
561 }
562 if (renameBtnState) {
563 EnableMenuItem(hMenu, IDM_FTRENAME, MF_ENABLED);
564 } else {
565 EnableMenuItem(hMenu, IDM_FTRENAME, MF_DISABLED | MF_GRAYED);
566 }
567 if (deleteBtnState) {
568 EnableMenuItem(hMenu, IDM_FTDELETE, MF_ENABLED);
569 } else {
570 EnableMenuItem(hMenu, IDM_FTDELETE, MF_DISABLED | MF_GRAYED);
571 }
572 if (cancelBtnState) {
573 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_ENABLED);
574 } else {
575 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_DISABLED | MF_GRAYED);
576 }
577 DrawMenuBar(m_hwndFTDialog);
578
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000579 POINT cursorPosition;
580 GetCursorPos(&cursorPosition);
581 TrackPopupMenu(hFTMenu, 0, cursorPosition.x, cursorPosition.y, 0, m_hwndFTDialog, 0);
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000582 DestroyMenu(hFTMenu);
Dennis Syrovatsky3f079e72005-11-23 05:23:50 +0000583}
584
Dennis Syrovatsky0b765cc2005-11-10 04:52:10 +0000585void
586FTDialog::setIcon(int dest, int idIcon)
587{
588 HANDLE hIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(idIcon), IMAGE_ICON, 16, 16, LR_SHARED);
589 SendMessage(GetDlgItem(m_hwndFTDialog, dest), BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIcon);
590 DestroyIcon((HICON) hIcon);
591}
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000592
593void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000594FTDialog::refreshBtnState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000595{
596 if (!m_bDlgShown) return;
597
598 int locPathLen = strlen(m_szLocalPath);
599 int remPathLen = strlen(m_szRemotePath);
600
601 if (GetFocus() == m_pLocalLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000602 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000603 if (strlen(m_szLocalPath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000604 m_BtnState.createLocalFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000605 int nCount = ListView_GetSelectedCount(m_pLocalLV->getWndHandle());
606 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000607 m_BtnState.uploadBtn = false;
608 m_BtnState.deleteLocalBtn = false;
609 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000610 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000611 m_BtnState.deleteLocalBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000612 if (remPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000613 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000614 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000615 m_BtnState.uploadBtn = true;
616 }
617 if (nCount == 1) {
618 m_BtnState.renameLocalBtn = true;
619 } else {
620 m_BtnState.renameLocalBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000621 }
622 }
623 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000624 m_BtnState.uploadBtn = false;
625 m_BtnState.createLocalFldBtn = false;
626 m_BtnState.deleteLocalBtn = false;
627 m_BtnState.renameLocalBtn = false;
628 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000629 }
630 } else {
631 if (GetFocus() == m_pRemoteLV->getWndHandle()) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000632 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000633 if (strlen(m_szRemotePath) != 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000634 m_BtnState.createRemoteFldBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000635 int nCount = ListView_GetSelectedCount(m_pRemoteLV->getWndHandle());
636 if (nCount <= 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000637 m_BtnState.downloadBtn = false;
638 m_BtnState.deleteRemoteBtn = false;
639 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000640 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000641 m_BtnState.deleteRemoteBtn = true;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000642 if (locPathLen == 0) {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000643 m_BtnState.downloadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000644 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000645 m_BtnState.downloadBtn = true;
646 }
647 if (nCount == 1) {
648 m_BtnState.renameRemoteBtn = true;
649 } else {
650 m_BtnState.renameRemoteBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000651 }
652 }
653 } else {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000654 m_BtnState.downloadBtn = false;
655 m_BtnState.createRemoteFldBtn = false;
656 m_BtnState.deleteRemoteBtn = false;
657 m_BtnState.renameRemoteBtn = false;
658 m_BtnState.uploadBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000659 }
660 } else {
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000661 }
662 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000663 if (m_pFileTransfer->isTransferEnable())
664 m_BtnState.cancelBtn = true;
665 else
666 m_BtnState.cancelBtn = false;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000667}
668
669void
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000670FTDialog::setButtonsState()
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000671{
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000672 refreshBtnState();
673
674 switch (m_BtnState.uploadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000675 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000676 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), FALSE); break;
677 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000678 }
679
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000680 switch (m_BtnState.downloadBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000681 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000682 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), FALSE); break;
683 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000684 }
685
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000686 switch (m_BtnState.cancelBtn)
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000687 {
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000688 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break;
689 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
Dennis Syrovatskyabc2cc52005-11-23 03:52:07 +0000690 }
Dennis Syrovatskybe4956b2005-11-23 09:15:12 +0000691}
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000692
693void
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000694FTDialog::setStatusText(LPCSTR format,...)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000695{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000696 char text[1024];
697 va_list args;
698 va_start(args, format);
699 int nSize = _vsnprintf(text, sizeof(text), format, args);
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000700
701 HWND hStatusBox = GetDlgItem(m_hwndFTDialog, IDC_FTSTATUS);
702
703 LRESULT lRes = SendMessage(hStatusBox, (UINT) CB_INSERTSTRING, (WPARAM) 0, (LPARAM) text);
704 if ((lRes != CB_ERR) && (lRes != CB_ERRSPACE)) {
705 lRes = SendMessage(hStatusBox, (UINT) CB_SETCURSEL, (WPARAM) lRes, (LPARAM) 0);
706 }
707
708 m_dwNumStatusStrings++;
709 if (m_dwNumStatusStrings > FT_MAX_STATUS_STRINGS) {
710 int numItems = SendMessage(hStatusBox, (UINT) CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
711 if (numItems != CB_ERR) {
712 m_dwNumStatusStrings--;
713 SendMessage(hStatusBox, (UINT) CB_DELETESTRING, (WPARAM) numItems - 1, (LPARAM) 0);
714 }
715 }
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000716}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000717
718void
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000719FTDialog::processDlgMsgs()
720{
721 MSG msg;
722 while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) {
723 TranslateMessage(&msg);
724 DispatchMessage(&msg);
725 }
726}
727
728void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000729FTDialog::postCheckTransferQueueMsg()
730{
731 PostMessage(m_hwndFTDialog, m_msgCheckTransferQueue, 0, 0);
732}
733
734void
735FTDialog::postUploadFilePortionMsg()
736{
737 PostMessage(m_hwndFTDialog, m_msgUploadFilePortion, 0, 0);
738}
739
740void
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000741FTDialog::postCheckDeleteQueueMsg()
742{
743 PostMessage(m_hwndFTDialog, m_msgCheckDeleteQueue, 0, 0);
744}
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000745
746FTDialog::CancelingDlg::CancelingDlg(FTDialog *pFTDlg)
747{
748 m_pFTDlg = pFTDlg;
749 m_hwndDlg = NULL;
750}
751
752FTDialog::CancelingDlg::~CancelingDlg()
753{
754 destroy();
755}
756
757bool
758FTDialog::CancelingDlg::create()
759{
760 if (m_hwndDlg != NULL) return false;
761
762 m_hwndDlg = CreateDialogParam(GetModuleHandle(0),
763 MAKEINTRESOURCE(IDD_FTCANCELING),
764 NULL,
765 (DLGPROC) cancelingDlgProc,
766 (LONG) this);
767
768 if (m_hwndDlg == NULL) return false;
769
770 ShowWindow(m_hwndDlg, SW_SHOW);
771 DrawIcon(GetDC(m_hwndDlg), 15, 22, LoadIcon(NULL, IDI_QUESTION));
772 UpdateWindow(m_hwndDlg);
773
774 return true;
775}
776
777bool
778FTDialog::CancelingDlg::destroy()
779{
780 if (m_hwndDlg == NULL) return true;
781
782 if (DestroyWindow(m_hwndDlg)) {
783 m_hwndDlg = NULL;
784 return true;
785 } else {
786 return false;
787 }
788}
789
790bool
791FTDialog::CancelingDlg::close(bool bResult)
792{
793 if (m_hwndDlg == NULL) return true;
794
795 destroy();
796
797 m_pFTDlg->cancelTransfer(bResult);
798
799 return false;
800}
801
802BOOL CALLBACK
803FTDialog::CancelingDlg::cancelingDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
804{
805 FTDialog::CancelingDlg *_this = (FTDialog::CancelingDlg *) GetWindowLong(hwnd, GWL_USERDATA);
806 switch (uMsg)
807 {
808 case WM_INITDIALOG:
809 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
810 SetForegroundWindow(hwnd);
811 return TRUE;
812
813 case WM_COMMAND:
814 switch (LOWORD(wParam))
815 {
816 case IDOK:
817 _this->close(true);
818 return TRUE;
819 case IDCANCEL:
820 _this->close(false);
821 return TRUE;
822 }
823 break;
824 case WM_CLOSE:
825 _this->close(false);
826 return TRUE;
827 }
828 return FALSE;
829}