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/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();