void __fastcall directPacketInit(icq_packet *pPacket, DWORD dwSize) { pPacket->wPlace = 0; pPacket->wLen = (WORD)dwSize; pPacket->pData = (BYTE *)SAFE_MALLOC(dwSize + 2); packLEWord(pPacket, pPacket->wLen); }
static void file_sendNick(CIcqProto* ppro, directconnect* dc) { icq_packet packet; char* szNick; WORD wNickLen; DBVARIANT dbv = {DBVT_DELETED}; if (ppro->getSettingString(NULL, "Nick", &dbv)) szNick = ""; else szNick = dbv.pszVal; wNickLen = strlennull(szNick); directPacketInit(&packet, (WORD)(8 + wNickLen)); packByte(&packet, PEER_FILE_INIT_ACK); /* Ident */ packLEDWord(&packet, dc->ft->dwTransferSpeed); packLEWord(&packet, (WORD)(wNickLen + 1)); packBuffer(&packet, (LPBYTE)szNick, (WORD)(wNickLen + 1)); ppro->sendDirectPacket(dc, &packet); ICQFreeVariant(&dbv); }
static void file_sendNextFile(CIcqProto* ppro, directconnect* dc) { icq_packet packet; struct _stati64 statbuf; char szThisSubDir[MAX_PATH]; if (dc->ft->iCurrentFile >= (int)dc->ft->dwFileCount) { ppro->BroadcastAck(dc->ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, dc->ft, 0); ppro->CloseDirectConnection(dc); dc->ft->hConnection = NULL; return; } dc->ft->szThisFile = dc->ft->pszFiles[dc->ft->iCurrentFile]; if (FileStatUtf(dc->ft->szThisFile, &statbuf)) { ppro->icq_LogMessage(LOG_ERROR, LPGEN("Your file transfer has been aborted because one of the files that you selected to send is no longer readable from the disk. You may have deleted or moved it.")); ppro->CloseDirectConnection(dc); dc->ft->hConnection = NULL; return; } char *pszThisFileName = FindFilePathContainer((LPCSTR*)dc->ft->pszFiles, dc->ft->iCurrentFile, szThisSubDir); if (statbuf.st_mode&_S_IFDIR) { dc->ft->currentIsDir = 1; } else { dc->ft->currentIsDir = 0; dc->ft->fileId = OpenFileUtf(dc->ft->szThisFile, _O_BINARY | _O_RDONLY, _S_IREAD); if (dc->ft->fileId == -1) { ppro->icq_LogMessage(LOG_ERROR, LPGEN("Your file transfer has been aborted because one of the files that you selected to send is no longer readable from the disk. You may have deleted or moved it.")); ppro->CloseDirectConnection(dc); dc->ft->hConnection = NULL; return; } } dc->ft->dwThisFileSize = statbuf.st_size; dc->ft->dwThisFileDate = statbuf.st_mtime; dc->ft->dwFileBytesDone = 0; char *szThisFileNameAnsi = NULL, *szThisSubDirAnsi = NULL; if (!utf8_decode(pszThisFileName, &szThisFileNameAnsi)) szThisFileNameAnsi = NULL; if (!utf8_decode(szThisSubDir, &szThisSubDirAnsi)) szThisSubDirAnsi = NULL; WORD wThisFileNameLen = strlennull(szThisFileNameAnsi); WORD wThisSubDirLen = strlennull(szThisSubDirAnsi); directPacketInit(&packet, (WORD)(20 + wThisFileNameLen + wThisSubDirLen)); packByte(&packet, PEER_FILE_NEXTFILE); /* Ident */ packByte(&packet, (BYTE)((statbuf.st_mode & _S_IFDIR) != 0)); // Is subdir packLEWord(&packet, (WORD)(wThisFileNameLen + 1)); packBuffer(&packet, (LPBYTE)szThisFileNameAnsi, (WORD)(wThisFileNameLen + 1)); packLEWord(&packet, (WORD)(wThisSubDirLen + 1)); packBuffer(&packet, (LPBYTE)szThisSubDirAnsi, (WORD)(wThisSubDirLen + 1)); packLEDWord(&packet, dc->ft->dwThisFileSize); packLEDWord(&packet, statbuf.st_mtime); packLEDWord(&packet, dc->ft->dwTransferSpeed); SAFE_FREE(&szThisFileNameAnsi); SAFE_FREE(&szThisSubDirAnsi); ppro->sendDirectPacket(dc, &packet); ppro->BroadcastAck(dc->ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, dc->ft, 0); }