📄 evauhmanager.cpp
字号:
++it; } UHInfoItem item; item.id = 0; return item;}QString EvaUHProfile::getStrMd5(const unsigned int id){ return EvaHelper::md5ToString(getMd5(id));}/************************************************************************************************/EvaUHManager::EvaUHManager(QObject *receiver, const QString &dir) : QObject(), QThread(), mReceiver(receiver), AllInfoGotCounter(0), mUHDir(dir), mAskForStop(false), mSocket(NULL), mProfileManager(NULL), mCurrentFile(NULL), mDns(NULL){}EvaUHManager::~EvaUHManager(){ cleanUp(); if(mProfileManager) delete mProfileManager; mProfileManager = NULL;}void EvaUHManager::initiate(){ if(mProfileManager) delete mProfileManager; mProfileManager = new EvaUHProfile(); mProfileManager->dir = mUHDir; if(mProfileManager->loadProfile()){ QMap<unsigned int, UHInfoItem>::Iterator it = mProfileManager->list.begin(); while(it != mProfileManager->list.end()){ QString filename = getFileName(it.data().id); imageOnList[it.key()] = QImage(filename); if(imageOnList[it.key()].isNull()) printf("EvaUHManager::initiate() -- NULL Image :%s\n", filename.ascii()); filename = getFileName(it.data().id, true); imageOffList[it.key()] = QImage(filename); ++it; } }}void EvaUHManager::run(){ doDnsRequest(); int availableBytes = 0; bytesRead = 0; mSocket = new QSocketDevice(QSocketDevice::Datagram); doAllInfoRequest(); while(1){ if( (availableBytes = mSocket->bytesAvailable()) ){ bytesRead = mSocket->readBlock(mBuffer, availableBytes); if(bytesRead != availableBytes) fprintf(stderr, "EvaUHManager:run -- bytes read might not be accurate\n"); if(bytesRead) processComingData(); } else{ checkTimeout(); msleep( 200 ); } if(mAskForStop) break; } printf("EvaUHManager runs finished\n"); cleanUp();}void EvaUHManager::doDnsRequest(){ mHostAddresses.clear(); if(mDns) delete mDns; mDns = new QDns(CFACE_SERVER); QObject::connect(mDns, SIGNAL(resultsReady()), SLOT(slotDnsReady())); while(!mHostAddresses.size()){ if(mAskForStop) break; printf("EvaUHManager::doDnsRequest -- waiting DNS\n"); sleep(1); }}void EvaUHManager::slotDnsReady(){ printf("EvaUHManager::slotDnsReady ---- got\n"); mHostAddresses = mDns->addresses(); if(!mHostAddresses.size()){ QHostAddress host; host.setAddress("219.133.51.161"); mHostAddresses.append(host); }}void EvaUHManager::send(EvaUHPacket *packet){ if(! (mSocket && mSocket->isValid()) ){ fprintf(stderr, "EvaUHManager::send -- socket error\n"); delete packet; return; } unsigned char *buffer = new unsigned char[4096]; int len = 0; packet->fill(buffer, &len); int results = mSocket->writeBlock((char*)buffer, len, mHostAddresses.first(), CFACE_PORT); delete []buffer; if(results ==-1 ){ fprintf(stderr, "EvaUHManager::send -- socket error, writing failed\n"); } if(results != len) { fprintf(stderr, "EvaUHManager::send -- writing bytes not equal to sending\n"); } delete packet;}void EvaUHManager::doAllInfoRequest(){ std::list<unsigned int> toSend; std::list<unsigned int>::iterator it; int counter = 0; //printf("EvaUHManager::doAllInfoRequest -- AllInfoGotCounter: %d\n", AllInfoGotCounter); if(AllInfoGotCounter < mUHList.size()){ it=mUHList.begin(); for(unsigned int i=0; i<AllInfoGotCounter ;++it) i++; for(; it!=mUHList.end(); ++it){ toSend.push_back(*it); counter++; if(counter>=20) break; } } if(!toSend.size()) return; //printf("EvaUHManager::doAllInfoRequest -- %d Buddies sent\n", toSend.size()); EvaUHInfoRequest *packet = new EvaUHInfoRequest(); packet->setQQList(toSend); send(packet); cmdSent = All_Info; timeSent = QDateTime::currentDateTime();}void EvaUHManager::processComingData(){ switch(cmdSent){ case No_CMD: break; case All_Info: processAllInfoReply(); break; case Buddy_Info: processBuddyInfoReply(); break; case Buddy_File: processBuddyFileReply(); break; default: //make some compilers happy :) break; }}void EvaUHManager::processAllInfoReply(){ //printf("EvaUHManager::processAllInfoReply \n"); if(!mProfileManager) return; EvaUHInfoReply *packet = new EvaUHInfoReply((unsigned char *)mBuffer, bytesRead); if(packet->parse()){ // good packet if(!packet->isSuccessful()){ // no UH picture available //mProfileManager->remove(); //mProfileManager->saveProfile(); delete packet; return; } std::list<UHInfoItem> list= packet->getInfoItems(); AllInfoGotCounter += list.size(); std::list<UHInfoItem>::iterator it = list.begin(); while(it!=list.end()){ if(mProfileManager) mProfileManager->updateInfo(*it); ++it; } if(AllInfoGotCounter < mUHList.size()){ doAllInfoRequest(); }else{ // now we start download User Head :) if(!doInfoRequest()) // return false means all done mAskForStop = true; } } delete packet;}bool EvaUHManager::doInfoRequest(){ //printf("EvaUHManager::doInfoRequest\n"); UHInfoItem item = mProfileManager->nextDownload(); if(!(item.id)) // if id == 0, no file need download, we finish return false; std::list<unsigned int> qqList; qqList.push_back(item.id); EvaUHInfoRequest *packet = new EvaUHInfoRequest(); packet->setQQList(qqList); send(packet); // send method will delete sPacket cmdSent = Buddy_Info; timeSent = QDateTime::currentDateTime(); return true;}void EvaUHManager::doTransferRequest(const unsigned int id, const unsigned int sid, const unsigned int start, const unsigned int end){ //printf("EvaUHManager::doTransferRequest:\n\tid: %d, sid: %8x, s: %8x, e: %8x\n", id, sid, start, end); EvaUHTransferRequest *packet = new EvaUHTransferRequest(); packet->setUHInfo(id, sid); packet->setFileInfo(start, end); send(packet); // send method will delete sPacket cmdSent = Buddy_File; timeSent = QDateTime::currentDateTime();}void EvaUHManager::processBuddyInfoReply(){ //printf("EvaUHManager::processBuddyInfoReply\n"); if(!mProfileManager) return; EvaUHInfoReply *packet = new EvaUHInfoReply((unsigned char *)mBuffer, bytesRead); if(packet->parse()){ // good packet if(!packet->isSuccessful()){ // no UH picture available delete packet; return; } std::list<UHInfoItem> list= packet->getInfoItems(); std::list<UHInfoItem>::iterator it = list.begin(); // actually this should be at most one element //FIXME we should check the new information //if(mProfileManager) mProfileManager->updateInfo(*it); // now we start download User Head :) UHInfoItem item = mProfileManager->nextDownload(); if(!(item.id)) { // if id == 0, no file need download, we finish mAskForStop = true; delete packet; return; } if(mCurrentFile) delete mCurrentFile; mCurrentFile = new EvaUHFile(item.id); mCurrentFile->setFileInfo(item.md5, item.sessionId); unsigned int fstart, fend; mCurrentFile->nextBlock(&fstart, &fend); doTransferRequest(item.id, item.sessionId, fstart, fend); } delete packet;}void EvaUHManager::processBuddyFileReply(){ EvaUHTransferReply *packet = new EvaUHTransferReply((unsigned char *)mBuffer, bytesRead); if(packet->parse()){ if(!packet->isDataPacket()){ // this is a notification, transfer will start very soon //printf("EvaUHManager::processBuddyFileReply -- Start Soon!!!\n"); delete packet; return; } if(mCurrentFile){ //printf("EvaUHManager::processBuddyFileReply -- No Pkts:%d, Pkt No:%d\n", // packet->getNumPackets(), packet->getPacketNum()); mCurrentFile->setFileBlock(packet->getNumPackets(), packet->getPacketNum(), packet->getFileSize(), packet->getStart(), packet->getPartSize(), packet->getPartData() ); if(mCurrentFile->isFinished()){ if(mCurrentFile->isMD5Correct()){ mCurrentFile->save(mUHDir); mProfileManager->fileFinished(packet->getQQ()); mProfileManager->saveProfile(); QImage imgOn = QImage(getFileName(packet->getQQ())); QImage imgOff = QImage(getFileName(packet->getQQ(), true)); imageOnList[packet->getQQ()] = imgOn; imageOffList[packet->getQQ()] = imgOff; EvaUHReadyEvent *event = new EvaUHReadyEvent(); event->setQQ(packet->getQQ()); event->setImages(imgOn, imgOff); QApplication::postEvent(mReceiver, event); delete mCurrentFile; mCurrentFile = NULL; // hah, let GUI know we got one pic! //QApplication::postEvent(); // now we download next User Head if(!doInfoRequest()){ // return false means all done mAskForStop = true; cmdSent = All_Done; } }else mCurrentFile->initSettings(); // we clear all contents of the file } } }}void EvaUHManager::checkTimeout(){ if(mAskForStop || cmdSent == All_Done) return; int last = timeSent.secsTo(QDateTime::currentDateTime()); if(last >= UH_TIME_OUT){ //printf("EvaUHManager::checkTimeout : %d\n", cmdSent); switch(cmdSent){ case All_Info: doAllInfoRequest(); break; case Buddy_Info: if(!doInfoRequest()) // return false means all done mAskForStop = true; break; case Buddy_File:{ if(!mCurrentFile){ UHInfoItem item = mProfileManager->nextDownload(); mCurrentFile = new EvaUHFile(item.id); mCurrentFile->setFileInfo(item.md5, item.sessionId); } unsigned int fstart, fend, sid; sid = mCurrentFile->nextBlock(&fstart, &fend); if(!sid) // if no session id, we ask for it doInfoRequest(); else // otherwise, download it doTransferRequest(mCurrentFile->getQQ(), sid, fstart, fend); } break; default: break; } }}void EvaUHManager::cleanUp(){ printf("EvaUHManager::cleanUp\n"); AllInfoGotCounter = 0; if(mSocket ) delete mSocket; mSocket = NULL; if(mCurrentFile) delete mCurrentFile; mCurrentFile = NULL; if(mDns) delete mDns; mDns = NULL;}void EvaUHManager::stop( ){ mAskForStop = true;}QString EvaUHManager::getFileName(const unsigned int id, bool isGrayscale){ if(!mProfileManager) return ""; QString strMd5 = mProfileManager->getStrMd5(id); if(strMd5.isEmpty()) return strMd5; if(isGrayscale) strMd5 += "_off.bmp"; else strMd5 += ".bmp"; QString fileName = mUHDir + "/" + strMd5; QFile file(fileName); if(!file.exists()) fileName = ""; return fileName;}QImage *EvaUHManager::getUHImage(const unsigned int id, bool isGrayscale){ QImage * result; QMap<unsigned int, QImage>::Iterator it; if(isGrayscale){ it = imageOffList.find(id); if(it == imageOffList.end()) result = NULL; else result = &(it.data()); }else{ it = imageOnList.find(id); if(it == imageOnList.end()) result = NULL; else result = &(it.data()); } return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -