Big code evolution for file transfer feature.
Added methods to the TransferQueue class for flag managing.
Added upload() and download() methods to the FileTransfer class.
Reconstruction of FTProgress class.
Code improvements.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@418 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfb/TransferQueue.cxx b/rfb/TransferQueue.cxx
index 820ca68..58b9273 100644
--- a/rfb/TransferQueue.cxx
+++ b/rfb/TransferQueue.cxx
@@ -242,13 +242,32 @@
 TransferQueue::setFlagsAt(unsigned int number, unsigned int value)
 {
   if ((number >= 0) && (number < m_numEntries)) {
-    m_pEntries[number].info.flags = value;
+    m_pEntries[number].info.flags = m_pEntries[number].info.flags | value;
     return true;
   }
   return false;
 }
 
 bool 
+TransferQueue::clearFlagAt(unsigned int number, unsigned int value)
+{
+  if ((number >= 0) && (number < m_numEntries)) {
+    m_pEntries[number].info.flags = (m_pEntries[number].info.flags & (value ^ 0xFFFFFFFF));
+    return true;
+  }
+  return false;
+}
+
+bool 
+TransferQueue::setFlagToAll(unsigned int flag)
+{
+  for (unsigned int i = 0; i < m_numEntries; i++) {
+    setFlagsAt(i, flag);
+  }
+  return true;
+}
+
+bool 
 TransferQueue::deleteAt(unsigned int number)
 {
   if ((number >= m_numEntries) || (number < 0)) return false;
diff --git a/rfb/TransferQueue.h b/rfb/TransferQueue.h
index b12c058..02a043d 100644
--- a/rfb/TransferQueue.h
+++ b/rfb/TransferQueue.h
@@ -64,6 +64,8 @@
     bool setSizeAt(unsigned int number, unsigned int value);
     bool setDataAt(unsigned int number, unsigned int value);
     bool setFlagsAt(unsigned int number, unsigned int value);
+    bool clearFlagAt(unsigned int number, unsigned int value);
+    bool setFlagToAll(unsigned int flag);
     
     bool deleteAt(unsigned int number);
     
diff --git a/rfb/fttypes.h b/rfb/fttypes.h
index 229d44b..5b08fd0 100644
--- a/rfb/fttypes.h
+++ b/rfb/fttypes.h
@@ -30,9 +30,23 @@
 #define FT_MAX_STATUS_STRINGS		 255
 #define FT_MAX_LENGTH_STATUS_STRINGS 130
 
-#define FT_ATTR_UNKNOWN			0x00000000
-#define FT_ATTR_FILE			0x00000001
-#define FT_ATTR_DIR 			0x00000002
+#define FT_ATTR_UNKNOWN			    0x00000000
+#define FT_ATTR_FILE			    0x00000001
+#define FT_ATTR_DIR 			    0x00000002
+
+#define FT_ATTR_RESIZE_NEEDED	    0x00040000
+#define FT_ATTR_FOLDER_EXISTS	    0x00080000
+#define FT_ATTR_COPY_OVERWRITE	    0x00100000
+#define FT_ATTR_FLR_UPLOAD_CHECK	0x00200000
+#define FT_ATTR_FLR_UPLOAD_ADD	    0x00400000
+#define FT_ATTR_COPY_UPLOAD	        0x00800000
+#define FT_ATTR_FLR_DOWNLOAD_CHECK  0x01000000
+#define FT_ATTR_FLR_DOWNLOAD_ADD	0x02000000
+#define FT_ATTR_COPY_DOWNLOAD	    0x04000000
+#define FT_ATTR_DELETE_LOCAL	    0x08000000
+#define FT_ATTR_DELETE_REMOTE	    0x10000000
+#define FT_ATTR_RENAME_LOCAL	    0x20000000
+#define FT_ATTR_RENAME_REMOTE	    0x40000000
 
 #define FT_FLR_DEST_MAIN     101
 #define FT_FLR_DEST_BROWSE   102
diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx
index 72d9e28..47e0c24 100644
--- a/vncviewer/FTDialog.cxx
+++ b/vncviewer/FTDialog.cxx
@@ -102,8 +102,6 @@
   m_pLocalLV->initialize(m_hInstance);
   m_pRemoteLV->initialize(m_hInstance);
 
-  m_pProgress->initialize(0,0);
-
   m_hwndLocalPath = GetDlgItem(m_hwndFTDialog, IDC_FTLOCALPATH);
   m_hwndRemotePath = GetDlgItem(m_hwndFTDialog, IDC_FTREMOTEPATH);
 
@@ -597,13 +595,6 @@
     }
   }
   m_BtnState.cancelBtn = false;
