⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evauhmanager.cpp

📁 linux下的eva源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		++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 + -