]> source.dussan.org Git - tigervnc.git/commitdiff
Added code for canceling file transfer.
authorDennis Syrovatsky <dennis@tightvnc.com>
Wed, 14 Dec 2005 11:03:19 +0000 (11:03 +0000)
committerDennis Syrovatsky <dennis@tightvnc.com>
Wed, 14 Dec 2005 11:03:19 +0000 (11:03 +0000)
Code improvements.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@445 3789f03b-4d11-0410-bbf8-ca57d06f2519

vncviewer/FTDialog.cxx
vncviewer/FTDialog.h
vncviewer/FileTransfer.cxx
vncviewer/FileTransfer.h

index d958f5b056d459c7dbe1d2dfff0c262eb964e102..a4fd9a684659557f1010d522f56875868a882c1c 100644 (file)
@@ -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 
index 0c833431a7b069169d82aafca0b447c8ccd9ae73..928c93dcd7c2db73829b48a7dd695055eaaeb8e3 100644 (file)
@@ -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;
index a0c1cf9678906b101ecfc1e311516f7d3ed7788c..5d074f3a38d7ddb2d59d569f444dfac0d2d1cd88 100644 (file)
@@ -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();
 }
index c2facd57d7fe8eb1b0ee94716e66d1b4c47d975f..13908d39bdb0d64f5c04386233f27b34e8832a5b 100644 (file)
@@ -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();