PARCBuffer * makePayload(const CCNxName *interestName, const char *commandString) { char *commandToExecute; char *nameAsString = ccnxName_ToString(interestName); int failure = asprintf(&commandToExecute, commandString, nameAsString); assertTrue(failure > -1, "Error asprintf"); parcMemory_Deallocate((void **) &nameAsString); PARCBufferComposer *accumulator = parcBufferComposer_Create(); FILE *fp = popen(commandToExecute, "r"); if (fp != NULL) { unsigned char buffer[1024]; while (feof(fp) == 0) { size_t length = fread(buffer, sizeof(char), sizeof(buffer), fp); parcBufferComposer_PutArray(accumulator, buffer, length); } pclose(fp); } else { parcBufferComposer_PutString(accumulator, "Cannot execute: "); parcBufferComposer_PutString(accumulator, commandString); } PARCBuffer *payload = parcBufferComposer_ProduceBuffer(accumulator); parcBufferComposer_Release(&accumulator); return payload; }
static PARCBufferComposer * _buildStringString(const PARCJSONValue *value, PARCBufferComposer *composer, bool compact) { parcBufferComposer_PutChar(composer, '"'); while (parcBuffer_Remaining(value->value.string)) { uint8_t c = parcBuffer_GetUint8(value->value.string); if (c == '"') { parcBufferComposer_PutString(composer, "\\\""); } else if (c == '\b') { parcBufferComposer_PutString(composer, "\\b"); } else if (c == '\f') { parcBufferComposer_PutString(composer, "\\f"); } else if (c == '\n') { parcBufferComposer_PutString(composer, "\\n"); } else if (c == '\r') { parcBufferComposer_PutString(composer, "\\r"); } else if (c == '\t') { parcBufferComposer_PutString(composer, "\\t"); } else if ((c == '/') && !compact) { parcBufferComposer_PutString(composer, "\\/"); } else if (c == '\\') { parcBufferComposer_PutString(composer, "\\\\"); } else { parcBufferComposer_PutChar(composer, c); } } parcBuffer_Rewind(value->value.string); parcBufferComposer_PutChar(composer, '"'); return composer; }
PARCBufferComposer * ccnxPortalAnchor_Serialize(const CCNxPortalAnchor *namePrefix, PARCBufferComposer *composer) { PARCJSON *json = ccnxPortalAnchor_ToJSON(namePrefix); char *string = parcJSON_ToString(json); parcBufferComposer_PutString(composer, string); parcMemory_Deallocate(&string); parcJSON_Release(&json); return composer; }
PARCBufferComposer * parcJSONValue_BuildString(const PARCJSONValue *value, PARCBufferComposer *composer, bool compact) { parcJSONValue_OptionalAssertValid(value); if (value->type == PARCJSONValueType_Boolean) { parcBufferComposer_PutString(composer, value->value.boolean ? "true" : "false"); } else if (value->type == PARCJSONValueType_String) { _buildStringString(value, composer, compact); } else if (value->type == PARCJSONValueType_Number) { _buildStringNumber(value, composer); } else if (value->type == PARCJSONValueType_Array) { parcJSONArray_BuildString(value->value.array, composer, compact); } else if (value->type == PARCJSONValueType_JSON) { parcJSON_BuildString(value->value.object, composer, compact); } else if (value->type == PARCJSONValueType_Null) { parcBufferComposer_PutString(composer, "null"); } else { trapIllegalValue(value->type, "Unknown value type: %d", value->type); } return composer; }