19397Sandreas.hansson@arm.com/* 29397Sandreas.hansson@arm.com * Copyright (c) 2012 ARM Limited 39397Sandreas.hansson@arm.com * All rights reserved 49397Sandreas.hansson@arm.com * 59397Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 69397Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 79397Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 89397Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 99397Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 109397Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 119397Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 129397Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 139397Sandreas.hansson@arm.com * 149397Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 159397Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 169397Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 179397Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 189397Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 199397Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 209397Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 219397Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 229397Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 239397Sandreas.hansson@arm.com * this software without specific prior written permission. 249397Sandreas.hansson@arm.com * 259397Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 269397Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 279397Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 289397Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 299397Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 309397Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 319397Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 329397Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 339397Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 349397Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 359397Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 369397Sandreas.hansson@arm.com * 379397Sandreas.hansson@arm.com * Authors: Andreas Hansson 389397Sandreas.hansson@arm.com */ 399397Sandreas.hansson@arm.com 409397Sandreas.hansson@arm.com 419397Sandreas.hansson@arm.com/** 429397Sandreas.hansson@arm.com * @file 439399Sandreas.hansson@arm.com * Declaration of a wrapper for protobuf output streams and input streams. 449397Sandreas.hansson@arm.com */ 459397Sandreas.hansson@arm.com 469397Sandreas.hansson@arm.com#ifndef __PROTO_PROTOIO_HH__ 479397Sandreas.hansson@arm.com#define __PROTO_PROTOIO_HH__ 489397Sandreas.hansson@arm.com 499397Sandreas.hansson@arm.com#include <google/protobuf/io/coded_stream.h> 509397Sandreas.hansson@arm.com#include <google/protobuf/io/gzip_stream.h> 519397Sandreas.hansson@arm.com#include <google/protobuf/io/zero_copy_stream_impl.h> 529397Sandreas.hansson@arm.com#include <google/protobuf/message.h> 539397Sandreas.hansson@arm.com 549397Sandreas.hansson@arm.com#include <fstream> 559397Sandreas.hansson@arm.com 569397Sandreas.hansson@arm.com/** 579399Sandreas.hansson@arm.com * A ProtoStream provides the shared functionality of the input and 589399Sandreas.hansson@arm.com * output streams. At the moment this is limited to magic number. 599399Sandreas.hansson@arm.com */ 609399Sandreas.hansson@arm.comclass ProtoStream 619399Sandreas.hansson@arm.com{ 629399Sandreas.hansson@arm.com 639399Sandreas.hansson@arm.com protected: 649399Sandreas.hansson@arm.com 659399Sandreas.hansson@arm.com /// Use the ASCII characters gem5 as our magic number 669399Sandreas.hansson@arm.com static const uint32_t magicNumber = 0x356d6567; 679399Sandreas.hansson@arm.com 689399Sandreas.hansson@arm.com /** 699399Sandreas.hansson@arm.com * Create a ProtoStream. 709399Sandreas.hansson@arm.com */ 719399Sandreas.hansson@arm.com ProtoStream() {} 729399Sandreas.hansson@arm.com 739399Sandreas.hansson@arm.com private: 749399Sandreas.hansson@arm.com 759399Sandreas.hansson@arm.com /** 769399Sandreas.hansson@arm.com * Hide the copy constructor and assignment operator. 779399Sandreas.hansson@arm.com * @{ 789399Sandreas.hansson@arm.com */ 799399Sandreas.hansson@arm.com ProtoStream(const ProtoStream&); 809399Sandreas.hansson@arm.com ProtoStream& operator=(const ProtoStream&); 819399Sandreas.hansson@arm.com /** @} */ 829399Sandreas.hansson@arm.com}; 839399Sandreas.hansson@arm.com 849399Sandreas.hansson@arm.com/** 859397Sandreas.hansson@arm.com * A ProtoOutputStream wraps a coded stream, potentially with 869397Sandreas.hansson@arm.com * compression, based on looking at the file name. Writing to the 879397Sandreas.hansson@arm.com * stream is done to enable interaction with the file on a per-message 889397Sandreas.hansson@arm.com * basis to avoid having to deal with huge data structures. The latter 899397Sandreas.hansson@arm.com * is made possible by encoding the length of each message in the 909397Sandreas.hansson@arm.com * stream. 919397Sandreas.hansson@arm.com */ 929399Sandreas.hansson@arm.comclass ProtoOutputStream : public ProtoStream 939397Sandreas.hansson@arm.com{ 949397Sandreas.hansson@arm.com 959397Sandreas.hansson@arm.com public: 969397Sandreas.hansson@arm.com 979397Sandreas.hansson@arm.com /** 989397Sandreas.hansson@arm.com * Create an output stream for a given file name. If the filename 999397Sandreas.hansson@arm.com * ends with .gz then the file will be compressed accordinly. 1009397Sandreas.hansson@arm.com * 1019397Sandreas.hansson@arm.com * @param filename Path to the file to create or truncate 1029397Sandreas.hansson@arm.com */ 1039397Sandreas.hansson@arm.com ProtoOutputStream(const std::string& filename); 1049397Sandreas.hansson@arm.com 1059397Sandreas.hansson@arm.com /** 1069397Sandreas.hansson@arm.com * Destruct the output stream, and also flush and close the 1079397Sandreas.hansson@arm.com * underlying file streams and coded streams. 1089397Sandreas.hansson@arm.com */ 1099397Sandreas.hansson@arm.com ~ProtoOutputStream(); 1109397Sandreas.hansson@arm.com 1119397Sandreas.hansson@arm.com /** 1129397Sandreas.hansson@arm.com * Write a message to the stream, preprending it with the message 1139397Sandreas.hansson@arm.com * size. 1149397Sandreas.hansson@arm.com * 1159397Sandreas.hansson@arm.com * @param msg Message to write to the stream 1169397Sandreas.hansson@arm.com */ 1179397Sandreas.hansson@arm.com void write(const google::protobuf::Message& msg); 1189397Sandreas.hansson@arm.com 1199397Sandreas.hansson@arm.com private: 1209397Sandreas.hansson@arm.com 1219397Sandreas.hansson@arm.com /// Underlying file output stream 1229397Sandreas.hansson@arm.com std::ofstream fileStream; 1239397Sandreas.hansson@arm.com 1249397Sandreas.hansson@arm.com /// Zero Copy stream wrapping the STL output stream 1259705Sandreas.hansson@arm.com google::protobuf::io::OstreamOutputStream* wrappedFileStream; 1269397Sandreas.hansson@arm.com 1279397Sandreas.hansson@arm.com /// Optional Gzip stream to wrap the Zero Copy stream 1289397Sandreas.hansson@arm.com google::protobuf::io::GzipOutputStream* gzipStream; 1299397Sandreas.hansson@arm.com 1309705Sandreas.hansson@arm.com /// Top-level zero-copy stream, either with compression or not 1319705Sandreas.hansson@arm.com google::protobuf::io::ZeroCopyOutputStream* zeroCopyStream; 1329397Sandreas.hansson@arm.com 1339397Sandreas.hansson@arm.com}; 1349397Sandreas.hansson@arm.com 1359399Sandreas.hansson@arm.com/** 1369399Sandreas.hansson@arm.com * A ProtoInputStream wraps a coded stream, potentially with 1379399Sandreas.hansson@arm.com * decompression, based on looking at the file name. Reading from the 1389399Sandreas.hansson@arm.com * stream is done on a per-message basis to avoid having to deal with 1399399Sandreas.hansson@arm.com * huge data structures. The latter assumes the length of each message 1409399Sandreas.hansson@arm.com * is encoded in the stream when it is written. 1419399Sandreas.hansson@arm.com */ 1429399Sandreas.hansson@arm.comclass ProtoInputStream : public ProtoStream 1439399Sandreas.hansson@arm.com{ 1449399Sandreas.hansson@arm.com 1459399Sandreas.hansson@arm.com public: 1469399Sandreas.hansson@arm.com 1479399Sandreas.hansson@arm.com /** 1489399Sandreas.hansson@arm.com * Create an input stream for a given file name. If the filename 1499399Sandreas.hansson@arm.com * ends with .gz then the file will be decompressed accordingly. 1509399Sandreas.hansson@arm.com * 1519399Sandreas.hansson@arm.com * @param filename Path to the file to read from 1529399Sandreas.hansson@arm.com */ 1539399Sandreas.hansson@arm.com ProtoInputStream(const std::string& filename); 1549399Sandreas.hansson@arm.com 1559399Sandreas.hansson@arm.com /** 1569399Sandreas.hansson@arm.com * Destruct the input stream, and also close the underlying file 1579399Sandreas.hansson@arm.com * streams and coded streams. 1589399Sandreas.hansson@arm.com */ 1599399Sandreas.hansson@arm.com ~ProtoInputStream(); 1609399Sandreas.hansson@arm.com 1619399Sandreas.hansson@arm.com /** 1629399Sandreas.hansson@arm.com * Read a message from the stream. 1639399Sandreas.hansson@arm.com * 1649399Sandreas.hansson@arm.com * @param msg Message read from the stream 1659399Sandreas.hansson@arm.com * @param return True if a message was read, false if reading fails 1669399Sandreas.hansson@arm.com */ 1679399Sandreas.hansson@arm.com bool read(google::protobuf::Message& msg); 1689399Sandreas.hansson@arm.com 1699399Sandreas.hansson@arm.com /** 1709399Sandreas.hansson@arm.com * Reset the input stream and seek to the beginning of the file. 1719399Sandreas.hansson@arm.com */ 1729399Sandreas.hansson@arm.com void reset(); 1739399Sandreas.hansson@arm.com 1749399Sandreas.hansson@arm.com private: 1759399Sandreas.hansson@arm.com 1769399Sandreas.hansson@arm.com /** 1779399Sandreas.hansson@arm.com * Create the internal streams that are wrapping the input file. 1789399Sandreas.hansson@arm.com */ 1799399Sandreas.hansson@arm.com void createStreams(); 1809399Sandreas.hansson@arm.com 1819399Sandreas.hansson@arm.com /** 1829399Sandreas.hansson@arm.com * Destroy the internal streams that are wrapping the input file. 1839399Sandreas.hansson@arm.com */ 1849399Sandreas.hansson@arm.com void destroyStreams(); 1859399Sandreas.hansson@arm.com 1869399Sandreas.hansson@arm.com /// Underlying file input stream 1879399Sandreas.hansson@arm.com std::ifstream fileStream; 1889399Sandreas.hansson@arm.com 1899399Sandreas.hansson@arm.com /// Hold on to the file name for debug messages 1909399Sandreas.hansson@arm.com const std::string fileName; 1919399Sandreas.hansson@arm.com 1929399Sandreas.hansson@arm.com /// Boolean flag to remember whether we use gzip or not 1939399Sandreas.hansson@arm.com bool useGzip; 1949399Sandreas.hansson@arm.com 1959399Sandreas.hansson@arm.com /// Zero Copy stream wrapping the STL input stream 1969705Sandreas.hansson@arm.com google::protobuf::io::IstreamInputStream* wrappedFileStream; 1979399Sandreas.hansson@arm.com 1989399Sandreas.hansson@arm.com /// Optional Gzip stream to wrap the Zero Copy stream 1999399Sandreas.hansson@arm.com google::protobuf::io::GzipInputStream* gzipStream; 2009399Sandreas.hansson@arm.com 2019705Sandreas.hansson@arm.com /// Top-level zero-copy stream, either with compression or not 2029705Sandreas.hansson@arm.com google::protobuf::io::ZeroCopyInputStream* zeroCopyStream; 2039399Sandreas.hansson@arm.com 2049399Sandreas.hansson@arm.com}; 2059399Sandreas.hansson@arm.com 2069397Sandreas.hansson@arm.com#endif //__PROTO_PROTOIO_HH 207