blob: e737a2ca12add1d208acb41f35e070d0b73220f1 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Defines shill::CellularOperatorInfo, which is meant to replace the
// mobile-broadband-provider-info library by providing the same mechanisms in
// C++. It also extends the information provided by
// mobile-broadband-provider-info.
#ifndef SHILL_CELLULAR_OPERATOR_INFO_H_
#define SHILL_CELLULAR_OPERATOR_INFO_H_
#include <map>
#include <string>
#include <vector>
#include <base/basictypes.h>
#include <base/file_path.h>
#include <base/memory/scoped_ptr.h>
#include <base/memory/scoped_vector.h>
#include <gtest/gtest_prod.h> // for FRIEND_TEST
#include "shill/cellular_service.h"
#include "shill/file_reader.h"
namespace shill {
class CellularOperatorInfoImpl;
// CellularOperatorInfo, which is a utility class for parsing
// cellular carrier specific infomation from a specially formatted file that
// encodes carrier related data in a key-value format.
class CellularOperatorInfo {
public:
// Encapsulates a name and the language that name has been localized to.
// The name can be a carrier name, or the name that a cellular carrier
// prefers to show for a certain access point.
struct LocalizedName {
LocalizedName();
LocalizedName(std::string name, std::string language);
// The name as it appears in the corresponding language.
std::string name;
// The language of this localized name. The format of a language is a two
// letter language code, e.g. 'en' for English.
// It is legal for an instance of LocalizedName to have an empty |language|
// field, as sometimes the underlying database does not contain that
// information.
std::string language;
};
// Encapsulates information on a mobile access point name. This information
// is usually necessary for 3GPP networks to be able to connect to a mobile
// network. So far, CDMA networks don't use this information.
struct MobileAPN {
// The access point url, which is fed to the modemmanager while connecting.
std::string apn;
// A list of localized names for this access point. Usually there is only
// one for each country that the associated cellular carrier operates in.
std::vector<LocalizedName> name_list;
// The username and password fields that are required by the modemmanager.
// Either of these values can be empty if none is present. If a MobileAPN
// instance that is obtained from this parser contains a non-empty value
// for username/password, this usually means that the carrier requires
// a certain default pair.
std::string username;
std::string password;
};
// This class contains all the necessary information for shill to register
// with and establish a connection to a mobile network.
class CellularOperator {
public:
CellularOperator();
// For this instance, returns the primary country code that this operator
// serves. The underlying database sometimes contains multiple entries for
// the same carrier for different countries.
const std::string &country() const { return country_; }
// The unique identifier of this carrier. This is primarily used to
// identify the user profile in store for each carrier. This identifier is
// access technology agnostic and should be the same across 3GPP and CDMA.
const std::string &identifier() const { return identifier_; }
// The number to dial for automatic activation.
const std::string &activation_code() const { return activation_code_; }
// MCCMNC or (MCC/MNC tuple) is the combination of a "Mobile Country Code"
// and "Mobile Network Code" and is used to uniquely identify a carrier.
// ModemManager currently return MCCMNC as the primary operator code for
// 3GPP networks. A carrier can be associated with multiple MCCMNC values
// based on location and technology (e.g. 3G, LTE).
const std::vector<std::string> &mccmnc_list() const {
return mccmnc_list_;
}
// The SID is the primary operator code currently used by ModemManager to
// identify CDMA networks. There are likely many SID values associated with
// a CDMA carrier as they vary across regions and are more fine grained
// than countries. An important thing to keep in mind is that, since an SID
// contains fine grained information on where a modem is physically
// located, it should be regarded as user-sensitive information.
const std::vector<std::string> &sid_list() const { return sid_list_; }
// All localized names associated with this carrier entry.
const std::vector<LocalizedName> &name_list() const { return name_list_; }
// All access point names associated with this carrier entry.
const ScopedVector<MobileAPN> &apn_list() const { return apn_list_; }
// All Online Payment Portal URLs associated with this carrier entry. There
// are usually multiple OLPs based on access technology and it is up to the
// application to use the appropriate one.
const ScopedVector<CellularService::OLP> &olp_list() const {
return olp_list_;
}
// This flag is declared for certain carriers in the underlying database.
// Shill currently does not use it.
bool is_primary() const { return is_primary_; }
// Some carriers are only available while roaming. This is mainly used by
// Chrome.
bool requires_roaming() const { return requires_roaming_; }
private:
friend class CellularOperatorInfo;
friend class CellularOperatorInfoImpl;
friend class CellularCapabilityUniversalCDMATest;
FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier);
FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest,
CreateFriendlyServiceName);
FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest,
OnCDMARegistrationChanged);
FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateOperatorInfo);
std::string country_;
std::string identifier_;
std::string activation_code_;
std::vector<std::string> mccmnc_list_;
std::vector<std::string> sid_list_;
std::vector<LocalizedName> name_list_;
ScopedVector<MobileAPN> apn_list_;
ScopedVector<CellularService::OLP> olp_list_;
std::map<std::string, uint32> mccmnc_to_olp_idx_;
std::map<std::string, uint32> sid_to_olp_idx_;
bool is_primary_;
bool requires_roaming_;
DISALLOW_COPY_AND_ASSIGN(CellularOperator);
};
// The class Constructor and Destructor don't perform any special
// initialization or cleanup. The primary initializer is the Load()
// method.
CellularOperatorInfo();
virtual ~CellularOperatorInfo();
// Loads the operator info from |info_file_path|. Returns true on success.
bool Load(const base::FilePath &info_file_path);
// Gets the cellular operator info of the operator with MCCMNC |mccmnc|.
// If found, returns a pointer to the matching operator.
virtual const CellularOperator *GetCellularOperatorByMCCMNC(
const std::string &mccmnc) const;
// Gets the cellular operator info of the operator with SID |sid|.
// If found, returns a pointer to the matching operator.
virtual const CellularOperator *GetCellularOperatorBySID(
const std::string &sid) const;
// Gets the cellular operator info of the operators that match the name
// |name|, such that each element contains information about the operator
// in different countries. The given name must be the first enumerated name
// for the operator in the operator database.
// If found, returns a pointer to a vector containing the matching operators.
virtual const std::vector<const CellularOperator *> *GetCellularOperators(
const std::string &name) const;
// Gets the online payment portal info of the operator with MCCMNC |mccmnc|.
// If found, returns a pointer to the matching OLP.
virtual const CellularService::OLP *GetOLPByMCCMNC(
const std::string &mccmnc) const;
// Gets the online payment portal info of the operator with SID |sid|.
// If found, returns a pointer to the matching OLP.
virtual const CellularService::OLP *GetOLPBySID(const std::string &sid) const;
// Returns a list of all operators.
const ScopedVector<CellularOperator> &operators() const;
private:
scoped_ptr<CellularOperatorInfoImpl> impl_;
DISALLOW_COPY_AND_ASSIGN(CellularOperatorInfo);
};
} // namespace shill
#endif // SHILL_CELLULAR_OPERATOR_INFO_H_