aboutsummaryrefslogtreecommitdiffstats
path: root/rfb
diff options
context:
space:
mode:
authorDennis Syrovatsky <dennis@tightvnc.com>2005-12-18 15:58:33 +0000
committerDennis Syrovatsky <dennis@tightvnc.com>2005-12-18 15:58:33 +0000
commita10c27623444fd793a4340008f8e7b5365268560 (patch)
treec931af97f942c7f1a8994d6c5efb6e5e14684d38 /rfb
parent3db3c48caef9e26aa9d3134c080e70963fed7698 (diff)
downloadtigervnc-a10c27623444fd793a4340008f8e7b5365268560.tar.gz
tigervnc-a10c27623444fd793a4340008f8e7b5365268560.zip
Added all methods to the SFTMsgReader class.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@466 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'rfb')
-rw-r--r--rfb/SFTMsgReader.cxx95
-rw-r--r--rfb/SFTMsgReader.h9
2 files changed, 86 insertions, 18 deletions
diff --git a/rfb/SFTMsgReader.cxx b/rfb/SFTMsgReader.cxx
index 2ff437b0..3d9aeb2b 100644
--- a/rfb/SFTMsgReader.cxx
+++ b/rfb/SFTMsgReader.cxx
@@ -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;
+ }
}
diff --git a/rfb/SFTMsgReader.h b/rfb/SFTMsgReader.h
index d2536457..8eaf4299 100644
--- a/rfb/SFTMsgReader.h
+++ b/rfb/SFTMsgReader.h
@@ -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);
};
}