1//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef SHILL_CELLULAR_MOBILE_OPERATOR_INFO_H_
18#define SHILL_CELLULAR_MOBILE_OPERATOR_INFO_H_
19
20#include <memory>
21#include <string>
22#include <vector>
23
24#include <base/files/file_util.h>
25#include <base/memory/scoped_vector.h>
26
27namespace shill {
28
29class EventDispatcher;
30class MobileOperatorInfoImpl;
31
32// An MobileOperatorInfo object encapsulates the knowledge pertaining to all
33// mobile operators. Typical usage consists of three steps:
34//   - Initialize the object, set database file paths for the operator
35//   information.
36//   - Add observers to be notified whenever an M[V]NO has been determined / any
37//   information about the M[V]NO changes.
38//   - Send operator information updates to the object.
39//
40// So a class Foo that wants to use this object typically looks like:
41//
42// class Foo {
43//   class OperatorObserver : public MobileOperatorInfoObserver {
44//     // Implement all Observer functions.
45//   }
46//   ...
47//
48//   MobileOperatorInfo operator_info;
49//   // Optional: Set a non-default database file.
50//   operator_info.ClearDatabasePaths();
51//   operator_info.AddDatabasePath(some_path);
52//
53//   operator_info.Init();  // Required.
54//
55//   OperatorObserver my_observer;
56//   operator_info.AddObserver(my_observer);
57//   ...
58//   operator_info.UpdateIMSI(some_imsi);
59//   operator_info.UpdateName(some_name);
60//   ...
61//   // Whenever enough information is available, |operator_info| notifies us
62//   through |my_observer|.
63// };
64//
65class MobileOperatorInfo {
66 public:
67  class Observer {
68   public:
69    virtual ~Observer() {}
70
71    // This event fires when
72    //   - A mobile [virtual] network operator
73    //     - is first determined.
74    //     - changes.
75    //     - becomes invalid.
76    //   - Some information about the known operator changes.
77    virtual void OnOperatorChanged() = 0;
78  };
79
80  // |Init| must be called on the constructed object before it is used.
81  // This object does not take ownership of dispatcher, and |dispatcher| is
82  // expected to outlive this object.
83  MobileOperatorInfo(EventDispatcher* dispatcher,
84                     const std::string& info_owner);
85  virtual ~MobileOperatorInfo();
86
87  // These functions can be called before Init to read non default database
88  // file(s).
89  void ClearDatabasePaths();
90  void AddDatabasePath(const base::FilePath& absolute_path);
91
92  std::string GetLogPrefix(const char* func) const;
93  bool Init();
94
95  // Add/remove observers to subscribe to notifications.
96  void AddObserver(MobileOperatorInfo::Observer* observer);
97  void RemoveObserver(MobileOperatorInfo::Observer* observer);
98
99  // ///////////////////////////////////////////////////////////////////////////
100  // Objects that encapsulate related information about the mobile operator.
101
102  // Encapsulates a name and the language that name has been localized to.
103  // The name can be a carrier name, or the name that a cellular carrier
104  // prefers to show for a certain access point.
105  struct LocalizedName {
106    // The name as it appears in the corresponding language.
107    std::string name;
108    // The language of this localized name. The format of a language is a two
109    // letter language code, e.g. 'en' for English.
110    // It is legal for an instance of LocalizedName to have an empty |language|
111    // field, as sometimes the underlying database does not contain that
112    // information.
113    std::string language;
114  };
115
116  // Encapsulates information on a mobile access point name. This information
117  // is usually necessary for 3GPP networks to be able to connect to a mobile
118  // network. So far, CDMA networks don't use this information.
119  struct MobileAPN {
120    // The access point url, which is fed to the modemmanager while connecting.
121    std::string apn;
122    // A list of localized names for this access point. Usually there is only
123    // one for each country that the associated cellular carrier operates in.
124    std::vector<LocalizedName> operator_name_list;
125    // The username and password fields that are required by the modemmanager.
126    // Either of these values can be empty if none is present. If a MobileAPN
127    // instance that is obtained from this parser contains a non-empty value
128    // for username/password, this usually means that the carrier requires
129    // a certain default pair.
130    std::string username;
131    std::string password;
132  };
133
134  // Encapsulates information about the Online payment portal used by chrome to
135  // redirect users for some carriers.
136  struct OnlinePortal {
137    std::string url;
138    std::string method;
139    std::string post_data;
140  };
141
142  // ///////////////////////////////////////////////////////////////////////////
143  // Functions to obtain information about the current mobile operator.
144  // Any of these accessors can return an emtpy response if the information is
145  // not available. Use |IsMobileNetworkOperatorKnown| and
146  // |IsMobileVirtualNetworkOperatorKnown| to determine if a fix on the operator
147  // has been made. Note that the information returned by the other accessors is
148  // only valid when at least |IsMobileNetworkOperatorKnown| returns true. Their
149  // values are undefined otherwise.
150
151  // Query whether a mobile network operator has been successfully determined.
152  virtual bool IsMobileNetworkOperatorKnown() const;
153  // Query whether a mobile network operator has been successfully
154  // determined.
155  bool IsMobileVirtualNetworkOperatorKnown() const;
156
157
158  // The unique identifier of this carrier. This is primarily used to
159  // identify the user profile in store for each carrier. This identifier is
160  // access technology agnostic and should be the same across 3GPP and CDMA.
161  virtual const std::string& uuid() const;
162
163  virtual const std::string& operator_name() const;
164  virtual const std::string& country() const;
165  virtual const std::string& mccmnc() const;
166  const std::string& sid() const;
167  const std::string& nid() const;
168
169  // A given MVNO can be associated with multiple mcc/mnc pairs. A list of all
170  // associated mcc/mnc pairs concatenated together.
171  const std::vector<std::string>& mccmnc_list() const;
172  // A given MVNO can be associated with multiple sid(s). A list of all
173  // associated sid(s).
174  // There are likely many SID values associated with a CDMA carrier as they
175  // vary across regions and are more fine grained than countries. An important
176  // thing to keep in mind is that, since an SID contains fine grained
177  // information on where a modem is physically located, it should be regarded
178  // as user-sensitive information.
179  const std::vector<std::string>& sid_list() const;
180  // All localized names associated with this carrier entry.
181  const std::vector<LocalizedName>& operator_name_list() const;
182  // All access point names associated with this carrier entry.
183  const ScopedVector<MobileAPN>& apn_list() const;
184  // All Online Payment Portal URLs associated with this carrier entry. There
185  // are usually multiple OLPs based on access technology and it is up to the
186  // application to use the appropriate one.
187  virtual const std::vector<OnlinePortal>& olp_list() const;
188
189  // The number to dial for automatic activation.
190  virtual const std::string& activation_code() const;
191  // Some carriers are only available while roaming. This is mainly used by
192  // Chrome.
193  bool requires_roaming() const;
194
195  // ///////////////////////////////////////////////////////////////////////////
196  // Functions used to notify this object of operator data changes.
197  // The Update* methods update the corresponding property of the network
198  // operator, and this value may be used to determine the M[V]NO.
199  // These values are also the values reported through accessors, overriding any
200  // information from the database.
201
202  // Throw away all information provided to the object, and start from top.
203  void Reset();
204
205  // Both MCCMNC and SID correspond to operator code in the different
206  // technologies. They are never to be used together. If you want to use SID
207  // after MCCMNC (or vice-versa), ensure a call to |Reset| to clear state.
208  virtual void UpdateMCCMNC(const std::string& mccmnc);
209  virtual void UpdateSID(const std::string& sid);
210
211  virtual void UpdateIMSI(const std::string& imsi);
212  void UpdateICCID(const std::string& iccid);
213  virtual void UpdateNID(const std::string& nid);
214  virtual void UpdateOperatorName(const std::string& operator_name);
215  void UpdateOnlinePortal(const std::string& url,
216                          const std::string& method,
217                          const std::string& post_data);
218
219  // ///////////////////////////////////////////////////////////////////////////
220  // Expose implementation for test purposes only.
221  MobileOperatorInfoImpl* impl() { return impl_.get(); }
222
223 private:
224  std::unique_ptr<MobileOperatorInfoImpl> impl_;
225  DISALLOW_COPY_AND_ASSIGN(MobileOperatorInfo);
226};
227
228}  // namespace shill
229
230#endif  // SHILL_CELLULAR_MOBILE_OPERATOR_INFO_H_
231