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..986317d9da8569be59d7c73eff22bb42d045b00f 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; |
+ |
} // namespace |
namespace chromeos { |
@@ -61,7 +67,7 @@ class NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler |
void SmsReceivedCallback(uint32 index, bool complete); |
void GetCallback(uint32 index, const base::DictionaryValue& dictionary); |
void DeleteMessages(); |
- void NotifyMessageReceived(const base::DictionaryValue& dictionary); |
+ void MessageReceived(const base::DictionaryValue& dictionary); |
NetworkSmsHandler* host_; |
std::string dbus_connection_; |
@@ -111,7 +117,7 @@ void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::ListCallback( |
base::DictionaryValue* message = NULL; |
if (!(*iter)->GetAsDictionary(&message)) |
continue; |
- NotifyMessageReceived(*message); |
+ MessageReceived(*message); |
double index = 0; |
if (message->GetDoubleWithoutPathExpansion(kIndexKey, &index)) |
delete_queue_.push_back(static_cast<uint32>(index)); |
@@ -154,19 +160,19 @@ ModemManagerNetworkSmsDeviceHandler::SmsReceivedCallback( |
void NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler::GetCallback( |
uint32 index, |
const base::DictionaryValue& dictionary) { |
- NotifyMessageReceived(dictionary); |
+ MessageReceived(dictionary); |
delete_queue_.push_back(index); |
if (!deleting_messages_) |
DeleteMessages(); |
} |
void NetworkSmsHandler:: |
-ModemManagerNetworkSmsDeviceHandler::NotifyMessageReceived( |
+ModemManagerNetworkSmsDeviceHandler::MessageReceived( |
const base::DictionaryValue& dictionary) { |
// The keys of the ModemManager.Modem.Gsm.SMS interface match the |
// exported keys, so the dictionary used as a notification argument |
// unchanged. |
- host_->NotifyMessageReceived(dictionary); |
+ host_->MessageReceived(dictionary); |
} |
class NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler |
@@ -184,7 +190,7 @@ class NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler |
void GetCallback(const base::DictionaryValue& dictionary); |
void DeleteMessages(); |
void GetMessages(); |
- void NotifyMessageReceived(const base::DictionaryValue& dictionary); |
+ void MessageReceived(const base::DictionaryValue& dictionary); |
NetworkSmsHandler* host_; |
std::string dbus_connection_; |
@@ -299,12 +305,12 @@ ModemManager1NetworkSmsDeviceHandler::SmsReceivedCallback( |
void NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler::GetCallback( |
const base::DictionaryValue& dictionary) { |
- NotifyMessageReceived(dictionary); |
+ MessageReceived(dictionary); |
GetMessages(); |
} |
void NetworkSmsHandler:: |
-ModemManager1NetworkSmsDeviceHandler::NotifyMessageReceived( |
+ModemManager1NetworkSmsDeviceHandler::MessageReceived( |
const base::DictionaryValue& dictionary) { |
// The keys of the ModemManager1.SMS interface do not match the |
// exported keys, so a new dictionary is created with the expected |
@@ -320,7 +326,7 @@ ModemManager1NetworkSmsDeviceHandler::NotifyMessageReceived( |
if (dictionary.GetStringWithoutPathExpansion(kModemManager1TimestampKey, |
×tamp)) |
new_dictionary.SetString(kTimestampKey, timestamp); |
- host_->NotifyMessageReceived(new_dictionary); |
+ host_->MessageReceived(new_dictionary); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -331,20 +337,31 @@ 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. |
- |
+ // 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() { |
+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,11 +376,36 @@ 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::AddReceivedMessage( |
+ const base::DictionaryValue& message) { |
+ base::DictionaryValue* new_message = message.DeepCopy(); |
+ if (received_messages_.size() >= kMaxReceivedMessages) |
+ received_messages_.erase(received_messages_.begin()); |
+ received_messages_.push_back(new_message); |
+} |
+ |
void NetworkSmsHandler::NotifyMessageReceived( |
const base::DictionaryValue& message) { |
FOR_EACH_OBSERVER(Observer, observers_, MessageReceived(message)); |
} |
+void NetworkSmsHandler::MessageReceived(const base::DictionaryValue& message) { |
+ AddReceivedMessage(message); |
+ NotifyMessageReceived(message); |
+} |
+ |
void NetworkSmsHandler::ManagerPropertiesCallback( |
DBusMethodCallStatus call_status, |
const base::DictionaryValue& properties) { |
@@ -379,6 +421,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; |