1 /*
2  * Copyright (C) 2024 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 #include <cJSON.h>
16 
17 #include "cJsonMock.h"
18 
19 using namespace OHOS::FileManagement::Backup;
20 
CaseInsensitiveStrcmp(const unsigned char * string1,const unsigned char * string2)21 static int CaseInsensitiveStrcmp(const unsigned char *string1, const unsigned char *string2)
22 {
23     if ((string1 == NULL) || (string2 == NULL)) {
24         return 1;
25     }
26 
27     if (string1 == string2) {
28         return 0;
29     }
30 
31     for (; tolower(*string1) == tolower(*string2); (void)string1++, string2++) {
32         if (*string1 == '\0') {
33             return 0;
34         }
35     }
36 
37     return tolower(*string1) - tolower(*string2);
38 }
39 
GetObjectItem(const cJSON * const object,const char * const name,const cJSON_bool caseSensitive)40 static cJSON *GetObjectItem(const cJSON * const object, const char * const name, const cJSON_bool caseSensitive)
41 {
42     cJSON *current_element = NULL;
43 
44     if ((object == NULL) || (name == NULL)) {
45         return NULL;
46     }
47 
48     current_element = object->child;
49     if (caseSensitive) {
50         while ((current_element != NULL) && (current_element->string != NULL) &&
51             (strcmp(name, current_element->string) != 0)) {
52             current_element = current_element->next;
53         }
54     } else {
55         while ((current_element != NULL) &&
56             (CaseInsensitiveStrcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) {
57             current_element = current_element->next;
58         }
59     }
60 
61     if ((current_element == NULL) || (current_element->string == NULL)) {
62         return NULL;
63     }
64 
65     return current_element;
66 }
67 
CJSONDelete(cJSON * item)68 CJSON_PUBLIC(void) CJSONDelete(cJSON *item)
69 {
70     cJSON *next = NULL;
71     while (item != NULL)
72     {
73         next = item->next;
74         if (!(item->type & cJSON_IsReference) && (item->child != NULL))
75         {
76             CJSONDelete(item->child);
77         }
78         if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL))
79         {
80             free(item->valuestring);
81             item->valuestring = NULL;
82         }
83         if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))
84         {
85             free(item->string);
86             item->string = NULL;
87         }
88         if (next == item)
89         {
90             break;
91         }
92         free(item);
93         item = next;
94     }
95 }
96 
cJSON_CreateArray(void)97 CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void)
98 {
99     return CJson::cJsonPtr->cJSON_CreateArray();
100 }
101 
cJSON_CreateObject(void)102 CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void)
103 {
104     return CJson::cJsonPtr->cJSON_CreateObject();
105 }
106 
cJSON_Print(const cJSON * item)107 CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item)
108 {
109     return CJson::cJsonPtr->cJSON_Print(item);
110 }
111 
cJSON_Parse(const char * value)112 CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)
113 {
114     return (CJson::cJsonPtr == nullptr) ? cJSON_ParseWithOpts(value, 0, 0) : CJson::cJsonPtr->cJSON_Parse(value);
115 }
116 
cJSON_GetObjectItem(const cJSON * const object,const char * const string)117 CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON *const object, const char *const string)
118 {
119     return (CJson::cJsonPtr == nullptr) ? GetObjectItem(object, string, false) :
120         CJson::cJsonPtr->cJSON_GetObjectItem(object, string);
121 }
122 
cJSON_Delete(cJSON * item)123 CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
124 {
125     return (CJson::cJsonPtr == nullptr) ? CJSONDelete(item) : CJson::cJsonPtr->cJSON_Delete(item);
126 }
127 
cJSON_AddItemToObject(cJSON * object,const char * string,cJSON * item)128 CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item)
129 {
130     return CJson::cJsonPtr->cJSON_AddItemToObject(object, string, item);
131 }
132 
cJSON_GetArraySize(const cJSON * array)133 CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
134 {
135     return CJson::cJsonPtr->cJSON_GetArraySize(array);
136 }
137 
cJSON_AddItemToArray(cJSON * array,cJSON * item)138 CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item)
139 {
140     return CJson::cJsonPtr->cJSON_AddItemToArray(array, item);
141 }
142 
cJSON_AddStringToObject(cJSON * const object,const char * const name,const char * const string)143 CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)
144 {
145     return CJson::cJsonPtr->cJSON_AddStringToObject(object, name, string);
146 }
147 
IsArray(const cJSON * const item)148 static CJSON_PUBLIC(cJSON_bool) IsArray(const cJSON * const item)
149 {
150     if (item == NULL) {
151         return false;
152     }
153 
154     return (item->type & 0xFF) == cJSON_Array;
155 }
156 
cJSON_IsArray(const cJSON * const item)157 CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item)
158 {
159     return (CJson::cJsonPtr == nullptr) ? IsArray(item) : CJson::cJsonPtr->cJSON_IsArray(item);
160 }
161 
cJSON_free(void * object)162 CJSON_PUBLIC(void) cJSON_free(void *object)
163 {
164     return (CJson::cJsonPtr == nullptr) ? free(object) : CJson::cJsonPtr->cJSON_free(object);
165 }