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