1 /*
2 * Copyright (c) 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 "messenger_impl.h"
17
18 #include <stdint.h>
19 #include <stdlib.h>
20 #include <stdbool.h>
21
22 #include "messenger.h"
23 #include "messenger_device_socket_manager.h"
24 #include "messenger_device_status_manager.h"
25 #include "utils_log.h"
26 #include "utils_mem.h"
27 #include "utils_work_queue.h"
28
29 #define MESSENGER_MAGIC_HEAD 0x1234abcd
30 #define MESSENGER_PROCESS_QUEUE_SIZE 256
31 #define MESSENGER_PROCESS_QUEUE_NAME "messenger_queue"
32 typedef struct Messenger {
33 uint32_t magicHead;
34 WorkQueue *processQueue;
35 } Messenger;
36
CreateMessengerImpl(const MessengerConfig * config)37 Messenger *CreateMessengerImpl(const MessengerConfig *config)
38 {
39 if (config == NULL) {
40 SECURITY_LOG_ERROR("config is null");
41 return NULL;
42 }
43 WorkQueue *processQueue = CreateWorkQueue(MESSENGER_PROCESS_QUEUE_SIZE, MESSENGER_PROCESS_QUEUE_NAME);
44 if (processQueue == NULL) {
45 SECURITY_LOG_ERROR("create work queue failed");
46 return NULL;
47 }
48 bool result = InitDeviceSocketManager(processQueue, config);
49 if (result == false) {
50 DestroyWorkQueue(processQueue);
51 SECURITY_LOG_ERROR("init socket manager failed");
52 return NULL;
53 }
54 result = InitDeviceStatusManager(processQueue, config->pkgName, config->statusReceiver);
55 if (result == false) {
56 DestroyWorkQueue(processQueue);
57 return NULL;
58 }
59
60 Messenger *messenger = MALLOC(sizeof(Messenger));
61 if (messenger == NULL) {
62 DestroyWorkQueue(processQueue);
63 return NULL;
64 }
65 messenger->magicHead = MESSENGER_MAGIC_HEAD;
66 messenger->processQueue = processQueue;
67
68 return messenger;
69 }
70
DestroyMessengerImpl(Messenger * messenger)71 void DestroyMessengerImpl(Messenger *messenger)
72 {
73 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
74 SECURITY_LOG_ERROR("invalid params");
75 return;
76 }
77 DeInitDeviceStatusManager();
78 DeInitDeviceSocketManager();
79 messenger->magicHead = 0;
80 DestroyWorkQueue(messenger->processQueue);
81 FREE(messenger);
82 }
83
IsMessengerReadyImpl(const Messenger * messenger)84 bool IsMessengerReadyImpl(const Messenger *messenger)
85 {
86 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
87 SECURITY_LOG_ERROR("invalid params");
88 return false;
89 }
90 return true;
91 }
92
SendMsgToImpl(const Messenger * messenger,uint64_t transNo,const DeviceIdentify * devId,const uint8_t * msg,uint32_t msgLen)93 void SendMsgToImpl(const Messenger *messenger, uint64_t transNo, const DeviceIdentify *devId, const uint8_t *msg,
94 uint32_t msgLen)
95 {
96 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
97 SECURITY_LOG_ERROR("invalid params");
98 return;
99 }
100 MessengerSendMsgTo(transNo, devId, msg, msgLen);
101 }
102
GetDeviceOnlineStatusImpl(const Messenger * messenger,const DeviceIdentify * devId,int32_t * level)103 bool GetDeviceOnlineStatusImpl(const Messenger *messenger, const DeviceIdentify *devId, int32_t *level)
104 {
105 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
106 SECURITY_LOG_ERROR("invalid params");
107 return false;
108 }
109
110 return MessengerGetDeviceOnlineStatus(devId, level);
111 }
112
GetSelfDeviceIdentifyImpl(const Messenger * messenger,DeviceIdentify * devId,int32_t * level)113 bool GetSelfDeviceIdentifyImpl(const Messenger *messenger, DeviceIdentify *devId, int32_t *level)
114 {
115 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
116 SECURITY_LOG_ERROR("invalid params");
117 return false;
118 }
119
120 return MessengerGetSelfDeviceIdentify(devId, level);
121 }
122
ForEachDeviceProcessImpl(const Messenger * messenger,const DeviceProcessor processor,void * para)123 void ForEachDeviceProcessImpl(const Messenger *messenger, const DeviceProcessor processor, void *para)
124 {
125 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
126 SECURITY_LOG_ERROR("invalid params");
127 return;
128 }
129
130 return MessengerForEachDeviceProcess(processor, para);
131 }
132
GetDeviceStatisticInfoImpl(const Messenger * messenger,const DeviceIdentify * devId,StatisticInformation * info)133 bool GetDeviceStatisticInfoImpl(const Messenger *messenger, const DeviceIdentify *devId, StatisticInformation *info)
134 {
135 if (messenger == NULL || messenger->magicHead != MESSENGER_MAGIC_HEAD) {
136 SECURITY_LOG_ERROR("invalid params");
137 return false;
138 }
139 (void)devId;
140 (void)info;
141 return true;
142 }
143