📄 listensocket.cpp
字号:
if (pNewServer != NULL)
{
client->SetServerIP(nNewServerIP);
client->SetServerPort(pNewServer->GetPort());
}
}
else{
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: OP_ChangedClientID unknown contents\n"));
}
UINT uAddData = data.GetLength() - data.GetPosition();
if (uAddData > 0){
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: OP_ChangedClientID contains add. data %s\n"), DbgGetHexDump((uint8*)packet + data.GetPosition(), uAddData));
}
break;
}
case OP_CHANGE_SLOT:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_ChangeSlot", client, size>=16 ? packet : NULL);
theStats.AddDownDataOverheadOther(size);
// sometimes sent by Hybrid
break;
}
case OP_MESSAGE:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_Message", client);
theStats.AddDownDataOverheadOther(size);
if (size < 2)
throw CString(_T("invalid message packet"));
CSafeMemFile data((BYTE*)packet, size);
UINT length = data.ReadUInt16();
if (length+2 != size)
throw CString(_T("invalid message packet"));
//filter me?
if ( (thePrefs.MsgOnlyFriends() && !client->IsFriend()) || (thePrefs.MsgOnlySecure() && client->GetUserName()==NULL) )
{
if (!client->GetMessageFiltered()){
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("Filtered Message from '%s' (IP:%s)"), client->GetUserName(), ipstr(client->GetConnectIP()));
}
client->SetMessageFiltered(true);
break;
}
if (length > MAX_CLIENT_MSG_LEN){
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Message from '%s' (IP:%s) exceeds limit by %u chars, truncated."), client->GetUserName(), ipstr(client->GetConnectIP()), length - MAX_CLIENT_MSG_LEN);
length = MAX_CLIENT_MSG_LEN;
}
AddLogLine(true, GetResString(IDS_NEWMSG), client->GetUserName(), ipstr(client->GetConnectIP()));
CString strMessage(data.ReadString(client->GetUnicodeSupport(), length));
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T(" %s\n"), strMessage);
theApp.emuledlg->chatwnd->chatselector.ProcessMessage(client, strMessage);
break;
}
case OP_ASKSHAREDFILES:
{
// client wants to know what we have in share, let's see if we allow him to know that
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedFiles", client);
theStats.AddDownDataOverheadOther(size);
CPtrList list;
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
CCKey bufKey;
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);
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 );
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
AddLogLine(true, GetResString(IDS_SHAREDREQ1), client->GetUserName(), client->GetUserIDHybrid(), GetResString(IDS_ACCEPTED));
//TODO: Don't send shared directories which do not contain any files
// add shared directories
CString strDir;
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), client->GetUnicodeSupport());
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);
CSafeMemFile data((uchar*)packet, size);
CString strReqDir = data.ReadString(client->GetUnicodeSupport());
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, client->GetUnicodeSupport());
tempfile.WriteUInt32(list.GetCount());
while (list.GetCount())
{
theApp.sharedfiles->CreateOfferedFilePacket(list.GetHead(), &tempfile, NULL, client);
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(client->GetUnicodeSupport());
// 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, client->GetUnicodeSupport());
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(client->GetUnicodeSupport());
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();
throw GetResString(IDS_ERR_INVALIDPACKAGE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -