1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Copyright (C) 2014 Samsung Electronics Co., Ltd. All rights reserved 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 CDMA_SMS_PDU_CODEC_H 18 #define CDMA_SMS_PDU_CODEC_H 19 20 #include <vector> 21 22 #include "cdma_sms_types.h" 23 24 namespace OHOS { 25 namespace Telephony { 26 class CdmaSmsPduCodec { 27 public: 28 CdmaSmsPduCodec() = default; 29 virtual ~CdmaSmsPduCodec() = default; 30 31 static bool CheckInvalidPDU(const std::vector<unsigned char> &pduStr); 32 static int EncodeMsg(const struct SmsTransMsg &transMsg, unsigned char *pduStr); 33 static int DecodeMsg(const unsigned char *pduStr, int pduLen, struct SmsTransMsg &transMsg); 34 35 private: 36 static constexpr uint8_t MSG_UDID_PARAM_LEN = 3; 37 static constexpr uint8_t BYTE_BITS = 8; 38 static constexpr uint8_t SHIFT_1BITS = 1; 39 static constexpr uint8_t SHIFT_2BITS = 2; 40 static constexpr uint8_t SHIFT_3BITS = 3; 41 static constexpr uint8_t SHIFT_4BITS = 4; 42 static constexpr uint8_t SHIFT_5BITS = 5; 43 static constexpr uint8_t SHIFT_6BITS = 6; 44 static constexpr uint8_t SHIFT_7BITS = 7; 45 static constexpr uint8_t SHIFT_8BITS = 8; 46 47 static constexpr uint8_t BYTE_STEP = 1; 48 static constexpr uint8_t HALF_BYTE = 4; 49 static constexpr uint8_t MIN_PDU_LEN = 2; 50 static constexpr uint8_t HEX_BYTE_STEP = 2; 51 static constexpr uint8_t MAX_MSG_ID_LEN = 5; 52 static constexpr uint8_t DECIMAL_NUM = 10; 53 static constexpr uint8_t ENCODE_GSM_BIT = 7; 54 static constexpr uint8_t ENCODE_BYTE_BIT = 7; 55 static constexpr uint8_t BYTE_BIT = 8; 56 static constexpr uint8_t MAX_TPDU_DATA_LEN = 255; 57 58 static int EncodeP2PMsg(const struct SmsTransP2PMsg &p2pMsg, unsigned char *pduStr); 59 static int EncodeAckMsg(const struct SmsTransAckMsg &ackMsg, unsigned char *pduStr); 60 static int EncodeCBMsg(const struct SmsTransBroadCastMsg &cbMsg, unsigned char *pduStr); 61 62 static int EncodeTelesvcMsg(const struct SmsTeleSvcMsg &svcMsg, unsigned char *pduStr); 63 64 static int EncodeTelesvcCancelMsg(const struct SmsTeleSvcCancel &cancelMsg, unsigned char *pduStr); 65 static int EncodeTelesvcSubmitMsg(const struct SmsTeleSvcSubmit &sbMsg, unsigned char *pduStr); 66 static int EncodeTelesvcDeliverReportMsg(const struct SmsTeleSvcDeliverReport &dRMsg, unsigned char *pduStr); 67 static int EncodeAddress(const struct SmsTransAddr &address, unsigned char *pduStr); 68 static int EncodeSubAddress(const struct SmsTransSubAddr &address, unsigned char *pduStr); 69 70 static int DecodeP2PMsg(const unsigned char *pduStr, int pduLen, struct SmsTransP2PMsg &p2pMsg); 71 static int DecodeCBMsg(const unsigned char *pduStr, int pduLen, struct SmsTransBroadCastMsg &cbMsg); 72 static int DecodeAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTransAckMsg &ackMsg); 73 74 static void DecodeP2PTelesvcMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcMsg &svcMsg); 75 static void DecodeP2PDeliveryAckMsg( 76 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliverAck &delAckMsg); 77 static void DecodeP2PSubmitReportMsg( 78 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliverReport &subReport); 79 static void DecodeP2PUserAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcUserAck &userAck); 80 static void DecodeP2PReadAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcReadAck &readAck); 81 static void DecodeP2PDeliverMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliver &delMsg); 82 static void DecodeP2PSubmitMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcSubmit &subMsg); 83 static void DecodeCBBearerData( 84 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcMsg &telesvc, bool isCMAS); 85 86 static int Encode7BitASCIIData(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 87 static int Encode7BitGSMData(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 88 static int EncodeUCS2Data(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 89 90 static void DecodeUserData( 91 unsigned char *pduStr, int pduLen, struct SmsTeleSvcUserData &userData, bool headerInd); 92 static void Decode7BitHeader( 93 const unsigned char *pduStr, unsigned char udhlBytes, struct SmsUserData &userData); 94 static void DecodeCMASData(unsigned char *pduStr, int pduLen, struct SmsTeleSvcCmasData &cmasData); 95 static int DecodeCMASType0Data(unsigned char *pduStr, int pduLen, struct SmsTeleSvcCmasData &cmasData); 96 97 static int DecodeTeleId(const unsigned char *pduStr, int pduLen, unsigned short &teleSvcId); 98 static int DecodeSvcCtg(const unsigned char *pduStr, int pduLen, unsigned short &transSvcCtg); 99 static int DecodeAddress(const unsigned char *pduStr, int pduLen, struct SmsTransAddr &transAddr); 100 static int DecodeSubAddress(const unsigned char *pduStr, int pduLen, struct SmsTransSubAddr &subAddr); 101 102 static int DecodeMsgId(const unsigned char *pduStr, int pduLen, struct SmsTransMsgId &smgId); 103 static void DecodeCallBackNum(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcAddr &svcAddr); 104 static int DecodeAbsTime(const unsigned char *pduStr, struct SmsTimeAbs &timeAbs); 105 static enum SmsMessageType FindMsgType(const std::vector<unsigned char> &pduStr); 106 static enum SmsEncodingType FindMsgEncodeType(const unsigned char value); 107 static void DecodeP2PDeliverVmnAck( 108 const unsigned char *pduStr, int pduLen, struct SmsEnhancedVmnAck &enhancedVmnAck); 109 static void DecodeP2PEnhancedVmn(const unsigned char *pduStr, int pduLen, struct SmsEnhancedVmn &enhancedVmn); 110 111 static unsigned char ConvertToBCD(const unsigned char val); 112 static unsigned char DecodeDigitModeNumberType(const unsigned char val, bool isNumber); 113 static unsigned char DecodeDigitModeNumberPlan(const unsigned char val); 114 115 static int EncodeCbNumber(const SmsTeleSvcAddr &cbNumber, std::vector<unsigned char> &pdustr); 116 static int EncodeAbsTime(const SmsTimeAbs &absTime, std::vector<unsigned char> &pdustr); 117 static int EncodeMsgId(const SmsTransMsgId &msgId, const SmsMessageType &type, unsigned char *pduStr); 118 static int EncodeBearerUserData(const struct SmsTeleSvcUserData &userData, unsigned char *pduStr); 119 static void ShiftNBitForDecode(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 120 static void ShiftRNBit(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 121 static void ShiftNBit(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 122 }; 123 } // namespace Telephony 124 } // namespace OHOS 125 #endif