static ClRcT
clLogMasterFileDataPack(ClLogFileDataT   *pFileData,
                        ClBufferHandleT  hFileEntryBuf)
{
    ClRcT      rc      = CL_OK;
    ClUint32T  cntSize = 0;

    CL_LOG_DEBUG_TRACE(("Enter"));

    /*
     * Assuming: fileLocation and fileName in the Attributes are empty
     */
    rc = VDECL_VER(clXdrMarshallClLogStreamAttrIDLT, 4, 0, 0)(&(pFileData->streamAttr),
            hFileEntryBuf, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR((
                               "clXdrMarshallClLogStreamAttributesT(): rc[0x %x]", rc));
        return rc;
    }

    rc = clCntSizeGet(pFileData->hStreamTable, &cntSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntSizeGet(); rc[0x %x]", rc));
        return rc;
    }

    rc = clXdrMarshallClUint32T(&cntSize, hFileEntryBuf, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint32T(): rc[0x %x]", rc));
        return rc;
    }

    rc = clCntWalk(pFileData->hStreamTable, clLogMasterStreamEntryPack,
                   (ClCntArgHandleT) hFileEntryBuf, sizeof(hFileEntryBuf));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntWalk(): rc[0x %x]", rc));
        return rc;
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
static ClRcT
clLogSvrStreamInfoPack(ClLogSvrEoDataT     *pSvrEoEntry,
                       ClCntNodeHandleT    svrStreamNode,
                       ClBufferHandleT     msg)
{
    ClRcT                rc              = CL_OK;
    ClUint32T            size            = 0;
    ClLogStreamKeyT      *pStreamKey     = NULL;
    ClLogSvrStreamDataT  *pSvrStreamData = NULL;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clCntNodeUserDataGet(pSvrEoEntry->hSvrStreamTable, svrStreamNode,
                              (ClCntDataHandleT *)&pSvrStreamData);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntDataForNodeGet(): rc[0x %x]\n", rc));
        return rc;
    }
    rc = clCntNodeUserKeyGet(pSvrEoEntry->hSvrStreamTable, svrStreamNode,
                             (ClCntKeyHandleT *)&pStreamKey);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntNodeUserKeyGet(): rc[0x %x]\n", rc));
        return rc;
    }
    rc = clXdrMarshallSaNameT(&(pStreamKey->streamName), msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }
    rc = clXdrMarshallSaNameT(&(pStreamKey->streamScopeNode), msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }
    /*
     * Copy file name and file location keys to reconstruct back the fileowner address
     */
    clXdrMarshallClStringT(&pSvrStreamData->fileName, msg, 0);

    clXdrMarshallClStringT(&pSvrStreamData->fileLocation, msg, 0);

    rc = clCntSizeGet(pSvrStreamData->hComponentTable, &size);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntSizeGet(); rc[0x %x]", rc));
        return rc;
    }
    rc = clXdrMarshallClUint32T(&size, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint32T(): rc[0x %x]", rc));
        return rc;
    }
    rc = clCntWalk(pSvrStreamData->hComponentTable, clLogSvrCompTablePack,
                   &msg, sizeof(&msg));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntWalk(): rc[0x %x]", rc));
        return rc;
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
/**
 * API to un-register a service with transaction-agent
 */
