Shared files don't lose all information when they get renamed
[amule.git] / src / KnownFile.h
blob485c5118355aa91ae6defcb1e5d46e2df14989a6
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-2008 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
27 #ifndef KNOWNFILE_H
28 #define KNOWNFILE_H
31 #include "MD4Hash.h"
32 #include "SHAHashSet.h"
34 #include <protocol/ed2k/Constants.h>
35 #include <common/Path.h>
37 #include "kademlia/kademlia/Indexed.h"
38 #include <ec/cpp/ECID.h> // Needed for CECID
41 #ifdef CLIENT_GUI
42 #include <ec/cpp/ECSpecialTags.h>
43 #include "RLE.h" // Needed for RLE_Data, PartFileEncoderData
44 #endif
46 #include "Constants.h" // Needed for PS_*, PR_*
47 #include "ClientRef.h" // Needed for CClientRef
49 class CFileDataIO;
50 class CPacket;
51 class CTag;
54 namespace Kademlia
56 class CEntry;
60 typedef vector<CMD4Hash> ArrayOfCMD4Hash;
63 typedef vector<CTag> ArrayOfCTag;
66 class CFileStatistic
68 friend class CKnownFile;
69 friend class CKnownFilesRem;
71 public:
72 CFileStatistic();
73 void AddRequest();
74 void AddAccepted();
75 void AddTransferred(uint64 bytes);
76 uint16 GetRequests() const {return requested;}
77 uint16 GetAccepts() const {return accepted;}
78 uint64 GetTransferred() const {return transferred;}
79 uint32 GetAllTimeRequests() const {return alltimerequested;}
80 void SetAllTimeRequests(uint32 new_value) { alltimerequested = new_value; };
81 uint32 GetAllTimeAccepts() const {return alltimeaccepted;}
82 void SetAllTimeAccepts(uint32 new_value) { alltimeaccepted = new_value; };
83 uint64 GetAllTimeTransferred() const {return alltimetransferred;}
84 void SetAllTimeTransferred(uint64 new_value) { alltimetransferred = new_value; };
85 CKnownFile* fileParent;
87 private:
88 uint16 requested;
89 uint64 transferred;
90 uint16 accepted;
91 uint32 alltimerequested;
92 uint64 alltimetransferred;
93 uint32 alltimeaccepted;
97 CPartFile
99 CKnownFile
101 CAbstractFile
103 CSearchFile
105 class CAbstractFile
107 public:
108 CAbstractFile();
109 explicit CAbstractFile(const CAbstractFile& other);
110 virtual ~CAbstractFile() {}
112 const CPath& GetFileName() const { return m_fileName; }
113 const CMD4Hash& GetFileHash() const { return m_abyFileHash; }
115 uint64 GetFileSize() const { return m_nFileSize;}
116 bool IsLargeFile() const { return m_nFileSize > (uint64)OLD_MAX_FILE_SIZE; }
118 virtual void SetFileSize(uint64 nFileSize) { m_nFileSize = nFileSize; }
119 virtual void SetFileName(const CPath& filename);
121 /* Tags and Notes handling */
122 uint32 GetIntTagValue(uint8 tagname) const;
123 uint32 GetIntTagValue(const wxString& tagname) const;
124 bool GetIntTagValue(uint8 tagname, uint32& ruValue) const;
125 const wxString& GetStrTagValue(uint8 tagname) const;
126 const wxString& GetStrTagValue(const wxString& tagname) const;
127 const CTag *GetTag(const wxString& tagname) const;
128 const CTag *GetTag(const wxString& tagname, uint8 tagtype) const;
129 const CTag *GetTag(uint8 tagname) const;
130 const CTag *GetTag(uint8 tagname, uint8 tagtype) const;
131 void AddTagUnique(const CTag &pTag);
132 const ArrayOfCTag& GetTags() const { return m_taglist; }
133 void AddNote(Kademlia::CEntry* pEntry);
134 const CKadEntryPtrList& getNotes() const { return m_kadNotes; }
136 /* Comment and rating */
137 virtual const wxString& GetFileComment() const { return m_strComment; }
138 virtual int8 GetFileRating() const { return m_iRating; }
140 bool HasComment() const { return m_hasComment; }
141 bool HasRating() const { return (m_iUserRating != 0); }
142 int8 UserRating() const { return m_iUserRating; }
144 protected:
145 //! CAbstractFile is not assignable.
146 CAbstractFile& operator=(const CAbstractFile);
148 CMD4Hash m_abyFileHash;
149 // comment/rating are read from the config and cached in these variables,
150 // so make the mutable to allow GetFileComment() to be a const method
151 mutable wxString m_strComment;
152 mutable int8 m_iRating;
153 bool m_hasComment;
154 int8 m_iUserRating;
155 ArrayOfCTag m_taglist;
156 CKadEntryPtrList m_kadNotes;
158 private:
159 uint64 m_nFileSize;
160 CPath m_fileName;
164 class CSearchFile;
165 class CFile;
168 class CKnownFile : public CAbstractFile, public CECID
170 friend class CHashingTask;
171 public:
172 CKnownFile();
173 CKnownFile(uint32 ecid);
174 explicit CKnownFile(const CSearchFile &searchFile);
176 virtual ~CKnownFile();
178 void SetFilePath(const CPath& filePath);
179 const CPath& GetFilePath() const { return m_filePath; }
181 // virtual functions for CKnownFile and CPartFile:
182 virtual bool IsPartFile() const {return false;} // true if not completed
183 virtual bool IsCompleted() const { return true; } // true if completed
184 virtual bool IsCPartFile() const { return false; } // true if it's a CPartFile
186 virtual bool LoadFromFile(const CFileDataIO* file); //load date, hashset and tags from a .met file
187 virtual uint8 GetStatus(bool WXUNUSED(ignorepause) = false) const { return PS_COMPLETE; }
188 bool WriteToFile(CFileDataIO* file);
189 time_t GetLastChangeDatetime() const { return m_lastDateChanged; }
190 void SetLastChangeDatetime(time_t t) { m_lastDateChanged = t; }
192 virtual void SetFileSize(uint64 nFileSize);
194 // local available part hashs
195 size_t GetHashCount() const {return m_hashlist.size();}
196 const CMD4Hash& GetPartHash(uint16 part) const;
198 // nr. of part hashs according the file size wrt ED2K protocol
199 uint32 GetED2KPartHashCount() const { return m_iED2KPartHashCount; }
201 // nr. of 9MB parts (file data)
202 inline uint16 GetPartCount() const { return m_iPartCount; }
204 // nr. of 9MB parts according the file size wrt ED2K protocol (OP_FILESTATUS)
205 inline uint16 GetED2KPartCount() const { return m_iED2KPartCount; }
207 // size of a certain part, last is different, all others are PARTSIZE
208 uint32 GetPartSize(uint16 part) const { return part == m_iPartCount - 1 ? m_sizeLastPart : PARTSIZE; }
210 // file upload priority
211 uint8 GetUpPriority() const {return m_iUpPriority;}
212 void SetUpPriority(uint8 newUpPriority, bool bSave=true);
213 bool IsAutoUpPriority() const {return m_bAutoUpPriority;}
214 void SetAutoUpPriority(bool flag) {m_bAutoUpPriority = flag;}
215 void UpdateAutoUpPriority();
216 #ifdef CLIENT_GUI
217 uint16 GetQueuedCount() const { return m_queuedCount; }
218 #else
219 uint16 GetQueuedCount() const { return (uint16) m_ClientUploadList.size(); }
220 #endif
222 bool LoadHashsetFromFile(const CFileDataIO* file, bool checkhash);
223 void AddUploadingClient(CUpDownClient* client);
224 void RemoveUploadingClient(CUpDownClient* client);
226 // comment
227 const wxString& GetFileComment() const { if (!m_bCommentLoaded) LoadComment(); return m_strComment; }
228 int8 GetFileRating() const { if (!m_bCommentLoaded) LoadComment(); return m_iRating; }
230 void SetFileCommentRating(const wxString& strNewComment, int8 iNewRating);
231 void SetPublishedED2K( bool val );
232 bool GetPublishedED2K() const {return m_PublishedED2K;}
234 /* Kad stuff */
235 uint32 GetKadFileSearchID() const { return kadFileSearchID; }
236 // KAD TODO: This must be used on KadSearchListCtrl too once imported
237 void SetKadFileSearchID(uint32 id) { kadFileSearchID = id; } // John - Don't use this unless you know what your are DOING!! (Hopefully I do.. :)
238 const Kademlia::WordList& GetKadKeywords() const { return wordlist; }
239 // KAD TODO: If we add the proper column to SharedFilesCtrl, this is the funtion.
240 uint32 GetLastPublishTimeKadSrc() const { return m_lastPublishTimeKadSrc; }
241 void SetLastPublishTimeKadSrc(uint32 time, uint32 buddyip) { m_lastPublishTimeKadSrc = time; m_lastBuddyIP = buddyip;}
242 // Another unused function, useful for the shared files control column
243 uint32 GetLastPublishBuddy() const { return m_lastBuddyIP; }
244 void SetLastPublishTimeKadNotes(uint32 time) {m_lastPublishTimeKadNotes = time;}
245 uint32 GetLastPublishTimeKadNotes() const { return m_lastPublishTimeKadNotes; }
247 bool PublishSrc();
248 bool PublishNotes();
250 // TODO: This must be implemented if we ever want to have metadata.
251 uint32 GetMetaDataVer() const { return /*m_uMetaDataVer*/ 0; }
253 // file sharing
254 virtual CPacket* CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions);
255 void CreateOfferedFilePacket(CMemFile* files, class CServer* pServer, CUpDownClient* pClient);
257 virtual void UpdatePartsInfo();
260 CFileStatistic statistic;
262 time_t m_nCompleteSourcesTime;
263 uint16 m_nCompleteSourcesCount;
264 uint16 m_nCompleteSourcesCountLo;
265 uint16 m_nCompleteSourcesCountHi;
267 // Common for part and known files.
268 typedef std::set<CClientRef> SourceSet;
269 SourceSet m_ClientUploadList;
270 ArrayOfUInts16 m_AvailPartFrequency;
273 * Returns a base-16 encoding of the master hash, or
274 * an empty string if no such hash exists.
276 wxString GetAICHMasterHash() const;
277 /** Returns true if the AICH-Hashset is valid, and verified or complete. */
278 bool HasProperAICHHashSet() const;
281 * Updates the requency of uploading parts from with the data the client provides.
283 * @param client The clients whoose uploading parts should be considered.
284 * @param increment If true, the counts are incremented, otherwise they are decremented.
286 * This functions updates the frequency list of file-upparts, using the clients
287 * upparts-status. This function should be called by clients every time they update their
288 * upparts-status, or when they are added or removed from the file.
290 void UpdateUpPartsFrequency( CUpDownClient* client, bool increment );
292 static void CreateHashFromHashlist(const ArrayOfCMD4Hash& hashes, CMD4Hash* Output);
294 void ClearPriority();
296 time_t m_lastDateChanged;
298 virtual wxString GetFeedback() const;
300 void SetShowSources( bool val ) { m_showSources = val; }
301 bool ShowSources() const { return m_showSources; }
302 void SetShowPeers( bool val ) { m_showPeers = val; }
303 bool ShowPeers() const { return m_showPeers; }
305 #ifdef CLIENT_GUI
306 CKnownFile(CEC_SharedFile_Tag *);
307 friend class CKnownFilesRem;
308 RLE_Data m_partStatus;
310 private:
311 uint8 m_iUpPriorityEC;
312 uint16 m_queuedCount;
314 protected:
315 //! The AICH master-hash, if it is known.
316 wxString m_AICHMasterHash;
317 #else
318 virtual void SetFileName(const CPath& filename);
320 // AICH
321 CAICHHashSet* GetAICHHashset() const { return m_pAICHHashSet; }
322 void SetAICHHashset(CAICHHashSet* val) { m_pAICHHashSet = val; }
324 protected:
325 CAICHHashSet* m_pAICHHashSet;
326 #endif
328 bool LoadTagsFromFile(const CFileDataIO* file);
329 bool LoadDateFromFile(const CFileDataIO* file);
330 void LoadComment() const;
331 ArrayOfCMD4Hash m_hashlist;
332 CPath m_filePath;
334 static void CreateHashFromFile(class CFileAutoClose& file, uint64 offset, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut);
335 static void CreateHashFromInput(const byte* input, uint32 Length, CMD4Hash* Output, CAICHHashTree* pShaHashOut);
337 mutable bool m_bCommentLoaded;
338 uint16 m_iPartCount;
339 uint16 m_iED2KPartCount;
340 uint16 m_iED2KPartHashCount;
341 uint32 m_sizeLastPart; // size of the last part
342 uint8 m_iUpPriority;
343 bool m_bAutoUpPriority;
344 bool m_PublishedED2K;
346 /* Kad stuff */
347 Kademlia::WordList wordlist;
348 uint32 kadFileSearchID;
349 uint32 m_lastPublishTimeKadSrc;
350 uint32 m_lastPublishTimeKadNotes;
351 uint32 m_lastBuddyIP;
353 bool m_showSources;
354 bool m_showPeers;
355 private:
356 /** Common initializations for constructors. */
357 void Init();
360 #endif // KNOWNFILE_H
361 // File_checked_for_headers