📄 mmserver.cpp
字号:
case MMT_SERVERCONNECT:
theApp.serverconnect->ConnectToAnyServer();
bSuccess = true;
break;
}
if (bSuccess){
CMMPacket* packet = new CMMPacket(MMP_COMMANDANS);
sender->SendPacket(packet);
if (bQueueCommand)
m_byPendingCommand = byCommand;
}
else{
CMMPacket* packet = new CMMPacket(MMP_GENERALERROR);
sender->SendPacket(packet);
ASSERT ( false );
return;
}
}
void CMMServer::ProcessSearchRequest(CMMData* data, CMMSocket* sender){
DeleteSearchFiles();
SSearchParams Params;
Params.strExpression = data->ReadString();
uint8 byType = data->ReadByte();
switch(byType){
case 0:
Params.strFileType.Empty();
break;
case 1:
Params.strFileType = ED2KFTSTR_ARCHIVE;
break;
case 2:
Params.strFileType = ED2KFTSTR_AUDIO;
break;
case 3:
Params.strFileType = ED2KFTSTR_CDIMAGE;
break;
case 4:
Params.strFileType = ED2KFTSTR_PROGRAM;
break;
case 5:
Params.strFileType = ED2KFTSTR_VIDEO;
break;
default:
ASSERT ( false );
Params.strFileType.Empty();
}
bool bServerError = false;
if (!theApp.serverconnect->IsConnected()){
CMMPacket* packet = new CMMPacket(MMP_SEARCHANS);
packet->WriteByte(MMT_NOTCONNECTED);
sender->SendPacket(packet);
return;
}
CSafeMemFile searchdata(100);
bool bResSearchPacket = false;
try
{
bResSearchPacket = GetSearchPacket(&searchdata, &Params);
}
catch (CMsgBoxException* ex)
{
ex->Delete();
}
if (!bResSearchPacket || searchdata.GetLength() == 0){
bServerError = true;
}
else{
h_timer = SetTimer(0,0,20000,CommandTimer);
if (!h_timer){
bServerError = true;
}
}
if (bServerError){
CMMPacket* packet = new CMMPacket(MMP_GENERALERROR);
sender->SendPacket(packet);
ASSERT ( false );
return;
}
m_byPendingCommand = MMT_SEARCH;
m_pPendingCommandSocket = sender;
theApp.searchlist->NewSearch(NULL, Params.strFileType, MMS_SEARCHID, true);
Packet* searchpacket = new Packet(&searchdata);
searchpacket->opcode = OP_SEARCHREQUEST;
theStats.AddUpDataOverheadServer(searchpacket->size);
theApp.serverconnect->SendPacket(searchpacket,true);
char buffer[500];
wsprintfA(buffer, "HTTP/1.1 200 OK\r\nConnection: Close\r\nContent-Type: %s\r\n", GetContentType());
sender->Send(buffer,strlen(buffer));
}
void CMMServer::ProcessChangeLimitRequest(CMMData* data, CMMSocket* sender){
uint16 nNewUpload = data->ReadShort();
uint16 nNewDownload = data->ReadShort();
thePrefs.SetMaxUpload(nNewUpload);
thePrefs.SetMaxDownload(nNewDownload);
CMMPacket* packet = new CMMPacket(MMP_CHANGELIMITANS);
packet->WriteShort((thePrefs.GetMaxUpload() == UNLIMITED) ? 0 : thePrefs.GetMaxUpload());
packet->WriteShort((thePrefs.GetMaxDownload() == UNLIMITED) ? 0 : thePrefs.GetMaxDownload());
sender->SendPacket(packet);
}
void CMMServer::SearchFinished(bool bTimeOut){
#define MAXRESULTS 20
if (h_timer != 0){
KillTimer(0,h_timer);
h_timer = 0;
}
if (m_pPendingCommandSocket == NULL)
return;
if (bTimeOut){
CMMPacket* packet = new CMMPacket(MMP_SEARCHANS);
packet->WriteByte(MMT_TIMEDOUT);
packet->m_bSpecialHeader = true;
m_pPendingCommandSocket->SendPacket(packet);
}
else if (theApp.searchlist->GetFoundFiles(MMS_SEARCHID) == 0){
CMMPacket* packet = new CMMPacket(MMP_SEARCHANS);
packet->WriteByte(MMT_NORESULTS);
packet->m_bSpecialHeader = true;
m_pPendingCommandSocket->SendPacket(packet);
}
else{
uint16 results = theApp.searchlist->GetFoundFiles(MMS_SEARCHID);
if (results > MAXRESULTS)
results = MAXRESULTS;
m_SendSearchList.SetSize(results);
CMMPacket* packet = new CMMPacket(MMP_SEARCHANS);
packet->m_bSpecialHeader = true;
packet->WriteByte(MMT_OK);
packet->WriteByte(results);
for (int i = 0; i != results; i++){
CSearchFile* cur_file = theApp.searchlist->DetachNextFile(MMS_SEARCHID);
m_SendSearchList[i] = cur_file;
packet->WriteString(cur_file->GetFileName());
packet->WriteShort( cur_file->GetSourceCount() );
packet->WriteInt(cur_file->GetFileSize());
}
m_pPendingCommandSocket->SendPacket(packet);
theApp.searchlist->RemoveResults(MMS_SEARCHID);
}
m_pPendingCommandSocket = NULL;
}
void CMMServer::ProcessDownloadRequest(CMMData* data, CMMSocket* sender){
uint8 byFileIndex = data->ReadByte();
if (byFileIndex >= m_SendSearchList.GetSize() )
{
CMMPacket* packet = new CMMPacket(MMP_GENERALERROR);
sender->SendPacket(packet);
ASSERT ( false );
return;
}
CSearchFile* todownload = m_SendSearchList[byFileIndex];
theApp.downloadqueue->AddSearchToDownload(todownload,2,0);
CMMPacket* packet = new CMMPacket(MMP_DOWNLOADANS);
if (theApp.downloadqueue->GetFileByID(todownload->GetFileHash()) != NULL){
packet->WriteByte(MMT_OK);
}
else{
packet->WriteByte(MMT_FAILED);
}
sender->SendPacket(packet);
}
void CMMServer::ProcessPreviewRequest(CMMData* data, CMMSocket* sender){
uint8 byFileType = data->ReadByte();
uint8 byFileIndex = data->ReadByte();
uint16 nDisplayWidth = data->ReadShort();
uint8 nNumber = data->ReadByte();
CKnownFile* knownfile = NULL;
bool bError = false;
if (byFileType == MMT_PARTFILFE){
if (byFileIndex >= m_SentFileList.GetSize()
|| !theApp.downloadqueue->IsPartFile(m_SentFileList[byFileIndex]))
{
bError = true;
}
else
knownfile = m_SentFileList[byFileIndex];
}
else if (byFileType == MMT_FINISHEDFILE){
if (byFileIndex >= m_SentFinishedList.GetSize()
|| !theApp.knownfiles->IsKnownFile(m_SentFinishedList[byFileIndex]))
{
bError = true;
}
else
knownfile = m_SentFinishedList[byFileIndex];
}
if (!bError){
if (h_timer != 0)
bError = true;
else{
h_timer = SetTimer(0,0,20000,CommandTimer);
if (!h_timer){
bError = true;
}
else{
if (nDisplayWidth > 140)
nDisplayWidth = 140;
m_byPendingCommand = MMT_PREVIEW;
m_pPendingCommandSocket = sender;
if (!knownfile->GrabImage(1,(nNumber+1)*50.0,true,nDisplayWidth,this))
PreviewFinished(NULL,0);
}
}
}
if (bError){
CMMPacket* packet = new CMMPacket(MMP_GENERALERROR);
sender->SendPacket(packet);
ASSERT ( false );
return;
}
}
void CMMServer::PreviewFinished(CxImage** imgFrames, uint8 nCount){
if (h_timer != 0){
KillTimer(0,h_timer);
h_timer = 0;
}
if (m_byPendingCommand != MMT_PREVIEW)
return;
m_byPendingCommand = 0;
if (m_pPendingCommandSocket == NULL)
return;
CMMPacket* packet = new CMMPacket(MMP_PREVIEWANS);
if (imgFrames != NULL && nCount != 0){
packet->WriteByte(MMT_OK);
CxImage* cur_frame = imgFrames[0];
if (cur_frame == NULL){
ASSERT ( false );
return;
}
BYTE* abyResultBuffer = NULL;
long nResultSize = 0;
if (!cur_frame->Encode(abyResultBuffer, nResultSize, CXIMAGE_FORMAT_PNG)){
ASSERT ( false );
return;
}
packet->WriteInt(nResultSize);
packet->m_pBuffer->Write(abyResultBuffer, nResultSize);
free(abyResultBuffer);
}
else{
packet->WriteByte(MMT_FAILED);
}
m_pPendingCommandSocket->SendPacket(packet);
m_pPendingCommandSocket = NULL;
}
void CMMServer::Process(){
if (m_pSocket){
m_pSocket->Process();
}
}
CString CMMServer::GetContentType(){
if (m_bUseFakeContent)
return CString("image/vnd.wap.wbmp");
else
return CString("application/octet-stream");
}
VOID CALLBACK CMMServer::CommandTimer(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
// NOTE: Always handle all type of MFC exceptions in TimerProcs - otherwise we'll get mem leaks
try
{
KillTimer(0,theApp.mmserver->h_timer);
theApp.mmserver->h_timer = 0;
switch(theApp.mmserver->m_byPendingCommand){
case MMT_SDPC:{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
try{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
throw 1;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
catch(...){
}
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCEIFHUNG, 0))
break;
}
case MMT_SDEMULE:
theApp.m_app_state = APP_STATE_SHUTINGDOWN;
SendMessage(theApp.emuledlg->m_hWnd,WM_CLOSE,0,0);
break;
case MMT_SEARCH:
theApp.mmserver->SearchFinished(true);
break;
case MMT_PREVIEW:
theApp.mmserver->PreviewFinished(NULL,0);
break;
}
}
CATCH_DFLT_EXCEPTIONS(_T("CMMServer::CommandTimer"))
}
void CMMServer::ProcessStatisticsRequest(CMMData* data, CMMSocket* sender){
uint16 nWidth = data->ReadShort();
CArray<UpDown, UpDown>* rawData = theApp.webserver->GetPointsForWeb();
int nRawDataSize = rawData->GetSize();
int nCompressEvery = (nRawDataSize > nWidth) ? nRawDataSize / nWidth : 1;
int nPos = (nRawDataSize > nWidth) ? (nRawDataSize % nWidth) : 0;
int nAddUp, nAddDown, nAddCon, i;
ASSERT (nPos + nCompressEvery * nWidth == nRawDataSize || (nPos == 0 && nRawDataSize < nWidth));
CMMPacket* packet = new CMMPacket(MMP_STATISTICSANS);
packet->WriteShort((nRawDataSize-nPos)*thePrefs.GetTrafficOMeterInterval());
packet->WriteShort(min(nWidth, nRawDataSize));
while (nPos < nRawDataSize){
nAddUp = nAddDown = nAddCon = 0;
for (i = 0; i != nCompressEvery; i++){
if (nPos >= nRawDataSize){
ASSERT ( false );
break;
}
else{
nAddUp += (int) (rawData->ElementAt(nPos).upload * 1024);
nAddDown += (int) (rawData->ElementAt(nPos).download * 1024);
nAddCon += rawData->ElementAt(nPos).connections;
}
nPos++;
}
packet->WriteInt(ROUND(nAddUp/i));
packet->WriteInt(ROUND(nAddDown/i));
packet->WriteShort(ROUND(nAddCon/i));
}
ASSERT ( nPos == nRawDataSize );
sender->SendPacket(packet);
}
void CMMServer::WriteFileInfo(CPartFile* selFile, CMMPacket* packet){
packet->WriteInt(selFile->GetFileSize());
packet->WriteInt(selFile->GetTransfered());
packet->WriteInt(selFile->GetCompletedSize());
packet->WriteShort(selFile->GetDatarate()/100);
packet->WriteShort(selFile->GetSourceCount());
packet->WriteShort(selFile->GetTransferingSrcCount());
if (selFile->IsAutoDownPriority()){
packet->WriteByte(4);
}
else{
packet->WriteByte(selFile->GetDownPriority());
}
uint8* parts = selFile->MMCreatePartStatus();
packet->WriteShort(selFile->GetPartCount());
for (int i = 0; i != selFile->GetPartCount(); i++){
packet->WriteByte(parts[i]);
}
delete[] parts;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -