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