From 0a776a22a99c20a23763aac28209a00a36126b7b Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Mon, 25 Aug 2014 18:32:33 +0000 Subject: Tox: - updated tox core - fixdd contacts adding - some code for file sending git-svn-id: http://svn.miranda-ng.org/main/trunk@10320 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Tox/src/file_transfer.h | 151 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 protocols/Tox/src/file_transfer.h (limited to 'protocols/Tox/src/file_transfer.h') diff --git a/protocols/Tox/src/file_transfer.h b/protocols/Tox/src/file_transfer.h new file mode 100644 index 0000000000..d131802973 --- /dev/null +++ b/protocols/Tox/src/file_transfer.h @@ -0,0 +1,151 @@ +#ifndef _FILE_TRANSFER_H_ +#define _FILE_TRANSFER_H_ + +class CFileTransfer; + +class CFile +{ +private: + HANDLE hProcess; + + const CFileTransfer *transfer; + + char *name; + const TCHAR *path; + size_t size; + +public: + CFile(const CFileTransfer *fileTransfer, const TCHAR *filePath, size_t fileSize) + { + transfer = fileTransfer; + + path = filePath; + name = strrchr(ptrA(mir_utf8encodeT(path)), '\\'); + size = fileSize; + } + + ~CFile() + { + mir_free(name); + } + + void SetHandle(HANDLE hFileProcess) + { + hProcess = hFileProcess; + } + + const TCHAR* GetPath() const + { + return path; + } + + const char* GetName() const + { + return name; + } + + size_t GetSize() const + { + return size; + } +}; + +class CFileTransfer +{ +private: + HANDLE hProcess; + LIST files; + +public: + PROTOFILETRANSFERSTATUS pfts; + + CFileTransfer(MCONTACT hContact, ULONG hProcess, DWORD flags) : + files(1) + { + pfts.cbSize = sizeof(pfts); + pfts.flags = PFTS_TCHAR | flags; + pfts.hContact = hContact; + pfts.currentFileNumber = 0; + pfts.currentFileProgress = 0; + pfts.currentFileSize = 0; + pfts.totalBytes = 0; + pfts.totalFiles = 0; + pfts.totalProgress = 0; + pfts.pszFiles = NULL; + pfts.tszWorkingDir = NULL; + pfts.tszCurrentFile = NULL; + + this->hProcess = (HANDLE)hProcess; + } + + ~CFileTransfer() + { + if (pfts.tszWorkingDir) + mir_free(pfts.tszWorkingDir); + if (pfts.ptszFiles) + { + for (int i = 0; pfts.ptszFiles[i]; i++) + { + if (pfts.ptszFiles[i]) mir_free(pfts.ptszFiles[i]); + } + mir_free(pfts.ptszFiles); + } + } + + void ProcessTransferedFiles(TCHAR** ppszFiles) + { + for (pfts.totalFiles = 0; ppszFiles[pfts.totalFiles]; pfts.totalFiles++); + pfts.ptszFiles = (TCHAR**)mir_alloc(sizeof(TCHAR*)*(pfts.totalFiles + 1)); + pfts.ptszFiles[pfts.totalFiles] = NULL; + for (int i = 0; ppszFiles[i]; i++) + { + if (!pfts.tszWorkingDir) + { + wchar_t *path = ppszFiles[i]; + int length = wcsrchr(path, '\\') - path; + pfts.tszWorkingDir = (TCHAR*)mir_alloc(sizeof(TCHAR)*(length + 1)); + lstrcpyn(pfts.tszWorkingDir, ppszFiles[i], length + 1); + pfts.tszWorkingDir[length] = '\0'; + } + + pfts.ptszFiles[i] = mir_tstrdup(ppszFiles[i]); + + size_t fileSize = 0; + FILE *file = _tfopen(ppszFiles[i], _T("rb")); + if (file != NULL) + { + fseek(file, 0, SEEK_END); + pfts.totalBytes += fileSize = ftell(file); + fseek(file, 0, SEEK_SET); + fclose(file); + } + + files.insert(new CFile(this, pfts.ptszFiles[i], fileSize)); + } + } + + int GetFileCount() const + { + return files.getCount(); + } + + CFile * const GetFileAt(int idx) const + { + return files[idx]; + } + + HANDLE GetTransferHandler() const + { + return hProcess; + } +}; + +class CFileSendTransfer : public CFileTransfer +{ +public: + CFileSendTransfer(MCONTACT hContact, ULONG hProcess) : CFileTransfer(hContact, hProcess, PFTS_SENDING) + { + } +}; + +#endif //_FILE_TRANSFER_H_ \ No newline at end of file -- cgit v1.2.3