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

📄 preftran.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#ifdef _WINDOWS
			    , m_pLock(NULL)
#elif _UNIX
			    , m_fileID(0)
#endif /* _WINDOWS */
{    
    if (pContext)
    {
	m_pContext = pContext;
	m_pContext->AddRef();
    }
}

HXPreferredTransportManager::~HXPreferredTransportManager()
{
    Close();
}

STDMETHODIMP
HXPreferredTransportManager::QueryInterface(REFIID riid, void**ppvObj)
{
    QInterfaceList qiList[] =
        {
            { GET_IIDHANDLE(IID_IHXPreferredTransportManager), (IHXPreferredTransportManager*)this },
            { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPreferredTransportManager*)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) 
HXPreferredTransportManager::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

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

    delete this;
    return 0;
}

HX_RESULT    
HXPreferredTransportManager::_Initialize(void)
{
    HX_RESULT	hr = HXR_OK;
    HXNetInterface* pHXNI = NULL;
    
    if (!m_pContext)
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

    if (!m_pSubnetManager)
    {
	m_pSubnetManager = new HXSubnetManager((IUnknown*)m_pContext);
    }

#if defined(HELIX_FEATURE_PROXYMGR)
    if (!m_pProxyManager)
    {
	m_pContext->QueryInterface(IID_IHXProxyManager, (void**)&m_pProxyManager);
	HX_ASSERT(m_pProxyManager);
    }
#endif /* #if defined(HELIX_FEATURE_PROXYMGR) */

    CollectNetworkInfo();

    PrepPrefTransport();

    OpenPrefTransport();

    m_bInitialized = TRUE;

cleanup:

    return hr;
}

HX_RESULT
HXPreferredTransportManager::ReadPreferences(BOOL  bRTSPProtocol, UINT32& ulTransportMask)
{
    BOOL	bAutoTransport = TRUE;
    BOOL	bMulticast = FALSE;
    BOOL	bUDP = FALSE;
    BOOL	bTCP = FALSE;
    BOOL	bHTTPCloak = FALSE; 

    ulTransportMask = 0;

    ReadPrefBOOL(m_pPreferences, "AutoTransport", bAutoTransport);

    if (bAutoTransport)
    {
	ulTransportMask = ATTEMPT_AUTOTRANSPORT;
    }
    else
    {
        ReadPrefBOOL(m_pPreferences, bRTSPProtocol?"AttemptRTSPvMulticast":"AttemptPNAvMulticast", bMulticast);
        ReadPrefBOOL(m_pPreferences, bRTSPProtocol?"AttemptRTSPvUDP":"AttemptPNAvUDP", bUDP);
        ReadPrefBOOL(m_pPreferences, bRTSPProtocol?"AttemptRTSPvTCP":"AttemptPNAvTCP", bTCP);
        ReadPrefBOOL(m_pPreferences, bRTSPProtocol?"AttemptRTSPvHTTP":"AttemptPNAvHTTP", bHTTPCloak);

	if (bMulticast)
	{
	    ulTransportMask |= ATTEMPT_MULTICAST;
	}

	if (bUDP)
	{
	    ulTransportMask |= ATTEMPT_UDP;
	}

	if (bTCP)
	{
	    ulTransportMask |= ATTEMPT_TCP;
	}

	if (bHTTPCloak)
	{
	    ulTransportMask |= ATTEMPT_HTTPCLOAK;
	}
    }

    return HXR_OK;
}

void	
HXPreferredTransportManager::Close(void)
{
    if (m_bSave)
    {
	SavePrefTransport();
    }

    ResetPrefTransport(m_pPrevPrefHostTransportList);
    HX_DELETE(m_pPrevPrefHostTransportList);

    ResetPrefTransport(m_pPrefHostTransportList);
    HX_DELETE(m_pPrefHostTransportList);

    HX_DELETE(m_pSubnetManager);

    if (m_pHXNetInterface)
    {
	m_pHXNetInterface->RemoveAdviseSink((IHXNetInterfacesAdviseSink*)this);
	HX_RELEASE(m_pHXNetInterface);
    }

#if defined(HELIX_FEATURE_PROXYMGR)
    HX_RELEASE(m_pProxyManager);
#endif /* HELIX_FEATURE_PROXYMGR */

    HX_RELEASE(m_pPreferences);
    HX_RELEASE(m_pContext);

    HX_VECTOR_DELETE(m_pszFile);

    m_bInitialized = FALSE;

#ifdef _WINDOWS
    HX_DELETE(m_pLock);
#endif /* _WINDOWS */
}

