📄 listensocket.cpp
字号:
CKnownFile* cur_file;
for (POSITION pos = theApp.sharedfiles->m_Files_map.GetStartPosition();pos != 0;)
{
theApp.sharedfiles->m_Files_map.GetNextAssoc(pos,bufKey,cur_file);
list.AddTail((void*&)cur_file);
}
AddLogLine(true,GetResString(IDS_REQ_SHAREDFILES),client->GetUserName(),client->GetUserIDHybrid(),GetResString(IDS_ACCEPTED) );
}
else
{
AddLogLine(true,GetResString(IDS_REQ_SHAREDFILES),client->GetUserName(),client->GetUserIDHybrid(),GetResString(IDS_DENIED) );
}
// now create the memfile for the packet
uint32 iTotalCount = list.GetCount();
CSafeMemFile tempfile(80);
tempfile.WriteUInt32(iTotalCount);
while (list.GetCount())
{
theApp.sharedfiles->CreateOfferedFilePacket((CKnownFile*)list.GetHead(), &tempfile, NULL, client->IsEmuleClient() ? client->GetVersion() : 0);
list.RemoveHead();
}
// create a packet and send it
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedFilesAnswer", client);
Packet* replypacket = new Packet(&tempfile);
replypacket->opcode = OP_ASKSHAREDFILESANSWER;
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
break;
}
case OP_ASKSHAREDFILESANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedFilesAnswer", client);
theStats.AddDownDataOverheadOther(size);
client->ProcessSharedFileList(packet,size);
break;
}
case OP_ASKSHAREDDIRS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedDirectories", client);
theStats.AddDownDataOverheadOther(size);
ASSERT( size == 0 );
// IP banned, no answer for this request
if (client->IsBanned())
break;
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
AddLogLine(true,GetResString(IDS_SHAREDREQ1),client->GetUserName(),client->GetUserIDHybrid(),GetResString(IDS_ACCEPTED) );
CString strDir;
//TODO: Don't send shared directories which do not contain any files
// add shared directories
CStringArray arFolders;
POSITION pos = thePrefs.shareddir_list.GetHeadPosition();
while (pos)
{
strDir = thePrefs.shareddir_list.GetNext(pos);
PathRemoveBackslash(strDir.GetBuffer());
strDir.ReleaseBuffer();
bool bFoundFolder = false;
for (int i = 0; i < arFolders.GetCount(); i++)
{
if (strDir.CompareNoCase(arFolders.GetAt(i)) == 0)
{
bFoundFolder = true;
break;
}
}
if (!bFoundFolder)
arFolders.Add(strDir);
}
// add incoming folders
for (int iCat = 0; iCat < thePrefs.GetCatCount(); iCat++)
{
strDir = thePrefs.GetCategory(iCat)->incomingpath;
PathRemoveBackslash(strDir.GetBuffer());
strDir.ReleaseBuffer();
bool bFoundFolder = false;
for (int i = 0; i < arFolders.GetCount(); i++)
{
if (strDir.CompareNoCase(arFolders.GetAt(i)) == 0)
{
bFoundFolder = true;
break;
}
}
if (!bFoundFolder)
arFolders.Add(strDir);
}
// add temporary folder
strDir = OP_INCOMPLETE_SHARED_FILES;
bool bFoundFolder = false;
for (int i = 0; i < arFolders.GetCount(); i++)
{
if (strDir.CompareNoCase(arFolders.GetAt(i)) == 0)
{
bFoundFolder = true;
break;
}
}
if (!bFoundFolder)
arFolders.Add(strDir);
// build packet
CSafeMemFile tempfile(80);
tempfile.WriteUInt32(arFolders.GetCount());
for (int i = 0; i < arFolders.GetCount(); i++)
tempfile.WriteString(arFolders.GetAt(i));
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedDirsAnswer", client);
Packet* replypacket = new Packet(&tempfile);
replypacket->opcode = OP_ASKSHAREDDIRSANS;
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
}
else
{
AddLogLine(true,GetResString(IDS_SHAREDREQ1),client->GetUserName(),client->GetUserIDHybrid(),GetResString(IDS_DENIED) );
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedDeniedAnswer", client);
Packet* replypacket = new Packet(OP_ASKSHAREDDENIEDANS, 0);
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
}
break;
}
case OP_ASKSHAREDFILESDIR:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedFilesInDirectory", client);
theStats.AddDownDataOverheadOther(size);
// IP banned, no answer for this request
if (client->IsBanned())
break;
CSafeMemFile data((uchar*)packet, size);
CString strReqDir = data.ReadString();
PathRemoveBackslash(strReqDir.GetBuffer());
strReqDir.ReleaseBuffer();
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
AddLogLine(true,GetResString(IDS_SHAREDREQ2),client->GetUserName(),client->GetUserIDHybrid(),strReqDir,GetResString(IDS_ACCEPTED) );
ASSERT( data.GetPosition() == data.GetLength() );
CTypedPtrList<CPtrList, CKnownFile*> list;
if (strReqDir == OP_INCOMPLETE_SHARED_FILES)
{
// get all shared files from download queue
int iQueuedFiles = theApp.downloadqueue->GetFileCount();
for (int i = 0; i < iQueuedFiles; i++)
{
CPartFile* pFile = theApp.downloadqueue->GetFileByIndex(i);
if (pFile == NULL || pFile->GetStatus(true) != PS_READY)
break;
list.AddTail(pFile);
}
}
else
{
// get all shared files from requested directory
for (POSITION pos = theApp.sharedfiles->m_Files_map.GetStartPosition();pos != 0;)
{
CCKey bufKey;
CKnownFile* cur_file;
theApp.sharedfiles->m_Files_map.GetNextAssoc(pos, bufKey, cur_file);
CString strSharedFileDir(cur_file->GetPath());
PathRemoveBackslash(strSharedFileDir.GetBuffer());
strSharedFileDir.ReleaseBuffer();
if (strReqDir.CompareNoCase(strSharedFileDir) == 0)
list.AddTail(cur_file);
}
}
// Currently we are sending each shared directory, even if it does not contain any files.
// Because of this we also have to send an empty shared files list..
CSafeMemFile tempfile(80);
tempfile.WriteString(strReqDir);
tempfile.WriteUInt32(list.GetCount());
while (list.GetCount())
{
theApp.sharedfiles->CreateOfferedFilePacket(list.GetHead(), &tempfile, NULL, client->IsEmuleClient() ? client->GetVersion() : 0);
list.RemoveHead();
}
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedFilesInDirectoryAnswer", client);
Packet* replypacket = new Packet(&tempfile);
replypacket->opcode = OP_ASKSHAREDFILESDIRANS;
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
}
else
{
AddLogLine(true,GetResString(IDS_SHAREDREQ2),client->GetUserName(),client->GetUserIDHybrid(),strReqDir,GetResString(IDS_DENIED) );
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedDeniedAnswer", client);
Packet* replypacket = new Packet(OP_ASKSHAREDDENIEDANS, 0);
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
}
break;
}
case OP_ASKSHAREDDIRSANS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedDirectoriesAnswer", client);
theStats.AddDownDataOverheadOther(size);
if (client->GetFileListRequested() == 1)
{
CSafeMemFile data((uchar*)packet, size);
UINT uDirs = data.ReadUInt32();
for (UINT i = 0; i < uDirs; i++)
{
CString strDir = data.ReadString();
// Better send the received and untouched directory string back to that client
//PathRemoveBackslash(strDir.GetBuffer());
//strDir.ReleaseBuffer();
AddLogLine(true,GetResString(IDS_SHAREDANSW),client->GetUserName(),client->GetUserIDHybrid(),strDir);
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AskSharedFilesInDirectory", client);
CSafeMemFile tempfile(80);
tempfile.WriteString(strDir);
Packet* replypacket = new Packet(&tempfile);
replypacket->opcode = OP_ASKSHAREDFILESDIR;
theStats.AddUpDataOverheadOther(replypacket->size);
SendPacket(replypacket, true, true);
}
ASSERT( data.GetPosition() == data.GetLength() );
client->SetFileListRequested(uDirs);
}
else
AddLogLine(true,GetResString(IDS_SHAREDANSW2),client->GetUserName(),client->GetUserIDHybrid());
break;
}
case OP_ASKSHAREDFILESDIRANS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedFilesInDirectoryAnswer", client);
theStats.AddDownDataOverheadOther(size);
CSafeMemFile data((uchar*)packet, size);
CString strDir = data.ReadString();
PathRemoveBackslash(strDir.GetBuffer());
strDir.ReleaseBuffer();
if (client->GetFileListRequested() > 0)
{
AddLogLine(true,GetResString(IDS_SHAREDINFO1),client->GetUserName(),client->GetUserIDHybrid(),strDir);
client->ProcessSharedFileList(packet + data.GetPosition(), size - data.GetPosition(), strDir);
if (client->GetFileListRequested() == 0)
AddLogLine(true,GetResString(IDS_SHAREDINFO2),client->GetUserName(),client->GetUserIDHybrid());
}
else
AddLogLine(true,GetResString(IDS_SHAREDANSW3),client->GetUserName(),client->GetUserIDHybrid(),strDir);
break;
}
case OP_ASKSHAREDDENIEDANS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedDeniedAnswer", client);
theStats.AddDownDataOverheadOther(size);
ASSERT( size == 0 );
AddLogLine(true,GetResString(IDS_SHAREDREQDENIED),client->GetUserName(),client->GetUserIDHybrid());
client->SetFileListRequested(0);
break;
}
default:
theStats.AddDownDataOverheadOther(size);
PacketToDebugLogLine(_T("eDonkey"), packet, size, opcode, DLP_LOW);
break;
}
}
catch(CFileException* error)
{
error->Delete(); //mf
throw GetResString(IDS_ERR_INVALIDPACKAGE);
}
catch(CMemoryException* error)
{
error->Delete();
throw CString(_T("Memory exception"));
}
}
catch(CClientException* ex) // nearly same as the 'CString' exception but with optional deleting of the client
{
if (thePrefs.GetVerbose() && !ex->m_strMsg.IsEmpty())
AddDebugLogLine(false, _T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), ex->m_strMsg, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
if (client && ex->m_bDelete)
client->SetDownloadState(DS_ERROR);
Disconnect(ex->m_strMsg);
ex->Delete();
return false;
}
catch(CString error)
{
if (thePrefs.GetVerbose() && !error.IsEmpty()){
if (opcode == OP_REQUESTFILENAME /*low priority for OP_REQUESTFILENAME*/)
AddDebugLogLine(DLP_LOW, false, _T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), error, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
else
AddDebugLogLine(DLP_HIGH, false, _T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), error, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
}
if (client)
client->SetDownloadState(DS_ERROR);
Disconnect(_T("Error when processing packet.") + error);
return false;
}
return true;
}
bool CClientReqSocket::ProcessExtPacket(char* packet, uint32 size, UINT opcode, UINT uRawSize)
{
try
{
try
{
if (!client)
{
theStats.AddDownDataOverheadOther(uRawSize);
throw GetResString(IDS_ERR_UNKNOWNCLIENTACTION);
}
if (thePrefs.m_iDbgHeap >= 2)
ASSERT_VALID(client);
switch(opcode)
{
case OP_MULTIPACKET:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MultiPacket", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
if (client->IsBanned()){
client->CheckFailedFileIdReqs(NULL);
break;
}
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
CSafeMemFile data_in((BYTE*)packet,size);
uchar reqfilehash[16];
data_in.ReadHash16(reqfilehash);
CKnownFile* reqfile;
if ( (reqfile = theApp.sharedfiles->GetFileByID(reqfilehash)) == NULL ){
if ( !((reqfile = theApp.downloadqueue->GetFileByID(reqfilehash)) != NULL
&& reqfile->GetFileSize() > PARTSIZE ) )
{
// send file request no such file packet (0x48)
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__FileReqAnsNoFil", client, packet);
Packet* replypacket = new Packet(OP_FILEREQANSNOFIL, 16);
md4cpy(replypacket->pBuffer, packet);
theStats.AddUpDataOverheadFileRequest(replypacket->size);
SendPacket(replypacket, true);
client->CheckFailedFileIdReqs(reqfilehash);
break;
}
}
if (!client->GetWaitStartTime())
client->SetWaitStartTime();
// if we are downloading this file, this could be a new source
// no passive adding of files with only one part
if (reqfile->IsPartFile() && reqfile->GetFileSize() > PARTSIZE)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -