summaryrefslogtreecommitdiffstats
path: root/parameter/BinaryStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parameter/BinaryStream.cpp')
-rw-r--r--parameter/BinaryStream.cpp173
1 files changed, 173 insertions, 0 deletions
diff --git a/parameter/BinaryStream.cpp b/parameter/BinaryStream.cpp
new file mode 100644
index 0000000..ee3beb1
--- /dev/null
+++ b/parameter/BinaryStream.cpp
@@ -0,0 +1,173 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BinaryStream.h"
+#include <string.h>
+#include <assert.h>
+
+using namespace std;
+
+CBinaryStream::CBinaryStream(const string& strFileName, bool bOut, uint32_t uiDataSize, uint8_t uiStructureChecksum) :
+ _strFileName(strFileName),
+ _bOut(bOut),
+ _uiDataSize(uiDataSize),
+ _uiStructureChecksum(uiStructureChecksum),
+ _puiData(new uint8_t[uiDataSize]),
+ _uiPos(0),
+ _bOpen(false)
+{
+}
+
+CBinaryStream::~CBinaryStream()
+{
+ delete [] _puiData;
+
+ if (_bOpen) {
+
+ close();
+ }
+}
+
+bool CBinaryStream::open(string& strError)
+{
+ assert(!_bOpen);
+
+ _fileStream.open(_strFileName.c_str(), (_bOut ? ios::out : ios::in|ios::ate)|ios::binary);
+
+ if (!_fileStream.is_open() || !_fileStream.good()) {
+
+ strError = string("Failed to ") + (_bOut ? "write" : "read") + "-open";
+
+ return false;
+ }
+ if (!_bOut) {
+
+ // Get file size
+ ifstream::pos_type uiFileSize = _fileStream.tellg();
+
+ // Validate file size
+ if (_uiDataSize + sizeof(_uiStructureChecksum) != (uint32_t)uiFileSize) {
+
+ // Size different from expected
+ strError = "Unexpected file size";
+
+ return false;
+ }
+
+ // Back to beginning of file
+ _fileStream.seekg(0, ios::beg);
+
+ // Get data
+ _fileStream.read((char*)_puiData, _uiDataSize);
+
+ // File checksum
+ uint8_t uiFileChecksum;
+ _fileStream.read((char*)&uiFileChecksum, sizeof(uiFileChecksum));
+
+ // Data checksum
+ uint8_t uiDataChecksum = computeChecksum();
+
+ // Validate checksum
+ if (uiDataChecksum != uiFileChecksum) {
+
+ strError = "Integrity checks failed";
+
+ return false;
+ }
+ }
+
+ // Keep track
+ _bOpen = true;
+
+ return true;
+}
+
+void CBinaryStream::close()
+{
+ assert(_bOpen);
+
+ if (_bOut) {
+
+ // Get data
+ _fileStream.write((const char*)_puiData, _uiDataSize);
+
+ // Compute checksum
+ uint8_t uiDataChecksum = computeChecksum();
+
+ // Write checksum
+ _fileStream.write((const char*)&uiDataChecksum, sizeof(uiDataChecksum));
+ }
+
+ // Keep track
+ _bOpen = false;
+
+ // Close file
+ _fileStream.close();
+}
+
+void CBinaryStream::reset()
+{
+ _uiPos = 0;
+}
+
+void CBinaryStream::write(const uint8_t* puiData, uint32_t uiSize)
+{
+ assert(_uiPos + uiSize <= _uiDataSize);
+
+ memcpy(&_puiData[_uiPos], puiData, uiSize);
+
+ _uiPos += uiSize;
+}
+
+void CBinaryStream::read(uint8_t* puiData, uint32_t uiSize)
+{
+ assert(_uiPos + uiSize <= _uiDataSize);
+
+ memcpy(puiData, &_puiData[_uiPos], uiSize);
+
+ _uiPos += uiSize;
+}
+
+uint8_t CBinaryStream::computeChecksum() const
+{
+ uint32_t uiIndex;
+ uint8_t uiDataChecksum = _uiStructureChecksum;
+
+ for (uiIndex = 0; uiIndex < _uiDataSize; uiIndex++) {
+
+ uiDataChecksum += _puiData[uiIndex];
+ }
+ return uiDataChecksum;
+}
+
+bool CBinaryStream::isOut() const
+{
+ return _bOut;
+}