static qp_result prepareQosSample( const char *qosName, qp_entityAttr attr, qp_parseContext ctx) { qp_result result; const c_type qosSampleType = attr->qosSampleType; assert(qosSampleType); assert(qosName); assert(ctx); ctx->scope = QP_SCOPE_QOSPOLICY; ctx->qosSample = c_new(qosSampleType); if (ctx->qosSample == NULL){ result = QP_RESULT_OUT_OF_MEMORY; goto err_new_qosSample; } c_cloneIn(qosSampleType, attr->defaultQosTmplt, &ctx->qosSample); ctx->currentField = c_fieldNew(qosSampleType, qosName); if (ctx->currentField == NULL){ result = QP_RESULT_OUT_OF_MEMORY; goto err_fieldNew; } ctx->currentFieldType = c_fieldType(ctx->currentField); assert(ctx->currentFieldType); ctx->qosTable = attr->qosTable; return QP_RESULT_OK; /* Error handling */ err_fieldNew: c_free(ctx->qosSample); ctx->qosSample = NULL; err_new_qosSample: return result; }
static c_array createKeyList( c_type instanceType, c_array keyList) { c_ulong size, i; c_array newKeyList = NULL; assert(instanceType); if (keyList) { size = c_arraySize(keyList); newKeyList = c_arrayNew(c_field_t(c_getBase(instanceType)), size); if (newKeyList) { for(i = 0; i<size; i++){ c_field f = c_fieldNew(instanceType, PREFIX); assert(f); if (f) { newKeyList[i] = c_fieldConcat(f, keyList[i]); c_free(f); } else { OS_REPORT(OS_CRITICAL, "createKeyList", V_RESULT_INTERNAL_ERROR, "Could not create c_field"); } } } else { OS_REPORT(OS_FATAL, "createKeyList", V_RESULT_INTERNAL_ERROR, "Could not create array"); } } return newKeyList; }
static c_bool createMessageKeyList( c_type messageType, const c_char *topicKeyExpr, c_array *keyListRef) { c_array keyList; c_type fieldType; c_field field; c_iter splitNames, newNames; c_char *name, *newName; c_long i,length,sres; assert(keyListRef != NULL); *keyListRef = NULL; if (topicKeyExpr == NULL) { return TRUE; } newNames = NULL; splitNames = c_splitString(topicKeyExpr,", \t"); while ((name = c_iterTakeFirst(splitNames)) != NULL) { #define PATH_SEPARATOR "." #define PREFIX "userData" length = strlen(PREFIX) + sizeof(PATH_SEPARATOR) + strlen(name); newName = (char *)os_malloc(length); sres = snprintf(newName,length,"%s"PATH_SEPARATOR"%s",PREFIX, name); assert(sres == (length-1)); #undef PREFIX #undef PATH_SEPARATOR os_free(name); newNames = c_iterAppend(newNames,newName); } c_iterFree(splitNames); length = c_iterLength(newNames); if (length == 0) { return TRUE; } fieldType = c_field_t(c_getBase(messageType)); keyList = c_arrayNew(fieldType,length); c_free(fieldType); i=0; while ((name = c_iterTakeFirst(newNames)) != NULL) { field = c_fieldNew(messageType,name); if (field == NULL) { OS_REPORT_1(OS_API_INFO, "create message key list failed", 21, "specified key field name %s not found", name); os_free(name); c_iterFree(newNames); c_free(keyList); return FALSE; } keyList[i++] = field; os_free(name); } c_iterFree(newNames); *keyListRef = keyList; return TRUE; }