From 2142b4a5d791630d424a36a4ece3c965fac1cb9d Mon Sep 17 00:00:00 2001 From: Dennis Syrovatsky Date: Wed, 14 Dec 2005 11:03:19 +0000 Subject: [PATCH] Added code for canceling file transfer. Code improvements. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@445 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- vncviewer/FTDialog.cxx | 48 +++++++++++++++++++++++++++++++------- vncviewer/FTDialog.h | 4 ++++ vncviewer/FileTransfer.cxx | 41 +++++++++++++++++++++++++++++--- vncviewer/FileTransfer.h | 5 ++++ 4 files changed, 87 insertions(+), 11 deletions(-) diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx index d958f5b0..a4fd9a68 100644 --- a/vncviewer/FTDialog.cxx +++ b/vncviewer/FTDialog.cxx @@ -34,7 +34,9 @@ FTDialog::FTDialog(HINSTANCE hInst, FileTransfer *pFT) { m_pFileTransfer = pFT; m_hInstance = hInst; + m_bDlgShown = false; + m_bCloseDlgAfterCancel = false; m_pLocalLV = NULL; m_pRemoteLV = NULL; @@ -65,6 +67,8 @@ FTDialog::createFTDialog(HWND hwndParent) if (m_hwndFTDialog != NULL) { ShowWindow(m_hwndFTDialog, SW_SHOW); m_bDlgShown = true; + showLocalLVItems(); + showRemoteLVItems(); return true; } @@ -200,7 +204,7 @@ FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; case IDC_FTCLOSE: - _this->closeFTDialog(); + _this->onClose(); return FALSE; case IDC_FTLOCALUP: _this->setButtonsState(); @@ -280,8 +284,7 @@ FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; case WM_CLOSE: - case WM_DESTROY: - _this->closeFTDialog(); + _this->onClose(); return FALSE; } @@ -299,6 +302,17 @@ FTDialog::FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return FALSE; } +void +FTDialog::onClose() +{ + if (m_pFileTransfer->isTransferEnable()) { + m_bCloseDlgAfterCancel = true; + onFTCancel(); + } else { + closeFTDialog(); + } +} + void FTDialog::onLocalItemActivate(LPNMITEMACTIVATE lpnmia) { @@ -409,7 +423,7 @@ FTDialog::onUpload() if (m_pLocalLV->getSelectedItems(&fi) > 0) { m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_UPLOAD); } - refreshBtnState(); + setButtonsState(); } void @@ -419,7 +433,7 @@ FTDialog::onDownload() if (m_pRemoteLV->getSelectedItems(&fi) > 0) { m_pFileTransfer->addTransferQueue(m_szLocalPath, m_szRemotePath, &fi, FT_ATTR_COPY_DOWNLOAD); } - refreshBtnState(); + setButtonsState(); } void @@ -443,7 +457,7 @@ FTDialog::onLocalDelete() if (m_pLocalLV->getSelectedItems(&fi) > 0) { m_pFileTransfer->addDeleteQueue(m_szLocalPath, &fi, FT_ATTR_DELETE_LOCAL); } - refreshBtnState(); + setButtonsState(); } void @@ -453,7 +467,7 @@ FTDialog::onRemoteDelete() if (m_pRemoteLV->getSelectedItems(&fi) > 0) { m_pFileTransfer->addDeleteQueue(m_szRemotePath, &fi, FT_ATTR_DELETE_REMOTE); } - refreshBtnState(); + setButtonsState(); } void @@ -474,7 +488,23 @@ FTDialog::cancelTransfer(bool bResult) m_pCancelingDlg = NULL; } - MessageBox(NULL, "FTDialog::cancelTransfer()", "FTDialog::cancelTransfer()", MB_OK); + setButtonsState(); + + if ((m_bCloseDlgAfterCancel) && (bResult)) { + m_bCloseDlgAfterCancel = false; + closeFTDialog(); + } + + m_pFileTransfer->m_bCancel = bResult; +} + +void +FTDialog::afterCancelTransfer() +{ + if (m_pCancelingDlg != NULL) { + delete m_pCancelingDlg; + m_pCancelingDlg = NULL; + } } void @@ -688,6 +718,8 @@ FTDialog::setButtonsState() case false: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break; case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break; } + + UpdateWindow(m_hwndFTDialog); } void diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h index 0c833431..928c93dc 100644 --- a/vncviewer/FTDialog.h +++ b/vncviewer/FTDialog.h @@ -50,6 +50,7 @@ namespace rfb { void processDlgMsgs(); void cancelTransfer(bool bResult); + void afterCancelTransfer(); static BOOL CALLBACK FTDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -81,6 +82,8 @@ namespace rfb { void showLocalLVItems(); void showRemoteLVItems(); + void onClose(); + void onLocalItemActivate(LPNMITEMACTIVATE lpnmia); void onRemoteItemActivate(LPNMITEMACTIVATE lpnmia); @@ -117,6 +120,7 @@ namespace rfb { void setButtonsState(); bool m_bDlgShown; + bool m_bCloseDlgAfterCancel; UINT m_msgCheckDeleteQueue; UINT m_msgCheckTransferQueue; diff --git a/vncviewer/FileTransfer.cxx b/vncviewer/FileTransfer.cxx index a0c1cf96..5d074f3a 100644 --- a/vncviewer/FileTransfer.cxx +++ b/vncviewer/FileTransfer.cxx @@ -31,6 +31,7 @@ FileTransfer::FileTransfer() m_bFTDlgShown = false; m_bInitialized = false; m_bResized = false; + m_bCancel = false; m_pFTDialog = new FTDialog(GetModuleHandle(0), this); @@ -221,6 +222,7 @@ FileTransfer::checkTransferQueue() m_dw64SizeSending = 0; m_bResized = false; m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully"); + m_pFTDialog->afterCancelTransfer(); PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0); PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0); return; @@ -322,7 +324,10 @@ FileTransfer::downloadFile() void FileTransfer::uploadFilePortion() { - if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs(); + if (checkCancelOperations()) { + char reason[] = "The user cancel transfer"; + m_pWriter->writeFileUploadFailed(strlen(reason), reason); + } if (m_fileReader.isCreated()) { char buf[FT_MAX_SENDING_SIZE]; @@ -403,13 +408,16 @@ FileTransfer::procFileDownloadDataMsg() void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime); + if (checkCancelOperations()) { + char reason[] = "The user cancel transfer"; + m_pWriter->writeFileDownloadCancel(strlen(reason), reason); + } + if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) { if (pFile != NULL) delete pFile; return false; } - if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs(); - if (bufSize > 0) { unsigned int bytesWritten = 0; m_fileWriter.write(pFile, bufSize, &bytesWritten); @@ -589,9 +597,36 @@ FileTransfer::isExistName(FileInfo *pFI, char *pName) return -1; } +bool +FileTransfer::checkCancelOperations() +{ + if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs(); + if (m_bCancel) { + endUndoneOperation(); + if (m_bFTDlgShown) { + m_pFTDialog->setStatusText("All Operations Canceled"); + } + return true; + } else { + return false; + } +} + +void +FileTransfer::endUndoneOperation() +{ + m_bCancel = false; + m_fileReader.close(); + m_fileWriter.close(); + freeQueues(); + m_dw64SizeSending = 0; + m_pFTDialog->m_pProgress->clearAll(); +} + void FileTransfer::freeQueues() { m_TransferQueue.free(); m_DeleteQueue.free(); + m_queueFileListRqst.free(); } diff --git a/vncviewer/FileTransfer.h b/vncviewer/FileTransfer.h index c2facd57..13908d39 100644 --- a/vncviewer/FileTransfer.h +++ b/vncviewer/FileTransfer.h @@ -60,9 +60,12 @@ namespace rfb { void checkTransferQueue(); void checkDeleteQueue(); + bool checkCancelOperations(); void uploadFilePortion(); + bool m_bCancel; + private: bool m_bFTDlgShown; bool m_bInitialized; @@ -87,6 +90,8 @@ namespace rfb { int isExistName(FileInfo *pFI, char *pName); void freeQueues(); + + void endUndoneOperation(); bool procFileListDataMsg(); bool procFileDownloadDataMsg(); -- 2.39.5