www.pudn.com > DCPlusPlus-src.zip > SearchManager.h


	/*  
 * Copyright (C) 2001-2004 Jacek Sieka, j_s at telia com 
 * 
 * This program is free software; you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 2 of the License, or 
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
 */ 
 
#if !defined(AFX_SEARCHMANAGER_H__E8F009DF_D216_4F8F_8C81_07D2FA0BFB7F__INCLUDED_) 
#define AFX_SEARCHMANAGER_H__E8F009DF_D216_4F8F_8C81_07D2FA0BFB7F__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include "SettingsManager.h" 
 
#include "Socket.h" 
#include "User.h" 
#include "Thread.h" 
#include "Client.h" 
#include "Singleton.h" 
#include "FastAlloc.h" 
#include "MerkleTree.h" 
 
#include "SearchManagerListener.h" 
 
class SearchManager; 
 
class SearchResult : public FastAlloc { 
public:	 
 
	enum Types { 
		TYPE_FILE, 
		TYPE_DIRECTORY 
	}; 
 
	typedef SearchResult* Ptr; 
	typedef vector List; 
	typedef List::iterator Iter; 
	 
	SearchResult(Client* aClient, Types aType, int64_t aSize, const string& name, TTHValue* aTTH, bool aUtf8); 
 
	SearchResult(const User::Ptr& aUser, Types aType, int aSlots, int aFreeSlots,  
		int64_t aSize, const string& aFile, const string& aHubName,  
		const string& aHubIpPort, const string& aIp, bool aUtf8) : 
	file(aFile), hubName(isTTH(aHubName) ? Util::emptyString : aHubName), hubIpPort(aHubIpPort), user(aUser),  
		size(aSize), type(aType), slots(aSlots), freeSlots(aFreeSlots), IP(aIp),  
		tth(isTTH(aHubName) ? new TTHValue(aHubName.substr(4)) : NULL), utf8(aUtf8), ref(1) { } 
 
	SearchResult(const User::Ptr& aUser, Types aType, int aSlots, int aFreeSlots,  
		int64_t aSize, const string& aFile, const string& aHubName,  
		const string& aHubIpPort, TTHValue* aTTH, bool aUtf8) : 
	file(aFile), hubName(aHubName), hubIpPort(aHubIpPort), user(aUser),  
		size(aSize), type(aType), slots(aSlots), freeSlots(aFreeSlots),  
		tth((aTTH != NULL) ? new TTHValue(*aTTH) : NULL), utf8(aUtf8), ref(1) { } 
 
	string getFileName() const; 
	string toSR() const; 
	string toRES() const; 
 
	User::Ptr& getUser() { return user; } 
	string getSlotString() const { return Util::toString(getFreeSlots()) + '/' + Util::toString(getSlots()); } 
 
	const string& getFile() const { return file; } 
	const string& getHubIpPort() const { return hubIpPort; } 
	const string& getHubName() const { return hubName.empty() ? user->getClientName() : hubName; } 
	int64_t getSize() const { return size; } 
	Types getType() const { return type; } 
	int getSlots() const { return slots; } 
	int getFreeSlots() const { return freeSlots; } 
	const string& getIP() const { return IP; } 
	TTHValue* getTTH() const { return tth; } 
	bool getUtf8() const { return utf8; } 
 
	void incRef() { Thread::safeInc(&ref); } 
	void decRef() {  
		if(Thread::safeDec(&ref) == 0)  
			delete this;  
	}; 
 
private: 
	friend class SearchManager; 
 
	SearchResult(); 
	~SearchResult() { delete tth; }; 
 
	SearchResult(const SearchResult& rhs); 
 
	string file; 
	string hubName; 
	string hubIpPort; 
	User::Ptr user; 
	int64_t size; 
	Types type; 
	int slots; 
	int freeSlots; 
	string IP; 
	TTHValue* tth; 
	 
	bool utf8; 
	long ref; 
 
	bool isTTH(const string& str) const { 
		return str.compare(0, 4, "TTH:") == 0; 
	} 
}; 
 
class SearchManager : public Speaker, public Singleton, public Thread 
{ 
public: 
	enum SizeModes { 
		SIZE_DONTCARE = 0x00, 
		SIZE_ATLEAST = 0x01, 
		SIZE_ATMOST = 0x02, 
	}; 
 
	enum TypeModes { 
		TYPE_ANY = 0, 
		TYPE_AUDIO, 
		TYPE_COMPRESSED, 
		TYPE_DOCUMENT, 
		TYPE_EXECUTABLE, 
		TYPE_PICTURE, 
		TYPE_VIDEO, 
		TYPE_DIRECTORY, 
		TYPE_HASH 
	}; 
	 
	void search(const string& aName, int64_t aSize = 0, TypeModes aTypeMode = TYPE_ANY, SizeModes aSizeMode = SIZE_ATLEAST); 
	void search(const string& aName, const string& aSize, TypeModes aTypeMode = TYPE_ANY, SizeModes aSizeMode = SIZE_ATLEAST) { 
		search(aName, Util::toInt64(aSize), aTypeMode, aSizeMode); 
	} 
	 
	void search(StringList& who, const string& aName, int64_t aSize = 0, TypeModes aTypeMode = TYPE_ANY, SizeModes aSizeMode = SIZE_ATLEAST); 
	void search(StringList& who, const string& aName, const string& aSize, TypeModes aTypeMode = TYPE_ANY, SizeModes aSizeMode = SIZE_ATLEAST) { 
		search(who, aName, Util::toInt64(aSize), aTypeMode, aSizeMode); 
	} 
	static string clean(const string& aSearchString); 
	 
	short getPort() 
	{ 
		return port; 
	} 
 
	void setPort(short aPort) throw(SocketException); 
	void disconnect() throw(); 
	void onSearchResult(const string& aLine) { 
		onData((const u_int8_t*)aLine.data(), aLine.length(), Util::emptyString); 
	} 
	 
private: 
	 
	Socket* socket; 
	short port; 
	bool stop; 
	friend class Singleton; 
 
	SearchManager() : socket(NULL), port(0), stop(false) {  }; 
 
	virtual int run(); 
 
	virtual ~SearchManager() {  
		if(socket) { 
			stop = true; 
			socket->disconnect(); 
			join(); 
			delete socket; 
		} 
	}; 
 
	void onData(const u_int8_t* buf, size_t aLen, const string& address); 
}; 
 
#endif // !defined(AFX_SEARCHMANAGER_H__E8F009DF_D216_4F8F_8C81_07D2FA0BFB7F__INCLUDED_) 
 
/** 
 * @file 
 * $Id: SearchManager.h,v 1.44 2004/09/23 09:06:26 arnetheduck Exp $ 
 */