ClRcT clMsgClientsTrackCallbackServer_4_0_0(ClEoDataT eoData, ClBufferHandleT inMsgHdl, ClBufferHandleT outMsgHdl) { ClIdlContextInfoT *pIdlCtxInfo = NULL; ClRcT rc = CL_OK; ClHandleT clientHandle; ClNameT pGroupName; SaMsgQueueGroupNotificationBufferT_4_0_0 pNotification; memset(&(clientHandle), 0, sizeof(ClHandleT)); memset(&(pGroupName), 0, sizeof(ClNameT)); memset(&(pNotification), 0, sizeof(SaMsgQueueGroupNotificationBufferT_4_0_0)); rc = clXdrUnmarshallClHandleT( inMsgHdl,&(clientHandle)); if (CL_OK != rc) { goto LL0; } rc = clXdrUnmarshallClNameT( inMsgHdl,&(pGroupName)); if (CL_OK != rc) { goto LL1; } rc = clXdrUnmarshallSaMsgQueueGroupNotificationBufferT_4_0_0( inMsgHdl,&(pNotification)); if (CL_OK != rc) { goto LL2; } pIdlCtxInfo = (ClIdlContextInfoT *)clHeapAllocate(sizeof(ClIdlContextInfoT)); if(pIdlCtxInfo == NULL) { return CL_IDL_RC(CL_ERR_NO_MEMORY); } memset(pIdlCtxInfo, 0, sizeof(ClIdlContextInfoT)); pIdlCtxInfo->idlDeferMsg = outMsgHdl; pIdlCtxInfo->inProgress = CL_FALSE; rc = clIdlSyncPrivateInfoSet(msgCltidlSyncKey, (void *)pIdlCtxInfo); if (CL_OK != rc) { clHeapFree(pIdlCtxInfo); goto L0; } rc = clMsgClientsTrackCallback_4_0_0(clientHandle, &(pGroupName), &(pNotification)); if(pIdlCtxInfo->inProgress == CL_FALSE) { clHeapFree(pIdlCtxInfo); pIdlCtxInfo = NULL; } if (CL_OK != rc) { goto L0; } rc = clXdrMarshallClHandleT(&(clientHandle), 0, 1); if (CL_OK != rc) { goto L1; } rc = clXdrMarshallClNameT(&(pGroupName), 0, 1); if (CL_OK != rc) { goto L2; } rc = clXdrMarshallSaMsgQueueGroupNotificationBufferT_4_0_0(&(pNotification), 0, 1); if (CL_OK != rc) { goto L3; } if(pIdlCtxInfo != NULL) { clHeapFree(pIdlCtxInfo); return rc; } L3: return rc; LL2: clXdrMarshallSaMsgQueueGroupNotificationBufferT_4_0_0(&(pNotification), 0, 1); LL1: clXdrMarshallClNameT(&(pGroupName), 0, 1); LL0: clXdrMarshallClHandleT(&(clientHandle), 0, 1); return rc; L0: clXdrMarshallClHandleT(&(clientHandle), 0, 1); L1: clXdrMarshallClNameT(&(pGroupName), 0, 1); L2: clXdrMarshallSaMsgQueueGroupNotificationBufferT_4_0_0(&(pNotification), 0, 1); return rc; }
ClRcT clMsgClientsTrackCallbackClientAsync_4_0_0(CL_IN ClIdlHandleT handle, CL_IN ClHandleT clientHandle, CL_IN SaNameT* pGroupName, CL_IN SaMsgQueueGroupNotificationBufferT_4_0_0* pNotification,CL_IN MsgCltClMsgClientsTrackCallbackAsyncCallbackT_4_0_0 fpAsyncCallback, CL_IN void *cookie) { ClRcT rc = CL_OK; ClVersionT funcVer = {4, 0, 0}; ClUint32T funcNo = CL_EO_GET_FULL_FN_NUM(CL_MSG_CLIENT_TABLE_ID, 0); ClBufferHandleT inMsgHdl = 0; ClBufferHandleT outMsgHdl = 0; ClIocAddressT address = {{0}}; ClIdlHandleObjT* pHandleObj = NULL; ClRmdAsyncOptionsT asyncOptions; ClUint32T tempFlags = 0; ClIdlCookieT* pCookie = NULL; rc = clHandleCheckout(gIdlClnt.idlDbHdl,handle,(void **)&pHandleObj); if(rc != CL_OK) { return rc; } if (CL_IDL_ADDRESSTYPE_IOC == pHandleObj->address.addressType) { address = pHandleObj->address.address.iocAddress; } else if (CL_IDL_ADDRESSTYPE_NAME == pHandleObj->address.addressType) { rc = clNameToObjectReferenceGet(&(pHandleObj->address.address.nameAddress.name), pHandleObj->address.address.nameAddress.attrCount, pHandleObj->address.address.nameAddress.attr, pHandleObj->address.address.nameAddress.contextCookie, (ClUint64T*)&address); if (CL_OK != rc) { goto L; } } else { rc = CL_IDL_RC(CL_ERR_INVALID_PARAMETER); goto L; } rc = clBufferCreate(&inMsgHdl); if (CL_OK != rc) { goto L; } rc = clXdrMarshallClHandleT(&(clientHandle), inMsgHdl, 0); if (CL_OK != rc) { goto L; } rc = clXdrMarshallSaNameT(pGroupName, inMsgHdl, 0); if (CL_OK != rc) { goto L; } rc = clXdrMarshallSaMsgQueueGroupNotificationBufferT_4_0_0(pNotification, inMsgHdl, 0); if (CL_OK != rc) { goto L; } if(fpAsyncCallback != NULL) { pCookie = (ClIdlCookieT*) clHeapAllocate(sizeof(ClIdlCookieT)); if (NULL == pCookie) { return CL_IDL_RC(CL_ERR_NO_MEMORY); } asyncOptions.pCookie = NULL; asyncOptions.fpCallback = NULL; rc = clBufferCreate(&outMsgHdl); if (CL_OK != rc) { goto L2; } tempFlags |= pHandleObj->flags | (CL_RMD_CALL_ASYNC | CL_RMD_CALL_NON_PERSISTENT | CL_RMD_CALL_NEED_REPLY); pCookie->pCookie = cookie; pCookie->actualCallback = (void(*)())fpAsyncCallback; pCookie->handle = handle; asyncOptions.pCookie = pCookie; asyncOptions.fpCallback = clMsgClientsTrackCallbackAsyncCallback_4_0_0; rc = clRmdWithMsgVer(address, &funcVer, funcNo, inMsgHdl, outMsgHdl, tempFlags, &(pHandleObj->options), &asyncOptions); if (CL_OK != rc) { goto LL; } } else { tempFlags |= pHandleObj->flags | (CL_RMD_CALL_ASYNC | CL_RMD_CALL_NON_PERSISTENT); rc = clRmdWithMsgVer(address, &funcVer, funcNo, inMsgHdl, 0, tempFlags, &(pHandleObj->options),NULL); if(CL_OK != rc) { goto L; } } clHandleCheckin(gIdlClnt.idlDbHdl,handle); return rc; LL: clBufferDelete(&outMsgHdl); L2: clHeapFree(pCookie); L: clHandleCheckin(gIdlClnt.idlDbHdl,handle); return rc; }