1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include <stdio.h>
17d9f0492fSopenharmony_ci#include <stdlib.h>
18d9f0492fSopenharmony_ci#include <string.h>
19d9f0492fSopenharmony_ci#include <fcntl.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#include "loop_systest.h"
22d9f0492fSopenharmony_ci#include "loop_event.h"
23d9f0492fSopenharmony_ci#include "le_socket.h"
24d9f0492fSopenharmony_ci#include "le_task.h"
25d9f0492fSopenharmony_ci#include "list.h"
26d9f0492fSopenharmony_ci
27d9f0492fSopenharmony_citypedef struct {
28d9f0492fSopenharmony_ci    uint16_t tlvLen;
29d9f0492fSopenharmony_ci    uint16_t tlvType;
30d9f0492fSopenharmony_ci} Tlv;
31d9f0492fSopenharmony_ci
32d9f0492fSopenharmony_citypedef struct {
33d9f0492fSopenharmony_ci    uint16_t tlvLen;  // 对齐后的长度
34d9f0492fSopenharmony_ci    uint16_t tlvType;
35d9f0492fSopenharmony_ci    uint16_t dataLen;  // 数据的长度
36d9f0492fSopenharmony_ci    uint16_t dataType;
37d9f0492fSopenharmony_ci    char tlvName[TLV_NAME_LEN];
38d9f0492fSopenharmony_ci} TlvExt;
39d9f0492fSopenharmony_ci
40d9f0492fSopenharmony_citypedef struct {
41d9f0492fSopenharmony_ci    Message msgHdr;
42d9f0492fSopenharmony_ci    Result result;
43d9f0492fSopenharmony_ci}ResponseMsg;
44d9f0492fSopenharmony_ci
45d9f0492fSopenharmony_citypedef struct ReceiverCtx_ {
46d9f0492fSopenharmony_ci    uint32_t nextMsgId;              // 校验消息id
47d9f0492fSopenharmony_ci    uint32_t msgRecvLen;             // 已经接收的长度
48d9f0492fSopenharmony_ci    TimerHandle timer;               // 测试消息完整
49d9f0492fSopenharmony_ci    MsgNode *incompleteMsg;          // 保存不完整的消息
50d9f0492fSopenharmony_ci} ReceiverCtx;
51d9f0492fSopenharmony_ci
52d9f0492fSopenharmony_citypedef struct MyTask_ {
53d9f0492fSopenharmony_ci    TaskHandle stream;
54d9f0492fSopenharmony_ci    int id;
55d9f0492fSopenharmony_ci    ReceiverCtx ctx;
56d9f0492fSopenharmony_ci} MyTask;
57d9f0492fSopenharmony_ci
58d9f0492fSopenharmony_citypedef struct MyService_ {
59d9f0492fSopenharmony_ci    TaskHandle serverTask;
60d9f0492fSopenharmony_ci    struct ListNode head;
61d9f0492fSopenharmony_ci} MyService;
62d9f0492fSopenharmony_ci
63d9f0492fSopenharmony_citypedef struct MsgNode_ {
64d9f0492fSopenharmony_ci    MyTask *task;
65d9f0492fSopenharmony_ci    Message msgHeader;
66d9f0492fSopenharmony_ci    uint32_t tlvCount;
67d9f0492fSopenharmony_ci    uint32_t *tlvOffset;
68d9f0492fSopenharmony_ci    uint8_t *buffer;
69d9f0492fSopenharmony_ci} MsgNode;
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_cistatic MyService g_service = NULL;
72d9f0492fSopenharmony_ci
73d9f0492fSopenharmony_ciint MakeDirRec(const char *path, mode_t mode, int lastPath)
74d9f0492fSopenharmony_ci{
75d9f0492fSopenharmony_ci    if (path == NULL || *path == '\0') {
76d9f0492fSopenharmony_ci        printf("Invalid path to create \n");
77d9f0492fSopenharmony_ci        return -1;
78d9f0492fSopenharmony_ci    }
79d9f0492fSopenharmony_ci
80d9f0492fSopenharmony_ci    char buffer[PATH_MAX] = {0};
81d9f0492fSopenharmony_ci    const char slash = '/';
82d9f0492fSopenharmony_ci    const char *p = path;
83d9f0492fSopenharmony_ci    char *curPos = strchr(path, slash);
84d9f0492fSopenharmony_ci    while (curPos != NULL) {
85d9f0492fSopenharmony_ci        int len = curPos - p;
86d9f0492fSopenharmony_ci        p = curPos + 1;
87d9f0492fSopenharmony_ci        if (len == 0) {
88d9f0492fSopenharmony_ci            curPos = strchr(p, slash);
89d9f0492fSopenharmony_ci            continue;
90d9f0492fSopenharmony_ci        }
91d9f0492fSopenharmony_ci
92d9f0492fSopenharmony_ci        int ret = memcpy_s(buffer, PATH_MAX, path, p - path - 1);
93d9f0492fSopenharmony_ci        if (ret != 0) {
94d9f0492fSopenharmony_ci            printf("Failed to copy path \n");
95d9f0492fSopenharmony_ci            return -1;
96d9f0492fSopenharmony_ci        }
97d9f0492fSopenharmony_ci
98d9f0492fSopenharmony_ci        ret = mkdir(buffer, mode);
99d9f0492fSopenharmony_ci        if (ret == -1 && errno != EEXIST) {
100d9f0492fSopenharmony_ci            return errno;
101d9f0492fSopenharmony_ci        }
102d9f0492fSopenharmony_ci        curPos = strchr(p, slash);
103d9f0492fSopenharmony_ci    }
104d9f0492fSopenharmony_ci
105d9f0492fSopenharmony_ci    if (lastPath) {
106d9f0492fSopenharmony_ci        if (mkdir(path, mode) == -1 && errno != EEXIST) {
107d9f0492fSopenharmony_ci            return errno;
108d9f0492fSopenharmony_ci        }
109d9f0492fSopenharmony_ci    }
110d9f0492fSopenharmony_ci    return 0;
111d9f0492fSopenharmony_ci}
112d9f0492fSopenharmony_ci
113d9f0492fSopenharmony_cistatic inline void SetFdCtrl(int fd, int opt)
114d9f0492fSopenharmony_ci{
115d9f0492fSopenharmony_ci    int option = fcntl(fd, F_GETFD);
116d9f0492fSopenharmony_ci    int ret = fcntl(fd, F_SETFD, option | opt);
117d9f0492fSopenharmony_ci    if (ret < 0) {
118d9f0492fSopenharmony_ci        printf("Set fd %d option %d %d result: %d \n", fd, option, opt, errno);
119d9f0492fSopenharmony_ci    }
120d9f0492fSopenharmony_ci}
121d9f0492fSopenharmony_ci
122d9f0492fSopenharmony_cistatic int CreatePipeServer(TaskHandle *server, const char *name)
123d9f0492fSopenharmony_ci{
124d9f0492fSopenharmony_ci    char path[128] = {0};
125d9f0492fSopenharmony_ci    int ret = snprintf_s(path, sizeof(path), sizeof(path) - 1, "%s%s", SOCKET_DIR, name);
126d9f0492fSopenharmony_ci    if (ret < 0) {
127d9f0492fSopenharmony_ci        printf("Failed to snprintf_s %d \n", ret);
128d9f0492fSopenharmony_ci    }
129d9f0492fSopenharmony_ci    int socketId = GetControlSocket(name);
130d9f0492fSopenharmony_ci    printf("get socket from env %s socketId %d \n", SOCKET_NAME, socketId);
131d9f0492fSopenharmony_ci
132d9f0492fSopenharmony_ci    LE_StreamInfo info = {};
133d9f0492fSopenharmony_ci    info.baseInfo.flags = TASK_STREAM | TASK_PIPE | TASK_SERVER;
134d9f0492fSopenharmony_ci    info.socketId = socketId;
135d9f0492fSopenharmony_ci    info.server = server;
136d9f0492fSopenharmony_ci    info.baseInfo.close = NULL;
137d9f0492fSopenharmony_ci    info.incommingConnect = OnConnection;
138d9f0492fSopenharmony_ci
139d9f0492fSopenharmony_ci    MakeDirRec(path, DIR_MODE, 0);
140d9f0492fSopenharmony_ci    ret = LE_CreateStreamServer(LE_GetDefaultLoop(), server, &info);
141d9f0492fSopenharmony_ci    if (ret < 0) {
142d9f0492fSopenharmony_ci        printf("Create server failed \n");
143d9f0492fSopenharmony_ci    }
144d9f0492fSopenharmony_ci    SetFdCtrl(LE_GetSocketFd(*server), FD_CLOEXEC);
145d9f0492fSopenharmony_ci
146d9f0492fSopenharmony_ci    printf("CreateServer path %s fd %d \n", path, LE_GetSocketFd(*server));
147d9f0492fSopenharmony_ci    return 0;
148d9f0492fSopenharmony_ci}
149d9f0492fSopenharmony_ci
150d9f0492fSopenharmony_cistatic int CreateTcpServer(TaskHandle *server, const char *name)
151d9f0492fSopenharmony_ci{
152d9f0492fSopenharmony_ci    char path[128] = {0};
153d9f0492fSopenharmony_ci    int ret = snprintf_s(path, sizeof(path), sizeof(path) - 1, "%s%s", SOCKET_DIR, name);
154d9f0492fSopenharmony_ci    if (ret < 0) {
155d9f0492fSopenharmony_ci        printf("Failed to snprintf_s %d \n", ret);
156d9f0492fSopenharmony_ci    }
157d9f0492fSopenharmony_ci    int socketId = GetControlSocket(name);
158d9f0492fSopenharmony_ci    printf("get socket from env %s socketId %d \n", SOCKET_NAME, socketId);
159d9f0492fSopenharmony_ci
160d9f0492fSopenharmony_ci    LE_StreamInfo info = {};
161d9f0492fSopenharmony_ci    info.baseInfo.flags = TASK_STREAM | TASK_TCP | TASK_SERVER;
162d9f0492fSopenharmony_ci    info.socketId = socketId;
163d9f0492fSopenharmony_ci    info.server = server;
164d9f0492fSopenharmony_ci    info.baseInfo.close = NULL;
165d9f0492fSopenharmony_ci    info.incommingConnect = OnConnection;
166d9f0492fSopenharmony_ci
167d9f0492fSopenharmony_ci    MakeDirRec(path, DIR_MODE, 0);
168d9f0492fSopenharmony_ci    ret = LE_CreateStreamServer(LE_GetDefaultLoop(), server, &info);
169d9f0492fSopenharmony_ci    SetFdCtrl(LE_GetSocketFd(*server), FD_CLOEXEC);
170d9f0492fSopenharmony_ci
171d9f0492fSopenharmony_ci    printf("CreateServer path %s fd %d \n", path, LE_GetSocketFd(*server));
172d9f0492fSopenharmony_ci    return ret;
173d9f0492fSopenharmony_ci}
174d9f0492fSopenharmony_ci
175d9f0492fSopenharmony_cistatic inline int StartTimerForCheckMsg(MyTask *task)
176d9f0492fSopenharmony_ci{
177d9f0492fSopenharmony_ci    if (connection->receiverCtx.timer != NULL) {
178d9f0492fSopenharmony_ci        return 0;
179d9f0492fSopenharmony_ci    }
180d9f0492fSopenharmony_ci    int ret = LE_CreateTimer(LE_GetDefaultLoop(), &connection->receiverCtx.timer, WaitMsgCompleteTimeOut, connection);
181d9f0492fSopenharmony_ci    if (ret == 0) {
182d9f0492fSopenharmony_ci        ret = LE_StartTimer(LE_GetDefaultLoop(), connection->receiverCtx.timer, MAX_WAIT_MSG_COMPLETE, 1);
183d9f0492fSopenharmony_ci    }
184d9f0492fSopenharmony_ci    return ret;
185d9f0492fSopenharmony_ci}
186d9f0492fSopenharmony_ci
187d9f0492fSopenharmony_cistatic int SendMessage(LoopHandle loop, TaskHandle task, const char *message)
188d9f0492fSopenharmony_ci{
189d9f0492fSopenharmony_ci    if (message == NULL) {
190d9f0492fSopenharmony_ci        printf("message is null \n");
191d9f0492fSopenharmony_ci        return -1;
192d9f0492fSopenharmony_ci    }
193d9f0492fSopenharmony_ci    BufferHandle handle = NULL;
194d9f0492fSopenharmony_ci    uint32_t bufferSize = strlen(message) + 1;
195d9f0492fSopenharmony_ci    handle = LE_CreateBuffer(loop, bufferSize);
196d9f0492fSopenharmony_ci    char *buff = (char *)LE_GetBufferInfo(handle, NULL, &bufferSize);
197d9f0492fSopenharmony_ci    if (buff == NULL) {
198d9f0492fSopenharmony_ci        printf("Failed get buffer info \n");
199d9f0492fSopenharmony_ci        return -1;
200d9f0492fSopenharmony_ci    }
201d9f0492fSopenharmony_ci
202d9f0492fSopenharmony_ci    int ret = memcpy_s(buff, bufferSize, message, strlen(message) + 1);
203d9f0492fSopenharmony_ci    if (ret != 0) {
204d9f0492fSopenharmony_ci        LE_FreeBuffer(loop, task, handle);
205d9f0492fSopenharmony_ci        printf("Failed memcpy_s err=%d \n", errno);
206d9f0492fSopenharmony_ci        return -1;
207d9f0492fSopenharmony_ci    }
208d9f0492fSopenharmony_ci
209d9f0492fSopenharmony_ci    LE_STATUS status = LE_Send(loop, task, handle, strlen(message) + 1);
210d9f0492fSopenharmony_ci    if (status != LE_SUCCESS) {
211d9f0492fSopenharmony_ci        printf("Failed le_send msg \n");
212d9f0492fSopenharmony_ci        return -1;
213d9f0492fSopenharmony_ci    }
214d9f0492fSopenharmony_ci    return 0;
215d9f0492fSopenharmony_ci}
216d9f0492fSopenharmony_ci
217d9f0492fSopenharmony_cistatic int OnConnection(const LoopHandle loop, const TaskHandle server)
218d9f0492fSopenharmony_ci{
219d9f0492fSopenharmony_ci    TaskHandle stream = NULL;
220d9f0492fSopenharmony_ci    LE_StreamInfo info = {};
221d9f0492fSopenharmony_ci    info.baseInfo.flags = flags;
222d9f0492fSopenharmony_ci    info.baseInfo.close = OnClose;
223d9f0492fSopenharmony_ci    info.baseInfo.userDataSize = sizeof(MyTask);
224d9f0492fSopenharmony_ci    info.disConnectComplete = OnDisConnect;
225d9f0492fSopenharmony_ci    info.sendMessageComplete = sendMessageComplete;
226d9f0492fSopenharmony_ci    info.recvMessage = OnRecvMessage;
227d9f0492fSopenharmony_ci
228d9f0492fSopenharmony_ci    int ret = LE_AcceptStreamClient(loop, server, &stream, &info);
229d9f0492fSopenharmony_ci    if (ret != 0) {
230d9f0492fSopenharmony_ci        printf("Failed to accept stream \n");
231d9f0492fSopenharmony_ci    }
232d9f0492fSopenharmony_ci
233d9f0492fSopenharmony_ci    MyTask *agent = (MyTask *)LE_GetUserData(stream);
234d9f0492fSopenharmony_ci    // 收到数据后的处理
235d9f0492fSopenharmony_ci    static uint32_t connectionId = 0;
236d9f0492fSopenharmony_ci    agent->id = ++connectionId;
237d9f0492fSopenharmony_ci    agent->stream = stream;
238d9f0492fSopenharmony_ci    agent->ctx.timer = NULL;
239d9f0492fSopenharmony_ci    agent->incompleteMsg = NULL;
240d9f0492fSopenharmony_ci
241d9f0492fSopenharmony_ci    printf("accept id: %d\n", agent->id);
242d9f0492fSopenharmony_ci    ret = SendMessage(loop, agent->stream, "Connect Success.");
243d9f0492fSopenharmony_ci    if (ret != 0) {
244d9f0492fSopenharmony_ci        printf("Failed to send msg \n");
245d9f0492fSopenharmony_ci        return -1;
246d9f0492fSopenharmony_ci    }
247d9f0492fSopenharmony_ci
248d9f0492fSopenharmony_ci    return 0;
249d9f0492fSopenharmony_ci}
250d9f0492fSopenharmony_ci
251d9f0492fSopenharmony_cistatic void OnClose(const TaskHandle taskHandle)
252d9f0492fSopenharmony_ci{
253d9f0492fSopenharmony_ci    MyTask *task = (MyTask *)LE_GetUserData(taskHandle);
254d9f0492fSopenharmony_ci    if (task == NULL) {
255d9f0492fSopenharmony_ci        printf("Invalid task \n");
256d9f0492fSopenharmony_ci        return;
257d9f0492fSopenharmony_ci    }
258d9f0492fSopenharmony_ci}
259d9f0492fSopenharmony_ci
260d9f0492fSopenharmony_cistatic void OnDisConnect(const TaskHandle taskHandle)
261d9f0492fSopenharmony_ci{
262d9f0492fSopenharmony_ci    MyTask *task = (MyTask *)LE_GetUserData(taskHandle);
263d9f0492fSopenharmony_ci    if (task == NULL) {
264d9f0492fSopenharmony_ci        printf("Invalid task \n");
265d9f0492fSopenharmony_ci        return;
266d9f0492fSopenharmony_ci    }
267d9f0492fSopenharmony_ci    printf("task id: %d\n", task->id);
268d9f0492fSopenharmony_ci    OnClose(taskHandle);
269d9f0492fSopenharmony_ci}
270d9f0492fSopenharmony_ci
271d9f0492fSopenharmony_cistatic void SendMessageComplete(const TaskHandle taskHandle, BufferHandle handle)
272d9f0492fSopenharmony_ci{
273d9f0492fSopenharmony_ci    MyTask *task = (MyTask *)LE_GetUserData(taskHandle);
274d9f0492fSopenharmony_ci    if (task == NULL) {
275d9f0492fSopenharmony_ci        printf("Invalid task \n");
276d9f0492fSopenharmony_ci        return;
277d9f0492fSopenharmony_ci    }
278d9f0492fSopenharmony_ci    uint32_t bufferSize = sizeof(Message);
279d9f0492fSopenharmony_ci    Message *msg = (Message *)LE_GetBufferInfo(handle, NULL, &bufferSize);
280d9f0492fSopenharmony_ci    if (msg == NULL) {
281d9f0492fSopenharmony_ci        return;
282d9f0492fSopenharmony_ci    }
283d9f0492fSopenharmony_ci    printf("SendMessageComplete taskId: %u msgId %u msgType %u buf %s",
284d9f0492fSopenharmony_ci        task->id, msg->msgId, msg->msgType, msg->buffer);
285d9f0492fSopenharmony_ci}
286d9f0492fSopenharmony_ci
287d9f0492fSopenharmony_civoid ServerInit(const char *server, LoopHandle loop, int flags)
288d9f0492fSopenharmony_ci{
289d9f0492fSopenharmony_ci    if (server == NULL || loop == NULL) {
290d9f0492fSopenharmony_ci        printf("Invalid parameter\n");
291d9f0492fSopenharmony_ci        return;
292d9f0492fSopenharmony_ci    }
293d9f0492fSopenharmony_ci
294d9f0492fSopenharmony_ci    OH_ListInit(&g_service.head);
295d9f0492fSopenharmony_ci    LE_StreamServerInfo info = {};
296d9f0492fSopenharmony_ci    info.baseInfo.flags = flags;
297d9f0492fSopenharmony_ci    info.baseInfo.close = NULL;
298d9f0492fSopenharmony_ci    info.socketId = -1;
299d9f0492fSopenharmony_ci    info.server = server;
300d9f0492fSopenharmony_ci    info.disConnectComplete = NULL;
301d9f0492fSopenharmony_ci    info.incomingConnect = OnConnection;
302d9f0492fSopenharmony_ci    info.sendMessageComplete = NULL;
303d9f0492fSopenharmony_ci    info.recvMessage = NULL;
304d9f0492fSopenharmony_ci
305d9f0492fSopenharmony_ci    int ret = LE_CreateStreamServer(loop, &g_service.serverTask, &info);
306d9f0492fSopenharmony_ci    if (ret != 0) {
307d9f0492fSopenharmony_ci        printf("Init server failed.\n");
308d9f0492fSopenharmony_ci    }
309d9f0492fSopenharmony_ci}
310d9f0492fSopenharmony_ci
311d9f0492fSopenharmony_cistatic int MsgRebuild(MsgNode *message, const Message *msg)
312d9f0492fSopenharmony_ci{
313d9f0492fSopenharmony_ci    if (CheckMsg(&message->msgHeader) != 0) {
314d9f0492fSopenharmony_ci        return MSG_INVALID;
315d9f0492fSopenharmony_ci    }
316d9f0492fSopenharmony_ci    if (msg->msgLen == sizeof(message->msgHeader)) {  // only has msg header
317d9f0492fSopenharmony_ci        return 0;
318d9f0492fSopenharmony_ci    }
319d9f0492fSopenharmony_ci    if (message->buffer == NULL) {
320d9f0492fSopenharmony_ci        message->buffer = calloc(1, msg->msgLen - sizeof(message->msgHeader));
321d9f0492fSopenharmony_ci        if (message->buffer == NULL) {
322d9f0492fSopenharmony_ci            printf("Failed to alloc memory for recv message \n");
323d9f0492fSopenharmony_ci            return -1;
324d9f0492fSopenharmony_ci        }
325d9f0492fSopenharmony_ci    }
326d9f0492fSopenharmony_ci    if (message->tlvOffset == NULL) {
327d9f0492fSopenharmony_ci        uint32_t totalCount = msg->tlvCount + TLV_MAX;
328d9f0492fSopenharmony_ci        message->tlvOffset = malloc(totalCount * sizeof(uint32_t));
329d9f0492fSopenharmony_ci        if (message->tlvOffset == NULL) {
330d9f0492fSopenharmony_ci            printf("Failed to alloc memory for recv message \n");
331d9f0492fSopenharmony_ci            return -1;
332d9f0492fSopenharmony_ci        }
333d9f0492fSopenharmony_ci        for (uint32_t i = 0; i < totalCount; i++) {
334d9f0492fSopenharmony_ci            message->tlvOffset[i] = INVALID_OFFSET;
335d9f0492fSopenharmony_ci        }
336d9f0492fSopenharmony_ci    }
337d9f0492fSopenharmony_ci    return 0;
338d9f0492fSopenharmony_ci}
339d9f0492fSopenharmony_ci
340d9f0492fSopenharmony_ciint GetMsgFromBuffer(const uint8_t *buffer, uint32_t bufferLen,
341d9f0492fSopenharmony_ci    Message **outMsg, uint32_t *msgRecvLen, uint32_t *reminder)
342d9f0492fSopenharmony_ci{
343d9f0492fSopenharmony_ci    if (buffer == NULL || outMsg == NULL || msgRecvLen == NULL || reminder == NULL) {
344d9f0492fSopenharmony_ci        return MSG_INVALID;
345d9f0492fSopenharmony_ci    }
346d9f0492fSopenharmony_ci
347d9f0492fSopenharmony_ci    *reminder = 0;
348d9f0492fSopenharmony_ci    Message *message = *outMsg;
349d9f0492fSopenharmony_ci    if (message == NULL) {
350d9f0492fSopenharmony_ci        message = CreateMessage();
351d9f0492fSopenharmony_ci        if (message == NULL) {
352d9f0492fSopenharmony_ci            printf("Failed to create message \n");
353d9f0492fSopenharmony_ci            return SYSTEM_ERROR;
354d9f0492fSopenharmony_ci        }
355d9f0492fSopenharmony_ci        *outMsg = message;
356d9f0492fSopenharmony_ci    }
357d9f0492fSopenharmony_ci
358d9f0492fSopenharmony_ci    uint32_t reminderLen = bufferLen;
359d9f0492fSopenharmony_ci    const uint8_t *reminderBuffer = buffer;
360d9f0492fSopenharmony_ci    if (*msgRecvLen < sizeof(Message)) {  // recv partial message
361d9f0492fSopenharmony_ci        if ((bufferLen + *msgRecvLen) >= sizeof(Message)) {
362d9f0492fSopenharmony_ci            int ret = memcpy_s(((uint8_t *)&message->msgHeader) + *msgRecvLen,
363d9f0492fSopenharmony_ci                sizeof(message->msgHeader) - *msgRecvLen,
364d9f0492fSopenharmony_ci                buffer, sizeof(message->msgHeader) - *msgRecvLen);
365d9f0492fSopenharmony_ci            if (ret != 0) {
366d9f0492fSopenharmony_ci                printf("Failed to copy recv buffer \n");
367d9f0492fSopenharmony_ci                return -1;
368d9f0492fSopenharmony_ci            }
369d9f0492fSopenharmony_ci
370d9f0492fSopenharmony_ci            ret = MsgRebuild(message, &message->msgHeader);
371d9f0492fSopenharmony_ci            if (ret != 0) {
372d9f0492fSopenharmony_ci                printf("Failed to alloc buffer for receive msg \n");
373d9f0492fSopenharmony_ci                return -1;
374d9f0492fSopenharmony_ci            }
375d9f0492fSopenharmony_ci            reminderLen = bufferLen - (sizeof(message->msgHeader) - *msgRecvLen);
376d9f0492fSopenharmony_ci            reminderBuffer = buffer + sizeof(message->msgHeader) - *msgRecvLen;
377d9f0492fSopenharmony_ci            *msgRecvLen = sizeof(message->msgHeader);
378d9f0492fSopenharmony_ci        } else {
379d9f0492fSopenharmony_ci            int ret = memcpy_s(((uint8_t *)&message->msgHeader) + *msgRecvLen,
380d9f0492fSopenharmony_ci                sizeof(message->msgHeader) - *msgRecvLen, buffer, bufferLen);
381d9f0492fSopenharmony_ci            if (ret != 0) {
382d9f0492fSopenharmony_ci                printf("Failed to copy recv buffer \n");
383d9f0492fSopenharmony_ci                return -1;
384d9f0492fSopenharmony_ci            }
385d9f0492fSopenharmony_ci            *msgRecvLen += bufferLen;
386d9f0492fSopenharmony_ci            return 0;
387d9f0492fSopenharmony_ci        }
388d9f0492fSopenharmony_ci    }
389d9f0492fSopenharmony_ci    return 0;
390d9f0492fSopenharmony_ci}
391d9f0492fSopenharmony_ci
392d9f0492fSopenharmony_ciint DecodeMsg(Message * message)
393d9f0492fSopenharmony_ci{
394d9f0492fSopenharmony_ci    if (message == NULL) {
395d9f0492fSopenharmony_ci        printf("decode empty message, failed! \n");
396d9f0492fSopenharmony_ci        return -1;
397d9f0492fSopenharmony_ci    }
398d9f0492fSopenharmony_ci    /*
399d9f0492fSopenharmony_ci        写解析消息的逻辑
400d9f0492fSopenharmony_ci    */
401d9f0492fSopenharmony_ci    return 0;
402d9f0492fSopenharmony_ci}
403d9f0492fSopenharmony_ci
404d9f0492fSopenharmony_ciint ProcessTerminationStatusMsg(const MsgNode *message, Result *result)
405d9f0492fSopenharmony_ci{
406d9f0492fSopenharmony_ci    if (message == NULL || result == NULL) {
407d9f0492fSopenharmony_ci        return -1;
408d9f0492fSopenharmony_ci    }
409d9f0492fSopenharmony_ci
410d9f0492fSopenharmony_ci    result->result = -1;
411d9f0492fSopenharmony_ci    result->pid = 0;
412d9f0492fSopenharmony_ci    return 0;
413d9f0492fSopenharmony_ci}
414d9f0492fSopenharmony_ci
415d9f0492fSopenharmony_cistatic int SendResponse(const MyTask *task, const Message *msg, int result, pid_t pid)
416d9f0492fSopenharmony_ci{
417d9f0492fSopenharmony_ci    printf("SendResponse connectionId: %u result: 0x%x pid: %d \n",
418d9f0492fSopenharmony_ci        task->id, result, pid);
419d9f0492fSopenharmony_ci    uint32_t bufferSize = sizeof(ResponseMsg);
420d9f0492fSopenharmony_ci    BufferHandle handle = LE_CreateBuffer(LE_GetDefaultLoop(), bufferSize);
421d9f0492fSopenharmony_ci    ResponseMsg *buffer = (ResponseMsg *)LE_GetBufferInfo(handle, NULL, &bufferSize);
422d9f0492fSopenharmony_ci    int ret = memcpy_s(buffer, bufferSize, msg, sizeof(Message));
423d9f0492fSopenharmony_ci    if (ret != 0) {
424d9f0492fSopenharmony_ci        LE_FreeBuffer(LE_GetDefaultLoop(), NULL, handle);
425d9f0492fSopenharmony_ci        printf("Failed to memcpy_s bufferSize \n");
426d9f0492fSopenharmony_ci        return -1;
427d9f0492fSopenharmony_ci    }
428d9f0492fSopenharmony_ci
429d9f0492fSopenharmony_ci    buffer->result.result = result;
430d9f0492fSopenharmony_ci    buffer->result.pid = pid;
431d9f0492fSopenharmony_ci    return LE_Send(LE_GetDefaultLoop(), task->stream, handle, bufferSize);
432d9f0492fSopenharmony_ci}
433d9f0492fSopenharmony_ci
434d9f0492fSopenharmony_civoid DeleteMsg(MsgNode *msgNode)
435d9f0492fSopenharmony_ci{
436d9f0492fSopenharmony_ci    if (msgNode == NULL) {
437d9f0492fSopenharmony_ci        return;
438d9f0492fSopenharmony_ci    }
439d9f0492fSopenharmony_ci    if (msgNode->buffer) {
440d9f0492fSopenharmony_ci        free(msgNode->buffer);
441d9f0492fSopenharmony_ci        msgNode->buffer = NULL;
442d9f0492fSopenharmony_ci    }
443d9f0492fSopenharmony_ci    if (msgNode->tlvOffset) {
444d9f0492fSopenharmony_ci        free(msgNode->tlvOffset);
445d9f0492fSopenharmony_ci        msgNode->tlvOffset = NULL;
446d9f0492fSopenharmony_ci    }
447d9f0492fSopenharmony_ci    free(msgNode);
448d9f0492fSopenharmony_ci}
449d9f0492fSopenharmony_ci
450d9f0492fSopenharmony_ciint CheckMsg(const MsgNode *message)
451d9f0492fSopenharmony_ci{
452d9f0492fSopenharmony_ci    if (message == NULL) {
453d9f0492fSopenharmony_ci        return MSG_INVALID;
454d9f0492fSopenharmony_ci    }
455d9f0492fSopenharmony_ci    if (strlen(message->msgHeader.processName) <= 0) {
456d9f0492fSopenharmony_ci        printf("Invalid property processName %s \n", message->msgHeader.buffer);
457d9f0492fSopenharmony_ci        return MSG_INVALID;
458d9f0492fSopenharmony_ci    }
459d9f0492fSopenharmony_ci    if (message->tlvOffset == NULL) {
460d9f0492fSopenharmony_ci        printf("Invalid property tlv offset %s \n", message->msgHeader.buffer);
461d9f0492fSopenharmony_ci        return MSG_INVALID;
462d9f0492fSopenharmony_ci    }
463d9f0492fSopenharmony_ci    if (message->buffer == NULL) {
464d9f0492fSopenharmony_ci        printf("Invalid property buffer %s \n", message->msgHeader.buffer);
465d9f0492fSopenharmony_ci        return MSG_INVALID;
466d9f0492fSopenharmony_ci    }
467d9f0492fSopenharmony_ci
468d9f0492fSopenharmony_ci    if (message->tlvOffset[TLV_BUNDLE_INFO] == INVALID_OFFSET ||
469d9f0492fSopenharmony_ci        message->tlvOffset[TLV_MSG_FLAGS] == INVALID_OFFSET ||
470d9f0492fSopenharmony_ci        message->tlvOffset[TLV_ACCESS_TOKEN_INFO] == INVALID_OFFSET ||
471d9f0492fSopenharmony_ci        message->tlvOffset[TLV_DOMAIN_INFO] == INVALID_OFFSET ||
472d9f0492fSopenharmony_ci        message->tlvOffset[TLV_DAC_INFO] == INVALID_OFFSET) {
473d9f0492fSopenharmony_ci        printf("No must tlv bundle: %u flags: %u token: %u domain %u %u \n",
474d9f0492fSopenharmony_ci            message->tlvOffset[TLV_BUNDLE_INFO], message->tlvOffset[TLV_MSG_FLAGS],
475d9f0492fSopenharmony_ci            message->tlvOffset[TLV_ACCESS_TOKEN_INFO],
476d9f0492fSopenharmony_ci            message->tlvOffset[TLV_DOMAIN_INFO], message->tlvOffset[TLV_DAC_INFO]);
477d9f0492fSopenharmony_ci        return MSG_INVALID;
478d9f0492fSopenharmony_ci    }
479d9f0492fSopenharmony_ci
480d9f0492fSopenharmony_ci    return 0;
481d9f0492fSopenharmony_ci}
482d9f0492fSopenharmony_ci
483d9f0492fSopenharmony_cistatic void ProcessReqMsg(MyTask *task, MsgNode *message)
484d9f0492fSopenharmony_ci{
485d9f0492fSopenharmony_ci    int ret = CheckMsg(message);
486d9f0492fSopenharmony_ci    if (ret != 0) {
487d9f0492fSopenharmony_ci        SendResponse(task, &message->msgHeader, ret, 0);
488d9f0492fSopenharmony_ci        DeleteMsg(message);
489d9f0492fSopenharmony_ci        return;
490d9f0492fSopenharmony_ci    }
491d9f0492fSopenharmony_ci
492d9f0492fSopenharmony_ci    message->task = task;
493d9f0492fSopenharmony_ci}
494d9f0492fSopenharmony_ci
495d9f0492fSopenharmony_civoid *GetMsgExtInfo(const MsgNode *message, const char *name, uint32_t *len)
496d9f0492fSopenharmony_ci{
497d9f0492fSopenharmony_ci    if (name == NULL) {
498d9f0492fSopenharmony_ci        printf("Invalid name \n");
499d9f0492fSopenharmony_ci        return NULL;
500d9f0492fSopenharmony_ci    }
501d9f0492fSopenharmony_ci    if (message == NULL || message->buffer == NULL || message->tlvOffset == NULL) {
502d9f0492fSopenharmony_ci        return NULL;
503d9f0492fSopenharmony_ci    }
504d9f0492fSopenharmony_ci    printf("GetMsgExtInfo tlvCount %d name %s \n", message->tlvCount, name);
505d9f0492fSopenharmony_ci
506d9f0492fSopenharmony_ci    for (uint32_t index = TLV_MAX; index < (TLV_MAX + message->tlvCount); index++) {
507d9f0492fSopenharmony_ci        if (message->tlvOffset[index] == INVALID_OFFSET) {
508d9f0492fSopenharmony_ci            return NULL;
509d9f0492fSopenharmony_ci        }
510d9f0492fSopenharmony_ci        uint8_t *data = message->buffer + message->tlvOffset[index];
511d9f0492fSopenharmony_ci        if (((Tlv *)data)->tlvType != TLV_MAX) {
512d9f0492fSopenharmony_ci            continue;
513d9f0492fSopenharmony_ci        }
514d9f0492fSopenharmony_ci        TlvExt *tlv = (TlvExt *)data;
515d9f0492fSopenharmony_ci        if (strcmp(tlv->tlvName, name) != 0) {
516d9f0492fSopenharmony_ci            continue;
517d9f0492fSopenharmony_ci        }
518d9f0492fSopenharmony_ci        if (len != NULL) {
519d9f0492fSopenharmony_ci            *len = tlv->dataLen;
520d9f0492fSopenharmony_ci        }
521d9f0492fSopenharmony_ci        return data + sizeof(TlvExt);
522d9f0492fSopenharmony_ci    }
523d9f0492fSopenharmony_ci    return NULL;
524d9f0492fSopenharmony_ci}
525d9f0492fSopenharmony_ci
526d9f0492fSopenharmony_ciMsgNode *RebuildMsgNode(MsgNode *message, Process *info)
527d9f0492fSopenharmony_ci{
528d9f0492fSopenharmony_ci#ifdef DEBUG_BEGETCTL_BOOT
529d9f0492fSopenharmony_ci    if (message == NULL || info == NULL) {
530d9f0492fSopenharmony_ci        printf("params is null \n");
531d9f0492fSopenharmony_ci        return NULL;
532d9f0492fSopenharmony_ci    }
533d9f0492fSopenharmony_ci
534d9f0492fSopenharmony_ci    uint32_t bufferLen = 0;
535d9f0492fSopenharmony_ci    MsgNode *node = CreateMsg();
536d9f0492fSopenharmony_ci    if (node == NULL) {
537d9f0492fSopenharmony_ci        printf("Failed to create MsgNode \n");
538d9f0492fSopenharmony_ci        return NULL;
539d9f0492fSopenharmony_ci    }
540d9f0492fSopenharmony_ci
541d9f0492fSopenharmony_ci    int ret = memcpy_s(&node->msgHeader, sizeof(Message), &message->msgHeader, sizeof(Message));
542d9f0492fSopenharmony_ci    if (ret != 0) {
543d9f0492fSopenharmony_ci        printf("Failed to memcpy_s node->msgHeader \n");
544d9f0492fSopenharmony_ci        return NULL;
545d9f0492fSopenharmony_ci    }
546d9f0492fSopenharmony_ci
547d9f0492fSopenharmony_ci    bufferLen = message->msgHeader.msgLen + info->message->msgHeader.msgLen - sizeof(Message);
548d9f0492fSopenharmony_ci    node->msgHeader.msgLen = bufferLen;
549d9f0492fSopenharmony_ci    node->msgHeader.msgType = MSG_NATIVE_PROCESS;
550d9f0492fSopenharmony_ci    node->msgHeader.tlvCount += message->msgHeader.tlvCount;
551d9f0492fSopenharmony_ci    ret = MsgRebuild(node, &node->msgHeader);
552d9f0492fSopenharmony_ci    if (ret != 0) {
553d9f0492fSopenharmony_ci        DeleteMsg(node);
554d9f0492fSopenharmony_ci        printf("Failed to alloc memory for recv message \n");
555d9f0492fSopenharmony_ci        return NULL;
556d9f0492fSopenharmony_ci    }
557d9f0492fSopenharmony_ci
558d9f0492fSopenharmony_ci    uint32_t infoBufLen = info->message->msgHeader.msgLen - sizeof(Message);
559d9f0492fSopenharmony_ci    uint32_t msgBufLen = message->msgHeader.msgLen - sizeof(Message);
560d9f0492fSopenharmony_ci    ret = memcpy_s(node->buffer, bufferLen, info->message->buffer, infoBufLen);
561d9f0492fSopenharmony_ci    if (ret != 0) {
562d9f0492fSopenharmony_ci        DeleteMsg(node);
563d9f0492fSopenharmony_ci        printf("Failed to memcpy_s info buffer \n");
564d9f0492fSopenharmony_ci        return NULL;
565d9f0492fSopenharmony_ci    }
566d9f0492fSopenharmony_ci    ret = memcpy_s(node->buffer + infoBufLen, bufferLen - infoBufLen, message->buffer, msgBufLen);
567d9f0492fSopenharmony_ci    if (ret != 0) {
568d9f0492fSopenharmony_ci        DeleteMsg(node);
569d9f0492fSopenharmony_ci        printf("Failed to memcpy_s message->buffer \n");
570d9f0492fSopenharmony_ci        return NULL;
571d9f0492fSopenharmony_ci    }
572d9f0492fSopenharmony_ci    return node;
573d9f0492fSopenharmony_ci#endif
574d9f0492fSopenharmony_ci    return NULL;
575d9f0492fSopenharmony_ci}
576d9f0492fSopenharmony_ci
577d9f0492fSopenharmony_cistatic MsgNode *ProcessBegetctlMsg(MyTask *task, MsgNode *message)
578d9f0492fSopenharmony_ci{
579d9f0492fSopenharmony_ci    uint32_t len = 0;
580d9f0492fSopenharmony_ci    const char *msg = (const char *)GetMsgExtInfo(message, MSG_EXT_NAME_BEGET_PID, &len);
581d9f0492fSopenharmony_ci    if (msg == NULL) {
582d9f0492fSopenharmony_ci        printf("Failed to get extInfo \n");
583d9f0492fSopenharmony_ci        return NULL;
584d9f0492fSopenharmony_ci    }
585d9f0492fSopenharmony_ci
586d9f0492fSopenharmony_ci    MsgNode *msgNode = RebuildMsgNode(message, info);
587d9f0492fSopenharmony_ci    if (msgNode == NULL) {
588d9f0492fSopenharmony_ci        printf("Failed to rebuild message node \n");
589d9f0492fSopenharmony_ci        return NULL;
590d9f0492fSopenharmony_ci    }
591d9f0492fSopenharmony_ci
592d9f0492fSopenharmony_ci    int ret = DecodeMsg(msgNode);
593d9f0492fSopenharmony_ci    if (ret != 0) {
594d9f0492fSopenharmony_ci        DeletenMsg(msgNode);
595d9f0492fSopenharmony_ci        return NULL;
596d9f0492fSopenharmony_ci    }
597d9f0492fSopenharmony_ci    return msgNode;
598d9f0492fSopenharmony_ci}
599d9f0492fSopenharmony_ci
600d9f0492fSopenharmony_cistatic void ProcessBegetMsg(MyTask *task, MsgNode *message)
601d9f0492fSopenharmony_ci{
602d9f0492fSopenharmony_ci    Message *msg = &message->msgHeader;
603d9f0492fSopenharmony_ci
604d9f0492fSopenharmony_ci    MsgNode *msgNode = ProcessBegetctlMsg(connection, message);
605d9f0492fSopenharmony_ci    if (msgNode == NULL) {
606d9f0492fSopenharmony_ci        SendResponse(task, msg, DEBUG_MODE_NOT_SUPPORT, 0);
607d9f0492fSopenharmony_ci        DeleteMsg(message);
608d9f0492fSopenharmony_ci        return;
609d9f0492fSopenharmony_ci    }
610d9f0492fSopenharmony_ci    ProcessReqMsg(task, msgNode);
611d9f0492fSopenharmony_ci    DeleteMsg(message);
612d9f0492fSopenharmony_ci    DeleteMsg(msgNode);
613d9f0492fSopenharmony_ci}
614d9f0492fSopenharmony_ci
615d9f0492fSopenharmony_cistatic void ProcessRecvMsg(MyTask *task, MsgNode *message)
616d9f0492fSopenharmony_ci{
617d9f0492fSopenharmony_ci    Message *msg = &message->msgHeader;
618d9f0492fSopenharmony_ci    printf("Recv message header magic 0x%x type %u id %u len %u %s \n",
619d9f0492fSopenharmony_ci        msg->magic, msg->msgType, msg->msgId, msg->msgLen, msg->buffer);
620d9f0492fSopenharmony_ci    if (task->receiverCtx.nextMsgId != msg->msgId) {
621d9f0492fSopenharmony_ci        printf("Invalid msg id %u %u \n", task->receiverCtx.nextMsgId, msg->msgId);
622d9f0492fSopenharmony_ci    }
623d9f0492fSopenharmony_ci    task->receiverCtx.nextMsgId++;
624d9f0492fSopenharmony_ci
625d9f0492fSopenharmony_ci    int ret;
626d9f0492fSopenharmony_ci    switch (msg->msgType) {
627d9f0492fSopenharmony_ci        case MSG_GET_RENDER_TERMINATION_STATUS: {  // get status
628d9f0492fSopenharmony_ci            Result result = {0};
629d9f0492fSopenharmony_ci            ret = ProcessTerminationStatusMsg(message, &result);
630d9f0492fSopenharmony_ci            SendResponse(task, msg, ret == 0 ? result.result : ret, result.pid);
631d9f0492fSopenharmony_ci            DeleteMessage(message);
632d9f0492fSopenharmony_ci            break;
633d9f0492fSopenharmony_ci        }
634d9f0492fSopenharmony_ci        case MSG_NORMAL: {
635d9f0492fSopenharmony_ci            ProcessReqMsg(task, message);
636d9f0492fSopenharmony_ci            break;
637d9f0492fSopenharmony_ci        }
638d9f0492fSopenharmony_ci        case MSG_DUMP:
639d9f0492fSopenharmony_ci            SendResponse(task, msg, 0, 0);
640d9f0492fSopenharmony_ci            DeleteMessage(message);
641d9f0492fSopenharmony_ci            break;
642d9f0492fSopenharmony_ci        case MSG_BEGET: {
643d9f0492fSopenharmony_ci            ProcessBegetMsg(task, message);
644d9f0492fSopenharmony_ci            break;
645d9f0492fSopenharmony_ci        }
646d9f0492fSopenharmony_ci        case MSG_BEGET_TIME:
647d9f0492fSopenharmony_ci            SendResponse(task, msg, MIN_TIME, MAX_TIME);
648d9f0492fSopenharmony_ci            DeleteMessage(message);
649d9f0492fSopenharmony_ci            break;
650d9f0492fSopenharmony_ci        case MSG_UPDATE_MOUNT_POINTS:
651d9f0492fSopenharmony_ci            ret = ProcessRemountMsg(task, message);
652d9f0492fSopenharmony_ci            SendResponse(task, msg, ret, 0);
653d9f0492fSopenharmony_ci            break;
654d9f0492fSopenharmony_ci        case MSG_RESTART:
655d9f0492fSopenharmony_ci            ProcessRestartMsg(task, message);
656d9f0492fSopenharmony_ci            break;
657d9f0492fSopenharmony_ci        default:
658d9f0492fSopenharmony_ci            SendResponse(task, msg, MSG_INVALID, 0);
659d9f0492fSopenharmony_ci            DeleteMessage(message);
660d9f0492fSopenharmony_ci            break;
661d9f0492fSopenharmony_ci    }
662d9f0492fSopenharmony_ci}
663d9f0492fSopenharmony_ci
664d9f0492fSopenharmony_cistatic void OnReceiveRequest(const TaskHandle taskHandle, const uint8_t *buffer, uint32_t buffLen)
665d9f0492fSopenharmony_ci{
666d9f0492fSopenharmony_ci    MyTask *task = (MyTask *)LE_GetUserData(taskHandle);
667d9f0492fSopenharmony_ci    if (task == NULL) {
668d9f0492fSopenharmony_ci        printf("Failed to get client form socket\n");
669d9f0492fSopenharmony_ci        LE_CloseTask(LE_GetDefaultLoop(), taskHandle);
670d9f0492fSopenharmony_ci        return;
671d9f0492fSopenharmony_ci    }
672d9f0492fSopenharmony_ci
673d9f0492fSopenharmony_ci    if (buffLen >= MAX_MSG_TOTAL_LENGTH) {
674d9f0492fSopenharmony_ci        printf("Message too long %u \n", buffLen);
675d9f0492fSopenharmony_ci        LE_CloseTask(LE_GetDefaultLoop(), taskHandle);
676d9f0492fSopenharmony_ci        return;
677d9f0492fSopenharmony_ci    }
678d9f0492fSopenharmony_ci
679d9f0492fSopenharmony_ci    uint32_t reminder = 0;
680d9f0492fSopenharmony_ci    uint32_t currLen = 0;
681d9f0492fSopenharmony_ci    Message *message = task->ctx.incompleteMsg; // incomplete msg
682d9f0492fSopenharmony_ci    task->ctx.incompleteMsg = NULL;
683d9f0492fSopenharmony_ci    int ret = 0;
684d9f0492fSopenharmony_ci    do {
685d9f0492fSopenharmony_ci        printf("OnReceiveRequest connectionId: %u start: 0x%x buffLen %d",
686d9f0492fSopenharmony_ci            task->id, *(uint32_t *)(buffer + currLen), buffLen - currLen);
687d9f0492fSopenharmony_ci
688d9f0492fSopenharmony_ci        ret = GetMsgFromBuffer(buffer + currLen, buffLen - currLen,
689d9f0492fSopenharmony_ci            &message, &task->ctx.msgRecvLen, &reminder);
690d9f0492fSopenharmony_ci        if (ret != 0) {
691d9f0492fSopenharmony_ci            break;
692d9f0492fSopenharmony_ci        }
693d9f0492fSopenharmony_ci
694d9f0492fSopenharmony_ci        if (task->ctx.msgRecvLen != message->msgLen) {  // recv complete msg
695d9f0492fSopenharmony_ci            task->ctx.incompleteMsg = message;
696d9f0492fSopenharmony_ci            message = NULL;
697d9f0492fSopenharmony_ci            break;
698d9f0492fSopenharmony_ci        }
699d9f0492fSopenharmony_ci        task->ctx.msgRecvLen = 0;
700d9f0492fSopenharmony_ci        if (task->ctx.timer) {
701d9f0492fSopenharmony_ci            LE_StopTimer(LE_GetDefaultLoop(), task->ctx.timer);
702d9f0492fSopenharmony_ci            task->ctx.timer = NULL;
703d9f0492fSopenharmony_ci        }
704d9f0492fSopenharmony_ci        // decode msg
705d9f0492fSopenharmony_ci        ret = DecodeMsg(message);
706d9f0492fSopenharmony_ci        if (ret != 0) {
707d9f0492fSopenharmony_ci            break;
708d9f0492fSopenharmony_ci        }
709d9f0492fSopenharmony_ci        (void)ProcessRecvMsg(task, message);
710d9f0492fSopenharmony_ci        message = NULL;
711d9f0492fSopenharmony_ci        currLen += buffLen - reminder;
712d9f0492fSopenharmony_ci    } while (reminder > 0);
713d9f0492fSopenharmony_ci
714d9f0492fSopenharmony_ci    if (task->ctx.incompleteMsg != NULL) { // Start the detection timer
715d9f0492fSopenharmony_ci        ret = StartTimerForCheckMsg(task);
716d9f0492fSopenharmony_ci        if (ret != 0) {
717d9f0492fSopenharmony_ci            LE_CloseStreamTask(LE_GetDefaultLoop(), taskHandle);
718d9f0492fSopenharmony_ci        }
719d9f0492fSopenharmony_ci    }
720d9f0492fSopenharmony_ci}
721d9f0492fSopenharmony_ci
722d9f0492fSopenharmony_ciint main(int argc, char *const argv[])
723d9f0492fSopenharmony_ci{
724d9f0492fSopenharmony_ci    printf("main argc: %d \n", argc);
725d9f0492fSopenharmony_ci    if (argc <= 0) {
726d9f0492fSopenharmony_ci        return 0;
727d9f0492fSopenharmony_ci    }
728d9f0492fSopenharmony_ci
729d9f0492fSopenharmony_ci    printf("请输入创建socket的类型:(pipe, tcp)\n");
730d9f0492fSopenharmony_ci    char type[128];
731d9f0492fSopenharmony_ci    int ret = scanf_s("%s", type, sizeof(type));
732d9f0492fSopenharmony_ci    if (ret <= 0) {
733d9f0492fSopenharmony_ci        printf("input error \n");
734d9f0492fSopenharmony_ci        return 0;
735d9f0492fSopenharmony_ci    }
736d9f0492fSopenharmony_ci
737d9f0492fSopenharmony_ci    int flags;
738d9f0492fSopenharmony_ci    char *server;
739d9f0492fSopenharmony_ci    if (strcmp(type, "pipe") == 0) {
740d9f0492fSopenharmony_ci        flags = TASK_STREAM | TASK_PIPE |TASK_SERVER | TASK_TEST;
741d9f0492fSopenharmony_ci        server = (char *)"/data/testpipe";
742d9f0492fSopenharmony_ci    } else if (strcmp(type, "tcp") == 0) {
743d9f0492fSopenharmony_ci        flags = TASK_STREAM | TASK_TCP |TASK_SERVER | TASK_TEST;
744d9f0492fSopenharmony_ci        server = (char *)"127.0.0.1:7777";
745d9f0492fSopenharmony_ci    } else {
746d9f0492fSopenharmony_ci        printf("输入有误,请输入pipe或者tcp!");
747d9f0492fSopenharmony_ci        system("pause");
748d9f0492fSopenharmony_ci        return 0;
749d9f0492fSopenharmony_ci    }
750d9f0492fSopenharmony_ci
751d9f0492fSopenharmony_ci    return 0;
752d9f0492fSopenharmony_ci}