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)#include "chromeos/dbus/gsm_sms_client.h"
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/values_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class actually making method calls for SMS services, used by
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GsmSMSClientImpl.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SMSProxy {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef GsmSMSClient::SmsReceivedHandler SmsReceivedHandler;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef GsmSMSClient::DeleteCallback DeleteCallback;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef GsmSMSClient::GetCallback GetCallback;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef GsmSMSClient::ListCallback ListCallback;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SMSProxy(dbus::Bus* bus,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const std::string& service_name,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const dbus::ObjectPath& object_path)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : proxy_(bus->GetObjectProxy(service_name, object_path)),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->ConnectToSignal(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        modemmanager::kModemManagerSMSInterface,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        modemmanager::kSMSReceivedSignal,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&SMSProxy::OnSmsReceived, weak_ptr_factory_.GetWeakPtr()),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&SMSProxy::OnSignalConnected,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets SmsReceived signal handler.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSmsReceivedHandler(const SmsReceivedHandler& handler) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(sms_received_handler_.is_null());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sms_received_handler_ = handler;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets SmsReceived signal handler.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetSmsReceivedHandler() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sms_received_handler_.Reset();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls Delete method.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Delete(uint32 index, const DeleteCallback& callback) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 modemmanager::kSMSDeleteFunction);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendUint32(index);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&SMSProxy::OnDelete,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls Get method.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Get(uint32 index, const GetCallback& callback) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 modemmanager::kSMSGetFunction);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageWriter writer(&method_call);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writer.AppendUint32(index);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&SMSProxy::OnGet,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls List method.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void List(const ListCallback& callback) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MethodCall method_call(modemmanager::kModemManagerSMSInterface,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 modemmanager::kSMSListFunction);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Bind(&SMSProxy::OnList,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  weak_ptr_factory_.GetWeakPtr(),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  callback));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles SmsReceived signal.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSmsReceived(dbus::Signal* signal) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 index = 0;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool complete = false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(signal);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!reader.PopUint32(&index) ||
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !reader.PopBool(&complete)) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid signal: " << signal->ToString();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!sms_received_handler_.is_null())
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sms_received_handler_.Run(index, complete);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles the result of signal connection setup.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalConnected(const std::string& interface,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& signal,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool succeeded) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG_IF(ERROR, !succeeded) << "Connect to " << interface << " " <<
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        signal << " failed.";
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles responses of Delete method calls.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDelete(const DeleteCallback& callback, dbus::Response* response) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles responses of Get method calls.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGet(const GetCallback& callback, dbus::Response* response) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(response);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* dictionary_value = NULL;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!value.get() || !value->GetAsDictionary(&dictionary_value)) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Invalid response: " << response->ToString();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(*dictionary_value);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles responses of List method calls.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnList(const ListCallback& callback, dbus::Response* response) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::MessageReader reader(response);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list_value = NULL;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!value.get() || !value->GetAsList(&list_value)) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Invalid response: " << response->ToString();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(*list_value);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::ObjectProxy* proxy_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SmsReceivedHandler sms_received_handler_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<SMSProxy> weak_ptr_factory_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SMSProxy);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The GsmSMSClient implementation.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GsmSMSClientImpl : public GsmSMSClient {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  GsmSMSClientImpl() : bus_(NULL), proxies_deleter_(&proxies_) {}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSmsReceivedHandler(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& service_name,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectPath& object_path,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SmsReceivedHandler& handler) OVERRIDE {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProxy(service_name, object_path)->SetSmsReceivedHandler(handler);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResetSmsReceivedHandler(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& service_name,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectPath& object_path) OVERRIDE {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProxy(service_name, object_path)->ResetSmsReceivedHandler();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Delete(const std::string& service_name,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const dbus::ObjectPath& object_path,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      uint32 index,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const DeleteCallback& callback) OVERRIDE {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProxy(service_name, object_path)->Delete(index, callback);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Get(const std::string& service_name,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const dbus::ObjectPath& object_path,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   uint32 index,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const GetCallback& callback) OVERRIDE {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProxy(service_name, object_path)->Get(index, callback);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void List(const std::string& service_name,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const dbus::ObjectPath& object_path,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const ListCallback& callback) OVERRIDE {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProxy(service_name, object_path)->List(callback);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GsmSMSClient override.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RequestUpdate(const std::string& service_name,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const dbus::ObjectPath& object_path) OVERRIDE {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void Init(dbus::Bus* bus) OVERRIDE { bus_ = bus; }
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::pair<std::string, std::string>, SMSProxy*> ProxyMap;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a SMSProxy for the given service name and object path.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SMSProxy* GetProxy(const std::string& service_name,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const dbus::ObjectPath& object_path) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProxyMap::key_type key(service_name, object_path.value());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyMap::iterator it = proxies_.find(key);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it != proxies_.end())
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return it->second;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There is no proxy for the service_name and object_path, create it.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SMSProxy* proxy = new SMSProxy(bus_, service_name, object_path);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxies_.insert(ProxyMap::value_type(key, proxy));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return proxy;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Bus* bus_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyMap proxies_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLValueDeleter<ProxyMap> proxies_deleter_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GsmSMSClientImpl);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GsmSMSClient
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GsmSMSClient::GsmSMSClient() {}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GsmSMSClient::~GsmSMSClient() {}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)GsmSMSClient* GsmSMSClient::Create() {
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return new GsmSMSClientImpl();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
252