/* * Processes a response from a channel. This consists of * performing a high level decode of the message and then * calling the applicable specific function for further * processing. * chnl - The channel of the response * buffer - The message buffer containing the response */ static RsslRet processResponse(RsslChannel* chnl, RsslBuffer* buffer) { RsslRet ret = 0; RsslMsg msg = RSSL_INIT_MSG; RsslDecodeIterator dIter; RsslLoginResponseInfo *loginRespInfo = NULL; /* clear decode iterator */ rsslClearDecodeIterator(&dIter); /* set version info */ rsslSetDecodeIteratorRWFVersion(&dIter, chnl->majorVersion, chnl->minorVersion); if((ret = rsslSetDecodeIteratorBuffer(&dIter, buffer)) != RSSL_RET_SUCCESS) { printf("\nrsslSetDecodeIteratorBuffer() failed with return code: %d\n", ret); return RSSL_RET_FAILURE; } ret = rsslDecodeMsg(&dIter, &msg); if (ret != RSSL_RET_SUCCESS) { printf("\nrsslDecodeMsg(): Error %d on SessionData fd="SOCKET_PRINT_TYPE" Size %d \n", ret, chnl->socketId, buffer->length); return RSSL_RET_FAILURE; } switch ( msg.msgBase.domainType ) { case RSSL_DMT_LOGIN: if (processLoginResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) { if (isLoginStreamClosed()) { return RSSL_RET_FAILURE; } else if (isLoginStreamClosedRecoverable()) { recoverConnection(); } else if (isLoginStreamSuspect()) { loginRespInfo = getLoginResponseInfo(); /* if not single open provider, close source directory stream and item streams */ if (!loginRespInfo->SingleOpen) { if (closeSourceDirectoryStream(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; if (closeSymbolListStream(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; if (closeYieldCurveItemStreams(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; if (closeMarketPriceItemStreams(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; if (closeMarketByOrderItemStreams(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; if (closeMarketByPriceItemStreams(rsslConsumerChannel) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } isInLoginSuspectState = RSSL_TRUE; } } else { if (isInLoginSuspectState) { isInLoginSuspectState = RSSL_FALSE; } } break; case RSSL_DMT_SOURCE: if (processSourceDirectoryResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; /* if we have loaded the dictionaries, now that we have the directory, set up posting if its enabled */ if ((isFieldDictionaryLoaded() || isEnumTypeDictionaryLoaded()) && ((onPostEnabled || offPostEnabled) && !postInit)) { /* Initialize Post Processing after sending the login request message */ /* ensure that provider supports posting - if not, disable posting */ RsslLoginResponseInfo* loginInfo = getLoginResponseInfo(); if (loginInfo->SupportOMMPost == RSSL_TRUE) { /* This sets up our basic timing so post messages will be sent periodically */ initPostHandler(); /* posting has been initialized */ postInit = RSSL_TRUE; } else { /* provider does not support posting, disable it */ onPostEnabled = RSSL_FALSE; offPostEnabled = RSSL_FALSE; disableOnstreamPost(); disableOffstreamPost(); printf("\nConnected Provider does not support OMM Posting. Disabling Post functionality.\n"); } } break; case RSSL_DMT_DICTIONARY: if (processDictionaryResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; /* Now that we have downloaded dictionaries and directory set up posting if its enabled */ if ((onPostEnabled || offPostEnabled) && !postInit) { /* Initialize Post Processing after sending the login request message */ /* ensure that provider supports posting - if not, disable posting */ RsslLoginResponseInfo* loginInfo = getLoginResponseInfo(); if (loginInfo->SupportOMMPost == RSSL_TRUE) { /* This sets up our basic timing so post messages will be sent periodically */ initPostHandler(); /* posting has been initialized */ postInit = RSSL_TRUE; } else { /* provider does not support posting, disable it */ onPostEnabled = RSSL_FALSE; offPostEnabled = RSSL_FALSE; disableOnstreamPost(); disableOffstreamPost(); printf("\nConnected Provider does not support OMM Posting. Disabling Post functionality.\n"); } } break; case RSSL_DMT_MARKET_PRICE: if (!isInLoginSuspectState) { if (processMarketPriceResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } break; case RSSL_DMT_MARKET_BY_ORDER: if (!isInLoginSuspectState) { if (processMarketByOrderResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } break; case RSSL_DMT_MARKET_BY_PRICE: if (!isInLoginSuspectState) { if (processMarketByPriceResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } break; case RSSL_DMT_YIELD_CURVE: if(!isInLoginSuspectState) { if (processYieldCurveResponse(chnl, &msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } break; case RSSL_DMT_SYMBOL_LIST: if(!isInLoginSuspectState) { if (processSymbolListResponse(&msg, &dIter) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; } break; default: printf("Unhandled Domain Type: %d\n", msg.msgBase.domainType); break; } return RSSL_RET_SUCCESS; }
static RsslRet snapshotSessionProcessMessage(SnapshotSession *pSession, RsslBuffer *pBuffer) { RsslDecodeIterator decodeIter; RsslRet ret; RsslErrorInfo rsslErrorInfo; RsslMsg rsslMsg; char tempMem[1024]; RsslBuffer tempBuffer; Item *pItem; printf("<%s> Received message:\n", pSession->name); /* Decode the message header. */ rsslClearDecodeIterator(&decodeIter); rsslSetDecodeIteratorRWFVersion(&decodeIter, pSession->pRsslChannel->majorVersion, pSession->pRsslChannel->minorVersion); rsslSetDecodeIteratorBuffer(&decodeIter, pBuffer); if ((ret = rsslDecodeMsg(&decodeIter, &rsslMsg)) != RSSL_RET_SUCCESS) { printf("<%s> rsslDecodeMsg() failed: %d(%s).\n\n", pSession->name, ret, rsslRetCodeToString(ret)); return ret; } switch(rsslMsg.msgBase.domainType) { case RSSL_DMT_LOGIN: { /* Decode the message using the RDM package decoder utility. */ RsslRDMLoginMsg loginMsg; tempBuffer.data = tempMem; tempBuffer.length = sizeof(tempMem); if ((ret = rsslDecodeRDMLoginMsg(&decodeIter, &rsslMsg, &loginMsg, &tempBuffer, &rsslErrorInfo)) != RSSL_RET_SUCCESS) { printf( "<%s> rsslDecodeRDMLoginMsg() failed: %d (%s -- %s)\n" " at %s.\n\n", pSession->name, ret, rsslRetCodeToString(ret), rsslErrorInfo.rsslError.text, rsslErrorInfo.errorLocation); return ret; } switch(loginMsg.rdmMsgBase.rdmMsgType) { case RDM_LG_MT_REFRESH: printf("<%s> Received login refresh.\n\n", pSession->name, ret, rsslRetCodeToString(ret), rsslErrorInfo.rsslError.text); if (pSession->state == SNAPSHOT_STATE_LOGIN_REQUESTED) { if (snapshotSessionSendSymbolListRequest(pSession) != RSSL_RET_SUCCESS) return ret; } break; default: printf("<%s> Received unhandled RDM Login Message Type %d.\n\n", pSession->name, loginMsg.rdmMsgBase.rdmMsgType); return RSSL_RET_FAILURE; } return RSSL_RET_SUCCESS; } case RSSL_DMT_SYMBOL_LIST: { processSymbolListResponse(pSession, &rsslMsg, &decodeIter); if (rsslMsg.refreshMsg.flags & RSSL_RFMF_REFRESH_COMPLETE) { pSession->state = SNAPSHOT_STATE_SYMBOL_LIST_RECEIVED; } } break; default: { if ((pItem = itemListGetItemBySnapStreamID(&itemList, rsslMsg.msgBase.streamId, rsslMsg.msgBase.domainType)) == NULL) { printf("<%s> Received unhandled message with snapshot stream ID %d, and domain %d(%s).\n\n", pSession->name, rsslMsg.msgBase.streamId, rsslMsg.msgBase.domainType, rsslDomainTypeToString(rsslMsg.msgBase.domainType)); return RSSL_RET_SUCCESS; } return itemProcessMsg(pItem, &decodeIter, &rsslMsg, RSSL_TRUE); } } return RSSL_RET_SUCCESS; }