1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 163bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_service.h" 183bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 193bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone#include <string> 203bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 22289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 253bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone#include <chromeos/dbus/service_constants.h> 26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 273bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 28b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/adaptor_interfaces.h" 29c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular.h" 3030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood#include "shill/property_accessor.h" 3130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood#include "shill/store_interface.h" 323bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 333bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masoneusing std::string; 343bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 353bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masonenamespace shill { 36c5f56564e1594f218c44e9b77c4c6645cd9239e8Darin Petkov 37c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silbersteinnamespace Logging { 38c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silbersteinstatic auto kModuleLogScope = ScopeLogger::kCellular; 39f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstatic string ObjectID(CellularService* c) { return c->GetRpcIdentifier(); } 40c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein} 41c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein 42a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal// statics 431582bddf620625f9e6f6c407a707d6a916387df1Christopher Wileyconst char CellularService::kAutoConnActivating[] = "activating"; 44d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawalconst char CellularService::kAutoConnBadPPPCredentials[] = 45d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal "bad PPP credentials"; 4619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chanconst char CellularService::kAutoConnDeviceDisabled[] = "device disabled"; 47398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Leconst char CellularService::kAutoConnOutOfCredits[] = "device out of credits"; 48398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Leconst char CellularService::kAutoConnOutOfCreditsDetectionInProgress[] = 49398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "device detecting out-of-credits"; 50a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalconst char CellularService::kStoragePPPUsername[] = "Cellular.PPP.Username"; 51a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalconst char CellularService::kStoragePPPPassword[] = "Cellular.PPP.Password"; 5230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 53381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov// TODO(petkov): Add these to system_api/dbus/service_constants.h 54381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkovnamespace { 553ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kCellularPPPUsernameProperty[] = "Cellular.PPP.Username"; 563ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kCellularPPPPasswordProperty[] = "Cellular.PPP.Password"; 573ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal} // namespace 583ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal 593ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalnamespace { 603ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kStorageAPN[] = "Cellular.APN"; 613ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawalconst char kStorageLastGoodAPN[] = "Cellular.LastGoodAPN"; 6219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan} // namespace 63381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 64f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstatic bool GetNonEmptyField(const Stringmap& stringmap, 65f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& fieldname, 66f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart string* value) { 6730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood Stringmap::const_iterator it = stringmap.find(fieldname); 6830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (it != stringmap.end() && !it->second.empty()) { 6930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood *value = it->second; 7030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return true; 7130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood } 7230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return false; 7330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 7430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 75f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartCellularService::CellularService(ModemInfo* modem_info, 76f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const CellularRefPtr& device) 770d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu : Service(modem_info->control_interface(), modem_info->dispatcher(), 780d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info->metrics(), modem_info->manager(), 793426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le Technology::kCellular), 80398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le weak_ptr_factory_(this), 8171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le activation_type_(kActivationTypeUnknown), 827cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le cellular_(device), 83a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan is_auto_connecting_(false) { 84cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal SetConnectable(true); 85f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart PropertyStore* store = this->mutable_store(); 8671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le HelpRegisterDerivedString(kActivationTypeProperty, 8771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le &CellularService::CalculateActivationType, 88ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan nullptr); 897ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan store->RegisterConstString(kActivationStateProperty, &activation_state_); 907ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan HelpRegisterDerivedStringmap(kCellularApnProperty, 9130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood &CellularService::GetApn, 9230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood &CellularService::SetApn); 937ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan store->RegisterConstStringmap(kCellularLastGoodApnProperty, 9427c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone &last_good_apn_info_); 957ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan store->RegisterConstString(kNetworkTechnologyProperty, &network_technology_); 9643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le HelpRegisterDerivedBool(kOutOfCreditsProperty, 9743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le &CellularService::IsOutOfCredits, 98ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan nullptr); 9992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu store->RegisterConstStringmap(kPaymentPortalProperty, &olp_); 1007ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan store->RegisterConstString(kRoamingStateProperty, &roaming_state_); 101ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius store->RegisterConstStringmap(kServingOperatorProperty, &serving_operator_); 1027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan store->RegisterConstString(kUsageURLProperty, &usage_url_); 1033ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal store->RegisterString(kCellularPPPUsernameProperty, &ppp_username_); 1043ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal store->RegisterWriteOnlyString(kCellularPPPPasswordProperty, &ppp_password_); 105ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov 10695afcbb30725d13e05934f9489a3a3187f2287cePrathmesh Prabhu set_friendly_name(cellular_->CreateDefaultFriendlyServiceName()); 1077ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan SetStorageIdentifier(string(kTypeCellular) + "_" + 108401a5b930545f17b8f6a7cc5851896bdbf1beb45Prathmesh Prabhu cellular_->address() + "_" + friendly_name()); 10943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le // Assume we are not performing any out-of-credits detection. 11043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le // The capability can reinitialize with the appropriate type later. 11143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le InitOutOfCreditsDetection(OutOfCreditsDetector::OOCTypeNone); 1123bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone} 1133bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 1143bd3c8c33917221d1074f1aa19272e45c0ce2793Chris MasoneCellularService::~CellularService() { } 1153bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 116f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::IsAutoConnectable(const char** reason) const { 11719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan if (!cellular_->running()) { 11819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan *reason = kAutoConnDeviceDisabled; 11919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan return false; 12019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan } 1211582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley if (cellular_->IsActivating()) { 1221582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley *reason = kAutoConnActivating; 1231582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley return false; 1241582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley } 125d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal if (failure() == kFailurePPPAuth) { 126d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal *reason = kAutoConnBadPPPCredentials; 127d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal return false; 128d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal } 12943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le if (out_of_credits_detector_->IsDetecting()) { 130398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le *reason = kAutoConnOutOfCreditsDetectionInProgress; 131398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le return false; 132398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le } 13343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le if (out_of_credits_detector_->out_of_credits()) { 134398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le *reason = kAutoConnOutOfCredits; 135398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le return false; 136398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le } 13719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan return Service::IsAutoConnectable(reason); 13819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan} 13919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 14071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Levoid CellularService::HelpRegisterDerivedString( 141f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& name, 142f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart string(CellularService::*get)(Error* error), 143f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool(CellularService::*set)(const string& value, Error* error)) { 14471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le mutable_store()->RegisterDerivedString( 14571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le name, 14671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le StringAccessor( 14771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le new CustomAccessor<CellularService, string>(this, get, set))); 14871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le} 14971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le 15030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbroodvoid CellularService::HelpRegisterDerivedStringmap( 151f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& name, 152f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Stringmap(CellularService::*get)(Error* error), 153bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool(CellularService::*set)( 154f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Stringmap& value, Error* error)) { 15530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood mutable_store()->RegisterDerivedStringmap( 15630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood name, 15730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood StringmapAccessor( 15830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood new CustomAccessor<CellularService, Stringmap>(this, get, set))); 15930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 16030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 16143ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::HelpRegisterDerivedBool( 162f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& name, 163f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool(CellularService::*get)(Error* error), 164f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool(CellularService::*set)(const bool&, Error*)) { 16543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le mutable_store()->RegisterDerivedBool( 16643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le name, 16743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le BoolAccessor(new CustomAccessor<CellularService, bool>(this, get, set))); 16843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le} 16943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 170f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap* CellularService::GetUserSpecifiedApn() { 1717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan Stringmap::iterator it = apn_info_.find(kApnProperty); 17230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (it == apn_info_.end() || it->second.empty()) 173ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan return nullptr; 17430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return &apn_info_; 17530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 17630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 177f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap* CellularService::GetLastGoodApn() { 1786db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart Stringmap::iterator it = last_good_apn_info_.find(kApnProperty); 17930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (it == last_good_apn_info_.end() || it->second.empty()) 180ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan return nullptr; 18130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return &last_good_apn_info_; 18230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 18330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 184f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstring CellularService::CalculateActivationType(Error* error) { 18571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return GetActivationTypeString(); 18671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le} 18771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le 188f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul StewartStringmap CellularService::GetApn(Error* /*error*/) { 18930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return apn_info_; 19030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 19130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 192f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::SetApn(const Stringmap& value, Error* error) { 19330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood // Only copy in the fields we care about, and validate the contents. 194c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // If the "apn" field is missing or empty, the APN is cleared. 19530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood string str; 196bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Stringmap new_apn_info; 1977ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan if (GetNonEmptyField(value, kApnProperty, &str)) { 1987ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan new_apn_info[kApnProperty] = str; 1997ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan if (GetNonEmptyField(value, kApnUsernameProperty, &str)) 2007ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan new_apn_info[kApnUsernameProperty] = str; 2017ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan if (GetNonEmptyField(value, kApnPasswordProperty, &str)) 2027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan new_apn_info[kApnPasswordProperty] = str; 203bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 204bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal if (apn_info_ == new_apn_info) { 205bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return false; 206bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 207bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal apn_info_ = new_apn_info; 2087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan if (ContainsKey(apn_info_, kApnProperty)) { 209c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // Clear the last good APN, otherwise the one the user just 210c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // set won't be used, since LastGoodApn comes first in the 211c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // search order when trying to connect. Only do this if a 212c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // non-empty user APN has been supplied. If the user APN is 213c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // being cleared, leave LastGoodApn alone. 214c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ClearLastGoodApn(); 21530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood } 2167ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringmapChanged(kCellularApnProperty, apn_info_); 217bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return true; 21830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 21930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 220f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetLastGoodApn(const Stringmap& apn_info) { 22130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood last_good_apn_info_ = apn_info; 2227ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringmapChanged(kCellularLastGoodApnProperty, 22330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood last_good_apn_info_); 22430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 22530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 22630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbroodvoid CellularService::ClearLastGoodApn() { 22730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood last_good_apn_info_.clear(); 2287ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringmapChanged(kCellularLastGoodApnProperty, 22930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood last_good_apn_info_); 23030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 23130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 23299dc56dd45ec8429c3de57365658540820ceb000Thieu Levoid CellularService::OnAfterResume() { 23399dc56dd45ec8429c3de57365658540820ceb000Thieu Le Service::OnAfterResume(); 23499dc56dd45ec8429c3de57365658540820ceb000Thieu Le resume_start_time_ = base::Time::Now(); 23599dc56dd45ec8429c3de57365658540820ceb000Thieu Le} 23699dc56dd45ec8429c3de57365658540820ceb000Thieu Le 23743ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::InitOutOfCreditsDetection( 23843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le OutOfCreditsDetector::OOCType ooc_type) { 23943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_.reset( 24043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le OutOfCreditsDetector::CreateDetector(ooc_type, 24143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le dispatcher(), 24243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le manager(), 24343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le metrics(), 24443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le this)); 24543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le} 24643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 247f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::Load(StoreInterface* storage) { 24830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood // Load properties common to all Services. 24930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (!Service::Load(storage)) 25030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return false; 25130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 25230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood const string id = GetStorageIdentifier(); 25330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood LoadApn(storage, id, kStorageAPN, &apn_info_); 25430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood LoadApn(storage, id, kStorageLastGoodAPN, &last_good_apn_info_); 255a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal 256a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string old_username = ppp_username_; 257a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string old_password = ppp_password_; 2583ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal storage->GetString(id, kStoragePPPUsername, &ppp_username_); 2593ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal storage->GetString(id, kStoragePPPPassword, &ppp_password_); 260a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (IsFailed() && failure() == kFailurePPPAuth && 261a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal (old_username != ppp_username_ || old_password != ppp_password_)) { 262a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal SetState(kStateIdle); 263a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 26430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return true; 26530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 26630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 267f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::LoadApn(StoreInterface* storage, 268f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& storage_group, 269f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& keytag, 270f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Stringmap* apn_info) { 2717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan if (!LoadApnField(storage, storage_group, keytag, kApnProperty, apn_info)) 27230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return; 2737ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan LoadApnField(storage, storage_group, keytag, kApnUsernameProperty, apn_info); 2747ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan LoadApnField(storage, storage_group, keytag, kApnPasswordProperty, apn_info); 27530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 27630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 277f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::LoadApnField(StoreInterface* storage, 278f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& storage_group, 279f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& keytag, 280f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& apntag, 281f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Stringmap* apn_info) { 28230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood string value; 28330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (storage->GetString(storage_group, keytag + "." + apntag, &value) && 28430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood !value.empty()) { 28530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood (*apn_info)[apntag] = value; 28630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return true; 28730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood } 28830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return false; 28930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 29030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 291f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::Save(StoreInterface* storage) { 29230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood // Save properties common to all Services. 29330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (!Service::Save(storage)) 29430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return false; 29530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 29630bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood const string id = GetStorageIdentifier(); 29730bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood SaveApn(storage, id, GetUserSpecifiedApn(), kStorageAPN); 29830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood SaveApn(storage, id, GetLastGoodApn(), kStorageLastGoodAPN); 2993ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal SaveString(storage, id, kStoragePPPUsername, ppp_username_, false, true); 3003ffe52c6eb79db079a8b5685d2c8bd96f6b49b79mukesh agrawal SaveString(storage, id, kStoragePPPPassword, ppp_password_, false, true); 30130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood return true; 30230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 30330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 304f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SaveApn(StoreInterface* storage, 305f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& storage_group, 306f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Stringmap* apn_info, 307f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& keytag) { 3087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan SaveApnField(storage, storage_group, apn_info, keytag, kApnProperty); 3097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan SaveApnField(storage, storage_group, apn_info, keytag, kApnUsernameProperty); 3107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan SaveApnField(storage, storage_group, apn_info, keytag, kApnPasswordProperty); 31130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 31230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 313f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SaveApnField(StoreInterface* storage, 314f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& storage_group, 315f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Stringmap* apn_info, 316f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& keytag, 317f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& apntag) { 31830bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood const string key = keytag + "." + apntag; 31930bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood string str; 32030bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood if (apn_info && GetNonEmptyField(*apn_info, apntag, &str)) 32130bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood storage->SetString(storage_group, key, str); 32230bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood else 32330bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood storage->DeleteKey(storage_group, key); 32430bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood} 32530bc0ecfcdad79f652eab10c7cda9adca33a04faEric Shienbrood 326f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartbool CellularService::IsOutOfCredits(Error* /*error*/) { 32743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le return out_of_credits_detector_->out_of_credits(); 32843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le} 32943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 33043ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::set_out_of_credits_detector( 331f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart OutOfCreditsDetector* detector) { 33243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_.reset(detector); 33343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le} 33443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 33543ce4d428d619bda64eea6d37534f02c179a1756Thieu Levoid CellularService::SignalOutOfCreditsChanged(bool state) const { 33643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le adaptor()->EmitBoolChanged(kOutOfCreditsProperty, state); 33743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le} 33843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 3397cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Levoid CellularService::AutoConnect() { 3407cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le is_auto_connecting_ = true; 3417cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le Service::AutoConnect(); 3427cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le is_auto_connecting_ = false; 3437cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le} 3447cf36b0cbc1e382fb714cf412d100c9f7ad86c09Thieu Le 345f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::Connect(Error* error, const char* reason) { 346dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal Service::Connect(error, reason); 3474d6d941563c2c394e5e650d7ee2d24183fff87b3Darin Petkov cellular_->Connect(error); 348398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le if (error->IsFailure()) 34943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_->ResetDetector(); 350c5f56564e1594f218c44e9b77c4c6645cd9239e8Darin Petkov} 3513bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone 352f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::Disconnect(Error* error, const char* reason) { 3530d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan Service::Disconnect(error, reason); 3540d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan cellular_->Disconnect(error, reason); 355fb0625ef0cfd0ad36439138c04fec5ea963132d7Darin Petkov} 356fb0625ef0cfd0ad36439138c04fec5ea963132d7Darin Petkov 357f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::ActivateCellularModem(const string& carrier, 358f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 359f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback) { 3609a24553461df7036755060423f90804011612249Eric Shienbrood cellular_->Activate(carrier, error, callback); 361c408e69059dc709408c1a51f4b757424d08b15f5Darin Petkov} 362c408e69059dc709408c1a51f4b757424d08b15f5Darin Petkov 363f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::CompleteCellularActivation(Error* error) { 364c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray cellular_->CompleteActivation(error); 365c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray} 366c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray 367398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Levoid CellularService::SetState(ConnectState new_state) { 36843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_->NotifyServiceStateChanged(state(), new_state); 369398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le Service::SetState(new_state); 370398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le} 371398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 372f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetStorageIdentifier(const string& identifier) { 373c9c31d8497c3f053c2160408cc386010fc125fadRebecca Silberstein SLOG(this, 3) << __func__ << ": " << identifier; 374313324136473f9120b1e485a408f51ae938dcb64Darin Petkov storage_identifier_ = identifier; 375313324136473f9120b1e485a408f51ae938dcb64Darin Petkov std::replace_if(storage_identifier_.begin(), 376313324136473f9120b1e485a408f51ae938dcb64Darin Petkov storage_identifier_.end(), 377313324136473f9120b1e485a408f51ae938dcb64Darin Petkov &Service::IllegalChar, '_'); 378313324136473f9120b1e485a408f51ae938dcb64Darin Petkov} 379313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 3806515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masonestring CellularService::GetStorageIdentifier() const { 381313324136473f9120b1e485a408f51ae938dcb64Darin Petkov return storage_identifier_; 38234af218abe6a99144ffe01332ce36fbad94f2628Chris Masone} 38334af218abe6a99144ffe01332ce36fbad94f2628Chris Masone 384f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartstring CellularService::GetDeviceRpcId(Error* /*error*/) const { 38595207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone return cellular_->GetRpcIdentifier(); 38695207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone} 38795207da4b896bd0a4186163f6f9ebda044a5a7b9Chris Masone 38871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Levoid CellularService::SetActivationType(ActivationType type) { 38971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le if (type == activation_type_) { 39071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return; 39171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le } 39271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le activation_type_ = type; 39371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le adaptor()->EmitStringChanged(kActivationTypeProperty, 39471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le GetActivationTypeString()); 39571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le} 39671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le 39771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Lestring CellularService::GetActivationTypeString() const { 39871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le switch (activation_type_) { 39971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le case kActivationTypeNonCellular: 40071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return shill::kActivationTypeNonCellular; 40171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le case kActivationTypeOMADM: 40271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return shill::kActivationTypeOMADM; 40371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le case kActivationTypeOTA: 40471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return shill::kActivationTypeOTA; 40571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le case kActivationTypeOTASP: 40671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return shill::kActivationTypeOTASP; 40771f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le case kActivationTypeUnknown: 40871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return ""; 40971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le default: 41071f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le NOTREACHED(); 41171f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le return ""; // Make compiler happy. 41271f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le } 41371f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le} 41471f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le 415f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetActivationState(const string& state) { 416b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov if (state == activation_state_) { 417b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov return; 418b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov } 419b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov activation_state_ = state; 4207ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringChanged(kActivationStateProperty, state); 4217ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan SetConnectableFull(state != kActivationStateNotActivated); 422b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov} 423b9c9933d529e34ce784d4f322d9596cbd9e6ba1cDarin Petkov 424f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetOLP(const string& url, 425f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& method, 426f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const string& post_data) { 42792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu Stringmap olp; 42892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp[kPaymentPortalURL] = url; 42992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp[kPaymentPortalMethod] = method; 43092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp[kPaymentPortalPostData] = post_data; 43192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 43292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu if (olp_ == olp) { 433381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov return; 434381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov } 43592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp_ = olp; 43692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu adaptor()->EmitStringmapChanged(kPaymentPortalProperty, olp); 437381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 438381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 439f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetUsageURL(const string& url) { 440381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov if (url == usage_url_) { 441381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov return; 442381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov } 443381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov usage_url_ = url; 4447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringChanged(kUsageURLProperty, url); 445381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 446381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 447f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetNetworkTechnology(const string& technology) { 448b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov if (technology == network_technology_) { 449b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov return; 450b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 451b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov network_technology_ = technology; 4527ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringChanged(kNetworkTechnologyProperty, 453b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov technology); 454b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 455b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 456f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::SetRoamingState(const string& state) { 457b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov if (state == roaming_state_) { 458b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov return; 459b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 460b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov roaming_state_ = state; 4617ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan adaptor()->EmitStringChanged(kRoamingStateProperty, state); 462b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 463b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 464f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewartvoid CellularService::set_serving_operator(const Stringmap& serving_operator) { 465ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius if (serving_operator_ == serving_operator) 4669cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov return; 467ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius 468ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius serving_operator_ = serving_operator; 469ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius adaptor()->EmitStringmapChanged(kServingOperatorProperty, serving_operator_); 4703335b3773067671301a8a02a1f9eefd17a3ce607Darin Petkov} 4713335b3773067671301a8a02a1f9eefd17a3ce607Darin Petkov 4723bd3c8c33917221d1074f1aa19272e45c0ce2793Chris Masone} // namespace shill 473