Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Side by Side Diff: chromeos/network/network_sms_handler.cc

Issue 12669004: Fix NetworkSmsHandler to observe Manager and improve API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chromeos/network/network_sms_handler.h ('k') | chromeos/network/network_sms_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698