1 //  This file is part of par2cmdline (a PAR 2.0 compatible file verification and
2 //  repair tool). See http://parchive.sourceforge.net for details of PAR 2.0.
3 //
4 //  Copyright (c) 2003 Peter Brian Clements
5 //
6 //  par2cmdline is free software; you can redistribute it and/or modify
7 //  it under the terms of the GNU General Public License as published by
8 //  the Free Software Foundation; either version 2 of the License, or
9 //  (at your option) any later version.
10 //
11 //  par2cmdline is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
19 
20 #ifndef __DATABLOCK_H__
21 #define __DATABLOCK_H__
22 
23 class DiskFile;
24 
25 // A Data Block is a block of data of a specific length at a specific
26 // offset in a specific file.
27 
28 // It may be either a block of data in a source file from which recovery
29 // data is being computed, a block of recovery data in a recovery file, or
30 // a block in a target file that is being reconstructed.
31 
32 class DataBlock
33 {
34 public:
35   DataBlock(void);
36   ~DataBlock(void);
37 
38 public:
39   // Set the length of the block
40   void SetLength(u64 length);
41 
42   // Set the location of the block
43   void SetLocation(DiskFile *diskfile, u64 offset);
44   void ClearLocation(void);
45 
46 public:
47   // Check to see if the location of the block has been set
48   bool IsSet(void) const;
49 
50   // Which disk file is this data block in
51   DiskFile* GetDiskFile(void) const;
52 
53   // What offset is the block located at
54   u64 GetOffset(void) const;
55 
56   // What is the length of this block
57   u64 GetLength(void) const;
58 
59 public:
60   // Open the disk file if it is not already open (so that it can be read)
61   bool Open(void);
62 
63   // Read some of the data from disk into memory.
64   bool ReadData(u64 position, size_t size, void *buffer);
65 
66   // Write some of the data from memory to disk
67   bool WriteData(u64 position, size_t size, const void *buffer, size_t &wrote);
68 
69 protected:
70   DiskFile *diskfile;  // Which disk file is the block associated with
71   u64       offset;    // What is the file offset
72   u64       length;    // How large is the block
73 };
74 
75 
76 // Construct the data block
DataBlock(void)77 inline DataBlock::DataBlock(void)
78 {
79   diskfile = 0;
80   offset = 0;
81   length = 0;
82 }
83 
84 // Destroy the data block
~DataBlock(void)85 inline DataBlock::~DataBlock(void)
86 {
87 }
88 
89 // Set the length of the block
SetLength(u64 _length)90 inline void DataBlock::SetLength(u64 _length)
91 {
92   length = _length;
93 }
94 
95 // Set the location of the block
SetLocation(DiskFile * _diskfile,u64 _offset)96 inline void DataBlock::SetLocation(DiskFile *_diskfile, u64 _offset)
97 {
98   diskfile = _diskfile;
99   offset = _offset;
100 }
101 
102 // Clear the location of the block
ClearLocation(void)103 inline void DataBlock::ClearLocation(void)
104 {
105   diskfile = 0;
106   offset = 0;
107 }
108 
109 // Check to see of the location is known
IsSet(void)110 inline bool DataBlock::IsSet(void) const
111 {
112   return (diskfile != 0);
113 }
114 
115 // Which disk file is this data block in
GetDiskFile(void)116 inline DiskFile* DataBlock::GetDiskFile(void) const
117 {
118   return diskfile;
119 }
120 
121 // What offset is the block located at
GetOffset(void)122 inline u64 DataBlock::GetOffset(void) const
123 {
124   return offset;
125 }
126 
127 // What is the length of this block
GetLength(void)128 inline u64 DataBlock::GetLength(void) const
129 {
130   return length;
131 }
132 
133 #endif // __DATABLOCK_H__
134