-/*
-  if (m_pFileTransfer->isTransferEnable()) {
-    setAllButtonsState(-1, -1, -1, -1, 1);
-  } else {
-    setAllButtonsState(-1, -1, -1, -1, 0);
-  }
-*/
 }
 
 void
@@ -629,3 +620,9 @@
   case true: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
   }
 }
+
+void 
+FTDialog::setStatusText(char *pText)
+{
+  SetDlgItemText(m_hwndFTDialog, IDC_FTSTATUS, pText);
+}
diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h
index bfedf31..2c9ebfa 100644
--- a/vncviewer/FTDialog.h
+++ b/vncviewer/FTDialog.h
@@ -51,6 +51,10 @@
       
       void addRemoteLVItems(FileInfo *pFI);
       void reqFolderUnavailable();
+
+      void setStatusText(char *pText);
+
+      FTProgress *m_pProgress;
       
     private:
       FileTransfer *m_pFileTransfer;
@@ -102,8 +106,6 @@
       FTListView *m_pLocalLV;
       FTListView *m_pRemoteLV;
 
-      FTProgress *m_pProgress;
-
       int m_FTMenuSource;
 
       char m_szLocalPath[FT_FILENAME_SIZE];
diff --git a/vncviewer/FTProgress.cxx b/vncviewer/FTProgress.cxx
index 46316f0..95b4dd4 100644
--- a/vncviewer/FTProgress.cxx
+++ b/vncviewer/FTProgress.cxx
@@ -33,6 +33,11 @@
 
   m_pSingleProgress = NULL;
   m_pGeneralProgress = NULL;
+
+  m_hwndSinglePercent = GetDlgItem(m_hwndParent, IDC_FTSINGLEPERCENT);
+  m_hwndGeneralPercent = GetDlgItem(m_hwndParent, IDC_FTGENERALPERCENT);
+
+  m_bInitialized = createProgressBarObjects();
 }
 
 FTProgress::~FTProgress()
@@ -40,26 +45,6 @@
   destroyProgressBarObjects();
 }
 
-bool
-FTProgress::initialize(DWORD64 totalMaxValue, DWORD maxValue)
-{
-  m_bInitialized = false;
-
-  m_hwndSinglePercent = GetDlgItem(m_hwndParent, IDC_FTSINGLEPERCENT);
-  m_hwndGeneralPercent = GetDlgItem(m_hwndParent, IDC_FTGENERALPERCENT);
-
-  if ((m_hwndSinglePercent == NULL) || (m_hwndGeneralPercent == NULL)) return false;
- 
-  if (!createProgressBarObjects()) return false;
-
-  if (!initProgressControls(totalMaxValue, maxValue)) return false;
-
-  setProgressText();
-
-  m_bInitialized = true;
-  return true;
-}
-
 void
 FTProgress::increase(DWORD value)
 {
@@ -72,11 +57,23 @@
 }
 
 void
-FTProgress::clearSingle()
+FTProgress::clearAndInitGeneral(DWORD64 dw64MaxValue, DWORD64 dw64Position)
+{
+  if (!m_bInitialized) return;
+
+  m_pGeneralProgress->clear();
+  m_pGeneralProgress->init(dw64MaxValue, dw64Position);
+
+  setProgressText();
+}
+
+void
+FTProgress::clearAndInitSingle(DWORD dwMaxValue, DWORD dwPosition)
 {
   if (!m_bInitialized) return;
 
   m_pSingleProgress->clear();
+  m_pSingleProgress->init(dwMaxValue, dwPosition);
 
   setProgressText();
 }
@@ -130,22 +127,6 @@
   return true;
 }
 
