jni_topic jni_lookupTopic( jni_participant p, const char* name) { c_iter topics; jni_topic topic, temp; int found; topic = NULL; if((name != NULL) && (p != NULL)){ topics = c_iterCopy(p->topics); found = 0; temp = jni_topic(c_iterTakeFirst(topics)); while( (temp != NULL) && (!found)){ if(strcmp(jni_topicDescription(temp)->name, name) == 0){ topic = temp; found = 1; } temp = jni_topic(c_iterTakeFirst(topics)); } c_iterFree(topics); } return topic; }
jni_topic jni_topicNew( jni_participant p, const char* name, const char* typeName, const char* keyList, v_topicQos qos) { jni_topic topic; assert(name); assert(typeName); if((p == NULL) || (p->uparticipant == NULL)){ goto err_badParam; } if((topic = os_malloc(sizeof *topic)) == NULL){ goto err_mallocTopic; } jni_topicDescription(topic)->participant = p; if((topic->utopic = u_topicNew(p->uparticipant, name, typeName, keyList, qos)) == NULL){ goto err_u_topicNew; } if((jni_topicDescription(topic)->name = os_strdup(name)) == NULL){ goto err_strdupName; } if((jni_topicDescription(topic)->typeName = os_strdup(typeName)) == NULL){ goto err_strdupTypeName; } if(keyList){ if((jni_topicDescription(topic)->keyList = os_strdup(keyList)) == NULL){ goto err_strdupKeyList; } } else { jni_topicDescription(topic)->keyList = NULL; } return topic; /* Error handling */ err_strdupKeyList: os_free(jni_topicDescription(topic)->typeName); err_strdupTypeName: os_free(jni_topicDescription(topic)->name); err_strdupName: /* Ignore return value since we are already in an error condition. */ (void) u_topicFree(topic->utopic); err_u_topicNew: os_free(topic); err_mallocTopic: err_badParam: return NULL; }
jni_result jni_topicFree( jni_topic topic) { jni_result r; if(topic != NULL){ r = jni_convertResult(u_topicFree(topic->utopic)); os_free(jni_topicDescription(topic)->name); os_free(jni_topicDescription(topic)->typeName); if(jni_topicDescription(topic)->keyList != NULL){ os_free(jni_topicDescription(topic)->keyList); } os_free(topic); } else{ r = JNI_RESULT_BAD_PARAMETER; } return r; }
jni_result jni_deleteTopic( jni_participant p, jni_topic top) { jni_result r; c_bool found; if((top == NULL) || (p == NULL)){ r = JNI_RESULT_BAD_PARAMETER; } else if(p->topics == NULL){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else if( (jni_topicDescription(top)->participant) != p ){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else if(!(jni_participantMayTopicBeDeleted(p, jni_topicDescription(top)->name))){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else{ found = c_iterContains(p->topics, top); if(!found){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else{ r = jni_topicFree(top); if(r == JNI_RESULT_OK){ c_iterTake(p->topics, top); } } } return r; }