Chromium Code Reviews| Index: chromeos/network/network_sms_handler.cc |
| diff --git a/chromeos/network/network_sms_handler.cc b/chromeos/network/network_sms_handler.cc |
| index f70314b08f8251242794c8231e31b8b5fecc0c88..4f32865f1b028a293088ee5b3e14ec9f89584367 100644 |
| --- a/chromeos/network/network_sms_handler.cc |
| +++ b/chromeos/network/network_sms_handler.cc |
| @@ -10,6 +10,7 @@ |
| #include <vector> |
| #include "base/bind.h" |
| +#include "base/values.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/shill_device_client.h" |
| #include "chromeos/dbus/shill_manager_client.h" |
| @@ -19,8 +20,9 @@ |
| #include "dbus/object_path.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| -// Not exposed/exported. |
| namespace { |
| + |
| +// Not exposed/exported: |
| const char kSmscKey[] = "smsc"; |
| const char kValidityKey[] = "validity"; |
| const char kClassKey[] = "class"; |
| @@ -30,6 +32,10 @@ const char kIndexKey[] = "index"; |
| const char kModemManager1NumberKey[] = "Number"; |
| const char kModemManager1TextKey[] = "Text"; |
| const char kModemManager1TimestampKey[] = "Timestamp"; |
| + |
| +// Maximum number of messages stored for RequestUpdate(true). |
| +const size_t kMaxReceivedMessages = 100; |
|
Greg Spencer (Chromium)
2013/03/20 18:30:52
This seems kind of low to me. My phone defaults t
stevenjb
2013/03/25 19:51:10
We don't really have a fully featured SMS system,
|
| + |
| } // namespace |
| namespace chromeos { |
| @@ -39,6 +45,8 @@ const char NetworkSmsHandler::kNumberKey[] = "number"; |
| const char NetworkSmsHandler::kTextKey[] = "text"; |
| const char NetworkSmsHandler::kTimestampKey[] = "timestamp"; |
| +static NetworkSmsHandler* g_network_sms_handler = NULL; |
| + |
| class NetworkSmsHandler::NetworkSmsDeviceHandler { |
| public: |
| NetworkSmsDeviceHandler() {} |
| @@ -331,20 +339,52 @@ NetworkSmsHandler::NetworkSmsHandler() |
| } |
| NetworkSmsHandler::~NetworkSmsHandler() { |
| + DBusThreadManager::Get()->GetShillManagerClient()-> |
| + RemovePropertyChangedObserver(this); |
| } |
| -void NetworkSmsHandler::Init() { |
| - // TODO(stevenjb): This code needs to monitor changes to Manager.Network |
| - // so that devices added after Init() is called get added to device_handlers_. |
| - // See: crbug.com/133416. |
| - |
| +void NetworkSmsHandler::InitShillDevices() { |
| + // Add as an observer here so that new devices added after this call are |
| + // recognized. |
| + DBusThreadManager::Get()->GetShillManagerClient()->AddPropertyChangedObserver( |
| + this); |
| // Request network manager properties so that we can get the list of devices. |
| DBusThreadManager::Get()->GetShillManagerClient()->GetProperties( |
| base::Bind(&NetworkSmsHandler::ManagerPropertiesCallback, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| -void NetworkSmsHandler::RequestUpdate() { |
| +// static |
| +void NetworkSmsHandler::Initialize() { |
| + CHECK(!g_network_sms_handler); |
| + g_network_sms_handler = new NetworkSmsHandler(); |
| + g_network_sms_handler->InitShillDevices(); |
| +} |
| + |
| +// static |
| +void NetworkSmsHandler::Shutdown() { |
| + CHECK(g_network_sms_handler); |
| + delete g_network_sms_handler; |
| + g_network_sms_handler = NULL; |
| +} |
| + |
| +// static |
| +NetworkSmsHandler* NetworkSmsHandler::Get() { |
| + CHECK(g_network_sms_handler) |
| + << "NetworkSmsHandler::Get() called before Initialize()"; |
| + return g_network_sms_handler; |
| +} |
| + |
| +void NetworkSmsHandler::RequestUpdate(bool request_existing) { |
| + // If we already received messages and |request_existing| is true, send |
| + // updates for existing messages. |
| + for (ScopedVector<base::DictionaryValue>::iterator iter = |
| + received_messages_.begin(); |
| + iter != received_messages_.end(); ++iter) { |
| + base::DictionaryValue* message = *iter; |
| + NotifyMessageReceived(*message); |
| + } |
| + // Request updates from each device. |
| for (ScopedVector<NetworkSmsDeviceHandler>::iterator iter = |
| device_handlers_.begin(); iter != device_handlers_.end(); ++iter) { |
| (*iter)->RequestUpdate(); |
| @@ -359,8 +399,24 @@ void NetworkSmsHandler::RemoveObserver(Observer* observer) { |
| observers_.RemoveObserver(observer); |
| } |
| +void NetworkSmsHandler::OnPropertyChanged(const std::string& name, |
| + const base::Value& value) { |
| + if (name != flimflam::kDevicesProperty) |
| + return; |
| + const base::ListValue* devices = NULL; |
| + if (!value.GetAsList(&devices) || !devices) |
| + return; |
| + UpdateDevices(devices); |
| +} |
| + |
| +// Private methods |
| + |
| void NetworkSmsHandler::NotifyMessageReceived( |
| const base::DictionaryValue& message) { |
| + base::DictionaryValue* new_message = message.DeepCopy(); |
| + if (received_messages_.size() >= kMaxReceivedMessages) |
|
Greg Spencer (Chromium)
2013/03/20 18:30:52
perhaps "while" instead of "if"? If we allow chan
stevenjb
2013/03/25 19:51:10
This is the only place we add entries to received_
|
| + received_messages_.erase(received_messages_.begin()); |
| + received_messages_.push_back(new_message); |
| FOR_EACH_OBSERVER(Observer, observers_, MessageReceived(message)); |
| } |
| @@ -379,6 +435,10 @@ void NetworkSmsHandler::ManagerPropertiesCallback( |
| return; |
| } |
| const base::ListValue* devices = static_cast<const base::ListValue*>(value); |
| + UpdateDevices(devices); |
| +} |
| + |
| +void NetworkSmsHandler::UpdateDevices(const base::ListValue* devices) { |
| for (base::ListValue::const_iterator iter = devices->begin(); |
| iter != devices->end(); ++iter) { |
| std::string device_path; |