blob: bf819a32a84db0fddf724636e8d53a6cc44fae19 [file] [log] [blame]
Constantin Kaplinsky729598c2006-05-25 05:12:25 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2 *
3 * Developed by Dennis Syrovatsky
4 *
5 * This is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This software is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this software; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
18 * USA.
19 *
Peter Åstrand7877cd62009-02-25 16:15:48 +000020 *
Constantin Kaplinsky729598c2006-05-25 05:12:25 +000021 *
22 */
23
24// -=- FTDialog.cxx
25
26#include <vncviewer/FTDialog.h>
27
28using namespace rfb;
29using namespace rfb::win32;
30
Peter Åstrand4eacc022009-02-27 10:12:14 +000031const char FTDialog::szCheckDeleteQueueText[] = "TigerVNC.Viewer.CheckDeleteQueue.Msg";
32const char FTDialog::szCheckTransferQueueText[] = "TigerVNC.Viewer.CheckTransferQueue.Msg";
33const char FTDialog::szUploadFilePortionText[] = "TigerVNC.Viewer.UploadFilePortion.Msg";
Constantin Kaplinsky729598c2006-05-25 05:12:25 +000034
35FTDialog::FTDialog(HINSTANCE hInst, FileTransfer *pFT)
36{
37 m_pFileTransfer = pFT;
38 m_hInstance = hInst;
39
40 m_bDlgShown = false;
41 m_bLocalBrowsing = true;
42 m_bCloseDlgAfterCancel = false;
43
44 m_pLocalLV = NULL;
45 m_pRemoteLV = NULL;
46 m_pProgress = NULL;
47 m_pCancelingDlg = NULL;
48 m_pCreateFolderDlg = NULL;
49 m_pRenameDlg = NULL;
50 m_pBrowseDlg = NULL;
51
52 m_hwndFTDialog = NULL;
53 m_hwndLocalPath = NULL;
54 m_hwndRemotePath = NULL;
55
56 m_FTMenuSource = 0;
57 m_dwNumStatusStrings = 0;
58
59 m_szLocalPath[0] = '\0';
60 m_szRemotePath[0] = '\0';
61 m_szLocalPathTmp[0] = '\0';
62 m_szRemotePathTmp[0] = '\0';
63 m_szCreateFolderName[0] = '\0';
64}
65
66FTDialog::~FTDialog()
67{
68 destroyFTDialog();
69}
70
71bool
72FTDialog::createFTDialog(HWND hwndParent)
73{
74 if (m_hwndFTDialog != NULL) {
75 ShowWindow(m_hwndFTDialog, SW_SHOW);
76 m_bDlgShown = true;
77 showLocalLVItems();
78 showRemoteLVItems();
79 return true;
80 }
81
82 if (!initFTWndMsgs()) return false;
83
84 m_hwndFTDialog = CreateDialogParam(m_hInstance,
85 MAKEINTRESOURCE(IDD_FILETRANSFER_DLG),
86 hwndParent,
87 (DLGPROC) FTDialogProc,
88 (LONG) this);
89
90 if (m_hwndFTDialog == NULL) return false;
91
92 HWND hwndLocalList = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALLIST);
93 HWND hwndRemoteList = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTELIST);
94
95 if ((hwndLocalList == NULL) || (hwndRemoteList == NULL)) {
96 destroyFTDialog();
97 return false;
98 }
99
100 m_pLocalLV = new FTListView(hwndLocalList);
101 m_pRemoteLV = new FTListView(hwndRemoteList);
102
103 m_pProgress = new FTProgress(m_hwndFTDialog);
104
105 if ((m_pLocalLV == NULL) || (m_pRemoteLV == NULL) || (m_pProgress == NULL)) {
106 destroyFTDialog();
107 return false;
108 }
109
110 initFTDialog();
111
112 ShowWindow(m_hwndFTDialog, SW_SHOW);
113 UpdateWindow(m_hwndFTDialog);
114 m_bDlgShown = true;
115 return true;
116}
117
118bool
119FTDialog::initFTDialog()
120{
121 m_pLocalLV->initialize(m_hInstance);
122 m_pRemoteLV->initialize(m_hInstance);
123
124 m_hwndLocalPath = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALPATH);
125 m_hwndRemotePath = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTEPATH);
126
127 setIcon(IDC_FTLOCALUP, IDI_FTUP);
128 setIcon(IDC_FTREMOTEUP, IDI_FTUP);
129 setIcon(IDC_FTLOCALRELOAD, IDI_FTRELOAD);
130 setIcon(IDC_FTREMOTERELOAD, IDI_FTRELOAD);
131
132 showLocalLVItems();
133 showRemoteLVItems();
134
135 return true;
136}
137
138bool
139FTDialog::initFTWndMsgs()
140{
141 m_msgCheckDeleteQueue = RegisterWindowMessage(szCheckDeleteQueueText);
142 m_msgCheckTransferQueue = RegisterWindowMessage(szCheckTransferQueueText);
143 m_msgUploadFilePortion = RegisterWindowMessage(szUploadFilePortionText);
144
145 if ((m_msgCheckDeleteQueue) &&
146 (m_msgCheckTransferQueue) &&
147 (m_msgUploadFilePortion)) return true;
148
149 return false;
150}
151
152bool
153FTDialog::closeFTDialog()
154{
155 ShowWindow(m_hwndFTDialog, SW_HIDE);
156 m_bDlgShown = false;
157 return true;
158}
159
160void
161FTDialog::destroyFTDialog()
162{
163 if (m_pLocalLV != NULL) {
164 delete m_pLocalLV;
165 m_pLocalLV = NULL;
166 }
167
168 if (m_pRemoteLV != NULL) {
169 delete m_pRemoteLV;
170 m_pRemoteLV = NULL;
171 }
172
173 if (m_pProgress != NULL) {
174 delete m_pProgress;
175 m_pProgress = NULL;
176 }
177
178 if(m_pCancelingDlg != NULL) {
179 delete m_pCancelingDlg;
180 m_pCancelingDlg = NULL;
181 }
182
183 if (m_pCreateFolderDlg != NULL) {
184 delete m_pCreateFolderDlg;
185 m_pCreateFolderDlg = NULL;
186 }
187
188 if(m_pRenameDlg != NULL) {
189 delete m_pRenameDlg;
190 m_pRenameDlg = NULL;
191 }
192
193 if (DestroyWindow(m_hwndFTDialog)) m_hwndFTDialog = NULL;
194}
195
196BOOL CALLBACK
197FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
198{
199 FTDialog *_this = (FTDialog *) GetWindowLong(hwnd, GWL_USERDATA);
200
201 switch (uMsg)
202 {
203 case WM_INITDIALOG:
204 _this = (FTDialog*)lParam;
205 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
206 SetForegroundWindow(hwnd);
207 return TRUE;
208 case WM_COMMAND:
209 {
210 switch (LOWORD(wParam))
211 {
212 case IDC_FTLOCALPATH:
213 switch (HIWORD (wParam))
214 {
215 case CBN_SETFOCUS:
216 _this->setButtonsState();
217 return FALSE;
218 }
219 break;
220 case IDC_FTREMOTEPATH:
221 switch (HIWORD (wParam))
222 {
223 case CBN_SETFOCUS:
224 _this->setButtonsState();
225 return FALSE;
226 }
227 break;
228 case IDC_FTCLOSE:
229 _this->onClose();
230 return FALSE;
231 case IDC_FTLOCALBROWSE:
232 _this->onLocalBrowse();
233 return FALSE;
234 case IDC_FTREMOTEBROWSE:
235 _this->onRemoteBrowse();
236 return FALSE;
237 case IDC_FTLOCALUP:
238 _this->setButtonsState();
239 _this->onLocalOneUpFolder();
240 return FALSE;
241 case IDC_FTREMOTEUP:
242 _this->setButtonsState();
243 _this->onRemoteOneUpFolder();
244 return FALSE;
245 case IDC_FTLOCALRELOAD:
246 _this->setButtonsState();
247 _this->onLocalReload();
248 return FALSE;
249 case IDC_FTREMOTERELOAD:
250 _this->setButtonsState();
251 _this->onRemoteReload();
252 return FALSE;
253 case IDC_FTUPLOAD:
254 _this->onUpload();
255 return FALSE;
256 case IDC_FTDOWNLOAD:
257 _this->onDownload();
258 return FALSE;
259 case IDC_FTCANCEL:
260 _this->onFTCancel();
261 return FALSE;
262 case IDM_FTCOPY:
263 case IDM_FTRENAME:
264 case IDM_FTDELETE:
265 case IDM_FTCANCEL:
266 case IDM_FTCREATEFOLDER:
267 _this->onFTMenuCommand(LOWORD(wParam));
268 return FALSE;
269 }
270 }
271 break;
272
273 case WM_NOTIFY:
274 switch (LOWORD(wParam))
275 {
276 case IDC_FTLOCALLIST:
277 switch (((LPNMHDR) lParam)->code)
278 {
279 case NM_CLICK:
280 case NM_SETFOCUS:
281 case LVN_ITEMCHANGED:
282 _this->setButtonsState();
283 return FALSE;
284 case LVN_GETDISPINFO:
285 _this->m_pLocalLV->onGetDispInfo((NMLVDISPINFO *) lParam);
286 return FALSE;
287 case LVN_ITEMACTIVATE:
288 _this->onLocalItemActivate((LPNMITEMACTIVATE) lParam);
289 return FALSE;
290 case NM_RCLICK:
291 _this->onLocalRButton();
292 return FALSE;
293 }
294 break;
295 case IDC_FTREMOTELIST:
296 switch (((LPNMHDR) lParam)->code)
297 {
298 case NM_CLICK:
299 case NM_SETFOCUS:
300 case LVN_ITEMCHANGED:
301 _this->setButtonsState();
302 case LVN_GETDISPINFO:
303 _this->m_pRemoteLV->onGetDispInfo((NMLVDISPINFO *) lParam);
304 return FALSE;
305 case LVN_ITEMACTIVATE:
306 _this->onRemoteItemActivate((LPNMITEMACTIVATE) lParam);
307 return FALSE;
308 case NM_RCLICK:
309 _this->onRemoteRButton();
310 return FALSE;
311 }
312 break;
313 }
314 break;
315 case WM_CLOSE:
316 _this->onClose();
317 return FALSE;
318 }
319
320 if (_this != NULL) {
321 if (uMsg == _this->m_msgCheckTransferQueue)
322 _this->m_pFileTransfer->checkTransferQueue();
323
324 if (uMsg == _this->m_msgUploadFilePortion)
325 _this->m_pFileTransfer->uploadFilePortion();
326
327 if (uMsg == _this->m_msgCheckDeleteQueue)
328 _this->m_pFileTransfer->checkDeleteQueue();
329 }
330
331 return FALSE;
332}
333
334void
335FTDialog::onClose()
336{
337 if (m_pFileTransfer->isTransferEnable()) {
338 m_bCloseDlgAfterCancel = true;
339 onFTCancel();
340 } else {
341 closeFTDialog();
342 }
343}
344
345void
346FTDialog::onLocalItemActivate(LPNMITEMACTIVATE lpnmia)
347{
348 if (strlen(m_szLocalPath) == 0) {
349 strcpy(m_szLocalPathTmp, m_pLocalLV->getActivateItemName(lpnmia));
350 } else {
351 sprintf(m_szLocalPathTmp, "%s\\%s", m_szLocalPath, m_pLocalLV->getActivateItemName(lpnmia));
352 }
353 showLocalLVItems();
354}
355
356void
357FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia)
358{
359 if (strlen(m_szRemotePath) == 0) {
360 strcpy(m_szRemotePathTmp, m_pRemoteLV->getActivateItemName(lpnmia));
361 } else {
362 sprintf(m_szRemotePathTmp, "%s\\%s", m_szRemotePath, m_pRemoteLV->getActivateItemName(lpnmia));
363 }
364 showRemoteLVItems();
365}
366
367void
368FTDialog::onEndBrowseDlg(bool bResult)
369{
370 if (m_pBrowseDlg == NULL) return;
371
372 if (bResult) {
373 if (m_bLocalBrowsing) {
374 strcpy(m_szLocalPathTmp, m_pBrowseDlg->getPath());
375 showLocalLVItems();
376 } else {
377 strcpy(m_szRemotePathTmp, m_pBrowseDlg->getPath());
378 showRemoteLVItems();
379 }
380 }
381 delete m_pBrowseDlg;
382 m_pBrowseDlg = NULL;
383}
384
385void
386FTDialog::onLocalBrowse()
387{
388 if (m_pBrowseDlg != NULL) return;
389
390 m_bLocalBrowsing = true;
391
392 m_pBrowseDlg = new FTBrowseDlg(this);
393 m_pBrowseDlg->create();
394
395 getBrowseItems("");
396}
397
398void
399FTDialog::onRemoteBrowse()
400{
401 if (m_pBrowseDlg != NULL) return;
402
403 m_bLocalBrowsing = false;
404
405 m_pBrowseDlg = new FTBrowseDlg(this);
406 if (m_pBrowseDlg->create()) {
407 m_pFileTransfer->requestFileList("", FT_FLR_DEST_BROWSE, true);
408 } else {
409 delete m_pBrowseDlg;
410 m_pBrowseDlg = NULL;
411 }
412}
413
414void
415FTDialog::onLocalReload()
416{
417 strcpy(m_szLocalPathTmp, m_szLocalPath);
418 showLocalLVItems();
419}
420
421void
422FTDialog::onRemoteReload()
423{
424 strcpy(m_szRemotePathTmp, m_szRemotePath);
425 showRemoteLVItems();
426}
427
428void
429FTDialog::showLocalLVItems()
430{
431 FolderManager fm;
432 FileInfo fileInfo;
433 if (fm.getDirInfo(m_szLocalPathTmp, &fileInfo, 0)) {
434 fileInfo.sort();
435 m_pLocalLV->deleteAllItems();
436 m_pLocalLV->addItems(&fileInfo);
437 strcpy(m_szLocalPath, m_szLocalPathTmp);
438 SetWindowText(m_hwndLocalPath, m_szLocalPath);
439 }
440}
441
442void
443FTDialog::showRemoteLVItems()
444{
445 m_pFileTransfer->requestFileList(m_szRemotePathTmp, FT_FLR_DEST_MAIN, false);
446}
447
448void
449FTDialog::addRemoteLVItems(FileInfo *pFI)
450{
451 pFI->sort();
452 m_pRemoteLV->deleteAllItems();
453 m_pRemoteLV->addItems(pFI);
454 strcpy(m_szRemotePath, m_szRemotePathTmp);
455 SetWindowText(m_hwndRemotePath, m_szRemotePath);
456 UpdateWindow(m_hwndFTDialog);
457}
458
459void
460FTDialog::onLocalOneUpFolder()
461{
462 strcpy(m_szLocalPathTmp, m_szLocalPath);
463 makeOneUpFolder(m_szLocalPathTmp);
464 showLocalLVItems();
465}
466
467void
468FTDialog::onRemoteOneUpFolder()
469{
470 strcpy(m_szRemotePathTmp, m_szRemotePath);
471 makeOneUpFolder(m_szRemotePathTmp);
472 showRemoteLVItems();
473}
474
475void
476FTDialog::reqFolderUnavailable()
477{
478 strcpy(m_szRemotePathTmp, m_szRemotePath);
479 SetWindowText(m_hwndRemotePath, m_szRemotePath);
480 UpdateWindow(m_hwndFTDialog);
481}
482
483int
484FTDialog::makeOneUpFolder(char *pPath)
485{
486 if (strcmp(pPath, "") == 0) return strlen(pPath);
487 for (int i=(strlen(pPath)-2); i>=0; i--) {
488 if (pPath[i] == '\\') {
489 pPath[i] = '\0';
490 break;
491 }
492 if (i == 0) pPath[0] = '\0';
493 }
494 return strlen(pPath);
495}
496
497void
498FTDialog::onUpload()
499{
500 FileInfo fi;
501 char prefix[FT_FILENAME_SIZE];
502 prefix[0] = '\0';
503
504 if (m_pFileTransfer->isTransferEnable())
505 strcpy(prefix, "File Transfer is active.\nDo you want to add selected file(s)/folder(s) to transfer queue?\n\n");
506
507 int numSel = m_pLocalLV->getSelectedItems(&fi);
508 if (numSel > 0) {
509 char *pBuf = new char [(numSel + 4) * (MAX_PATH + 3) + strlen(prefix) + 1];
510 sprintf(pBuf, "%sFrom: Local Computer %s\\\n\n", prefix, m_szLocalPath);
511
512 for (unsigned int i = 0; i < fi.getNumEntries(); i++)
513 sprintf(pBuf, "%s%s, ", pBuf, fi.getNameAt(i));
514
515 sprintf(pBuf, "%s\n\nTo: Remote Computer %s\\", pBuf, m_szRemotePath);
516
517 if (strlen(pBuf) > 2048)
518 sprintf(pBuf, "%sFrom: Local Computer %s\\\n\nTo: Remote Computer %s\\\n\nTotal %d file(s)/folder(s)",
519 prefix, m_szLocalPath, m_szRemotePath, numSel);
520
521 if (MessageBox(m_hwndFTDialog, pBuf, "Copy Selected Files and Folders", MB_OKCANCEL) == IDOK)
522 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_UPLOAD);
523
524 setButtonsState();
525
526 delete [] pBuf;
527 return;
528 }
529
530 setButtonsState();
531 setStatusText("File Transfer Impossible. No file(s) selected for transfer");
532}
533
534void
535FTDialog::onDownload()
536{
537 FileInfo fi;
538 char prefix[FT_FILENAME_SIZE];
539 prefix[0] = '\0';
540
541 if (m_pFileTransfer->isTransferEnable())
542 strcpy(prefix, "File Transfer is active.\nDo you want to add selected file(s)/folder(s) to transfer queue?\n\n");
543
544 int numSel = m_pRemoteLV->getSelectedItems(&fi);
545 if (numSel > 0) {
546 char *pBuf = new char [(numSel + 4) * (MAX_PATH + 3) + strlen(prefix) + 1];
547 sprintf(pBuf, "%sFrom: Remote Computer %s\\\n\n", prefix, m_szRemotePath);
548
549 for (unsigned int i = 0; i < fi.getNumEntries(); i++)
550 sprintf(pBuf, "%s%s, ", pBuf, fi.getNameAt(i));
551
552 sprintf(pBuf, "%s\n\nTo: Local Computer %s\\", pBuf, m_szLocalPath);
553
554 if (strlen(pBuf) > 2048)
555 sprintf(pBuf, "%sFrom: Remote Computer %s\\\n\nTo: Local Computer %s\\\n\nTotal %d file(s)/folder(s)",
556 prefix, m_szRemotePath, m_szLocalPath, numSel);
557
558 if (MessageBox(m_hwndFTDialog, pBuf, "Copy Selected Files and Folders", MB_OKCANCEL) == IDOK)
559 m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_DOWNLOAD);
560
561 setButtonsState();
562
563 delete [] pBuf;
564 return;
565 }
566
567 setButtonsState();
568 setStatusText("File Transfer Impossible. No file(s) selected for transfer");
569}
570
571void
572FTDialog::onLocalRename()
573{
574 if (m_pRenameDlg != NULL) return;
575
576 FileInfo fi;
577 if (m_pLocalLV->getSelectedItems(&fi) == 1) {
578 unsigned int flags = fi.getFlagsAt(0);
579 m_pRenameDlg = new FTDialog::RenameDlg(this);
580 if (m_pRenameDlg != NULL) {
581 if (flags & FT_ATTR_DIR) {
582 m_pRenameDlg->create(fi.getNameAt(0), true);
583 } else {
584 m_pRenameDlg->create(fi.getNameAt(0), false);
585 }
586 if (strlen(m_pRenameDlg->getFolderName()) > 0) {
587 FolderManager fm;
588 fm.renameIt(m_szLocalPath, fi.getNameAt(0), m_pRenameDlg->getFolderName());
589 showLocalLVItems();
590 }
591 delete m_pRenameDlg;
592 m_pRenameDlg = NULL;
593 }
594 }
595 setButtonsState();
596}
597
598void
599FTDialog::onRemoteRename()
600{
601 if (m_pRenameDlg != NULL) return;
602
603 FileInfo fi;
604 if (m_pRemoteLV->getSelectedItems(&fi) == 1) {
605 unsigned int flags = fi.getFlagsAt(0);
606 m_pRenameDlg = new FTDialog::RenameDlg(this);
607 if (m_pRenameDlg != NULL) {
608 if (flags & FT_ATTR_DIR) {
609 m_pRenameDlg->create(fi.getNameAt(0), true);
610 } else {
611 m_pRenameDlg->create(fi.getNameAt(0), false);
612 }
613 if (strlen(m_pRenameDlg->getFolderName()) > 0) {
614 m_pFileTransfer->renameRemote(m_szRemotePath, fi.getNameAt(0), m_pRenameDlg->getFolderName());
615 }
616 delete m_pRenameDlg;
617 m_pRenameDlg = NULL;
618 }
619 }
620 setButtonsState();
621}
622
623void
624FTDialog::onLocalDelete()
625{
626 FileInfo fi;
627 if (m_pLocalLV->getSelectedItems(&fi) > 0) {
628 m_pFileTransfer->addDeleteQueue(m_szLocalPath, &fi, FT_ATTR_DELETE_LOCAL);
629 }
630 setButtonsState();
631}
632
633void
634FTDialog::onRemoteDelete()
635{
636 FileInfo fi;
637 if (m_pRemoteLV->getSelectedItems(&fi) > 0) {
638 m_pFileTransfer->addDeleteQueue(m_szRemotePath, &fi, FT_ATTR_DELETE_REMOTE);
639 }
640 setButtonsState();
641}
642
643bool
644FTDialog::getCreateFolderName()
645{
646 if (m_pCreateFolderDlg != NULL) return false;
647
648 bool bResult = false;
649
650 m_pCreateFolderDlg = new FTDialog::CreateFolderDlg(this);
651 m_pCreateFolderDlg->create();
652 if (strlen(m_pCreateFolderDlg->getFolderName()) != 0) {
653 strcpy(m_szCreateFolderName, m_pCreateFolderDlg->getFolderName());
654 bResult = true;
655 } else {
656 m_szCreateFolderName[0] = '\0';
657 bResult = false;
658 }
659 delete m_pCreateFolderDlg;
660 m_pCreateFolderDlg = NULL;
661
662 return bResult;
663}
664
665void
666FTDialog::onLocalCreateFolder()
667{
668 if (getCreateFolderName()) {
669 char path[FT_FILENAME_SIZE];
670 sprintf(path, "%s\\%s", m_szLocalPath, m_szCreateFolderName);
671 setStatusText("Creating Local Folder: %s", path);
672 FolderManager fm;
673 if (fm.createDir(path)) showLocalLVItems();
674 }
675}
676
677void
678FTDialog::onRemoteCreateFolder()
679{
680 if (getCreateFolderName()) {
681 m_pFileTransfer->createRemoteFolder(m_szRemotePath, m_szCreateFolderName);
682 }
683}
684
685void
686FTDialog::onFTCancel()
687{
688 if (m_pCancelingDlg != NULL) return;
689
690 m_pCancelingDlg = new CancelingDlg(this);
691
692 m_pCancelingDlg->create();
693}
694
695void
696FTDialog::cancelTransfer(bool bResult)
697{
698 if (m_pCancelingDlg != NULL) {
699 delete m_pCancelingDlg;
700 m_pCancelingDlg = NULL;
701 }
702
703 setButtonsState();
704
705 if ((m_bCloseDlgAfterCancel) && (bResult)) {
706 m_bCloseDlgAfterCancel = false;
707 closeFTDialog();
708 }
709
710 m_pFileTransfer->m_bCancel = bResult;
711}
712
713void
714FTDialog::afterCancelTransfer()
715{
716 if (m_pCancelingDlg != NULL) {
717 delete m_pCancelingDlg;
718 m_pCancelingDlg = NULL;
719 }
720}
721
722void
723FTDialog::onFTMenuCommand(int command)
724{
725 switch (command)
726 {
727 case IDM_FTCOPY:
728 {
729 switch (m_FTMenuSource)
730 {
731 case IDC_FTLOCALLIST: onUpload(); break;
732 case IDC_FTREMOTELIST: onDownload(); break;
733 default: break;
734 }
735 }
736 break;
737 case IDM_FTRENAME:
738 {
739 switch (m_FTMenuSource)
740 {
741 case IDC_FTLOCALLIST: onLocalRename(); break;
742 case IDC_FTREMOTELIST: onRemoteRename(); break;
743 default: break;
744 }
745 }
746 break;
747 case IDM_FTDELETE:
748 {
749 switch (m_FTMenuSource)
750 {
751 case IDC_FTLOCALLIST: onLocalDelete(); break;
752 case IDC_FTREMOTELIST: onRemoteDelete(); break;
753 default: break;
754 }
755 }
756 break;
757 case IDM_FTCANCEL: onFTCancel(); break;
758 case IDM_FTCREATEFOLDER:
759 {
760 switch (m_FTMenuSource)
761 {
762 case IDC_FTLOCALLIST: onLocalCreateFolder(); break;
763 case IDC_FTREMOTELIST: onRemoteCreateFolder(); break;
764 default: break;
765 }
766 }
767 break;
768 default:
769 break;
770 }
771}
772
773void
774FTDialog::onLocalRButton()
775{
776 refreshBtnState();
777 m_FTMenuSource = IDC_FTLOCALLIST;
778 showFTMenu(m_BtnState.uploadBtn, m_BtnState.createLocalFldBtn,
779 m_BtnState.renameLocalBtn, m_BtnState.deleteLocalBtn,
780 m_BtnState.cancelBtn);
781}
782
783void
784FTDialog::onRemoteRButton()
785{
786 refreshBtnState();
787 m_FTMenuSource = IDC_FTREMOTELIST;
788 showFTMenu(m_BtnState.downloadBtn, m_BtnState.createRemoteFldBtn,
789 m_BtnState.renameRemoteBtn, m_BtnState.deleteRemoteBtn,
790 m_BtnState.cancelBtn);
791}
792
793void
794FTDialog::showFTMenu(bool copyBtnState, bool createFldBtnState, bool renameBtnState,
795 bool deleteBtnState, bool cancelBtnState)
796{
797 HMENU hMenu = LoadMenu(m_hInstance, MAKEINTRESOURCE(IDR_FTMENU));
798 HMENU hFTMenu = GetSubMenu(hMenu, 0);
799
800 SetMenuDefaultItem(hFTMenu, IDM_FTCOPY, FALSE);
801
802 SetForegroundWindow(m_hwndFTDialog);
803
804 if (copyBtnState) {
805 EnableMenuItem(hMenu, IDM_FTCOPY, MF_ENABLED);
806 } else {
807 EnableMenuItem(hMenu, IDM_FTCOPY, MF_DISABLED | MF_GRAYED);
808 }
809 if (createFldBtnState) {
810 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_ENABLED);
811 } else {
812 EnableMenuItem(hMenu, IDM_FTCREATEFOLDER, MF_DISABLED | MF_GRAYED);
813 }
814 if (renameBtnState) {
815 EnableMenuItem(hMenu, IDM_FTRENAME, MF_ENABLED);
816 } else {
817 EnableMenuItem(hMenu, IDM_FTRENAME, MF_DISABLED | MF_GRAYED);
818 }
819 if (deleteBtnState) {
820 EnableMenuItem(hMenu, IDM_FTDELETE, MF_ENABLED);
821 } else {
822 EnableMenuItem(hMenu, IDM_FTDELETE, MF_DISABLED | MF_GRAYED);
823 }
824 if (cancelBtnState) {
825 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_ENABLED);
826 } else {
827 EnableMenuItem(hMenu, IDM_FTCANCEL, MF_DISABLED | MF_GRAYED);
828 }
829 DrawMenuBar(m_hwndFTDialog);
830
831 POINT cursorPosition;
832 GetCursorPos(&cursorPosition);
833 TrackPopupMenu(hFTMenu, 0, cursorPosition.x, cursorPosition.y, 0, m_hwndFTDialog, 0);
834 DestroyMenu(hFTMenu);
835}
836
837void
838FTDialog::setIcon(int dest, int idIcon)
839{
840 HANDLE hIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(idIcon), IMAGE_ICON, 16, 16, LR_SHARED);
841 SendMessage(GetDlgItem(m_hwndFTDialog, dest), BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIcon);
842 DestroyIcon((HICON) hIcon);
843}
844
845void
846FTDialog::refreshBtnState()
847{
848 if (!m_bDlgShown) return;
849
850 int locPathLen = strlen(m_szLocalPath);
851 int remPathLen = strlen(m_szRemotePath);
852
853 if (GetFocus() == m_pLocalLV->getWndHandle()) {
854 m_BtnState.downloadBtn = false;
855 if (strlen(m_szLocalPath) != 0) {
856 m_BtnState.createLocalFldBtn = true;
857 int nCount = ListView_GetSelectedCount(m_pLocalLV->getWndHandle());
858 if (nCount <= 0) {
859 m_BtnState.uploadBtn = false;
860 m_BtnState.deleteLocalBtn = false;
861 m_BtnState.renameLocalBtn = false;
862 } else {
863 m_BtnState.deleteLocalBtn = true;
864 if (remPathLen == 0) {
865 m_BtnState.uploadBtn = false;
866 } else {
867 m_BtnState.uploadBtn = true;
868 }
869 if (nCount == 1) {
870 m_BtnState.renameLocalBtn = true;
871 } else {
872 m_BtnState.renameLocalBtn = false;
873 }
874 }
875 } else {
876 m_BtnState.uploadBtn = false;
877 m_BtnState.createLocalFldBtn = false;
878 m_BtnState.deleteLocalBtn = false;
879 m_BtnState.renameLocalBtn = false;
880 m_BtnState.downloadBtn = false;
881 }
882 } else {
883 if (GetFocus() == m_pRemoteLV->getWndHandle()) {
884 m_BtnState.uploadBtn = false;
885 if (strlen(m_szRemotePath) != 0) {
886 m_BtnState.createRemoteFldBtn = true;
887 int nCount = ListView_GetSelectedCount(m_pRemoteLV->getWndHandle());
888 if (nCount <= 0) {
889 m_BtnState.downloadBtn = false;
890 m_BtnState.deleteRemoteBtn = false;
891 m_BtnState.renameRemoteBtn = false;
892 } else {
893 m_BtnState.deleteRemoteBtn = true;
894 if (locPathLen == 0) {
895 m_BtnState.downloadBtn = false;
896 } else {
897 m_BtnState.downloadBtn = true;
898 }
899 if (nCount == 1) {
900 m_BtnState.renameRemoteBtn = true;
901 } else {
902 m_BtnState.renameRemoteBtn = false;
903 }
904 }
905 } else {
906 m_BtnState.downloadBtn = false;
907 m_BtnState.createRemoteFldBtn = false;
908 m_BtnState.deleteRemoteBtn = false;
909 m_BtnState.renameRemoteBtn = false;
910 m_BtnState.uploadBtn = false;
911 }
912 } else {
913 }
914 }
915 if (m_pFileTransfer->isTransferEnable())
916 m_BtnState.cancelBtn = true;
917 else
918 m_BtnState.cancelBtn = false;
919}
920
921void
922FTDialog::setButtonsState()
923{
924 refreshBtnState();
925
926 switch (m_BtnState.uploadBtn)
927 {
928 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), FALSE); break;
929 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), TRUE); break;
930 }
931
932 switch (m_BtnState.downloadBtn)
933 {
934 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), FALSE); break;
935 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), TRUE); break;
936 }
937
938 switch (m_BtnState.cancelBtn)
939 {
940 case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break;
941 case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
942 }
943
944 UpdateWindow(m_hwndFTDialog);
945}
946
947void
948FTDialog::setStatusText(LPCSTR format,...)
949{
950 char text[1024];
951 va_list args;
952 va_start(args, format);
953 int nSize = _vsnprintf(text, sizeof(text), format, args);
954
955 HWND hStatusBox = GetDlgItem(m_hwndFTDialog, IDC_FTSTATUS);
956
957 LRESULT lRes = SendMessage(hStatusBox, (UINT) CB_INSERTSTRING, (WPARAM) 0, (LPARAM) text);
958 if ((lRes != CB_ERR) && (lRes != CB_ERRSPACE)) {
959 lRes = SendMessage(hStatusBox, (UINT) CB_SETCURSEL, (WPARAM) lRes, (LPARAM) 0);
960 }
961
962 m_dwNumStatusStrings++;
963 if (m_dwNumStatusStrings > FT_MAX_STATUS_STRINGS) {
964 int numItems = SendMessage(hStatusBox, (UINT) CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
965 if (numItems != CB_ERR) {
966 m_dwNumStatusStrings--;
967 SendMessage(hStatusBox, (UINT) CB_DELETESTRING, (WPARAM) numItems - 1, (LPARAM) 0);
968 }
969 }
970}
971
972void
973FTDialog::getBrowseItems(char *pPath)
974{
975 if (m_bLocalBrowsing) {
976 FileInfo fi;
977 FolderManager fm;
978 fm.getDirInfo(pPath, &fi, 1);
979 if (m_pBrowseDlg != NULL) m_pBrowseDlg->addItems(&fi);
980 } else {
981 m_pFileTransfer->requestFileList(pPath, FT_FLR_DEST_BROWSE, true);
982 }
983}
984
985void
986FTDialog::addBrowseItems(FileInfo *pFI)
987{
988 if (m_pBrowseDlg == NULL) return;
989
990 m_pBrowseDlg->addItems(pFI);
991}
992
993void
994FTDialog::processDlgMsgs()
995{
996 MSG msg;
997 while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) {
998 TranslateMessage(&msg);
999 DispatchMessage(&msg);
1000 }
1001}
1002
1003void
1004FTDialog::postCheckTransferQueueMsg()
1005{
1006 PostMessage(m_hwndFTDialog, m_msgCheckTransferQueue, 0, 0);
1007}
1008
1009void
1010FTDialog::postUploadFilePortionMsg()
1011{
1012 PostMessage(m_hwndFTDialog, m_msgUploadFilePortion, 0, 0);
1013}
1014
1015void
1016FTDialog::postCheckDeleteQueueMsg()
1017{
1018 PostMessage(m_hwndFTDialog, m_msgCheckDeleteQueue, 0, 0);
1019}
1020
1021FTDialog::CancelingDlg::CancelingDlg(FTDialog *pFTDlg)
1022{
1023 m_pFTDlg = pFTDlg;
1024 m_hwndDlg = NULL;
1025}
1026
1027FTDialog::CancelingDlg::~CancelingDlg()
1028{
1029 destroy();
1030}
1031
1032bool
1033FTDialog::CancelingDlg::create()
1034{
1035 if (m_hwndDlg != NULL) return false;
1036
1037 m_hwndDlg = CreateDialogParam(GetModuleHandle(0),
1038 MAKEINTRESOURCE(IDD_FTCANCELING),
1039 NULL,
1040 (DLGPROC) cancelingDlgProc,
1041 (LONG) this);
1042
1043 if (m_hwndDlg == NULL) return false;
1044
1045 ShowWindow(m_hwndDlg, SW_SHOW);
1046 DrawIcon(GetDC(m_hwndDlg), 15, 22, LoadIcon(NULL, IDI_QUESTION));
1047 UpdateWindow(m_hwndDlg);
1048
1049 return true;
1050}
1051
1052bool
1053FTDialog::CancelingDlg::destroy()
1054{
1055 if (m_hwndDlg == NULL) return true;
1056
1057 if (DestroyWindow(m_hwndDlg)) {
1058 m_hwndDlg = NULL;
1059 return true;
1060 } else {
1061 return false;
1062 }
1063}
1064
1065bool
1066FTDialog::CancelingDlg::close(bool bResult)
1067{
1068 if (m_hwndDlg == NULL) return true;
1069
1070 destroy();
1071
1072 m_pFTDlg->cancelTransfer(bResult);
1073
1074 return false;
1075}
1076
1077BOOL CALLBACK
1078FTDialog::CancelingDlg::cancelingDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1079{
1080 FTDialog::CancelingDlg *_this = (FTDialog::CancelingDlg *) GetWindowLong(hwnd, GWL_USERDATA);
1081 switch (uMsg)
1082 {
1083 case WM_INITDIALOG:
1084 SetWindowLong(hwnd, GWL_USERDATA, (LONG) lParam);
1085 SetForegroundWindow(hwnd);
1086 return TRUE;
1087
1088 case WM_COMMAND:
1089 switch (LOWORD(wParam))
1090 {
1091 case IDOK:
1092 _this->close(true);
1093 return TRUE;
1094 case IDCANCEL:
1095 _this->close(false);
1096 return TRUE;
1097 }
1098 break;
1099 case WM_CLOSE:
1100 _this->close(false);
1101 return TRUE;
1102 }
1103 return FALSE;
1104}
1105
1106FTDialog::CreateFolderDlg::CreateFolderDlg(FTDialog *pFTDlg) : Dialog(GetModuleHandle(0))
1107{
1108 m_pFTDlg = pFTDlg;
1109 m_szFolderName[0] = '\0';
1110}
1111
1112FTDialog::CreateFolderDlg::~CreateFolderDlg()
1113{
1114
1115}
1116
1117bool
1118FTDialog::CreateFolderDlg::create()
1119{
1120 return showDialog(MAKEINTRESOURCE(IDD_FTCREATEFOLDER), m_pFTDlg->getWndHandle());
1121}
1122
1123bool
1124FTDialog::CreateFolderDlg::onOk()
1125{
1126 strcpy(m_szFolderName, getItemString(IDC_FTFOLDERNAME));
1127 return true;
1128}
1129
1130FTDialog::RenameDlg::RenameDlg(FTDialog *pFTDlg) : CreateFolderDlg(pFTDlg)
1131{
1132 m_bFolder = false;
1133}
1134
1135FTDialog::RenameDlg::~RenameDlg()
1136{
1137}
1138
1139bool
1140FTDialog::RenameDlg::create(char *pFilename, bool bFolder)
1141{
1142 m_bFolder = bFolder;
1143 strcpy(m_szFilename, pFilename);
1144 return showDialog(MAKEINTRESOURCE(IDD_FTCREATEFOLDER), m_pFTDlg->getWndHandle());
1145}
1146
1147void
1148FTDialog::RenameDlg::initDialog()
1149{
1150 char buf[2*FT_FILENAME_SIZE];
1151 if (m_bFolder) {
1152 SetWindowText(handle, "Rename Folder");
1153 sprintf(buf, "Rename Folder '%s'", m_szFilename);
1154 } else {
1155 SetWindowText(handle, "Rename File");
1156 sprintf(buf, "Rename File '%s'", m_szFilename);
1157 }
1158
1159 setItemString(IDC_FTTEXT, buf);
1160 setItemString(IDC_FTFOLDERNAME, m_szFilename);
1161 SendDlgItemMessage(handle, IDC_FTFOLDERNAME, EM_SETSEL, (WPARAM) 0, (LPARAM) -1);
1162}