Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/sms_observer.h"
      6 
      7 #include "base/utf_string_conversions.h"
      8 #include "chrome/browser/chromeos/cros/cros_library.h"
      9 #include "chrome/browser/chromeos/notifications/system_notification.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "grit/generated_resources.h"
     12 #include "grit/theme_resources.h"
     13 #include "third_party/cros/chromeos_network.h"
     14 #include "ui/base/l10n/l10n_util.h"
     15 
     16 namespace chromeos {
     17 
     18 SmsObserver::SmsObserver(Profile* profile)
     19     : profile_(profile) {
     20   DCHECK(profile_);
     21   if (!CrosLibrary::Get()->EnsureLoaded())
     22     return;
     23 
     24   UpdateObservers(chromeos::CrosLibrary::Get()->GetNetworkLibrary());
     25 }
     26 
     27 SmsObserver::~SmsObserver() {
     28   NetworkLibrary* library = chromeos::CrosLibrary::Get()->GetNetworkLibrary();
     29   library->RemoveNetworkManagerObserver(this);
     30   DisconnectAll();
     31 }
     32 
     33 void SmsObserver::UpdateObservers(NetworkLibrary* library) {
     34   if (!CrosLibrary::Get()->EnsureLoaded())
     35     return;
     36 
     37   const CellularNetworkVector& networks = library->cellular_networks();
     38   // Remove monitors for networks that are not in the list anymore.
     39   for (ObserversMap::iterator it_observer = observers_.begin();
     40        it_observer != observers_.end();) {
     41     bool found = false;
     42     for (CellularNetworkVector::const_iterator it_network = networks.begin();
     43         it_network != networks.end(); ++it_network) {
     44       if (it_observer->first == (*it_network)->device_path()) {
     45         found = true;
     46         break;
     47       }
     48     }
     49     if (!found) {
     50       VLOG(1) << "Remove SMS monitor for " << it_observer->first;
     51       DisconnectSMSMonitor(it_observer->second);
     52       observers_.erase(it_observer++);
     53     } else {
     54       ++it_observer;
     55     }
     56   }
     57 
     58   // Add monitors for new networks.
     59   for (CellularNetworkVector::const_iterator it_network = networks.begin();
     60       it_network != networks.end(); ++it_network) {
     61     ObserversMap::iterator it_observer =
     62         observers_.find((*it_network)->device_path());
     63     if (it_observer == observers_.end()) {
     64       VLOG(1) << "Add SMS monitor for " << (*it_network)->device_path();
     65       observers_.insert(ObserversMap::value_type((*it_network)->device_path(),
     66           MonitorSMS((*it_network)->device_path().c_str(),
     67                      &StaticCallback, this)));
     68     } else {
     69       VLOG(1) << "Already has SMS monitor for " << (*it_network)->device_path();
     70     }
     71   }
     72 }
     73 
     74 void SmsObserver::DisconnectAll() {
     75   if (!CrosLibrary::Get()->EnsureLoaded())
     76     return;
     77 
     78   for (ObserversMap::iterator it = observers_.begin();
     79        it != observers_.end(); ++it) {
     80     VLOG(1) << "Remove SMS monitor for " << it->first;
     81     DisconnectSMSMonitor(it->second);
     82   }
     83   observers_.clear();
     84 }
     85 
     86 void SmsObserver::OnNetworkManagerChanged(NetworkLibrary* library) {
     87   UpdateObservers(library);
     88 }
     89 
     90 // static
     91 void SmsObserver::StaticCallback(void* object,
     92                                  const char* modem_device_path,
     93                                  const SMS* message) {
     94   SmsObserver* monitor = static_cast<SmsObserver*>(object);
     95   monitor->OnNewMessage(modem_device_path, message);
     96 }
     97 
     98 void SmsObserver::OnNewMessage(const char* modem_device_path,
     99                                const SMS* message) {
    100   VLOG(1) << "New message notification from " << message->number
    101           << " text: " << message->text;
    102 
    103   SystemNotification note(
    104       profile_,
    105       "incoming _sms.chromeos",
    106       IDR_NOTIFICATION_SMS,
    107       l10n_util::GetStringFUTF16(
    108           IDS_SMS_NOTIFICATION_TITLE, UTF8ToUTF16(message->number)));
    109 
    110   note.Show(UTF8ToUTF16(message->text), true, false);
    111 }
    112 
    113 }  // namespace chromeos
    114