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, size_t pduStrLen); 33 static int DecodeMsg(const unsigned char *pduStr, int pduLen, struct SmsTransMsg &transMsg); 34 35 private: 36 static int EncodeP2PMsg(const struct SmsTransP2PMsg &p2pMsg, unsigned char *pduStr); 37 static int EncodeAckMsg(const struct SmsTransAckMsg &ackMsg, unsigned char *pduStr); 38 static int EncodeCBMsg(const struct SmsTransBroadCastMsg &cbMsg, unsigned char *pduStr); 39 40 static int EncodeTelesvcMsg(const struct SmsTeleSvcMsg &svcMsg, unsigned char *pduStr); 41 42 static int EncodeTelesvcCancelMsg(const struct SmsTeleSvcCancel &cancelMsg, unsigned char *pduStr); 43 static int EncodeTelesvcSubmitMsg(const struct SmsTeleSvcSubmit &sbMsg, unsigned char *pduStr); 44 static int EncodeTelesvcDeliverReportMsg(const struct SmsTeleSvcDeliverReport &dRMsg, unsigned char *pduStr); 45 static int EncodeAddress(const struct SmsTransAddr &address, unsigned char *pduStr); 46 static int EncodeSubAddress(const struct SmsTransSubAddr &address, unsigned char *pduStr); 47 48 static int DecodeP2PMsg(const unsigned char *pduStr, int pduLen, struct SmsTransP2PMsg &p2pMsg); 49 static int DecodeCBMsg(const unsigned char *pduStr, int pduLen, struct SmsTransBroadCastMsg &cbMsg); 50 static int DecodeAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTransAckMsg &ackMsg); 51 52 static void DecodeP2PTelesvcMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcMsg &svcMsg); 53 static void DecodeP2PDeliveryAckMsg( 54 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliverAck &delAckMsg); 55 static void DecodeP2PSubmitReportMsg( 56 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliverReport &subReport); 57 static void DecodeP2PUserAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcUserAck &userAck); 58 static void DecodeP2PReadAckMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcReadAck &readAck); 59 static void DecodeP2PDeliverMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcDeliver &delMsg); 60 static void DecodeP2PSubmitMsg(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcSubmit &subMsg); 61 static void DecodeCBBearerData( 62 const unsigned char *pduStr, int pduLen, struct SmsTeleSvcMsg &telesvc, bool isCMAS); 63 64 static int Encode7BitASCIIData(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 65 static int Encode7BitGSMData(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 66 static int EncodeUCS2Data(const struct SmsUserData &userData, unsigned char *dest, int &remainBits); 67 68 static void DecodeUserData( 69 unsigned char *pduStr, int pduLen, struct SmsTeleSvcUserData &userData, bool headerInd); 70 static void Decode7BitHeader( 71 const unsigned char *pduStr, unsigned char udhlBytes, struct SmsUserData &userData); 72 static void DecodeCMASData(unsigned char *pduStr, int pduLen, struct SmsTeleSvcCmasData &cmasData); 73 static int DecodeCMASType0Data(unsigned char *pduStr, int pduLen, struct SmsTeleSvcCmasData &cmasData); 74 75 static int DecodeTeleId(const unsigned char *pduStr, int pduLen, unsigned short &teleSvcId); 76 static int DecodeSvcCtg(const unsigned char *pduStr, int pduLen, unsigned short &transSvcCtg); 77 static int DecodeAddress(const unsigned char *pduStr, int pduLen, struct SmsTransAddr &transAddr); 78 static int DecodeSubAddress(const unsigned char *pduStr, int pduLen, struct SmsTransSubAddr &subAddr); 79 80 static int DecodeMsgId(const unsigned char *pduStr, int pduLen, struct SmsTransMsgId &smgId); 81 static void DecodeCallBackNum(const unsigned char *pduStr, int pduLen, struct SmsTeleSvcAddr &svcAddr); 82 static int DecodeAbsTime(const unsigned char *pduStr, struct SmsTimeAbs &timeAbs); 83 static enum SmsMessageType FindMsgType(const std::vector<unsigned char> &pduStr); 84 static enum SmsEncodingType FindMsgEncodeType(const unsigned char value); 85 static void DecodeP2PDeliverVmnAck( 86 const unsigned char *pduStr, int pduLen, struct SmsEnhancedVmnAck &enhancedVmnAck); 87 static void DecodeP2PEnhancedVmn(const unsigned char *pduStr, int pduLen, struct SmsEnhancedVmn &enhancedVmn); 88 89 static unsigned char ConvertToBCD(const unsigned char val); 90 static unsigned char DecodeDigitModeNumberType(const unsigned char val, bool isNumber); 91 static unsigned char DecodeDigitModeNumberPlan(const unsigned char val); 92 93 static int EncodeCbNumber(const SmsTeleSvcAddr &cbNumber, std::vector<unsigned char> &pdustr); 94 static int EncodeAbsTime(const SmsTimeAbs &absTime, std::vector<unsigned char> &pdustr); 95 static int EncodeMsgId(const SmsTransMsgId &msgId, const SmsMessageType &type, unsigned char *pduStr); 96 static int EncodeBearerUserData(const struct SmsTeleSvcUserData &userData, unsigned char *pduStr); 97 static void ShiftNBitForDecode(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 98 static void ShiftRNBit(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 99 static void ShiftNBit(unsigned char *src, unsigned int nBytes, unsigned int nShiftBit); 100 }; 101 } // namespace Telephony 102 } // namespace OHOS 103 #endif