1 #include "RkAiqsceneManager.h"
2
3 #include <cstring>
4
mergeSubMultiScene(cJSON * sub_scene_list,cJSON * full_param,bool skip)5 cJSON *RkAiqsceneManager::mergeSubMultiScene(cJSON *sub_scene_list,
6 cJSON *full_param, bool skip) {
7 cJSON *json_item = NULL;
8 cJSON *new_item = NULL;
9 int sub_scene_sum = 0;
10 int i = 0;
11
12 if (!sub_scene_list || !full_param) {
13 printf("input base json is invalid!\n");
14 return NULL;
15 }
16
17 // need skip first full param scene
18 if (cJSON_GetArraySize(sub_scene_list) <= skip) {
19 printf("%s %d only one sub scene, ignore!\n", __func__, __LINE__);
20 return NULL;
21 }
22
23 json_item = sub_scene_list->child;
24
25 sub_scene_sum = cJSON_GetArraySize(sub_scene_list);
26 for (i = 0; i < sub_scene_sum; i++) {
27 if (json_item) {
28 cJSON *temp_item = json_item;
29 json_item = json_item->next;
30 // skip the full param scene
31 if (i == 0 && skip) {
32 continue;
33 }
34 new_item = cJSON_Duplicate(full_param, 1);
35 new_item = cJSONUtils_MergePatch(new_item, temp_item);
36 cJSON_ReplaceItemInArray(sub_scene_list, i, new_item);
37 } else {
38 break;
39 }
40 }
41
42 return sub_scene_list;
43 }
44
mergeMainMultiScene(cJSON * main_scene_list)45 cJSON *RkAiqsceneManager::mergeMainMultiScene(cJSON *main_scene_list) {
46 cJSON *json_item = NULL;
47 cJSON *first_sub_scene_list = NULL;
48 cJSON *main_first = NULL;
49 cJSON *full_param = NULL;
50
51 if (!main_scene_list) {
52 printf("input main scene list json is invalid!\n");
53 return NULL;
54 }
55
56 if (cJSON_GetArraySize(main_scene_list) <= 0) {
57 printf("invalid main scene len!\n");
58 return NULL;
59 }
60
61 main_first = cJSON_GetArrayItem(main_scene_list, 0);
62 first_sub_scene_list = cJSONUtils_GetPointer(main_first, "/sub_scene");
63
64 if (cJSON_GetArraySize(first_sub_scene_list) <= 0) {
65 printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
66 return NULL;
67 }
68
69 full_param = cJSON_GetArrayItem(first_sub_scene_list, 0);
70
71 if (!full_param) {
72 printf("invalid full param scene!\n");
73 return NULL;
74 }
75
76 json_item = main_scene_list->child;
77
78 int main_scene_sum = cJSON_GetArraySize(main_scene_list);
79 for (int i = 0; i < main_scene_sum; i++) {
80 // need skip first main scene's sub scene
81 cJSON *sub_scene_list = cJSONUtils_GetPointer(json_item, "/sub_scene");
82 if (json_item && sub_scene_list) {
83 mergeSubMultiScene(sub_scene_list, full_param, i == 0);
84 }
85 json_item = json_item->next;
86 }
87
88 return main_scene_list;
89 }
90
mergeMultiSceneIQ(cJSON * base_json)91 cJSON *RkAiqsceneManager::mergeMultiSceneIQ(cJSON *base_json) {
92 cJSON *main_scene_list_json = NULL;
93
94 // 1. foreach every sub scene.
95 // 2. merge every sub scene to base scene.
96 // 3. replace sub scene with new json.
97 if (!base_json) {
98 printf("input base json is invalid!\n");
99 return NULL;
100 }
101
102 main_scene_list_json = cJSONUtils_GetPointer(base_json, "/main_scene");
103 if (!main_scene_list_json) {
104 printf("invalid main scene!\n");
105 return NULL;
106 }
107
108 if (cJSON_GetArraySize(main_scene_list_json) <= 0) {
109 printf("invalid main scene len!\n");
110 return NULL;
111 }
112
113 if (!mergeMainMultiScene(main_scene_list_json)) {
114 return NULL;
115 }
116
117 return base_json;
118 }
119
findMainScene(cJSON * base_json,const char * name)120 cJSON *RkAiqsceneManager::findMainScene(cJSON *base_json, const char *name) {
121 cJSON *json_item = NULL;
122 cJSON *found_main_json = NULL;
123 cJSON *main_scene_json = NULL;
124
125 if (!base_json) {
126 printf("input base json is invalid!\n");
127 return NULL;
128 }
129
130 main_scene_json = cJSONUtils_GetPointer(base_json, "/main_scene");
131 if (!main_scene_json) {
132 printf("invalid main scene!\n");
133 return NULL;
134 }
135
136 int main_scene_sum = cJSON_GetArraySize(main_scene_json);
137 if (main_scene_sum <= 0) {
138 printf("invalid main scene len!\n");
139 return NULL;
140 }
141
142 json_item = main_scene_json->child;
143
144 for (int i = 0; i <= (main_scene_sum - 1); ++i) {
145 if (json_item) {
146 char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
147 if (name_str && strstr(name_str, name)) {
148 found_main_json = json_item;
149 break;
150 }
151 }
152 json_item = json_item->next;
153 }
154
155 return found_main_json;
156 }
157
findSubScene(cJSON * main_json,const char * name)158 cJSON *RkAiqsceneManager::findSubScene(cJSON *main_json, const char *name) {
159 cJSON *json_item = NULL;
160 cJSON *found_sub_json = NULL;
161 cJSON *sub_scene_json = NULL;
162
163 if (!main_json) {
164 printf("input main scene json is invalid!\n");
165 return NULL;
166 }
167
168 sub_scene_json = cJSONUtils_GetPointer(main_json, "/sub_scene");
169 if (!sub_scene_json) {
170 printf("invalid sub scene!\n");
171 return NULL;
172 }
173
174 int sub_scene_sum = cJSON_GetArraySize(sub_scene_json);
175 if (sub_scene_sum <= 0) {
176 printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
177 return NULL;
178 }
179
180 json_item = sub_scene_json->child;
181
182 for (int i = 0; i < sub_scene_sum; ++i) {
183 if (json_item) {
184 char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
185 if (name_str && strstr(name_str, name)) {
186 found_sub_json = json_item;
187 break;
188 }
189 }
190 json_item = json_item->next;
191 }
192
193 return found_sub_json;
194 }
195
findSubScene(cJSON * json,const char * main_scene,const char * sub_scene)196 cJSON *RkAiqsceneManager::findSubScene(cJSON *json, const char *main_scene,
197 const char *sub_scene) {
198
199 return findSubScene(findMainScene(json, main_scene), sub_scene);
200 }
201
202 std::map<std::string, cJSON *>
getMainSceneList(cJSON * root_js)203 RkAiqsceneManager::getMainSceneList(cJSON *root_js) {
204 cJSON *json_item = NULL;
205 cJSON *main_scene_json = NULL;
206 std::map<std::string, cJSON *> mMap;
207
208 if (!root_js) {
209 printf("input base json is invalid!\n");
210 return {};
211 }
212
213 main_scene_json = cJSONUtils_GetPointer(root_js, "/main_scene");
214 if (!main_scene_json) {
215 printf("invalid main scene!\n");
216 return {};
217 }
218
219 int main_scene_sum = cJSON_GetArraySize(main_scene_json);
220 if (main_scene_sum <= 0) {
221 printf("invalid main scene len!\n");
222 return {};
223 }
224
225 json_item = main_scene_json->child;
226
227 for (int i = 0; i <= (main_scene_sum - 1); ++i) {
228 if (json_item) {
229 char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
230 if (name_str && strlen(name_str) > 0) {
231 mMap[std::string(name_str)] = json_item;
232 }
233 }
234 json_item = json_item->next;
235 }
236
237 return mMap;
238 }
239
240 std::map<std::string, cJSON *>
getSubSceneList(cJSON * main_js,const std::string name)241 RkAiqsceneManager::getSubSceneList(cJSON *main_js, const std::string name) {
242 cJSON *json_item = NULL;
243 cJSON *sub_scene_json = NULL;
244 std::map<std::string, cJSON *> mMap;
245
246 if (!main_js) {
247 printf("input main scene json is invalid!\n");
248 return {};
249 }
250
251 sub_scene_json = cJSONUtils_GetPointer(main_js, "/sub_scene");
252 if (!sub_scene_json) {
253 printf("invalid sub scene!\n");
254 return {};
255 }
256
257 int sub_scene_sum = cJSON_GetArraySize(sub_scene_json);
258 if (sub_scene_sum <= 0) {
259 printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
260 return {};
261 }
262
263 json_item = sub_scene_json->child;
264
265 for (int i = 0; i < sub_scene_sum; ++i) {
266 if (json_item) {
267 char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
268 if (name_str && strlen(name_str) > 0) {
269 mMap[std::string(name + "/" + std::string(name_str))] = json_item;
270 }
271 }
272 json_item = json_item->next;
273 }
274
275 return mMap;
276 }
277
278 std::map<std::string, cJSON *>
expandAllScene(cJSON * root_js)279 RkAiqsceneManager::expandAllScene(cJSON *root_js) {
280 if (!root_js) {
281 return {};
282 }
283 return {};
284 }
285
splitScene(cJSON * root_js,const char * main_scene,const char * sub_scene)286 cJSON *RkAiqsceneManager::splitScene(cJSON *root_js, const char *main_scene,
287 const char *sub_scene) {
288 cJSON *new_json = NULL;
289 std::string scene_index = "";
290
291 if (!root_js || !main_scene || !sub_scene) {
292 printf("input is invalid argument!\n");
293 return NULL;
294 }
295
296 scene_index = std::string(main_scene) + "/" + std::string(sub_scene);
297
298 new_json = cJSON_Duplicate(root_js, 1);
299
300 if (!new_json) {
301 printf("clone json failed!\n");
302 return NULL;
303 }
304
305 std::map<std::string, cJSON *> main_scene_list = getMainSceneList(new_json);
306
307 for (auto mScene : main_scene_list) {
308 // delete main scene witch we don't want.
309 if (0 != std::string(main_scene).compare(mScene.first) && mScene.second) {
310 cJSON_DetachItemViaPointer(new_json, mScene.second);
311 main_scene_list.erase(mScene.first);
312 }
313 }
314
315 return new_json;
316 }
317
318