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