Example #1
0
/*-------------------------------------------------------------------
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;
}
Example #2
0
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);
}