protoio.cc revision 9397
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#include "base/misc.hh"
419397Sandreas.hansson@arm.com#include "proto/protoio.hh"
429397Sandreas.hansson@arm.com
439397Sandreas.hansson@arm.comusing namespace std;
449397Sandreas.hansson@arm.comusing namespace google::protobuf;
459397Sandreas.hansson@arm.com
469397Sandreas.hansson@arm.comProtoOutputStream::ProtoOutputStream(const string& filename) :
479397Sandreas.hansson@arm.com    fileStream(filename.c_str(), ios::out | ios::binary | ios::trunc),
489397Sandreas.hansson@arm.com    zeroCopyStream(NULL), gzipStream(NULL), codedStream(NULL)
499397Sandreas.hansson@arm.com{
509397Sandreas.hansson@arm.com    if (!fileStream.good())
519397Sandreas.hansson@arm.com        panic("Could not open %s for writing\n", filename);
529397Sandreas.hansson@arm.com
539397Sandreas.hansson@arm.com    // Wrap the output file in a zero copy stream, that in turn is
549397Sandreas.hansson@arm.com    // wrapped in a gzip stream if the filename ends with .gz. The
559397Sandreas.hansson@arm.com    // latter stream is in turn wrapped in a coded stream
569397Sandreas.hansson@arm.com    zeroCopyStream = new io::OstreamOutputStream(&fileStream);
579397Sandreas.hansson@arm.com    if (filename.find_last_of('.') != string::npos &&
589397Sandreas.hansson@arm.com        filename.substr(filename.find_last_of('.') + 1) == "gz") {
599397Sandreas.hansson@arm.com        gzipStream = new io::GzipOutputStream(zeroCopyStream);
609397Sandreas.hansson@arm.com        codedStream = new io::CodedOutputStream(gzipStream);
619397Sandreas.hansson@arm.com    } else {
629397Sandreas.hansson@arm.com        codedStream = new io::CodedOutputStream(zeroCopyStream);
639397Sandreas.hansson@arm.com    }
649397Sandreas.hansson@arm.com
659397Sandreas.hansson@arm.com    // Use the ASCII characters gem5 as our magic number and write it
669397Sandreas.hansson@arm.com    // to the file
679397Sandreas.hansson@arm.com    const uint32_t magic_number = 0x356d6567;
689397Sandreas.hansson@arm.com    codedStream->WriteLittleEndian32(magic_number);
699397Sandreas.hansson@arm.com
709397Sandreas.hansson@arm.com    // Note that each type of stream (packet, instruction etc) should
719397Sandreas.hansson@arm.com    // add its own header and perform the appropriate checks
729397Sandreas.hansson@arm.com}
739397Sandreas.hansson@arm.com
749397Sandreas.hansson@arm.comProtoOutputStream::~ProtoOutputStream()
759397Sandreas.hansson@arm.com{
769397Sandreas.hansson@arm.com    delete codedStream;
779397Sandreas.hansson@arm.com    // As the compression is optional, see if the stream exists
789397Sandreas.hansson@arm.com    if (gzipStream != NULL)
799397Sandreas.hansson@arm.com        delete gzipStream;
809397Sandreas.hansson@arm.com    delete zeroCopyStream;
819397Sandreas.hansson@arm.com    fileStream.close();
829397Sandreas.hansson@arm.com}
839397Sandreas.hansson@arm.com
849397Sandreas.hansson@arm.comvoid
859397Sandreas.hansson@arm.comProtoOutputStream::write(const Message& msg)
869397Sandreas.hansson@arm.com{
879397Sandreas.hansson@arm.com    // Write the size of the message to the stream
889397Sandreas.hansson@arm.com    codedStream->WriteVarint32(msg.ByteSize());
899397Sandreas.hansson@arm.com
909397Sandreas.hansson@arm.com    // Write the message itself to the stream
919397Sandreas.hansson@arm.com    if (!msg.SerializeToCodedStream(codedStream))
929397Sandreas.hansson@arm.com        panic("Unable to write message to coded stream\n");
939397Sandreas.hansson@arm.com}
94