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