1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/bind.h"
6#include "base/message_loop/message_loop.h"
7#include "chromeos/dbus/fake_gsm_sms_client.h"
8
9namespace chromeos {
10
11FakeGsmSMSClient::FakeGsmSMSClient()
12    : test_index_(-1),
13      sms_test_message_switch_present_(false),
14      weak_ptr_factory_(this) {
15  test_messages_.push_back("Test Message 0");
16  test_messages_.push_back("Test Message 1");
17  test_messages_.push_back("Test a relatively long message 2");
18  test_messages_.push_back("Test a very, the quick brown fox jumped"
19                           " over the lazy dog, long message 3");
20  test_messages_.push_back("Test Message 4");
21  test_messages_.push_back("Test Message 5");
22  test_messages_.push_back("Test Message 6");
23}
24
25FakeGsmSMSClient::~FakeGsmSMSClient() {
26}
27
28void FakeGsmSMSClient::Init(dbus::Bus* bus) {
29}
30
31void FakeGsmSMSClient::SetSmsReceivedHandler(
32    const std::string& service_name,
33    const dbus::ObjectPath& object_path,
34    const SmsReceivedHandler& handler) {
35  handler_ = handler;
36}
37
38void FakeGsmSMSClient::ResetSmsReceivedHandler(
39    const std::string& service_name,
40    const dbus::ObjectPath& object_path) {
41  handler_.Reset();
42}
43
44void FakeGsmSMSClient::Delete(const std::string& service_name,
45                              const dbus::ObjectPath& object_path,
46                              uint32 index,
47                              const DeleteCallback& callback) {
48  message_list_.Remove(index, NULL);
49  callback.Run();
50}
51
52void FakeGsmSMSClient::Get(const std::string& service_name,
53                           const dbus::ObjectPath& object_path,
54                           uint32 index,
55                           const GetCallback& callback) {
56  base::DictionaryValue* dictionary = NULL;
57  if (message_list_.GetDictionary(index, &dictionary)) {
58    callback.Run(*dictionary);
59    return;
60  }
61  base::DictionaryValue empty_dictionary;
62  callback.Run(empty_dictionary);
63}
64
65void FakeGsmSMSClient::List(const std::string& service_name,
66                            const dbus::ObjectPath& object_path,
67                            const ListCallback& callback) {
68  callback.Run(message_list_);
69}
70
71void FakeGsmSMSClient::RequestUpdate(const std::string& service_name,
72                                     const dbus::ObjectPath& object_path) {
73  if (!sms_test_message_switch_present_)
74    return;
75
76  if (test_index_ >= 0)
77    return;
78  test_index_ = 0;
79  // Call PushTestMessageChain asynchronously so that the handler_ callback
80  // does not get called from the update request.
81  base::MessageLoop::current()->PostTask(
82      FROM_HERE,
83      base::Bind(&FakeGsmSMSClient::PushTestMessageChain,
84                 weak_ptr_factory_.GetWeakPtr()));
85}
86
87void FakeGsmSMSClient::PushTestMessageChain() {
88  if (PushTestMessage())
89    PushTestMessageDelayed();
90}
91
92void FakeGsmSMSClient::PushTestMessageDelayed() {
93  const int kSmsMessageDelaySeconds = 5;
94  base::MessageLoop::current()->PostDelayedTask(
95      FROM_HERE,
96      base::Bind(&FakeGsmSMSClient::PushTestMessageChain,
97                 weak_ptr_factory_.GetWeakPtr()),
98      base::TimeDelta::FromSeconds(kSmsMessageDelaySeconds));
99}
100
101bool FakeGsmSMSClient::PushTestMessage() {
102  if (test_index_ >= static_cast<int>(test_messages_.size()))
103    return false;
104  base::DictionaryValue* message = new base::DictionaryValue;
105  message->SetString("number", "000-000-0000");
106  message->SetString("text", test_messages_[test_index_]);
107  message->SetInteger("index", test_index_);
108  int msg_index = message_list_.GetSize();
109  message_list_.Append(message);
110  if (!handler_.is_null())
111    handler_.Run(msg_index, true);
112  ++test_index_;
113  return true;
114}
115
116}  // namespace chromeos
117