15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_string_value_serializer.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/gdig/file_net_log.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FileNetLogObserver::FileNetLogObserver(FILE* destination)
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : destination_(destination) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(destination != NULL);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FileNetLogObserver::~FileNetLogObserver() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void FileNetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only BoundNetLogs without a NetLog should have an invalid source.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(entry.source().IsValid());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const char* source = NetLog::SourceTypeToString(entry.source().type);
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const char* type = NetLog::EventTypeToString(entry.type());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> param_value(entry.ParametersToValue());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string params;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (param_value.get() != NULL) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JSONStringValueSerializer serializer(&params);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ret = serializer.Serialize(*param_value);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(ret);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::NowFromSystemTime();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_event_time_.is_null()) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_event_time_ = now;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta elapsed_time = now - first_event_time_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(destination_ , "%u\t%u\t%s\t%s\t%s\n",
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<unsigned>(elapsed_time.InMilliseconds()),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          entry.source().id, source, type, params.c_str());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
49