-
-
Notifications
You must be signed in to change notification settings - Fork 337
/
DataWriters.cpp
125 lines (88 loc) · 1.97 KB
/
DataWriters.cpp
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>
* Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <package/hpkg/DataWriters.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <package/hpkg/ErrorOutput.h>
namespace BPackageKit {
namespace BHPKG {
namespace BPrivate {
// #pragma mark - AbstractDataWriter
AbstractDataWriter::AbstractDataWriter()
:
fBytesWritten(0)
{
}
AbstractDataWriter::~AbstractDataWriter()
{
}
// #pragma mark - FDDataWriter
FDDataWriter::FDDataWriter(int fd, off_t offset, BErrorOutput* errorOutput)
:
fFD(fd),
fOffset(offset),
fErrorOutput(errorOutput)
{
}
status_t
FDDataWriter::WriteDataNoThrow(const void* buffer, size_t size)
{
ssize_t bytesWritten = pwrite(fFD, buffer, size, fOffset);
if (bytesWritten < 0) {
fErrorOutput->PrintError(
"WriteDataNoThrow(%p, %lu) failed to write data: %s\n", buffer,
size, strerror(errno));
return errno;
}
if ((size_t)bytesWritten != size) {
fErrorOutput->PrintError(
"WriteDataNoThrow(%p, %lu) failed to write all data\n", buffer,
size);
return B_ERROR;
}
fOffset += size;
fBytesWritten += size;
return B_OK;
}
// #pragma mark - ZlibDataWriter
ZlibDataWriter::ZlibDataWriter(AbstractDataWriter* dataWriter)
:
fDataWriter(dataWriter),
fCompressor(this)
{
}
void
ZlibDataWriter::Init()
{
status_t error = fCompressor.Init();
if (error != B_OK)
throw status_t(error);
}
void
ZlibDataWriter::Finish()
{
status_t error = fCompressor.Finish();
if (error != B_OK)
throw status_t(error);
}
status_t
ZlibDataWriter::WriteDataNoThrow(const void* buffer,
size_t size)
{
status_t error = fCompressor.CompressNext(buffer, size);
if (error == B_OK)
fBytesWritten += size;
return error;
}
status_t
ZlibDataWriter::Write(const void* buffer, size_t size)
{
return fDataWriter->WriteDataNoThrow(buffer, size);
}
} // namespace BPrivate
} // namespace BHPKG
} // namespace BPackageKit