1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2014 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// 1628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#ifndef SHILL_CELLULAR_MOBILE_OPERATOR_INFO_IMPL_H_ 18c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#define SHILL_CELLULAR_MOBILE_OPERATOR_INFO_IMPL_H_ 1928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <map> 21c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan#include <memory> 2228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include <string> 2328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include <vector> 2428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 25347ff6d2966f089892e1703c7eb5871d224abec5Prathmesh Prabhu#include <base/cancelable_callback.h> 2611c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 2728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include <base/memory/scoped_vector.h> 2828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include <base/memory/weak_ptr.h> 2928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include <base/observer_list.h> 3028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 31c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mobile_operator_info.h" 3228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu#include "shill/event_dispatcher.h" 339151894faea5fa8ccd7d538976390fc95f37d13eSamuel Tan#include "shill/mobile_operator_db/mobile_operator_db.pb.h" 3428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 3528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhunamespace shill { 3628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 3728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhuclass MobileOperatorInfoImpl { 3828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu public: 3928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu typedef 4028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::map<std::string, 41f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart std::vector<const mobile_operator_db::MobileNetworkOperator*>> 4228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu StringToMNOListMap; 4328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 44f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart MobileOperatorInfoImpl(EventDispatcher* dispatcher, 45f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& info_owner); 4628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu ~MobileOperatorInfoImpl(); 4728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 4828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // API functions of the interface. 4928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // See mobile_operator_info_impl.h for details. 5028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void ClearDatabasePaths(); 51f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void AddDatabasePath(const base::FilePath& absolute_path); 5228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool Init(); 53f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void AddObserver(MobileOperatorInfo::Observer* observer); 54f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void RemoveObserver(MobileOperatorInfo::Observer* observer); 5528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool IsMobileNetworkOperatorKnown() const; 5628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool IsMobileVirtualNetworkOperatorKnown() const; 57f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& info_owner() const; 58f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& uuid() const; 59f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& operator_name() const; 60f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& country() const; 61f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& mccmnc() const; 62f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& sid() const; 63f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& nid() const; 64f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::vector<std::string>& mccmnc_list() const; 65f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::vector<std::string>& sid_list() const; 6628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu const std::vector<MobileOperatorInfo::LocalizedName> 6728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu &operator_name_list() const; 68f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ScopedVector<MobileOperatorInfo::MobileAPN>& apn_list() const; 69f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::vector<MobileOperatorInfo::OnlinePortal>& olp_list() const; 70f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& activation_code() const; 7128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool requires_roaming() const; 7228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void Reset(); 73f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateIMSI(const std::string& imsi); 74f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateICCID(const std::string& iccid); 75f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateMCCMNC(const std::string& mccmnc); 76f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateSID(const std::string& sid); 77f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateNID(const std::string& nid); 78f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateOperatorName(const std::string& operator_name); 79f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void UpdateOnlinePortal(const std::string& url, 80f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& method, 81f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& post_data); 8228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 8328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu private: 8428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu friend class MobileOperatorInfoInitTest; 8528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 8628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // /////////////////////////////////////////////////////////////////////////// 8728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Static variables. 8828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Default databases to load. 89f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart static const char* kDefaultDatabasePath; 9028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // MCCMNC can be of length 5 or 6. When using this constant, keep in mind that 918a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko // the length of MCCMNC can by |kMCCMNCMinLen| or |kMCCMNCMinLen + 1|. 9228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu static const int kMCCMNCMinLen; 9328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 9428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // /////////////////////////////////////////////////////////////////////////// 9528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Functions. 9628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void PreprocessDatabase(); 9728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // This function assumes that duplicate |values| are never inserted for the 9828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // same |key|. If you do that, the function is too dumb to deduplicate the 9928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // |value|s, and two copies will get stored. 10028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void InsertIntoStringToMNOListMap( 101f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart StringToMNOListMap* table, 102f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& key, 103f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const mobile_operator_db::MobileNetworkOperator* value); 10428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 10528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool UpdateMNO(); 10628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool UpdateMVNO(); 107f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool FilterMatches(const shill::mobile_operator_db::Filter& filter); 108f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const mobile_operator_db::MobileNetworkOperator* PickOneFromDuplicates( 10953f47a6934f8d9f15195ec399aa6297eb5fe73b2Prathmesh Prabhu const std::vector<const mobile_operator_db::MobileNetworkOperator*> 11053f47a6934f8d9f15195ec399aa6297eb5fe73b2Prathmesh Prabhu &duplicates) const; 11128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Reloads the information about M[V]NO from the database. 11228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void RefreshDBInformation(); 11328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void ClearDBInformation(); 11428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Reload all data from |data|. 11528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Semantics: If a field data.x exists, then it *overwrites* the current 11628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // information gained from data.x. E.g., if |data.name_size() > 0| is true, 11728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // then we replace *all* names. Otherwise, we leave names untouched. 11828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // This allows MVNOs to overwrite information obtained from the corresponding 11928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // MNO. 120f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void ReloadData(const mobile_operator_db::Data& data); 12128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Append candidates recognized by |mccmnc| to the candidate list. 122f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool AppendToCandidatesByMCCMNC(const std::string& mccmnc); 123f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart bool AppendToCandidatesBySID(const std::string& sid); 124c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu std::string OperatorCodeString() const; 12528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 12628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Notifies all observers that the operator has changed. 12728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void PostNotifyOperatorChanged(); 12828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // The actual notification is sent out here. This should not be called 12928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // directly from any function. 13028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void NotifyOperatorChanged(); 13128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 13228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // For a property update that does not result in an M[V]NO update, this 13328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // function determines whether observers should be notified anyway. 13428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool ShouldNotifyPropertyUpdate() const; 13528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 136145a5dade398f9723a42b70d9a78b59b6a8ae32fPrathmesh Prabhu // OperatorName comparisons for determining the MNO are done after normalizing 137145a5dade398f9723a42b70d9a78b59b6a8ae32fPrathmesh Prabhu // the names to ignore case and spaces. 138f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart std::string NormalizeOperatorName(const std::string& name) const; 139145a5dade398f9723a42b70d9a78b59b6a8ae32fPrathmesh Prabhu 14028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // These functions encapsulate the logic to update different properties 14128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // properly whenever an update is either received from the user or the 14228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // database. 14328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void HandleMCCMNCUpdate(); 14428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void HandleOperatorNameUpdate(); 14528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void HandleSIDUpdate(); 14628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu void HandleOnlinePortalUpdate(); 14728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 14828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Accessor functions for testing purpose only. 149f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart mobile_operator_db::MobileOperatorDB* database() { 15028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu return database_.get(); 15128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu } 15228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 15328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // /////////////////////////////////////////////////////////////////////////// 15428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Data. 15528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Not owned by MobileOperatorInfoImpl. 156f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart EventDispatcher* const dispatcher_; 15728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 15870190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou const std::string info_owner_; 15970190b3ae0b63aa49e9548a71af2fc1ac80c0ea5Miao-chen Chou 16028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Owned by MobileOperatorInfoImpl, may be created externally. 16128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::vector<base::FilePath> database_paths_; 16228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 16328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Owned and modified only by MobileOperatorInfoImpl. 16428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // The observers added to this list are not owned by this object. Moreover, 16528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // the observer is likely to outlive this object. We do enforce removal of all 16628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // observers before this object is destroyed. 167ccab3f9f460312262f6153db8246b100d1362ba8Alex Vakulenko base::ObserverList<MobileOperatorInfo::Observer> observers_; 168347ff6d2966f089892e1703c7eb5871d224abec5Prathmesh Prabhu base::CancelableClosure notify_operator_changed_task_; 16928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 170c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<mobile_operator_db::MobileOperatorDB> database_; 17128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu StringToMNOListMap mccmnc_to_mnos_; 172c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu StringToMNOListMap sid_to_mnos_; 17328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu StringToMNOListMap name_to_mnos_; 174c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu 175c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu // |candidates_by_operator_code| can be determined either using MCCMNC or 176c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu // using SID. At any one time, we only expect one of these operator codes to 177c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu // be updated by the user. We use |operator_code_type_| to keep track of which 178c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu // update we have received and warn the user if we receive both. 179c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu enum OperatorCodeType { 180c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu kOperatorCodeTypeUnknown = 0, 181c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu kOperatorCodeTypeMCCMNC, 182c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu kOperatorCodeTypeSID, 183c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu }; 184c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu OperatorCodeType operator_code_type_; 185f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart std::vector<const mobile_operator_db::MobileNetworkOperator*> 186c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu candidates_by_operator_code_; 187c1175bf44a88d14b68ebacbf0137eda6ef0e1f04Prathmesh Prabhu 188f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart std::vector<const mobile_operator_db::MobileNetworkOperator*> 18928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu candidates_by_name_; 190f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const mobile_operator_db::MobileNetworkOperator* current_mno_; 191f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const mobile_operator_db::MobileVirtualNetworkOperator* current_mvno_; 19228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 19328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // These fields are the information expected to be populated by this object 19428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // after successfully determining the MVNO. 19528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string uuid_; 19628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string operator_name_; 19728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string country_; 19828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string mccmnc_; 19928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string sid_; 20028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string nid_; 20128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::vector<std::string> mccmnc_list_; 20228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::vector<std::string> sid_list_; 20328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::vector<MobileOperatorInfo::LocalizedName> operator_name_list_; 20428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu ScopedVector<MobileOperatorInfo::MobileAPN> apn_list_; 20528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::vector<MobileOperatorInfo::OnlinePortal> olp_list_; 2060db0bf0d9de3b3d0c231ceb0b559c925c637199cPrathmesh Prabhu std::vector<mobile_operator_db::OnlinePortal> raw_olp_list_; 20728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string activation_code_; 20828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool requires_roaming_; 20928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // These fields store the data obtained from the Update* methods. 21028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // The database information is kept separate from the information gathered 21128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // through the Update* methods, because one or the other may be given 21228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // precedence in different situations. 21328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // Note: For simplicity, we do not allow the user to enforce an empty value 21428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // for these variables. So, if |user_mccmnc_| == "", the |mccmnc_| obtained 21528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // from the database will be used, even if |user_mccmnc_| was explicitly set 21628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // by the user. 21728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_imsi_; 21828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_iccid_; 21928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_mccmnc_; 22028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_sid_; 22128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_nid_; 22228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu std::string user_operator_name_; 22328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu bool user_olp_empty_; 22428b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu MobileOperatorInfo::OnlinePortal user_olp_; 22528b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 22628b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu // This must be the last data member of this class. 22728b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu base::WeakPtrFactory<MobileOperatorInfoImpl> weak_ptr_factory_; 22828b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 22928b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfoImpl); 23028b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu}; 23128b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 23228b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu} // namespace shill 23328b4a3b38737f29b98e0e19aefd92b2454165040Prathmesh Prabhu 234c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#endif // SHILL_CELLULAR_MOBILE_OPERATOR_INFO_IMPL_H_ 235