void
HXPreferredTransportManager::TransportSet(HXPreferredTransport* pPreferredTransport,
					   BOOL bSave)
{
    if (PTC_INTERNAL == pPreferredTransport->m_prefTransportClass)
    {
	m_internalTransportType = pPreferredTransport->m_prefTransportType;
    }
    else if (PTC_EXTERNAL == pPreferredTransport->m_prefTransportClass)
    {
	m_externalTransportType = pPreferredTransport->m_prefTransportType;
    }
    else
    {
	HX_ASSERT(FALSE);
    }

    if (bSave)
    {
	m_bSave = TRUE;
    }
}
					      
/************************************************************************
 *	Method:
 *	    IHXPreferredTransportManager::Initialize
 *	Purpose:
 *	    Initialize the transport manager such as re-reading the preferences
 */
STDMETHODIMP
HXPreferredTransportManager::Initialize()
{
    HX_RESULT	rc = HXR_OK;
    BOOL	bPreferenceModified = FALSE;
    UINT32	ulRTSPTransportMask = ATTEMPT_AUTOTRANSPORT;
    UINT32	ulPNMTransportMask = ATTEMPT_AUTOTRANSPORT;

    if (!m_bInitialized)
    {
	rc = _Initialize();
    }

    HX_ASSERT(HXR_OK == rc);

    ResetPrefTransport(m_pPrevPrefHostTransportList);

    ReadPreferences(TRUE, ulRTSPTransportMask);
    ReadPreferences(FALSE, ulPNMTransportMask);

    if (ulRTSPTransportMask != m_ulRTSPTransportMask)
    {
	bPreferenceModified = TRUE;
	m_ulRTSPTransportMask = ulRTSPTransportMask;
	m_lastRTSPPreferencesModifiedTime = time(NULL);
    }

    if (ulPNMTransportMask != m_ulPNMTransportMask)
    {
	bPreferenceModified = TRUE;
	m_ulPNMTransportMask = ulPNMTransportMask;
	m_lastPNMPreferencesModifiedTime = time(NULL);
    }

    InitTransportTypeStartWith(m_ulRTSPTransportMask, m_rtspTransportTypeStartWith);
    InitTransportTypeStartWith(m_ulPNMTransportMask, m_pnmTransportTypeStartWith);

    // re-initialize internal/external transport type to its lowest start transport
    // type when we detect the transport preference has been changed
    if (bPreferenceModified)
    {
	m_externalTransportType = m_internalTransportType = GetLowerTransport(m_rtspTransportTypeStartWith,
									      m_pnmTransportTypeStartWith);
    }

    m_pSubnetManager->Initialize();

#if defined(HELIX_FEATURE_PROXYMGR)
    m_pProxyManager->Initialize(m_pContext);
#endif /* HELIX_FEATURE_PROXYMGR */

    m_ulPlaybacks++;

    return rc;
}

/************************************************************************
 *	Method:
 *	    IHXPreferredTransportManager::GetPrefTransport
 *	Purpose:
 *	    Get preferred host transport
 */
STDMETHODIMP
HXPreferredTransportManager::GetPrefTransport(const char*		    /* IN  */ pszHostName,
					      PreferredTransportProtocol    /* IN  */ prefTransportProtocol,
					      REF(IHXPreferredTransport*)   /* OUT */ pPrefTransport)
{
    HX_RESULT		    rc = HXR_OK;
    BOOL		    bFound = FALSE;
    UINT32		    ulIAddress = 0;
    UINT32		    ulHostAddress = 0;
    HXPreferredTransport*   pTransport = NULL;
    PreferredTransportClass prefTransportClass = PTC_EXTERNAL;
    CHXString*		    pDomainHost = NULL;
    CHXSimpleList::Iterator i;

    pPrefTransport = NULL;

    if (!m_bInitialized)
    {
	rc = _Initialize();
	if (HXR_OK != rc)
	{
	    goto cleanup;
	}
    }

    if (pszHostName)
    {
        if(IsNumericAddr(pszHostName, strlen(pszHostName)))
        {
	    ulIAddress = HXinet_addr(pszHostName);
	    ulHostAddress = DwToHost(ulIAddress);
	    pDomainHost = new CHXString(pszHostName);
        }
        else
        {
	    pDomainHost = GetMasterDomain(pszHostName);
        }

        prefTransportClass = GetTransportClass(pszHostName, ulHostAddress);

        if (m_pPrefHostTransportList)
        {
	    i = m_pPrefHostTransportList->Begin();
	    for (; i != m_pPrefHostTransportList->End(); ++i)
	    {
	        pTransport = (HXPreferredTransport*)*i;

	        // based on host name for now
	        if (pTransport->m_pHost &&
                    !pTransport->m_pHost->CompareNoCase((const char*)*pDomainHost)   &&
		    pTransport->m_prefTransportProtocol == prefTransportProtocol    &&
		    pTransport->m_prefTransportClass == prefTransportClass)
	        {
		    bFound = TRUE;
		    break;
	        }
	    }
        }
    }

    if (bFound)
    {
	// previous transport attempt is failed
	if (pTransport->m_state == PTS_UNKNOWN)
	{
	    pTransport->m_state = PTS_CREATE;
	}
	 
	pTransport->Initialize();
        pPrefTransport = pTransport;
	pPrefTransport->AddRef();
    }
    else
    {
	pTransport = new HXPreferredTransport(this);
	pTransport->AddRef();

	pTransport->m_pHost = pDomainHost;
	pTransport->m_ulHost = ulHostAddress;
	pTransport->m_prefTransportClass = prefTransportClass;
	pTransport->m_prefTransportProtocol = prefTransportProtocol; 	
	pTransport->m_state = PTS_CREATE;

	pTransport->Initialize();

        if (!m_pPrefHostTransportList)
        {
	    m_pPrefHostTransportList = new CHXSimpleList();
        }

	m_pPrefHostTransportList->AddTail(pTransport);
	rc = pTransport->QueryInterface(IID_IHXPreferredTransport, (void**)&pPrefTransport);
    }

    if (pTransport->m_state != PTS_READY)
    {
	m_bSave = TRUE;
    }

cleanup:

    return rc;
}

