1e5d0e473Sopenharmony_ci/*
2e5d0e473Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
3e5d0e473Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e5d0e473Sopenharmony_ci * you may not use this file except in compliance with the License.
5e5d0e473Sopenharmony_ci * You may obtain a copy of the License at
6e5d0e473Sopenharmony_ci *
7e5d0e473Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e5d0e473Sopenharmony_ci *
9e5d0e473Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e5d0e473Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e5d0e473Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e5d0e473Sopenharmony_ci * See the License for the specific language governing permissions and
13e5d0e473Sopenharmony_ci * limitations under the License.
14e5d0e473Sopenharmony_ci */
15e5d0e473Sopenharmony_ci
16e5d0e473Sopenharmony_ci#include "sms_wap_push_buffer.h"
17e5d0e473Sopenharmony_ci
18e5d0e473Sopenharmony_ci#include "securec.h"
19e5d0e473Sopenharmony_ci#include "sms_constants_utils.h"
20e5d0e473Sopenharmony_ci#include "string_utils.h"
21e5d0e473Sopenharmony_ci#include "telephony_log_wrapper.h"
22e5d0e473Sopenharmony_ci
23e5d0e473Sopenharmony_cinamespace OHOS {
24e5d0e473Sopenharmony_cinamespace Telephony {
25e5d0e473Sopenharmony_ciSmsWapPushBuffer::SmsWapPushBuffer() {}
26e5d0e473Sopenharmony_ci
27e5d0e473Sopenharmony_ciSmsWapPushBuffer::~SmsWapPushBuffer()
28e5d0e473Sopenharmony_ci{
29e5d0e473Sopenharmony_ci    if (pduBuffer_ != nullptr) {
30e5d0e473Sopenharmony_ci        pduBuffer_.reset();
31e5d0e473Sopenharmony_ci    }
32e5d0e473Sopenharmony_ci}
33e5d0e473Sopenharmony_ci
34e5d0e473Sopenharmony_cistd::unique_ptr<char[]> SmsWapPushBuffer::ReadDataBuffer(uint32_t desLen)
35e5d0e473Sopenharmony_ci{
36e5d0e473Sopenharmony_ci    return ReadDataBuffer(curPosition_, desLen);
37e5d0e473Sopenharmony_ci}
38e5d0e473Sopenharmony_ci
39e5d0e473Sopenharmony_cistd::unique_ptr<char[]> SmsWapPushBuffer::ReadDataBuffer(uint32_t offset, uint32_t desLen)
40e5d0e473Sopenharmony_ci{
41e5d0e473Sopenharmony_ci    if ((desLen > totolLength_) || ((offset + desLen) > totolLength_)) {
42e5d0e473Sopenharmony_ci        return nullptr;
43e5d0e473Sopenharmony_ci    }
44e5d0e473Sopenharmony_ci    if (desLen > MMS_PDU_MAX_SIZE) {
45e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("desLen over size error");
46e5d0e473Sopenharmony_ci        return nullptr;
47e5d0e473Sopenharmony_ci    }
48e5d0e473Sopenharmony_ci    std::unique_ptr<char[]> result = std::make_unique<char[]>(desLen);
49e5d0e473Sopenharmony_ci    if (result == nullptr) {
50e5d0e473Sopenharmony_ci        return nullptr;
51e5d0e473Sopenharmony_ci    }
52e5d0e473Sopenharmony_ci    if (memcpy_s(result.get(), desLen, &pduBuffer_[offset], desLen) != EOK) {
53e5d0e473Sopenharmony_ci        return nullptr;
54e5d0e473Sopenharmony_ci    }
55e5d0e473Sopenharmony_ci    return result;
56e5d0e473Sopenharmony_ci}
57e5d0e473Sopenharmony_ci
58e5d0e473Sopenharmony_cibool SmsWapPushBuffer::WriteRawStringBuffer(const std::string &inSrc)
59e5d0e473Sopenharmony_ci{
60e5d0e473Sopenharmony_ci    uint32_t len = inSrc.length();
61e5d0e473Sopenharmony_ci    if (len > MMS_PDU_MAX_SIZE) {
62e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("create wappush input source string over length error.");
63e5d0e473Sopenharmony_ci        return false;
64e5d0e473Sopenharmony_ci    }
65e5d0e473Sopenharmony_ci
66e5d0e473Sopenharmony_ci    if (pduBuffer_) {
67e5d0e473Sopenharmony_ci        pduBuffer_.reset();
68e5d0e473Sopenharmony_ci    }
69e5d0e473Sopenharmony_ci
70e5d0e473Sopenharmony_ci    pduBuffer_ = std::make_unique<char[]>(len);
71e5d0e473Sopenharmony_ci    if (!pduBuffer_) {
72e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push make unique fail.");
73e5d0e473Sopenharmony_ci        return false;
74e5d0e473Sopenharmony_ci    }
75e5d0e473Sopenharmony_ci    if (memcpy_s(pduBuffer_.get(), len, inSrc.data(), len) != EOK) {
76e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push memcpy_s fail.");
77e5d0e473Sopenharmony_ci        return false;
78e5d0e473Sopenharmony_ci    }
79e5d0e473Sopenharmony_ci    totolLength_ = len;
80e5d0e473Sopenharmony_ci    return true;
81e5d0e473Sopenharmony_ci}
82e5d0e473Sopenharmony_ci
83e5d0e473Sopenharmony_cibool SmsWapPushBuffer::WriteDataBuffer(std::unique_ptr<char[]> inBuff, uint32_t len)
84e5d0e473Sopenharmony_ci{
85e5d0e473Sopenharmony_ci    if (inBuff == nullptr) {
86e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push inBuff is null.");
87e5d0e473Sopenharmony_ci        return false;
88e5d0e473Sopenharmony_ci    }
89e5d0e473Sopenharmony_ci    if (len <= 0 || len > MMS_PDU_MAX_SIZE) {
90e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push len invalid .");
91e5d0e473Sopenharmony_ci        return false;
92e5d0e473Sopenharmony_ci    }
93e5d0e473Sopenharmony_ci
94e5d0e473Sopenharmony_ci    if (pduBuffer_) {
95e5d0e473Sopenharmony_ci        pduBuffer_.reset();
96e5d0e473Sopenharmony_ci    }
97e5d0e473Sopenharmony_ci
98e5d0e473Sopenharmony_ci    pduBuffer_ = std::make_unique<char[]>(len);
99e5d0e473Sopenharmony_ci    if (!pduBuffer_) {
100e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push make unique fail.");
101e5d0e473Sopenharmony_ci        return false;
102e5d0e473Sopenharmony_ci    }
103e5d0e473Sopenharmony_ci    if (memcpy_s(pduBuffer_.get(), len, inBuff.get(), len) != EOK) {
104e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push memcpy_s fail.");
105e5d0e473Sopenharmony_ci        return false;
106e5d0e473Sopenharmony_ci    }
107e5d0e473Sopenharmony_ci    totolLength_ = len;
108e5d0e473Sopenharmony_ci    return true;
109e5d0e473Sopenharmony_ci}
110e5d0e473Sopenharmony_ci
111e5d0e473Sopenharmony_ciuint32_t SmsWapPushBuffer::GetCurPosition() const
112e5d0e473Sopenharmony_ci{
113e5d0e473Sopenharmony_ci    return curPosition_;
114e5d0e473Sopenharmony_ci}
115e5d0e473Sopenharmony_ci
116e5d0e473Sopenharmony_ciuint32_t SmsWapPushBuffer::GetSize() const
117e5d0e473Sopenharmony_ci{
118e5d0e473Sopenharmony_ci    return totolLength_;
119e5d0e473Sopenharmony_ci}
120e5d0e473Sopenharmony_ci
121e5d0e473Sopenharmony_cibool SmsWapPushBuffer::PeekOneByte(uint8_t &oneByte)
122e5d0e473Sopenharmony_ci{
123e5d0e473Sopenharmony_ci    if (curPosition_ >= totolLength_) {
124e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push current position invalid.");
125e5d0e473Sopenharmony_ci        return false;
126e5d0e473Sopenharmony_ci    }
127e5d0e473Sopenharmony_ci    oneByte = pduBuffer_[curPosition_];
128e5d0e473Sopenharmony_ci    return true;
129e5d0e473Sopenharmony_ci}
130e5d0e473Sopenharmony_ci
131e5d0e473Sopenharmony_cibool SmsWapPushBuffer::GetOneByte(uint8_t &oneByte)
132e5d0e473Sopenharmony_ci{
133e5d0e473Sopenharmony_ci    if (curPosition_ >= totolLength_) {
134e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push current position invalid.");
135e5d0e473Sopenharmony_ci        return false;
136e5d0e473Sopenharmony_ci    }
137e5d0e473Sopenharmony_ci    oneByte = pduBuffer_[curPosition_];
138e5d0e473Sopenharmony_ci    curPosition_++;
139e5d0e473Sopenharmony_ci    return true;
140e5d0e473Sopenharmony_ci}
141e5d0e473Sopenharmony_ci
142e5d0e473Sopenharmony_cibool SmsWapPushBuffer::IncreasePointer(uint32_t offset)
143e5d0e473Sopenharmony_ci{
144e5d0e473Sopenharmony_ci    if ((offset > totolLength_) || ((curPosition_ + offset) > totolLength_)) {
145e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push current position invalid.");
146e5d0e473Sopenharmony_ci        return false;
147e5d0e473Sopenharmony_ci    }
148e5d0e473Sopenharmony_ci    curPosition_ += offset;
149e5d0e473Sopenharmony_ci    return true;
150e5d0e473Sopenharmony_ci}
151e5d0e473Sopenharmony_ci
152e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecreasePointer(uint32_t offset)
153e5d0e473Sopenharmony_ci{
154e5d0e473Sopenharmony_ci    if (offset > curPosition_) {
155e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push current position invalid.");
156e5d0e473Sopenharmony_ci        return false;
157e5d0e473Sopenharmony_ci    }
158e5d0e473Sopenharmony_ci    curPosition_ -= offset;
159e5d0e473Sopenharmony_ci    return true;
160e5d0e473Sopenharmony_ci}
161e5d0e473Sopenharmony_ci
162e5d0e473Sopenharmony_ci/**
163e5d0e473Sopenharmony_ci * @brief DecodeUintvar
164e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a   section:8.4.2.1 Basic rules
165e5d0e473Sopenharmony_ci * Uintvar-integer = 1*5 OCTET
166e5d0e473Sopenharmony_ci * @param uintVar
167e5d0e473Sopenharmony_ci * @param count
168e5d0e473Sopenharmony_ci * @return true
169e5d0e473Sopenharmony_ci * @return false
170e5d0e473Sopenharmony_ci */
171e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeUintvar(uint32_t &uintVar, uint32_t &count)
172e5d0e473Sopenharmony_ci{
173e5d0e473Sopenharmony_ci    const uint8_t setNotHighestBitZero = 0x80;
174e5d0e473Sopenharmony_ci    const uint8_t setHighestBitZero = 0x7f;
175e5d0e473Sopenharmony_ci
176e5d0e473Sopenharmony_ci    count = 0;
177e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
178e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
179e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
180e5d0e473Sopenharmony_ci        return false;
181e5d0e473Sopenharmony_ci    }
182e5d0e473Sopenharmony_ci    count++;
183e5d0e473Sopenharmony_ci    uintVar = 0;
184e5d0e473Sopenharmony_ci    while ((oneByte & setNotHighestBitZero) != 0) {
185e5d0e473Sopenharmony_ci        uintVar = uintVar << 0x07;
186e5d0e473Sopenharmony_ci        uintVar |= oneByte & setHighestBitZero;
187e5d0e473Sopenharmony_ci
188e5d0e473Sopenharmony_ci        if (!GetOneByte(oneByte)) {
189e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push GetOneByte fail.");
190e5d0e473Sopenharmony_ci            return false;
191e5d0e473Sopenharmony_ci        }
192e5d0e473Sopenharmony_ci        count++;
193e5d0e473Sopenharmony_ci    }
194e5d0e473Sopenharmony_ci    uintVar = uintVar << 0x07;
195e5d0e473Sopenharmony_ci    uintVar |= oneByte & setHighestBitZero;
196e5d0e473Sopenharmony_ci    return true;
197e5d0e473Sopenharmony_ci}
198e5d0e473Sopenharmony_ci
199e5d0e473Sopenharmony_ci/**
200e5d0e473Sopenharmony_ci * @brief DecodeShortLength
201e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a.pdf   section:8.4.2.2 Length
202e5d0e473Sopenharmony_ci * Short-length = <Any octet 0-30>
203e5d0e473Sopenharmony_ci * @param sValueLength
204e5d0e473Sopenharmony_ci * @return true
205e5d0e473Sopenharmony_ci * @return false
206e5d0e473Sopenharmony_ci */
207e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeShortLength(uint8_t &sValueLength)
208e5d0e473Sopenharmony_ci{
209e5d0e473Sopenharmony_ci    const unsigned char minShortOctet = 30;
210e5d0e473Sopenharmony_ci
211e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
212e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
213e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
214e5d0e473Sopenharmony_ci        return false;
215e5d0e473Sopenharmony_ci    }
216e5d0e473Sopenharmony_ci    if (oneByte <= minShortOctet) {
217e5d0e473Sopenharmony_ci        sValueLength = oneByte;
218e5d0e473Sopenharmony_ci        return true;
219e5d0e473Sopenharmony_ci    }
220e5d0e473Sopenharmony_ci    return false;
221e5d0e473Sopenharmony_ci}
222e5d0e473Sopenharmony_ci
223e5d0e473Sopenharmony_ci/**
224e5d0e473Sopenharmony_ci * @brief DecodeValueLengthReturnLen
225e5d0e473Sopenharmony_ci * value-length = short-length | (Length-quote Length)
226e5d0e473Sopenharmony_ci * short-length = 0~30
227e5d0e473Sopenharmony_ci * Length-quote = 31
228e5d0e473Sopenharmony_ci * (Length-quote Length) = Length-quote + Uintvar-length
229e5d0e473Sopenharmony_ci * @param valueLength
230e5d0e473Sopenharmony_ci * @return true
231e5d0e473Sopenharmony_ci * @return false
232e5d0e473Sopenharmony_ci */
233e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeValueLengthReturnLen(uint32_t &valueLength, uint32_t &length)
234e5d0e473Sopenharmony_ci{
235e5d0e473Sopenharmony_ci    const uint8_t lengthQuote = 0x1f;
236e5d0e473Sopenharmony_ci    const uint8_t maxShortLength = 30;
237e5d0e473Sopenharmony_ci
238e5d0e473Sopenharmony_ci    length = 0;
239e5d0e473Sopenharmony_ci    valueLength = 0;
240e5d0e473Sopenharmony_ci    uint32_t uintvar = 0;
241e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
242e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
243e5d0e473Sopenharmony_ci        DecreasePointer(1);
244e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
245e5d0e473Sopenharmony_ci        return false;
246e5d0e473Sopenharmony_ci    }
247e5d0e473Sopenharmony_ci
248e5d0e473Sopenharmony_ci    if (oneByte <= maxShortLength) {
249e5d0e473Sopenharmony_ci        valueLength = oneByte;
250e5d0e473Sopenharmony_ci        length = 1;
251e5d0e473Sopenharmony_ci        return true;
252e5d0e473Sopenharmony_ci    } else if (oneByte == lengthQuote) {
253e5d0e473Sopenharmony_ci        /* Length-quote = 0x1F */
254e5d0e473Sopenharmony_ci        uint32_t count = 0;
255e5d0e473Sopenharmony_ci        if (!DecodeUintvar(uintvar, count)) {
256e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push DecodeUintvar fail.");
257e5d0e473Sopenharmony_ci            return false;
258e5d0e473Sopenharmony_ci        }
259e5d0e473Sopenharmony_ci        valueLength = uintvar;
260e5d0e473Sopenharmony_ci        length = count + 1;
261e5d0e473Sopenharmony_ci        return true;
262e5d0e473Sopenharmony_ci    }
263e5d0e473Sopenharmony_ci    return false;
264e5d0e473Sopenharmony_ci}
265e5d0e473Sopenharmony_ci
266e5d0e473Sopenharmony_ci/**
267e5d0e473Sopenharmony_ci * @brief DecodeValueLength
268e5d0e473Sopenharmony_ci * value-length = short-length | (Length-quote Length)
269e5d0e473Sopenharmony_ci * short-length = 0~30
270e5d0e473Sopenharmony_ci * Length-quote = 31
271e5d0e473Sopenharmony_ci * (Length-quote Length) = Length-quote + Uintvar-length
272e5d0e473Sopenharmony_ci * @param valueLength
273e5d0e473Sopenharmony_ci * @return true
274e5d0e473Sopenharmony_ci * @return false
275e5d0e473Sopenharmony_ci */
276e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeValueLength(uint32_t &valueLength)
277e5d0e473Sopenharmony_ci{
278e5d0e473Sopenharmony_ci    const uint8_t lengthQuote = 0x1f;
279e5d0e473Sopenharmony_ci    const uint8_t maxShortLength = 30;
280e5d0e473Sopenharmony_ci
281e5d0e473Sopenharmony_ci    valueLength = 0;
282e5d0e473Sopenharmony_ci    uint32_t uintvar = 0;
283e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
284e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
285e5d0e473Sopenharmony_ci        DecreasePointer(1);
286e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
287e5d0e473Sopenharmony_ci        return false;
288e5d0e473Sopenharmony_ci    }
289e5d0e473Sopenharmony_ci
290e5d0e473Sopenharmony_ci    if (oneByte <= maxShortLength) {
291e5d0e473Sopenharmony_ci        valueLength = oneByte;
292e5d0e473Sopenharmony_ci        return true;
293e5d0e473Sopenharmony_ci    } else if (oneByte == lengthQuote) {
294e5d0e473Sopenharmony_ci        /* Length-quote = 0x1F */
295e5d0e473Sopenharmony_ci        uint32_t count = 0;
296e5d0e473Sopenharmony_ci        if (!DecodeUintvar(uintvar, count)) {
297e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push DecodeUintvar fail.");
298e5d0e473Sopenharmony_ci            return false;
299e5d0e473Sopenharmony_ci        }
300e5d0e473Sopenharmony_ci        valueLength = uintvar;
301e5d0e473Sopenharmony_ci        return true;
302e5d0e473Sopenharmony_ci    }
303e5d0e473Sopenharmony_ci    return false;
304e5d0e473Sopenharmony_ci}
305e5d0e473Sopenharmony_ci
306e5d0e473Sopenharmony_ci/**
307e5d0e473Sopenharmony_ci * @brief CharIsToken
308e5d0e473Sopenharmony_ci * RFC2616   section:2.2 Basic Rules
309e5d0e473Sopenharmony_ci * CHAR           = <any US-ASCII character (octets 0 - 127)>
310e5d0e473Sopenharmony_ci * CTL            = <any US-ASCII control character
311e5d0e473Sopenharmony_ci *                   (octets 0 - 31) and DEL (127)>
312e5d0e473Sopenharmony_ci * separators     = "(" | ")" | "<" | ">" | "@"
313e5d0e473Sopenharmony_ci *                     | "," | ";" | ":" | "\" | <">
314e5d0e473Sopenharmony_ci *                     | "/" | "[" | "]" | "?" | "="
315e5d0e473Sopenharmony_ci *                     | "{" | "}" | SP | HT
316e5d0e473Sopenharmony_ci * @param oneByte
317e5d0e473Sopenharmony_ci * @return true
318e5d0e473Sopenharmony_ci * @return false
319e5d0e473Sopenharmony_ci */
320e5d0e473Sopenharmony_cibool SmsWapPushBuffer::CharIsToken(uint8_t oneByte)
321e5d0e473Sopenharmony_ci{
322e5d0e473Sopenharmony_ci    const uint8_t minToken = 33;
323e5d0e473Sopenharmony_ci    const uint8_t maxToken = 126;
324e5d0e473Sopenharmony_ci
325e5d0e473Sopenharmony_ci    if (oneByte < minToken || oneByte > maxToken) {
326e5d0e473Sopenharmony_ci        return false;
327e5d0e473Sopenharmony_ci    }
328e5d0e473Sopenharmony_ci
329e5d0e473Sopenharmony_ci    std::set<uint8_t> token = { '"', '(', ')', '/', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' };
330e5d0e473Sopenharmony_ci    return !token.count(oneByte);
331e5d0e473Sopenharmony_ci}
332e5d0e473Sopenharmony_ci
333e5d0e473Sopenharmony_ci/**
334e5d0e473Sopenharmony_ci * @brief DecodeTokenText
335e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a   section:8.4.2.2 Length
336e5d0e473Sopenharmony_ci * Token-text = Token End-of-string
337e5d0e473Sopenharmony_ci * End-of-string = <Octet 0>
338e5d0e473Sopenharmony_ci * @param str
339e5d0e473Sopenharmony_ci * @param len
340e5d0e473Sopenharmony_ci * @return true
341e5d0e473Sopenharmony_ci * @return false
342e5d0e473Sopenharmony_ci */
343e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeTokenText(std::string &str, uint32_t &len)
344e5d0e473Sopenharmony_ci{
345e5d0e473Sopenharmony_ci    const uint8_t minToken = 33;
346e5d0e473Sopenharmony_ci    const uint8_t maxToken = 126;
347e5d0e473Sopenharmony_ci
348e5d0e473Sopenharmony_ci    len = 0;
349e5d0e473Sopenharmony_ci    str.clear();
350e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
351e5d0e473Sopenharmony_ci    if (!PeekOneByte(oneByte)) {
352e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push PeekOneByte fail.");
353e5d0e473Sopenharmony_ci        return false;
354e5d0e473Sopenharmony_ci    }
355e5d0e473Sopenharmony_ci    if (oneByte < minToken || oneByte > maxToken) {
356e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push DecodeTokenText fail.");
357e5d0e473Sopenharmony_ci        return false;
358e5d0e473Sopenharmony_ci    }
359e5d0e473Sopenharmony_ci    while (GetOneByte(oneByte)) {
360e5d0e473Sopenharmony_ci        if (oneByte != 0) {
361e5d0e473Sopenharmony_ci            if (CharIsToken(oneByte)) {
362e5d0e473Sopenharmony_ci                str += oneByte;
363e5d0e473Sopenharmony_ci                len++;
364e5d0e473Sopenharmony_ci            }
365e5d0e473Sopenharmony_ci        } else {
366e5d0e473Sopenharmony_ci            break;
367e5d0e473Sopenharmony_ci        }
368e5d0e473Sopenharmony_ci    }
369e5d0e473Sopenharmony_ci    return (len > 0) ? true : false;
370e5d0e473Sopenharmony_ci}
371e5d0e473Sopenharmony_ci
372e5d0e473Sopenharmony_ci/**
373e5d0e473Sopenharmony_ci * @brief DecodeText
374e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a   section:8.4.2.1 Basic rules
375e5d0e473Sopenharmony_ci * Text-string = [Quote] *TEXT End-of-string
376e5d0e473Sopenharmony_ci * Quote = <Octet 127>
377e5d0e473Sopenharmony_ci * End-of-string = <Octet 0>
378e5d0e473Sopenharmony_ci * @param str
379e5d0e473Sopenharmony_ci * @param len
380e5d0e473Sopenharmony_ci * @return true
381e5d0e473Sopenharmony_ci * @return false
382e5d0e473Sopenharmony_ci */
383e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeText(std::string &str, uint32_t &len)
384e5d0e473Sopenharmony_ci{
385e5d0e473Sopenharmony_ci    const unsigned char quoteChar = 127;
386e5d0e473Sopenharmony_ci
387e5d0e473Sopenharmony_ci    len = 0;
388e5d0e473Sopenharmony_ci    str.clear();
389e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
390e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
391e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
392e5d0e473Sopenharmony_ci        return false;
393e5d0e473Sopenharmony_ci    }
394e5d0e473Sopenharmony_ci
395e5d0e473Sopenharmony_ci    // ignore quote
396e5d0e473Sopenharmony_ci    if (oneByte != quoteChar) {
397e5d0e473Sopenharmony_ci        this->DecreasePointer(1);
398e5d0e473Sopenharmony_ci    } else {
399e5d0e473Sopenharmony_ci        len++;
400e5d0e473Sopenharmony_ci    }
401e5d0e473Sopenharmony_ci
402e5d0e473Sopenharmony_ci    while (GetOneByte(oneByte)) {
403e5d0e473Sopenharmony_ci        if (oneByte != 0) {
404e5d0e473Sopenharmony_ci            str += oneByte;
405e5d0e473Sopenharmony_ci            len++;
406e5d0e473Sopenharmony_ci        } else {
407e5d0e473Sopenharmony_ci            break;
408e5d0e473Sopenharmony_ci        }
409e5d0e473Sopenharmony_ci    }
410e5d0e473Sopenharmony_ci    return (len > 0) ? true : false;
411e5d0e473Sopenharmony_ci}
412e5d0e473Sopenharmony_ci
413e5d0e473Sopenharmony_ci/**
414e5d0e473Sopenharmony_ci * @brief DecodeQuotedText
415e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a   section:8.4.2.1 Basic rules
416e5d0e473Sopenharmony_ci * Quoted-string = <Octet 34> *TEXT End-of-string
417e5d0e473Sopenharmony_ci * The TEXT encodes an RFC2616 Quoted-string with the enclosing quotation-marks <"> removed
418e5d0e473Sopenharmony_ci * @param str
419e5d0e473Sopenharmony_ci * @param len
420e5d0e473Sopenharmony_ci * @return true
421e5d0e473Sopenharmony_ci * @return false
422e5d0e473Sopenharmony_ci */
423e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeQuotedText(std::string &str, uint32_t &len)
424e5d0e473Sopenharmony_ci{
425e5d0e473Sopenharmony_ci    const uint8_t quotedFlag = 0x22;
426e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
427e5d0e473Sopenharmony_ci    len = 0;
428e5d0e473Sopenharmony_ci    str.clear();
429e5d0e473Sopenharmony_ci    while (GetOneByte(oneByte)) {
430e5d0e473Sopenharmony_ci        if (oneByte != 0) {
431e5d0e473Sopenharmony_ci            if (oneByte != quotedFlag) {
432e5d0e473Sopenharmony_ci                str += oneByte;
433e5d0e473Sopenharmony_ci            }
434e5d0e473Sopenharmony_ci            len++;
435e5d0e473Sopenharmony_ci        } else {
436e5d0e473Sopenharmony_ci            break;
437e5d0e473Sopenharmony_ci        }
438e5d0e473Sopenharmony_ci    }
439e5d0e473Sopenharmony_ci    return (len > 0) ? true : false;
440e5d0e473Sopenharmony_ci}
441e5d0e473Sopenharmony_ci
442e5d0e473Sopenharmony_ci/**
443e5d0e473Sopenharmony_ci * @brief DecodeShortInteger
444e5d0e473Sopenharmony_ci * wap-230-wsp-20010705-a   section:8.4.2.1 Basic rules
445e5d0e473Sopenharmony_ci * Short-integer = OCTET
446e5d0e473Sopenharmony_ci * Integers in range 0-127 shall be encoded as a one octet value with
447e5d0e473Sopenharmony_ci * the most significant bit set to one (1xxx xxxx) and with the value
448e5d0e473Sopenharmony_ci * in the remaining least significant bits
449e5d0e473Sopenharmony_ci * @param sInteger
450e5d0e473Sopenharmony_ci * @return true
451e5d0e473Sopenharmony_ci * @return false
452e5d0e473Sopenharmony_ci */
453e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeShortInteger(uint8_t &sInteger)
454e5d0e473Sopenharmony_ci{
455e5d0e473Sopenharmony_ci    const uint8_t setHighestBitZero = 0x7f;
456e5d0e473Sopenharmony_ci    const uint8_t maxShortInteger = 0x7f;
457e5d0e473Sopenharmony_ci
458e5d0e473Sopenharmony_ci    sInteger = 0;
459e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
460e5d0e473Sopenharmony_ci    if (!GetOneByte(oneByte)) {
461e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
462e5d0e473Sopenharmony_ci        return false;
463e5d0e473Sopenharmony_ci    }
464e5d0e473Sopenharmony_ci    if (oneByte > maxShortInteger) {
465e5d0e473Sopenharmony_ci        sInteger = oneByte & setHighestBitZero;
466e5d0e473Sopenharmony_ci        return true;
467e5d0e473Sopenharmony_ci    }
468e5d0e473Sopenharmony_ci    return false;
469e5d0e473Sopenharmony_ci}
470e5d0e473Sopenharmony_ci
471e5d0e473Sopenharmony_ci/**
472e5d0e473Sopenharmony_ci * @brief DecodeLongInteger
473e5d0e473Sopenharmony_ci * Long-integer = [Short-length] [Multi-octet-integer]
474e5d0e473Sopenharmony_ci * Short-length = 1 byte
475e5d0e473Sopenharmony_ci * Multi-octet-integer = <Short-length> bytes
476e5d0e473Sopenharmony_ci * @param value
477e5d0e473Sopenharmony_ci * @return true
478e5d0e473Sopenharmony_ci * @return false
479e5d0e473Sopenharmony_ci */
480e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeLongInteger(uint64_t &value)
481e5d0e473Sopenharmony_ci{
482e5d0e473Sopenharmony_ci    unsigned char oneByte = 0;
483e5d0e473Sopenharmony_ci    uint64_t result = 0;
484e5d0e473Sopenharmony_ci    uint32_t valuelength = 0;
485e5d0e473Sopenharmony_ci    if (GetOneByte(oneByte) != true) {
486e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
487e5d0e473Sopenharmony_ci        return false;
488e5d0e473Sopenharmony_ci    }
489e5d0e473Sopenharmony_ci    if (oneByte > LONG_VALUE_LEN_MAX) {
490e5d0e473Sopenharmony_ci        return false;
491e5d0e473Sopenharmony_ci    }
492e5d0e473Sopenharmony_ci    valuelength = oneByte;
493e5d0e473Sopenharmony_ci
494e5d0e473Sopenharmony_ci    for (uint32_t i = 0; i < valuelength; i++) {
495e5d0e473Sopenharmony_ci        if (GetOneByte(oneByte) != true) {
496e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push GetOneByte fail.");
497e5d0e473Sopenharmony_ci            return false;
498e5d0e473Sopenharmony_ci        }
499e5d0e473Sopenharmony_ci        result = (result << 0x08);
500e5d0e473Sopenharmony_ci        result |= oneByte;
501e5d0e473Sopenharmony_ci    }
502e5d0e473Sopenharmony_ci    value = result;
503e5d0e473Sopenharmony_ci    return true;
504e5d0e473Sopenharmony_ci}
505e5d0e473Sopenharmony_ci
506e5d0e473Sopenharmony_ci/**
507e5d0e473Sopenharmony_ci * @brief DecodeInteger
508e5d0e473Sopenharmony_ci * Integer-Value = Short-integer | Long-integer
509e5d0e473Sopenharmony_ci * @param iInteger
510e5d0e473Sopenharmony_ci * @return true
511e5d0e473Sopenharmony_ci * @return false
512e5d0e473Sopenharmony_ci */
513e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeInteger(uint64_t &iInteger)
514e5d0e473Sopenharmony_ci{
515e5d0e473Sopenharmony_ci    iInteger = 0;
516e5d0e473Sopenharmony_ci    if (DecodeIsShortInt()) {
517e5d0e473Sopenharmony_ci        uint8_t sInteger = 0;
518e5d0e473Sopenharmony_ci        if (DecodeShortInteger(sInteger)) {
519e5d0e473Sopenharmony_ci            iInteger = sInteger;
520e5d0e473Sopenharmony_ci            return true;
521e5d0e473Sopenharmony_ci        }
522e5d0e473Sopenharmony_ci    } else {
523e5d0e473Sopenharmony_ci        if (DecodeLongInteger(iInteger)) {
524e5d0e473Sopenharmony_ci            return true;
525e5d0e473Sopenharmony_ci        }
526e5d0e473Sopenharmony_ci    }
527e5d0e473Sopenharmony_ci    return false;
528e5d0e473Sopenharmony_ci}
529e5d0e473Sopenharmony_ci
530e5d0e473Sopenharmony_ci/**
531e5d0e473Sopenharmony_ci * @brief DecodeIsShortInt
532e5d0e473Sopenharmony_ci * (128 - 255) It is an encoded 7-bit value; this header has no more data
533e5d0e473Sopenharmony_ci * @return true
534e5d0e473Sopenharmony_ci * @return false
535e5d0e473Sopenharmony_ci */
536e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeIsShortInt()
537e5d0e473Sopenharmony_ci{
538e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
539e5d0e473Sopenharmony_ci    PeekOneByte(oneByte);
540e5d0e473Sopenharmony_ci    if (oneByte > 0x7F) {
541e5d0e473Sopenharmony_ci        return true;
542e5d0e473Sopenharmony_ci    }
543e5d0e473Sopenharmony_ci    return false;
544e5d0e473Sopenharmony_ci}
545e5d0e473Sopenharmony_ci
546e5d0e473Sopenharmony_ci/**
547e5d0e473Sopenharmony_ci * @brief DecodeIsString
548e5d0e473Sopenharmony_ci * (32 - 127) The value is a text string, terminated by a zero octet (NUL character)
549e5d0e473Sopenharmony_ci * @return true
550e5d0e473Sopenharmony_ci * @return false
551e5d0e473Sopenharmony_ci */
552e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeIsString()
553e5d0e473Sopenharmony_ci{
554e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
555e5d0e473Sopenharmony_ci    PeekOneByte(oneByte);
556e5d0e473Sopenharmony_ci    if (0x20 <= oneByte && 0x7f >= oneByte) {
557e5d0e473Sopenharmony_ci        return true;
558e5d0e473Sopenharmony_ci    }
559e5d0e473Sopenharmony_ci    return false;
560e5d0e473Sopenharmony_ci}
561e5d0e473Sopenharmony_ci
562e5d0e473Sopenharmony_ci/**
563e5d0e473Sopenharmony_ci * @brief DecodeIsValueLength
564e5d0e473Sopenharmony_ci * (0 - 30) This octet is followed by the indicated number (0 –30) of data octets
565e5d0e473Sopenharmony_ci * 31 This octet is followed by a uintvar, which indicates the number of data octets after it
566e5d0e473Sopenharmony_ci * @return true
567e5d0e473Sopenharmony_ci * @return false
568e5d0e473Sopenharmony_ci */
569e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeIsValueLength()
570e5d0e473Sopenharmony_ci{
571e5d0e473Sopenharmony_ci    uint8_t oneByte = 0;
572e5d0e473Sopenharmony_ci    PeekOneByte(oneByte);
573e5d0e473Sopenharmony_ci    if (oneByte <= 0x1f) {
574e5d0e473Sopenharmony_ci        return true;
575e5d0e473Sopenharmony_ci    }
576e5d0e473Sopenharmony_ci    return false;
577e5d0e473Sopenharmony_ci}
578e5d0e473Sopenharmony_ci
579e5d0e473Sopenharmony_ci/**
580e5d0e473Sopenharmony_ci * @brief DecodeExtensionMedia
581e5d0e473Sopenharmony_ci *
582e5d0e473Sopenharmony_ci * @return true
583e5d0e473Sopenharmony_ci * @return false
584e5d0e473Sopenharmony_ci */
585e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeExtensionMedia()
586e5d0e473Sopenharmony_ci{
587e5d0e473Sopenharmony_ci    return false;
588e5d0e473Sopenharmony_ci}
589e5d0e473Sopenharmony_ci
590e5d0e473Sopenharmony_ci/**
591e5d0e473Sopenharmony_ci * @brief DecodeConstrainedEncoding
592e5d0e473Sopenharmony_ci *
593e5d0e473Sopenharmony_ci * @return true
594e5d0e473Sopenharmony_ci * @return false
595e5d0e473Sopenharmony_ci */
596e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeConstrainedEncoding()
597e5d0e473Sopenharmony_ci{
598e5d0e473Sopenharmony_ci    return false;
599e5d0e473Sopenharmony_ci}
600e5d0e473Sopenharmony_ci
601e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeTextValue(std::string &str, bool &isNoValue)
602e5d0e473Sopenharmony_ci{
603e5d0e473Sopenharmony_ci    const uint8_t minTextToken = 31;
604e5d0e473Sopenharmony_ci
605e5d0e473Sopenharmony_ci    str.clear();
606e5d0e473Sopenharmony_ci    unsigned char oneByte = 0;
607e5d0e473Sopenharmony_ci    if (GetOneByte(oneByte) != true) {
608e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
609e5d0e473Sopenharmony_ci        return false;
610e5d0e473Sopenharmony_ci    }
611e5d0e473Sopenharmony_ci    if ((oneByte & 0x80) == 0x00 && oneByte > minTextToken) {
612e5d0e473Sopenharmony_ci        std::string field = "";
613e5d0e473Sopenharmony_ci        uint32_t fieldLength = 0;
614e5d0e473Sopenharmony_ci        if (!DecodeTokenText(field, fieldLength)) {
615e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push DecodeTokenText fail.");
616e5d0e473Sopenharmony_ci            return false;
617e5d0e473Sopenharmony_ci        }
618e5d0e473Sopenharmony_ci    } else {
619e5d0e473Sopenharmony_ci        uint64_t fieldId = 0;
620e5d0e473Sopenharmony_ci        if (!DecodeInteger(fieldId)) {
621e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push DecodeInteger fail.");
622e5d0e473Sopenharmony_ci            return false;
623e5d0e473Sopenharmony_ci        }
624e5d0e473Sopenharmony_ci    }
625e5d0e473Sopenharmony_ci    bool bNoValue = false;
626e5d0e473Sopenharmony_ci    if (!DecodeNoValue(bNoValue)) {
627e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push DecodeNoValue fail.");
628e5d0e473Sopenharmony_ci        return false;
629e5d0e473Sopenharmony_ci    }
630e5d0e473Sopenharmony_ci    if (bNoValue) {
631e5d0e473Sopenharmony_ci        isNoValue = true;
632e5d0e473Sopenharmony_ci        return true;
633e5d0e473Sopenharmony_ci    } else {
634e5d0e473Sopenharmony_ci        if (DecreasePointer(1) != true) {
635e5d0e473Sopenharmony_ci            TELEPHONY_LOGE("wap push DecreasePointer fail.");
636e5d0e473Sopenharmony_ci            return false;
637e5d0e473Sopenharmony_ci        }
638e5d0e473Sopenharmony_ci    }
639e5d0e473Sopenharmony_ci    uint64_t fieldValue = 0;
640e5d0e473Sopenharmony_ci    if (DecodeInteger(fieldValue)) {
641e5d0e473Sopenharmony_ci        str = std::to_string(fieldValue);
642e5d0e473Sopenharmony_ci        return true;
643e5d0e473Sopenharmony_ci    }
644e5d0e473Sopenharmony_ci    uint32_t valueLength = 0;
645e5d0e473Sopenharmony_ci    if (DecodeTokenText(str, valueLength)) {
646e5d0e473Sopenharmony_ci        if (str.length() > 1 && str.at(0) == '\"') {
647e5d0e473Sopenharmony_ci            str = str.substr(1, str.length() - 1);
648e5d0e473Sopenharmony_ci        }
649e5d0e473Sopenharmony_ci        return true;
650e5d0e473Sopenharmony_ci    }
651e5d0e473Sopenharmony_ci    return false;
652e5d0e473Sopenharmony_ci}
653e5d0e473Sopenharmony_ci
654e5d0e473Sopenharmony_cibool SmsWapPushBuffer::DecodeNoValue(bool &isNoValue)
655e5d0e473Sopenharmony_ci{
656e5d0e473Sopenharmony_ci    unsigned char oneByte = 0;
657e5d0e473Sopenharmony_ci    if (GetOneByte(oneByte) != true) {
658e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("wap push GetOneByte fail.");
659e5d0e473Sopenharmony_ci        return false;
660e5d0e473Sopenharmony_ci    }
661e5d0e473Sopenharmony_ci    isNoValue = (oneByte == 0) ? true : false;
662e5d0e473Sopenharmony_ci    return true;
663e5d0e473Sopenharmony_ci}
664e5d0e473Sopenharmony_ci
665e5d0e473Sopenharmony_civoid SmsWapPushBuffer::MarkPosition()
666e5d0e473Sopenharmony_ci{
667e5d0e473Sopenharmony_ci    savePosition_ = curPosition_;
668e5d0e473Sopenharmony_ci}
669e5d0e473Sopenharmony_ci
670e5d0e473Sopenharmony_civoid SmsWapPushBuffer::UnMarkPosition()
671e5d0e473Sopenharmony_ci{
672e5d0e473Sopenharmony_ci    curPosition_ = savePosition_;
673e5d0e473Sopenharmony_ci}
674e5d0e473Sopenharmony_ci} // namespace Telephony
675e5d0e473Sopenharmony_ci} // namespace OHOS
676