-
Notifications
You must be signed in to change notification settings - Fork 2
/
par2creatorsourcefile.h
101 lines (82 loc) · 3.91 KB
/
par2creatorsourcefile.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// This file is part of par2cmdline (a PAR 2.0 compatible file verification and
// repair tool). See http://parchive.sourceforge.net for details of PAR 2.0.
//
// Copyright (c) 2003 Peter Brian Clements
//
// par2cmdline is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// par2cmdline is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Modifications for concurrent processing, Unicode support, and hierarchial
// directory support are Copyright (c) 2007-2008 Vincent Tan.
// Search for "#if WANT_CONCURRENT" for concurrent code.
// Concurrent processing utilises Intel Thread Building Blocks 2.0,
// Copyright (c) 2007 Intel Corp.
#ifndef __PAR2CREATORSOURCEFILE_H__
#define __PAR2CREATORSOURCEFILE_H__
class DescriptionPacket;
class VerificationPacket;
class DiskFile;
// The Par2CreatorSourceFile contains the file verification and file description
// packet for one source file.
class Par2CreatorSourceFile
{
private:
// Don't permit copying or assignment
Par2CreatorSourceFile(const Par2CreatorSourceFile &other);
Par2CreatorSourceFile& operator=(const Par2CreatorSourceFile &other);
public:
Par2CreatorSourceFile(void);
~Par2CreatorSourceFile(void);
// Open the source file and compute the Hashes and CRCs.
bool Open(CommandLine::NoiseLevel noiselevel, const CommandLine::ExtraFile &extrafile, u64 blocksize, bool deferhashcomputation
#if WANT_CONCURRENT_PAR2_FILE_OPENING
, tbb::mutex& cout_mutex, tbb::tick_count& last_cout
#endif
);
void Close(void);
// Recover the file description and file verification packets
// in the critical packet list.
#if WANT_CONCURRENT
// 2014/11/25 this version is thread safe (criticalpackets will not be corrupted by multiple threads)
void RecordCriticalPackets(tbb::concurrent_vector<CriticalPacket*> &criticalpackets);
#else
// 2014/11/25 this version is not thread safe
void RecordCriticalPackets(list<CriticalPacket*> &criticalpackets);
#endif
// Get the file id
const MD5Hash& FileId(void) const;
// Sort source files based on the file id hash
static bool CompareLess(const Par2CreatorSourceFile* const &left, const Par2CreatorSourceFile* const &right);
// Allocate the appropriate number of source blocks to the source file
void InitialiseSourceBlocks(vector<DataBlock>::iterator &sourceblock, u64 blocksize);
// Update the file hash and the block crc and hashes
void UpdateHashes(u32 blocknumber, const void *buffer, size_t length);
// Finish computation of the file hash
void FinishHashes(void);
// How many blocks does this source file use
u32 BlockCount(void) const {return blockcount;}
#ifndef NDEBUG
const string& get_diskfilename() const { return diskfilename; } // The filename of the source file on disk.
#endif
protected:
DescriptionPacket *descriptionpacket; // The file description packet.
VerificationPacket *verificationpacket; // The file verification packet.
DiskFile *diskfile; // The source file
u64 filesize; // The size of the source file.
string diskfilename; // The filename of the source file on disk.
string parfilename; // The filename that will be recorded in the file description packet.
u32 blockcount; // How many blocks the file will be divided into.
MD5Context *contextfull; // MD5 context used to calculate the hash of the whole file
};
#endif // __PAR2CREATORSOURCEFILE_H__