| Index: chrome/browser/net/net_log_temp_file.cc
|
| ===================================================================
|
| --- chrome/browser/net/net_log_temp_file.cc (revision 0)
|
| +++ chrome/browser/net/net_log_temp_file.cc (revision 0)
|
| @@ -0,0 +1,156 @@
|
| +// Copyright (c) 2013 The Chromium 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 "chrome/browser/net/net_log_temp_file.h"
|
| +
|
| +#include "base/file_util.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/net/chrome_net_log.h"
|
| +#include "chrome/browser/net/net_log_logger.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +
|
| +using content::BrowserThread;
|
| +
|
| +NetLogTempFile::NetLogTempFile(ChromeNetLog* chrome_net_log)
|
| + : state_(STATE_UNINITIALIZED),
|
| + log_filename_(FILE_PATH_LITERAL("chrome-net-export-log.json")),
|
| + chrome_net_log_(chrome_net_log) {
|
| +}
|
| +
|
| +NetLogTempFile::~NetLogTempFile() {
|
| + if (net_log_logger_)
|
| + net_log_logger_->StopObserving();
|
| +}
|
| +
|
| +void NetLogTempFile::ProcessCommand(Command command) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + if (!EnsureInit())
|
| + return;
|
| +
|
| + switch (command) {
|
| + case DO_START:
|
| + StartNetLog();
|
| + break;
|
| + case DO_STOP:
|
| + StopNetLog();
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +DictionaryValue* NetLogTempFile::GetState() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + base::DictionaryValue* dict = new base::DictionaryValue;
|
| +
|
| + EnsureInit();
|
| +
|
| +#ifndef NDEBUG
|
| + dict->SetString("file", log_path_.LossyDisplayName());
|
| +#endif // NDEBUG
|
| +
|
| + switch (state_) {
|
| + case STATE_ALLOW_START:
|
| + dict->SetString("state", "ALLOW_START");
|
| + break;
|
| + case STATE_ALLOW_STOP:
|
| + dict->SetString("state", "ALLOW_STOP");
|
| + break;
|
| + case STATE_ALLOW_START_SEND:
|
| + dict->SetString("state", "ALLOW_START_SEND");
|
| + break;
|
| + default:
|
| + dict->SetString("state", "UNINITIALIZED");
|
| + break;
|
| + }
|
| + return dict;
|
| +}
|
| +
|
| +bool NetLogTempFile::EnsureInit() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + if (state_ != STATE_UNINITIALIZED)
|
| + return true;
|
| +
|
| + if (!GetNetExportLog())
|
| + return false;
|
| +
|
| + if (NetExportLogExists())
|
| + state_ = STATE_ALLOW_START_SEND;
|
| + else
|
| + state_ = STATE_ALLOW_START;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void NetLogTempFile::StartNetLog() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + if (state_ == STATE_ALLOW_STOP)
|
| + return;
|
| +
|
| + DCHECK_NE(STATE_UNINITIALIZED, state_);
|
| + DCHECK(!log_path_.empty());
|
| +
|
| + // Try to make sure we can create the file.
|
| + // TODO(rtenneti): Find a better for doing the following. Surface some error
|
| + // to the user if we couldn't create the file.
|
| + FILE* fp = file_util::OpenFile(log_path_, "w");
|
| + if (!fp)
|
| + return;
|
| + file_util::CloseFile(fp);
|
| +
|
| + net_log_logger_.reset(new NetLogLogger(log_path_));
|
| + net_log_logger_->StartObserving(chrome_net_log_);
|
| + state_ = STATE_ALLOW_STOP;
|
| +}
|
| +
|
| +void NetLogTempFile::StopNetLog() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + if (state_ != STATE_ALLOW_STOP)
|
| + return;
|
| +
|
| + net_log_logger_->StopObserving();
|
| + net_log_logger_.reset();
|
| + state_ = STATE_ALLOW_START_SEND;
|
| +}
|
| +
|
| +bool NetLogTempFile::GetFilePath(FilePath* path) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + if (state_ != STATE_ALLOW_START_SEND)
|
| + return false;
|
| +
|
| + if (!NetExportLogExists())
|
| + return false;
|
| +
|
| + DCHECK(!log_path_.empty());
|
| +#if defined(OS_POSIX)
|
| + // Users, group and others can read, write and traverse.
|
| + int mode = file_util::FILE_PERMISSION_MASK;
|
| + file_util::SetPosixFilePermissions(log_path_, mode);
|
| +#endif // defined(OS_POSIX)
|
| +
|
| + *path = log_path_;
|
| + return true;
|
| +}
|
| +
|
| +bool NetLogTempFile::GetNetExportLog() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + FilePath temp_dir;
|
| + if (!GetNetExportLogDirectory(&temp_dir))
|
| + return false;
|
| +
|
| + log_path_ = temp_dir.Append(log_filename_);
|
| + return true;
|
| +}
|
| +
|
| +bool NetLogTempFile::GetNetExportLogDirectory(FilePath* path) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + return file_util::GetTempDir(path);
|
| +}
|
| +
|
| +bool NetLogTempFile::NetExportLogExists() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
|
| + DCHECK(!log_path_.empty());
|
| + return file_util::PathExists(log_path_);
|
| +}
|
|
|