1 /*
2 * Copyright (C) 2021-2025 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 "ipc_adapt.h"
17 #include "common_defs.h"
18 #include "device_auth_defines.h"
19 #include "hc_log.h"
20 #include "hc_types.h"
21 #include "hc_mutex.h"
22 #include "ipc_callback_stub.h"
23 #include "ipc_dev_auth_proxy.h"
24 #include "ipc_dev_auth_stub.h"
25 #include "ipc_sdk_defines.h"
26 #include "ipc_service_lite.h"
27 #include "ipc_skeleton.h"
28 #include "securec.h"
29 #include "string_util.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #define BUFF_MAX_SZ 128
36 #define IPC_CALL_BACK_MAX_NODES 64
37
38 typedef struct {
39 uintptr_t cbHook;
40 const IpcDataInfo *cbDataCache;
41 int32_t cacheNum;
42 IpcIo *reply;
43 } CallbackParams;
44
45 typedef void (*CallbackStub)(CallbackParams params);
46 typedef struct {
47 union {
48 DeviceAuthCallback devAuth;
49 DataChangeListener listener;
50 } cbCtx;
51 int64_t requestId;
52 char appId[BUFF_MAX_SZ];
53 int32_t cbType;
54 int32_t delOnFni;
55 int32_t methodId;
56 int32_t proxyId;
57 int32_t nodeIdx;
58 } IpcCallBackNode;
59
60 static struct {
61 IpcCallBackNode *ctx;
62 int32_t nodeCnt;
63 } g_ipcCallBackList = {NULL, 0};
64 static HcMutex g_cbListLock;
65
66 static StubDevAuthCb g_sdkCbStub;
67 static IClientProxy *g_proxyInstance = NULL;
68 static IpcObjectStub g_objectStub;
69
SetIpcCallBackNodeDefault(IpcCallBackNode * node)70 static void SetIpcCallBackNodeDefault(IpcCallBackNode *node)
71 {
72 (void)memset_s(node, sizeof(IpcCallBackNode), 0, sizeof(IpcCallBackNode));
73 node->proxyId = -1;
74 node->nodeIdx = -1;
75 return;
76 }
77
InitIpcCallBackList(void)78 int32_t InitIpcCallBackList(void)
79 {
80 int32_t i;
81
82 LOGI("initializing ...");
83 if (g_ipcCallBackList.ctx != NULL) {
84 LOGI("has initialized");
85 return HC_SUCCESS;
86 }
87
88 g_ipcCallBackList.ctx = HcMalloc(sizeof(IpcCallBackNode) * IPC_CALL_BACK_MAX_NODES, 0);
89 if (g_ipcCallBackList.ctx == NULL) {
90 LOGE("initialized failed");
91 return HC_ERROR;
92 }
93 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
94 SetIpcCallBackNodeDefault(g_ipcCallBackList.ctx + i);
95 }
96 (void)InitHcMutex(&g_cbListLock, false);
97 g_ipcCallBackList.nodeCnt = 0;
98 LOGI("initialized successful");
99 return HC_SUCCESS;
100 }
101
ResetIpcCallBackNode(IpcCallBackNode * node)102 static void ResetIpcCallBackNode(IpcCallBackNode *node)
103 {
104 ResetRemoteObject(node->proxyId);
105 SetIpcCallBackNodeDefault(node);
106 return;
107 }
108
LockCallbackList(void)109 static void LockCallbackList(void)
110 {
111 (void)LockHcMutex(&g_cbListLock);
112 return;
113 }
114
UnLockCallbackList(void)115 static void UnLockCallbackList(void)
116 {
117 UnlockHcMutex(&g_cbListLock);
118 return;
119 }
120
DeInitIpcCallBackList(void)121 void DeInitIpcCallBackList(void)
122 {
123 int32_t i;
124
125 if (g_ipcCallBackList.ctx == NULL) {
126 return;
127 }
128 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
129 ResetIpcCallBackNode(g_ipcCallBackList.ctx + i);
130 }
131 HcFree((void *)g_ipcCallBackList.ctx);
132 g_ipcCallBackList.ctx = NULL;
133 DestroyHcMutex(&g_cbListLock);
134 return;
135 }
136
ResetIpcCallBackNodeByNodeId(int32_t nodeIdx)137 void ResetIpcCallBackNodeByNodeId(int32_t nodeIdx)
138 {
139 LOGI("starting..., index %" LOG_PUB "d", nodeIdx);
140 if ((nodeIdx < 0) || (nodeIdx >= IPC_CALL_BACK_MAX_NODES)) {
141 return;
142 }
143 if (g_ipcCallBackList.ctx == NULL) {
144 return;
145 }
146 LockCallbackList();
147 ResetIpcCallBackNode(g_ipcCallBackList.ctx + nodeIdx);
148 UnLockCallbackList();
149 LOGI("done, index %" LOG_PUB "d", nodeIdx);
150 return;
151 }
152
GetIpcCallBackByAppId(const char * appId,int32_t type)153 static IpcCallBackNode *GetIpcCallBackByAppId(const char *appId, int32_t type)
154 {
155 int32_t i;
156
157 LOGI("appid: %" LOG_PUB "s", appId);
158 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
159 if (g_ipcCallBackList.ctx[i].appId[0] == 0) {
160 continue;
161 }
162 if (IsStrEqual(g_ipcCallBackList.ctx[i].appId, appId) && (g_ipcCallBackList.ctx[i].cbType == type)) {
163 return &g_ipcCallBackList.ctx[i];
164 }
165 }
166 return NULL;
167 }
168
GetFreeIpcCallBackNode(void)169 static IpcCallBackNode *GetFreeIpcCallBackNode(void)
170 {
171 int32_t i;
172
173 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
174 if ((g_ipcCallBackList.ctx[i].appId[0] == 0) && (g_ipcCallBackList.ctx[i].cbType == 0)) {
175 g_ipcCallBackList.ctx[i].nodeIdx = i;
176 return &g_ipcCallBackList.ctx[i];
177 }
178 }
179 return NULL;
180 }
181
SetCbDeathRecipient(int32_t type,int32_t objIdx,int32_t cbDataIdx)182 static void SetCbDeathRecipient(int32_t type, int32_t objIdx, int32_t cbDataIdx)
183 {
184 if ((type == CB_TYPE_DEV_AUTH) || (type == CB_TYPE_LISTENER)) {
185 AddCbDeathRecipient(objIdx, cbDataIdx);
186 }
187 return;
188 }
189
AddIpcCbObjByAppId(const char * appId,int32_t objIdx,int32_t type)190 void AddIpcCbObjByAppId(const char *appId, int32_t objIdx, int32_t type)
191 {
192 IpcCallBackNode *node = NULL;
193
194 if (g_ipcCallBackList.ctx == NULL) {
195 LOGE("list not inited");
196 return;
197 }
198
199 LockCallbackList();
200 if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
201 UnLockCallbackList();
202 LOGE("list is full");
203 return;
204 }
205
206 node = GetIpcCallBackByAppId(appId, type);
207 if (node != NULL) {
208 node->proxyId = objIdx;
209 SetCbDeathRecipient(type, objIdx, node->nodeIdx);
210 LOGI("ipc object add success, appid: %" LOG_PUB "s, proxyId %" LOG_PUB "d", appId, node->proxyId);
211 }
212 UnLockCallbackList();
213 return;
214 }
215
AddIpcCallBackByAppId(const char * appId,const uint8_t * cbPtr,int32_t cbSz,int32_t type)216 int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type)
217 {
218 if (g_ipcCallBackList.ctx == NULL) {
219 LOGE("list not inited");
220 return HC_ERROR;
221 }
222
223 LockCallbackList();
224 if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
225 UnLockCallbackList();
226 LOGE("list is full");
227 return HC_ERROR;
228 }
229
230 IpcCallBackNode *node = GetIpcCallBackByAppId(appId, type);
231 if (node != NULL) {
232 if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) {
233 LOGE("callback context memory copy failed");
234 UnLockCallbackList();
235 return HC_ERR_MEMORY_COPY;
236 }
237 if (node->proxyId >= 0) {
238 ResetRemoteObject(node->proxyId);
239 node->proxyId = -1;
240 }
241 UnLockCallbackList();
242 return HC_SUCCESS;
243 }
244
245 node = GetFreeIpcCallBackNode();
246 if (node == NULL) {
247 UnLockCallbackList();
248 LOGE("get free node failed");
249 return HC_ERROR;
250 }
251 node->cbType = type;
252 if (memcpy_s(&(node->appId), sizeof(node->appId), appId, HcStrlen(appId) + 1) != EOK) {
253 ResetIpcCallBackNode(node);
254 UnLockCallbackList();
255 LOGE("appid memory copy failed");
256 return HC_ERROR;
257 }
258 if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) {
259 ResetIpcCallBackNode(node);
260 UnLockCallbackList();
261 LOGE("callback context memory copy failed");
262 return HC_ERROR;
263 }
264 node->proxyId = -1;
265 g_ipcCallBackList.nodeCnt++;
266 UnLockCallbackList();
267 return HC_SUCCESS;
268 }
269
DelIpcCallBackByAppId(const char * appId,int32_t type)270 void DelIpcCallBackByAppId(const char *appId, int32_t type)
271 {
272 IpcCallBackNode *node = NULL;
273
274 if ((g_ipcCallBackList.nodeCnt <= 0) || (g_ipcCallBackList.ctx == NULL)) {
275 return;
276 }
277
278 LockCallbackList();
279 node = GetIpcCallBackByAppId(appId, type);
280 if (node != NULL) {
281 ResetIpcCallBackNode(node);
282 g_ipcCallBackList.nodeCnt--;
283 }
284 UnLockCallbackList();
285 return;
286 }
287
GetIpcCallBackByReqId(int64_t reqId,int32_t type)288 static IpcCallBackNode *GetIpcCallBackByReqId(int64_t reqId, int32_t type)
289 {
290 int32_t i;
291
292 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
293 if ((reqId == g_ipcCallBackList.ctx[i].requestId) &&
294 (g_ipcCallBackList.ctx[i].cbType == type)) {
295 return &g_ipcCallBackList.ctx[i];
296 }
297 }
298 return NULL;
299 }
300
AddReqIdByAppId(const char * appId,int64_t reqId)301 int32_t AddReqIdByAppId(const char *appId, int64_t reqId)
302 {
303 IpcCallBackNode *node = NULL;
304
305 if (g_ipcCallBackList.ctx == NULL) {
306 LOGE("ipc callback list not inited");
307 return HC_ERROR;
308 }
309
310 LockCallbackList();
311 node = GetIpcCallBackByAppId(appId, CB_TYPE_DEV_AUTH);
312 if (node == NULL) {
313 UnLockCallbackList();
314 LOGE("ipc callback node not found, appid: %" LOG_PUB "s", appId);
315 return HC_ERROR;
316 }
317 node->requestId = reqId;
318 node->delOnFni = 0;
319 UnLockCallbackList();
320 LOGI("success, appid: %" LOG_PUB "s, requestId: %" LOG_PUB PRId64, appId, reqId);
321 return HC_SUCCESS;
322 }
323
AddIpcCbObjByReqId(int64_t reqId,int32_t objIdx,int32_t type)324 void AddIpcCbObjByReqId(int64_t reqId, int32_t objIdx, int32_t type)
325 {
326 IpcCallBackNode *node = NULL;
327
328 if (g_ipcCallBackList.ctx == NULL) {
329 LOGE("list not inited");
330 return;
331 }
332
333 LockCallbackList();
334 if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
335 UnLockCallbackList();
336 LOGE("list is full");
337 return;
338 }
339
340 node = GetIpcCallBackByReqId(reqId, type);
341 if (node != NULL) {
342 node->proxyId = objIdx;
343 LOGI("ipc object add success, request id %" LOG_PUB PRId64 ", type %" LOG_PUB "d, proxy id %" LOG_PUB "d",
344 reqId, type, node->proxyId);
345 }
346 UnLockCallbackList();
347 return;
348 }
349
AddIpcCallBackByReqId(int64_t reqId,const uint8_t * cbPtr,int32_t cbSz,int32_t type)350 int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type)
351 {
352 errno_t eno;
353
354 if (g_ipcCallBackList.ctx == NULL) {
355 LOGE("list is full");
356 return HC_ERROR;
357 }
358
359 LockCallbackList();
360 if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
361 UnLockCallbackList();
362 LOGE("list is full");
363 return HC_ERROR;
364 }
365
366 IpcCallBackNode *node = GetIpcCallBackByReqId(reqId, type);
367 if (node != NULL) {
368 eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz);
369 if (eno != EOK) {
370 UnLockCallbackList();
371 LOGE("callback context memory copy failed");
372 return HC_ERROR;
373 }
374 if (node->proxyId >= 0) {
375 ResetRemoteObject(node->proxyId);
376 node->proxyId = -1;
377 }
378 UnLockCallbackList();
379 return HC_SUCCESS;
380 }
381
382 node = GetFreeIpcCallBackNode();
383 if (node == NULL) {
384 UnLockCallbackList();
385 LOGE("get free node failed");
386 return HC_ERROR;
387 }
388 node->cbType = type;
389 node->requestId = reqId;
390 eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz);
391 if (eno != EOK) {
392 UnLockCallbackList();
393 ResetIpcCallBackNode(node);
394 LOGE("callback context memory copy failed");
395 return HC_ERROR;
396 }
397 node->delOnFni = 1;
398 node->proxyId = -1;
399 g_ipcCallBackList.nodeCnt++;
400 UnLockCallbackList();
401 return HC_SUCCESS;
402 }
403
DelCallBackByReqId(int64_t reqId,int32_t type)404 static void DelCallBackByReqId(int64_t reqId, int32_t type)
405 {
406 IpcCallBackNode *node = NULL;
407
408 if ((g_ipcCallBackList.nodeCnt <= 0) || (g_ipcCallBackList.ctx == NULL)) {
409 return;
410 }
411
412 node = GetIpcCallBackByReqId(reqId, type);
413 if ((node != NULL) && (node->delOnFni == 1)) {
414 ResetIpcCallBackNode(node);
415 g_ipcCallBackList.nodeCnt--;
416 }
417 return;
418 }
419
DelIpcCallBackByReqId(int64_t reqId,int32_t type,bool withLock)420 void DelIpcCallBackByReqId(int64_t reqId, int32_t type, bool withLock)
421 {
422 if (withLock) {
423 LockCallbackList();
424 DelCallBackByReqId(reqId, type);
425 UnLockCallbackList();
426 return;
427 }
428 DelCallBackByReqId(reqId, type);
429 return;
430 }
431
OnTransmitStub(CallbackParams params)432 static void OnTransmitStub(CallbackParams params)
433 {
434 int64_t requestId = 0;
435 int32_t inOutLen = sizeof(requestId);
436 uint8_t *data = NULL;
437 uint32_t dataLen = 0u;
438 bool bRet = false;
439 bool (*onTransmitHook)(int64_t, uint8_t *, uint32_t) = (bool (*)(int64_t, uint8_t *, uint32_t))(params.cbHook);
440
441 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
442 (uint8_t *)(&requestId), &inOutLen);
443 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
444 PARAM_TYPE_COMM_DATA, (uint8_t *)&data, (int32_t *)(&dataLen));
445
446 bRet = onTransmitHook(requestId, data, dataLen);
447 (bRet == true) ? WriteInt32(params.reply, HC_SUCCESS) : WriteInt32(params.reply, HC_ERROR);
448 return;
449 }
450
OnSessKeyStub(CallbackParams params)451 static void OnSessKeyStub(CallbackParams params)
452 {
453 int64_t requestId = 0;
454 int32_t inOutLen = sizeof(requestId);
455 uint8_t *keyData = NULL;
456 uint32_t dataLen = 0u;
457 void (*onSessKeyHook)(int64_t, uint8_t *, uint32_t) = (void (*)(int64_t, uint8_t *, uint32_t))(params.cbHook);
458
459 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
460 (uint8_t *)(&requestId), &inOutLen);
461 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_SESS_KEY,
462 (uint8_t *)(&keyData), (int32_t *)(&dataLen));
463
464 onSessKeyHook(requestId, keyData, dataLen);
465 WriteInt32(params.reply, HC_SUCCESS);
466 return;
467 }
468
OnFinishStub(CallbackParams params)469 static void OnFinishStub(CallbackParams params)
470 {
471 int64_t requestId = 0;
472 int32_t opCode = 0;
473 int32_t inOutLen;
474 char *data = NULL;
475 void (*onFinishHook)(int64_t, int32_t, char *) = (void (*)(int64_t, int32_t, char *))(params.cbHook);
476
477 inOutLen = sizeof(requestId);
478 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
479 (uint8_t *)(&requestId), &inOutLen);
480 inOutLen = sizeof(opCode);
481 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
482 (uint8_t *)(&opCode), &inOutLen);
483 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, (uint8_t *)(&data), NULL);
484
485 onFinishHook(requestId, opCode, data);
486 WriteInt32(params.reply, HC_SUCCESS);
487 return;
488 }
489
OnErrorStub(CallbackParams params)490 static void OnErrorStub(CallbackParams params)
491 {
492 int64_t requestId = 0;
493 int32_t opCode = 0;
494 int32_t errCode = 0;
495 int32_t inOutLen;
496 char *errInfo = NULL;
497 void (*onErrorHook)(int64_t, int32_t, int32_t, char *) =
498 (void (*)(int64_t, int32_t, int32_t, char *))(params.cbHook);
499
500 inOutLen = sizeof(requestId);
501 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
502 (uint8_t *)(&requestId), &inOutLen);
503 inOutLen = sizeof(opCode);
504 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
505 (uint8_t *)(&opCode), &inOutLen);
506 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERRCODE,
507 (uint8_t *)(&errCode), &inOutLen);
508 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERR_INFO,
509 (uint8_t *)(&errInfo), NULL);
510
511 onErrorHook(requestId, opCode, errCode, errInfo);
512 WriteInt32(params.reply, HC_SUCCESS);
513 return;
514 }
515
OnRequestStub(CallbackParams params)516 static void OnRequestStub(CallbackParams params)
517 {
518 int64_t requestId = 0;
519 int32_t opCode = 0;
520 int32_t inOutLen;
521 char *reqParams = NULL;
522 char *reqResult = NULL;
523 char *(*onReqHook)(int64_t, int32_t, char *) = (char *(*)(int64_t, int32_t, char *))(params.cbHook);
524
525 inOutLen = sizeof(requestId);
526 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
527 (uint8_t *)(&requestId), &inOutLen);
528 inOutLen = sizeof(opCode);
529 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
530 (uint8_t *)(&opCode), &inOutLen);
531 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQ_INFO,
532 (uint8_t *)(&reqParams), NULL);
533
534 reqResult = onReqHook(requestId, opCode, reqParams);
535 if (reqResult == NULL) {
536 WriteInt32(params.reply, HC_ERROR);
537 return;
538 }
539 WriteInt32(params.reply, HC_SUCCESS);
540 WriteString(params.reply, (const char *)(reqResult));
541 HcFree(reqResult);
542 reqResult = NULL;
543 return;
544 }
545
OnGroupCreatedStub(CallbackParams params)546 static void OnGroupCreatedStub(CallbackParams params)
547 {
548 const char *groupInfo = NULL;
549 void (*onGroupCreatedHook)(const char *) = (void (*)(const char *))(params.cbHook);
550
551 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
552 PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
553
554 onGroupCreatedHook(groupInfo);
555 WriteInt32(params.reply, HC_SUCCESS);
556 return;
557 }
558
OnGroupDeletedStub(CallbackParams params)559 static void OnGroupDeletedStub(CallbackParams params)
560 {
561 const char *groupInfo = NULL;
562 void (*onDelGroupHook)(const char *) = (void (*)(const char *))(params.cbHook);
563
564 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
565 PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
566
567 onDelGroupHook(groupInfo);
568 WriteInt32(params.reply, HC_SUCCESS);
569 return;
570 }
571
OnDevBoundStub(CallbackParams params)572 static void OnDevBoundStub(CallbackParams params)
573 {
574 const char *groupInfo = NULL;
575 const char *udid = NULL;
576 void (*onDevBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook);
577
578 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
579 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
580 PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
581
582 onDevBoundHook(udid, groupInfo);
583 WriteInt32(params.reply, HC_SUCCESS);
584 return;
585 }
586
OnDevUnboundStub(CallbackParams params)587 static void OnDevUnboundStub(CallbackParams params)
588 {
589 const char *groupInfo = NULL;
590 const char *udid = NULL;
591 void (*onDevUnBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook);
592
593 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
594 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
595 PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
596
597 onDevUnBoundHook(udid, groupInfo);
598 WriteInt32(params.reply, HC_SUCCESS);
599 return;
600 }
601
OnDevUnTrustStub(CallbackParams params)602 static void OnDevUnTrustStub(CallbackParams params)
603 {
604 const char *udid = NULL;
605 void (*onDevUnTrustHook)(const char *) = (void (*)(const char *))(params.cbHook);
606
607 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
608
609 onDevUnTrustHook(udid);
610 WriteInt32(params.reply, HC_SUCCESS);
611 return;
612 }
613
OnDelLastGroupStub(CallbackParams params)614 static void OnDelLastGroupStub(CallbackParams params)
615 {
616 const char *udid = NULL;
617 int32_t groupType = 0;
618 int32_t inOutLen;
619 void (*onDelLastGroupHook)(const char *, int32_t) = (void (*)(const char *, int32_t))(params.cbHook);
620
621 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
622 inOutLen = sizeof(groupType);
623 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
624 PARAM_TYPE_GROUP_TYPE, (uint8_t *)(&groupType), &inOutLen);
625
626 onDelLastGroupHook(udid, groupType);
627 WriteInt32(params.reply, HC_SUCCESS);
628 return;
629 }
630
OnTrustDevNumChangedStub(CallbackParams params)631 static void OnTrustDevNumChangedStub(CallbackParams params)
632 {
633 int32_t devNum = 0;
634 int32_t inOutLen = sizeof(devNum);
635 void (*onTrustDevNumChangedHook)(int32_t) = (void (*)(int32_t))(params.cbHook);
636
637 (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
638 PARAM_TYPE_DATA_NUM, (uint8_t *)(&devNum), &inOutLen);
639
640 onTrustDevNumChangedHook(devNum);
641 WriteInt32(params.reply, HC_SUCCESS);
642 return;
643 }
644
ProcCbHook(int32_t callbackId,uintptr_t cbHook,const IpcDataInfo * cbDataCache,int32_t cacheNum,uintptr_t replyCtx)645 void ProcCbHook(int32_t callbackId, uintptr_t cbHook,
646 const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx)
647 {
648 CallbackStub stubTable[] = {
649 OnTransmitStub, OnSessKeyStub, OnFinishStub, OnErrorStub,
650 OnRequestStub, OnGroupCreatedStub, OnGroupDeletedStub, OnDevBoundStub,
651 OnDevUnboundStub, OnDevUnTrustStub, OnDelLastGroupStub, OnTrustDevNumChangedStub
652 };
653 IpcIo *reply = (IpcIo *)(replyCtx);
654 if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_TRUST_DEV_NUM_CHANGED)) {
655 LOGE("Invalid call back id");
656 return;
657 }
658 if (cbHook == 0x0) {
659 LOGE("Invalid call back hook");
660 return;
661 }
662 LOGI("call service callback start. CbId: %" LOG_PUB "d", callbackId);
663 CallbackParams params = { cbHook, cbDataCache, cacheNum, reply };
664 stubTable[callbackId - 1](params);
665 LOGI("call service callback end");
666 return;
667 }
668
EncodeCallData(IpcIo * dataParcel,int32_t type,const uint8_t * param,int32_t paramSz)669 static uint32_t EncodeCallData(IpcIo *dataParcel, int32_t type, const uint8_t *param, int32_t paramSz)
670 {
671 const uint8_t *paramTmp = NULL;
672 int32_t zeroVal = 0;
673
674 paramTmp = param;
675 if ((param == NULL) || (paramSz == 0)) {
676 paramTmp = (const uint8_t *)(&zeroVal);
677 paramSz = sizeof(zeroVal);
678 }
679 WriteInt32(dataParcel, type);
680 WriteUint32(dataParcel, (uint32_t)paramSz);
681 bool ret = WriteBuffer(dataParcel, (const void *)(paramTmp), (uint32_t)paramSz);
682 if (!ret) {
683 return (uint32_t)(HC_ERROR);
684 }
685 return (uint32_t)(HC_SUCCESS);
686 }
687
688 /* group auth callback adapter */
GaCbOnTransmitWithType(int64_t requestId,const uint8_t * data,uint32_t dataLen,int32_t type)689 static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type)
690 {
691 uint32_t ret;
692 IpcIo *dataParcel = NULL;
693 IpcIo reply;
694 uint8_t dataBuf[IPC_STACK_BUFF_SZ] = { 0 };
695 IpcCallBackNode *node = NULL;
696
697 LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
698 IpcIoInit(&reply, (void *)dataBuf, sizeof(dataBuf), 0);
699 LockCallbackList();
700 node = GetIpcCallBackByReqId(requestId, type);
701 if (node == NULL) {
702 UnLockCallbackList();
703 LOGE("onTransmit hook is null, request id %" LOG_PUB PRId64, requestId);
704 return false;
705 }
706 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
707 if (dataParcel == NULL) {
708 UnLockCallbackList();
709 return false;
710 }
711 ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (const uint8_t *)(&requestId), sizeof(requestId));
712 ret |= EncodeCallData(dataParcel, PARAM_TYPE_COMM_DATA, data, dataLen);
713 if (ret != HC_SUCCESS) {
714 UnLockCallbackList();
715 HcFree((void *)dataParcel);
716 LOGE("build trans data failed");
717 return false;
718 }
719 ActCallback(node->proxyId, CB_ID_ON_TRANS, (uintptr_t)(node->cbCtx.devAuth.onTransmit), dataParcel, &reply);
720 UnLockCallbackList();
721 HcFree((void *)dataParcel);
722 LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
723 int32_t value;
724 ReadInt32(&reply, &value);
725 if (value == HC_SUCCESS) {
726 return true;
727 }
728 return false;
729 }
730
IpcGaCbOnTransmit(int64_t requestId,const uint8_t * data,uint32_t dataLen)731 static bool IpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen)
732 {
733 return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH);
734 }
735
TmpIpcGaCbOnTransmit(int64_t requestId,const uint8_t * data,uint32_t dataLen)736 static bool TmpIpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen)
737 {
738 return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH);
739 }
740
GaCbOnSessionKeyRetWithType(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen,int32_t type)741 static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type)
742 {
743 uint32_t ret;
744 IpcIo *dataParcel = NULL;
745 IpcCallBackNode *node = NULL;
746
747 LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
748 LockCallbackList();
749 node = GetIpcCallBackByReqId(requestId, type);
750 if (node == NULL) {
751 UnLockCallbackList();
752 LOGE("onSessionKeyReturned hook is null, request id %" LOG_PUB PRId64, requestId);
753 return;
754 }
755 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
756 if (dataParcel == NULL) {
757 UnLockCallbackList();
758 return;
759 }
760 ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
761 ret |= EncodeCallData(dataParcel, PARAM_TYPE_SESS_KEY, sessKey, sessKeyLen);
762 if (ret != HC_SUCCESS) {
763 UnLockCallbackList();
764 HcFree((void *)dataParcel);
765 LOGE("build trans data failed");
766 return;
767 }
768 ActCallback(node->proxyId, CB_ID_SESS_KEY_DONE,
769 (uintptr_t)(node->cbCtx.devAuth.onSessionKeyReturned), dataParcel, NULL);
770 UnLockCallbackList();
771 HcFree((void *)dataParcel);
772 LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
773 return;
774 }
775
IpcGaCbOnSessionKeyReturned(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen)776 static void IpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen)
777 {
778 GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH);
779 return;
780 }
781
TmpIpcGaCbOnSessionKeyReturned(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen)782 static void TmpIpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen)
783 {
784 GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH);
785 return;
786 }
787
GaCbOnFinishWithType(int64_t requestId,int32_t operationCode,const char * returnData,int32_t type)788 static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type)
789 {
790 uint32_t ret;
791 IpcIo *dataParcel = NULL;
792 IpcCallBackNode *node = NULL;
793
794 LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
795 LockCallbackList();
796 node = GetIpcCallBackByReqId(requestId, type);
797 if (node == NULL) {
798 UnLockCallbackList();
799 LOGE("onFinish hook is null, request id %" LOG_PUB PRId64, requestId);
800 return;
801 }
802 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
803 if (dataParcel == NULL) {
804 UnLockCallbackList();
805 return;
806 }
807 ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
808 ret |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
809 if (returnData != NULL) {
810 ret |= EncodeCallData(dataParcel, PARAM_TYPE_COMM_DATA, (const uint8_t *)(returnData),
811 HcStrlen(returnData) + 1);
812 }
813 if (ret != HC_SUCCESS) {
814 UnLockCallbackList();
815 HcFree((void *)dataParcel);
816 LOGE("build trans data failed");
817 return;
818 }
819 ActCallback(node->proxyId, CB_ID_ON_FINISH, (uintptr_t)(node->cbCtx.devAuth.onFinish), dataParcel, NULL);
820 /* delete request id */
821 DelIpcCallBackByReqId(requestId, type, false);
822 UnLockCallbackList();
823 HcFree((void *)dataParcel);
824 LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
825 return;
826 }
827
IpcGaCbOnFinish(int64_t requestId,int32_t operationCode,const char * returnData)828 static void IpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData)
829 {
830 GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH);
831 return;
832 }
833
TmpIpcGaCbOnFinish(int64_t requestId,int32_t operationCode,const char * returnData)834 static void TmpIpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData)
835 {
836 GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH);
837 return;
838 }
839
GaCbOnErrorWithType(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn,int32_t type)840 static void GaCbOnErrorWithType(int64_t requestId, int32_t operationCode,
841 int32_t errorCode, const char *errorReturn, int32_t type)
842 {
843 uint32_t ret;
844 IpcIo *dataParcel = NULL;
845 IpcCallBackNode *node = NULL;
846
847 LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
848 LockCallbackList();
849 node = GetIpcCallBackByReqId(requestId, type);
850 if (node == NULL) {
851 UnLockCallbackList();
852 LOGE("onError hook is null, request id %" LOG_PUB PRId64, requestId);
853 return;
854 }
855 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
856 if (dataParcel == NULL) {
857 UnLockCallbackList();
858 return;
859 }
860 ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
861 ret |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
862 ret |= EncodeCallData(dataParcel, PARAM_TYPE_ERRCODE, (uint8_t *)(&errorCode), sizeof(errorCode));
863 if (errorReturn != NULL) {
864 ret |= EncodeCallData(dataParcel, PARAM_TYPE_ERR_INFO, (const uint8_t *)(errorReturn),
865 HcStrlen(errorReturn) + 1);
866 }
867 if (ret != HC_SUCCESS) {
868 UnLockCallbackList();
869 HcFree((void *)dataParcel);
870 LOGE("build trans data failed");
871 return;
872 }
873 ActCallback(node->proxyId, CB_ID_ON_ERROR, (uintptr_t)(node->cbCtx.devAuth.onError), dataParcel, NULL);
874 /* delete request id */
875 DelIpcCallBackByReqId(requestId, type, false);
876 UnLockCallbackList();
877 HcFree((void *)dataParcel);
878 LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
879 return;
880 }
881
IpcGaCbOnError(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn)882 static void IpcGaCbOnError(int64_t requestId, int32_t operationCode, int32_t errorCode, const char *errorReturn)
883 {
884 GaCbOnErrorWithType(requestId, operationCode, errorCode, errorReturn, CB_TYPE_DEV_AUTH);
885 return;
886 }
887
TmpIpcGaCbOnError(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn)888 static void TmpIpcGaCbOnError(int64_t requestId, int32_t operationCode, int32_t errorCode, const char *errorReturn)
889 {
890 GaCbOnErrorWithType(requestId, operationCode, errorCode, errorReturn, CB_TYPE_TMP_DEV_AUTH);
891 return;
892 }
893
GaCbOnRequestWithType(int64_t requestId,int32_t operationCode,const char * reqParams,int32_t type)894 static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type)
895 {
896 int32_t ret;
897 uint32_t uRet;
898 IpcIo *dataParcel = NULL;
899 IpcIo reply;
900 uint8_t dataBuf[IPC_STACK_BUFF_SZ] = { 0 };
901 const char *dPtr = NULL;
902 IpcCallBackNode *node = NULL;
903
904 LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
905 IpcIoInit(&reply, (void *)dataBuf, sizeof(dataBuf), 0);
906 LockCallbackList();
907 node = GetIpcCallBackByReqId(requestId, type);
908 if (node == NULL) {
909 UnLockCallbackList();
910 LOGE("onRequest hook is null, request id %" LOG_PUB PRId64, requestId);
911 return NULL;
912 }
913 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
914 if (dataParcel == NULL) {
915 UnLockCallbackList();
916 return NULL;
917 }
918 uRet = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
919 uRet |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
920 if (reqParams != NULL) {
921 uRet |= EncodeCallData(dataParcel, PARAM_TYPE_REQ_INFO, (const uint8_t *)(reqParams), HcStrlen(reqParams) + 1);
922 }
923 if (uRet != HC_SUCCESS) {
924 UnLockCallbackList();
925 HcFree((void *)dataParcel);
926 LOGE("build trans data failed");
927 return NULL;
928 }
929
930 ActCallback(node->proxyId, CB_ID_ON_REQUEST, (uintptr_t)(node->cbCtx.devAuth.onRequest), dataParcel, &reply);
931 UnLockCallbackList();
932 HcFree((void *)dataParcel);
933 ReadInt32(&reply, &ret);
934 if (ret == HC_SUCCESS) {
935 dPtr = (const char *)ReadString(&reply, NULL);
936 }
937 LOGI("process done, request id: %" LOG_PUB PRId64 ", %" LOG_PUB "s result", requestId,
938 (dPtr != NULL) ? "valid" : "invalid");
939 return (dPtr != NULL) ? strdup(dPtr) : NULL;
940 }
941
CanFindCbByReqId(int64_t requestId)942 static bool CanFindCbByReqId(int64_t requestId)
943 {
944 LockCallbackList();
945 IpcCallBackNode *node = GetIpcCallBackByReqId(requestId, CB_TYPE_DEV_AUTH);
946 UnLockCallbackList();
947 return (node != NULL) ? true : false;
948 }
949
IpcGaCbOnRequest(int64_t requestId,int32_t operationCode,const char * reqParams)950 static char *IpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams)
951 {
952 if (!CanFindCbByReqId(requestId)) {
953 CJson *reqParamsJson = CreateJsonFromString(reqParams);
954 if (reqParamsJson == NULL) {
955 LOGE("failed to create json from string!");
956 return NULL;
957 }
958 const char *callerAppId = GetStringFromJson(reqParamsJson, FIELD_APP_ID);
959 if (callerAppId == NULL) {
960 LOGE("failed to get appId from json object!");
961 FreeJson(reqParamsJson);
962 return NULL;
963 }
964 int32_t ret = AddReqIdByAppId(callerAppId, requestId);
965 FreeJson(reqParamsJson);
966 if (ret != HC_SUCCESS) {
967 return NULL;
968 }
969 }
970 return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH);
971 }
972
TmpIpcGaCbOnRequest(int64_t requestId,int32_t operationCode,const char * reqParams)973 static char *TmpIpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams)
974 {
975 return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH);
976 }
977
IpcOnGroupCreated(const char * groupInfo)978 void IpcOnGroupCreated(const char *groupInfo)
979 {
980 int32_t i;
981 uint32_t ret;
982 IpcIo *dataParcel = NULL;
983 DataChangeListener *listener = NULL;
984
985 if (groupInfo == NULL) {
986 LOGE("IpcOnGroupCreated, params error");
987 return;
988 }
989
990 LockCallbackList();
991 if (g_ipcCallBackList.ctx == NULL) {
992 UnLockCallbackList();
993 LOGE("IpcCallBackList not initialized.");
994 return;
995 }
996 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
997 if (dataParcel == NULL) {
998 UnLockCallbackList();
999 LOGE("Failed to InitIpcDataCache.");
1000 return;
1001 }
1002
1003 ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1004 if (ret != HC_SUCCESS) {
1005 UnLockCallbackList();
1006 HcFree((void *)dataParcel);
1007 LOGE("IpcGaCbOnRequest, build trans data failed");
1008 return;
1009 }
1010
1011 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1012 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1013 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1014 if (listener->onGroupCreated == NULL) {
1015 continue;
1016 }
1017 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED,
1018 (uintptr_t)(listener->onGroupCreated), dataParcel, NULL);
1019 }
1020 }
1021 UnLockCallbackList();
1022 HcFree((void *)dataParcel);
1023 return;
1024 }
1025
IpcOnGroupDeleted(const char * groupInfo)1026 void IpcOnGroupDeleted(const char *groupInfo)
1027 {
1028 int32_t i;
1029 uint32_t ret;
1030 IpcIo *dataParcel = NULL;
1031 DataChangeListener *listener = NULL;
1032
1033 if (groupInfo == NULL) {
1034 LOGE("GroupInfo is NULL, params error.");
1035 return;
1036 }
1037
1038 LockCallbackList();
1039 if (g_ipcCallBackList.ctx == NULL) {
1040 LOGE("IpcCallBackList is not initialized.");
1041 UnLockCallbackList();
1042 return;
1043 }
1044 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1045 if (dataParcel == NULL) {
1046 LOGE("Failed to init IpcDataCache.");
1047 UnLockCallbackList();
1048 return;
1049 }
1050
1051 ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1052 if (ret != HC_SUCCESS) {
1053 UnLockCallbackList();
1054 HcFree((void *)dataParcel);
1055 LOGE("IpcGaCbOnRequest, build trans data failed.");
1056 return;
1057 }
1058
1059 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1060 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1061 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1062 if (listener->onGroupDeleted == NULL) {
1063 continue;
1064 }
1065 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED,
1066 (uintptr_t)(listener->onGroupDeleted), dataParcel, NULL);
1067 }
1068 }
1069 UnLockCallbackList();
1070 HcFree((void *)dataParcel);
1071 return;
1072 }
1073
IpcOnDeviceBound(const char * peerUdid,const char * groupInfo)1074 void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo)
1075 {
1076 int32_t i;
1077 uint32_t ret;
1078 IpcIo *dataParcel = NULL;
1079 DataChangeListener *listener = NULL;
1080
1081 if ((peerUdid == NULL) || (groupInfo == NULL)) {
1082 LOGE("Param is NULL.");
1083 return;
1084 }
1085
1086 LockCallbackList();
1087 if (g_ipcCallBackList.ctx == NULL) {
1088 LOGE("Error occurs, callBackList is not initialized.");
1089 UnLockCallbackList();
1090 return;
1091 }
1092 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1093 if (dataParcel == NULL) {
1094 LOGE("Init ipc data cache occur error.");
1095 UnLockCallbackList();
1096 return;
1097 }
1098
1099 ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1100 ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1101 if (ret != HC_SUCCESS) {
1102 UnLockCallbackList();
1103 HcFree((void *)dataParcel);
1104 LOGE("Encode trans data failed.");
1105 return;
1106 }
1107
1108 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1109 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1110 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1111 if (listener->onDeviceBound == NULL) {
1112 continue;
1113 }
1114 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND,
1115 (uintptr_t)(listener->onDeviceBound), dataParcel, NULL);
1116 }
1117 }
1118 UnLockCallbackList();
1119 HcFree((void *)dataParcel);
1120 return;
1121 }
1122
IpcOnDeviceUnBound(const char * peerUdid,const char * groupInfo)1123 void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo)
1124 {
1125 int32_t i;
1126 uint32_t ret;
1127 IpcIo *dataParcel = NULL;
1128 DataChangeListener *listener = NULL;
1129
1130 if ((peerUdid == NULL) || (groupInfo == NULL)) {
1131 LOGE("Argument Error");
1132 return;
1133 }
1134
1135 LockCallbackList();
1136 if (g_ipcCallBackList.ctx == NULL) {
1137 UnLockCallbackList();
1138 LOGE("CallBackList ctx is not initialized!");
1139 return;
1140 }
1141 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1142 if (dataParcel == NULL) {
1143 LOGE("Ipc data cache is not init.");
1144 UnLockCallbackList();
1145 return;
1146 }
1147
1148 ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1149 ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1150 if (ret != HC_SUCCESS) {
1151 UnLockCallbackList();
1152 HcFree((void *)dataParcel);
1153 LOGE("build trans data failed");
1154 return;
1155 }
1156
1157 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1158 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1159 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1160 if (listener->onDeviceUnBound == NULL) {
1161 continue;
1162 }
1163 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND,
1164 (uintptr_t)(listener->onDeviceUnBound), dataParcel, NULL);
1165 }
1166 }
1167 UnLockCallbackList();
1168 HcFree((void *)dataParcel);
1169 return;
1170 }
1171
IpcOnDeviceNotTrusted(const char * peerUdid)1172 void IpcOnDeviceNotTrusted(const char *peerUdid)
1173 {
1174 int32_t i;
1175 uint32_t ret;
1176 IpcIo *dataParcel = NULL;
1177 DataChangeListener *listener = NULL;
1178
1179 if (peerUdid == NULL) {
1180 LOGE("Invalid Params!");
1181 return;
1182 }
1183
1184 LockCallbackList();
1185 if (g_ipcCallBackList.ctx == NULL) {
1186 UnLockCallbackList();
1187 LOGE("IpcCallBackList uninitialized!");
1188 return;
1189 }
1190 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1191 if (dataParcel == NULL) {
1192 UnLockCallbackList();
1193 return;
1194 }
1195
1196 ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1197 if (ret != HC_SUCCESS) {
1198 UnLockCallbackList();
1199 HcFree((void *)dataParcel);
1200 LOGE("build trans data failed");
1201 return;
1202 }
1203
1204 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1205 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1206 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1207 if (listener->onDeviceNotTrusted == NULL) {
1208 continue;
1209 }
1210 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED,
1211 (uintptr_t)(listener->onDeviceNotTrusted), dataParcel, NULL);
1212 }
1213 }
1214 UnLockCallbackList();
1215 HcFree((void *)dataParcel);
1216 return;
1217 }
1218
IpcOnLastGroupDeleted(const char * peerUdid,int32_t groupType)1219 void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType)
1220 {
1221 int32_t i;
1222 uint32_t ret;
1223 IpcIo *dataParcel = NULL;
1224 DataChangeListener *listener = NULL;
1225
1226 if (peerUdid == NULL) {
1227 LOGE("Error occurs, peerUdid is NULL.");
1228 return;
1229 }
1230
1231 LockCallbackList();
1232 if (g_ipcCallBackList.ctx == NULL) {
1233 UnLockCallbackList();
1234 LOGE("IpcCallBackList node is not initialized.");
1235 return;
1236 }
1237 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1238 if (dataParcel == NULL) {
1239 LOGE("Error occurs, Ipc data init failed.");
1240 UnLockCallbackList();
1241 return;
1242 }
1243
1244 ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1245 ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, (const uint8_t *)(&groupType), sizeof(groupType));
1246 if (ret != HC_SUCCESS) {
1247 UnLockCallbackList();
1248 HcFree((void *)dataParcel);
1249 LOGE("build trans data failed");
1250 return;
1251 }
1252
1253 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1254 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1255 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1256 if (listener->onLastGroupDeleted == NULL) {
1257 continue;
1258 }
1259 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED,
1260 (uintptr_t)(listener->onLastGroupDeleted), dataParcel, NULL);
1261 }
1262 }
1263 UnLockCallbackList();
1264 HcFree((void *)dataParcel);
1265 return;
1266 }
1267
IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)1268 void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)
1269 {
1270 IpcIo *dataParcel = NULL;
1271 int32_t i;
1272 DataChangeListener *listener = NULL;
1273 uint32_t ret;
1274
1275 LockCallbackList();
1276 if (g_ipcCallBackList.ctx == NULL) {
1277 LOGE("IpcCallBackList un-initialized");
1278 UnLockCallbackList();
1279 return;
1280 }
1281
1282 dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1283 if (dataParcel == NULL) {
1284 LOGE("data parcel is NULL.");
1285 UnLockCallbackList();
1286 return;
1287 }
1288 ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM,
1289 (const uint8_t *)(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum));
1290 if (ret != HC_SUCCESS) {
1291 UnLockCallbackList();
1292 HcFree((void *)dataParcel);
1293 LOGE("IpcOnTrustedDeviceNumChanged, build trans data failed");
1294 return;
1295 }
1296
1297 for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1298 if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1299 listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1300 if (listener->onTrustedDeviceNumChanged == NULL) {
1301 continue;
1302 }
1303 ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED,
1304 (uintptr_t)(listener->onTrustedDeviceNumChanged), dataParcel, NULL);
1305 }
1306 }
1307 UnLockCallbackList();
1308 HcFree((void *)dataParcel);
1309 return;
1310 }
1311
InitDeviceAuthCbCtx(DeviceAuthCallback * ctx,int32_t type)1312 void InitDeviceAuthCbCtx(DeviceAuthCallback *ctx, int32_t type)
1313 {
1314 if (ctx == NULL) {
1315 return;
1316 }
1317 if (type == CB_TYPE_DEV_AUTH) {
1318 ctx->onTransmit = IpcGaCbOnTransmit;
1319 ctx->onSessionKeyReturned = IpcGaCbOnSessionKeyReturned;
1320 ctx->onError = IpcGaCbOnError;
1321 ctx->onRequest = IpcGaCbOnRequest;
1322 ctx->onFinish = IpcGaCbOnFinish;
1323 }
1324 if (type == CB_TYPE_TMP_DEV_AUTH) {
1325 ctx->onTransmit = TmpIpcGaCbOnTransmit;
1326 ctx->onSessionKeyReturned = TmpIpcGaCbOnSessionKeyReturned;
1327 ctx->onError = TmpIpcGaCbOnError;
1328 ctx->onRequest = TmpIpcGaCbOnRequest;
1329 ctx->onFinish = TmpIpcGaCbOnFinish;
1330 }
1331 return;
1332 }
1333
InitDevAuthListenerCbCtx(DataChangeListener * ctx)1334 void InitDevAuthListenerCbCtx(DataChangeListener *ctx)
1335 {
1336 if (ctx == NULL) {
1337 LOGE("Input ctx is NULL.");
1338 return;
1339 }
1340 ctx->onGroupCreated = IpcOnGroupCreated;
1341 ctx->onGroupDeleted = IpcOnGroupDeleted;
1342 ctx->onDeviceNotTrusted = IpcOnDeviceNotTrusted;
1343 ctx->onDeviceBound = IpcOnDeviceBound;
1344 ctx->onDeviceUnBound = IpcOnDeviceUnBound;
1345 ctx->onLastGroupDeleted = IpcOnLastGroupDeleted;
1346 ctx->onTrustedDeviceNumChanged = IpcOnTrustedDeviceNumChanged;
1347 return;
1348 }
1349
1350 /* ipc client process adapter */
CreateCallCtx(uintptr_t * callCtx)1351 int32_t CreateCallCtx(uintptr_t *callCtx)
1352 {
1353 if (callCtx == NULL) {
1354 return HC_ERR_INVALID_PARAMS;
1355 }
1356
1357 ProxyDevAuthData *dataCache = (ProxyDevAuthData *)HcMalloc(sizeof(ProxyDevAuthData), 0);
1358 if (dataCache == NULL) {
1359 LOGE("call context alloc failed");
1360 return HC_ERR_ALLOC_MEMORY;
1361 }
1362 dataCache->data = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1363 dataCache->tmpData = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1364 dataCache->reply = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1365 if ((dataCache->data == NULL) || (dataCache->tmpData == NULL) || (dataCache->reply == NULL)) {
1366 DestroyCallCtx((uintptr_t *)(dataCache));
1367 return HC_ERROR;
1368 }
1369 /* linux lite, ipc io init with : token + SvcIdentity */
1370 dataCache->ioBuffOffset = IpcIoBufferOffset();
1371 *callCtx = (uintptr_t)(dataCache);
1372 return HC_SUCCESS;
1373 }
1374
DestroyCallCtx(uintptr_t * callCtx)1375 void DestroyCallCtx(uintptr_t *callCtx)
1376 {
1377 ProxyDevAuthData *dataCache = NULL;
1378 if ((callCtx != NULL) && (*callCtx != 0)) {
1379 dataCache = (ProxyDevAuthData *)(*callCtx);
1380 if (dataCache->data != NULL) {
1381 HcFree((void *)dataCache->data);
1382 dataCache->data = NULL;
1383 }
1384 if (dataCache->tmpData != NULL) {
1385 HcFree((void *)dataCache->tmpData);
1386 dataCache->tmpData = NULL;
1387 }
1388 if (dataCache->reply != NULL) {
1389 HcFree((void *)dataCache->reply);
1390 dataCache->reply = NULL;
1391 }
1392 HcFree((void *)dataCache);
1393 *callCtx = 0;
1394 }
1395 return;
1396 }
1397
SetCbCtxToDataCtx(uintptr_t callCtx,int32_t cbIdx)1398 void SetCbCtxToDataCtx(uintptr_t callCtx, int32_t cbIdx)
1399 {
1400 ProxyDevAuthData *dataCache = NULL;
1401 const SvcIdentity *stubInfo = &g_sdkCbStub.stubIdentity;
1402 (void)cbIdx;
1403 if (!g_sdkCbStub.registered) {
1404 LOGW("SDK callback stub un-registered");
1405 return;
1406 }
1407 ShowIpcSvcInfo(stubInfo);
1408 dataCache = (ProxyDevAuthData *)(callCtx);
1409 SetCallbackStub(dataCache, stubInfo);
1410 return;
1411 }
1412
SetCallRequestParamInfo(uintptr_t callCtx,int32_t type,const uint8_t * param,int32_t paramSz)1413 int32_t SetCallRequestParamInfo(uintptr_t callCtx, int32_t type, const uint8_t *param, int32_t paramSz)
1414 {
1415 ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1416
1417 return EncodeCallRequest(dataCache, type, param, paramSz);
1418 }
1419
DoBinderCall(uintptr_t callCtx,int32_t methodId,bool withSync)1420 int32_t DoBinderCall(uintptr_t callCtx, int32_t methodId, bool withSync)
1421 {
1422 (void)withSync;
1423 int32_t ret;
1424 ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1425
1426 ret = FinalCallRequest(dataCache, methodId);
1427 if (ret != HC_SUCCESS) {
1428 return ret;
1429 }
1430 return ActCall(g_proxyInstance, dataCache);
1431 }
1432
1433 /* ipc service process adapter */
SetIpcCallMap(uintptr_t ipcInstance,IpcServiceCall method,int32_t methodId)1434 uint32_t SetIpcCallMap(uintptr_t ipcInstance, IpcServiceCall method, int32_t methodId)
1435 {
1436 (void)ipcInstance;
1437 if ((method == NULL) || (methodId <= 0)) {
1438 return HC_ERR_INVALID_PARAMS;
1439 }
1440
1441 return (uint32_t)SetCallMap(method, methodId);
1442 }
1443
CreateServiceInstance(uintptr_t * ipcInstance)1444 int32_t CreateServiceInstance(uintptr_t *ipcInstance)
1445 {
1446 *ipcInstance = 0x0;
1447 return HC_SUCCESS;
1448 }
1449
DestroyServiceInstance(uintptr_t ipcInstance)1450 void DestroyServiceInstance(uintptr_t ipcInstance)
1451 {
1452 (void)ipcInstance;
1453 }
1454
AddDevAuthServiceToManager(uintptr_t serviceInstance)1455 int32_t AddDevAuthServiceToManager(uintptr_t serviceInstance)
1456 {
1457 (void)serviceInstance;
1458 SAMGR_Bootstrap();
1459 InitCbStubTable();
1460 LOGI("AddSystemAbility to SA manager success");
1461 return HC_SUCCESS;
1462 }
1463
IpcEncodeCallReply(uintptr_t replayCache,int32_t type,const uint8_t * result,int32_t resultSz)1464 int32_t IpcEncodeCallReply(uintptr_t replayCache, int32_t type, const uint8_t *result, int32_t resultSz)
1465 {
1466 int32_t ret = HC_SUCCESS;
1467 IpcIo *replyParcel = NULL;
1468 unsigned long valZero = 0uL;
1469
1470 replyParcel = (IpcIo *)(replayCache);
1471 WriteInt32(replyParcel, type);
1472 bool value;
1473 if ((result != NULL) && (resultSz > 0)) {
1474 WriteUint32(replyParcel, (uint32_t)resultSz);
1475 value = WriteBuffer(replyParcel, (const void *)result, (uint32_t)resultSz);
1476 } else {
1477 WriteUint32(replyParcel, sizeof(valZero));
1478 value = WriteBuffer(replyParcel, (const void *)(&valZero), sizeof(valZero));
1479 }
1480 if (!value) {
1481 LOGE("encode call reply fail.");
1482 return HC_FALSE;
1483 }
1484 return ret;
1485 }
1486
DecodeIpcData(uintptr_t data,int32_t * type,uint8_t ** val,int32_t * valSz)1487 int32_t DecodeIpcData(uintptr_t data, int32_t *type, uint8_t **val, int32_t *valSz)
1488 {
1489 IpcIo *dataPtr = NULL;
1490
1491 dataPtr = (IpcIo *)(data);
1492 if (dataPtr->bufferLeft <= 0) {
1493 return HC_SUCCESS;
1494 }
1495 ReadInt32(dataPtr, type);
1496 ReadUint32(dataPtr, (uint32_t *)valSz);
1497 *val = (uint8_t *)ReadBuffer(dataPtr, *valSz);
1498 return HC_SUCCESS;
1499 }
1500
DecodeCallReply(uintptr_t callCtx,IpcDataInfo * replyCache,int32_t cacheNum)1501 void DecodeCallReply(uintptr_t callCtx, IpcDataInfo *replyCache, int32_t cacheNum)
1502 {
1503 int32_t i;
1504 int32_t ret;
1505 uint32_t replyLen;
1506
1507 ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1508 ReadUint32(dataCache->reply, &replyLen);
1509 if (replyLen == 0) {
1510 return;
1511 }
1512
1513 for (i = 0; i < cacheNum; i++) {
1514 ret = DecodeIpcData((uintptr_t)(dataCache->reply),
1515 &(replyCache[i].type), &(replyCache[i].val), &(replyCache[i].valSz));
1516 if (ret != HC_SUCCESS) {
1517 LOGE("Ipc data decode failed.");
1518 return;
1519 }
1520 }
1521 return;
1522 }
1523
IsTypeForCpyData(int32_t type)1524 static bool IsTypeForCpyData(int32_t type)
1525 {
1526 int32_t typeList[] = {
1527 PARAM_TYPE_REQID, PARAM_TYPE_GROUP_TYPE, PARAM_TYPE_OPCODE, PARAM_TYPE_ERRCODE, PARAM_TYPE_OS_ACCOUNT_ID
1528 };
1529 int32_t i;
1530 int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1531 for (i = 0; i < n; i++) {
1532 if (typeList[i] == type) {
1533 return true;
1534 }
1535 }
1536 return false;
1537 }
1538
IsTypeForSettingPtr(int32_t type)1539 static bool IsTypeForSettingPtr(int32_t type)
1540 {
1541 int32_t typeList[] = {
1542 PARAM_TYPE_APPID, PARAM_TYPE_DEV_AUTH_CB, PARAM_TYPE_LISTENER, PARAM_TYPE_CREATE_PARAMS,
1543 PARAM_TYPE_GROUPID, PARAM_TYPE_UDID, PARAM_TYPE_ADD_PARAMS, PARAM_TYPE_DEL_PARAMS,
1544 PARAM_TYPE_QUERY_PARAMS, PARAM_TYPE_COMM_DATA, PARAM_TYPE_SESS_KEY,
1545 PARAM_TYPE_REQ_INFO, PARAM_TYPE_GROUP_INFO, PARAM_TYPE_AUTH_PARAMS, PARAM_TYPE_REQ_JSON,
1546 PARAM_TYPE_PSEUDONYM_ID, PARAM_TYPE_INDEX_KEY, PARAM_TYPE_ERR_INFO
1547 };
1548 int32_t i;
1549 int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1550 for (i = 0; i < n; i++) {
1551 if (typeList[i] == type) {
1552 return true;
1553 }
1554 }
1555 return false;
1556 }
1557
GetIpcRequestParamByType(const IpcDataInfo * ipcParams,int32_t paramNum,int32_t type,uint8_t * paramCache,int32_t * cacheLen)1558 int32_t GetIpcRequestParamByType(const IpcDataInfo *ipcParams, int32_t paramNum,
1559 int32_t type, uint8_t *paramCache, int32_t *cacheLen)
1560 {
1561 int32_t i;
1562 errno_t eno;
1563
1564 int32_t ret = HC_ERR_IPC_BAD_MSG_TYPE;
1565 for (i = 0; i < paramNum; i++) {
1566 if (ipcParams[i].type != type) {
1567 continue;
1568 }
1569 ret = HC_SUCCESS;
1570 if (IsTypeForSettingPtr(type)) {
1571 *(uint8_t **)paramCache = ipcParams[i].val;
1572 if (cacheLen != NULL) {
1573 *cacheLen = ipcParams[i].valSz;
1574 }
1575 break;
1576 }
1577 if (IsTypeForCpyData(type)) {
1578 if ((ipcParams[i].val == NULL) || (ipcParams[i].valSz <= 0)) {
1579 ret = HC_ERR_INVALID_PARAMS;
1580 break;
1581 }
1582 eno = memcpy_s(paramCache, *cacheLen, ipcParams[i].val, ipcParams[i].valSz);
1583 if (eno != EOK) {
1584 ret = HC_ERR_MEMORY_COPY;
1585 }
1586 *cacheLen = ipcParams[i].valSz;
1587 break;
1588 }
1589 if ((type == PARAM_TYPE_CB_OBJECT) && (*(uint32_t *)cacheLen >= sizeof(ipcParams[i].idx))) {
1590 *(int32_t *)paramCache = ipcParams[i].idx;
1591 }
1592 break;
1593 }
1594 return ret;
1595 }
1596
IsCallbackMethod(int32_t methodId)1597 bool IsCallbackMethod(int32_t methodId)
1598 {
1599 if ((methodId == IPC_CALL_ID_REG_CB) || (methodId == IPC_CALL_ID_REG_LISTENER) ||
1600 (methodId == IPC_CALL_ID_GA_PROC_DATA) || (methodId == IPC_CALL_ID_AUTH_DEVICE)) {
1601 return true;
1602 }
1603 return false;
1604 }
1605
InitIpcDataCache(uint32_t buffSz)1606 IpcIo *InitIpcDataCache(uint32_t buffSz)
1607 {
1608 IpcIo *ioPtr = NULL;
1609 uint8_t *buf = NULL;
1610 uint32_t len;
1611
1612 if (buffSz == 0) {
1613 LOGE("invalid param");
1614 return NULL;
1615 }
1616 len = sizeof(IpcIo) + buffSz;
1617 ioPtr = (IpcIo *)HcMalloc(len, 0);
1618 if (ioPtr == NULL) {
1619 LOGE("alloc memory failed");
1620 return NULL;
1621 }
1622 buf = (uint8_t *)ioPtr + sizeof(IpcIo);
1623 /* ipcio inited with 4 svc objects */
1624 IpcIoInit(ioPtr, (void *)buf, buffSz, 4);
1625 return ioPtr;
1626 }
1627
GetIpcIoDataLength(const IpcIo * io)1628 int32_t GetIpcIoDataLength(const IpcIo *io)
1629 {
1630 uintptr_t beginPos;
1631 uintptr_t endPos;
1632
1633 if (io == NULL) {
1634 return 0;
1635 }
1636 beginPos = (uintptr_t)(io->bufferBase + IpcIoBufferOffset());
1637 endPos = (uintptr_t)(io->bufferCur);
1638 return (endPos <= beginPos) ? 0 : (int32_t)(endPos - beginPos);
1639 }
1640
ShowIpcSvcInfo(const SvcIdentity * svc)1641 void ShowIpcSvcInfo(const SvcIdentity *svc)
1642 {
1643 LOGI("svc information - handle(%" LOG_PUB "u), token(%" LOG_PUB "u), cookie(%" LOG_PUB "u)", svc->handle,
1644 svc->token, svc->cookie);
1645 }
1646
InitProxyAdapt(void)1647 int32_t InitProxyAdapt(void)
1648 {
1649 if (g_proxyInstance == NULL) {
1650 g_proxyInstance = (IClientProxy *)GetProxyInstance(DEV_AUTH_SERVICE_NAME);
1651 if (g_proxyInstance == NULL) {
1652 LOGE("get proxy instance failed");
1653 return HC_ERR_IPC_INIT;
1654 }
1655 }
1656
1657 if (!g_sdkCbStub.registered) {
1658 g_objectStub.func = CbStubOnRemoteRequest;
1659 g_objectStub.isRemote = false;
1660 g_objectStub.args = NULL;
1661
1662 g_sdkCbStub.stubIdentity.token = SERVICE_TYPE_ANONYMOUS;
1663 g_sdkCbStub.stubIdentity.handle = IPC_INVALID_HANDLE;
1664 g_sdkCbStub.stubIdentity.cookie = (uintptr_t)&g_objectStub;
1665
1666 ShowIpcSvcInfo(&(g_sdkCbStub.stubIdentity));
1667 g_sdkCbStub.registered = true;
1668 }
1669 return HC_SUCCESS;
1670 }
1671
UnInitProxyAdapt(void)1672 void UnInitProxyAdapt(void)
1673 {
1674 g_proxyInstance = NULL;
1675 g_sdkCbStub.registered = false;
1676 return;
1677 }
1678
IpcIoBufferOffset(void)1679 int32_t IpcIoBufferOffset(void)
1680 {
1681 int8_t buf[64]; /* 64 buffer size */
1682 IpcIo ioCache;
1683
1684 IpcIoInit(&ioCache, (void *)buf, sizeof(buf), 0);
1685 if (ioCache.bufferCur <= ioCache.bufferBase) {
1686 return 0;
1687 }
1688 return (int32_t)((uintptr_t)(ioCache.bufferCur) - (uintptr_t)(ioCache.bufferBase));
1689 }
1690
1691 #ifdef __cplusplus
1692 }
1693 #endif
1694
1695