From beaf93e92827b7bcc77c9f6b2a0c7097d355151c Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Fri, 29 Aug 2014 22:11:08 +0000 Subject: Tox: added files receiving git-svn-id: http://svn.miranda-ng.org/main/trunk@10339 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Tox/src/tox_events.cpp | 73 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) (limited to 'protocols/Tox/src/tox_events.cpp') diff --git a/protocols/Tox/src/tox_events.cpp b/protocols/Tox/src/tox_events.cpp index a133b17e35..1a27e498ef 100644 --- a/protocols/Tox/src/tox_events.cpp +++ b/protocols/Tox/src/tox_events.cpp @@ -124,7 +124,7 @@ int CToxProto::OnPreCreateMessage(WPARAM wParam, LPARAM lParam) char *message = (char*)evt->dbei->pBlob; if (strncmp(message, "/me ", 4) == 0) { - BYTE *action = (BYTE*)mir_alloc(sizeof(BYTE) * (evt->dbei->cbBlob - 4)); + BYTE *action = (BYTE*)mir_alloc(sizeof(BYTE)* (evt->dbei->cbBlob - 4)); memcpy(action, (char*)&evt->dbei->pBlob[4], evt->dbei->cbBlob - 4); mir_free(evt->dbei->pBlob); evt->dbei->pBlob = action; @@ -256,14 +256,83 @@ void CToxProto::OnReadReceipt(Tox *tox, int32_t number, uint32_t receipt, void * } } +void CToxProto::OnFriendFile(Tox *tox, int32_t number, uint8_t fileNumber, uint64_t fileSize, const uint8_t *fileName, uint16_t length, void *arg) +{ + CToxProto *proto = (CToxProto*)arg; + + MCONTACT hContact = proto->FindContact(number); + if (hContact) + { + FileTransferParam *transfer = new FileTransferParam(fileNumber, ptrT(mir_utf8decodeT((const char*)fileName)), fileSize); + transfer->pfts.hContact = hContact; + transfer->pfts.flags |= PFTS_RECEIVING; + proto->transfers[fileNumber] = transfer; + + PROTORECVFILET pre = { 0 }; + pre.flags = PREF_TCHAR; + pre.fileCount = 1; + pre.timestamp = time(NULL); + pre.tszDescription = _T(""); + pre.ptszFiles = (TCHAR**)mir_alloc(sizeof(TCHAR*)* 2); + pre.ptszFiles[0] = mir_utf8decodeT((char*)fileName); + pre.ptszFiles[1] = NULL; + pre.lParam = (LPARAM)fileNumber; + ProtoChainRecvFile(hContact, &pre); + } +} + +void CToxProto::OnFileData(Tox *tox, int32_t number, uint8_t fileNumber, const uint8_t *data, uint16_t size, void *arg) +{ + CToxProto *proto = (CToxProto*)arg; + + MCONTACT hContact = proto->FindContact(number); + if (hContact) + { + FileTransferParam *transfer = proto->transfers.at(fileNumber); + + TCHAR filePath[MAX_PATH]; + mir_sntprintf(filePath, SIZEOF(filePath), _T("%s%s"), transfer->pfts.tszWorkingDir, transfer->pfts.tszCurrentFile); + + FILE *hFile = NULL; + if (transfer->pfts.currentFileProgress == 0) + { + hFile = _tfopen(filePath, _T("wb")); + proto->ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, (HANDLE)fileNumber, 0); + } + else + { + hFile = _tfopen(filePath, _T("ab")); + } + if (hFile != NULL) + { + if (fwrite(data, sizeof(uint8_t), size, hFile) == size) + { + transfer->pfts.totalProgress = transfer->pfts.currentFileProgress += size; + proto->ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DATA, (HANDLE)fileNumber, (LPARAM)&transfer->pfts); + } + fclose(hFile); + } + } +} + void CToxProto::OnFileRequest(Tox *tox, int32_t number, uint8_t isSend, uint8_t fileNumber, uint8_t type, const uint8_t *data, uint16_t length, void *arg) { CToxProto *proto = (CToxProto*)arg; + MCONTACT hContact = proto->FindContact(number); if (hContact) { - if (isSend && type == TOX_FILECONTROL_ACCEPT) + FileTransferParam *transfer = proto->transfers.at(fileNumber); + + switch (type) { + case TOX_FILECONTROL_ACCEPT: + break; + + case TOX_FILECONTROL_FINISHED: + tox_file_send_control(proto->tox, number, 1, fileNumber, TOX_FILECONTROL_FINISHED, NULL, 0); + proto->ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)fileNumber, 0); + break; } } } \ No newline at end of file -- cgit v1.2.3