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