• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "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 
31 static IClientProxy *g_serverProxy = NULL;
32 
ProxyCallback(IOwner owner,int code,IpcIo * reply)33 static 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_ERR;
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 
OpenSessionProxyCallback(IOwner owner,int code,IpcIo * reply)45 static 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_ERR;
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_ERR;
57     }
58     *(TransSerializer *)owner = *(TransSerializer *)data;
59     return SOFTBUS_OK;
60 }
61 
TransServerProxyInit(void)62 int32_t TransServerProxyInit(void)
63 {
64     if (g_serverProxy != NULL) {
65         TRANS_LOGE(TRANS_INIT, "server proxy has init.");
66         return SOFTBUS_OK;
67     }
68 
69     TRANS_LOGI(TRANS_INIT, "get trans server proxy");
70     int32_t proxyInitCount = 0;
71     while (g_serverProxy == NULL) {
72         proxyInitCount++;
73         if (proxyInitCount == WAIT_SERVER_READY_INTERVAL_COUNT) {
74             TRANS_LOGE(TRANS_SDK, "trans get server proxy error");
75             return SOFTBUS_OK;
76         }
77         IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(SOFTBUS_SERVICE);
78         if (iUnknown == NULL) {
79             SoftBusSleepMs(WAIT_SERVER_READY_INTERVAL);
80             continue;
81         }
82 
83         int32_t ret = iUnknown->QueryInterface(iUnknown, CLIENT_PROXY_VER, (void **)&g_serverProxy);
84         if (ret != EC_SUCCESS || g_serverProxy == NULL) {
85             TRANS_LOGE(TRANS_SDK, "QueryInterface failed ret=%{public}d", ret);
86             SoftBusSleepMs(WAIT_SERVER_READY_INTERVAL);
87             continue;
88         }
89     }
90     return SOFTBUS_OK;
91 }
92 
TransServerProxyDeInit(void)93 void TransServerProxyDeInit(void)
94 {
95     g_serverProxy = NULL;
96 }
97 
ServerIpcCreateSessionServer(const char * pkgName,const char * sessionName)98 int32_t ServerIpcCreateSessionServer(const char *pkgName, const char *sessionName)
99 {
100     TRANS_LOGD(TRANS_SDK, "enter.");
101     if ((pkgName == NULL) || (sessionName == NULL)) {
102         TRANS_LOGW(TRANS_SDK, "Invalid param");
103         return SOFTBUS_INVALID_PARAM;
104     }
105 
106     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
107     IpcIo request = {0};
108     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
109     WriteString(&request, pkgName);
110     WriteString(&request, sessionName);
111 
112     int32_t ret = SOFTBUS_ERR;
113     /* sync */
114     if (g_serverProxy == NULL) {
115         TRANS_LOGE(TRANS_SDK, "server proxy not init");
116         return SOFTBUS_NO_INIT;
117     }
118     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_CREATE_SESSION_SERVER, &request, &ret, ProxyCallback);
119     if (ans != EC_SUCCESS) {
120         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
121         return SOFTBUS_ERR;
122     }
123     return ret;
124 }
125 
ServerIpcRemoveSessionServer(const char * pkgName,const char * sessionName)126 int32_t ServerIpcRemoveSessionServer(const char *pkgName, const char *sessionName)
127 {
128     TRANS_LOGD(TRANS_SDK, "enter.");
129     if ((pkgName == NULL) || (sessionName == NULL)) {
130         TRANS_LOGW(TRANS_SDK, "Invalid param");
131         return SOFTBUS_INVALID_PARAM;
132     }
133 
134     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
135     IpcIo request = {0};
136     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
137     WriteString(&request, pkgName);
138     WriteString(&request, sessionName);
139 
140     int32_t ret = SOFTBUS_ERR;
141     /* sync */
142     if (g_serverProxy == NULL) {
143         TRANS_LOGE(TRANS_SDK, "server proxy not init");
144         return SOFTBUS_NO_INIT;
145     }
146     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_REMOVE_SESSION_SERVER, &request, &ret, ProxyCallback);
147     if (ans != EC_SUCCESS) {
148         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
149         return SOFTBUS_TRANS_PROXY_INVOKE_FAILED;
150     }
151     return ret;
152 }
153 
TransWriteIpcSessionAttrs(IpcIo * request,const SessionAttribute * attrs)154 static bool TransWriteIpcSessionAttrs(IpcIo *request, const SessionAttribute *attrs)
155 {
156     if (attrs == NULL || request == NULL) {
157         TRANS_LOGE(TRANS_SDK, "attrs is nullptr!");
158         return false;
159     }
160 
161     if (!WriteInt32(request, attrs->dataType)) {
162         TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs dataType failed!");
163         return false;
164     }
165 
166     if (!WriteInt32(request, attrs->linkTypeNum)) {
167         TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs linkTypeNum failed!");
168         return false;
169     }
170 
171     if (attrs->linkTypeNum > 0) {
172         if (!WriteBuffer(request, attrs->linkType, sizeof(LinkType) * attrs->linkTypeNum)) {
173             TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs linkType failed!");
174             return false;
175         }
176     }
177 
178     if (!WriteInt32(request, attrs->attr.streamAttr.streamType)) {
179         TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs streamAttr failed!");
180         return false;
181     }
182 
183     if (attrs->fastTransData != NULL) {
184         if (!WriteUint16(request, attrs->fastTransDataSize)) {
185             TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransDataSize failed!");
186             return false;
187         }
188         if (!WriteRawData(request, attrs->fastTransData, attrs->fastTransDataSize)) {
189             TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransData failed!");
190             return false;
191         }
192     } else {
193         if (!WriteUint16(request, 0)) {
194             TRANS_LOGE(TRANS_SDK, "OpenSession write my attrs fastTransDataSize failed!");
195             return false;
196         }
197     }
198 
199     return true;
200 }
201 
ServerIpcOpenSession(const SessionParam * param,TransInfo * info)202 int32_t ServerIpcOpenSession(const SessionParam *param, TransInfo *info)
203 {
204     TRANS_LOGD(TRANS_SDK, "enter.");
205     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
206     IpcIo request = {0};
207     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
208     WriteString(&request, param->sessionName);
209     WriteString(&request, param->peerSessionName);
210     WriteString(&request, param->peerDeviceId);
211     WriteString(&request, param->groupId);
212     if (!TransWriteIpcSessionAttrs(&request, param->attr)) {
213         TRANS_LOGE(TRANS_SDK, "OpenSession write attr failed!");
214         return SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED;
215     }
216 
217     TransSerializer transSerializer;
218     transSerializer.ret = SOFTBUS_ERR;
219     /* sync */
220     if (g_serverProxy == NULL) {
221         TRANS_LOGE(TRANS_SDK, "server proxy not init");
222         return SOFTBUS_NO_INIT;
223     }
224     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_OPEN_SESSION, &request,
225         &transSerializer, OpenSessionProxyCallback);
226     if (ans != EC_SUCCESS) {
227         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", transSerializer.ret);
228         return SOFTBUS_TRANS_PROXY_INVOKE_FAILED;
229     }
230     info->channelId = transSerializer.transInfo.channelId;
231     info->channelType = transSerializer.transInfo.channelType;
232     return transSerializer.ret;
233 }
234 
ServerIpcOpenAuthSession(const char * sessionName,const ConnectionAddr * addrInfo)235 int32_t ServerIpcOpenAuthSession(const char *sessionName, const ConnectionAddr *addrInfo)
236 {
237     TRANS_LOGD(TRANS_SDK, "enter.");
238     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
239     IpcIo request = {0};
240     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
241     WriteString(&request, sessionName);
242     bool value = WriteRawData(&request, (void*)addrInfo, sizeof(ConnectionAddr));
243     if (!value) {
244         return SOFTBUS_ERR;
245     }
246 
247     int32_t ret = SOFTBUS_ERR;
248     if (g_serverProxy == NULL) {
249         TRANS_LOGE(TRANS_SDK, "server proxy not init");
250         return SOFTBUS_NO_INIT;
251     }
252     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_OPEN_AUTH_SESSION, &request, &ret, ProxyCallback);
253     if (ans != EC_SUCCESS) {
254         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
255         return SOFTBUS_ERR;
256     }
257     return ret;
258 }
259 
ServerIpcNotifyAuthSuccess(int32_t channelId,int32_t channelType)260 int32_t ServerIpcNotifyAuthSuccess(int32_t channelId, int32_t channelType)
261 {
262     TRANS_LOGD(TRANS_SDK, "enter.");
263     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
264     IpcIo request = {0};
265     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
266     WriteInt32(&request, channelId);
267     WriteInt32(&request, channelType);
268     int32_t ret = SOFTBUS_ERR;
269     if (g_serverProxy == NULL) {
270         TRANS_LOGE(TRANS_SDK, "server proxy not init");
271         return SOFTBUS_NO_INIT;
272     }
273     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_NOTIFY_AUTH_SUCCESS, &request, &ret, ProxyCallback);
274     if (ans != EC_SUCCESS) {
275         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
276         return SOFTBUS_ERR;
277     }
278     return ret;
279 }
280 
ServerIpcCloseChannel(int32_t channelId,int32_t channelType)281 int32_t ServerIpcCloseChannel(int32_t channelId, int32_t channelType)
282 {
283     TRANS_LOGD(TRANS_SDK, "enter.");
284     uint8_t data[MAX_SOFT_BUS_IPC_LEN] = {0};
285     IpcIo request = {0};
286     IpcIoInit(&request, data, MAX_SOFT_BUS_IPC_LEN, 0);
287     WriteInt32(&request, channelId);
288     WriteInt32(&request, channelType);
289 
290     int32_t ret = SOFTBUS_ERR;
291     /* sync */
292     if (g_serverProxy == NULL) {
293         TRANS_LOGE(TRANS_SDK, "server proxy not init");
294         return SOFTBUS_NO_INIT;
295     }
296     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_CLOSE_CHANNEL, &request, &ret, ProxyCallback);
297     if (ans != EC_SUCCESS) {
298         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
299         return SOFTBUS_ERR;
300     }
301     return ret;
302 }
303 
ServerIpcSendMessage(int32_t channelId,int32_t channelType,const void * data,uint32_t len,int32_t msgType)304 int32_t ServerIpcSendMessage(int32_t channelId, int32_t channelType, const void *data, uint32_t len, int32_t msgType)
305 {
306     TRANS_LOGD(TRANS_SDK, "enter.");
307     uint32_t ipcDataLen = len + MAX_SOFT_BUS_IPC_LEN;
308     uint8_t *ipcData = (uint8_t *)SoftBusCalloc(ipcDataLen);
309     if (ipcData == NULL) {
310         TRANS_LOGE(TRANS_SDK, "malloc failed!");
311         return SOFTBUS_MALLOC_ERR;
312     }
313 
314     IpcIo request = {0};
315     IpcIoInit(&request, ipcData, ipcDataLen, 0);
316     WriteInt32(&request, channelId);
317     WriteInt32(&request, channelType);
318     WriteInt32(&request, msgType);
319     WriteUint32(&request, len);
320     WriteBuffer(&request, data, len);
321 
322     int32_t ret = SOFTBUS_ERR;
323     /* sync */
324     if (g_serverProxy == NULL) {
325         TRANS_LOGE(TRANS_SDK, "server proxy not init");
326         SoftBusFree(ipcData);
327         return SOFTBUS_NO_INIT;
328     }
329     int32_t ans = g_serverProxy->Invoke(g_serverProxy, SERVER_SESSION_SENDMSG, &request, &ret, ProxyCallback);
330     SoftBusFree(ipcData);
331     if (ans != EC_SUCCESS) {
332         TRANS_LOGE(TRANS_SDK, "callback ret=%{public}d", ret);
333         return SOFTBUS_ERR;
334     }
335     TRANS_LOGD(TRANS_SDK, "ok");
336     return ret;
337 }
338 
ServerIpcQosReport(int32_t channelId,int32_t chanType,int32_t appType,int32_t quality)339 int32_t ServerIpcQosReport(int32_t channelId, int32_t chanType, int32_t appType, int32_t quality)
340 {
341     (void)channelId;
342     (void)chanType;
343     (void)appType;
344     (void)quality;
345     return SOFTBUS_NOT_IMPLEMENT;
346 }
347 
ServerIpcGrantPermission(int uid,int pid,const char * sessionName)348 int32_t ServerIpcGrantPermission(int uid, int pid, const char *sessionName)
349 {
350     (void)uid;
351     (void)pid;
352     (void)sessionName;
353     return SOFTBUS_NOT_IMPLEMENT;
354 }
355 
ServerIpcRemovePermission(const char * sessionName)356 int32_t ServerIpcRemovePermission(const char *sessionName)
357 {
358     (void)sessionName;
359     return SOFTBUS_NOT_IMPLEMENT;
360 }
361 
ServerIpcStreamStats(int32_t channelId,int32_t channelType,const StreamSendStats * data)362 int32_t ServerIpcStreamStats(int32_t channelId, int32_t channelType, const StreamSendStats *data)
363 {
364     (void)channelId;
365     (void)channelType;
366     (void)data;
367     return SOFTBUS_NOT_IMPLEMENT;
368 }
369 
ServerIpcRippleStats(int32_t channelId,int32_t channelType,const TrafficStats * data)370 int32_t ServerIpcRippleStats(int32_t channelId, int32_t channelType, const TrafficStats *data)
371 {
372     (void)channelId;
373     (void)channelType;
374     (void)data;
375     return SOFTBUS_NOT_IMPLEMENT;
376 }
377 
ServerIpcEvaluateQos(const char * peerNetworkId,TransDataType dataType,const QosTV * qos,uint32_t qosCount)378 int32_t ServerIpcEvaluateQos(const char *peerNetworkId, TransDataType dataType, const QosTV *qos, uint32_t qosCount)
379 {
380     (void)peerNetworkId;
381     (void)dataType;
382     (void)qos;
383     (void)qosCount;
384     return SOFTBUS_NOT_IMPLEMENT;
385 }