1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "common/log_wrapper.h"
17#include "define.h"
18#include "network.h"
19
20namespace OHOS::ArkCompiler::Toolchain {
21bool Recv(int32_t client, std::string& buffer, int32_t flags)
22{
23    if (buffer.empty()) {
24        return false;
25    }
26    auto succeeded = Recv(client, buffer.data(), buffer.size(), flags);
27    if (!succeeded) {
28        buffer.clear();
29    }
30    return succeeded;
31}
32
33bool Recv(int32_t client, char* buf, size_t totalLen, int32_t flags)
34{
35    size_t recvLen = 0;
36    while (recvLen < totalLen) {
37        ssize_t len = 0;
38        while ((len = recv(client, buf + recvLen, totalLen - recvLen, flags)) < 0 &&
39               (errno == EINTR || errno == EAGAIN)) {
40            LOGW("Recv payload failed, errno = %{public}d", errno);
41        }
42        if (len <= 0) {
43            LOGE("Recv payload in while failed, len = %{public}ld, errno = %{public}d", static_cast<long>(len), errno);
44            return false;
45        }
46        recvLen += static_cast<size_t>(len);
47    }
48    return true;
49}
50
51bool Recv(int32_t client, uint8_t* buf, size_t totalLen, int32_t flags)
52{
53    return Recv(client, reinterpret_cast<char *>(buf), totalLen, flags);
54}
55
56bool Send(int32_t client, const std::string& message, int32_t flags)
57{
58    return Send(client, message.c_str(), message.size(), flags);
59}
60
61bool Send(int32_t client, const char* buf, size_t totalLen, int32_t flags)
62{
63    size_t sendLen = 0;
64    while (sendLen < totalLen) {
65        ssize_t len = send(client, buf + sendLen, totalLen - sendLen, flags);
66        if (len <= 0) {
67            LOGE("Send Message in while failed, len = %{public}ld, errno = %{public}d", static_cast<long>(len), errno);
68            return false;
69        }
70        sendLen += static_cast<size_t>(len);
71    }
72    return true;
73}
74
75uint64_t NetToHostLongLong(uint8_t* buf, uint32_t len)
76{
77    uint64_t result = 0;
78    for (uint32_t i = 0; i < len; i++) {
79        result |= buf[i];
80        if ((i + 1) < len) {
81            result <<= 8; // 8: result need shift left 8 bits in order to big endian convert to int
82        }
83    }
84    return result;
85}
86} // OHOS::ArkCompiler::Toolchain
87