Added getDirSize() method to the FolderManager class.
Added checkTransferQueue() method to the File Transfer class.
Code improvements.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@419 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfb_win32/FolderManager.cxx b/rfb_win32/FolderManager.cxx
index 5e079d7..7eec8f9 100644
--- a/rfb_win32/FolderManager.cxx
+++ b/rfb_win32/FolderManager.cxx
@@ -211,3 +211,39 @@
   pftime->dwLowDateTime = (DWORD) ll;
   pftime->dwHighDateTime = (DWORD) (ll >> 32);
 }
+
+bool
+FolderManager::getDirSize(char *pFullPath, DWORD64 *dirSize)
+{
+  char fullPath[FT_FILENAME_SIZE];
+  FileInfo fi;
+  fi.add(pFullPath, 0, 0, FT_ATTR_DIR);
+  DWORD64 dirFileSize64 = 0;
+  do {
+    sprintf(fullPath, "%s\\*", fi.getNameAt(0));
+    WIN32_FIND_DATA FindFileData;
+    SetErrorMode(SEM_FAILCRITICALERRORS);
+    HANDLE hFile = FindFirstFile(fullPath, &FindFileData);
+    SetErrorMode(0);
+    
+    if (hFile != INVALID_HANDLE_VALUE) {
+      do {
+        if (strcmp(FindFileData.cFileName, ".") != 0 &&
+          strcmp(FindFileData.cFileName, "..") != 0) {
+          char buff[MAX_PATH];
+          if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {	
+            sprintf(buff, "%s\\%s", fi.getNameAt(0), FindFileData.cFileName);
+            fi.add(buff, 0, 0, FT_ATTR_DIR);
+          } else {
+            dirFileSize64 += FindFileData.nFileSizeLow;
+          }
+        }
+      } while (FindNextFile(hFile, &FindFileData));
+      FindClose(hFile);
+    }
+    fi.deleteAt(0);
+  } while (fi.getNumEntries() > 0);
+  
+  *dirSize = dirFileSize64;
+  return true;
+}
\ No newline at end of file
diff --git a/rfb_win32/FolderManager.h b/rfb_win32/FolderManager.h
index ea2a716..c7c086b 100644
--- a/rfb_win32/FolderManager.h
+++ b/rfb_win32/FolderManager.h
@@ -49,6 +49,8 @@
       unsigned int getTime70(FILETIME ftime);
       void getFiletime(unsigned int time70, FILETIME *pftime);
 
+      bool getDirSize(char *pFullPath, DWORD64 *dirSize);
+
     private:
       bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo);
     };
diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx
index 47e0c24..164de96 100644
--- a/vncviewer/FTDialog.cxx
+++ b/vncviewer/FTDialog.cxx
@@ -622,7 +622,11 @@
 }
 
 void 
-FTDialog::setStatusText(char *pText)
+FTDialog::setStatusText(LPCSTR format,...)
 {
-  SetDlgItemText(m_hwndFTDialog, IDC_FTSTATUS, pText);
+  char text[1024];
+  va_list args;
+  va_start(args, format);
+  int nSize = _vsnprintf(text, sizeof(text), format, args);
+  SetDlgItemText(m_hwndFTDialog, IDC_FTSTATUS, text);
 }
diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h
index 2c9ebfa..2e70db3 100644
--- a/vncviewer/FTDialog.h
+++ b/vncviewer/FTDialog.h
@@ -52,7 +52,9 @@
       void addRemoteLVItems(FileInfo *pFI);
       void reqFolderUnavailable();
 
-      void setStatusText(char *pText);
+      void setStatusText(LPCSTR format,...);
+
+      HWND getWndHandle() { return m_hwndFTDialog; }
 
       FTProgress *m_pProgress;
       
diff --git a/vncviewer/FileTransfer.cxx b/vncviewer/FileTransfer.cxx
index 2eacee3..5b01334 100644
--- a/vncviewer/FileTransfer.cxx
+++ b/vncviewer/FileTransfer.cxx
@@ -35,6 +35,9 @@
 
   m_pReader = NULL;
   m_pWriter = NULL;
