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