Fix the equality operator
[amule.git] / src / SearchFile.h
blob9f7eb39b523df807ad86ca0bcc4fff0ebe2e6eac
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.
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.
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 SEARCHFILE_H
27 #define SEARCHFILE_H
29 #include "KnownFile.h" // Needed for CAbstractFile
32 class CMemFile;
33 class CMD4Hash;
34 class CSearchFile;
37 typedef std::vector<CSearchFile*> CSearchResultList;
40 /**
41 * Represents a search-result returned from a server or client.
43 * A file may have either a parent or any number of children.
44 * When a child is added to a result, the parent becomes a generic
45 * representation of all its children, which will include a copy
46 * of the original result. The parent object will contain the sum
47 * of sources (total/complete) and will have the most common
48 * filename. Children are owned by their parents, and can be
49 * displayed on CSearchListCtrl.
51 * Basic file parameters (hash, name, size, rating) can be read
52 * via the CAbstractFile functions. Tags pertaining to meta-data
53 * are stored in the taglist inherited from CAbstractFile.
55 * TODO: Server IP/Port are currently not used.
56 * TODO: Client ID/Port are currently not used.
58 class CSearchFile : public CAbstractFile, public CECID
60 public:
61 /** Constructor used to create results on the remote GUI. */
62 CSearchFile(const class CEC_SearchFile_Tag* tag);
63 /** Copy constructor, also copies children. */
64 CSearchFile(const CSearchFile& other);
66 /**
67 * Normal constructor, reads a result from a packet.
69 * @param data Source of results-packet.
70 * @param optUTF8 Specifies if text-strings are to be read as UTF8.
71 * @param searchID searchID The
72 * @param serverIP The IP of the server that sent this result.
73 * @param serverPort The port of the server that sent this result.
74 * @param directory If from a clients shared files, the directory this file is in.
75 * @param kademlia Specifies if this was from a kad-search.
77 CSearchFile(
78 const CMemFile& data,
79 bool optUTF8,
80 wxUIntPtr searchID,
81 uint32_t serverIP = 0,
82 uint16_t serverPort = 0,
83 const wxString& directory = wxEmptyString,
84 bool kademlia = false);
87 /** Frees all children owned by this file. */
88 virtual ~CSearchFile();
91 /**
92 * Merges the two results into one.
94 * Merges the other result into this one, updating
95 * various informations.
97 * @param other The file to be merged into this.
99 void MergeResults(const CSearchFile& other);
101 /** Returns the total number of sources. */
102 uint32 GetSourceCount() const { return m_sourceCount; }
103 /** Returns the number of sources that have the entire file. */
104 uint32 GetCompleteSourceCount() const { return m_completeSourceCount; }
105 /** Returns the ID of the search, used to select the right list when displaying. */
106 wxUIntPtr GetSearchID() const { return m_searchID; }
107 /** Returns true if the result is from a Kademlia search. */
108 bool IsKademlia() const { return m_kademlia; }
110 // Possible download status of a file
111 enum DownloadStatus {
112 NEW, // not known
113 DOWNLOADED, // successfully downloaded or shared
114 QUEUED, // downloading (Partfile)
115 CANCELED, // canceled
116 QUEUEDCANCELED // canceled once, but now downloading again
119 /** Returns the download status. */
120 enum DownloadStatus GetDownloadStatus() const { return m_downloadStatus; }
121 /** Set download status according to the global lists of knownfile, partfiles, canceledfiles. */
122 void SetDownloadStatus();
123 /** Set download status directly. */
124 void SetDownloadStatus(enum DownloadStatus s) { m_downloadStatus = s; }
126 /** Returns the parent of this file. */
127 CSearchFile *GetParent() const { return m_parent; }
128 /** Returns the list of children belonging to this file. */
129 const CSearchResultList &GetChildren() const { return m_children; }
130 /** Returns true if this item has children. */
131 bool HasChildren() const { return !m_children.empty(); }
132 /** Returns true if children should be displayed. */
133 bool ShowChildren() const { return m_showChildren; }
134 /** Enable/Disable displaying of children (set in CSearchListCtrl). */
135 void SetShowChildren(bool show) { m_showChildren = show; }
138 * Adds the given file as a child of this file.
140 * Note that a file can either be a parent _or_
141 * a child, but not both. Also note that it is
142 * only legal to add children whose filesize and
143 * filehash matches the parent's. AddChild takes
144 * ownership of the file.
146 void AddChild(CSearchFile* file);
148 struct ClientStruct {
149 ClientStruct()
150 : m_ip(0), m_port(0), m_serverIP(0), m_serverPort(0)
153 ClientStruct(uint32_t ip, uint16_t port, uint32_t serverIP, uint16_t serverPort)
154 : m_ip(ip), m_port(port), m_serverIP(serverIP), m_serverPort(serverPort)
157 uint32_t m_ip;
158 uint16_t m_port;
159 uint32_t m_serverIP;
160 uint32_t m_serverPort;
163 void AddClient(const ClientStruct& client);
164 const std::list<ClientStruct>& GetClients() const { return m_clients; }
166 uint32_t GetClientID() const throw() { return m_clientID; }
167 void SetClientID(uint32_t clientID) throw() { m_clientID = clientID; }
168 uint16_t GetClientPort() const throw() { return m_clientPort; }
169 void SetClientPort(uint16_t port) throw() { m_clientPort = port; }
170 uint32_t GetClientServerIP() const throw() { return m_clientServerIP; }
171 void SetClientServerIP(uint32_t serverIP) throw() { m_clientServerIP = serverIP; }
172 uint16_t GetClientServerPort() const throw() { return m_clientServerPort; }
173 void SetClientServerPort(uint16_t port) throw() { m_clientServerPort = port; }
174 int GetClientsCount() const { return ((GetClientID() && GetClientPort()) ? 1 : 0) + m_clients.size(); }
176 void SetKadPublishInfo(uint32_t val) throw() { m_kadPublishInfo = val; }
177 uint32_t GetKadPublishInfo() const throw() { return m_kadPublishInfo; }
179 const wxString& GetDirectory() const throw() { return m_directory; }
181 private:
182 //! CSearchFile is not assignable.
183 CSearchFile& operator=(const CSearchFile& other);
186 * Updates a parent file so that it shows various common traits.
188 * Currently, the most common filename is selected, and an average
189 * of fileratings is set, based on files that have a rating only.
191 void UpdateParent();
193 //! The parent of this result.
194 CSearchFile* m_parent;
195 //! Any children this result may have.
196 CSearchResultList m_children;
197 //! If true, children will be shown on the GUI.
198 bool m_showChildren;
199 //! The unique ID of this search owning this result.
200 wxUIntPtr m_searchID;
201 //! The total number of sources for this file.
202 uint32 m_sourceCount;
203 //! The number of sources that have the complete file.
204 uint32 m_completeSourceCount;
205 //! Specifies if the result is from a kademlia search.
206 bool m_kademlia;
207 //! The download status.
208 enum DownloadStatus m_downloadStatus;
210 //! Directory where file is stored (when it is part of a remote shared files list).
211 wxString m_directory;
213 std::list<ClientStruct> m_clients;
214 uint32_t m_clientID;
215 uint16_t m_clientPort;
216 uint32_t m_clientServerIP;
217 uint16_t m_clientServerPort;
219 //! Kademlia publish information.
220 uint32_t m_kadPublishInfo;
222 friend class CPartFile;
223 friend class CSearchListRem;
227 #endif // SEARCHLIST_H
228 // File_checked_for_headers