mamaSubscriptionType MamaSubscription::getSubscriptionType (void)
 {
     mamaSubscriptionType type;
     mamaTry (mamaSubscription_getSubscriptionType (mSubscription,
                                                    &type));
     return type;
 }
Exemple #2
0
mama_status
dqStrategy_sendRecapRequest (dqStrategyImpl* strategy, mamaMsg srcMsg, mamaDqContext* ctx)
{
    mamaMsg     msg     = NULL;
    const char* symbol  = NULL;
    double      timeout = 0.0;
    int         retries = 0;
    wombat_subscriptionRecapCB onRecap = NULL;
    mamaSubscriptionType subscType;

    ctx->mDQState       = DQ_STATE_WAITING_FOR_RECAP;
    
    mamaSubscription_getSubscriptionType (self->mSubscription, &subscType);
    
    /*TODO Put wildcard subscriptions here also if we ever support them*/
    if (subscType == MAMA_SUBSC_TYPE_GROUP)
    {
        /*If this is a group subscription we must get the issue symbol
         from the message and not the subscription as we must recap on the 
         item symbol and not the group symbol*/
        msgUtils_getIssueSymbol (srcMsg, &symbol); 
    }
    else
    {
        /*Needed as not all updates will contain the issue symbol.
         e.g. book updates*/
        mamaSubscription_getSubscSymbol (self->mSubscription,&symbol);
    }

    mamaSubscription_getRecapTimeout (self->mSubscription, &timeout);
    mamaSubscription_getRetries (self->mSubscription, &retries);

    /* Send a request to the publisher to resend. */
    msgUtils_createRecoveryRequestMsg (self->mSubscription, DQ_UNKNOWN, &msg, symbol);

    if (subscType == MAMA_SUBSC_TYPE_GROUP)
    {
        mamaMsg_updateI32 (msg,
                           MamaFieldSubscriptionType.mName,
                           MamaFieldSubscriptionType.mFid,
                           MAMA_SUBSC_TYPE_NORMAL);

        mamaMsg_updateI32 (msg,
                           MamaFieldSubscMsgType.mName,
                           MamaFieldSubscMsgType.mFid,
                           MAMA_SUBSC_DQ_GROUP_SUBSCRIBER);
    }

    /* We want this throttled*/
    imageRequest_sendRequest (ctx->mRecapRequest,
                              msg, 
                              timeout, 
                              retries,
                              1,/*throttle the request*/
                              1); /*Is a recap request*/

    if ((onRecap = (mamaSubscription_getUserCallbacks (
                                    self->mSubscription)->onRecapRequest)))
    { 
        void* closure = NULL;
        mamaSubscription_getClosure (self->mSubscription, &closure);
        onRecap (self->mSubscription, closure); 
    }
    
    return MAMA_STATUS_OK;
}
mama_status
msgUtils_createSubscriptionMessage(
    mamaSubscription  subscription,
    mamaSubscMsgType  subscMsgType,
    mamaMsg*          msg,
    const char*       issueSymbol)
{
    uint8_t appDataType = 0;
    char*   ipaddr;

    mama_status status = mamaMsg_create (msg);
    if (status != MAMA_STATUS_OK)
    {
        return status;
    }

    if (subscription != NULL)
    {
        mamaBridgeImpl* bridge = mamaSubscription_getBridgeImpl (subscription);
        const char* source = NULL;
        const char* symbol = NULL;
        mamaSubscriptionType type = MAMA_SUBSC_TYPE_NORMAL;

        mamaMsgImpl_useBridgePayload    (*msg, bridge);

        mamaSubscription_getSource      (subscription, &source);

        /* For group subs the issue symbol needs to be passed in as it
           is not the same as the subscribe symbol */
        if (issueSymbol)
        {
            symbol = issueSymbol;
        }
        else
        {
            mamaSubscription_getSubscSymbol (subscription, &symbol);
        }

        mamaSubscription_getSubscriptionType (subscription, &type);
        mamaSubscription_getAppDataType      (subscription, &appDataType);

        status = mamaMsgImpl_setSubscInfo (
            *msg,
            mamaSubscription_getSubscRoot (subscription),
            source,
            symbol,
            1);
        if (status != MAMA_STATUS_OK)
            return status;


        status = mamaMsg_addI32 (
            *msg,
            MamaFieldSubscriptionType.mName,
            MamaFieldSubscriptionType.mFid,
            type);
        if (status != MAMA_STATUS_OK)
            return status;
    }

    status = mamaMsg_addI32 (
        *msg,
        MamaFieldSubscMsgType.mName,
        MamaFieldSubscMsgType.mFid,
        subscMsgType);
    if (status != MAMA_STATUS_OK)
    {
        return status;
    }

    status = mamaMsg_addU8 (
        *msg,
        MamaFieldAppDataType.mName,
        MamaFieldAppDataType.mFid,
        appDataType);
    if (status != MAMA_STATUS_OK)
    {
        return status;
    }

#ifndef IGNORE_DEPRECATED_FIELDS
    status = mamaMsg_addI32 (
        *msg,
        MamaFieldSubscMsgTypeOld.mName,
        MamaFieldSubscMsgTypeOld.mFid,
        subscMsgType);
    if (status != MAMA_STATUS_OK)
        return status;
#endif

    mama_getIpAddress ((const char**)&ipaddr);

    if (ipaddr != NULL && strlen( ipaddr ) > 0)
    {
        status = mamaMsg_addString (
            *msg,
            MamaFieldSubscSourceHost.mName,
            MamaFieldSubscSourceHost.mFid,
            ipaddr);
        if (status != MAMA_STATUS_OK)
            return status;
    }

    return MAMA_STATUS_OK;
}