-bool
-FTProgress::initProgressControls(DWORD64 totalMaxValue, DWORD maxValue)
-{
-  bool bResult = true;
-
-  if ((m_pSingleProgress != NULL) && (m_pGeneralProgress != NULL)) {
-    if (!m_pSingleProgress->init(totalMaxValue, 0)) return false;
-    if (!m_pGeneralProgress->init(maxValue, 0)) return false;
-  } else {
-    return false;
-  }
-
-  setProgressText();
-  return true;
-}
-
 void
 FTProgress::setProgressText()
 {
diff --git a/vncviewer/FTProgress.h b/vncviewer/FTProgress.h
index bcfb02c..c36c079 100644
--- a/vncviewer/FTProgress.h
+++ b/vncviewer/FTProgress.h
@@ -39,9 +39,9 @@
       FTProgress(HWND hwndParent);
       ~FTProgress();
       
-      bool initialize(DWORD64 totalMaxValue, DWORD maxValue);
       void increase(DWORD value);
-      void clearSingle();
+      void clearAndInitGeneral(DWORD64 dw64MaxValue, DWORD64 dw64Position);
+      void clearAndInitSingle(DWORD dwMaxValue, DWORD dwPosition);
       void clearAll();
 
     private:
@@ -54,8 +54,6 @@
 
       bool m_bInitialized;
 
-      bool initProgressControls(DWORD64 totalMaxValue, DWORD maxValue);
-
       void setProgressText();
       bool createProgressBarObjects();
       bool destroyProgressBarObjects();
diff --git a/vncviewer/FileTransfer.cxx b/vncviewer/FileTransfer.cxx
index 57e6763..2eacee3 100644
--- a/vncviewer/FileTransfer.cxx
+++ b/vncviewer/FileTransfer.cxx
@@ -53,6 +53,8 @@
   m_pReader = new FTMsgReader(pIS);
   m_pWriter = new FTMsgWriter(pOS);
 
+  m_TransferQueue.free();
+
   m_bInitialized = true;
   return true;
 }
@@ -91,6 +93,37 @@
 }
 
 bool 