/************************************************************************
 *	Method:
 *	    IHXPreferredTransportManager::RemovePrefTransport
 *	Purpose:
 *	    Remove preferred host transport
 */
STDMETHODIMP
HXPreferredTransportManager::RemovePrefTransport(IHXPreferredTransport*   /* IN */ pPrefTransport)
{
    HX_RESULT		    rc = HXR_OK;
    HXPreferredTransport*  pTransport = NULL;
    LISTPOSITION	    lPos = NULL;

    if (!m_pPrefHostTransportList)
    {
	goto cleanup;
    }

    lPos = m_pPrefHostTransportList->GetHeadPosition();
    while (lPos && m_pPrefHostTransportList->GetCount())
    {	    
	pTransport = (HXPreferredTransport*)m_pPrefHostTransportList->GetAt(lPos);
	
	if (pTransport == pPrefTransport)
	{
	    HX_RELEASE(pTransport);
	    lPos = m_pPrefHostTransportList->RemoveAt(lPos);
	}
	else
	{
	    m_pPrefHostTransportList->GetNext(lPos);
	}
    }

cleanup:

    return rc;
}

/************************************************************************
 *	Method:
 *	    IHXPreferredTransportManager::GetTransportPreference
 *	Purpose:
 *	    Get transport preference set by the user
 */
STDMETHODIMP
HXPreferredTransportManager::GetTransportPreference(PreferredTransportProtocol	/* IN  */ prefTransportProtocol,
						     REF(UINT32)		/* OUT */ ulPreferenceMask)
{
    HX_RESULT	rc = HXR_OK;

    if (PTP_RTSP == prefTransportProtocol)
    {
	ulPreferenceMask = m_ulRTSPTransportMask;
    }
    else if (PTP_PNM == prefTransportProtocol)
    {
	ulPreferenceMask = m_ulPNMTransportMask;
    }
    else
    {
	rc = HXR_FAILED;
    }

    return rc;
}

/*
 *	IHXNetInterfacesAdviseSink methods
 */
STDMETHODIMP
HXPreferredTransportManager::NetInterfacesUpdated()
{

    HX_RESULT	rc = HXR_OK;

    if (m_bSave)
    {
	SavePrefTransport();
    }

    ResetPrefTransport(m_pPrevPrefHostTransportList);
    m_pPrevPrefHostTransportList = m_pPrefHostTransportList;
    m_pPrefHostTransportList = NULL;

    HX_VECTOR_DELETE(m_pszFile);

    m_bInitialized = FALSE;

    return rc;
}

HX_RESULT	    
HXPreferredTransportManager::CollectNetworkInfo(void)
{
    HX_RESULT	rc = HXR_FAILED;
    UINT16	i = 0;
    UINT32	uNI = 0;
    NIInfo*	pTempNIInfo = NULL;
    NIInfo*	pNIInfo = NULL;

    if (!m_pHXNetInterface)
    {
	if (HXR_OK != m_pContext->QueryInterface(IID_IHXNetInterfaces, (void**)&m_pHXNetInterface))
	{
	    goto cleanup;
	}
	m_pHXNetInterface->AddAdviseSink((IHXNetInterfacesAdviseSink*)this);
    }

    if (m_pHXNetInterface)
    {
	uNI = m_pHXNetInterface->GetNumOfNetInterfaces();

	for (i = 0; i < uNI; i++)
	{
	    if (HXR_OK == m_pHXNetInterface->GetNetInterfaces(i, pTempNIInfo))
	    {
		if (pTempNIInfo && pTempNIInfo->bActive)
		{		    
		    pNIInfo = pTempNIInfo;

		    if (POINTTOPOINT == pNIInfo->type)
		    {
			break;
		    }
		}
	    }
	}

	if (pNIInfo)

⌨️ 快捷键说明

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