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