Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/network/network_sms_handler.h" | 5 #include "chromeos/network/network_sms_handler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/values.h" | |
| 13 #include "chromeos/dbus/dbus_thread_manager.h" | 14 #include "chromeos/dbus/dbus_thread_manager.h" |
| 14 #include "chromeos/dbus/shill_device_client.h" | 15 #include "chromeos/dbus/shill_device_client.h" |
| 15 #include "chromeos/dbus/shill_manager_client.h" | 16 #include "chromeos/dbus/shill_manager_client.h" |
| 16 #include "chromeos/dbus/gsm_sms_client.h" | 17 #include "chromeos/dbus/gsm_sms_client.h" |
| 17 #include "chromeos/dbus/modem_messaging_client.h" | 18 #include "chromeos/dbus/modem_messaging_client.h" |
| 18 #include "chromeos/dbus/sms_client.h" | 19 #include "chromeos/dbus/sms_client.h" |
| 19 #include "dbus/object_path.h" | 20 #include "dbus/object_path.h" |
| 20 #include "third_party/cros_system_api/dbus/service_constants.h" | 21 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 21 | 22 |
| 22 // Not exposed/exported. | |
| 23 namespace { | 23 namespace { |
| 24 | |
| 25 // Not exposed/exported: | |
| 24 const char kSmscKey[] = "smsc"; | 26 const char kSmscKey[] = "smsc"; |
| 25 const char kValidityKey[] = "validity"; | 27 const char kValidityKey[] = "validity"; |
| 26 const char kClassKey[] = "class"; | 28 const char kClassKey[] = "class"; |
| 27 const char kIndexKey[] = "index"; | 29 const char kIndexKey[] = "index"; |
| 28 | 30 |
| 29 // Keys from ModemManager1 | 31 // Keys from ModemManager1 |
| 30 const char kModemManager1NumberKey[] = "Number"; | 32 const char kModemManager1NumberKey[] = "Number"; |
| 31 const char kModemManager1TextKey[] = "Text"; | 33 const char kModemManager1TextKey[] = "Text"; |
| 32 const char kModemManager1TimestampKey[] = "Timestamp"; | 34 const char kModemManager1TimestampKey[] = "Timestamp"; |
| 35 | |
| 36 // Maximum number of messages stored for RequestUpdate(true). | |
| 37 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,
| |
| 38 | |
| 33 } // namespace | 39 } // namespace |
| 34 | 40 |
| 35 namespace chromeos { | 41 namespace chromeos { |
| 36 | 42 |
| 37 // static | 43 // static |
| 38 const char NetworkSmsHandler::kNumberKey[] = "number"; | 44 const char NetworkSmsHandler::kNumberKey[] = "number"; |
| 39 const char NetworkSmsHandler::kTextKey[] = "text"; | 45 const char NetworkSmsHandler::kTextKey[] = "text"; |
| 40 const char NetworkSmsHandler::kTimestampKey[] = "timestamp"; | 46 const char NetworkSmsHandler::kTimestampKey[] = "timestamp"; |
| 41 | 47 |
| 48 static NetworkSmsHandler* g_network_sms_handler = NULL; | |
| 49 | |
| 42 class NetworkSmsHandler::NetworkSmsDeviceHandler { | 50 class NetworkSmsHandler::NetworkSmsDeviceHandler { |
| 43 public: | 51 public: |
| 44 NetworkSmsDeviceHandler() {} | 52 NetworkSmsDeviceHandler() {} |
| 45 virtual ~NetworkSmsDeviceHandler() {} | 53 virtual ~NetworkSmsDeviceHandler() {} |
| 46 | 54 |
| 47 virtual void RequestUpdate() = 0; | 55 virtual void RequestUpdate() = 0; |
| 48 }; | 56 }; |
| 49 | 57 |
| 50 class NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler | 58 class NetworkSmsHandler::ModemManagerNetworkSmsDeviceHandler |
| 51 : public NetworkSmsHandler::NetworkSmsDeviceHandler { | 59 : public NetworkSmsHandler::NetworkSmsDeviceHandler { |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 } | 332 } |
| 325 | 333 |
| 326 /////////////////////////////////////////////////////////////////////////////// | 334 /////////////////////////////////////////////////////////////////////////////// |
| 327 // NetworkSmsHandler | 335 // NetworkSmsHandler |
| 328 | 336 |
| 329 NetworkSmsHandler::NetworkSmsHandler() | 337 NetworkSmsHandler::NetworkSmsHandler() |
| 330 : weak_ptr_factory_(this) { | 338 : weak_ptr_factory_(this) { |
| 331 } | 339 } |
| 332 | 340 |
| 333 NetworkSmsHandler::~NetworkSmsHandler() { | 341 NetworkSmsHandler::~NetworkSmsHandler() { |
| 342 DBusThreadManager::Get()->GetShillManagerClient()-> | |
| 343 RemovePropertyChangedObserver(this); | |
| 334 } | 344 } |
| 335 | 345 |
| 336 void NetworkSmsHandler::Init() { | 346 void NetworkSmsHandler::InitShillDevices() { |
| 337 // TODO(stevenjb): This code needs to monitor changes to Manager.Network | 347 // Add as an observer here so that new devices added after this call are |
| 338 // so that devices added after Init() is called get added to device_handlers_. | 348 // recognized. |
| 339 // See: crbug.com/133416. | 349 DBusThreadManager::Get()->GetShillManagerClient()->AddPropertyChangedObserver( |
| 340 | 350 this); |
| 341 // Request network manager properties so that we can get the list of devices. | 351 // Request network manager properties so that we can get the list of devices. |
| 342 DBusThreadManager::Get()->GetShillManagerClient()->GetProperties( | 352 DBusThreadManager::Get()->GetShillManagerClient()->GetProperties( |
| 343 base::Bind(&NetworkSmsHandler::ManagerPropertiesCallback, | 353 base::Bind(&NetworkSmsHandler::ManagerPropertiesCallback, |
| 344 weak_ptr_factory_.GetWeakPtr())); | 354 weak_ptr_factory_.GetWeakPtr())); |
| 345 } | 355 } |
| 346 | 356 |
| 347 void NetworkSmsHandler::RequestUpdate() { | 357 // static |
| 358 void NetworkSmsHandler::Initialize() { | |
| 359 CHECK(!g_network_sms_handler); | |
| 360 g_network_sms_handler = new NetworkSmsHandler(); | |
| 361 g_network_sms_handler->InitShillDevices(); | |
| 362 } | |
| 363 | |
| 364 // static | |
| 365 void NetworkSmsHandler::Shutdown() { | |
| 366 CHECK(g_network_sms_handler); | |
| 367 delete g_network_sms_handler; | |
| 368 g_network_sms_handler = NULL; | |
| 369 } | |
| 370 | |
| 371 // static | |
| 372 NetworkSmsHandler* NetworkSmsHandler::Get() { | |
| 373 CHECK(g_network_sms_handler) | |
| 374 << "NetworkSmsHandler::Get() called before Initialize()"; | |
| 375 return g_network_sms_handler; | |
| 376 } | |
| 377 | |
| 378 void NetworkSmsHandler::RequestUpdate(bool request_existing) { | |
| 379 // If we already received messages and |request_existing| is true, send | |
| 380 // updates for existing messages. | |
| 381 for (ScopedVector<base::DictionaryValue>::iterator iter = | |
| 382 received_messages_.begin(); | |
| 383 iter != received_messages_.end(); ++iter) { | |
| 384 base::DictionaryValue* message = *iter; | |
| 385 NotifyMessageReceived(*message); | |
| 386 } | |
| 387 // Request updates from each device. | |
| 348 for (ScopedVector<NetworkSmsDeviceHandler>::iterator iter = | 388 for (ScopedVector<NetworkSmsDeviceHandler>::iterator iter = |
| 349 device_handlers_.begin(); iter != device_handlers_.end(); ++iter) { | 389 device_handlers_.begin(); iter != device_handlers_.end(); ++iter) { |
| 350 (*iter)->RequestUpdate(); | 390 (*iter)->RequestUpdate(); |
| 351 } | 391 } |
| 352 } | 392 } |
| 353 | 393 |
| 354 void NetworkSmsHandler::AddObserver(Observer* observer) { | 394 void NetworkSmsHandler::AddObserver(Observer* observer) { |
| 355 observers_.AddObserver(observer); | 395 observers_.AddObserver(observer); |
| 356 } | 396 } |
| 357 | 397 |
| 358 void NetworkSmsHandler::RemoveObserver(Observer* observer) { | 398 void NetworkSmsHandler::RemoveObserver(Observer* observer) { |
| 359 observers_.RemoveObserver(observer); | 399 observers_.RemoveObserver(observer); |
| 360 } | 400 } |
| 361 | 401 |
| 402 void NetworkSmsHandler::OnPropertyChanged(const std::string& name, | |
| 403 const base::Value& value) { | |
| 404 if (name != flimflam::kDevicesProperty) | |
| 405 return; | |
| 406 const base::ListValue* devices = NULL; | |
| 407 if (!value.GetAsList(&devices) || !devices) | |
| 408 return; | |
| 409 UpdateDevices(devices); | |
| 410 } | |
| 411 | |
| 412 // Private methods | |
| 413 | |
| 362 void NetworkSmsHandler::NotifyMessageReceived( | 414 void NetworkSmsHandler::NotifyMessageReceived( |
| 363 const base::DictionaryValue& message) { | 415 const base::DictionaryValue& message) { |
| 416 base::DictionaryValue* new_message = message.DeepCopy(); | |
| 417 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_
| |
| 418 received_messages_.erase(received_messages_.begin()); | |
| 419 received_messages_.push_back(new_message); | |
| 364 FOR_EACH_OBSERVER(Observer, observers_, MessageReceived(message)); | 420 FOR_EACH_OBSERVER(Observer, observers_, MessageReceived(message)); |
| 365 } | 421 } |
| 366 | 422 |
| 367 void NetworkSmsHandler::ManagerPropertiesCallback( | 423 void NetworkSmsHandler::ManagerPropertiesCallback( |
| 368 DBusMethodCallStatus call_status, | 424 DBusMethodCallStatus call_status, |
| 369 const base::DictionaryValue& properties) { | 425 const base::DictionaryValue& properties) { |
| 370 if (call_status != DBUS_METHOD_CALL_SUCCESS) { | 426 if (call_status != DBUS_METHOD_CALL_SUCCESS) { |
| 371 LOG(ERROR) << "NetworkSmsHandler: Failed to get manager properties."; | 427 LOG(ERROR) << "NetworkSmsHandler: Failed to get manager properties."; |
| 372 return; | 428 return; |
| 373 } | 429 } |
| 374 const base::Value* value; | 430 const base::Value* value; |
| 375 if (!properties.GetWithoutPathExpansion(flimflam::kDevicesProperty, &value) || | 431 if (!properties.GetWithoutPathExpansion(flimflam::kDevicesProperty, &value) || |
| 376 value->GetType() != base::Value::TYPE_LIST) { | 432 value->GetType() != base::Value::TYPE_LIST) { |
| 377 LOG(ERROR) << "NetworkSmsHandler: No list value for: " | 433 LOG(ERROR) << "NetworkSmsHandler: No list value for: " |
| 378 << flimflam::kDevicesProperty; | 434 << flimflam::kDevicesProperty; |
| 379 return; | 435 return; |
| 380 } | 436 } |
| 381 const base::ListValue* devices = static_cast<const base::ListValue*>(value); | 437 const base::ListValue* devices = static_cast<const base::ListValue*>(value); |
| 438 UpdateDevices(devices); | |
| 439 } | |
| 440 | |
| 441 void NetworkSmsHandler::UpdateDevices(const base::ListValue* devices) { | |
| 382 for (base::ListValue::const_iterator iter = devices->begin(); | 442 for (base::ListValue::const_iterator iter = devices->begin(); |
| 383 iter != devices->end(); ++iter) { | 443 iter != devices->end(); ++iter) { |
| 384 std::string device_path; | 444 std::string device_path; |
| 385 (*iter)->GetAsString(&device_path); | 445 (*iter)->GetAsString(&device_path); |
| 386 if (!device_path.empty()) { | 446 if (!device_path.empty()) { |
| 387 // Request device properties. | 447 // Request device properties. |
| 388 VLOG(1) << "GetDeviceProperties: " << device_path; | 448 VLOG(1) << "GetDeviceProperties: " << device_path; |
| 389 DBusThreadManager::Get()->GetShillDeviceClient()->GetProperties( | 449 DBusThreadManager::Get()->GetShillDeviceClient()->GetProperties( |
| 390 dbus::ObjectPath(device_path), | 450 dbus::ObjectPath(device_path), |
| 391 base::Bind(&NetworkSmsHandler::DevicePropertiesCallback, | 451 base::Bind(&NetworkSmsHandler::DevicePropertiesCallback, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 this, dbus_connection, object_path)); | 496 this, dbus_connection, object_path)); |
| 437 } else { | 497 } else { |
| 438 device_handlers_.push_back( | 498 device_handlers_.push_back( |
| 439 new ModemManagerNetworkSmsDeviceHandler( | 499 new ModemManagerNetworkSmsDeviceHandler( |
| 440 this, dbus_connection, object_path)); | 500 this, dbus_connection, object_path)); |
| 441 } | 501 } |
| 442 } | 502 } |
| 443 | 503 |
| 444 | 504 |
| 445 } // namespace chromeos | 505 } // namespace chromeos |
| OLD | NEW |