Upstream tarball 20080414
[amule.git] / src / SearchList.h
blob967052de4b0524bf0d0f3d7a3ac5b58e1c06f2da
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002 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.
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.
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
26 #ifndef SEARCHLIST_H
27 #define SEARCHLIST_H
29 #include "Timer.h" // Needed for CTimer
30 #include "ObservableQueue.h" // Needed for CQueueObserver
31 #include "SearchFile.h" // Needed for CSearchFile
32 #include <memory> // Do_not_auto_remove (lionel's Mac, 10.3)
35 class CMemFile;
36 class CMD4Hash;
37 class CPacket;
38 class CServer;
39 class CSearchFile;
41 namespace Kademlia {
42 class CUInt128;
46 enum SearchType {
47 LocalSearch,
48 GlobalSearch,
49 KadSearch
53 typedef std::vector<CSearchFile*> CSearchResultList;
56 class CSearchList : public wxEvtHandler
58 public:
59 //! Structure used to pass search-parameters.
60 struct CSearchParams
62 /** Prevents accidential use of uninitialized variables. */
63 CSearchParams() { minSize = maxSize = availability = 0; }
65 //! The actual string to search for.
66 wxString searchString;
67 //! The type of files to search for (may be empty), one of ED2KFTSTR_*
68 wxString typeText;
69 //! The filename extension. May be empty.
70 wxString extension;
71 //! The smallest filesize in bytes to accept, zero for any.
72 uint32 minSize;
73 //! The largest filesize in bytes to accept, zero for any.
74 uint32 maxSize;
75 //! The minumum available (source-count), zero for any.
76 uint32 availability;
79 /** Constructor. */
80 CSearchList();
82 /** Frees any remaining search-results. */
83 ~CSearchList();
85 /**
86 * Starts a new search.
88 * @param searchID The ID of the search, which may be modified.
89 * @param type The type of search, see SearchType.
90 * @param params The search parameters, see CSearchParams.
91 * @return An empty string on success, otherwise an error-message.
92 */
93 wxString StartNewSearch(uint32* searchID, SearchType type, const CSearchParams& params);
95 /** Stops the current search, if any is in progress. */
96 void StopGlobalSearch();
98 /** Returns the completion percentage of the current search. */
99 uint32 GetSearchProgress() const;
101 /** This function is called once the local (ed2k) search has ended. */
102 void LocalSearchEnd();
106 * Returns the list of results for the specified search.
108 * If the search is not valid, an empty list is returned.
110 const CSearchResultList& GetSearchResults(long searchID) const;
112 /** Removes all results for the specified search. */
113 void RemoveResults(long searchID);
116 /** Finds the search-result (by hash) and downloads it in the given category. */
117 void AddFileToDownloadByHash(const CMD4Hash& hash, uint8 category = 0);
121 * Processes a list of shared files from a client.
123 * @param packet The raw packet received from the client.
124 * @param size the length of the packet.
125 * @param sender The sender of the packet.
126 * @param moreResultsAvailable Set to a value specifying if more results are available.
127 * @param directory The directory containing the shared files.
129 void ProcessSharedFileList(const byte* packet, uint32 size, CUpDownClient* sender, bool* moreResultsAvailable, const wxString& directory);
132 * Processes a search-result sent via TCP from the local server. All results are added.
134 * @param packet The packet containing one or more search-results.
135 * @param size the length of the packet.
136 * @param optUTF8 Specifies if the server supports UTF8.
137 * @param serverIP The IP of the server sending the results.
138 * @param serverPort The Port of the server sending the results.
140 void ProcessSearchAnswer(const byte* packet, uint32 size, bool optUTF8, uint32 serverIP, uint16 serverPort);
143 * Processes a search-result sent via UDP. Only one result is read from the packet.
145 * @param packet The packet containing one or more search-results.
146 * @param optUTF8 Specifies if the server supports UTF8.
147 * @param serverIP The IP of the server sending the results.
148 * @param serverPort The Port of the server sending the results.
150 void ProcessUDPSearchAnswer(const CMemFile& packet, bool optUTF8, uint32 serverIP, uint16 serverPort);
154 * Adds a result in the form of a kad search-keyword to the specified result-list.
156 * @param searchID The search to which this result belongs.
157 * @param pfileID The hash of the result-file.
158 * @param name The filename of the result.
159 * @param size The filesize of the result.
160 * @param type The filetype of the result (TODO: Not used?)
161 * @param taglist List of additional tags assosiated with the search-result.
163 void KademliaSearchKeyword(uint32 searchID, const Kademlia::CUInt128* pfileID, const wxString& name, uint64 size, const wxString& type, const TagPtrList& taglist);
166 private:
167 /** Event-handler for global searches. */
168 void OnGlobalSearchTimer(CTimerEvent& evt);
171 * Adds the specified file to the current search's results.
173 * @param toadd The result to add.
174 * @param clientResponse Is the result sent by a client (shared-files list).
175 * @return True if the results were added, false otherwise.
177 * Note that this function takes ownership of the CSearchFile object,
178 * regardless of whenever or not it was actually added to the results list.
180 bool AddToList(CSearchFile* toadd, bool clientResponse = false);
182 //! This auto-pointer is used to safely prevent leaks.
183 typedef std::auto_ptr<CMemFile> CMemFilePtr;
185 /** Create a basic search-packet for the given search-type. */
186 CMemFilePtr CreateSearchData(const CSearchParams& params, SearchType type);
189 //! Timer used for global search intervals.
190 CTimer m_searchTimer;
192 //! The current search-type, regarding the last/current search.
193 SearchType m_searchType;
195 //! Specifies if a search is being performed.
196 bool m_searchInProgress;
198 //! The ID of the current search.
199 long m_currentSearch;
201 //! The current packet used for searches.
202 CPacket* m_searchPacket;
204 //! Queue of servers to ask when doing global searches.
205 //! TODO: Replace with 'cookie' system.
206 CQueueObserver<CServer*> m_serverQueue;
208 //! Shorthand for the map of results (key is a SearchID).
209 typedef std::map<long, CSearchResultList> ResultMap;
211 //! Map of all search-results added.
212 ResultMap m_results;
214 //! Contains the results type desired in the current search.
215 //! If not empty, results of different types are filtered.
216 wxString m_resultType;
219 DECLARE_EVENT_TABLE()
223 #endif // SEARCHLIST_H
224 // File_checked_for_headers