ClRcT clTxnAgentServiceUnRegister(CL_IN ClTxnAgentServiceHandleT tHandle)
{
    ClRcT                       rc = CL_OK;
    ClUint8T                    twoPC = 0;
    ClTxnAgentCompServiceInfoT  *pCompService = NULL;


    CL_FUNC_ENTER();

    if (tHandle == 0x0)
    {
        CL_FUNC_EXIT();
        return CL_TXN_RC(CL_ERR_INVALID_HANDLE);
    }
    /*
       This is a request from service hosted in the component to unregister
       from the transaction-management.
       Remove the entry from the data-structure and invalidate the handle

       FIXME: Before actually deleting it, check to see if this service is 
              part of any active txn or not
    */

    rc = clCntDataForKeyGet(clTxnAgntCfg->compServiceMap, 
                            (ClCntKeyHandleT) &(((ClTxnAgentCompServiceInfoT *)tHandle)->serviceType),
                            (ClCntDataHandleT *)&pCompService);
    if (CL_OK == rc)
    {
        ClUint32T   srvCount;
        if (pCompService->serviceCapability == CL_TXN_AGENT_SERVICE_1PC)
        {
            twoPC = 0;
            clTxnAgntCfg->agentCapability &= ~(CL_TXN_AGENT_SERVICE_1PC);
        }
        else if(pCompService->serviceCapability == CL_TXN_AGENT_SERVICE_2PC)
        {
            twoPC = 1;
        }

        rc = clCntAllNodesForKeyDelete(clTxnAgntCfg->compServiceMap,
                                      (ClCntKeyHandleT) &(((ClTxnAgentCompServiceInfoT *)tHandle)->serviceType));
        if(CL_OK != rc)
        {
            clLogError("AGT", NULL,
                    "Failed to delete node from compServiceMap corresponding to service[%d]", 
                    ((ClTxnAgentCompServiceInfoT *)tHandle)->serviceType);
            return rc;
        }
                                        
        /* Reset agent capability, if necessary */
        rc = clCntSizeGet(clTxnAgntCfg->compServiceMap, &srvCount);
        if ( (CL_OK == rc) && (srvCount == 0x0) )
        {
            clTxnAgntCfg->agentCapability = CL_TXN_AGENT_NO_SERVICE_REGD;
        } 
        else if ( (CL_OK == rc) && (srvCount == 0x1) && 
                  ( (clTxnAgntCfg->agentCapability & CL_TXN_AGENT_SERVICE_1PC) == CL_TXN_AGENT_SERVICE_1PC) )
        {
            clTxnAgntCfg->agentCapability = CL_TXN_AGENT_SERVICE_1PC;
        }
        else if ( CL_OK != rc )
        {
            CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Error while reading number of service registered. rc:0x%x", rc));
        }
    }
    if(CL_OK == rc)
        clLogNotice("AGT", "FIN",
                "Unregistering [%s] service successfull", twoPC ? "2PC":"READ"); 
    CL_TXN_RETURN_RC(rc, ("Failed to unregister component-service rc:0x%x\n", rc));
}
ClRcT
clLogStreamOwnerEntryPack(SaNameT                *pStreamName,
                          SaNameT                *pStreamScopeNode,
                          ClLogStreamOwnerDataT  *pStreamOwnerData,
                          ClBufferHandleT        msg)
{
    ClRcT                  rc              = CL_OK;
    ClLogStreamOwnerDataIDLT  soData = {0};
    ClUint32T                 size   = 0;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clXdrMarshallSaNameT(pStreamName, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }    
    rc = clXdrMarshallSaNameT(pStreamScopeNode, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }    
    soData.streamId        = pStreamOwnerData->streamId;
    soData.streamMcastAddr = pStreamOwnerData->streamMcastAddr;
    soData.dsId            = pStreamOwnerData->dsId;
    soData.isNewStream     = pStreamOwnerData->isNewStream;
    soData.openCnt         = pStreamOwnerData->openCnt;
    soData.ackerCnt        = pStreamOwnerData->ackerCnt;
    soData.nonAckerCnt     = pStreamOwnerData->nonAckerCnt;

    clLogStreamAttributesCopy(&pStreamOwnerData->streamAttr, 
                              &soData.streamAttr, CL_TRUE);
    rc = VDECL_VER(clXdrMarshallClLogStreamOwnerDataIDLT, 4, 0, 0)(&soData, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        clHeapFree(soData.streamAttr.fileName.pValue);
        clHeapFree(soData.streamAttr.fileLocation.pValue);
        return rc;
    }    
    rc = clLogStreamOwnerFilterInfoPack(pStreamOwnerData, msg);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        clHeapFree(soData.streamAttr.fileName.pValue);
        clHeapFree(soData.streamAttr.fileLocation.pValue);
        return rc;
    }
    rc = clCntSizeGet(pStreamOwnerData->hCompTable, &size);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntSizeGet(); rc[0x %x]", rc));
        clHeapFree(soData.streamAttr.fileName.pValue);
        clHeapFree(soData.streamAttr.fileLocation.pValue);
        return rc;
    }    
    rc = clXdrMarshallClUint32T(&size, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint32T(): rc[0x %x]", rc));
        clHeapFree(soData.streamAttr.fileName.pValue);
        clHeapFree(soData.streamAttr.fileLocation.pValue);
        return rc;
    }    
    rc = clCntWalk(pStreamOwnerData->hCompTable, clLogCompTablePack,
                   (ClCntArgHandleT) msg, sizeof(msg));

    clHeapFree(soData.streamAttr.fileName.pValue);
    clHeapFree(soData.streamAttr.fileLocation.pValue);
        
    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}