+
+  m_dw64SizeSending = 0;
+  m_dirSizeRqstNum = 0;
 }
 
 FileTransfer::~FileTransfer()
@@ -108,7 +111,8 @@
   m_TransferQueue.add(pTransQueue);
 
   resizeSending();
-  
+
+  checkTransferQueue();
 }
 
 void 
@@ -123,6 +127,87 @@
 
 }
 
+void
+FileTransfer::checkTransferQueue()
+{
+  if (!isTransferEnable()) {
+    if (m_bFTDlgShown) {
+      m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
+      PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
+      PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
+      return;
+    }
+  } else {
+    for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
+      unsigned int flags = m_TransferQueue.getFlagsAt(i);
+      if (flags & FT_ATTR_RESIZE_NEEDED) {
+        if (flags & FT_ATTR_FILE) {
+          m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
+          m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
+        } else {
+          if (flags & FT_ATTR_DIR) {
+            if (flags & FT_ATTR_COPY_DOWNLOAD) {
+              char *pPath = m_TransferQueue.getFullRemPathAt(i);
+              m_dirSizeRqstNum = i;
+              m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
+              return;
+            } else {
+              if (flags & FT_ATTR_COPY_UPLOAD) {
+                FolderManager fm;
+                DWORD64 dw64Size;
+                fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
+                m_dw64SizeSending += dw64Size;
+                m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
+              }
+            } // if (flags & FT_ATTR_COPY_DOWNLOAD)
+          } // if (flags & FT_ATTR_FOLDER)
+        } // if (flags & FT_ATTR_FILE)
+      } // if (flags & FT_ATTR_NEEDED_RESIZE)
+    } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
+
+    unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
+    
+    if (flag0 & FT_ATTR_COPY_UPLOAD) {
+      if (flag0 & FT_ATTR_FILE) {
+          uploadFile();
+          return;
+      }
+      if (flag0 & FT_ATTR_DIR) {
+        char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
+        if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
+        m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
+
+        char *pPath = m_TransferQueue.getRemPathAt(0);
+        m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
+        m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
+        m_pWriter->writeFileListRqst(strlen(pPath), pPath, 0);
+        return;
+      }
+    } else {
+      if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
+        if (flag0 & FT_ATTR_FILE) {
+        }
+        if (flag0 & FT_ATTR_DIR) {
+        }
+      }
+    }
+    if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
+
+  } // if (!isTransferEnable())
+}
+
+bool
+FileTransfer::uploadFile()
+{
+  return false;
+}
+
+bool
+FileTransfer::downloadFile()
+{
+  return false;
+}
+
 bool 
 FileTransfer::procFileListDataMsg()
 {
@@ -183,7 +268,10 @@
 bool 
 FileTransfer::procFileDirSizeDataMsg()
 {
-  return false;
+  DWORD64 dw64DirSize = 0;
+  m_pReader->readFileDirSizeData(&dw64DirSize);
+  m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
+  return true;
 }
 
 bool 
diff --git a/vncviewer/FileTransfer.h b/vncviewer/FileTransfer.h
index 71ecf0a..53ebbb7 100644
--- a/vncviewer/FileTransfer.h
+++ b/vncviewer/FileTransfer.h
@@ -67,6 +67,10 @@
       FileInfo m_queueFileListRqst;
 
       TransferQueue m_TransferQueue;
+
+      void checkTransferQueue();
+      bool uploadFile();
+      bool downloadFile();
       
       bool procFileListDataMsg();
       bool procFileDownloadDataMsg();
@@ -81,6 +85,9 @@
       bool procFLRDownload(FileInfo *pFI);
       bool procFLRDelete(FileInfo *pFI);
       bool procFLRRename(FileInfo *pFI);
+
+      DWORD64 m_dw64SizeSending;
+      unsigned int m_dirSizeRqstNum;
       
     };
   }