Home | History | Annotate | Download | only in cellular
      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 
     27 namespace shill {
     28 
     29 class EventDispatcher;
     30 class 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 //
     65 class 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