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