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 |