mama_status avisBridgeMamaSubscription_create (subscriptionBridge* subscriber, const char* source, const char* symbol, mamaTransport transport, mamaQueue queue, mamaMsgCallbacks callback, mamaSubscription subscription, void* closure) { avisSubscription* impl = NULL; if (!subscriber || !subscription || !transport ) return MAMA_STATUS_NULL_ARG; impl = (avisSubscription*)calloc (1, sizeof(avisSubscription)); if (impl == NULL) return MAMA_STATUS_NOMEM; impl->mAvis = getAvis(transport); if (!impl->mAvis) return MAMA_STATUS_INVALID_ARG; if (source != NULL && source[0]) { impl->mSource = source; } else { impl->mSource = ""; } if (symbol != NULL && symbol[0]) { impl->mSymbol = symbol; snprintf (impl->mSubject, sizeof(impl->mSubject), "%s.%s", impl->mSource, impl->mSymbol); } else { impl->mSymbol = ""; snprintf (impl->mSubject, sizeof(impl->mSubject), "%s", impl->mSource ); } impl->mMamaCallback = callback; impl->mMamaSubscription = subscription; impl->mQueue = queue; impl->mTransport = transport; impl->mClosure = closure; impl->mIsNotMuted = 1; impl->mIsValid = 1; impl->mAvisSubscription = elvin_subscribe(impl->mAvis, makeAvisSubject(impl->mSubject)); if (impl->mAvisSubscription == NULL) return MAMA_STATUS_PLATFORM; elvin_subscription_add_listener(impl->mAvisSubscription, avis_callback, impl); mama_log (MAMA_LOG_LEVEL_FINER, "Made Avis subscription to: %s", impl->mSubject); *subscriber = (subscriptionBridge) impl; return MAMA_STATUS_OK; }
mama_status avisBridgeMamaSubscription_create (subscriptionBridge* subscriber, const char* source, const char* symbol, mamaTransport transport, mamaQueue queue, mamaMsgCallbacks callback, mamaSubscription subscription, void* closure) { avisSubscription* impl = NULL; avisTransportBridge* avisTransport = NULL; if (!subscriber || !subscription || !transport ) return MAMA_STATUS_NULL_ARG; impl = (avisSubscription*)calloc (1, sizeof(avisSubscription)); if (impl == NULL) return MAMA_STATUS_NOMEM; impl->mAvis = getAvis(transport); if (!impl->mAvis) return MAMA_STATUS_INVALID_ARG; mamaTransport_getBridgeTransport ( transport, (void*) &avisTransport); if (!avisTransport) return MAMA_STATUS_INVALID_ARG; /* Use a standard centralized method to determine a topic key */ avisBridgeMamaSubscriptionImpl_generateSubjectKey (NULL, source, symbol, &impl->mSubject); impl->mMamaCallback = callback; impl->mMamaSubscription = subscription; impl->mQueue = queue; impl->mTransport = transport; impl->mClosure = closure; impl->mIsNotMuted = 1; impl->mIsValid = 1; impl->mAvisSubscription = NULL; wsem_init(&impl->mCreateDestroySem, 0, 0); *subscriber = (subscriptionBridge) impl; if (avisTransportBridge_isDispatching (avisTransport)) { elvin_invoke (impl->mAvis, &subscribeAvis, impl); wsem_wait (&impl->mCreateDestroySem); } else { subscribeAvis (impl->mAvis, impl); } return MAMA_STATUS_OK; }