1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#include "XnLinkOutputStream.h"
#include "XnLinkMsgEncoder.h"
#include "XnLinkOutputDataEndpoint.h"
#include <XnLog.h>
namespace xn
{
LinkOutputStream::LinkOutputStream()
{
m_bInitialized = FALSE;
m_nStreamID = XN_LINK_STREAM_ID_INVALID;
m_compression = XN_LINK_COMPRESSION_NONE;
m_pLinkMsgEncoder = NULL;
m_pOutputDataEndpoint = NULL;
m_nPacketID = 0;
}
LinkOutputStream::~LinkOutputStream()
{
}
XnStatus LinkOutputStream::Init(XnUInt16 nStreamID,
XnUInt32 nMaxMsgSize,
XnUInt16 nMaxPacketSize,
XnLinkCompressionType compression,
XnUInt16 nInitialPacketID,
LinkOutputDataEndpoint* pOutputDataEndpoint)
{
XnStatus nRetVal = XN_STATUS_OK;
XN_VALIDATE_INPUT_PTR(pOutputDataEndpoint);
if (m_bInitialized)
{
//We shutdown first so we can re-initialize.
Shutdown();
}
m_nStreamID = nStreamID;
m_compression = compression;
m_nPacketID = nInitialPacketID;
m_pOutputDataEndpoint = pOutputDataEndpoint;
nRetVal = CreateLinkMsgEncoder(m_pLinkMsgEncoder);
XN_IS_STATUS_OK_LOG_ERROR("Create link msg encoder", nRetVal);
nRetVal = m_pLinkMsgEncoder->Init(nMaxMsgSize, nMaxPacketSize);
XN_IS_STATUS_OK_LOG_ERROR("Init link msg encoder", nRetVal);
m_bInitialized = TRUE;
return XN_STATUS_OK;
}
XnBool LinkOutputStream::IsInitialized() const
{
return m_bInitialized;
}
void LinkOutputStream::Shutdown()
{
m_pLinkMsgEncoder->Shutdown();
XN_DELETE(m_pLinkMsgEncoder);
m_pLinkMsgEncoder = NULL;
m_nStreamID = XN_LINK_STREAM_ID_INVALID;
m_bInitialized = FALSE;
}
XnLinkCompressionType LinkOutputStream::GetCompression() const
{
return m_compression;
}
XnStatus LinkOutputStream::SendData(XnUInt16 nMsgType,
XnUInt16 nCID,
XnLinkFragmentation fragmentation,
const void* pData,
XnUInt32 nDataSize) const
{
XnStatus nRetVal = XN_STATUS_OK;
m_pLinkMsgEncoder->BeginEncoding(nMsgType, m_nPacketID, m_nStreamID,
XnLinkFragmentation(fragmentation & XN_LINK_FRAG_BEGIN), nCID);
m_pLinkMsgEncoder->EncodeData(pData, nDataSize);
m_pLinkMsgEncoder->EndEncoding(XnLinkFragmentation(fragmentation & XN_LINK_FRAG_END));
nRetVal = m_pOutputDataEndpoint->SendData(m_pLinkMsgEncoder->GetEncodedData(),
m_pLinkMsgEncoder->GetEncodedSize());
XN_IS_STATUS_OK_LOG_ERROR("Send data in output data endpoint", nRetVal);
// update packet ID
m_nPacketID = m_pLinkMsgEncoder->GetPacketID() + 1;
return XN_STATUS_OK;
}
XnStatus LinkOutputStream::CreateLinkMsgEncoder(LinkMsgEncoder*& pLinkMsgEncoder)
{
switch (m_compression)
{
case XN_LINK_COMPRESSION_NONE:
{
pLinkMsgEncoder = XN_NEW(LinkMsgEncoder);
break;
}
default:
{
xnLogError(XN_MASK_LINK, "Unknown compression type: %u", m_compression);
XN_ASSERT(FALSE);
return XN_STATUS_ERROR;
}
}
XN_VALIDATE_ALLOC_PTR(pLinkMsgEncoder);
return XN_STATUS_OK;
}
}
|