1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef CDMA_SMS_SUB_PARAMETER_H 17 #define CDMA_SMS_SUB_PARAMETER_H 18 19 #include "cdma_sms_common.h" 20 #include "sms_pdu_buffer.h" 21 22 namespace OHOS { 23 namespace Telephony { 24 25 class CdmaSmsSubParameter { 26 public: 27 virtual ~CdmaSmsSubParameter() = default; 28 virtual bool Encode(SmsWriteBuffer &pdu) = 0; 29 virtual bool Decode(SmsReadBuffer &pdu) = 0; 30 31 protected: 32 inline bool IsInvalidPdu(SmsReadBuffer &pdu); 33 34 public: 35 uint8_t id_ { RESERVED }; 36 uint8_t len_ { 0 }; 37 38 enum SubParameterId : uint8_t { 39 MESSAGE_IDENTIFIER = 0x00, 40 USER_DATA = 0x01, 41 USER_RESPONSE_CODE = 0x02, 42 MESSAGE_CENTER_TIME_STAMP = 0x03, 43 VALIDITY_PERIOD_ABSOLUTE = 0x04, 44 VALIDITY_PERIOD_RELATIVE = 0x05, 45 DEFERRED_DELIVERY_TIME_ABSOLUTE = 0x06, 46 DEFERRED_DELIVERY_TIME_RELATIVE = 0x07, 47 PRIORITY_INDICATOR = 0x08, 48 PRIVACY_INDICATOR = 0x09, 49 REPLY_OPTION = 0x0A, 50 NUMBER_OF_MESSAGES = 0x0B, 51 ALERT_ON_MSG_DELIVERY = 0x0C, 52 LANGUAGE_INDICATOR = 0x0D, 53 CALLBACK_NUMBER = 0x0E, 54 MESSAGE_DISPLAY_MODE = 0x0F, 55 MULTI_ENCODING_USER_DATA = 0x10, 56 MESSAGE_DEPOSIT_INDEX = 0x11, 57 SERVICE_CATEGORY_PROGRAM_DATA = 0x12, 58 SERVICE_CATEGORY_PROGRAM_RESULT = 0x13, 59 MESSAGE_STATUS = 0x14, 60 TP_FAILURE_CAUSE = 0x15, 61 ENHANCED_VMN = 0x16, 62 ENHANCED_VMN_ACK = 0x17, 63 RESERVED 64 }; 65 }; 66 67 class CdmaSmsBaseParameter : public CdmaSmsSubParameter { 68 public: 69 CdmaSmsBaseParameter(uint8_t id, uint8_t &data); 70 bool Encode(SmsWriteBuffer &pdu) override; 71 bool Decode(SmsReadBuffer &pdu) override; 72 73 private: 74 uint8_t &data_; 75 }; 76 77 class CdmaSmsReservedParameter : public CdmaSmsSubParameter { 78 public: 79 explicit CdmaSmsReservedParameter(uint8_t id); 80 bool Encode(SmsWriteBuffer &pdu) override; 81 bool Decode(SmsReadBuffer &pdu) override; 82 }; 83 84 class CdmaSmsMessageId : public CdmaSmsSubParameter { 85 public: 86 CdmaSmsMessageId(SmsTeleSvcMsgId &msgId, uint8_t type); 87 bool Encode(SmsWriteBuffer &pdu) override; 88 bool Decode(SmsReadBuffer &pdu) override; 89 uint8_t GetMessageType(); 90 91 private: 92 SmsTeleSvcMsgId &msgId_; 93 uint8_t type_; 94 }; 95 96 class CdmaSmsAbsoluteTime : public CdmaSmsSubParameter { 97 public: 98 CdmaSmsAbsoluteTime(uint8_t id, SmsTimeAbs &time); 99 bool Encode(SmsWriteBuffer &pdu) override; 100 bool Decode(SmsReadBuffer &pdu) override; 101 102 private: 103 inline uint8_t EncodeBCD(const uint8_t v); 104 inline uint8_t DecodeBCD(const uint8_t v); 105 106 private: 107 SmsTimeAbs &time_; 108 }; 109 110 class CdmaSmsPriorityInd : public CdmaSmsSubParameter { 111 public: 112 explicit CdmaSmsPriorityInd(SmsPriorityIndicator &priority); 113 bool Encode(SmsWriteBuffer &pdu) override; 114 bool Decode(SmsReadBuffer &pdu) override; 115 116 private: 117 SmsPriorityIndicator &priority_; 118 }; 119 120 class CdmaSmsPrivacyInd : public CdmaSmsSubParameter { 121 public: 122 explicit CdmaSmsPrivacyInd(SmsPrivacyIndicator &privacy); 123 bool Encode(SmsWriteBuffer &pdu) override; 124 bool Decode(SmsReadBuffer &pdu) override; 125 126 private: 127 SmsPrivacyIndicator &privacy_; 128 }; 129 130 class CdmaSmsReplyOption : public CdmaSmsSubParameter { 131 public: 132 explicit CdmaSmsReplyOption(SmsReplyOption &replyOpt); 133 bool Encode(SmsWriteBuffer &pdu) override; 134 bool Decode(SmsReadBuffer &pdu) override; 135 136 private: 137 SmsReplyOption &replyOpt_; 138 }; 139 140 class CdmaSmsUserData : public CdmaSmsSubParameter { 141 public: 142 CdmaSmsUserData(SmsTeleSvcUserData &data, bool &headerInd); 143 bool Encode(SmsWriteBuffer &pdu) override; 144 bool Decode(SmsReadBuffer &pdu) override; 145 static inline SmsEncodingType GetEncodingType(uint8_t v); 146 147 private: 148 bool EncodeAscii7Bit(SmsWriteBuffer &pdu); 149 bool EncodeGsm7Bit(SmsWriteBuffer &pdu); 150 bool EncodeUnicode(SmsWriteBuffer &pdu); 151 bool Encode8BitData(SmsWriteBuffer &pdu); 152 bool EncodeHeader7Bit(SmsWriteBuffer &pdu); 153 bool EncodeHeaderUnicode(SmsWriteBuffer &pdu); 154 uint8_t DecodeHeader7Bit(SmsReadBuffer &pdu); 155 bool DecodeAscii7Bit(SmsReadBuffer &pdu, uint8_t numFields, uint8_t udhBytes); 156 bool DecodeGsm7Bit(SmsReadBuffer &pdu, uint8_t numFields, uint8_t udhBytes); 157 bool Decode8BitData(SmsReadBuffer &pdu); 158 159 private: 160 SmsTeleSvcUserData &data_; 161 bool &headerInd_; 162 163 enum EncodingType : uint8_t { 164 OCTET = 0x0, 165 EPM = 0x1, 166 ASCII7BIT = 0x2, 167 IA5 = 0x3, 168 UNICODE = 0x4, 169 SHIFT_JIS = 0x5, 170 KOREAN = 0x6, 171 LATIN_HEBREW = 0x7, 172 LATIN = 0x8, 173 GSM7BIT = 0x9, 174 GSMDCS = 0xa, 175 EUCKR = 0x10 176 }; 177 }; 178 179 class CdmaSmsCmasData : public CdmaSmsSubParameter { 180 public: 181 explicit CdmaSmsCmasData(SmsTeleSvcCmasData &data); 182 bool Encode(SmsWriteBuffer &pdu) override; 183 bool Decode(SmsReadBuffer &pdu) override; 184 185 private: 186 bool DecodeData(SmsReadBuffer &pdu); 187 bool DecodeType0Data(SmsReadBuffer &pdu); 188 bool DecodeType1Data(SmsReadBuffer &pdu); 189 bool DecodeType2Data(SmsReadBuffer &pdu); 190 bool DecodeAbsTime(SmsReadBuffer &pdu); 191 192 private: 193 SmsTeleSvcCmasData &data_; 194 }; 195 196 class CdmaSmsAlertPriority : public CdmaSmsSubParameter { 197 public: 198 explicit CdmaSmsAlertPriority(SmsAlertPriority &alertPriority); 199 bool Encode(SmsWriteBuffer &pdu) override; 200 bool Decode(SmsReadBuffer &pdu) override; 201 202 private: 203 SmsAlertPriority &alertPriority_; 204 }; 205 206 class CdmaSmsLanguageInd : public CdmaSmsSubParameter { 207 public: 208 explicit CdmaSmsLanguageInd(SmsLanguageType &language); 209 bool Encode(SmsWriteBuffer &pdu) override; 210 bool Decode(SmsReadBuffer &pdu) override; 211 212 private: 213 SmsLanguageType &language_; 214 }; 215 216 class CdmaSmsCallbackNumber : public CdmaSmsSubParameter { 217 public: 218 CdmaSmsCallbackNumber(); 219 explicit CdmaSmsCallbackNumber(SmsTeleSvcAddr &address); 220 bool Encode(SmsWriteBuffer &pdu) override; 221 bool Decode(SmsReadBuffer &pdu) override; 222 223 private: 224 SmsTeleSvcAddr &address_; 225 }; 226 227 class CdmaSmsDepositIndex : public CdmaSmsSubParameter { 228 public: 229 explicit CdmaSmsDepositIndex(uint16_t &index); 230 bool Encode(SmsWriteBuffer &pdu) override; 231 bool Decode(SmsReadBuffer &pdu) override; 232 233 private: 234 uint16_t &index_; 235 }; 236 237 class CdmaSmsDisplayMode : public CdmaSmsSubParameter { 238 public: 239 explicit CdmaSmsDisplayMode(SmsDisplayMode &mode); 240 bool Encode(SmsWriteBuffer &pdu) override; 241 bool Decode(SmsReadBuffer &pdu) override; 242 243 private: 244 SmsDisplayMode &mode_; 245 }; 246 247 class CdmaSmsMessageStatus : public CdmaSmsSubParameter { 248 public: 249 explicit CdmaSmsMessageStatus(SmsStatusCode &status); 250 bool Encode(SmsWriteBuffer &pdu) override; 251 bool Decode(SmsReadBuffer &pdu) override; 252 253 private: 254 SmsStatusCode &status_; 255 }; 256 257 class CdmaSmsNumberMessages : public CdmaSmsSubParameter { 258 public: 259 explicit CdmaSmsNumberMessages(uint32_t &num); 260 bool Encode(SmsWriteBuffer &pdu) override; 261 bool Decode(SmsReadBuffer &pdu) override; 262 263 private: 264 uint32_t &num_; 265 }; 266 267 class CdmaSmsEnhancedVmn : public CdmaSmsSubParameter { 268 public: 269 explicit CdmaSmsEnhancedVmn(SmsEnhancedVmn &vmn); 270 bool Encode(SmsWriteBuffer &pdu) override; 271 bool Decode(SmsReadBuffer &pdu) override; 272 273 private: 274 bool DecodeHeader(SmsReadBuffer &pdu); 275 bool DecodeVoiceMail(SmsReadBuffer &pdu); 276 bool DecodeAccessNumber(SmsReadBuffer &pdu); 277 bool DecodeCallingPartyNumber(SmsReadBuffer &pdu); 278 279 private: 280 SmsEnhancedVmn &vmn_; 281 }; 282 283 class CdmaSmsEnhancedVmnAck : public CdmaSmsSubParameter { 284 public: 285 explicit CdmaSmsEnhancedVmnAck(SmsEnhancedVmnAck &ack); 286 bool Encode(SmsWriteBuffer &pdu) override; 287 bool Decode(SmsReadBuffer &pdu) override; 288 289 private: 290 SmsEnhancedVmnAck &ack_; 291 }; 292 293 } // namespace Telephony 294 } // namespace OHOS 295 #endif 296