1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net )
6 //
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
9 // respective authors.
10 //
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
24 //
25 
26 #ifndef SEARCHLIST_H
27 #define SEARCHLIST_H
28 
29 #include "Timer.h"		// Needed for CTimer
30 #include "ObservableQueue.h"	// Needed for CQueueObserver
31 #include "SearchFile.h"		// Needed for CSearchFile
32 #include <common/SmartPtr.h>	// Needed for CSmartPtr
33 
34 
35 class CMemFile;
36 class CMD4Hash;
37 class CPacket;
38 class CServer;
39 class CSearchFile;
40 
41 namespace Kademlia {
42 	class CUInt128;
43 }
44 
45 
46 enum SearchType {
47 	LocalSearch,
48 	GlobalSearch,
49 	KadSearch
50 };
51 
52 
53 typedef std::vector<CSearchFile*> CSearchResultList;
54 
55 
56 class CSearchList : public wxEvtHandler
57 {
58 public:
59 	//! Structure used to pass search-parameters.
60 	struct CSearchParams
61 	{
62 		/** Prevents accidential use of uninitialized variables. */
CSearchParamsCSearchParams63 		CSearchParams() { minSize = maxSize = availability = 0; }
64 
65 		//! The actual string to search for.
66 		wxString searchString;
67 		//! The keyword selected for Kad search
68 		wxString strKeyword;
69 		//! The type of files to search for (may be empty), one of ED2KFTSTR_*
70 		wxString typeText;
71 		//! The filename extension. May be empty.
72 		wxString extension;
73 		//! The smallest filesize in bytes to accept, zero for any.
74 		uint64_t minSize;
75 		//! The largest filesize in bytes to accept, zero for any.
76 		uint64_t maxSize;
77 		//! The minumum available (source-count), zero for any.
78 		uint32_t availability;
79 	};
80 
81 	/** Constructor. */
82 	CSearchList();
83 
84 	/** Frees any remaining search-results. */
85 	~CSearchList();
86 
87 	/**
88 	 * Starts a new search.
89 	 *
90 	 * @param searchID The ID of the search, which may be modified.
91 	 * @param type The type of search, see SearchType.
92 	 * @param params The search parameters, see CSearchParams.
93 	 * @return An empty string on success, otherwise an error-message.
94 	 */
95 	wxString StartNewSearch(uint32* searchID, SearchType type, CSearchParams& params);
96 
97 	/** Stops the current search (global or Kad), if any is in progress. */
98 	void StopSearch(bool globalOnly = false);
99 
100 	/** Returns the completion percentage of the current search. */
101 	uint32 GetSearchProgress() const;
102 
103 	/** This function is called once the local (ed2k) search has ended. */
104 	void	LocalSearchEnd();
105 
106 
107 	/**
108 	 * Returns the list of results for the specified search.
109 	 *
110 	 * If the search is not valid, an empty list is returned.
111 	 */
112 	const	CSearchResultList& GetSearchResults(long searchID) const;
113 
114 	/** Removes all results for the specified search. */
115 	void	RemoveResults(long searchID);
116 
117 
118 	/** Finds the search-result (by hash) and downloads it in the given category. */
119 	void	AddFileToDownloadByHash(const CMD4Hash& hash, uint8 category = 0);
120 
121 
122 	/**
123 	 * Processes a list of shared files from a client.
124 	 *
125 	 * @param packet The raw packet received from the client.
126 	 * @param size the length of the packet.
127 	 * @param sender The sender of the packet.
128 	 * @param moreResultsAvailable Set to a value specifying if more results are available.
129 	 * @param directory The directory containing the shared files.
130 	 */
131 	void	ProcessSharedFileList(const byte* packet, uint32 size, CUpDownClient* sender, bool* moreResultsAvailable, const wxString& directory);
132 
133 	/**
134 	 * Processes a search-result sent via TCP from the local server. All results are added.
135 	 *
136 	 * @param packet The packet containing one or more search-results.
137 	 * @param size the length of the packet.
138 	 * @param optUTF8 Specifies if the server supports UTF8.
139 	 * @param serverIP The IP of the server sending the results.
140 	 * @param serverPort The Port of the server sending the results.
141 	 */
142 	void	ProcessSearchAnswer(const uint8_t* packet, uint32_t size, bool optUTF8, uint32_t serverIP, uint16_t serverPort);
143 
144 	/**
145 	 * Processes a search-result sent via UDP. Only one result is read from the packet.
146 	 *
147 	 * @param packet The packet containing one or more search-results.
148 	 * @param optUTF8 Specifies if the server supports UTF8.
149 	 * @param serverIP The IP of the server sending the results.
150 	 * @param serverPort The Port of the server sending the results.
151 	 */
152 	void	ProcessUDPSearchAnswer(const CMemFile& packet, bool optUTF8, uint32 serverIP, uint16 serverPort);
153 
154 
155 	/**
156 	 * Adds a result in the form of a kad search-keyword to the specified result-list.
157 	 *
158 	 * @param searchID The search to which this result belongs.
159 	 * @param fileID The hash of the result-file.
160 	 * @param name The filename of the result.
161 	 * @param size The filesize of the result.
162 	 * @param type The filetype of the result (TODO: Not used?)
163 	 * @param kadPublishInfo The kademlia publish information of the result.
164 	 * @param taglist List of additional tags associated with the search-result.
165 	 */
166 	void	KademliaSearchKeyword(uint32_t searchID, const Kademlia::CUInt128 *fileID, const wxString& name, uint64_t size, const wxString& type, uint32_t kadPublishInfo, const TagPtrList& taglist);
167 
168 	/** Update a certain search result in all lists */
169 	void UpdateSearchFileByHash(const CMD4Hash& hash);
170 
171 	/** Mark current KAD search as finished */
SetKadSearchFinished()172 	void SetKadSearchFinished() { m_KadSearchFinished = true; }
173 
174 private:
175 	/** Event-handler for global searches. */
176 	void OnGlobalSearchTimer(CTimerEvent& evt);
177 
178 	/**
179 	 * Adds the specified file to the current search's results.
180 	 *
181 	 * @param toadd The result to add.
182 	 * @param clientResponse Is the result sent by a client (shared-files list).
183 	 * @return True if the results were added, false otherwise.
184 	 *
185 	 * Note that this function takes ownership of the CSearchFile object,
186 	 * regardless of whenever or not it was actually added to the results list.
187 	 */
188 	bool AddToList(CSearchFile* toadd, bool clientResponse = false);
189 
190 	//! This smart pointer is used to safely prevent leaks.
191 	typedef CSmartPtr<CMemFile> CMemFilePtr;
192 
193 	/** Create a basic search-packet for the given search-type. */
194 	CMemFilePtr CreateSearchData(CSearchParams& params, SearchType type, bool supports64bit, bool& packetUsing64bit);
195 
196 
197 	//! Timer used for global search intervals.
198 	CTimer	m_searchTimer;
199 
200 	//! The current search-type, regarding the last/current search.
201 	SearchType	m_searchType;
202 
203 	//! Specifies if a search is being performed.
204 	bool		m_searchInProgress;
205 
206 	//! The ID of the current search.
207 	long		m_currentSearch;
208 
209 	//! The current packet used for searches.
210 	CPacket*	m_searchPacket;
211 
212 	//! Does the current search packet contain 64bit values?
213 	bool		m_64bitSearchPacket;
214 
215 	//! If the current search is a KAD search this signals if it is finished.
216 	bool		m_KadSearchFinished;
217 
218 	//! Queue of servers to ask when doing global searches.
219 	//! TODO: Replace with 'cookie' system.
220 	CQueueObserver<CServer*> m_serverQueue;
221 
222 	//! Shorthand for the map of results (key is a SearchID).
223 	typedef std::map<long, CSearchResultList> ResultMap;
224 
225 	//! Map of all search-results added.
226 	ResultMap	m_results;
227 
228 	//! Contains the results type desired in the current search.
229 	//! If not empty, results of different types are filtered.
230 	wxString	m_resultType;
231 
232 
233 	DECLARE_EVENT_TABLE()
234 };
235 
236 
237 #endif // SEARCHLIST_H
238 // File_checked_for_headers
239