blob: 44c527b56f081b885c1cbfe2df9f2b4f68b41427 [file] [log] [blame]
/* 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.
*
*
*
*/
// -=- FileTransfer.cxx
#include <vncviewer/FileTransfer.h>
using namespace rfb;
using namespace rfb::win32;
FileTransfer::FileTransfer()
{
m_bFTDlgShown = false;
m_bInitialized = false;
m_bResized = false;
m_bCancel = false;
m_bOverwriteAll = false;
m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
m_pReader = NULL;
m_pWriter = NULL;
m_dw64SizeSending = 0;
m_dirSizeRqstNum = 0;
}
FileTransfer::~FileTransfer()
{
if (m_pFTDialog != NULL) {
delete m_pFTDialog;
m_pFTDialog = NULL;
}
if (m_pReader != NULL) {
delete m_pReader;
m_pReader = NULL;
}
if (m_pWriter != NULL) {
delete m_pWriter;
m_pWriter = NULL;
}
freeQueues();
}
bool
FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
{
if (m_bInitialized) return false;
m_pReader = new CFTMsgReader(pIS);
m_pWriter = new CFTMsgWriter(pOS);
freeQueues();
m_bInitialized = true;
return true;
}
bool
FileTransfer::show(HWND hwndParent)
{
if (!m_bInitialized) return false;
m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
return m_bFTDlgShown;
}
bool
FileTransfer::processFTMsg(int type)
{
if (!m_bInitialized) return false;
switch (type)
{
case msgTypeFileListData:
return procFileListDataMsg();
case msgTypeFileDownloadData:
return procFileDownloadDataMsg();
case msgTypeFileUploadCancel:
return procFileUploadCancelMsg();
case msgTypeFileDownloadFailed:
return procFileDownloadFailedMsg();
case msgTypeFileDirSizeData:
return procFileDirSizeDataMsg();
case msgTypeFileLastRequestFailed:
return procFileLastRqstFailedMsg();
default:
return false;
}
}
bool
FileTransfer::isTransferEnable()
{
if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
}
void
FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
{
if ((m_bFTDlgShown) && (m_DeleteQueue.getNumEntries() > 0))
m_pFTDialog->setStatusText("Starting Delete Operation");
m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
checkDeleteQueue();
}
void
FileTransfer::checkDeleteQueue()
{
if (m_DeleteQueue.getNumEntries() > 0) {
if (m_bFTDlgShown)
m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
FolderManager fm;
if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
} else {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
}
m_DeleteQueue.deleteAt(0);
m_pFTDialog->postCheckDeleteQueueMsg();
} else {
if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
m_DeleteQueue.getFullLocPathAt(0));
char *pPath = m_DeleteQueue.getLocPathAt(0);
m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
writeFileListRqst(strlen(pPath), pPath, false);
}
}
} else {
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
}
}
}
void
FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
FileInfo *pFI, unsigned int flags)
{
if (!isTransferEnable()) {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Starting Copy Operation");
m_bTransferSuccess = true;
}
m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
checkTransferQueue();
}
bool
FileTransfer::resizeSending()
{
for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
unsigned int flags = m_TransferQueue.getFlagsAt(i);
if (flags & FT_ATTR_RESIZE_NEEDED) {
if (flags & FT_ATTR_FILE) {
m_bResized = true;
m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
} else {
if (flags & FT_ATTR_DIR) {
if (flags & FT_ATTR_COPY_DOWNLOAD) {
m_bResized = true;
char *pPath = m_TransferQueue.getFullRemPathAt(i);
m_dirSizeRqstNum = i;
writeFileDirSizeRqst(strlen(pPath), pPath);
return false;
} else {
if (flags & FT_ATTR_COPY_UPLOAD) {
FolderManager fm;
DWORD64 dw64Size;
m_bResized = true;
fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
m_dw64SizeSending += dw64Size;
m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
}
} // if (flags & FT_ATTR_COPY_DOWNLOAD)
} // if (flags & FT_ATTR_FOLDER)
} // if (flags & FT_ATTR_FILE)
} // if (flags & FT_ATTR_NEEDED_RESIZE)
} // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
if ((m_bFTDlgShown) && (m_bResized)) {
m_pFTDialog->m_pProgress->clearAndInitGeneral(m_dw64SizeSending, 0);
m_bResized = false;
}
return true;
}
void
FileTransfer::checkTransferQueue()
{
if (!isTransferEnable()) {
if (m_bFTDlgShown) {
m_pFTDialog->m_pProgress->clearAll();
m_dw64SizeSending = 0;
m_bResized = false;
if (m_bTransferSuccess)
m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
else
m_pFTDialog->setStatusText("File Transfer Operation Completed");
m_pFTDialog->afterCancelTransfer();
PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
return;
}
} else {
if (!resizeSending()) return;
unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
if (flag0 & FT_ATTR_COPY_UPLOAD) {
if (flag0 & FT_ATTR_FILE) {
uploadFile();
return;
}
if (flag0 & FT_ATTR_DIR) {
char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
char *pPath = m_TransferQueue.getRemPathAt(0);
m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
writeFileListRqst(strlen(pPath), pPath, false);
return;
}
} else {
if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
if (flag0 & FT_ATTR_FILE) {
downloadFile();
return;
}
if (flag0 & FT_ATTR_DIR) {
FolderManager fm;
char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
if (!fm.createDir(pLocPath)) {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
m_bTransferSuccess = false;
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
return;
} else {
if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
writeFileListRqst(strlen(pRemPath), pRemPath, 0);
return;
}
}
}
}
m_bTransferSuccess = false;
if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
} // if (!isTransferEnable())
}
bool
FileTransfer::uploadFile()
{
if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Upload Started: %s to %s",
m_TransferQueue.getFullLocPathAt(0),
m_TransferQueue.getFullRemPathAt(0));
m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
}
writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
m_TransferQueue.getFullRemPathAt(0), 0);
uploadFilePortion();
}
}
return false;
}
bool
FileTransfer::downloadFile()
{
if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Download Started: %s to %s",
m_TransferQueue.getFullRemPathAt(0),
m_TransferQueue.getFullLocPathAt(0));
m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
}
writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
m_TransferQueue.getFullRemPathAt(0), 0);
return true;
} else return false;
}
return false;
}
void
FileTransfer::uploadFilePortion()
{
if (checkCancelOperations()) {
char reason[] = "The user cancel transfer";
m_pWriter->writeFileUploadFailed(strlen(reason), reason);
}
if (m_fileReader.isCreated()) {
char buf[FT_MAX_SENDING_SIZE];
unsigned int bytesRead = 0;
if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
if (bytesRead == 0) {
m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
m_fileReader.close();
if (m_bFTDlgShown) {
m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
m_pFTDialog->setStatusText("Upload Completed");
}
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
} else {
if (m_bFTDlgShown) m_pFTDialog->m_pProgress->increase(bytesRead);
m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
m_pFTDialog->postUploadFilePortionMsg();
}
} else {
m_fileReader.close();
m_bTransferSuccess = false;
char reason[] = "Error While Reading File";
m_pWriter->writeFileUploadFailed(strlen(reason), reason);
if (m_bFTDlgShown) {
m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
m_pFTDialog->setStatusText("Upload Failed");
}
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
}
}
}
void
FileTransfer::createRemoteFolder(char *pPath, char *pName)
{
char fullPath[FT_FILENAME_SIZE];
sprintf(fullPath, "%s\\%s", pPath, pName);
m_pFTDialog->setStatusText("Creating Remote Folder: %s", fullPath);
writeFileCreateDirRqst(strlen(fullPath), fullPath);
requestFileList(pPath, FT_FLR_DEST_MAIN, false);
}
void
FileTransfer::renameRemote(char *pPath, char *pOldName, char *pNewName)
{
char fullOldName[FT_FILENAME_SIZE];
char fullNewName[FT_FILENAME_SIZE];
sprintf(fullOldName, "%s\\%s", pPath, pOldName);
sprintf(fullNewName, "%s\\%s", pPath, pNewName);
writeFileRenameRqst(strlen(fullOldName), strlen(fullNewName),
fullOldName, fullNewName);
requestFileList(pPath, FT_FLR_DEST_MAIN, false);
}
bool
FileTransfer::procFileListDataMsg()
{
FileInfo fileInfo;
int res = m_pReader->readFileListData(&fileInfo);
bool bResult = false;
switch (m_queueFileListRqst.getFlagsAt(0))
{
case FT_FLR_DEST_MAIN:
if (!m_bFTDlgShown) break;
if (res < 0) {
m_pFTDialog->reqFolderUnavailable();
bResult = true;
} else {
bResult = procFLRMain(&fileInfo);
}
break;
case FT_FLR_DEST_BROWSE:
bResult = procFLRBrowse(&fileInfo);
break;
case FT_FLR_DEST_UPLOAD:
bResult = procFLRUpload(&fileInfo);
break;
case FT_FLR_DEST_DOWNLOAD:
bResult = procFLRDownload(&fileInfo);
break;
case FT_FLR_DEST_DELETE:
bResult = procFLRDelete(&fileInfo);
break;
case FT_FLR_DEST_RENAME:
bResult = procFLRRename(&fileInfo);
break;
}
m_queueFileListRqst.deleteAt(0);
return bResult;
}
bool
FileTransfer::procFileDownloadDataMsg()
{
unsigned int bufSize = 0;
unsigned int modTime = 0;
void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
if (checkCancelOperations()) {
char reason[] = "The user cancel transfer";
m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
}
if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
m_bTransferSuccess = false;
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) {
m_bTransferSuccess = false;
char reason[] = "Error File Writting to File";
m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Download Failed");
m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
}
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
return false;
} else {
if (m_bFTDlgShown) {
m_pFTDialog->m_pProgress->increase(bufSize);
}
}
return true;
} else {
if (modTime != 0) {
m_fileWriter.setTime(modTime);
m_fileWriter.close();
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Download Completed");
m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
}
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
return true;
} else {
m_fileWriter.close();
m_bTransferSuccess = false;
char reason[] = "Error File Writting";
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Download Failed");
m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
}
m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
}
}
return false;
}
bool
FileTransfer::procFileUploadCancelMsg()
{
unsigned int reasonSize = 0;
char *pReason = m_pReader->readFileUploadCancel(&reasonSize);
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Upload Canceled by Remote Computer : %s", pReason);
}
endUndoneOperation();
m_pFTDialog->postCheckTransferQueueMsg();
delete [] pReason;
return true;
}
bool
FileTransfer::procFileDownloadFailedMsg()
{
unsigned int reasonSize = 0;
char *pReason = m_pReader->readFileDownloadFailed(&reasonSize);
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("Download Failed by Remote Computer : %s", pReason);
}
endUndoneOperation();
m_pFTDialog->postCheckTransferQueueMsg();
delete [] pReason;
return true;
}
bool
FileTransfer::procFileDirSizeDataMsg()
{
DWORD64 dw64DirSize = 0;
unsigned short dirSizeLow16 = 0;
unsigned int dirSizeHigh32 = 0;
m_pReader->readFileDirSizeData(&dirSizeLow16, &dirSizeHigh32);
dw64DirSize = dirSizeLow16;
dw64DirSize = (dw64DirSize << 32) + dirSizeHigh32;
m_dw64SizeSending += dw64DirSize;
m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
checkTransferQueue();
return true;
}
bool
FileTransfer::procFileLastRqstFailedMsg()
{
unsigned int reasonSize = 0;
int requestType;
char *pReason = m_pReader->readFileLastRqstFailed(&requestType, &reasonSize);
delete [] pReason;
return true;
}
bool
FileTransfer::procFLRMain(FileInfo *pFI)
{
if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
return true;
}
bool
FileTransfer::procFLRBrowse(FileInfo *pFI)
{
m_pFTDialog->addBrowseItems(pFI);
return false;
}
bool
FileTransfer::procFLRUpload(FileInfo *pFI)
{
unsigned int flags = m_TransferQueue.getFlagsAt(0);
if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
if (num >= 0) {
if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
m_pFTDialog->addRemoteLVItems(pFI);
}
} else {
if (flags & FT_ATTR_DIR) {
m_TransferQueue.deleteAt(0);
m_bTransferSuccess = false;
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
}
}
}
FolderManager fm;
FileInfo fi;
flags = m_TransferQueue.getFlagsAt(0);
if (flags & FT_ATTR_FILE) {
uploadFile();
return true;
} else {
if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
m_TransferQueue.getFullRemPathAt(0),
&fi, FT_ATTR_COPY_UPLOAD);
}
}
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
return true;
}
bool
FileTransfer::procFLRDownload(FileInfo *pFI)
{
unsigned int flags = m_TransferQueue.getFlagsAt(0);
if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
m_TransferQueue.getFullRemPathAt(0),
pFI, FT_ATTR_COPY_DOWNLOAD);
m_TransferQueue.deleteAt(0);
m_pFTDialog->postCheckTransferQueueMsg();
return true;
} else {
m_bTransferSuccess = false;
if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
}
return false;
}
bool
FileTransfer::procFLRDelete(FileInfo *pFI)
{
if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
} else {
if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
}
m_DeleteQueue.deleteAt(0);
checkDeleteQueue();
return true;
}
bool
FileTransfer::procFLRRename(FileInfo *pFI)
{
return false;
}
void
FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
{
m_queueFileListRqst.add(pPath, 0, 0, dest);
writeFileListRqst(strlen(pPath), pPath, bDirOnly);
}
int
FileTransfer::isExistName(FileInfo *pFI, char *pName)
{
for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
if (strcmp(pFI->getNameAt(i), pName) == 0) {
return i;
}
}
return -1;
}
bool
FileTransfer::checkCancelOperations()
{
if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
if (m_bCancel) {
endUndoneOperation();
if (m_bFTDlgShown) {
m_pFTDialog->setStatusText("All Operations Canceled");
}
return true;
} else {
return false;
}
}
void
FileTransfer::endUndoneOperation()
{
m_bCancel = false;
m_bTransferSuccess = false;
m_fileReader.close();
m_fileWriter.close();
freeQueues();
m_dw64SizeSending = 0;
m_pFTDialog->m_pProgress->clearAll();
}
void
FileTransfer::freeQueues()
{
m_TransferQueue.free();
m_DeleteQueue.free();
m_queueFileListRqst.free();
}
int
FileTransfer::convertToUnixPath(char *path)
{
int len = strlen(path);
if (len >= FT_FILENAME_SIZE) return -1;
if (len == 0) {strcpy(path, "/"); return 1;}
for (int i = (len - 1); i >= 0; i--) {
if (path[i] == '\\') path[i] = '/';
path[i+1] = path[i];
}
path[len + 1] = '\0';
path[0] = '/';
return strlen(path);
}
bool
FileTransfer::writeFileListRqst(unsigned short dirnameLen, char *pDirName, bool bDirOnly)
{
char dirName[FT_FILENAME_SIZE];
strcpy(dirName, pDirName);
int len = convertToUnixPath(dirName);
if (len <= 0) return false;
return m_pWriter->writeFileListRqst(len, dirName, bDirOnly);
}
bool
FileTransfer::writeFileDownloadRqst(unsigned short filenameLen, char *pFilename,
unsigned int position)
{
char filename[FT_FILENAME_SIZE];
strcpy(filename, pFilename);
unsigned short len = (unsigned short) convertToUnixPath(filename);
if (len <= 0) return false;
return m_pWriter->writeFileDownloadRqst(len, filename, position);
}
bool
FileTransfer::writeFileUploadRqst(unsigned short filenameLen, char *pFilename,
unsigned int position)
{
char filename[FT_FILENAME_SIZE];
strcpy(filename, pFilename);
unsigned short len = (unsigned short) convertToUnixPath(filename);
if (len <= 0) return false;
return m_pWriter->writeFileUploadRqst(len, filename, position);
}
bool
FileTransfer::writeFileCreateDirRqst(unsigned short dirNameLen, char *pDirName)
{
char path[FT_FILENAME_SIZE];
strcpy(path, pDirName);
int nameLen = convertToUnixPath(path);
return m_pWriter->writeFileCreateDirRqst(nameLen, path);
}
bool
FileTransfer::writeFileDirSizeRqst(unsigned short dirNameLen, char *pDirName)
{
char path[FT_FILENAME_SIZE];
strcpy(path, pDirName);
int nameLen = convertToUnixPath(path);
return m_pWriter->writeFileDirSizeRqst(nameLen, path);
}
bool
FileTransfer::writeFileRenameRqst(unsigned short oldNameLen, unsigned short newNameLen,
char *pOldName, char *pNewName)
{
char oldName[FT_FILENAME_SIZE];
char newName[FT_FILENAME_SIZE];
strcpy(oldName, pOldName);
strcpy(newName, pNewName);
int _oldNameLen = convertToUnixPath(oldName);
int _newNameLen = convertToUnixPath(newName);
return m_pWriter->writeFileRenameRqst(_oldNameLen, _newNameLen, oldName, newName);
}
bool
FileTransfer::writeFileDeleteRqst(unsigned short nameLen, char *pName)
{
char path[FT_FILENAME_SIZE];
strcpy(path, pName);
int _nameLen = convertToUnixPath(path);
return m_pWriter->writeFileDeleteRqst(_nameLen, path);
}