Changed FTMsgReader::readFileDownloadData() method.
Added the FileTransfer::downloadFile() method.
Added the FileTransfer::procFileDownloadDataMsg().
Code improvements.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@440 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfb/CMsgReaderV3.cxx b/rfb/CMsgReaderV3.cxx
index b8242a0..9370804 100644
--- a/rfb/CMsgReaderV3.cxx
+++ b/rfb/CMsgReaderV3.cxx
@@ -58,8 +58,15 @@
     case msgTypeSetColourMapEntries: readSetColourMapEntries(); break;
     case msgTypeBell:                readBell(); break;
     case msgTypeServerCutText:       readServerCutText(); break;
+
     case msgTypeFileListData:
+    case msgTypeFileDownloadData:
+    case msgTypeFileUploadCancel:
+    case msgTypeFileDownloadFailed:
+    case msgTypeFileDirSizeData:
+    case msgTypeFileLastRequestFailed:
       handler->processFTMsg(type); break;
+
     default:
       fprintf(stderr, "unknown message type %d\n", type);
       throw Exception("unknown message type");
diff --git a/rfb/FileManager.cxx b/rfb/FileManager.cxx
index 1bd3ab6..44d7890 100644
--- a/rfb/FileManager.cxx
+++ b/rfb/FileManager.cxx
@@ -43,7 +43,7 @@
   strcpy(m_szFilename, pFilename);
 
   m_pFile = fopen(m_szFilename, m_szMode);
-  
+
   if (m_pFile == NULL) {
     return false;
   } else {
diff --git a/rfb/FileReader.cxx b/rfb/FileReader.cxx
index 13c677f..063b742 100644
--- a/rfb/FileReader.cxx
+++ b/rfb/FileReader.cxx
@@ -33,7 +33,7 @@
 bool 
 FileReader::read(void *pBuf, unsigned int count, unsigned int *pBytesRead)
 {
-  if (m_pFile == NULL) return false;
+  if (!isCreated()) return false;
 
   *pBytesRead = fread(pBuf, 1, count, m_pFile);
   
@@ -41,3 +41,9 @@
  
   return true;
 }
+
+unsigned int 
+FileReader::getTime()
+{
+  return 0;
+}
diff --git a/rfb/FileReader.h b/rfb/FileReader.h
index e6ec064..12cdfa1 100644
--- a/rfb/FileReader.h
+++ b/rfb/FileReader.h
@@ -32,6 +32,8 @@
     FileReader();
 
     bool read(void *pBuf, unsigned int count, unsigned int *pBytesRead);
+
+    unsigned int getTime();
   };
 }
 #endif // __RFB_FILEREADER_H__
diff --git a/rfb/FileWriter.cxx b/rfb/FileWriter.cxx
index 9d8c4a5..9c06c37 100644
--- a/rfb/FileWriter.cxx
+++ b/rfb/FileWriter.cxx
@@ -33,7 +33,7 @@
 bool 
 FileWriter::write(const void *pBuf, unsigned int count, unsigned int *pBytesWritten)
 {
-  if (m_pFile == NULL) return false;
+  if (!isCreated()) return false;
 
   unsigned int bytesWritten = fwrite(pBuf, 1, count, m_pFile);
 
@@ -42,3 +42,9 @@
   *pBytesWritten = bytesWritten;
   return true;
 }
+
+bool 
+FileWriter::setTime(unsigned int modTime)
+{
+  return false;
+}
diff --git a/rfb/FileWriter.h b/rfb/FileWriter.h
index 3b3318a..e522ae1 100644
--- a/rfb/FileWriter.h
+++ b/rfb/FileWriter.h
@@ -32,6 +32,7 @@
     FileWriter();
 
     bool write(const void *pBuf, unsigned int count, unsigned int *pBytesWritten);
+    bool setTime(unsigned int modTime);
   };
 }
 
diff --git a/vncviewer/FTMsgReader.cxx b/vncviewer/FTMsgReader.cxx
index e3652d0..7f0c330 100644
--- a/vncviewer/FTMsgReader.cxx
+++ b/vncviewer/FTMsgReader.cxx
@@ -63,24 +63,27 @@
   return numFiles;
 }
 
