2 // This file is part of the aMule Project.
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 )
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
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
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
42 #include <ec/cpp/ECSpecialTags.h>
43 #include "RLE.h" // Needed for RLE_Data, PartFileEncoderData
46 #include "Constants.h" // Needed for PS_*, PR_*
47 #include "ClientRef.h" // Needed for CClientRef
60 typedef vector
<CMD4Hash
> ArrayOfCMD4Hash
;
63 typedef vector
<CTag
> ArrayOfCTag
;
68 friend class CKnownFile
;
69 friend class CKnownFilesRem
;
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
;
91 uint32 alltimerequested
;
92 uint64 alltimetransferred
;
93 uint32 alltimeaccepted
;
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
; }
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
;
155 ArrayOfCTag m_taglist
;
156 CKadEntryPtrList m_kadNotes
;
168 class CKnownFile
: public CAbstractFile
, public CECID
170 friend class CHashingTask
;
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();
217 uint16
GetQueuedCount() const { return m_queuedCount
; }
219 uint16
GetQueuedCount() const { return (uint16
) m_ClientUploadList
.size(); }
222 bool LoadHashsetFromFile(const CFileDataIO
* file
, bool checkhash
);
223 void AddUploadingClient(CUpDownClient
* client
);
224 void RemoveUploadingClient(CUpDownClient
* client
);
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
;}
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
; }
250 // TODO: This must be implemented if we ever want to have metadata.
251 uint32
GetMetaDataVer() const { return /*m_uMetaDataVer*/ 0; }
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
; }
306 CKnownFile(CEC_SharedFile_Tag
*);
307 friend class CKnownFilesRem
;
308 RLE_Data m_partStatus
;
311 uint8 m_iUpPriorityEC
;
312 uint16 m_queuedCount
;
315 //! The AICH master-hash, if it is known.
316 wxString m_AICHMasterHash
;
318 virtual void SetFileName(const CPath
& filename
);
321 CAICHHashSet
* GetAICHHashset() const { return m_pAICHHashSet
; }
322 void SetAICHHashset(CAICHHashSet
* val
) { m_pAICHHashSet
= val
; }
325 CAICHHashSet
* m_pAICHHashSet
;
328 bool LoadTagsFromFile(const CFileDataIO
* file
);
329 bool LoadDateFromFile(const CFileDataIO
* file
);
330 void LoadComment() const;
331 ArrayOfCMD4Hash m_hashlist
;
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
;
339 uint16 m_iED2KPartCount
;
340 uint16 m_iED2KPartHashCount
;
341 uint32 m_sizeLastPart
; // size of the last part
343 bool m_bAutoUpPriority
;
344 bool m_PublishedED2K
;
347 Kademlia::WordList wordlist
;
348 uint32 kadFileSearchID
;
349 uint32 m_lastPublishTimeKadSrc
;
350 uint32 m_lastPublishTimeKadNotes
;
351 uint32 m_lastBuddyIP
;
356 /** Common initializations for constructors. */
360 #endif // KNOWNFILE_H
361 // File_checked_for_headers