6
6
7
7
#include < cerrno>
8
8
#include < sstream>
9
+ #include < fstream>
9
10
10
11
#include " mdf/cryptoutil.h"
11
12
#include " mdf/mdfhelper.h"
@@ -46,15 +47,11 @@ std::string MakeFlagString(uint16_t flag) {
46
47
return s.str ();
47
48
}
48
49
49
- bool CopyBytes (std::FILE* source, std::FILE* dest, uint64_t nof_bytes) {
50
+ bool CopyBytes (std::streambuf& source, std::streambuf& dest, uint64_t nof_bytes) {
50
51
uint8_t temp = 0 ;
51
52
for (uint64_t ii = 0 ; ii < nof_bytes; ++ii) {
52
- if (fread (&temp, 1 , 1 , source) != 1 ) {
53
- return false ;
54
- }
55
- if (fwrite (&temp, 1 , 1 , dest) != 1 ) {
56
- return false ;
57
- }
53
+ temp = source.sbumpc ();
54
+ dest.sputc (static_cast <char >(temp));
58
55
}
59
56
return true ;
60
57
}
@@ -144,27 +141,27 @@ void At4Block::GetBlockProperty(BlockPropertyList& dest) const {
144
141
}
145
142
}
146
143
147
- size_t At4Block::Read (std::FILE* file ) {
148
- size_t bytes = ReadHeader4 (file );
149
- bytes += ReadNumber (file , flags_);
150
- bytes += ReadNumber (file , creator_index_);
144
+ uint64_t At4Block::Read (std::streambuf& buffer ) {
145
+ uint64_t bytes = ReadHeader4 (buffer );
146
+ bytes += ReadNumber (buffer , flags_);
147
+ bytes += ReadNumber (buffer , creator_index_);
151
148
std::vector<uint8_t > reserved;
152
- bytes += ReadByte (file , reserved, 4 );
153
- bytes += ReadByte (file , md5_, 16 );
154
- bytes += ReadNumber (file , original_size_);
155
- bytes += ReadNumber (file , nof_bytes_);
149
+ bytes += ReadByte (buffer , reserved, 4 );
150
+ bytes += ReadByte (buffer , md5_, 16 );
151
+ bytes += ReadNumber (buffer , original_size_);
152
+ bytes += ReadNumber (buffer , nof_bytes_);
156
153
// Do not read in the data BLOB at this point but store the file position for
157
154
// that data, so it is fast to get the data later
158
- data_position_ = GetFilePosition (file );
155
+ data_position_ = GetFilePosition (buffer );
159
156
160
- filename_ = ReadTx4 (file , kIndexFilename );
161
- file_type_ = ReadTx4 (file , kIndexType );
162
- ReadMdComment (file , kIndexMd );
157
+ filename_ = ReadTx4 (buffer , kIndexFilename );
158
+ file_type_ = ReadTx4 (buffer , kIndexType );
159
+ ReadMdComment (buffer , kIndexMd );
163
160
164
161
return bytes;
165
162
}
166
163
167
- size_t At4Block::Write (std::FILE* file ) {
164
+ uint64_t At4Block::Write (std::streambuf& buffer ) {
168
165
const bool update = FilePosition () > 0 ;
169
166
if (update) {
170
167
return block_size_;
@@ -190,8 +187,8 @@ size_t At4Block::Write(std::FILE* file) {
190
187
return 0 ;
191
188
}
192
189
} else if (IsEmbedded ()) {
193
- const auto buffer = FileToBuffer (filename_, data_buffer);
194
- if (!buffer ) {
190
+ const auto read = FileToBuffer (filename_, data_buffer);
191
+ if (!read ) {
195
192
MDF_ERROR () << " File to buffer failure. File: " << filename;
196
193
return 0 ;
197
194
}
@@ -209,44 +206,47 @@ size_t At4Block::Write(std::FILE* file) {
209
206
block_length_ = 24 + (4 * 8 ) + 2 + 2 + 4 + 16 + 8 + 8 + nof_bytes_;
210
207
link_list_.resize (4 , 0 );
211
208
212
- WriteTx4 (file , kIndexFilename , filename_);
213
- WriteTx4 (file , kIndexType , file_type_);
214
- WriteMdComment (file , kIndexMd );
209
+ WriteTx4 (buffer , kIndexFilename , filename_);
210
+ WriteTx4 (buffer , kIndexType , file_type_);
211
+ WriteMdComment (buffer , kIndexMd );
215
212
216
- auto bytes = MdfBlock::Write (file );
217
- bytes += WriteNumber (file , flags_);
218
- bytes += WriteNumber (file , creator_index_);
219
- bytes += WriteBytes (file , 4 );
213
+ uint64_t bytes = MdfBlock::Write (buffer );
214
+ bytes += WriteNumber (buffer , flags_);
215
+ bytes += WriteNumber (buffer , creator_index_);
216
+ bytes += WriteBytes (buffer , 4 );
220
217
if (md5_.size () == 16 ) {
221
- bytes += WriteByte (file , md5_);
218
+ bytes += WriteByte (buffer , md5_);
222
219
} else {
223
- bytes += WriteBytes (file , 16 );
220
+ bytes += WriteBytes (buffer , 16 );
224
221
}
225
- bytes += WriteNumber (file , original_size_);
226
- bytes += WriteNumber (file , nof_bytes_);
222
+ bytes += WriteNumber (buffer , original_size_);
223
+ bytes += WriteNumber (buffer , nof_bytes_);
227
224
data_position_ = FilePosition ();
228
225
if (nof_bytes_ > 0 ) {
229
- bytes += WriteByte (file , data_buffer);
226
+ bytes += WriteByte (buffer , data_buffer);
230
227
}
231
- UpdateBlockSize (file , bytes);
228
+ UpdateBlockSize (buffer , bytes);
232
229
233
230
return bytes;
234
231
}
235
232
236
- void At4Block::ReadData (std::FILE* file, const std::string& dest_file) const {
237
- if (file == nullptr || data_position_ <= 0 ) {
233
+ void At4Block::ReadData (std::streambuf& buffer,
234
+ const std::string& dest_file) const {
235
+ if (data_position_ <= 0 ) {
238
236
throw std::invalid_argument (" File is not opened or data position not read" );
239
237
}
240
- SetFilePosition (file , data_position_);
238
+ SetFilePosition (buffer , data_position_);
241
239
if (IsEmbedded ()) {
242
- FILE* dest = nullptr ;
243
- Platform::fileopen (&dest, dest_file.c_str (), " wb" );
244
- if (dest == nullptr ) {
240
+ std::filebuf dest;
241
+ dest.open ( dest_file,
242
+ std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
243
+ if (!dest.is_open ()) {
245
244
throw std::ios_base::failure (" Failed to open the destination file" );
246
245
}
247
- const bool error = IsCompressed () ? !Inflate (file, dest, nof_bytes_)
248
- : !CopyBytes (file, dest, nof_bytes_);
249
- if (const int close = fclose (dest); error || close != 0 ) {
246
+ const bool error = IsCompressed () ? !Inflate (buffer, dest, nof_bytes_)
247
+ : !CopyBytes (buffer, dest, nof_bytes_);
248
+ dest.close ();
249
+ if ( error ) {
250
250
throw std::ios_base::failure (" Failed to copy correct number of bytes" );
251
251
}
252
252
} else {
0 commit comments