15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// found in the LICENSE file. 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "chromeos/dbus/sms_client.h" 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <map> 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utility> 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/bind.h" 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/location.h" 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/memory/scoped_ptr.h" 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/memory/weak_ptr.h" 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/message_loop/message_loop.h" 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/stl_util.h" 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/strings/stringprintf.h" 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/values.h" 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "dbus/bus.h" 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "dbus/message.h" 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "dbus/object_proxy.h" 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "dbus/values_util.h" 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "third_party/cros_system_api/dbus/service_constants.h" 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectnamespace chromeos { 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectnamespace { 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// SMSClient is used to communicate with the 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// org.freedesktop.ModemManager1.SMS service. All methods should be 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// called from the origin thread (UI thread) which initializes the 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// DBusThreadManager instance. 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass SMSClientImpl : public SMSClient { 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMSClientImpl() : bus_(NULL), weak_ptr_factory_(this) {} 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual ~SMSClientImpl() {} 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Calls GetAll method. |callback| is called after the method call succeeds. 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual void GetAll(const std::string& service_name, 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const dbus::ObjectPath& object_path, 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const GetAllCallback& callback) OVERRIDE { 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::ObjectProxy *proxy = bus_->GetObjectProxy(service_name, object_path); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::MethodCall method_call(dbus::kDBusPropertiesInterface, 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::kDBusPropertiesGetAll); 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::MessageWriter writer(&method_call); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project writer.AppendString(modemmanager::kModemManager1SmsInterface); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proxy->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::Bind(&SMSClientImpl::OnGetAll, 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project weak_ptr_factory_.GetWeakPtr(), 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback)); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protected: 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual void Init(dbus::Bus* bus) OVERRIDE { 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bus_ = bus; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private: 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Handles responses of GetAll method calls. 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void OnGetAll(const GetAllCallback& callback, dbus::Response* response) { 60b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati if (!response) { 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Must invoke the callback, even if there is no message. 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::DictionaryValue empty_dictionary; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback.Run(empty_dictionary); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::MessageReader reader(response); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader)); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::DictionaryValue* dictionary_value = NULL; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!value.get() || !value->GetAsDictionary(&dictionary_value)) { 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project LOG(WARNING) << "Invalid response: " << response->ToString(); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::DictionaryValue empty_dictionary; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback.Run(empty_dictionary); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback.Run(*dictionary_value); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dbus::Bus* bus_; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Note: This should remain the last member so it'll be destroyed and 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // invalidate its weak pointers before any other members are destroyed. 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project base::WeakPtrFactory<SMSClientImpl> weak_ptr_factory_; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DISALLOW_COPY_AND_ASSIGN(SMSClientImpl); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} // namespace 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// SMSClient 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSMSClient::SMSClient() {} 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSMSClient::~SMSClient() {} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// static 98b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil NanavatiSMSClient* SMSClient::Create() { 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return new SMSClientImpl(); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} // namespace chromeos 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project