1 /*
2  * Copyright (c) 2021-2024 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 "app_spawn_socket.h"
17 
18 #include "hilog_tag_wrapper.h"
19 
20 namespace OHOS {
21 namespace AppExecFwk {
22 // arg "AppSpawn" or "NWebSpawn" cannot be defined as string object since REGISTER_SYSTEM_ABILITY will
23 // firstly start without init this string object, which leads to error.
24 
AppSpawnSocket(bool isNWebSpawn)25 AppSpawnSocket::AppSpawnSocket(bool isNWebSpawn)
26 {
27     clientSocket_ = isNWebSpawn ?
28         std::make_unique<AppSpawn::ClientSocket>("/dev/unix/socket/NWebSpawn") :
29         std::make_unique<AppSpawn::ClientSocket>("AppSpawn");
30 }
31 
~AppSpawnSocket()32 AppSpawnSocket::~AppSpawnSocket()
33 {}
34 
OpenAppSpawnConnection()35 ErrCode AppSpawnSocket::OpenAppSpawnConnection()
36 {
37     TAG_LOGD(AAFwkTag::APPMGR, "ready to open connection");
38     if (clientSocket_) {
39         if (clientSocket_->CreateClient() != ERR_OK) {
40             TAG_LOGE(AAFwkTag::APPMGR, "failed to create socketClient");
41             return ERR_APPEXECFWK_BAD_APPSPAWN_CLIENT;
42         }
43         if (clientSocket_->ConnectSocket() != ERR_OK) {
44             TAG_LOGE(AAFwkTag::APPMGR, "failed to connect socket");
45             clientSocket_->CloseClient();
46             return ERR_APPEXECFWK_CONNECT_APPSPAWN_FAILED;
47         }
48         TAG_LOGD(AAFwkTag::APPMGR, "connection has been opened");
49         return ERR_OK;
50     }
51     TAG_LOGE(AAFwkTag::APPMGR, "failed to open connection without socket");
52     return ERR_APPEXECFWK_BAD_APPSPAWN_SOCKET;
53 }
54 
CloseAppSpawnConnection()55 void AppSpawnSocket::CloseAppSpawnConnection()
56 {
57     if (clientSocket_) {
58         clientSocket_->CloseClient();
59     }
60 }
61 
WriteMessage(const void * buf,const int32_t len)62 ErrCode AppSpawnSocket::WriteMessage(const void *buf, const int32_t len)
63 {
64     TAG_LOGD(AAFwkTag::APPMGR, "ready to write message");
65     if (len <= 0) {
66         TAG_LOGE(AAFwkTag::APPMGR, "failed to write message due to invalid length of message");
67         return ERR_INVALID_VALUE;
68     }
69     if (buf == nullptr) {
70         TAG_LOGE(AAFwkTag::APPMGR, "failed to write message due to null buf");
71         return ERR_INVALID_VALUE;
72     }
73     if (clientSocket_) {
74         if (clientSocket_->WriteSocketMessage(buf, len) != len) {
75             TAG_LOGE(AAFwkTag::APPMGR, "failed to write message due to invalid write length");
76             return ERR_APPEXECFWK_SOCKET_WRITE_FAILED;
77         }
78         TAG_LOGD(AAFwkTag::APPMGR, "write message success");
79         return ERR_OK;
80     }
81 
82     TAG_LOGE(AAFwkTag::APPMGR, "failed to write message without socket");
83     return ERR_APPEXECFWK_BAD_APPSPAWN_SOCKET;
84 }
85 
ReadMessage(void * buf,const int32_t len)86 ErrCode AppSpawnSocket::ReadMessage(void *buf, const int32_t len)
87 {
88     TAG_LOGD(AAFwkTag::APPMGR, "ready to read message");
89     if (len <= 0) {
90         TAG_LOGE(AAFwkTag::APPMGR, "failed to read message due to invalid length of cache");
91         return ERR_INVALID_VALUE;
92     }
93     if (buf == nullptr) {
94         TAG_LOGE(AAFwkTag::APPMGR, "failed to read message due to null buf");
95         return ERR_INVALID_VALUE;
96     }
97     if (clientSocket_) {
98         if (clientSocket_->ReadSocketMessage(buf, len) != len) {
99             TAG_LOGE(AAFwkTag::APPMGR, "failed to read message due to invalid read length");
100             return ERR_APPEXECFWK_SOCKET_READ_FAILED;
101         }
102         TAG_LOGD(AAFwkTag::APPMGR, "read message success");
103         return ERR_OK;
104     }
105     TAG_LOGE(AAFwkTag::APPMGR, "failed to read message without socket");
106     return ERR_APPEXECFWK_BAD_APPSPAWN_CLIENT;
107 }
108 
SetClientSocket(const std::shared_ptr<OHOS::AppSpawn::ClientSocket> clientSocket)109 void AppSpawnSocket::SetClientSocket(const std::shared_ptr<OHOS::AppSpawn::ClientSocket> clientSocket)
110 {
111     clientSocket_ = clientSocket;
112 }
113 }  // namespace AppExecFwk
114 }  // namespace OHOS
115