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 "dslm_msg_serialize.h" 17 18#include <stdbool.h> 19#include <stdint.h> 20#include <stdlib.h> 21#include <string.h> 22 23#include "securec.h" 24 25#include "utils_json.h" 26#include "utils_log.h" 27#include "utils_mem.h" 28 29#define ASCII_MAX 0x7fU 30 31static inline bool IsAscii(const uint8_t ch) 32{ 33 return (((ch) & (~ASCII_MAX)) == 0); 34} 35 36bool CheckMessage(const uint8_t *msg, uint32_t length) 37{ 38 if (msg == NULL || length <= 1 || length > MSG_BUFF_MAX_LENGTH) { 39 return false; 40 } 41 42 // our msgs is a printable string 43 if (msg[length - 1] != '\0') { 44 return false; 45 } 46 for (uint32_t i = 0; i < length - 1; i++) { 47 if (!IsAscii(msg[i])) { 48 return false; 49 } 50 } 51 return true; 52} 53 54MessagePacket *ParseMessage(const MessageBuff *buff) 55{ 56 if (buff == NULL) { 57 SECURITY_LOG_DEBUG("EMPTY BUFF"); 58 return NULL; 59 } 60 61 if (!CheckMessage(buff->buff, buff->length)) { 62 SECURITY_LOG_DEBUG("ERR MSG"); 63 return NULL; 64 } 65 66 DslmJsonHandle handle = DslmCreateJson((const char *)buff->buff); 67 if (handle == NULL) { 68 SECURITY_LOG_DEBUG("ERR JSON MSG"); 69 return NULL; 70 } 71 72 char *payload = NULL; 73 MessagePacket *packet = NULL; 74 do { 75 int32_t msgType = DslmGetJsonFieldInt(handle, FIELD_MESSAGE); 76 if (msgType < 0) { 77 break; 78 } 79 payload = DslmConvertJsonToString(DslmGetJsonFieldJson(handle, FIELD_PAYLOAD)); 80 if (payload == NULL) { 81 break; 82 } 83 packet = MALLOC(sizeof(MessagePacket)); 84 if (packet == NULL) { 85 FREE(payload); 86 break; 87 } 88 packet->type = (uint32_t)msgType; 89 packet->payload = (uint8_t *)payload; 90 packet->length = strlen(payload) + 1; // for the end flag '\0' 91 } while (0); 92 93 DslmDestroyJson(handle); 94 return packet; 95} 96 97void FreeMessagePacket(MessagePacket *packet) 98{ 99 if (packet == NULL) { 100 return; 101 } 102 if (packet->payload != NULL) { 103 FREE(packet->payload); 104 packet->payload = NULL; 105 } 106 FREE((void *)packet); 107} 108 109void FreeMessageBuff(MessageBuff *buff) 110{ 111 if (buff == NULL) { 112 return; 113 } 114 if (buff->buff != NULL) { 115 FREE(buff->buff); 116 buff->buff = NULL; 117 } 118 FREE((void *)buff); 119} 120