blob: ee3beb11b4922519e28b59b4f0e1685dca1a2ce3 [file] [log] [blame]
Patrick Benavoli68a91282011-08-31 11:23:23 +02001/* <auto_header>
2 * <FILENAME>
3 *
4 * INTEL CONFIDENTIAL
5 * Copyright © 2011 Intel
6 * Corporation All Rights Reserved.
7 *
8 * The source code contained or described herein and all documents related to
9 * the source code ("Material") are owned by Intel Corporation or its suppliers
10 * or licensors. Title to the Material remains with Intel Corporation or its
11 * suppliers and licensors. The Material contains trade secrets and proprietary
12 * and confidential information of Intel or its suppliers and licensors. The
13 * Material is protected by worldwide copyright and trade secret laws and
14 * treaty provisions. No part of the Material may be used, copied, reproduced,
15 * modified, published, uploaded, posted, transmitted, distributed, or
16 * disclosed in any way without Intel’s prior express written permission.
17 *
18 * No license under any patent, copyright, trade secret or other intellectual
19 * property right is granted to or conferred upon you by disclosure or delivery
20 * of the Materials, either expressly, by implication, inducement, estoppel or
21 * otherwise. Any license under such intellectual property rights must be
22 * express and approved by Intel in writing.
23 *
24 * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
25 * CREATED: 2011-06-01
26 * UPDATED: 2011-07-27
27 *
28 *
29 * </auto_header>
30 */
31#include "BinaryStream.h"
32#include <string.h>
33#include <assert.h>
34
35using namespace std;
36
37CBinaryStream::CBinaryStream(const string& strFileName, bool bOut, uint32_t uiDataSize, uint8_t uiStructureChecksum) :
38 _strFileName(strFileName),
39 _bOut(bOut),
40 _uiDataSize(uiDataSize),
41 _uiStructureChecksum(uiStructureChecksum),
42 _puiData(new uint8_t[uiDataSize]),
43 _uiPos(0),
44 _bOpen(false)
45{
46}
47
48CBinaryStream::~CBinaryStream()
49{
50 delete [] _puiData;
51
52 if (_bOpen) {
53
54 close();
55 }
56}
57
58bool CBinaryStream::open(string& strError)
59{
60 assert(!_bOpen);
61
62 _fileStream.open(_strFileName.c_str(), (_bOut ? ios::out : ios::in|ios::ate)|ios::binary);
63
64 if (!_fileStream.is_open() || !_fileStream.good()) {
65
66 strError = string("Failed to ") + (_bOut ? "write" : "read") + "-open";
67
68 return false;
69 }
70 if (!_bOut) {
71
72 // Get file size
73 ifstream::pos_type uiFileSize = _fileStream.tellg();
74
75 // Validate file size
76 if (_uiDataSize + sizeof(_uiStructureChecksum) != (uint32_t)uiFileSize) {
77
78 // Size different from expected
79 strError = "Unexpected file size";
80
81 return false;
82 }
83
84 // Back to beginning of file
85 _fileStream.seekg(0, ios::beg);
86
87 // Get data
88 _fileStream.read((char*)_puiData, _uiDataSize);
89
90 // File checksum
91 uint8_t uiFileChecksum;
92 _fileStream.read((char*)&uiFileChecksum, sizeof(uiFileChecksum));
93
94 // Data checksum
95 uint8_t uiDataChecksum = computeChecksum();
96
97 // Validate checksum
98 if (uiDataChecksum != uiFileChecksum) {
99
100 strError = "Integrity checks failed";
101
102 return false;
103 }
104 }
105
106 // Keep track
107 _bOpen = true;
108
109 return true;
110}
111
112void CBinaryStream::close()
113{
114 assert(_bOpen);
115
116 if (_bOut) {
117
118 // Get data
119 _fileStream.write((const char*)_puiData, _uiDataSize);
120
121 // Compute checksum
122 uint8_t uiDataChecksum = computeChecksum();
123
124 // Write checksum
125 _fileStream.write((const char*)&uiDataChecksum, sizeof(uiDataChecksum));
126 }
127
128 // Keep track
129 _bOpen = false;
130
131 // Close file
132 _fileStream.close();
133}
134
135void CBinaryStream::reset()
136{
137 _uiPos = 0;
138}
139
140void CBinaryStream::write(const uint8_t* puiData, uint32_t uiSize)
141{
142 assert(_uiPos + uiSize <= _uiDataSize);
143
144 memcpy(&_puiData[_uiPos], puiData, uiSize);
145
146 _uiPos += uiSize;
147}
148
149void CBinaryStream::read(uint8_t* puiData, uint32_t uiSize)
150{
151 assert(_uiPos + uiSize <= _uiDataSize);
152
153 memcpy(puiData, &_puiData[_uiPos], uiSize);
154
155 _uiPos += uiSize;
156}
157
158uint8_t CBinaryStream::computeChecksum() const
159{
160 uint32_t uiIndex;
161 uint8_t uiDataChecksum = _uiStructureChecksum;
162
163 for (uiIndex = 0; uiIndex < _uiDataSize; uiIndex++) {
164
165 uiDataChecksum += _puiData[uiIndex];
166 }
167 return uiDataChecksum;
168}
169
170bool CBinaryStream::isOut() const
171{
172 return _bOut;
173}