272 lines
8.1 KiB
C++
272 lines
8.1 KiB
C++
//
|
|
// Copyright (C) 2020 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#pragma once
|
|
|
|
#include <tinyxml2.h>
|
|
|
|
#include "host/commands/modem_simulator/modem_service.h"
|
|
|
|
namespace cuttlefish {
|
|
|
|
using namespace tinyxml2;
|
|
|
|
class NetworkService;
|
|
|
|
class SimService : public ModemService, public std::enable_shared_from_this<SimService> {
|
|
public:
|
|
SimService(int32_t service_id, ChannelMonitor* channel_monitor,
|
|
ThreadLooper* thread_looper);
|
|
~SimService() = default;
|
|
|
|
SimService(const SimService &) = delete;
|
|
SimService &operator=(const SimService &) = delete;
|
|
|
|
void SetupDependency(NetworkService* net);
|
|
|
|
void HandleSIMStatusReq(const Client& client);
|
|
void HandleChangeOrEnterPIN(const Client& client, const std::string& command);
|
|
void HandleSIM_IO(const Client& client, const std::string& command);
|
|
void HandleCSIM_IO(const Client& client, const std::string& command);
|
|
void HandleGetIMSI(const Client& client);
|
|
void HandleGetIccId(const Client& client);
|
|
void HandleFacilityLock(const Client& client, const std::string& command);
|
|
void HandleOpenLogicalChannel(const Client& client,
|
|
const std::string& command);
|
|
void HandleCloseLogicalChannel(const Client& client,
|
|
const std::string& command);
|
|
void HandleTransmitLogicalChannel(const Client& client,
|
|
const std::string& command);
|
|
void HandleChangePassword(const Client& client, const std::string& command);
|
|
void HandleQueryRemainTimes(const Client& client, const std::string& command);
|
|
void HandleCdmaSubscriptionSource(const Client& client,
|
|
const std::string& command);
|
|
void HandleCdmaRoamingPreference(const Client& client,
|
|
const std::string& command);
|
|
void HandleSimAuthentication(const Client& client,
|
|
const std::string& command);
|
|
|
|
void SavePinStateToIccProfile();
|
|
void SaveFacilityLockToIccProfile();
|
|
bool IsFDNEnabled();
|
|
bool IsFixedDialNumber(std::string_view number);
|
|
XMLElement* GetIccProfile();
|
|
std::string GetPhoneNumber();
|
|
|
|
enum SimStatus {
|
|
SIM_STATUS_ABSENT = 0,
|
|
SIM_STATUS_NOT_READY,
|
|
SIM_STATUS_READY,
|
|
SIM_STATUS_PIN,
|
|
SIM_STATUS_PUK,
|
|
};
|
|
|
|
SimStatus GetSimStatus() const;
|
|
std::string GetSimOperator();
|
|
|
|
private:
|
|
void InitializeServiceState();
|
|
std::vector<CommandHandler> InitializeCommandHandlers();
|
|
void InitializeSimFileSystemAndSimState();
|
|
void InitializeFacilityLock();
|
|
void OnSimStatusChanged();
|
|
|
|
NetworkService* network_service_;
|
|
|
|
/* SimStatus */
|
|
SimStatus sim_status_;
|
|
|
|
/* SimFileSystem */
|
|
struct SimFileSystem {
|
|
enum EFId: int32_t {
|
|
EF_ADN = 0x6F3A,
|
|
EF_FDN = 0x6F3B,
|
|
EF_GID1 = 0x6F3E,
|
|
EF_GID2 = 0x6F3F,
|
|
EF_SDN = 0x6F49,
|
|
EF_EXT1 = 0x6F4A,
|
|
EF_EXT2 = 0x6F4B,
|
|
EF_EXT3 = 0x6F4C,
|
|
EF_EXT5 = 0x6F4E,
|
|
EF_EXT6 = 0x6FC8, // Ext record for EF[MBDN]
|
|
EF_MWIS = 0x6FCA,
|
|
EF_MBDN = 0x6FC7,
|
|
EF_PNN = 0x6FC5,
|
|
EF_OPL = 0x6FC6,
|
|
EF_SPN = 0x6F46,
|
|
EF_SMS = 0x6F3C,
|
|
EF_ICCID = 0x2FE2,
|
|
EF_AD = 0x6FAD,
|
|
EF_MBI = 0x6FC9,
|
|
EF_MSISDN = 0x6F40,
|
|
EF_SPDI = 0x6FCD,
|
|
EF_SST = 0x6F38,
|
|
EF_CFIS = 0x6FCB,
|
|
EF_IMG = 0x4F20,
|
|
|
|
// USIM SIM file ids from TS 131.102
|
|
EF_PBR = 0x4F30,
|
|
EF_LI = 0x6F05,
|
|
|
|
// GSM SIM file ids from CPHS (phase 2, version 4.2) CPHS4_2.WW6
|
|
EF_MAILBOX_CPHS = 0x6F17,
|
|
EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11,
|
|
EF_CFF_CPHS = 0x6F13,
|
|
EF_SPN_CPHS = 0x6F14,
|
|
EF_SPN_SHORT_CPHS = 0x6F18,
|
|
EF_INFO_CPHS = 0x6F16,
|
|
EF_CSP_CPHS = 0x6F15,
|
|
|
|
// CDMA RUIM file ids from 3GPP2 C.S0023-0
|
|
EF_CST = 0x6F32,
|
|
EF_RUIM_SPN =0x6F41,
|
|
|
|
// ETSI TS.102.221
|
|
EF_PL = 0x2F05,
|
|
// 3GPP2 C.S0065
|
|
EF_CSIM_LI = 0x6F3A,
|
|
EF_CSIM_SPN =0x6F41,
|
|
EF_CSIM_MDN = 0x6F44,
|
|
EF_CSIM_IMSIM = 0x6F22,
|
|
EF_CSIM_CDMAHOME = 0x6F28,
|
|
EF_CSIM_EPRL = 0x6F5A,
|
|
EF_CSIM_MIPUPP = 0x6F4D,
|
|
|
|
//ISIM access
|
|
EF_IMPU = 0x6F04,
|
|
EF_IMPI = 0x6F02,
|
|
EF_DOMAIN = 0x6F03,
|
|
EF_IST = 0x6F07,
|
|
EF_PCSCF = 0x6F09,
|
|
EF_PSI = 0x6FE5,
|
|
|
|
//PLMN Selection Information w/ Access Technology TS 131.102
|
|
EF_PLMN_W_ACT = 0x6F60,
|
|
EF_OPLMN_W_ACT = 0x6F61,
|
|
EF_HPLMN_W_ACT = 0x6F62,
|
|
|
|
//Equivalent Home and Forbidden PLMN Lists TS 131.102
|
|
EF_EHPLMN = 0x6FD9,
|
|
EF_FPLMN = 0x6F7B,
|
|
|
|
// Last Roaming Selection Indicator
|
|
EF_LRPLMNSI = 0x6FDC,
|
|
|
|
//Search interval for higher priority PLMNs
|
|
EF_HPPLMN = 0x6F31,
|
|
};
|
|
|
|
XMLElement* GetRootElement();
|
|
|
|
static std::string GetCommonIccEFPath(EFId efid);
|
|
static std::string GetUsimEFPath(EFId efid);
|
|
|
|
static XMLElement *FindAttribute(XMLElement* parent,
|
|
const std::string& attr_name,
|
|
const std::string& attr_value);
|
|
|
|
XMLElement* AppendNewElement(XMLElement* parent, const char* name);
|
|
XMLElement* AppendNewElementWithText(XMLElement* parent, const char* name,
|
|
const char* text);
|
|
|
|
XMLDocument doc;
|
|
std::string file_path;
|
|
};
|
|
SimFileSystem sim_file_system_;
|
|
|
|
|
|
/* PinStatus */
|
|
struct PinStatus {
|
|
enum ChangeMode {WITH_PIN, WITH_PUK};
|
|
|
|
std::string pin_;
|
|
std::string puk_;
|
|
int pin_remaining_times_;
|
|
int puk_remaining_times_;
|
|
|
|
bool CheckPasswordValid(std::string_view password);
|
|
|
|
bool VerifyPIN(const std::string_view pin);
|
|
bool VerifyPUK(const std::string_view puk);
|
|
bool ChangePIN(ChangeMode mode, const std::string_view pin_or_puk,
|
|
const std::string_view new_pin);
|
|
bool ChangePUK(const std::string_view puk, const std::string_view new_puk);
|
|
};
|
|
PinStatus pin1_status_;
|
|
PinStatus pin2_status_;
|
|
|
|
bool checkPin1AndAdjustSimStatus(std::string_view password);
|
|
bool ChangePin1AndAdjustSimStatus(PinStatus::ChangeMode mode,
|
|
std::string_view pin,
|
|
std::string_view new_pin);
|
|
|
|
/* FacilityLock */
|
|
struct FacilityLock {
|
|
enum LockType {
|
|
AO = 1, // Barr all outgoing calls
|
|
OI = 2, // Barr all outgoing international calls
|
|
OX = 3, // Barr all outgoing international calls, except to Home Country
|
|
AI = 4, // Barr all incoming calls
|
|
IR = 5, // Barr all call, when roaming outside Home Country
|
|
AB = 6, // All barring services
|
|
AG = 7, // All outgoing barring services
|
|
AC = 8, // All incoming barring services
|
|
SC = 9, // PIN enable/disable
|
|
FD = 10, // SIM fixed FDN dialing lock, PIN2 is required as a password
|
|
};
|
|
|
|
enum Mode {
|
|
UNLOCK = 0,
|
|
LOCK = 1,
|
|
QUERY = 2,
|
|
};
|
|
|
|
enum Class : int32_t {
|
|
DEFAULT = 7, // all classes
|
|
VOICE = 1 << 0, // telephony
|
|
DATA = 1 << 1, // to all bear service
|
|
FAX = 1 << 2, // facsimile services
|
|
SMS = 1 << 3, // short message services
|
|
};
|
|
|
|
enum LockStatus {
|
|
DISABLE,
|
|
ENABLE,
|
|
};
|
|
|
|
LockStatus lock_status; // Ignore class
|
|
|
|
FacilityLock(LockStatus status) : lock_status(status) {}
|
|
};
|
|
std::map<std::string, FacilityLock> facility_lock_;
|
|
|
|
/* LogicalChannel */
|
|
struct LogicalChannel {
|
|
std::string df_name;
|
|
bool is_open;
|
|
int session_id;
|
|
|
|
LogicalChannel(int session_id) :
|
|
df_name(""), is_open(false), session_id(session_id) {};
|
|
};
|
|
std::vector<LogicalChannel> logical_channels_;
|
|
std::string last_file_id_;
|
|
|
|
int cdma_subscription_source_;
|
|
int cdma_roaming_preference_;
|
|
};
|
|
|
|
} // namespace cuttlefish
|