⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sspayld.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* ***** BEGIN LICENSE BLOCK *****
 * Version: RCSL 1.0/RPSL 1.0
 *
 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
 *
 * The contents of this file, and the files included with this file, are
 * subject to the current version of the RealNetworks Public Source License
 * Version 1.0 (the "RPSL") available at
 * http://www.helixcommunity.org/content/rpsl unless you have licensed
 * the file under the RealNetworks Community Source License Version 1.0
 * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
 * in which case the RCSL will apply. You may also obtain the license terms
 * directly from RealNetworks.  You may not use this file except in
 * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
 * applicable to this file, the RCSL.  Please see the applicable RPSL or
 * RCSL for the rights, obligations and limitations governing use of the
 * contents of the file.
 *
 * This file is part of the Helix DNA Technology. RealNetworks is the
 * developer of the Original Code and owns the copyrights in the portions
 * it created.
 *
 * This file, and the files included with this file, is distributed and made
 * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 *
 * Technology Compatibility Kit Test Suite(s) Location:
 *    http://www.helixcommunity.org/content/tck
 *
 * Contributor(s):
 *
 * ***** END LICENSE BLOCK ***** */

#include "hxtypes.h"
#include "hxcom.h"

#include "hxassert.h"
#include "hxslist.h"
#include "hxcomm.h"
#include "ihxpckts.h"
#include "netbyte.h"

#include "sspayld.h"

#define DEFAULT_MAX_PACKET_SIZE 1500

SimpleSegmentPayloadFormat::SimpleSegmentPayloadFormat()
: m_lRefCount(0)
, m_pCommonClassFactory(NULL)
, m_pStreamHeader(NULL)
, m_bPacketize(FALSE)
, m_ulMaxSegmentSize(DEFAULT_MAX_PACKET_SIZE)
, m_ulTotalSegments(0)
, m_pSegmentedPackets(NULL)
, m_pAssembledPacket(NULL)
, m_bBigEndian(FALSE)
{
    m_pSegmentedPackets = new CHXSimpleList();
    m_bBigEndian = TestBigEndian();
}

SimpleSegmentPayloadFormat::~SimpleSegmentPayloadFormat()
{
    Reset();
    HX_DELETE(m_pSegmentedPackets);
    HX_RELEASE(m_pCommonClassFactory);
}

// *** IUnknown methods ***

/////////////////////////////////////////////////////////////////////////
//  Method:
//  IUnknown::QueryInterface
//  Purpose:
//  Implement this to export the interfaces supported by your
//  object.
//
STDMETHODIMP
SimpleSegmentPayloadFormat::QueryInterface(REFIID riid, void** ppvObj)
{
    QInterfaceList  qiList[] =
    {
	{ GET_IIDHANDLE(IID_IUnknown), this},
	{ GET_IIDHANDLE(IID_IHXPayloadFormatObject), (IHXPayloadFormatObject*)this},
    };
    return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
}


/////////////////////////////////////////////////////////////////////////
//  Method:
//  IUnknown::AddRef
//  Purpose:
//  Everyone usually implements this the same... feel free to use
//  this implementation.
//
STDMETHODIMP_(ULONG32)
SimpleSegmentPayloadFormat::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

/////////////////////////////////////////////////////////////////////////
//  Method:
//  IUnknown::Release
//  Purpose:
//  Everyone usually implements this the same... feel free to use
//  this implementation.
//
STDMETHODIMP_(ULONG32)
SimpleSegmentPayloadFormat::Release()
{
    if ( InterlockedDecrement(&m_lRefCount) > 0 )
    {
        return m_lRefCount;
    }

    delete this;
    return 0;
}


STDMETHODIMP
SimpleSegmentPayloadFormat::Init( IUnknown* pContext,
                                  BOOL bPacketize )
{
    HX_ASSERT(pContext);
    if ( !pContext )
    {
        return HXR_FAIL;
    }

    HX_RELEASE(m_pCommonClassFactory);
    m_pCommonClassFactory = NULL;

    if ( HXR_OK != pContext->QueryInterface( IID_IHXCommonClassFactory,
                                             (void**) &m_pCommonClassFactory )
       )
    {
        return HXR_FAIL;
    }

    m_bPacketize = bPacketize;

    return HXR_OK;
}

STDMETHODIMP
SimpleSegmentPayloadFormat::Reset()
{
    // Reset() is presumed not to be the complete opposite of Init();
    // We reset stream information but keep our context and packetization
    // orientation until the next Init()
    HX_RELEASE( m_pStreamHeader );
    m_pStreamHeader = NULL;
    m_ulMaxSegmentSize = 0;

    HX_RELEASE( m_pAssembledPacket );
    m_pAssembledPacket = NULL;

    return Flush();
}

STDMETHODIMP
SimpleSegmentPayloadFormat::SetStreamHeader( IHXValues* pHeader )
{
    HX_ASSERT( pHeader );
    if ( !pHeader )
    {
        return HXR_FAIL;
    }

    HX_RELEASE( m_pStreamHeader );

    m_pStreamHeader = pHeader;
    m_pStreamHeader->AddRef();

    if ( HXR_OK != m_pStreamHeader->GetPropertyULONG32( "MaxPacketSize", m_ulMaxSegmentSize ) )
    {
        m_ulMaxSegmentSize = DEFAULT_MAX_PACKET_SIZE;
    }

    return HXR_OK;
}

STDMETHODIMP
SimpleSegmentPayloadFormat::GetStreamHeader( REF(IHXValues*) pHeader )
{
    HX_ASSERT( m_pStreamHeader );
    pHeader = m_pStreamHeader;
    pHeader->AddRef();

    return HXR_OK;
}

STDMETHODIMP
SimpleSegmentPayloadFormat::SetPacket( IHXPacket* pPacket )
{
    HX_ASSERT(pPacket);
    if ( !pPacket )
    {
        return HXR_FAIL;
    }

    if ( m_bPacketize )
    {
        // Segment the packet here rather than in GetPacket(), on
        // the assumption that GetPacket() is a time sensitive function:
        // We implicitly allow multiple SetPackets() before a GetPacket()
        // in this case; it is up to the client to realize there are multiple
        // segmented packets in our queue.
        IHXBuffer* pPacketBuffer = pPacket->GetBuffer();
        HX_ASSERT( pPacketBuffer );
        if ( !pPacketBuffer )
        {
            return HXR_FAIL;
        }

        UCHAR* pPacketBufferData = pPacketBuffer->GetBuffer();
        UINT32 uiBytesRemaining = pPacketBuffer->GetSize();
        // An unsafe cast: to retain backwards compatibility, not much we can do about it.
        // We could implement a high segment count as an escape sequence; this would break
        // however, in the unlikely event someone wanted to segment a packet into 65535
        // chunks using deployed code (CPNFragment).  To be investigated if the priority ever
        // becomes high.
        m_ulTotalSegments = (unsigned short) ( pPacketBuffer->GetSize() / m_ulMaxSegmentSize );
        if ( pPacketBuffer->GetSize() % m_ulMaxSegmentSize )
        {
            m_ulTotalSegments++;
        }

        IHXBuffer* pSegmentBuffer;
        IHXPacket* pSegmentPacket;

        for ( int i = 0; uiBytesRemaining; i++ )
        {
            if ( HXR_OK != m_pCommonClassFactory->CreateInstance( IID_IHXBuffer,
                                                                  (void**) &pSegmentBuffer )
               )
            {
                Flush();
                HX_RELEASE( pPacketBuffer );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -