1e0e9324cSopenharmony_ci/* 2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd. 3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License. 5e0e9324cSopenharmony_ci * You may obtain a copy of the License at 6e0e9324cSopenharmony_ci * 7e0e9324cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0e9324cSopenharmony_ci * 9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and 13e0e9324cSopenharmony_ci * limitations under the License. 14e0e9324cSopenharmony_ci */ 15e0e9324cSopenharmony_ci 16e0e9324cSopenharmony_ci#include "utils.h" 17e0e9324cSopenharmony_ci#include <cstdlib> 18e0e9324cSopenharmony_ci#include <cstring> 19e0e9324cSopenharmony_ci#include <fstream> 20e0e9324cSopenharmony_ci#include <securec.h> 21e0e9324cSopenharmony_ci#include <sstream> 22e0e9324cSopenharmony_ci#include <sys/time.h> 23e0e9324cSopenharmony_ci#include <thread> 24e0e9324cSopenharmony_ci#include "common/common_macro.h" 25e0e9324cSopenharmony_ci#include "common/media_log.h" 26e0e9324cSopenharmony_ci 27e0e9324cSopenharmony_cinamespace OHOS { 28e0e9324cSopenharmony_cinamespace Sharing { 29e0e9324cSopenharmony_ciunsigned long long GetThreadId() 30e0e9324cSopenharmony_ci{ 31e0e9324cSopenharmony_ci std::thread::id tid = std::this_thread::get_id(); 32e0e9324cSopenharmony_ci std::stringstream buf; 33e0e9324cSopenharmony_ci buf << tid; 34e0e9324cSopenharmony_ci std::string stid = buf.str(); 35e0e9324cSopenharmony_ci return std::stoull(stid); 36e0e9324cSopenharmony_ci} 37e0e9324cSopenharmony_ci 38e0e9324cSopenharmony_cistd::vector<std::string> Split(const std::string &s, const char *delim) 39e0e9324cSopenharmony_ci{ 40e0e9324cSopenharmony_ci std::vector<std::string> ret; 41e0e9324cSopenharmony_ci if (delim == nullptr) { 42e0e9324cSopenharmony_ci return ret; 43e0e9324cSopenharmony_ci } 44e0e9324cSopenharmony_ci 45e0e9324cSopenharmony_ci size_t last = 0; 46e0e9324cSopenharmony_ci auto index = s.find(delim, last); 47e0e9324cSopenharmony_ci while (index != std::string::npos) { 48e0e9324cSopenharmony_ci if (index - last > 0) { 49e0e9324cSopenharmony_ci ret.push_back(s.substr(last, index - last)); 50e0e9324cSopenharmony_ci } 51e0e9324cSopenharmony_ci last = index + strlen(delim); 52e0e9324cSopenharmony_ci index = s.find(delim, last); 53e0e9324cSopenharmony_ci } 54e0e9324cSopenharmony_ci if (!s.size() || s.size() - last > 0) { 55e0e9324cSopenharmony_ci ret.push_back(s.substr(last)); 56e0e9324cSopenharmony_ci } 57e0e9324cSopenharmony_ci 58e0e9324cSopenharmony_ci return ret; 59e0e9324cSopenharmony_ci} 60e0e9324cSopenharmony_ci 61e0e9324cSopenharmony_cistd::vector<std::string> SplitOnce(const std::string &s, const char *delim) 62e0e9324cSopenharmony_ci{ 63e0e9324cSopenharmony_ci std::vector<std::string> ret; 64e0e9324cSopenharmony_ci if (delim == nullptr) { 65e0e9324cSopenharmony_ci return ret; 66e0e9324cSopenharmony_ci } 67e0e9324cSopenharmony_ci size_t last = 0; 68e0e9324cSopenharmony_ci auto index = s.find(delim, last); 69e0e9324cSopenharmony_ci if (index != std::string::npos) { 70e0e9324cSopenharmony_ci ret.push_back(s.substr(0, index)); 71e0e9324cSopenharmony_ci ret.push_back(s.substr(index + 1)); 72e0e9324cSopenharmony_ci } else { 73e0e9324cSopenharmony_ci ret.push_back(s); 74e0e9324cSopenharmony_ci } 75e0e9324cSopenharmony_ci 76e0e9324cSopenharmony_ci return ret; 77e0e9324cSopenharmony_ci} 78e0e9324cSopenharmony_ci 79e0e9324cSopenharmony_ci#define TRIM(s, chars) \ 80e0e9324cSopenharmony_ci do { \ 81e0e9324cSopenharmony_ci std::string map(0xFF, '\0'); \ 82e0e9324cSopenharmony_ci for (auto &ch : (chars)) { \ 83e0e9324cSopenharmony_ci map[(unsigned char &)ch] = '\1'; \ 84e0e9324cSopenharmony_ci } \ 85e0e9324cSopenharmony_ci while ((s).size() && map.at((unsigned char &)(s).back())) \ 86e0e9324cSopenharmony_ci (s).pop_back(); \ 87e0e9324cSopenharmony_ci while ((s).size() && map.at((unsigned char &)(s).front())) \ 88e0e9324cSopenharmony_ci (s).erase(0, 1); \ 89e0e9324cSopenharmony_ci } while (0) 90e0e9324cSopenharmony_ci 91e0e9324cSopenharmony_cistd::string &Trim(std::string &s, const std::string &chars) 92e0e9324cSopenharmony_ci{ 93e0e9324cSopenharmony_ci TRIM(s, chars); 94e0e9324cSopenharmony_ci return s; 95e0e9324cSopenharmony_ci} 96e0e9324cSopenharmony_ci 97e0e9324cSopenharmony_cistd::string Trim(std::string &&s, const std::string &chars) 98e0e9324cSopenharmony_ci{ 99e0e9324cSopenharmony_ci TRIM(s, chars); 100e0e9324cSopenharmony_ci return std::move(s); 101e0e9324cSopenharmony_ci} 102e0e9324cSopenharmony_ci 103e0e9324cSopenharmony_ci#define ADD_VECTOR_END(v, i) (v).push_back((i)) 104e0e9324cSopenharmony_ci 105e0e9324cSopenharmony_cistd::string LowerCase(std::string value) 106e0e9324cSopenharmony_ci{ 107e0e9324cSopenharmony_ci return ChangeCase(value, true); 108e0e9324cSopenharmony_ci} 109e0e9324cSopenharmony_ci 110e0e9324cSopenharmony_cistd::string UpperCase(std::string value) 111e0e9324cSopenharmony_ci{ 112e0e9324cSopenharmony_ci return ChangeCase(value, false); 113e0e9324cSopenharmony_ci} 114e0e9324cSopenharmony_ci 115e0e9324cSopenharmony_civoid LTrim(std::string &value) 116e0e9324cSopenharmony_ci{ 117e0e9324cSopenharmony_ci std::string::size_type i = 0; 118e0e9324cSopenharmony_ci for (i = 0; i < value.length(); i++) { 119e0e9324cSopenharmony_ci if (value[i] != ' ' && value[i] != '\t' && value[i] != '\n' && value[i] != '\r') 120e0e9324cSopenharmony_ci break; 121e0e9324cSopenharmony_ci } 122e0e9324cSopenharmony_ci value = value.substr(i); 123e0e9324cSopenharmony_ci} 124e0e9324cSopenharmony_ci 125e0e9324cSopenharmony_civoid RTrim(std::string &value) 126e0e9324cSopenharmony_ci{ 127e0e9324cSopenharmony_ci int32_t i = 0; 128e0e9324cSopenharmony_ci for (i = (int32_t)value.length() - 1; i >= 0; i--) { 129e0e9324cSopenharmony_ci if (value[i] != ' ' && value[i] != '\t' && value[i] != '\n' && value[i] != '\r') 130e0e9324cSopenharmony_ci break; 131e0e9324cSopenharmony_ci } 132e0e9324cSopenharmony_ci value = value.substr(0, i + 1); 133e0e9324cSopenharmony_ci} 134e0e9324cSopenharmony_ci 135e0e9324cSopenharmony_civoid Trim(std::string &value) 136e0e9324cSopenharmony_ci{ 137e0e9324cSopenharmony_ci LTrim(value); 138e0e9324cSopenharmony_ci RTrim(value); 139e0e9324cSopenharmony_ci} 140e0e9324cSopenharmony_ci 141e0e9324cSopenharmony_cistd::string ChangeCase(const std::string &value, bool LowerCase) 142e0e9324cSopenharmony_ci{ 143e0e9324cSopenharmony_ci std::string newvalue(value); 144e0e9324cSopenharmony_ci for (std::string::size_type i = 0, l = newvalue.length(); i < l; ++i) 145e0e9324cSopenharmony_ci newvalue[i] = LowerCase ? tolower(newvalue[i]) : toupper(newvalue[i]); 146e0e9324cSopenharmony_ci return newvalue; 147e0e9324cSopenharmony_ci} 148e0e9324cSopenharmony_ci 149e0e9324cSopenharmony_civoid Replace(std::string &target, std::string search, std::string replacement) 150e0e9324cSopenharmony_ci{ 151e0e9324cSopenharmony_ci if (search == replacement) { 152e0e9324cSopenharmony_ci return; 153e0e9324cSopenharmony_ci } 154e0e9324cSopenharmony_ci 155e0e9324cSopenharmony_ci if (search == "") { 156e0e9324cSopenharmony_ci return; 157e0e9324cSopenharmony_ci } 158e0e9324cSopenharmony_ci 159e0e9324cSopenharmony_ci std::string::size_type i = std::string::npos; 160e0e9324cSopenharmony_ci std::string::size_type lastPos = 0; 161e0e9324cSopenharmony_ci while ((i = target.find(search, lastPos)) != std::string::npos) { 162e0e9324cSopenharmony_ci target.replace(i, search.length(), replacement); 163e0e9324cSopenharmony_ci lastPos = i + replacement.length(); 164e0e9324cSopenharmony_ci } 165e0e9324cSopenharmony_ci} 166e0e9324cSopenharmony_ci 167e0e9324cSopenharmony_civoid Split(std::string str, std::string separator, std::vector<std::string> &result) 168e0e9324cSopenharmony_ci{ 169e0e9324cSopenharmony_ci result.clear(); 170e0e9324cSopenharmony_ci std::string::size_type position = str.find(separator); 171e0e9324cSopenharmony_ci std::string::size_type lastPosition = 0; 172e0e9324cSopenharmony_ci uint32_t separatorLength = separator.length(); 173e0e9324cSopenharmony_ci 174e0e9324cSopenharmony_ci while (position != str.npos) { 175e0e9324cSopenharmony_ci ADD_VECTOR_END(result, str.substr(lastPosition, position - lastPosition)); 176e0e9324cSopenharmony_ci lastPosition = position + separatorLength; 177e0e9324cSopenharmony_ci position = str.find(separator, lastPosition); 178e0e9324cSopenharmony_ci } 179e0e9324cSopenharmony_ci ADD_VECTOR_END(result, str.substr(lastPosition, std::string::npos)); 180e0e9324cSopenharmony_ci} 181e0e9324cSopenharmony_ci 182e0e9324cSopenharmony_ciuint64_t GetCurrentMillisecond() 183e0e9324cSopenharmony_ci{ 184e0e9324cSopenharmony_ci struct timeval tv { 185e0e9324cSopenharmony_ci }; 186e0e9324cSopenharmony_ci gettimeofday(&tv, nullptr); 187e0e9324cSopenharmony_ci return tv.tv_sec * 1000 + tv.tv_usec / 1000; // 1000: time base conversion. 188e0e9324cSopenharmony_ci} 189e0e9324cSopenharmony_ci 190e0e9324cSopenharmony_civoid SaveFile(const char *data, int32_t dataSize, const std::string &fileName) 191e0e9324cSopenharmony_ci{ 192e0e9324cSopenharmony_ci RETURN_IF_NULL(data); 193e0e9324cSopenharmony_ci std::ofstream out(fileName, std::ios::out | std::ios::binary); 194e0e9324cSopenharmony_ci if (!out.is_open()) { 195e0e9324cSopenharmony_ci SHARING_LOGD("failed to opne file: %{public}s", fileName.c_str()); 196e0e9324cSopenharmony_ci return; 197e0e9324cSopenharmony_ci } 198e0e9324cSopenharmony_ci 199e0e9324cSopenharmony_ci out.write(data, dataSize); 200e0e9324cSopenharmony_ci out.flush(); 201e0e9324cSopenharmony_ci out.close(); 202e0e9324cSopenharmony_ci} 203e0e9324cSopenharmony_ci 204e0e9324cSopenharmony_civoid NeonMemcpy(volatile unsigned char *dst, volatile unsigned char *src, int size) 205e0e9324cSopenharmony_ci{ 206e0e9324cSopenharmony_ci#if defined(__ARM_NEON__) 207e0e9324cSopenharmony_ci int neonCopy = size - size % 64; 208e0e9324cSopenharmony_ci if (neonCopy > 0) { 209e0e9324cSopenharmony_ci int tempCount = neonCopy; 210e0e9324cSopenharmony_ci asm volatile("NEONCopyPLD_%=: \n" 211e0e9324cSopenharmony_ci " VLDM %[src]!,{d0-d7} \n" 212e0e9324cSopenharmony_ci " VSTM %[dst]!,{d0-d7} \n" 213e0e9324cSopenharmony_ci " SUBS %[tempCount],%[tempCount],#0x40 \n" 214e0e9324cSopenharmony_ci " BGT NEONCopyPLD_%= \n" 215e0e9324cSopenharmony_ci : [dst] "+r"(dst), [src] "+r"(src), [tempCount] "+r"(tempCount)::"d0", "d1", "d2", "d3", "d4", 216e0e9324cSopenharmony_ci "d5", "d6", "d7", "cc", "memory"); 217e0e9324cSopenharmony_ci } 218e0e9324cSopenharmony_ci if (size - neonCopy > 0) { 219e0e9324cSopenharmony_ci auto ret = memcpy_s((void *)dst, size - neonCopy, (void *)src, size - neonCopy); 220e0e9324cSopenharmony_ci if (ret != EOK) { 221e0e9324cSopenharmony_ci return; 222e0e9324cSopenharmony_ci } 223e0e9324cSopenharmony_ci } 224e0e9324cSopenharmony_ci#else 225e0e9324cSopenharmony_ci if (size > 0) { 226e0e9324cSopenharmony_ci auto ret = memcpy_s((void *)dst, size, (void *)src, size); 227e0e9324cSopenharmony_ci if (ret != EOK) { 228e0e9324cSopenharmony_ci return; 229e0e9324cSopenharmony_ci } 230e0e9324cSopenharmony_ci } 231e0e9324cSopenharmony_ci#endif 232e0e9324cSopenharmony_ci} 233e0e9324cSopenharmony_ci 234e0e9324cSopenharmony_ciuint16_t SwapEndian16(uint16_t value) 235e0e9324cSopenharmony_ci{ 236e0e9324cSopenharmony_ci return (value & 0xff00) >> 8 | (value & 0x00ff) << 8; // 8: swap endian 237e0e9324cSopenharmony_ci} 238e0e9324cSopenharmony_ci 239e0e9324cSopenharmony_ciuint32_t SwapEndian32(uint32_t value) 240e0e9324cSopenharmony_ci{ 241e0e9324cSopenharmony_ci uint8_t res[4]; 242e0e9324cSopenharmony_ci for (int i = 0; i < 4; ++i) { // 4: swap endian 243e0e9324cSopenharmony_ci res[i] = ((uint8_t *)&value)[3 - i]; // 3: swap endian 244e0e9324cSopenharmony_ci } 245e0e9324cSopenharmony_ci return *(uint32_t *)res; 246e0e9324cSopenharmony_ci} 247e0e9324cSopenharmony_ci 248e0e9324cSopenharmony_ciuint64_t SwapEndian64(uint64_t value) 249e0e9324cSopenharmony_ci{ 250e0e9324cSopenharmony_ci uint8_t res[8]; 251e0e9324cSopenharmony_ci for (int i = 0; i < 8; ++i) { // 8: swap endian 252e0e9324cSopenharmony_ci res[i] = ((uint8_t *)&value)[7 - i]; // 7: swap endian 253e0e9324cSopenharmony_ci } 254e0e9324cSopenharmony_ci return *(uint64_t *)res; 255e0e9324cSopenharmony_ci} 256e0e9324cSopenharmony_ci 257e0e9324cSopenharmony_ciuint16_t LoadBE16(const uint8_t *p) 258e0e9324cSopenharmony_ci{ 259e0e9324cSopenharmony_ci RETURN_INVALID_IF_NULL(p); 260e0e9324cSopenharmony_ci return SwapEndian16(*(uint16_t *)p); 261e0e9324cSopenharmony_ci} 262e0e9324cSopenharmony_ci 263e0e9324cSopenharmony_ciuint32_t LoadBE24(const uint8_t *p) 264e0e9324cSopenharmony_ci{ 265e0e9324cSopenharmony_ci RETURN_INVALID_IF_NULL(p); 266e0e9324cSopenharmony_ci uint8_t res[4] = {0, p[0], p[1], p[2]}; 267e0e9324cSopenharmony_ci return SwapEndian32(*(uint32_t *)res); 268e0e9324cSopenharmony_ci} 269e0e9324cSopenharmony_ci 270e0e9324cSopenharmony_ciuint32_t LoadBE32(const uint8_t *p) 271e0e9324cSopenharmony_ci{ 272e0e9324cSopenharmony_ci RETURN_INVALID_IF_NULL(p); 273e0e9324cSopenharmony_ci return SwapEndian32(*(uint32_t *)p); 274e0e9324cSopenharmony_ci} 275e0e9324cSopenharmony_ci 276e0e9324cSopenharmony_ciuint64_t LoadBE64(const uint8_t *p) 277e0e9324cSopenharmony_ci{ 278e0e9324cSopenharmony_ci RETURN_INVALID_IF_NULL(p); 279e0e9324cSopenharmony_ci return SwapEndian64(*(uint64_t *)p); 280e0e9324cSopenharmony_ci} 281e0e9324cSopenharmony_ci 282e0e9324cSopenharmony_civoid SetBE24(void *p, uint32_t val) 283e0e9324cSopenharmony_ci{ 284e0e9324cSopenharmony_ci RETURN_IF_NULL(p); 285e0e9324cSopenharmony_ci uint8_t *data = (uint8_t *)p; 286e0e9324cSopenharmony_ci data[0] = val >> 16; // 16: byte offset 287e0e9324cSopenharmony_ci data[1] = val >> 8; // 8: byte offset 288e0e9324cSopenharmony_ci data[2] = val; // 2: transformed position 289e0e9324cSopenharmony_ci} 290e0e9324cSopenharmony_ci 291e0e9324cSopenharmony_civoid SetBE32(void *p, uint32_t val) 292e0e9324cSopenharmony_ci{ 293e0e9324cSopenharmony_ci RETURN_IF_NULL(p); 294e0e9324cSopenharmony_ci uint8_t *data = (uint8_t *)p; 295e0e9324cSopenharmony_ci data[3] = val; // 3: transformed position 296e0e9324cSopenharmony_ci data[2] = val >> 8; // 2: transformed position, 8: byte offset 297e0e9324cSopenharmony_ci data[1] = val >> 16; // 16: byte offset 298e0e9324cSopenharmony_ci data[0] = val >> 24; // 24: byte offset 299e0e9324cSopenharmony_ci} 300e0e9324cSopenharmony_ci 301e0e9324cSopenharmony_civoid SetLE32(void *p, uint32_t val) 302e0e9324cSopenharmony_ci{ 303e0e9324cSopenharmony_ci RETURN_IF_NULL(p); 304e0e9324cSopenharmony_ci uint8_t *data = (uint8_t *)p; 305e0e9324cSopenharmony_ci data[0] = val; 306e0e9324cSopenharmony_ci data[1] = val >> 8; // 8: byte offset 307e0e9324cSopenharmony_ci data[2] = val >> 16; // 2: transformed position, 16: byte offset 308e0e9324cSopenharmony_ci data[3] = val >> 24; // 3: transformed position, 24: byte offset 309e0e9324cSopenharmony_ci} 310e0e9324cSopenharmony_ci 311e0e9324cSopenharmony_cistd::string GetAnonyString(const std::string &value) 312e0e9324cSopenharmony_ci{ 313e0e9324cSopenharmony_ci constexpr size_t INT32_SHORT_ID_LENGTH = 20; 314e0e9324cSopenharmony_ci constexpr size_t INT32_MIN_ID_LENGTH = 3; 315e0e9324cSopenharmony_ci std::string result; 316e0e9324cSopenharmony_ci std::string tmpStr("******"); 317e0e9324cSopenharmony_ci size_t strLen = value.length(); 318e0e9324cSopenharmony_ci if (strLen < INT32_MIN_ID_LENGTH) { 319e0e9324cSopenharmony_ci return tmpStr; 320e0e9324cSopenharmony_ci } 321e0e9324cSopenharmony_ci 322e0e9324cSopenharmony_ci if (strLen <= INT32_SHORT_ID_LENGTH) { 323e0e9324cSopenharmony_ci result += value[0]; 324e0e9324cSopenharmony_ci result += tmpStr; 325e0e9324cSopenharmony_ci result += value[strLen - 1]; 326e0e9324cSopenharmony_ci } else { 327e0e9324cSopenharmony_ci constexpr size_t INT32_PLAINTEXT_LENGTH = 4; 328e0e9324cSopenharmony_ci result.append(value, 0, INT32_PLAINTEXT_LENGTH); 329e0e9324cSopenharmony_ci result += tmpStr; 330e0e9324cSopenharmony_ci result.append(value, strLen - INT32_PLAINTEXT_LENGTH, INT32_PLAINTEXT_LENGTH); 331e0e9324cSopenharmony_ci } 332e0e9324cSopenharmony_ci 333e0e9324cSopenharmony_ci return result; 334e0e9324cSopenharmony_ci} 335e0e9324cSopenharmony_ci 336e0e9324cSopenharmony_ci} // namespace Sharing 337e0e9324cSopenharmony_ci} // namespace OHOS 338