RsslRet decodeSourceDirectoryUpdate(RsslSourceDirectoryResponseInfo* srcDirRespInfo, RsslDecodeIterator* dIter, RsslUInt32 maxServices, RsslUInt32 maxCapabilities, RsslUInt32 maxQOS, RsslUInt32 maxDictionaries, RsslUInt32 maxLinks ) { RsslRet ret = 0; RsslMap map; RsslMapEntry mEntry; RsslFilterList rsslFilterList; RsslFilterEntry filterListItem; int i; RsslSourceDirectoryResponseInfo* selResponseInfo ; RsslUInt64 serviceIdTemp; if ((ret = rsslDecodeMap(dIter, &map)) < RSSL_RET_SUCCESS) { printf("rsslDecodeMap() failed with return code: %d\n", ret); return ret; } /* source directory response key data type must be RSSL_DT_UINT */ if (map.keyPrimitiveType != RSSL_DT_UINT) { printf("Map has incorrect keyPrimitiveType: %s", rsslDataTypeToString(map.keyPrimitiveType)); return RSSL_RET_FAILURE; } /* decode map entries */ /* service id is contained in map entry encKey */ /* store service id in source directory response information */ while ((ret = rsslDecodeMapEntry(dIter, &mEntry, &serviceIdTemp)) != RSSL_RET_END_OF_CONTAINER) { selResponseInfo = 0; if (ret == RSSL_RET_SUCCESS) { if (ret != RSSL_RET_SUCCESS && ret != RSSL_RET_BLANK_DATA) { printf("rsslDecodeUInt() failed with return code: %d\n", ret); return ret; } //find service for (i = 0; i < MAX_SOURCE_DIRECTORY_SERVICES; i++) { if (strlen(srcDirRespInfo[i].ServiceGeneralInfo.ServiceName)) { if (srcDirRespInfo[i].ServiceId == serviceIdTemp) { selResponseInfo = &srcDirRespInfo[i]; } } } if (selResponseInfo == 0) { printf("Service not found, add a new service\n"); //Find blank service info for (i = 0; i < MAX_SOURCE_DIRECTORY_SERVICES; i++) { if (strlen(srcDirRespInfo[i].ServiceGeneralInfo.ServiceName)==0) { selResponseInfo = &srcDirRespInfo[i]; break; } } } /* decode filter list */ if ((ret = rsslDecodeFilterList(dIter, &rsslFilterList)) < RSSL_RET_SUCCESS) { printf("rsslDecodeFilterList() failed with return code: %d\n", ret); return ret; } /* decode filter list items */ while ((ret = rsslDecodeFilterEntry(dIter, &filterListItem)) != RSSL_RET_END_OF_CONTAINER) { if (ret == RSSL_RET_SUCCESS) { /* decode source directory response information */ switch (filterListItem.id) { case RDM_DIRECTORY_SERVICE_INFO_ID: if ((ret = decodeServiceGeneralInfo(&selResponseInfo->ServiceGeneralInfo, dIter, maxCapabilities, maxQOS, maxDictionaries)) != RSSL_RET_SUCCESS) { printf("decodeServiceGeneralInfo() failed with return code: %d\n", ret); return ret; } break; case RDM_DIRECTORY_SERVICE_STATE_ID: if ((ret = decodeServiceStateInfo(&selResponseInfo->ServiceStateInfo, dIter)) != RSSL_RET_SUCCESS) { printf("decodeServiceStateInfo() failed with return code: %d\n", ret); return ret; } break; case RDM_DIRECTORY_SERVICE_GROUP_ID: if ((ret = decodeServiceGroupInfo(&selResponseInfo->ServiceGroupInfo, dIter)) != RSSL_RET_SUCCESS) { printf("decodeServiceGroupInfo() failed with return code: %d\n", ret); return ret; } break; case RDM_DIRECTORY_SERVICE_LOAD_ID: if ((ret = decodeServiceLoadInfo(&selResponseInfo->ServiceLoadInfo, dIter)) != RSSL_RET_SUCCESS) { printf("decodeServiceLoadInfo() failed with return code: %d\n", ret); return ret; } break; case RDM_DIRECTORY_SERVICE_DATA_ID: if ((ret = decodeServiceDataInfo(&selResponseInfo->ServiceDataInfo, dIter)) != RSSL_RET_SUCCESS) { printf("decodeServiceDataInfo() failed with return code: %d\n", ret); return ret; } break; case RDM_DIRECTORY_SERVICE_LINK_ID: if ((ret = decodeServiceLinkInfo(&selResponseInfo->ServiceLinkInfo[0], dIter, maxLinks)) != RSSL_RET_SUCCESS) { printf("decodeServiceLinkInfo() failed with return code: %d\n", ret); return ret; } break; default: printf("Unkonwn FilterListEntry filterID: %d\n", filterListItem.id); return RSSL_RET_FAILURE; } } } } } return RSSL_RET_SUCCESS; }