1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "dcamera.h"
17094332d3Sopenharmony_ci#include <chrono>
18094332d3Sopenharmony_ci#include "constants.h"
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_cinamespace OHOS {
21094332d3Sopenharmony_cinamespace DistributedHardware {
22094332d3Sopenharmony_ciconst uint32_t OFFSET2 = 2;
23094332d3Sopenharmony_ciconst uint32_t OFFSET4 = 4;
24094332d3Sopenharmony_ciconst uint32_t OFFSET6 = 6;
25094332d3Sopenharmony_ciconst uint8_t PARAM_FC = 0xfc;
26094332d3Sopenharmony_ciconst uint8_t PARAM_03 = 0x03;
27094332d3Sopenharmony_ciconst uint8_t PARAM_F0 = 0xf0;
28094332d3Sopenharmony_ciconst uint8_t PARAM_0F = 0x0f;
29094332d3Sopenharmony_ciconst uint8_t PARAM_C0 = 0xc0;
30094332d3Sopenharmony_ciconst uint8_t PARAM_3F = 0x3f;
31094332d3Sopenharmony_ciconst int INDEX_FIRST = 0;
32094332d3Sopenharmony_ciconst int INDEX_SECOND = 1;
33094332d3Sopenharmony_ciconst int INDEX_THIRD = 2;
34094332d3Sopenharmony_ciconst int INDEX_FORTH = 3;
35094332d3Sopenharmony_ciCamRetCode MapToExternalRetCode(DCamRetCode retCode)
36094332d3Sopenharmony_ci{
37094332d3Sopenharmony_ci    switch (retCode) {
38094332d3Sopenharmony_ci        case DCamRetCode::SUCCESS:
39094332d3Sopenharmony_ci            return CamRetCode::NO_ERROR;
40094332d3Sopenharmony_ci        case DCamRetCode::CAMERA_BUSY:
41094332d3Sopenharmony_ci            return CamRetCode::CAMERA_BUSY;
42094332d3Sopenharmony_ci        case DCamRetCode::INVALID_ARGUMENT:
43094332d3Sopenharmony_ci            return CamRetCode::INVALID_ARGUMENT;
44094332d3Sopenharmony_ci        case DCamRetCode::METHOD_NOT_SUPPORTED:
45094332d3Sopenharmony_ci            return CamRetCode::METHOD_NOT_SUPPORTED;
46094332d3Sopenharmony_ci        case DCamRetCode::CAMERA_OFFLINE:
47094332d3Sopenharmony_ci            return CamRetCode::CAMERA_CLOSED;
48094332d3Sopenharmony_ci        case DCamRetCode::EXCEED_MAX_NUMBER:
49094332d3Sopenharmony_ci            return CamRetCode::INSUFFICIENT_RESOURCES;
50094332d3Sopenharmony_ci        case DCamRetCode::FAILED:
51094332d3Sopenharmony_ci            return CamRetCode::DEVICE_ERROR;
52094332d3Sopenharmony_ci        default:
53094332d3Sopenharmony_ci            break;
54094332d3Sopenharmony_ci    }
55094332d3Sopenharmony_ci    return CamRetCode::DEVICE_ERROR;
56094332d3Sopenharmony_ci}
57094332d3Sopenharmony_ci
58094332d3Sopenharmony_ciuint64_t GetCurrentLocalTimeStamp()
59094332d3Sopenharmony_ci{
60094332d3Sopenharmony_ci    std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp =
61094332d3Sopenharmony_ci        std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
62094332d3Sopenharmony_ci    auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
63094332d3Sopenharmony_ci    return static_cast<uint64_t>(tmp.count());
64094332d3Sopenharmony_ci}
65094332d3Sopenharmony_ci
66094332d3Sopenharmony_civoid SplitString(const std::string &str, std::vector<std::string> &tokens, const std::string &delimiters)
67094332d3Sopenharmony_ci{
68094332d3Sopenharmony_ci    std::string::size_type lastPos = 0;
69094332d3Sopenharmony_ci    std::string::size_type pos = str.find(delimiters);
70094332d3Sopenharmony_ci    while (std::string::npos != pos) {
71094332d3Sopenharmony_ci        tokens.push_back(str.substr(lastPos, pos - lastPos));
72094332d3Sopenharmony_ci        lastPos = pos + delimiters.size();
73094332d3Sopenharmony_ci        pos = str.find(delimiters, lastPos);
74094332d3Sopenharmony_ci    }
75094332d3Sopenharmony_ci    if (lastPos != str.length()) {
76094332d3Sopenharmony_ci        tokens.push_back(str.substr(lastPos));
77094332d3Sopenharmony_ci    }
78094332d3Sopenharmony_ci}
79094332d3Sopenharmony_ci
80094332d3Sopenharmony_cistd::string Base64Encode(const unsigned char *toEncode, unsigned int len)
81094332d3Sopenharmony_ci{
82094332d3Sopenharmony_ci    std::string ret;
83094332d3Sopenharmony_ci    uint32_t i = 0;
84094332d3Sopenharmony_ci    unsigned char charArray3[3];
85094332d3Sopenharmony_ci    unsigned char charArray4[4];
86094332d3Sopenharmony_ci
87094332d3Sopenharmony_ci    while (len--) {
88094332d3Sopenharmony_ci        charArray3[i++] = *(toEncode++);
89094332d3Sopenharmony_ci        if (i == sizeof(charArray3)) {
90094332d3Sopenharmony_ci            charArray4[INDEX_FIRST] = (charArray3[INDEX_FIRST] & PARAM_FC) >> OFFSET2;
91094332d3Sopenharmony_ci            charArray4[INDEX_SECOND] = ((charArray3[INDEX_FIRST] & PARAM_03) << OFFSET4) +
92094332d3Sopenharmony_ci                ((charArray3[INDEX_SECOND] & PARAM_F0) >> OFFSET4);
93094332d3Sopenharmony_ci            charArray4[INDEX_THIRD] = ((charArray3[INDEX_SECOND] & PARAM_0F) << OFFSET2) +
94094332d3Sopenharmony_ci                ((charArray3[INDEX_THIRD] & PARAM_C0) >> OFFSET6);
95094332d3Sopenharmony_ci            charArray4[INDEX_FORTH] = charArray3[INDEX_THIRD] & PARAM_3F;
96094332d3Sopenharmony_ci            for (i = 0; i < sizeof(charArray4); i++) {
97094332d3Sopenharmony_ci                ret += BASE_64_CHARS[charArray4[i]];
98094332d3Sopenharmony_ci            }
99094332d3Sopenharmony_ci            i = 0;
100094332d3Sopenharmony_ci        }
101094332d3Sopenharmony_ci    }
102094332d3Sopenharmony_ci
103094332d3Sopenharmony_ci    if (i) {
104094332d3Sopenharmony_ci        uint32_t j = 0;
105094332d3Sopenharmony_ci        for (j = i; j < sizeof(charArray3); j++) {
106094332d3Sopenharmony_ci            charArray3[j] = '\0';
107094332d3Sopenharmony_ci        }
108094332d3Sopenharmony_ci        charArray4[INDEX_FIRST] = (charArray3[INDEX_FIRST] & PARAM_FC) >> OFFSET2;
109094332d3Sopenharmony_ci        charArray4[INDEX_SECOND] = ((charArray3[INDEX_FIRST] & PARAM_03) << OFFSET4) +
110094332d3Sopenharmony_ci            ((charArray3[INDEX_SECOND] & PARAM_F0) >> OFFSET4);
111094332d3Sopenharmony_ci        charArray4[INDEX_THIRD] = ((charArray3[INDEX_SECOND] & PARAM_0F) << OFFSET2) +
112094332d3Sopenharmony_ci            ((charArray3[INDEX_THIRD] & PARAM_C0) >> OFFSET6);
113094332d3Sopenharmony_ci        charArray4[INDEX_FORTH] = charArray3[INDEX_THIRD] & PARAM_3F;
114094332d3Sopenharmony_ci        for (j = 0; j < i + 1; j++) {
115094332d3Sopenharmony_ci            ret += BASE_64_CHARS[charArray4[j]];
116094332d3Sopenharmony_ci        }
117094332d3Sopenharmony_ci        while (i++ < sizeof(charArray3)) {
118094332d3Sopenharmony_ci            ret += '=';
119094332d3Sopenharmony_ci        }
120094332d3Sopenharmony_ci    }
121094332d3Sopenharmony_ci    return ret;
122094332d3Sopenharmony_ci}
123094332d3Sopenharmony_ci
124094332d3Sopenharmony_cistd::string Base64Decode(const std::string& basicString)
125094332d3Sopenharmony_ci{
126094332d3Sopenharmony_ci    std::string ret;
127094332d3Sopenharmony_ci    uint32_t i = 0;
128094332d3Sopenharmony_ci    int index = 0;
129094332d3Sopenharmony_ci    int len = static_cast<int>(basicString.size());
130094332d3Sopenharmony_ci    unsigned char charArray3[3];
131094332d3Sopenharmony_ci    unsigned char charArray4[4];
132094332d3Sopenharmony_ci
133094332d3Sopenharmony_ci    while (len-- && (basicString[index] != '=') && IsBase64(basicString[index])) {
134094332d3Sopenharmony_ci        charArray4[i++] = basicString[index];
135094332d3Sopenharmony_ci        index++;
136094332d3Sopenharmony_ci        if (i == sizeof(charArray4)) {
137094332d3Sopenharmony_ci            for (i = 0; i < sizeof(charArray4); i++) {
138094332d3Sopenharmony_ci                charArray4[i] = BASE_64_CHARS.find(charArray4[i]);
139094332d3Sopenharmony_ci            }
140094332d3Sopenharmony_ci            charArray3[INDEX_FIRST] = (charArray4[INDEX_FIRST] << OFFSET2) +
141094332d3Sopenharmony_ci                ((charArray4[INDEX_SECOND] & 0x30) >> OFFSET4);
142094332d3Sopenharmony_ci            charArray3[INDEX_SECOND] = ((charArray4[INDEX_SECOND] & 0xf) << OFFSET4) +
143094332d3Sopenharmony_ci                ((charArray4[INDEX_THIRD] & 0x3c) >> OFFSET2);
144094332d3Sopenharmony_ci            charArray3[INDEX_THIRD] = ((charArray4[INDEX_THIRD] & 0x3) << OFFSET6) + charArray4[INDEX_FORTH];
145094332d3Sopenharmony_ci            for (i = 0; i < sizeof(charArray3); i++) {
146094332d3Sopenharmony_ci                ret += charArray3[i];
147094332d3Sopenharmony_ci            }
148094332d3Sopenharmony_ci            i = 0;
149094332d3Sopenharmony_ci        }
150094332d3Sopenharmony_ci    }
151094332d3Sopenharmony_ci
152094332d3Sopenharmony_ci    if (i) {
153094332d3Sopenharmony_ci        uint32_t j = 0;
154094332d3Sopenharmony_ci        for (j = i; j < sizeof(charArray4); j++) {
155094332d3Sopenharmony_ci            charArray4[j] = 0;
156094332d3Sopenharmony_ci        }
157094332d3Sopenharmony_ci        for (j = 0; j < sizeof(charArray4); j++) {
158094332d3Sopenharmony_ci            charArray4[j] = BASE_64_CHARS.find(charArray4[j]);
159094332d3Sopenharmony_ci        }
160094332d3Sopenharmony_ci        charArray3[INDEX_FIRST] = (charArray4[INDEX_FIRST] << OFFSET2) +
161094332d3Sopenharmony_ci            ((charArray4[INDEX_SECOND] & 0x30) >> OFFSET4);
162094332d3Sopenharmony_ci        charArray3[INDEX_SECOND] = ((charArray4[INDEX_SECOND] & 0xf) << OFFSET4) +
163094332d3Sopenharmony_ci            ((charArray4[INDEX_THIRD] & 0x3c) >> OFFSET2);
164094332d3Sopenharmony_ci        charArray3[INDEX_THIRD] = ((charArray4[INDEX_THIRD] & 0x3) << OFFSET6) + charArray4[INDEX_FORTH];
165094332d3Sopenharmony_ci        for (j = 0; j < i - 1; j++) {
166094332d3Sopenharmony_ci            ret += charArray3[j];
167094332d3Sopenharmony_ci        }
168094332d3Sopenharmony_ci    }
169094332d3Sopenharmony_ci    return ret;
170094332d3Sopenharmony_ci}
171094332d3Sopenharmony_ci
172094332d3Sopenharmony_cibool IsBase64(unsigned char c)
173094332d3Sopenharmony_ci{
174094332d3Sopenharmony_ci    return (isalnum(c) || (c == '+') || (c == '/'));
175094332d3Sopenharmony_ci}
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_cibool IsDhBaseInfoInvalid(const DHBase& dhBase)
178094332d3Sopenharmony_ci{
179094332d3Sopenharmony_ci    return dhBase.deviceId_.empty() || (dhBase.deviceId_.length() > DEVID_MAX_LENGTH) ||
180094332d3Sopenharmony_ci        dhBase.dhId_.empty() || (dhBase.dhId_.length() > DHID_MAX_LENGTH);
181094332d3Sopenharmony_ci}
182094332d3Sopenharmony_ci} // namespace DistributedHardware
183094332d3Sopenharmony_ci} // namespace OHOS
184