| /* Copyright (C) 2005 TightVNC Team. All Rights Reserved. |
| * |
| * Developed by Dennis Syrovatsky. |
| * |
| * This is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This software is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this software; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
| * USA. |
| * |
| * |
| * |
| */ |
| |
| // -=- CFTMsgReader.cxx |
| |
| #include <rfb/CFTMsgReader.h> |
| |
| using namespace rfb; |
| |
| CFTMsgReader::CFTMsgReader(rdr::InStream *pIS) |
| { |
| m_pInStream = pIS; |
| } |
| |
| CFTMsgReader::~CFTMsgReader() |
| { |
| |
| } |
| |
| int |
| CFTMsgReader::readFileListData(FileInfo *pFileInfo) |
| { |
| unsigned char flags = m_pInStream->readU8(); |
| int numFiles = m_pInStream->readU16(); |
| int dataSize = m_pInStream->readU16(); |
| int compressedSize = m_pInStream->readU16(); |
| |
| if (flags & 0x80) { |
| return -1; |
| } else { |
| if (numFiles > 0) { |
| char *pFilenames = new char[compressedSize]; |
| SIZEDATAINFO *pSDI = new SIZEDATAINFO[numFiles]; |
| for (int i = 0; i < numFiles; i++) { |
| pSDI[i].size = m_pInStream->readU32(); |
| pSDI[i].data = m_pInStream->readU32(); |
| } |
| m_pInStream->readBytes((void *)pFilenames, compressedSize); |
| createFileInfo(numFiles, pFileInfo, pSDI, pFilenames); |
| delete [] pSDI; |
| delete [] pFilenames; |
| } |
| } |
| return numFiles; |
| } |
| |
| void * |
| CFTMsgReader::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 NULL; |
| } else { |
| char *pFile = new char [compressedSize]; |
| if (pFile == NULL) { |
| m_pInStream->skip(compressedSize); |
| *pModTime = 0; |
| return NULL; |
| } else { |
| m_pInStream->readBytes(pFile, compressedSize); |
| *pSize = compressedSize; |
| return pFile; |
| } |
| } |
| } |
| |
| char * |
| CFTMsgReader::readFileUploadCancel(unsigned int *pReasonSize) |
| { |
| m_pInStream->skip(1); |
| return readReasonMsg(pReasonSize); |
| } |
| |
| char * |
| CFTMsgReader::readFileDownloadFailed(unsigned int *pReasonSize) |
| { |
| m_pInStream->skip(1); |
| return readReasonMsg(pReasonSize); |
| } |
| |
| int |
| CFTMsgReader::readFileDirSizeData(unsigned short *pDirSizeLow16, |
| unsigned int *pDirSizeHigh32) |
| { |
| m_pInStream->skip(1); |
| *pDirSizeLow16 = m_pInStream->readU16(); |
| *pDirSizeHigh32 = m_pInStream->readU32(); |
| return 1; |
| } |
| |
| char * |
| CFTMsgReader::readFileLastRqstFailed(int *pTypeOfRequest, unsigned int *pReasonSize) |
| { |
| *pTypeOfRequest = m_pInStream->readU8(); |
| return readReasonMsg(pReasonSize); |
| } |
| |
| bool |
| CFTMsgReader::createFileInfo(unsigned int numFiles, FileInfo *fi, |
| SIZEDATAINFO *pSDInfo, char *pFilenames) |
| { |
| int pos = 0; |
| int size = 0; |
| for (unsigned int i = 0; i < numFiles; i++) { |
| size = pSDInfo[i].size; |
| if (size == FT_NET_ATTR_DIR) { |
| fi->add((pFilenames + pos), size, pSDInfo[i].data, FT_ATTR_DIR); |
| } else { |
| fi->add((pFilenames + pos), size, pSDInfo[i].data, FT_ATTR_FILE); |
| } |
| pos += strlen(pFilenames + pos) + 1; |
| } |
| return true; |
| } |
| |
| char * |
| CFTMsgReader::readReasonMsg(unsigned int *pReasonSize) |
| { |
| int reasonLen = m_pInStream->readU16(); |
| int _reasonLen = reasonLen + 1; |
| char *pReason; |
| if (reasonLen == 0) { |
| *pReasonSize = 0; |
| return NULL; |
| } else { |
| pReason = new char [_reasonLen]; |
| if (pReason == NULL) { |
| m_pInStream->skip(reasonLen); |
| *pReasonSize = 0; |
| return NULL; |
| } |
| m_pInStream->readBytes(pReason, reasonLen); |
| memset(((char *)pReason+reasonLen), '\0', 1); |
| return pReason; |
| } |
| } |
| |