void d_readerListenerInitDataReader( d_readerListener listener, d_subscriber subscriber, const c_char* name, v_reliabilityKind reliability, v_historyQosKind historyKind, c_long historyDepth) { v_readerQos readerQos; u_subscriber s; d_networkAddress unaddressed, myAddr; d_admin admin; c_char *query; q_expr expr; assert(d_objectIsValid(d_object(listener), D_LISTENER)); if(listener && subscriber){ readerQos = d_readerQosNew(V_DURABILITY_VOLATILE, reliability); readerQos->history.kind = historyKind; readerQos->history.depth = historyDepth; readerQos->lifecycle.autopurge_nowriter_samples_delay.seconds = 60; readerQos->lifecycle.autopurge_nowriter_samples_delay.nanoseconds = 0; readerQos->lifecycle.autopurge_disposed_samples_delay.seconds = 10; readerQos->lifecycle.autopurge_disposed_samples_delay.nanoseconds = 0; s = d_subscriberGetSubscriber(subscriber); admin = d_subscriberGetAdmin(subscriber); myAddr = d_adminGetMyAddress(admin); unaddressed = d_networkAddressUnaddressed(); /* * Message is: * - meant for me or * - meant for all and not sent by me */ #define FILTER_EXPRESSION "select * from %s where " \ "parentMsg.addressee.systemId=%u OR " \ "parentMsg.addressee.systemId=%u AND " \ "parentMsg.senderAddress.systemId!=%u" query = (c_char*)(os_malloc(strlen(listener->name) + strlen(FILTER_EXPRESSION) + 32)); os_sprintf(query, FILTER_EXPRESSION, listener->name, myAddr->systemId, unaddressed->systemId, myAddr->systemId); expr = q_parse(query); listener->dataReader = u_dataReaderNew (s, name, expr, NULL, readerQos, TRUE); q_dispose(expr); os_free(query); #undef FILTER_EXPRESSION d_networkAddressFree(myAddr); d_networkAddressFree(unaddressed); d_readerQosFree(readerQos); } }
void d_nameSpacesRequestListenerReportNameSpaces( d_nameSpacesRequestListener listener) { c_long count, i; d_networkAddress addr; d_nameSpaces ns; d_admin admin; d_publisher publisher; c_iter nameSpaces; assert(d_listenerIsValid(d_listener(listener), D_NAMESPACES_REQ_LISTENER)); if(listener){ addr = d_networkAddressUnaddressed(); admin = d_listenerGetAdmin(d_listener(listener)); assert (admin); publisher = d_adminGetPublisher(admin); /* Get list of namespaces */ nameSpaces = updateNameSpaces(listener); count = c_iterLength(nameSpaces); for(i=0; i<count; i++){ ns = d_nameSpaces(c_iterObject(nameSpaces, i)); d_messageInit(d_message(ns), admin); d_messageSetAddressee(d_message(ns), addr); d_publisherNameSpacesWrite(publisher, ns, addr); } d_networkAddressFree(addr); /* Free namespace list */ cleanNameSpaces (nameSpaces); } return; }
d_nameSpaces d_nameSpacesNew( d_admin admin, d_nameSpace nameSpace, d_quality initialQuality, c_ulong total) { d_nameSpaces ns = NULL; d_networkAddress master; d_mergeState state; c_sequence *mergedStatesPtr; struct nsWalkHelper helper; if(nameSpace){ ns = d_nameSpaces(os_malloc(C_SIZEOF(d_nameSpaces))); if(ns){ master = d_networkAddressUnaddressed(); d_messageInit(d_message(ns), admin); ns->aligner = d_nameSpaceIsAligner(nameSpace); ns->durabilityKind = d_nameSpaceGetDurabilityKind(nameSpace); ns->alignmentKind = d_nameSpaceGetAlignmentKind(nameSpace); ns->partitions = d_nameSpaceGetPartitionTopics(nameSpace); ns->total = total; ns->initialQuality.seconds = initialQuality.seconds; ns->initialQuality.nanoseconds = initialQuality.nanoseconds; ns->master.systemId = master->systemId; ns->master.localId = master->localId; ns->master.lifecycleId = master->lifecycleId; ns->isComplete = TRUE; ns->name = os_strdup (d_nameSpaceGetName(nameSpace)); ns->masterConfirmed = d_nameSpaceIsMasterConfirmed(nameSpace); state = d_nameSpaceGetMergeState(nameSpace, NULL); if(state) { ns->state.role = os_strdup(state->role); ns->state.value = state->value; d_mergeStateFree(state); } else { ns->state.role = d_nameSpaceGetRole(nameSpace); ns->state.value = -1; } ns->mergedStatesCount = d_tableSize(nameSpace->mergedRoleStates); if(ns->mergedStatesCount > 0){ ns->mergedStates = os_malloc(C_SIZEOF(d_mergeState)*ns->mergedStatesCount); helper.states = (d_mergeState*)(mergedStatesPtr = &(ns->mergedStates)); helper.index = 0; d_tableWalk(nameSpace->mergedRoleStates, addMergeState, &helper); } else { ns->mergedStates = NULL; } d_networkAddressFree(master); } } return ns; }