void HandleFileDownload(rfbClientPtr cl, rfbTightClientPtr rtcp) { pthread_t fileDownloadThread; FileTransferMsg fileDownloadMsg; memset(&fileDownloadMsg, 0, sizeof(FileTransferMsg)); fileDownloadMsg = ChkFileDownloadErr(cl, rtcp); if((fileDownloadMsg.data != NULL) && (fileDownloadMsg.length != 0)) { rfbWriteExact(cl, fileDownloadMsg.data, fileDownloadMsg.length); FreeFileTransferMsg(fileDownloadMsg); return; } rtcp->rcft.rcfd.downloadInProgress = FALSE; rtcp->rcft.rcfd.downloadFD = -1; if(pthread_create(&fileDownloadThread, NULL, RunFileDownloadThread, (void*) cl) != 0) { FileTransferMsg ftm = GetFileDownLoadErrMsg(); rfbLog("File [%s]: Method [%s]: Download thread creation failed\n", __FILE__, __FUNCTION__); if((ftm.data != NULL) && (ftm.length != 0)) { rfbWriteExact(cl, ftm.data, ftm.length); FreeFileTransferMsg(ftm); return; } } }
FileTransferMsg GetFileDownloadResponseMsgInBlocks(rfbClientPtr cl, rfbTightClientPtr rtcp) { /* const unsigned int sz_rfbBlockSize = SZ_RFBBLOCKSIZE; */ int numOfBytesRead = 0; char pBuf[SZ_RFBBLOCKSIZE]; char* path = rtcp->rcft.rcfd.fName; memset(pBuf, 0, SZ_RFBBLOCKSIZE); if((rtcp->rcft.rcfd.downloadInProgress == FALSE) && (rtcp->rcft.rcfd.downloadFD == -1)) { if((rtcp->rcft.rcfd.downloadFD = open(path, O_RDONLY)) == -1) { rfbLog("File [%s]: Method [%s]: Error: Couldn't open file\n", __FILE__, __FUNCTION__); return GetFileDownloadReadDataErrMsg(); } rtcp->rcft.rcfd.downloadInProgress = TRUE; } if((rtcp->rcft.rcfd.downloadInProgress == TRUE) && (rtcp->rcft.rcfd.downloadFD != -1)) { if( (numOfBytesRead = read(rtcp->rcft.rcfd.downloadFD, pBuf, SZ_RFBBLOCKSIZE)) <= 0) { close(rtcp->rcft.rcfd.downloadFD); rtcp->rcft.rcfd.downloadFD = -1; rtcp->rcft.rcfd.downloadInProgress = FALSE; if(numOfBytesRead == 0) { return CreateFileDownloadZeroSizeDataMsg(rtcp->rcft.rcfd.mTime); } return GetFileDownloadReadDataErrMsg(); } return CreateFileDownloadBlockSizeDataMsg(numOfBytesRead, pBuf); } return GetFileDownLoadErrMsg(); }