• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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