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