]> source.dussan.org Git - tigervnc.git/commitdiff
Added all methods to the SFTMsgReader class.
authorDennis Syrovatsky <dennis@tightvnc.com>
Sun, 18 Dec 2005 15:58:33 +0000 (15:58 +0000)
committerDennis Syrovatsky <dennis@tightvnc.com>
Sun, 18 Dec 2005 15:58:33 +0000 (15:58 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@466 3789f03b-4d11-0410-bbf8-ca57d06f2519

rfb/SFTMsgReader.cxx
rfb/SFTMsgReader.h

index 2ff437b08eb42e170b656800aa6f1576371ab3f3..3d9aeb2ba1715dc4b418175f23ae9a94d4ff9863 100644 (file)
@@ -36,47 +36,74 @@ SFTMsgReader::~SFTMsgReader()
     
 bool 
 SFTMsgReader::readFileListRqst(unsigned int *pDirNameSize, char *pDirName, 
-                               unsigned int *pFlags, bool *bDirOnly)
+                               unsigned int *pFlags)
 {
-  return false;
+  *pFlags = m_pIS->readU8();
+  unsigned int dirNameSize = m_pIS->readU16();
+
+  if (dirNameSize >= FT_FILENAME_SIZE) {
+    m_pIS->skip(dirNameSize);
+    return false;
+  } else {
+    m_pIS->readBytes(pDirName, dirNameSize);
+    *pDirNameSize = dirNameSize;
+    pDirName[dirNameSize] = '\0';
+    return true;
+  }
 }
     
 bool 
 SFTMsgReader::readFileDownloadRqst(unsigned int *pFilenameSize, char *pFilename, 
                                    unsigned int *pPosition)
 {
-  return false;
+  unsigned char compressedLevel = 0;
+  return readU8U16U32StringMsg(&compressedLevel, pFilenameSize, pPosition, pFilename);
 }
 
 bool 
 SFTMsgReader::readFileUploadRqst(unsigned int *pFilenameSize, char *pFilename, 
                                  unsigned int *pPosition)
 {
-  return false;
+  unsigned char compressedLevel = 0;
+  return readU8U16U32StringMsg(&compressedLevel, pFilenameSize, pPosition, pFilename);
 }
     
 void *
 SFTMsgReader::readFileUploadData(unsigned int *pDataSize, unsigned int *pModTime)
 {
-  return NULL;
+  unsigned char compressedLevel = m_pIS->readU8();
+  unsigned int realSize = m_pIS->readU16();
+  unsigned int compressedSize = m_pIS->readU16();
+
+  if ((realSize == 0) && (compressedSize == 0)) {
+    *pDataSize = 0;
+    *pModTime = m_pIS->readU32();
+    return NULL;
+  } else {
+    char *pData = new char [compressedSize];
+    m_pIS->readBytes(pData, compressedSize);
+    *pDataSize = compressedSize;
+    *pModTime = 0;
+    return pData;
+  }
 }
     
 bool 
 SFTMsgReader::readFileCreateDirRqst(unsigned int *pDirNameSize, char *pDirName)
 {
-  return false;
+  return readU8U16StringMsg(pDirNameSize, pDirName);
 }
 
 bool 
 SFTMsgReader::readFileDirSizeRqst(unsigned int *pDirNameSize, char *pDirName)
 {
-  return false;
+  return readU8U16StringMsg(pDirNameSize, pDirName);
 }
 
 bool 
 SFTMsgReader::readFileDeleteRqst(unsigned int *pNameSize, char *pName)
 {
-  return false;
+  return readU8U16StringMsg(pNameSize, pName);
 }
     
 bool readFileRenameRqst(unsigned int *pOldNameSize, unsigned int *pNewNameSize,
@@ -85,20 +112,58 @@ bool readFileRenameRqst(unsigned int *pOldNameSize, unsigned int *pNewNameSize,
   return false;
 }
 
-char *
-SFTMsgReader::readFileDownloadCancel(unsigned int *pReasonSize)
+bool
+SFTMsgReader::readFileDownloadCancel(unsigned int *pReasonSize, char *pReason)
 {
-  return NULL;
+  return readU8U16StringMsg(pReasonSize, pReason);
 }
 
-char *
-SFTMsgReader::readFileUploadFailed(unsigned int *pReasonSize)
+bool
+SFTMsgReader::readFileUploadFailed(unsigned int *pReasonSize, char *pReason)
 {
-  return NULL;
+  return readU8U16StringMsg(pReasonSize, pReason);
 }
 
 bool 
 SFTMsgReader::readU8U16StringMsg(unsigned int *pReasonSize, char *pReason)
 {
-  return false;
+  m_pIS->skip(1);
+  unsigned int reasonSize = m_pIS->readU16();
+
+  if (reasonSize >= FT_FILENAME_SIZE) {
+    m_pIS->skip(reasonSize);
+    return false;
+  } else {
+    if (reasonSize == 0) {
+      pReason[0] = '\0';
+    } else {
+      m_pIS->readBytes(pReason, reasonSize);
+      pReason[reasonSize] = '\0';
+    }
+      *pReasonSize = reasonSize;
+    return true;
+  }
+}
+
+bool 
+SFTMsgReader::readU8U16U32StringMsg(unsigned char *pU8, unsigned int *pU16, 
+                                    unsigned int *pU32, char *pString)
+{
+  *pU8 = m_pIS->readU8();
+  unsigned int strSize = m_pIS->readU16();
+  *pU32 = m_pIS->readU32();
+
+  if (strSize >= FT_FILENAME_SIZE) {
+    m_pIS->skip(strSize);
+    return false;
+  } else {
+    *pU16 = strSize;
+    if (strSize == 0) {
+      pString[0] = '\0';
+    } else {
+      m_pIS->readBytes(pString, strSize);
+      pString[strSize] = '\0';
+    }
+    return true;
+  }
 }
index d25364575d1ba60b02abbfbb01a8c464ba5ec0b1..8eaf4299fc6a93d977ed8025e51f5c5cc6ad9ff5 100644 (file)
@@ -25,6 +25,7 @@
 #define __RFB_SFTMSGREADER_H__
 
 #include <rdr/InStream.h>
+#include <rfb/fttypes.h>
 
 namespace rfb {
   class SFTMsgReader
@@ -34,7 +35,7 @@ namespace rfb {
     ~SFTMsgReader();
     
     bool readFileListRqst(unsigned int *pDirNameSize, char *pDirName, 
-                          unsigned int *pFlags, bool *bDirOnly);
+                          unsigned int *pFlags);
     
     
     bool readFileDownloadRqst(unsigned int *pFilenameSize, char *pFilename, 
@@ -53,13 +54,15 @@ namespace rfb {
     bool readFileRenameRqst(unsigned int *pOldNameSize, unsigned int *pNewNameSize,
                             char *pOldName, char *pNewName);
 
-    char *readFileDownloadCancel(unsigned int *pReasonSize);
-    char *readFileUploadFailed(unsigned int *pReasonSize);
+    bool readFileDownloadCancel(unsigned int *pReasonSize, char *pReason);
+    bool readFileUploadFailed(unsigned int *pReasonSize, char *pReason);
 
   private:
     rdr::InStream *m_pIS;
 
     bool readU8U16StringMsg(unsigned int *pReasonSize, char *pReason);
+    bool readU8U16U32StringMsg(unsigned char *pU8, unsigned int *pU16, 
+                               unsigned int *pU32, char *pString);
   };
 }