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 "trans_server_proxy.h" 17 18#include "iproxy_client.h" 19#include "samgr_lite.h" 20#include "serializer.h" 21#include "softbus_adapter_file.h" 22#include "softbus_adapter_mem.h" 23#include "softbus_adapter_timer.h" 24#include "softbus_def.h" 25#include "softbus_errcode.h" 26#include "softbus_server_ipc_interface_code.h" 27#include "trans_log.h" 28 29#define WAIT_SERVER_READY_INTERVAL_COUNT 50 30 31static IClientProxy *g_serverProxy = NULL; 32 33static int ProxyCallback(IOwner owner, int code, IpcIo *reply) 34{ 35 if (code != SOFTBUS_OK) { 36 TRANS_LOGE(TRANS_SDK, "publish service callback errCode=%{public}d.", code); 37 return SOFTBUS_INVALID_PARAM; 38 } 39 40 ReadInt32(reply, (int *)owner); 41 TRANS_LOGI(TRANS_SDK, "publish service owner=%{public}d.", *(int32_t*)owner); 42 return SOFTBUS_OK; 43} 44 45static int OpenSessionProxyCallback(IOwner owner, int code, IpcIo *reply) 46{ 47 if (code != SOFTBUS_OK) { 48 TRANS_LOGE(TRANS_SDK, "publish service callback errCode=%{public}d.", code); 49 return SOFTBUS_INVALID_PARAM; 50 } 51 uint32_t size; 52 ReadUint32(reply, &size); 53 void *data = (void *)ReadBuffer(reply, size); 54 if (data == NULL) { 55 TRANS_LOGE(TRANS_SDK, "pop data is null."); 56 return SOFTBUS_MEM_ERR; 57 } 58 *(TransSerializer *)owner = *(TransSerializer *)data; 59 return SOFTBUS_OK; 60} 61 62static bool WriteQosInfo(IpcIo *request, const SessionParam *param) 63{ 64 if (!WriteBool(request, param->isQosLane)) { 65 TRANS_LOGE(TRANS_SDK, "OpenSession write qos flag failed!"); 66 return false; 67 } 68 69 if (!param->isQosLane) { 70 return true; 71 } 72 73 if (!WriteUint32(request, param->qosCount)) { 74 TRANS_LOGE(TRANS_SDK, "OpenSession write count of qos failed!"); 75 return false; 76 } 77 78 if (param->qosCount > 0) { 79 if (!WriteBuffer(request, param->qos, sizeof(QosTV) * param->qosCount)) { 80 TRANS_LOGE(TRANS_SDK, "OpenSession write qos info failed!"); 81 return false; 82 } 83 } 84 85 return true; 86} 87 88int32_t TransServerProxyInit(void) 89{ 90 if (g_serverProxy != NULL) { 91 TRANS_LOGE(TRANS_INIT, "server proxy has init."); 92 return SOFTBUS_NO_INIT; 93 } 94 95 TRANS_LOGI(TRANS_INIT, "get trans server proxy"); 96 int32_t proxyInitCount = 0; 97 while (g_serverProxy == NULL) { 98 proxyInitCount++; 99 if (proxyInitCount == WAIT_SERVER_READY_INTERVAL_COUNT) { 100 TRANS_LOGE(TRANS_SDK, "trans get server proxy error"); 101 return SOFTBUS_OK; 102 } 103 IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(SOFTBUS_SERVICE); 104 if (iUnknown == NULL) { 105 SoftBusSleepMs(WAIT_SERVER_READY_INTERVAL); 106 continue; 107 } 108 109 int32_t ret = iUnknown->QueryInterface(iUnknown, CLIENT_PROXY_VER, (void **)&g_serverProxy); 110 if (ret != EC_SUCCESS || g_serverProxy == NULL) { 111 TRANS_LOGE(TRANS_SDK, "QueryInterface failed ret=%{public}d", ret); 112 SoftBusSleepMs(WAIT_SERVER_READY_INTERVAL); 113 continue; 114 } 115 } 116 return SOFTBUS_OK; 117} 118 119void TransServerProxyDeInit(void) 120{ 121 g_serverProxy = NULL; 122} 123 124int32_t ServerIpcCreateSessionServer(const char *pkgName, const char *sessionName) 125{ 126 TRANS_LOGD(TRANS_SDK, "enter."); 127 if ((pkgName == NULL) || (sessionName == NULL)) { 128 TRANS_LOGW(TRANS_SDK, "Invalid param"); 129 return SOFTBUS_INVALID_PARAM; 130 } 131 132 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 133 IpcIo request = {0}; 134 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 135 WriteString(&request, pkgName); 136 WriteString(&request, sessionName); 137 138 int32_t ret = SOFTBUS_NO_INIT; 139 /* sync */ 140 if (g_serverProxy == NULL) { 141 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 142 return ret; 143 } 144 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_CREATE_SESSION_SERVER, &request, &ret, ProxyCallback); 145 if (ans != EC_SUCCESS) { 146 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 147 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 148 } 149 return ret; 150} 151 152int32_t ServerIpcRemoveSessionServer(const char *pkgName, const char *sessionName) 153{ 154 TRANS_LOGD(TRANS_SDK, "enter."); 155 if ((pkgName == NULL) || (sessionName == NULL)) { 156 TRANS_LOGW(TRANS_SDK, "Invalid param"); 157 return SOFTBUS_INVALID_PARAM; 158 } 159 160 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 161 IpcIo request = {0}; 162 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 163 WriteString(&request, pkgName); 164 WriteString(&request, sessionName); 165 166 int32_t ret = SOFTBUS_NO_INIT; 167 /* sync */ 168 if (g_serverProxy == NULL) { 169 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 170 return ret; 171 } 172 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_REMOVE_SESSION_SERVER, &request, &ret, ProxyCallback); 173 if (ans != EC_SUCCESS) { 174 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 175 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 176 } 177 return ret; 178} 179 180static bool TransWriteIpcSessionAttrs(IpcIo *request, const SessionAttribute *attrs) 181{ 182 if (attrs == NULL || request == NULL) { 183 TRANS_LOGE(TRANS_SDK, "attrs is NULL!"); 184 return false; 185 } 186 187 if (!WriteInt32(request, attrs->dataType)) { 188 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs dataType failed!"); 189 return false; 190 } 191 192 if (!WriteInt32(request, attrs->linkTypeNum)) { 193 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs linkTypeNum failed!"); 194 return false; 195 } 196 197 if (attrs->linkTypeNum > 0) { 198 if (!WriteBuffer(request, attrs->linkType, sizeof(LinkType) * attrs->linkTypeNum)) { 199 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs linkType failed!"); 200 return false; 201 } 202 } 203 204 if (!WriteInt32(request, attrs->attr.streamAttr.streamType)) { 205 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs streamAttr failed!"); 206 return false; 207 } 208 209 if (attrs->fastTransData != NULL) { 210 if (!WriteUint16(request, attrs->fastTransDataSize)) { 211 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransDataSize failed!"); 212 return false; 213 } 214 if (!WriteRawData(request, attrs->fastTransData, attrs->fastTransDataSize)) { 215 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransData failed!"); 216 return false; 217 } 218 } else { 219 if (!WriteUint16(request, 0)) { 220 TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransDataSize failed!"); 221 return false; 222 } 223 } 224 225 return true; 226} 227 228int32_t ServerIpcOpenSession(const SessionParam *param, TransInfo *info) 229{ 230 TRANS_LOGD(TRANS_SDK, "enter."); 231 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 232 IpcIo request = {0}; 233 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 234 WriteString(&request, param->sessionName); 235 WriteString(&request, param->peerSessionName); 236 WriteString(&request, param->peerDeviceId); 237 WriteString(&request, param->groupId); 238 WriteBool(&request, param->isAsync); 239 WriteInt32(&request, param->sessionId); 240 if (!TransWriteIpcSessionAttrs(&request, param->attr)) { 241 TRANS_LOGE(TRANS_SDK, "OpenSession write attr failed!"); 242 return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; 243 } 244 245 if (!WriteQosInfo(&request, param)) { 246 TRANS_LOGE(TRANS_SDK, "OpenSession write qosinfo failed!"); 247 return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; 248 } 249 250 TransSerializer transSerializer; 251 transSerializer.ret = SOFTBUS_NO_INIT; 252 /* sync */ 253 if (g_serverProxy == NULL) { 254 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 255 return transSerializer.ret; 256 } 257 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_OPEN_SESSION, &request, 258 &transSerializer, OpenSessionProxyCallback); 259 if (ans != EC_SUCCESS) { 260 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", transSerializer.ret); 261 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 262 } 263 if (param->isAsync) { 264 return transSerializer.ret; 265 } 266 info->channelId = transSerializer.transInfo.channelId; 267 info->channelType = transSerializer.transInfo.channelType; 268 return transSerializer.ret; 269} 270 271int32_t ServerIpcOpenAuthSession(const char *sessionName, const ConnectionAddr *addrInfo) 272{ 273 TRANS_LOGD(TRANS_SDK, "enter."); 274 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 275 IpcIo request = {0}; 276 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 277 WriteString(&request, sessionName); 278 bool value = WriteRawData(&request, (void*)addrInfo, sizeof(ConnectionAddr)); 279 if (!value) { 280 return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED; 281 } 282 283 int32_t ret = SOFTBUS_NO_INIT; 284 if (g_serverProxy == NULL) { 285 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 286 return ret; 287 } 288 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_OPEN_AUTH_SESSION, &request, &ret, ProxyCallback); 289 if (ans != EC_SUCCESS) { 290 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 291 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 292 } 293 return ret; 294} 295 296int32_t ServerIpcNotifyAuthSuccess(int32_t channelId, int32_t channelType) 297{ 298 TRANS_LOGD(TRANS_SDK, "enter."); 299 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 300 IpcIo request = {0}; 301 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 302 WriteInt32(&request, channelId); 303 WriteInt32(&request, channelType); 304 int32_t ret = SOFTBUS_NO_INIT; 305 if (g_serverProxy == NULL) { 306 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 307 return ret; 308 } 309 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_NOTIFY_AUTH_SUCCESS, &request, &ret, ProxyCallback); 310 if (ans != EC_SUCCESS) { 311 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 312 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 313 } 314 return ret; 315} 316 317int32_t ServerIpcReleaseResources(int32_t channelId) 318{ 319 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 320 IpcIo request = {0}; 321 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 322 WriteInt32(&request, channelId); 323 324 int32_t ret = SOFTBUS_NO_INIT; 325 /* sync */ 326 if (g_serverProxy == NULL) { 327 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 328 return ret; 329 } 330 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_RELEASE_RESOURCES, &request, &ret, ProxyCallback); 331 if (ans != EC_SUCCESS) { 332 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 333 return SOFTBUS_IPC_ERR; 334 } 335 return ret; 336} 337 338int32_t ServerIpcCloseChannel(const char *sessionName, int32_t channelId, int32_t channelType) 339{ 340 TRANS_LOGD(TRANS_SDK, "enter."); 341 uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0}; 342 IpcIo request = {0}; 343 IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0); 344 WriteInt32(&request, channelId); 345 WriteInt32(&request, channelType); 346 if (channelType == CHANNEL_TYPE_UNDEFINED) { 347 WriteString(&request, sessionName); 348 } 349 int32_t ret = SOFTBUS_NO_INIT; 350 /* sync */ 351 if (g_serverProxy == NULL) { 352 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 353 return ret; 354 } 355 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_CLOSE_CHANNEL, &request, &ret, ProxyCallback); 356 if (ans != EC_SUCCESS) { 357 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 358 return ans; 359 } 360 return ret; 361} 362 363int32_t ServerIpcCloseChannelWithStatistics(int32_t channelId, int32_t channelType, uint64_t laneId, 364 const void *dataInfo, uint32_t len) 365{ 366 (void)channelId; 367 (void)channelType; 368 (void)laneId; 369 (void)dataInfo; 370 (void)len; 371 return SOFTBUS_NOT_IMPLEMENT; 372} 373 374int32_t ServerIpcSendMessage(int32_t channelId, int32_t channelType, const void *data, uint32_t len, int32_t msgType) 375{ 376 TRANS_LOGD(TRANS_SDK, "enter."); 377 uint32_t ipcDataLen = len + MAX_SOFT_BUS_IPC_LEN; 378 uint8_t *ipcData = (uint8_t *)SoftBusCalloc(ipcDataLen); 379 if (ipcData == NULL) { 380 TRANS_LOGE(TRANS_SDK, "malloc failed!"); 381 return SOFTBUS_MALLOC_ERR; 382 } 383 384 IpcIo request = {0}; 385 IpcIoInit(&request, ipcData, ipcDataLen, 0); 386 WriteInt32(&request, channelId); 387 WriteInt32(&request, channelType); 388 WriteInt32(&request, msgType); 389 WriteUint32(&request, len); 390 WriteBuffer(&request, data, len); 391 392 int32_t ret = SOFTBUS_NO_INIT; 393 /* sync */ 394 if (g_serverProxy == NULL) { 395 TRANS_LOGE(TRANS_SDK, "server proxy not init"); 396 SoftBusFree(ipcData); 397 return ret; 398 } 399 int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_SESSION_SENDMSG, &request, &ret, ProxyCallback); 400 SoftBusFree(ipcData); 401 if (ans != EC_SUCCESS) { 402 TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret); 403 return SOFTBUS_TRANS_PROXY_INVOKE_FAILED; 404 } 405 TRANS_LOGD(TRANS_SDK, "ok"); 406 return ret; 407} 408 409int32_t ServerIpcQosReport(int32_t channelId, int32_t chanType, int32_t appType, int32_t quality) 410{ 411 (void)channelId; 412 (void)chanType; 413 (void)appType; 414 (void)quality; 415 return SOFTBUS_NOT_IMPLEMENT; 416} 417 418int32_t ServerIpcGrantPermission(int uid, int pid, const char *sessionName) 419{ 420 (void)uid; 421 (void)pid; 422 (void)sessionName; 423 return SOFTBUS_NOT_IMPLEMENT; 424} 425 426int32_t ServerIpcRemovePermission(const char *sessionName) 427{ 428 (void)sessionName; 429 return SOFTBUS_NOT_IMPLEMENT; 430} 431 432int32_t ServerIpcStreamStats(int32_t channelId, int32_t channelType, const StreamSendStats *data) 433{ 434 (void)channelId; 435 (void)channelType; 436 (void)data; 437 return SOFTBUS_NOT_IMPLEMENT; 438} 439 440int32_t ServerIpcRippleStats(int32_t channelId, int32_t channelType, const TrafficStats *data) 441{ 442 (void)channelId; 443 (void)channelType; 444 (void)data; 445 return SOFTBUS_NOT_IMPLEMENT; 446} 447 448int32_t ServerIpcEvaluateQos(const char *peerNetworkId, TransDataType dataType, const QosTV *qos, uint32_t qosCount) 449{ 450 (void)peerNetworkId; 451 (void)dataType; 452 (void)qos; 453 (void)qosCount; 454 return SOFTBUS_NOT_IMPLEMENT; 455}