/*------------------------------------------------------------------- Function: GenerateOutData(); Purpose: 通过比较现有数据跟原有数据,产生要输出的字符串. Parameters: Return: 0 --- successful, -1 --- failed -------------------------------------------------------------------*/ int CRedWoodDataParse::GenerateOutData(void) { int iRet = 0; if (!oldDataJson) return GenerateOutDataFromJson(updatedDataJson); else { assert(updatedDataJson); cJSON* outJson = NULL; outJson = cJSON_Duplicate(updatedDataJson, 1); if (!outJson) return -1; cJSON* newJsonFixture = NULL; cJSON* oldJsonFixture = NULL; newJsonFixture = cJSON_GetObjectItem(outJson, "fixture"); oldJsonFixture = cJSON_GetObjectItem(oldDataJson, "fixture"); if (!newJsonFixture || !oldJsonFixture) { cJSON_Delete(outJson); return -1; } int iDataLen = 0; iDataLen = cJSON_GetArraySize(newJsonFixture); assert(iDataLen == cJSON_GetArraySize(oldJsonFixture)); //比较 fixture 节点的 每个子节点,如果相同,则从输出中删除 for (int i = iDataLen - 1; i >= 0; i--) { cJSON* oldJsonTemp = cJSON_GetArrayItem(oldJsonFixture, i); cJSON* newJsonTemp = cJSON_GetArrayItem(newJsonFixture, i); char* pOldDataTemp = cJSON_Print(oldJsonTemp); char* pNewDataTemp = cJSON_Print(newJsonTemp); if (strcmp(pOldDataTemp, pNewDataTemp) == 0) cJSON_DeleteItemFromArray(newJsonFixture, i); free(pOldDataTemp); free(pNewDataTemp); } //改变输出的数据个数 if (iDataLen != cJSON_GetArraySize(newJsonFixture)) { iDataLen = cJSON_GetArraySize(newJsonFixture); cJSON_ReplaceItemInObject(outJson, "data length", cJSON_CreateNumber(iDataLen)); } //生成目标字符串,以便输出 iRet = GenerateOutDataFromJson(outJson); cJSON_Delete(outJson); } return iRet; }
void MM_WriteJails(char *fileData, int *fileSize) { cJSON *json_arr = cJSON_CreateArray(); jail_t *root = jails.next; while (root) { cJSON *item = cJSON_CreateObject(); cJSON *origin = cJSON_CreateArray(); cJSON *angles = cJSON_CreateArray(); if (!item || !angles) { G_LogPrintf(__FUNCTION__"(): failed to create JSON object/array.\n"); continue; } for (int i = 0; i < 3; i++) cJSON_AddItemToArray(origin, cJSON_CreateNumber(root->origin[i])); for (int i = 0; i < 3; i++) cJSON_AddItemToArray(angles, cJSON_CreateNumber(root->angles[i])); cJSON_AddItemToObject(item, "origin", origin); cJSON_AddItemToObject(item, "angles", angles); cJSON_AddItemToArray(json_arr, item); char *s = cJSON_Print(json_arr); while (strlen(s) >= MAX_DATA_SIZE) { G_LogPrintf(__FUNCTION__"(): maximum filesize reached, removing items from start.\n"); cJSON_DeleteItemFromArray(json_arr, 0); } root = root->next; } Q_strncpyz(fileData, cJSON_Print(json_arr), *fileSize); *fileSize = strlen(fileData); cJSON_Delete(json_arr); }