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