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}