📄 uploadclient.cpp
字号:
void CUpDownClient::ProcessUpFileStatus(char* packet,uint32 size){
if (m_abyUpPartStatus) {
delete[] m_abyUpPartStatus;
m_abyUpPartStatus = NULL; // added by jicxicmic
}
m_nUpPartCount = 0;
if( size == 16 )
return;
CSafeMemFile* data = new CSafeMemFile((BYTE*)packet,size);
uchar cfilehash[16];
data->Read(cfilehash,16);
CKnownFile* tempreqfile = theApp.sharedfiles->GetFileByID(cfilehash);
data->Read(&m_nUpPartCount,2);
if (!m_nUpPartCount){
m_nUpPartCount = tempreqfile->GetPartCount();
m_abyUpPartStatus = new uint8[m_nUpPartCount];
memset(m_abyUpPartStatus,0,m_nUpPartCount);
}
else{
if (tempreqfile->GetPartCount() != m_nUpPartCount){
delete data; //mf
m_nUpPartCount = 0;
return;
}
m_abyUpPartStatus = new uint8[m_nUpPartCount];
uint16 done = 0;
while (done != m_nUpPartCount){
uint8 toread;
data->Read(&toread,1);
for (sint32 i = 0;i != 8;i++){
m_abyUpPartStatus[done] = ((toread>>i)&1)? 1:0;
// We may want to use this for another feature..
// if (m_abyUpPartStatus[done] && !tempreqfile->IsComplete(done*PARTSIZE,((done+1)*PARTSIZE)-1))
// bPartsNeeded = true;
done++;
if (done == m_nUpPartCount)
break;
}
}
}
tempreqfile->NewAvailPartsInfo();
theApp.emuledlg->transferwnd.queuelistctrl.RefreshClient(this);
delete data;
}
void CUpDownClient::CreateStandartPackets(byte* data,uint32 togo, Requested_Block_Struct* currentblock){
uint32 nPacketSize;
CMemFile memfile((BYTE*)data,togo);
if (togo > 10240)
nPacketSize = togo/(uint32)(togo/10240);
else
nPacketSize = togo;
while (togo){
if (togo < nPacketSize*2)
nPacketSize = togo;
togo -= nPacketSize;
Packet* packet = new Packet(OP_SENDINGPART,nPacketSize+24);
memcpy(&packet->pBuffer[0],GetUploadFileID(),16);
uint32 statpos = (currentblock->EndOffset - togo) - nPacketSize;
memcpy(&packet->pBuffer[16],&statpos,4);
uint32 endpos = (currentblock->EndOffset - togo);
memcpy(&packet->pBuffer[20],&endpos,4);
memfile.Read(&packet->pBuffer[24],nPacketSize);
m_BlockSend_queue.AddTail(packet);
}
}
void CUpDownClient::CreatePackedPackets(byte* data,uint32 togo, Requested_Block_Struct* currentblock){
BYTE* output = new BYTE[togo+300];
uLongf newsize = togo+300;
uint16 result = compress2(output,&newsize,data,togo,9);
if (result != Z_OK || togo <= newsize){
delete[] output;
CreateStandartPackets(data,togo,currentblock);
return;
}
m_bUsedComprUp = true;
CMemFile memfile(output,newsize);
togo = newsize;
uint32 nPacketSize;
if (togo > 10240)
nPacketSize = togo/(uint32)(togo/10240);
else
nPacketSize = togo;
while (togo){
if (togo < nPacketSize*2)
nPacketSize = togo;
togo -= nPacketSize;
Packet* packet = new Packet(OP_COMPRESSEDPART,nPacketSize+24,OP_EMULEPROT);
memcpy(&packet->pBuffer[0],GetUploadFileID(),16);
uint32 statpos = currentblock->StartOffset;
memcpy(&packet->pBuffer[16],&statpos,4);
memcpy(&packet->pBuffer[20],&newsize,4);
memfile.Read(&packet->pBuffer[24],nPacketSize);
m_BlockSend_queue.AddTail(packet);
}
delete[] output;
}
void CUpDownClient::SetUploadFileID(uchar* tempreqfileid){
CKnownFile* newreqfile = NULL;
if( tempreqfileid )
newreqfile = theApp.sharedfiles->GetFileByID(tempreqfileid);
CKnownFile* oldreqfile = theApp.sharedfiles->GetFileByID(requpfileid);
if(newreqfile == oldreqfile)
return;
if(newreqfile){
newreqfile->AddQueuedCount();
newreqfile->AddUploadingClient(this);
memcpy(requpfileid,tempreqfileid,16);
}
else{
for( int i = 0; i <16; i++)
requpfileid[i] = 0;
}
if(oldreqfile){
oldreqfile->SubQueuedCount();
oldreqfile->RemoveUploadingClient(this);
}
}
void CUpDownClient::AddReqBlock(Requested_Block_Struct* reqblock){
for (POSITION pos = m_DoneBlocks_list.GetHeadPosition();pos != 0;m_DoneBlocks_list.GetNext(pos)){
if (reqblock->StartOffset == m_DoneBlocks_list.GetAt(pos)->StartOffset && reqblock->EndOffset == m_DoneBlocks_list.GetAt(pos)->EndOffset){
delete reqblock;
return;
}
}
for (POSITION pos = m_BlockRequests_queue.GetHeadPosition();pos != 0;m_BlockRequests_queue.GetNext(pos)){
if (reqblock->StartOffset == m_BlockRequests_queue.GetAt(pos)->StartOffset && reqblock->EndOffset == m_BlockRequests_queue.GetAt(pos)->EndOffset){
delete reqblock;
return;
}
}
m_BlockRequests_queue.AddTail(reqblock);
}
uint32 CUpDownClient::SendBlockData(uint32 nMaxAmmount){
m_AvarageUDR_list.AddTail(dataratems);
m_nSumForAvgUpDataRate += dataratems;
if (m_AvarageUDR_list.GetCount() > 500)
m_nSumForAvgUpDataRate -= m_AvarageUDR_list.RemoveHead();
if(m_AvarageUDR_list.GetCount() > 10)
m_nUpDatarate = 10 * m_nSumForAvgUpDataRate / m_AvarageUDR_list.GetCount();
else
m_nUpDatarate = 0;
m_cSendblock++;
if (m_cSendblock == 30){
m_cSendblock = 0;
theApp.emuledlg->transferwnd.uploadlistctrl.RefreshClient(this);
theApp.emuledlg->transferwnd.clientlistctrl.RefreshClient(this);
}
dataratems = 0;
if (socket && !socket->IsBusy()){
if (m_BlockSend_queue.IsEmpty()){
if (!CreateNextBlockPackage())
return 0;
}
m_nMaxSendAllowed += nMaxAmmount;
if (m_BlockSend_queue.GetHead()->GetRealPacketSize() > 0/*m_nMaxSendAllowed*3*/
&& m_BlockSend_queue.GetHead()->GetRealPacketSize() > MAXFRAGSIZE*2){
// splitting packets
uint32 nSize = m_BlockSend_queue.GetHead()->GetRealPacketSize();
char* pBuffer = m_BlockSend_queue.GetHead()->DetachPacket();
delete m_BlockSend_queue.RemoveHead();
uint32 nPos = nSize;
bool bLast = true;
while (nPos){
uint32 nNewSize = (nPos < MAXFRAGSIZE) ? nPos : MAXFRAGSIZE;
nPos -= nNewSize;
char* pBuffer2 = new char[nNewSize];
memcpy(pBuffer2,pBuffer+nPos,nNewSize);
m_BlockSend_queue.AddHead(new Packet(pBuffer2,nNewSize,bLast));
bLast = false;
}
delete[] pBuffer;
}
while (!m_BlockSend_queue.IsEmpty()
&& m_BlockSend_queue.GetHead()->GetRealPacketSize() <= m_nMaxSendAllowed){
Packet* tosend = m_BlockSend_queue.RemoveHead();
uint32 nBlockSize = tosend->GetRealPacketSize();
m_nMaxSendAllowed -= nBlockSize;
// theApp.uploadqueue->AddUpDataOverheadOther(0, 24);
socket->SendPacket(tosend,true,false);
m_nTransferedUp += nBlockSize;
theApp.UpdateSentBytes(nBlockSize);
credits->AddUploaded(nBlockSize);
if (m_BlockSend_queue.IsEmpty())
CreateNextBlockPackage();
}
dataratems = nMaxAmmount;
return nMaxAmmount;
}
return 0;
}
void CUpDownClient::FlushSendBlocks(){ // call this when you stop upload, or the socket might be not able to send
bool bBreak = false;
while (!m_BlockSend_queue.IsEmpty() && m_BlockSend_queue.GetHead()->IsSplitted() && socket && socket->IsConnected() && !bBreak ){
Packet* tosend = m_BlockSend_queue.RemoveHead();
bool bBreak = tosend->IsLastSplitted();
theApp.uploadqueue->AddUpDataOverheadOther(tosend->size);
socket->SendPacket(tosend,true,false);
}
}
void CUpDownClient::SendHashsetPacket(char* forfileid){
CKnownFile* file = theApp.sharedfiles->GetFileByID((uchar*)forfileid);
if (!file)
throw GetResString(IDS_ERR_REQ_FNF)+CString(" (SendHashsetPacket)");
CMemFile* data = new CMemFile();
data->Write(file->GetFileHash(),16);
uint16 parts = file->GetHashCount();
data->Write(&parts,2);
for (int i = 0; i != parts; i++)
data->Write(file->GetPartHash(i),16);
Packet* packet = new Packet(data);
packet->opcode = OP_HASHSETANSWER;
delete data;
theApp.uploadqueue->AddUpDataOverheadFileRequest(packet->size);
socket->SendPacket(packet,true,true);
}
void CUpDownClient::ClearUploadBlockRequests(){
FlushSendBlocks();
for (POSITION pos = m_BlockRequests_queue.GetHeadPosition();pos != 0;m_BlockRequests_queue.GetNext(pos))
delete m_BlockRequests_queue.GetAt(pos);
m_BlockRequests_queue.RemoveAll();
for (POSITION pos = m_DoneBlocks_list.GetHeadPosition();pos != 0;m_DoneBlocks_list.GetNext(pos))
delete m_DoneBlocks_list.GetAt(pos);
m_DoneBlocks_list.RemoveAll();
for (POSITION pos = m_BlockSend_queue.GetHeadPosition();pos != 0;m_BlockSend_queue.GetNext(pos))
delete m_BlockSend_queue.GetAt(pos);
m_BlockSend_queue.RemoveAll();
}
void CUpDownClient::SendRankingInfo(){
if (!ExtProtocolAvailable())
return;
uint16 nRank = theApp.uploadqueue->GetWaitingPosition(this);
if (!nRank)
return;
Packet* packet = new Packet(OP_QUEUERANKING,12,OP_EMULEPROT);
memset(packet->pBuffer,0,12);
memcpy(packet->pBuffer+0,&nRank,2);
theApp.uploadqueue->AddUpDataOverheadOther(packet->size);
socket->SendPacket(packet,true,true);
}
void CUpDownClient::SendCommentInfo(CKnownFile *file) {
if (!m_bCommentDirty || file == NULL || !ExtProtocolAvailable() || m_byAcceptCommentVer < 1)
return;
m_bCommentDirty = false;
int8 rating=file->GetFileRate();
CString desc=file->GetFileComment();
if(file->GetFileRate() == 0 && desc.IsEmpty())
return;
CMemFile *data = new CMemFile();
data->Write(&rating,sizeof(rating));
int length=desc.GetLength();
if (length>128) length=128;
data->Write(&length,sizeof(length));
if (length>0) data->Write(desc.GetBuffer(),length);
Packet *packet = new Packet(data,OP_EMULEPROT);
packet->opcode = OP_FILEDESC;
delete data;
theApp.uploadqueue->AddUpDataOverheadOther(packet->size);
socket->SendPacket(packet,true);
}
void CUpDownClient::AddRequestCount(uchar* fileid){
for (POSITION pos = m_RequestedFiles_list.GetHeadPosition();pos != 0;m_RequestedFiles_list.GetNext(pos)){
Requested_File_Struct* cur_struct = m_RequestedFiles_list.GetAt(pos);
if (!memcmp(cur_struct->fileid,fileid,16)){
if (::GetTickCount() - cur_struct->lastasked < MIN_REQUESTTIME && !GetFriendSlot()){
if (GetDownloadState() != DS_DOWNLOADING)
cur_struct->badrequests++;
if (cur_struct->badrequests == BADCLIENTBAN){
Ban();
}
}
else{
if (cur_struct->badrequests)
cur_struct->badrequests--;
}
cur_struct->lastasked = ::GetTickCount();
return;
}
}
Requested_File_Struct* new_struct = new Requested_File_Struct;
memset(new_struct,0,sizeof(Requested_File_Struct));
memcpy(new_struct->fileid,fileid,16);
new_struct->lastasked = ::GetTickCount();
m_RequestedFiles_list.AddHead(new_struct);
}
void CUpDownClient::UnBan(){
m_bBanned = false;
m_dwBanTime = 0;
SetWaitStartTime();
theApp.uploadqueue->UpdateBanCount();
theApp.emuledlg->transferwnd.ShowQueueCount(theApp.uploadqueue->GetWaitingUserCount());
for (POSITION pos = m_RequestedFiles_list.GetHeadPosition();pos != 0;m_RequestedFiles_list.GetNext(pos)){
Requested_File_Struct* cur_struct = m_RequestedFiles_list.GetAt(pos);
cur_struct->badrequests = 0;
cur_struct->lastasked = 0;
}
// theApp.emuledlg->transferwnd.queuelistctrl.RefreshClient(this, true, true);
}
void CUpDownClient::Ban(){
m_bBanned = true;
theApp.uploadqueue->UpdateBanCount();
theApp.emuledlg->transferwnd.ShowQueueCount(theApp.uploadqueue->GetWaitingUserCount());
m_dwBanTime = ::GetTickCount();
theApp.emuledlg->transferwnd.queuelistctrl.RefreshClient(this);
theApp.emuledlg->AddDebugLogLine(false,GetResString(IDS_CLIENTBLOCKED),GetUserName());
}
void CUpDownClient::UDPFileReasked(){
AddAskedCount();
SetLastUpRequest();
uint16 nRank = theApp.uploadqueue->GetWaitingPosition(this);
Packet* response = new Packet(OP_REASKACK,2,OP_EMULEPROT);
memcpy(response->pBuffer,&nRank,2);
theApp.uploadqueue->AddUpDataOverheadFileRequest(response->size);
theApp.clientudp->SendPacket(response,GetIP(),GetUDPPort());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -