aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vncviewer/FTDialog.cxx48
-rw-r--r--vncviewer/FTDialog.h4
-rw-r--r--vncviewer/FileTransfer.cxx41
-rw-r--r--vncviewer/FileTransfer.h5
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();