debug_daemon_client.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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 <fcntl.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/debug_daemon_client.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/chromeos/chromeos_version.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/posix/eintr_wrapper.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/worker_pool.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/file_stream.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in DebugDaemonClient::EmptySystemStopTracingCallback().
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EmptyStopSystemTracingCallbackBody(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<base::RefCountedString>& unused_result) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple class to encapsulate collecting data from a pipe into a
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string.  To use, instantiate the class, start i/o, and then delete
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the instance on callback.  The data should be retrieved before
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delete and extracted or copied.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sleffler) move data collection to a sub-class so this
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be reused to process data as it is received
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PipeReader {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(void)>IOCompleteCallback;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PipeReader(IOCompleteCallback callback)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : data_stream_(NULL),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_buffer_(new net::IOBufferWithSize(4096)),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback_(callback),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pipe_fd_[0] = pipe_fd_[1] = -1;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PipeReader() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't close pipe_fd_[0] as it's closed by data_stream_.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pipe_fd_[1] != -1)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PLOG(ERROR) << "close[1]";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns descriptor for the writeable side of the pipe.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetWriteFD() { return pipe_fd_[1]; }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes writeable descriptor; normally used in parent process after fork.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseWriteFD() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pipe_fd_[1] != -1) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PLOG(ERROR) << "close";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipe_fd_[1] = -1;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns collected data.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string* data() { return &data_; }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts data collection.  Returns true if stream was setup correctly.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On success data will automatically be accumulated into a string that
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can be retrieved with PipeReader::data().  To shutdown collection delete
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the instance and/or use PipeReader::OnDataReady(-1).
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartIO() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use a pipe to collect data
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int status = HANDLE_EINTR(pipe(pipe_fd_));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status < 0) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PLOG(ERROR) << "pipe";
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::PlatformFile data_file_ = pipe_fd_[0];  // read side
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_stream_.reset(new net::FileStream(data_file_,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::PLATFORM_FILE_READ | base::PLATFORM_FILE_ASYNC,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Post an initial async read to setup data collection
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv != net::ERR_IO_PENDING) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Unable to post initial read";
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when pipe data are available.  Can also be used to shutdown
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data collection by passing -1 for |byte_count|.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDataReady(int byte_count) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "OnDataReady byte_count " << byte_count;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (byte_count <= 0) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_.Run();  // signal creator to take data and delete us
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_.append(io_buffer_->data(), byte_count);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Post another read
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv != net::ERR_IO_PENDING) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Unable to post another read";
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(sleffler) do something more intelligent?
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<PipeReader>;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pipe_fd_[2];
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::FileStream> data_stream_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBufferWithSize> io_buffer_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOCompleteCallback callback_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<PipeReader> weak_ptr_factory_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PipeReader);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The DebugDaemonClient implementation used in production.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DebugDaemonClientImpl : public DebugDaemonClient {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DebugDaemonClientImpl(dbus::Bus* bus)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : debugdaemon_proxy_(NULL),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pipe_reader_(NULL),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_ = bus->GetObjectProxy(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kDebugdServiceName,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectPath(debugd::kDebugdServicePath));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DebugDaemonClientImpl() {}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DebugDaemonClient override.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetDebugLogs(base::PlatformFile file,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GetDebugLogsCallback& callback) OVERRIDE {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::FileDescriptor* file_descriptor = new dbus::FileDescriptor(file);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Punt descriptor validity check to a worker thread; on return we'll
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // issue the D-Bus request to stop tracing and collect results.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WorkerPool::PostTaskAndReply(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::CheckValidity,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   file_descriptor),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnCheckValidityGetDebugLogs,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Owned(file_descriptor),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDebugMode(const std::string& subsystem,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const SetDebugModeCallback& callback) OVERRIDE {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kSetDebugMode);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(subsystem);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnSetDebugMode,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetRoutes(bool numeric, bool ipv6,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GetRoutesCallback& callback) OVERRIDE {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetRoutes);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter sub_writer(NULL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.OpenArray("{sv}", &sub_writer);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter elem_writer(NULL);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.OpenDictEntry(&elem_writer);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem_writer.AppendString("numeric");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem_writer.AppendVariantOfBool(numeric);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.CloseContainer(&elem_writer);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.OpenDictEntry(&elem_writer);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem_writer.AppendString("v6");
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem_writer.AppendVariantOfBool(ipv6);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.CloseContainer(&elem_writer);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.CloseContainer(&sub_writer);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetRoutes,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetNetworkStatus(const GetNetworkStatusCallback& callback)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetNetworkStatus);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetNetworkStatus,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetModemStatus(const GetModemStatusCallback& callback)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetModemStatus);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetModemStatus,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetNetworkInterfaces(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetNetworkInterfacesCallback& callback) OVERRIDE {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetInterfaces);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetNetworkInterfaces,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetPerfData(uint32_t duration,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const GetPerfDataCallback& callback) OVERRIDE {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 debugd::kGetPerfData);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageWriter writer(&method_call);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    writer.AppendUint32(duration);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &method_call,
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetPerfData,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   callback));
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAllLogs(const GetLogsCallback& callback)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetAllLogs);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetAllLogs,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetUserLogFiles(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetLogsCallback& callback) OVERRIDE {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kGetUserLogFiles);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetUserLogFiles,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartSystemTracing() OVERRIDE {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kDebugdInterface,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kSystraceStart);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString("all"); // TODO(sleffler) parameterize category list
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Requesting a systrace start";
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnStartSystemTracing,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback) OVERRIDE {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pipe_reader_ != NULL) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Busy doing StopSystemTracing";
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pipe_reader_.reset(new PipeReader(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnIOComplete,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr())));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int write_fd = -1;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pipe_reader_->StartIO()) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Cannot create pipe reader";
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // NB: continue anyway to shutdown tracing; toss trace data
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_fd = HANDLE_EINTR(open("/dev/null", O_WRONLY));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(sleffler) if this fails AppendFileDescriptor will abort
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_fd = pipe_reader_->GetWriteFD();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::FileDescriptor* file_descriptor = new dbus::FileDescriptor(write_fd);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Punt descriptor validity check to a worker thread; on return we'll
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // issue the D-Bus request to stop tracing and collect results.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WorkerPool::PostTaskAndReply(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::CheckValidity,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   file_descriptor),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnCheckValidityRequestStopSystem,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Owned(file_descriptor),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TestICMP(const std::string& ip_address,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const TestICMPCallback& callback) OVERRIDE {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(debugd::kDebugdInterface,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 debugd::kTestICMP);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendString(ip_address);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnTestICMP,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to check descriptor validity on a thread where i/o is permitted.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CheckValidity(dbus::FileDescriptor* file_descriptor) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_descriptor->CheckValidity();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a CheckValidity response is received.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCheckValidityGetDebugLogs(dbus::FileDescriptor* file_descriptor,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const GetDebugLogsCallback& callback) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Issue the dbus request to get debug logs.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kDebugdInterface,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kGetDebugLogs);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendFileDescriptor(*file_descriptor);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnGetDebugLogs,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   callback));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a response for GetDebugLogs() is received.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetDebugLogs(const GetDebugLogsCallback& callback,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      dbus::Response* response) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to get debug logs";
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(true);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a response for SetDebugMode() is received.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetDebugMode(const SetDebugModeCallback& callback,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      dbus::Response* response) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to change debug mode";
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(true);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetRoutes(const GetRoutesCallback& callback,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   dbus::Response* response) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> routes;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MessageReader reader(response);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (reader.PopArrayOfStrings(&routes)) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback.Run(true, routes);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "Got non-array response from GetRoutes";
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback.Run(false, routes);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, routes);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetNetworkStatus(const GetNetworkStatusCallback& callback,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          dbus::Response* response) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string status;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response && dbus::MessageReader(response).PopString(&status))
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(true, status);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, "");
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetModemStatus(const GetModemStatusCallback& callback,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        dbus::Response* response) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string status;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response && dbus::MessageReader(response).PopString(&status))
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(true, status);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, "");
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetNetworkInterfaces(const GetNetworkInterfacesCallback& callback,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              dbus::Response* response) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string status;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response && dbus::MessageReader(response).PopString(&status))
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(true, status);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, "");
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnGetPerfData(const GetPerfDataCallback& callback,
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     dbus::Response* response) {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<uint8> data;
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!response) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MessageReader reader(response);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint8* buffer = NULL;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t buf_size = 0;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!reader.PopArrayOfBytes(reinterpret_cast<uint8**>(
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &buffer), &buf_size)) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(asharif): Figure out a way to avoid this copy.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data.insert(data.end(), buffer, buffer + buf_size);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback.Run(data);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetAllLogs(const GetLogsCallback& callback,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    dbus::Response* response) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::map<std::string, std::string> logs;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool broken = false; // did we see a broken (k,v) pair?
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader sub_reader(NULL);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response || !dbus::MessageReader(response).PopArray(&sub_reader)) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, logs);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (sub_reader.HasMoreData()) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MessageReader sub_sub_reader(NULL);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string key, value;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!sub_reader.PopDictEntry(&sub_sub_reader)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          || !sub_sub_reader.PopString(&key)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          || !sub_sub_reader.PopString(&value)) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        broken = true;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs[key] = value;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(!sub_reader.HasMoreData() && !broken, logs);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetUserLogFiles(const GetLogsCallback& callback,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         dbus::Response* response) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OnGetAllLogs(callback, response);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a response for StartSystemTracing() is received.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStartSystemTracing(dbus::Response* response) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to request systrace start";
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a CheckValidity response is received.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCheckValidityRequestStopSystem(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::FileDescriptor* file_descriptor,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const StopSystemTracingCallback& callback) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Issue the dbus request to stop system tracing
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kDebugdInterface,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debugd::kSystraceStop);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendFileDescriptor(*file_descriptor);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_ = callback;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Requesting a systrace stop";
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debugdaemon_proxy_->CallMethod(
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &method_call,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DebugDaemonClientImpl::OnRequestStopSystemTracing,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pipe_reader_->CloseWriteFD();  // close our copy of fd after send
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a response for RequestStopSystemTracing() is received.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRequestStopSystemTracing(dbus::Response* response) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to request systrace stop";
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If debugd crashes or completes I/O before this message is processed
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // then pipe_reader_ can be NULL, see OnIOComplete().
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pipe_reader_.get())
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pipe_reader_->OnDataReady(-1); // terminate data stream
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NB: requester is signaled when i/o completes
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTestICMP(const TestICMPCallback& callback, dbus::Response* response) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string status;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response && dbus::MessageReader(response).PopString(&status))
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(true, status);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(false, "");
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when pipe i/o completes; pass data on and delete the instance.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnIOComplete() {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_.Run(base::RefCountedString::TakeString(pipe_reader_->data()));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pipe_reader_.reset();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::ObjectProxy* debugdaemon_proxy_;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PipeReader> pipe_reader_;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopSystemTracingCallback callback_;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<DebugDaemonClientImpl> weak_ptr_factory_;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DebugDaemonClientImpl);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The DebugDaemonClient implementation used on Linux desktop,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which does nothing.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DebugDaemonClientStubImpl : public DebugDaemonClient {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DebugDaemonClient overrides.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetDebugLogs(base::PlatformFile file,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const GetDebugLogsCallback& callback) OVERRIDE {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(false);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDebugMode(const std::string& subsystem,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const SetDebugModeCallback& callback) OVERRIDE {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(false);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartSystemTracing() OVERRIDE {}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback) OVERRIDE {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string no_data;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(base::RefCountedString::TakeString(&no_data));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetRoutes(bool numeric, bool ipv6,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GetRoutesCallback& callback) OVERRIDE {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> empty;
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, empty));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetNetworkStatus(const GetNetworkStatusCallback& callback)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, ""));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetModemStatus(const GetModemStatusCallback& callback)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE {
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, ""));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetNetworkInterfaces(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetNetworkInterfacesCallback& callback) OVERRIDE {
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, ""));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetPerfData(uint32_t duration,
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const GetPerfDataCallback& callback) OVERRIDE {
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<uint8> data;
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::Bind(callback, data));
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAllLogs(const GetLogsCallback& callback) OVERRIDE {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::map<std::string, std::string> empty;
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, empty));
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetUserLogFiles(const GetLogsCallback& callback) OVERRIDE {
608b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    std::map<std::string, std::string> user_logs;
609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    user_logs["preferences"] = "Preferences";
610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    user_logs["invalid_file"] = "Invalid File";
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                     base::Bind(callback, true, user_logs));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TestICMP(const std::string& ip_address,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const TestICMPCallback& callback) OVERRIDE {
617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::Bind(callback, false, ""));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DebugDaemonClient::DebugDaemonClient() {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DebugDaemonClient::~DebugDaemonClient() {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DebugDaemonClient::StopSystemTracingCallback
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DebugDaemonClient::EmptyStopSystemTracingCallback() {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Bind(&EmptyStopSystemTracingCallbackBody);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DebugDaemonClient* DebugDaemonClient::Create(DBusClientImplementationType type,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   dbus::Bus* bus) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new DebugDaemonClientImpl(bus);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DebugDaemonClientStubImpl();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
644