+FileTransfer::isTransferEnable()
+{
+  if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
+}
+
+void 
+FileTransfer::upload(TransferQueue *pTransQueue)
+{
+  if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
+  
+  pTransQueue->setFlagToAll(FT_ATTR_RESIZE_NEEDED);
+  
+  m_TransferQueue.add(pTransQueue);
+
+  resizeSending();
+  
+}
+
+void 
+FileTransfer::download(TransferQueue *pTransQueue)
+{
+
+}
+
+void
+FileTransfer::resizeSending()
+{
+
+}
+
+bool 
 FileTransfer::procFileListDataMsg()
 {
   FileInfo fileInfo;
diff --git a/vncviewer/FileTransfer.h b/vncviewer/FileTransfer.h
index 805c10e..71ecf0a 100644
--- a/vncviewer/FileTransfer.h
+++ b/vncviewer/FileTransfer.h
@@ -49,6 +49,12 @@
 
       void requestFileList(char *pPath, int dest, bool bDirOnly);
 
+      void upload(TransferQueue *pTransQueue);
+      void download(TransferQueue *pTransQueue);
+
+      bool isTransferEnable();
+      void resizeSending();
+
     private:
       bool m_bFTDlgShown;
       bool m_bInitialized;
@@ -59,6 +65,8 @@
       FTMsgWriter *m_pWriter;
 
       FileInfo m_queueFileListRqst;
+
+      TransferQueue m_TransferQueue;
       
       bool procFileListDataMsg();
       bool procFileDownloadDataMsg();
diff --git a/vncviewer/vncviewer.rc b/vncviewer/vncviewer.rc
index a878beb..ff8ea04 100644
--- a/vncviewer/vncviewer.rc
+++ b/vncviewer/vncviewer.rc
@@ -33,20 +33,12 @@
 CAPTION "TightVNC File Transfers"
 FONT 8, "MS Sans Serif"
 BEGIN
-    EDITTEXT        IDC_FTLOCALPATH,7,20,155,12,ES_AUTOHSCROLL
     CONTROL         "List1",IDC_FTLOCALLIST,"SysListView32",LVS_REPORT | 
                     LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | 
                     WS_TABSTOP,7,40,200,196
-    PUSHBUTTON      "...",IDC_FTLOCALBROWSE,165,20,14,12
-    PUSHBUTTON      "",IDC_FTLOCALUP,179,20,14,12,BS_ICON
-    PUSHBUTTON      "",IDC_FTLOCALRELOAD,193,20,14,12,BS_ICON
-    EDITTEXT        IDC_FTREMOTEPATH,323,20,155,12,ES_AUTOHSCROLL
     CONTROL         "List2",IDC_FTREMOTELIST,"SysListView32",LVS_REPORT | 
                     LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | 
                     WS_TABSTOP,323,40,200,196
-    PUSHBUTTON      "...",IDC_FTREMOTEBROWSE,481,20,14,12
-    PUSHBUTTON      "",IDC_FTREMOTEUP,495,20,14,12,BS_ICON
-    PUSHBUTTON      "",IDC_FTREMOTERELOAD,509,20,14,12,BS_ICON
     PUSHBUTTON      "Upload Files and Folders",IDC_FTUPLOAD,218,66,94,12,
                     WS_DISABLED
     PUSHBUTTON      "Download Files and Folders",IDC_FTDOWNLOAD,218,85,94,12,
@@ -54,16 +46,28 @@
     PUSHBUTTON      "Cancel File Transfer",IDC_FTCANCEL,218,167,94,12,
                     WS_DISABLED
     PUSHBUTTON      "Close File Transfers",IDC_FTCLOSE,218,217,94,12
-    COMBOBOX        IDC_FTSTATUS,7,262,516,30,CBS_DROPDOWNLIST | CBS_SORT | 
-                    WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_FTLOCALPATH,7,20,155,12,ES_AUTOHSCROLL | NOT 
+                    WS_TABSTOP
     CTEXT           "Local Computer",IDC_FTLOCALLABEL,7,7,200,10
-    CTEXT           "TightVNC Server",IDC_FTREMOTELABEL,323,7,200,10
-    LTEXT           "File Transfer",IDC_STATIC,7,245,40,8
-    LTEXT           "Current File",IDC_STATIC,323,245,36,8
+    PUSHBUTTON      "...",IDC_FTLOCALBROWSE,165,20,14,12,NOT WS_TABSTOP
+    PUSHBUTTON      "",IDC_FTLOCALUP,179,20,14,12,BS_ICON | NOT WS_TABSTOP
+    PUSHBUTTON      "",IDC_FTLOCALRELOAD,193,20,14,12,BS_ICON | NOT 
+                    WS_TABSTOP
     CONTROL         "Progress1",IDC_FTGENERALPROGRESS,"msctls_progress32",
                     WS_BORDER,55,244,128,10
+    LTEXT           "File Transfer",IDC_STATIC,7,245,40,8
+    COMBOBOX        IDC_FTSTATUS,7,262,516,30,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL
     CONTROL         "Progress1",IDC_FTSINGLEPROGRESS,"msctls_progress32",
                     WS_BORDER,370,244,128,10
+    EDITTEXT        IDC_FTREMOTEPATH,323,20,155,12,ES_AUTOHSCROLL | NOT 
+                    WS_TABSTOP
+    PUSHBUTTON      "...",IDC_FTREMOTEBROWSE,481,20,14,12,NOT WS_TABSTOP
+    PUSHBUTTON      "",IDC_FTREMOTEUP,495,20,14,12,BS_ICON | NOT WS_TABSTOP
+    PUSHBUTTON      "",IDC_FTREMOTERELOAD,509,20,14,12,BS_ICON | NOT 
+                    WS_TABSTOP
+    CTEXT           "TightVNC Server",IDC_FTREMOTELABEL,323,7,200,10
+    LTEXT           "Current File",IDC_STATIC,323,245,36,8
     CTEXT           "0%",IDC_FTGENERALPERCENT,189,245,18,8
     CTEXT           "0%",IDC_FTSINGLEPERCENT,505,245,18,8
 END