xref: /ide/tools/previewer/util/unix/LocalSocket.cpp (revision 7c804472)
17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "LocalSocket.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include <sys/ioctl.h>
197c804472Sopenharmony_ci#include <sys/socket.h>
207c804472Sopenharmony_ci#include <sys/types.h>
217c804472Sopenharmony_ci#include <sys/un.h>
227c804472Sopenharmony_ci
237c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
247c804472Sopenharmony_ci
257c804472Sopenharmony_ciLocalSocket::LocalSocket() : socketHandle(-1) {}
267c804472Sopenharmony_ci
277c804472Sopenharmony_ciLocalSocket::~LocalSocket()
287c804472Sopenharmony_ci{
297c804472Sopenharmony_ci    DisconnectFromServer();
307c804472Sopenharmony_ci}
317c804472Sopenharmony_ci
327c804472Sopenharmony_cibool LocalSocket::ConnectToServer(std::string name, OpenMode openMode, TransMode transMode)
337c804472Sopenharmony_ci{
347c804472Sopenharmony_ci    (void)openMode;
357c804472Sopenharmony_ci    (void)transMode;
367c804472Sopenharmony_ci    struct sockaddr_un un;
377c804472Sopenharmony_ci    un.sun_family = AF_UNIX;
387c804472Sopenharmony_ci    std::size_t length = name.copy(un.sun_path, name.size());
397c804472Sopenharmony_ci    un.sun_path[length] = '\0';
407c804472Sopenharmony_ci    socketHandle = socket(AF_UNIX, SOCK_STREAM, 0);
417c804472Sopenharmony_ci    if (socketHandle < 0) {
427c804472Sopenharmony_ci        ELOG("Request socket failed");
437c804472Sopenharmony_ci        return false;
447c804472Sopenharmony_ci    }
457c804472Sopenharmony_ci    struct sockaddr* sockun = reinterpret_cast<struct sockaddr*>(&un);
467c804472Sopenharmony_ci    if (connect(socketHandle, sockun, sizeof(un)) < 0) {
477c804472Sopenharmony_ci        ELOG("connect socket failed");
487c804472Sopenharmony_ci        return false;
497c804472Sopenharmony_ci    }
507c804472Sopenharmony_ci
517c804472Sopenharmony_ci    return true;
527c804472Sopenharmony_ci}
537c804472Sopenharmony_ci
547c804472Sopenharmony_cistd::string LocalSocket::GetTracePipeName(std::string baseName) const
557c804472Sopenharmony_ci{
567c804472Sopenharmony_ci    return std::string("/tmp/") + baseName;
577c804472Sopenharmony_ci}
587c804472Sopenharmony_ci
597c804472Sopenharmony_cistd::string LocalSocket::GetCommandPipeName(std::string baseName) const
607c804472Sopenharmony_ci{
617c804472Sopenharmony_ci    return std::string("/tmp/") + baseName + "_commandPipe";
627c804472Sopenharmony_ci}
637c804472Sopenharmony_ci
647c804472Sopenharmony_cistd::string LocalSocket::GetImagePipeName(std::string baseName) const
657c804472Sopenharmony_ci{
667c804472Sopenharmony_ci    return std::string("/tmp/") + baseName + "_imagePipe";
677c804472Sopenharmony_ci}
687c804472Sopenharmony_ci
697c804472Sopenharmony_civoid LocalSocket::DisconnectFromServer()
707c804472Sopenharmony_ci{
717c804472Sopenharmony_ci    shutdown(socketHandle, SHUT_RDWR);
727c804472Sopenharmony_ci}
737c804472Sopenharmony_ci
747c804472Sopenharmony_ciint64_t LocalSocket::ReadData(char* data, size_t length) const
757c804472Sopenharmony_ci{
767c804472Sopenharmony_ci    if (length > UINT32_MAX) {
777c804472Sopenharmony_ci        ELOG("LocalSocket::ReadData length must < %d", UINT32_MAX);
787c804472Sopenharmony_ci        return -1;
797c804472Sopenharmony_ci    }
807c804472Sopenharmony_ci
817c804472Sopenharmony_ci    int32_t bytes_read;
827c804472Sopenharmony_ci    ioctl(socketHandle, FIONREAD, &bytes_read);
837c804472Sopenharmony_ci
847c804472Sopenharmony_ci    if (bytes_read <= 0) {
857c804472Sopenharmony_ci        return 0;
867c804472Sopenharmony_ci    }
877c804472Sopenharmony_ci
887c804472Sopenharmony_ci    int32_t readSize = recv(socketHandle, data, length, 0);
897c804472Sopenharmony_ci    if (readSize == 0) {
907c804472Sopenharmony_ci        ELOG("LocalSocket::ReadData Server is shut down");
917c804472Sopenharmony_ci    }
927c804472Sopenharmony_ci
937c804472Sopenharmony_ci    if (readSize < 0) {
947c804472Sopenharmony_ci        ELOG("LocalSocket::ReadData ReadFile failed");
957c804472Sopenharmony_ci    }
967c804472Sopenharmony_ci
977c804472Sopenharmony_ci    return readSize;
987c804472Sopenharmony_ci}
997c804472Sopenharmony_ci
1007c804472Sopenharmony_cisize_t LocalSocket::WriteData(const void* data, size_t length) const
1017c804472Sopenharmony_ci{
1027c804472Sopenharmony_ci    if (length > UINT32_MAX) {
1037c804472Sopenharmony_ci        ELOG("LocalSocket::WriteData length must < %d", UINT32_MAX);
1047c804472Sopenharmony_ci        return 0;
1057c804472Sopenharmony_ci    }
1067c804472Sopenharmony_ci    std::string str((const char*)data);
1077c804472Sopenharmony_ci    ssize_t writeSize = send(socketHandle, str.c_str(), length, 0);
1087c804472Sopenharmony_ci    if (writeSize == 0) {
1097c804472Sopenharmony_ci        ELOG("LocalSocket::WriteData Server is shut down");
1107c804472Sopenharmony_ci    }
1117c804472Sopenharmony_ci
1127c804472Sopenharmony_ci    if (writeSize < 0) {
1137c804472Sopenharmony_ci        ELOG("LocalSocket::WriteData ReadFile failed");
1147c804472Sopenharmony_ci    }
1157c804472Sopenharmony_ci
1167c804472Sopenharmony_ci    return writeSize;
1177c804472Sopenharmony_ci}
1187c804472Sopenharmony_ci
1197c804472Sopenharmony_ciconst LocalSocket& LocalSocket::operator>>(std::string& data) const
1207c804472Sopenharmony_ci{
1217c804472Sopenharmony_ci    char c = '\255';
1227c804472Sopenharmony_ci    while (c != '\0' && ReadData(&c, 1) > 0) {
1237c804472Sopenharmony_ci        data.push_back(c);
1247c804472Sopenharmony_ci    }
1257c804472Sopenharmony_ci    return *this;
1267c804472Sopenharmony_ci}
1277c804472Sopenharmony_ci
1287c804472Sopenharmony_ciconst LocalSocket& LocalSocket::operator<<(const std::string data) const
1297c804472Sopenharmony_ci{
1307c804472Sopenharmony_ci    WriteData(data.c_str(), data.length() + 1);
1317c804472Sopenharmony_ci    return *this;
1327c804472Sopenharmony_ci}