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