// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromiumos-wide-profiling/perf_protobuf_io.h"

#include <vector>

#include "base/logging.h"

#include "chromiumos-wide-profiling/file_utils.h"

namespace quipper {


bool SerializeFromFile(const string& filename, PerfDataProto* perf_data_proto) {
  return SerializeFromFileWithOptions(filename, PerfParserOptions(),
                                      perf_data_proto);
}

bool SerializeFromFileWithOptions(const string& filename,
                                  const PerfParserOptions& options,
                                  PerfDataProto* perf_data_proto) {
  PerfReader reader;
  if (!reader.ReadFile(filename))
    return false;

  PerfParser parser(&reader, options);
  if (!parser.ParseRawEvents())
    return false;

  if (!reader.Serialize(perf_data_proto))
    return false;

  // Append parser stats to protobuf.
  PerfSerializer::SerializeParserStats(parser.stats(), perf_data_proto);
  return true;
}

bool DeserializeToFile(const PerfDataProto& perf_data_proto,
                       const string& filename) {
  PerfReader reader;
  return reader.Deserialize(perf_data_proto) && reader.WriteFile(filename);
}

bool WriteProtobufToFile(const PerfDataProto& perf_data_proto,
                         const string& filename) {
  string output;
  perf_data_proto.SerializeToString(&output);

  return BufferToFile(filename, output);
}

bool ReadProtobufFromFile(PerfDataProto* perf_data_proto,
                          const string& filename) {
  std::vector<char> buffer;
  if (!FileToBuffer(filename, &buffer))
    return false;

  bool ret = perf_data_proto->ParseFromArray(buffer.data(), buffer.size());

  LOG(INFO) << "#events" << perf_data_proto->events_size();

  return ret;
}

}  // namespace quipper