-int 
-FTMsgReader::readFileDownloadData(void *pFile, unsigned int *pModTime)
+void * 
+FTMsgReader::readFileDownloadData(unsigned int *pSize, unsigned int *pModTime)
 {
   unsigned char compressLevel = m_pInStream->readU8();
   int realSize = m_pInStream->readU16();
   int compressedSize = m_pInStream->readU16();
 
   if ((realSize == 0) && (compressedSize == 0)) {
+    *pSize = 0;
     *pModTime = m_pInStream->readU32();
-    return 0;
+    return NULL;
   } else {
-    pFile = malloc(compressedSize);
+    char *pFile = new char [compressedSize];
     if (pFile == NULL) {
       m_pInStream->skip(compressedSize);
-      return -1;
+      *pModTime = 0;
+      return NULL;
     } else {
       m_pInStream->readBytes(pFile, compressedSize);
-      return compressedSize;
+      *pSize = compressedSize;
+      return pFile;
     }
   }
 }
diff --git a/vncviewer/FTMsgReader.h b/vncviewer/FTMsgReader.h
index 549dc0c..ed51d51 100644
--- a/vncviewer/FTMsgReader.h
+++ b/vncviewer/FTMsgReader.h
@@ -38,11 +38,11 @@
       ~FTMsgReader();
 
       int readFileListData(FileInfo *pFileInfo);
-      int readFileDownloadData(void *pFile, unsigned int *pModTime);
       int readFileUploadCancel(void *pReason);
       int readFileDownloadFailed(void *pReason);
       int readFileDirSizeData(DWORD64 *pdw64DirSize);
       int readFileLastRqstFailed(int *pTypeOfRequest, void *pReason);
+      void *readFileDownloadData(unsigned int *pSize, unsigned int *pModTime);
       
     private:
       rdr::InStream *m_pInStream;
diff --git a/vncviewer/FileTransfer.cxx b/vncviewer/FileTransfer.cxx
index 9319519..f607bbb 100644
--- a/vncviewer/FileTransfer.cxx
+++ b/vncviewer/FileTransfer.cxx
@@ -244,7 +244,6 @@
             char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
             m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
             m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
-            m_TransferQueue.deleteAt(0);
             return;
           }
         }
@@ -270,6 +269,13 @@
 bool
 FileTransfer::downloadFile()
 {
+  if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
+    if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
+      m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
+                                       m_TransferQueue.getFullRemPathAt(0), 0);
+      return true;
+    } else return false;
+  }
   return false;
 }
 
@@ -345,6 +351,43 @@
 bool 
 FileTransfer::procFileDownloadDataMsg()
 {
+  unsigned int bufSize = 0;
+  unsigned int modTime = 0;
+
+  void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
+
+  if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
+    if (pFile != NULL) delete pFile;
+    return false;
+  }
+
+  if (bufSize > 0) {
+    unsigned int bytesWritten = 0;
+    m_fileWriter.write(pFile, bufSize, &bytesWritten);
+    delete pFile;
+    if (bytesWritten != bufSize) {
+      char reason[] = "Error File Writting";
+      m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
+      m_TransferQueue.deleteAt(0);
+      m_pFTDialog->postCheckTransferQueueMsg();
+      return false;
+    }
+    return true;
+  } else {
+    if (modTime != 0) {
+      m_fileWriter.setTime(modTime);
+      m_fileWriter.close();
+      m_TransferQueue.deleteAt(0);
+      m_pFTDialog->postCheckTransferQueueMsg();
+      return true;
+    } else {
+      m_fileWriter.close();
+      char reason[] = "Error File Writting";
+      m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
+      m_TransferQueue.deleteAt(0);
+      m_pFTDialog->postCheckTransferQueueMsg();
+    }
+  }
   return false;
 }
 
@@ -430,8 +473,8 @@
   unsigned int flags = m_TransferQueue.getFlagsAt(0);
   
   if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
-    m_TransferQueue.add(m_TransferQueue.getLocPathAt(0), 
-                        m_TransferQueue.getRemPathAt(0), 
+    m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0), 
+                        m_TransferQueue.getFullRemPathAt(0), 
                         pFI, FT_ATTR_COPY_DOWNLOAD);
     m_TransferQueue.deleteAt(0);
     m_pFTDialog->postCheckTransferQueueMsg();