Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(974)

Unified Diff: chrome/browser/chromeos/dbus/debug_daemon_client.cc

Issue 9838085: Move files inside chrome/browser/chromeos/dbus to chromeos/dbus (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/dbus/debug_daemon_client.cc
diff --git a/chrome/browser/chromeos/dbus/debug_daemon_client.cc b/chrome/browser/chromeos/dbus/debug_daemon_client.cc
deleted file mode 100644
index c9c5822b86b74f71d6d1927d23c1e6e42c63003c..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/dbus/debug_daemon_client.cc
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright (c) 2012 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 <fcntl.h>
-#include <unistd.h>
-
-#include "chrome/browser/chromeos/dbus/debug_daemon_client.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/chromeos/chromeos_version.h"
-#include "base/eintr_wrapper.h"
-#include "base/memory/ref_counted_memory.h"
-#include "base/platform_file.h"
-#include "base/string_util.h"
-#include "content/public/browser/browser_thread.h"
-#include "dbus/bus.h"
-#include "dbus/message.h"
-#include "dbus/object_path.h"
-#include "dbus/object_proxy.h"
-#include "net/base/file_stream.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-using content::BrowserThread;
-
-namespace {
-
-// Used in DebugDaemonClient::EmptySystemStopTracingCallback().
-void EmptyStopSystemTracingCallbackBody(
- const scoped_refptr<base::RefCountedString>& unused_result) {
-}
-
-// Simple class to encapsulate collecting data from a pipe into a
-// string. To use, instantiate the class, start i/o, and then delete
-// the instance on callback. The data should be retrieved before
-// delete and extracted or copied.
-//
-// TODO(sleffler) move data collection to a sub-class so this
-// can be reused to process data as it is received
-class PipeReader {
- public:
- typedef base::Callback<void(void)>IOCompleteCallback;
-
- explicit PipeReader(IOCompleteCallback callback)
- : data_stream_(NULL),
- io_buffer_(new net::IOBufferWithSize(4096)),
- weak_ptr_factory_(this),
- callback_(callback) {
- pipe_fd_[0] = pipe_fd_[1] = -1;
- }
-
- virtual ~PipeReader() {
- if (pipe_fd_[0] != -1)
- if (HANDLE_EINTR(close(pipe_fd_[0])) < 0)
- PLOG(ERROR) << "close[0]";
- if (pipe_fd_[1] != -1)
- if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
- PLOG(ERROR) << "close[1]";
- }
-
- // Returns descriptor for the writeable side of the pipe.
- int GetWriteFD() { return pipe_fd_[1]; }
-
- // Closes writeable descriptor; normally used in parent process after fork.
- void CloseWriteFD() {
- if (pipe_fd_[1] != -1) {
- if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
- PLOG(ERROR) << "close";
- pipe_fd_[1] = -1;
- }
- }
-
- // Returns collected data.
- std::string* data() { return &data_; }
-
- // Starts data collection. Returns true if stream was setup correctly.
- // On success data will automatically be accumulated into a string that
- // can be retrieved with PipeReader::data(). To shutdown collection delete
- // the instance and/or use PipeReader::OnDataReady(-1).
- bool StartIO() {
- // Use a pipe to collect data
- const int status = HANDLE_EINTR(pipe(pipe_fd_));
- if (status < 0) {
- PLOG(ERROR) << "pipe";
- return false;
- }
- base::PlatformFile data_file_ = pipe_fd_[0]; // read side
- data_stream_.reset(new net::FileStream(data_file_,
- base::PLATFORM_FILE_READ | base::PLATFORM_FILE_ASYNC,
- NULL));
-
- // Post an initial async read to setup data collection
- int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
- base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
- if (rv != net::ERR_IO_PENDING) {
- LOG(ERROR) << "Unable to post initial read";
- return false;
- }
- return true;
- }
-
- // Called when pipe data are available. Can also be used to shutdown
- // data collection by passing -1 for |byte_count|.
- void OnDataReady(int byte_count) {
- DVLOG(1) << "OnDataReady byte_count " << byte_count;
- if (byte_count <= 0) {
- callback_.Run(); // signal creator to take data and delete us
- return;
- }
- data_.append(io_buffer_->data(), byte_count);
-
- // Post another read
- int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
- base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
- if (rv != net::ERR_IO_PENDING) {
- LOG(ERROR) << "Unable to post another read";
- // TODO(sleffler) do something more intelligent?
- }
- }
-
- private:
- friend class base::RefCounted<PipeReader>;
-
- int pipe_fd_[2];
- scoped_ptr<net::FileStream> data_stream_;
- scoped_refptr<net::IOBufferWithSize> io_buffer_;
- base::WeakPtrFactory<PipeReader> weak_ptr_factory_;
- std::string data_;
- IOCompleteCallback callback_;
-
- DISALLOW_COPY_AND_ASSIGN(PipeReader);
-};
-
-} // namespace
-
-namespace chromeos {
-
-// The DebugDaemonClient implementation used in production.
-class DebugDaemonClientImpl : public DebugDaemonClient {
- public:
- explicit DebugDaemonClientImpl(dbus::Bus* bus)
- : debugdaemon_proxy_(NULL),
- weak_ptr_factory_(this),
- pipe_reader_(NULL) {
- debugdaemon_proxy_ = bus->GetObjectProxy(
- debugd::kDebugdServiceName,
- dbus::ObjectPath(debugd::kDebugdServicePath));
- }
-
- virtual ~DebugDaemonClientImpl() {}
-
- // DebugDaemonClient override.
- virtual void StartSystemTracing() OVERRIDE {
- dbus::MethodCall method_call(
- debugd::kDebugdInterface,
- debugd::kSystraceStart);
- dbus::MessageWriter writer(&method_call);
- writer.AppendString("all"); // TODO(sleffler) parameterize category list
-
- DVLOG(1) << "Requesting a systrace start";
- debugdaemon_proxy_->CallMethod(
- &method_call,
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
- base::Bind(&DebugDaemonClientImpl::OnStartSystemTracing,
- weak_ptr_factory_.GetWeakPtr()));
- }
-
- virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
- callback) OVERRIDE {
- if (pipe_reader_ != NULL) {
- LOG(ERROR) << "Busy doing StopSystemTracing";
- return false;
- }
-
- pipe_reader_.reset(new PipeReader(
- base::Bind(&DebugDaemonClientImpl::OnIOComplete,
- weak_ptr_factory_.GetWeakPtr())));
- int write_fd = -1;
- if (!pipe_reader_->StartIO()) {
- LOG(ERROR) << "Cannot create pipe reader";
- // NB: continue anyway to shutdown tracing; toss trace data
- write_fd = HANDLE_EINTR(open("/dev/null", O_WRONLY));
- // TODO(sleffler) if this fails AppendFileDescriptor will abort
- } else {
- write_fd = pipe_reader_->GetWriteFD();
- }
-
- DCHECK(callback.is_null());
- callback_ = callback;
-
- // Issue the dbus request to stop system tracing
- dbus::MethodCall method_call(
- debugd::kDebugdInterface,
- debugd::kSystraceStop);
- dbus::MessageWriter writer(&method_call);
- dbus::FileDescriptor temp(write_fd); // NB: explicit temp for C++98
- writer.AppendFileDescriptor(temp);
-
- DVLOG(1) << "Requesting a systrace stop";
- debugdaemon_proxy_->CallMethod(
- &method_call,
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
- base::Bind(&DebugDaemonClientImpl::OnRequestStopSystemTracing,
- weak_ptr_factory_.GetWeakPtr()));
-
- pipe_reader_->CloseWriteFD(); // close our copy of fd after send
-
- return true;
- }
-
- private:
- // Called when a response for StartSystemTracing() is received.
- void OnStartSystemTracing(dbus::Response* response) {
- if (!response) {
- LOG(ERROR) << "Failed to request systrace start";
- return;
- }
- }
-
- // Called when a response for RequestStopSystemTracing() is received.
- void OnRequestStopSystemTracing(dbus::Response* response) {
- if (!response) {
- LOG(ERROR) << "Failed to request systrace stop";
- pipe_reader_->OnDataReady(-1); // terminate data stream
- }
- // NB: requester is signaled when i/o completes
- }
-
- // Called when pipe i/o completes; pass data on and delete the instance.
- void OnIOComplete() {
- callback_.Run(base::RefCountedString::TakeString(pipe_reader_->data()));
- pipe_reader_.reset();
- }
-
- dbus::ObjectProxy* debugdaemon_proxy_;
- base::WeakPtrFactory<DebugDaemonClientImpl> weak_ptr_factory_;
- scoped_ptr<PipeReader> pipe_reader_;
- StopSystemTracingCallback callback_;
-
- DISALLOW_COPY_AND_ASSIGN(DebugDaemonClientImpl);
-};
-
-// The DebugDaemonClient implementation used on Linux desktop,
-// which does nothing.
-class DebugDaemonClientStubImpl : public DebugDaemonClient {
- // DebugDaemonClient overrides.
- virtual void StartSystemTracing() OVERRIDE {}
- virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
- callback) OVERRIDE {
- std::string no_data;
- callback.Run(base::RefCountedString::TakeString(&no_data));
- return true;
- }
-};
-
-DebugDaemonClient::DebugDaemonClient() {
-}
-
-DebugDaemonClient::~DebugDaemonClient() {
-}
-
-// static
-DebugDaemonClient::StopSystemTracingCallback
-DebugDaemonClient::EmptyStopSystemTracingCallback() {
- return base::Bind(&EmptyStopSystemTracingCallbackBody);
-}
-
-// static
-DebugDaemonClient* DebugDaemonClient::Create(DBusClientImplementationType type,
- dbus::Bus* bus) {
- if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
- return new DebugDaemonClientImpl(bus);
- DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
- return new DebugDaemonClientStubImpl();
-}
-
-} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/dbus/debug_daemon_client.h ('k') | chrome/browser/chromeos/dbus/flimflam_client_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698