XnStatus XnDeviceBase::GetSupportedStreams(const XnChar** aStreamNames, XnUInt32* pnStreamNamesCount)
{
    XN_VALIDATE_OUTPUT_PTR(pnStreamNamesCount);
    // NOTE: we allow aStreamName to be NULL

    // first of all count streams
    XnUInt32 nStreamsCount = m_SupportedStreams.Size();

    // now check if we have enough room
    if (nStreamsCount > *pnStreamNamesCount)
    {
        *pnStreamNamesCount = nStreamsCount;
        return XN_STATUS_OUTPUT_BUFFER_OVERFLOW;
    }

    // now copy values
    nStreamsCount = 0;
    for (XnStringsSet::Iterator it = m_SupportedStreams.Begin(); it != m_SupportedStreams.End(); ++it)
    {
        aStreamNames[nStreamsCount] = it->Key();
        nStreamsCount++;
    }

    *pnStreamNamesCount = nStreamsCount;
    return XN_STATUS_OK;
}
XnStatus XnDeviceFileReader::HandleStreamRemoved(const XnChar* strName)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	// check for specific case: all streams are removed and then end-of-file is reached.
	// in this case, we don't really want to destroy streams, just wrap around.
	XnStringsSet StreamsToRemove;
	nRetVal = StreamsToRemove.Set(strName);
	XN_IS_STATUS_OK(nRetVal);

	XnPackedDataType nType = XN_PACKED_STREAM_REMOVED;
	XnUInt64 nPositionBefore;

	for (;;)
	{
		nRetVal = GetIOStream()->Tell(&nPositionBefore);
		XN_IS_STATUS_OK(nRetVal);

		nRetVal = GetDataPacker()->ReadNextObject(&nType);
		XN_IS_STATUS_OK(nRetVal);

		if (nType == XN_PACKED_STREAM_REMOVED)
		{
			XnChar strTempName[XN_DEVICE_MAX_STRING_LENGTH];
			nRetVal = GetDataPacker()->ReadStreamRemoved(strTempName);
			XN_IS_STATUS_OK(nRetVal);

			nRetVal = StreamsToRemove.Set(strTempName);
			XN_IS_STATUS_OK(nRetVal);
		}
		else
		{
			break;
		}
	}

	if (nType != XN_PACKED_END)
	{
		// Not the case we were looking for. Remove those streams.
		for (XnStringsSet::Iterator it = StreamsToRemove.Begin(); it != StreamsToRemove.End(); ++it)
		{
			nRetVal = XnStreamReaderDevice::HandleStreamRemoved(it->Key());
			XN_IS_STATUS_OK(nRetVal);
		}
	}

	// in any case, the last object we read wasn't handled yet (end-of-stream or another event), so
	// seek back, so it will be handled.
	nRetVal = GetIOStream()->Seek(nPositionBefore);
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
Exemple #3
0
XnStatus XnFileDevice::HandleStreamRemoved(const XnChar* strName)
{
    XnStatus nRetVal = XN_STATUS_OK;

    // check for specific case: all streams are removed and then end-of-file is reached.
    // in this case, we don't really want to destroy streams, just wrap around.
    XnStringsSet StreamsToRemove;
    nRetVal = StreamsToRemove.Set(strName);
    XN_IS_STATUS_OK(nRetVal);

    XnPackedDataType nType = XN_PACKED_STREAM_REMOVED;
    XnUInt32 nPositionBefore;

    for (;;)
    {
        nRetVal = m_pInputStream->Tell(&nPositionBefore);
        XN_IS_STATUS_OK(nRetVal);

        nRetVal = m_pDataPacker->ReadNextObject(&nType);
        XN_IS_STATUS_OK(nRetVal);

        if (nType == XN_PACKED_STREAM_REMOVED)
        {
            XnChar strTempName[XN_DEVICE_MAX_STRING_LENGTH];
            nRetVal = m_pDataPacker->ReadStreamRemoved(strTempName);
            XN_IS_STATUS_OK(nRetVal);

            nRetVal = StreamsToRemove.Set(strTempName);
            XN_IS_STATUS_OK(nRetVal);
        }
        else
        {
            break;
        }
    }

    if (nType != XN_PACKED_END)
    {
        // Not the case we were looking for. Remove those streams.
        for (XnStringsSet::Iterator it = StreamsToRemove.Begin(); it != StreamsToRemove.End(); ++it)
        {
            nRetVal = m_pNotifications->OnNodeRemoved(m_pNotificationsCookie, it->Key());
            XN_IS_STATUS_OK(nRetVal);

            XnNodeInfo* pNodeInfo = NULL;
            m_nodeInfoMap.Get(it->Key(), pNodeInfo);
            XN_DELETE(pNodeInfo->pXnCodec);
            m_nodeInfoMap.Remove(it->Key());
            m_ignoreNewNodes.Remove(it->Key());
        }

        m_bNodeCollectionChanged = TRUE;
    }

    // in any case, the last object we read wasn't handled yet (end-of-stream or another event), so
    // seek back, so it will be handled.
    nRetVal = m_pInputStream->Seek(nPositionBefore);
    XN_IS_STATUS_OK(nRetVal);

    return (XN_STATUS_OK);
}