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

📄 preftran.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	    outString += ".";
	    outString += inString.NthField('.', nFields);
	}
	
	pOutString = new CHXString(outString);
    }

    return pOutString;
}

TransportMode
HXPreferredTransportManager::GetTransportPreferred(HXPreferredTransport* pPrefTransport)
{
    TransportMode   transportMode = UnknownMode;
 
    if (PTC_INTERNAL == pPrefTransport->m_prefTransportClass)
    {
	if (PTP_RTSP == pPrefTransport->m_prefTransportProtocol)
	{
	    transportMode = GetHigherTransport(m_rtspTransportTypeStartWith,
					       m_internalTransportType);
	}
	else if (PTP_PNM == pPrefTransport->m_prefTransportProtocol)
	{
	    transportMode = GetHigherTransport(m_pnmTransportTypeStartWith,
					       m_internalTransportType);
	}
	else
	{
	    HX_ASSERT(FALSE);
	}
    }
    else if (PTC_EXTERNAL == pPrefTransport->m_prefTransportClass)
    {
	if (PTP_RTSP == pPrefTransport->m_prefTransportProtocol)
	{
	    transportMode = m_rtspTransportTypeStartWith; 
//			    GetHigherTransport(m_rtspTransportTypeStartWith,
//					       m_externalTransportType);
	}
	else if (PTP_PNM == pPrefTransport->m_prefTransportProtocol)
	{
	    transportMode = m_pnmTransportTypeStartWith;
//			    GetHigherTransport(m_pnmTransportTypeStartWith,
//					       m_externalTransportType);
	}
	else
	{
	    HX_ASSERT(FALSE);
	}
    }
 
    return transportMode;
}

TransportMode
HXPreferredTransportManager::GetHigherTransport(TransportMode mode1, TransportMode mode2)
{
    if (mode1 < mode2)
    {
	return mode2;
    }
    else
    {
	return mode1;
    }    
}
    
TransportMode
HXPreferredTransportManager::GetLowerTransport(TransportMode mode1, TransportMode mode2)
{
    if (mode1 > mode2)
    {
	return mode2;
    }
    else
    {
	return mode1;
    }    
}

PreferredTransportClass
HXPreferredTransportManager::GetTransportClass(const char* pszHostName, UINT32 ulHostAddress)
{
    HX_RESULT			rc = HXR_OK;
    PreferredTransportClass	prefTransportClass = PTC_EXTERNAL;

    // Internal server is defined as:
    // a. a media server on the same network subnet as the client, or
    // b. a media server on a network subnet that meets the "Peer Subnet" criteria 
    //    (either as an explicit entry or by meeting wildcard criteria), or
    // c. a media server that meets the "Proxy Exclude" criteria 
    //    (either as an explicit entry or by meeting wildcard criteria)
    if ((m_ulSubnetMask && m_ulSubnet && ((ulHostAddress & m_ulSubnetMask) == m_ulSubnet))  ||
	m_pSubnetManager->IsSubnet(pszHostName)						    
#if defined(HELIX_FEATURE_PROXYMGR)
	|| m_pProxyManager->IsExemptionHost((char*)pszHostName)
#endif /* HELIX_FEATURE_PROXYMGR */
	)
    {
	prefTransportClass = PTC_INTERNAL;
    }

    return prefTransportClass;
}

void
HXPreferredTransportManager::InitTransportTypeStartWith(UINT32		ulTransportMask, 
							 TransportMode&	transportStartWith)
{
    transportStartWith = UnknownMode;

    if (ulTransportMask & ATTEMPT_MULTICAST)
    {
	transportStartWith = MulticastMode;
    }
    else if (ulTransportMask & ATTEMPT_UDP)
    {
	transportStartWith = UDPMode;
    }
    else if (ulTransportMask & ATTEMPT_TCP)
    {
	transportStartWith = TCPMode;
    }
    else if (ulTransportMask & ATTEMPT_HTTPCLOAK)
    {
	transportStartWith = HTTPCloakMode;
    }
    else
    {
	HX_ASSERT(FALSE);
    }

    return;
}

HX_RESULT
HXPreferredTransportManager::OpenPrefTransport(void)
{
    HX_RESULT	    hr = HXR_OK;
    char*	    pszHostName = NULL;
    char*	    pszClass = NULL;
    char*	    pszProtocol = NULL;
    char*	    pszTransport = NULL; 
    char*	    pszTransportMask = NULL;
    char*	    pszCloakPort = NULL;
    char*	    pszExpires = NULL;
    char*	    pszHTTPNG = NULL;
    char*	    pszPlaybacks = NULL;
    char*	    pszUnknownField = NULL;
    char	    buffer[LINE_BUFFER_SIZE] = {0}; /* Flawfinder: ignore */
    UINT32	    ulBytesRead = 0;
    UINT32	    ulIAddress = 0;
    FILE*	    fp = NULL;
    HXPreferredTransport* pTransport = NULL;
    PreferredTransportClass transportClass = PTC_UNKNOWN;
 
    if (!m_pszFile)
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

#ifdef _WINDOWS
    if (!m_pLock)
    {
#ifdef THREADS_SUPPORTED        
	HXEvent::MakeEvent(m_pLock, RM_PREFTRAN_FILE_LOCK, FALSE);
#else        
	HXEvent::MakeStubEvent(m_pLock, RM_PREFTRAN_FILE_LOCK, FALSE);
#endif
    }
    else
    {
	m_pLock->Wait();
    }
#endif /* _WINDOWS */

    if (!(fp = fopen(m_pszFile, "r+b")))
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

#if defined (_UNIX) && !defined(_SUN) && !defined(_SCO_UW) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
    m_fileID = fileno(fp);    
    flock(m_fileID, LOCK_EX);
#endif /* _UNIX */

     /* line format is:
     *
     * hostname \t class \t protocol \t transport \t cloakport \t time
     *
     * hostname	    - string(null by default)
     * class	    - transport class(PTC_Internal by default)
     * protocol	    - protocol type(RTSP vs PNM)
     * transport    - preferred transport(UDPMode by default)
     * cloakport    - cloak port
     * time	    - time of last used or modified
     */
    while (HXR_OK == FileReadLine(fp, &buffer[0], LINE_BUFFER_SIZE, &ulBytesRead))
    {
	if (*buffer == '#' || *buffer == CR || *buffer == LF || *buffer == 0)
	{
	    continue;
	}

	pszHostName = buffer;
	    
	if(!(pszClass = strchr(pszHostName, '\t')))
	{
	    continue;
	}
	*pszClass++ = '\0';
	if(*pszClass == CR || *pszClass == LF || *pszClass == 0)
	{
	    continue;
	}

	if (0 == strcasecmp(pszHostName, "localhost"))
	{
	    transportClass = (PreferredTransportClass)atoi(pszClass);

	    if(!(pszTransport = strchr(pszClass, '\t')))
	    {
		continue;
	    }
	    *pszTransport++ = '\0';
	    if(*pszTransport == CR || *pszTransport == LF || *pszTransport == 0)
	    {
		continue;
	    }

	    if(!(pszProtocol = strchr(pszTransport, '\t')))
	    {
		continue;
	    }
	    *pszProtocol++ = '\0';
	    if(*pszProtocol == CR || *pszProtocol == LF || *pszProtocol == 0)
	    {
		continue;
	    }

	    if(!(pszTransportMask = strchr(pszProtocol, '\t')))
	    {
		continue;
	    }
	    *pszTransportMask++ = '\0';
	    if(*pszTransportMask == CR || *pszTransportMask == LF || *pszTransportMask == 0)
	    {
		continue;
	    }

	    if(!(pszExpires = strchr(pszTransportMask, '\t')))
	    {
		continue;
	    }
	    *pszExpires++ = '\0';
	    if(*pszExpires == CR || *pszExpires == LF || *pszExpires == 0)
	    {
		continue;
	    }

	    if (!(pszUnknownField = strchr(pszExpires, '\t')))
	    {
		// remove the '\n' from the end of the entry
		pszExpires = ::StripLine(pszExpires);
	    }
	    else
	    {
		*pszUnknownField++ = '\0';
	    }

	    if (PTC_INTERNAL == transportClass)
	    {
		m_internalTransportType = (TransportMode)atoi(pszTransport);
#ifdef _MACINTOSH
		m_ulRTSPTransportMask = atoi64(pszTransportMask);
		m_lastRTSPPreferencesModifiedTime = (time_t)atoi64(pszExpires);
#else
		m_ulRTSPTransportMask = atol(pszTransportMask);
		m_lastRTSPPreferencesModifiedTime = atol(pszExpires);
#endif
	    }
	    else if (PTC_EXTERNAL == transportClass)
	    {
		m_externalTransportType = (TransportMode)atoi(pszTransport);
#ifdef _MACINTOSH
		m_ulPNMTransportMask = atoi64(pszTransportMask);
		m_lastPNMPreferencesModifiedTime = (time_t)atoi64(pszExpires);
#else
		m_ulPNMTransportMask = atol(pszTransportMask);
		m_lastPNMPreferencesModifiedTime = atol(pszExpires);
#endif
	    }
	    else
	    {
		HX_ASSERT(FALSE);
	    }
	}
	else
	{
	    if(!(pszProtocol = strchr(pszClass, '\t')))
	    {
		continue;
	    }
	    *pszProtocol++ = '\0';
	    if(*pszProtocol == CR || *pszProtocol == LF || *pszProtocol == 0)
	    {
		continue;
	    }

	    if(!(pszTransport = strchr(pszProtocol, '\t')))
	    {
		continue;
	    }
	    *pszTransport++ = '\0';
	    if(*pszTransport == CR || *pszTransport == LF || *pszTransport == 0)
	    {
		continue;
	    }

	    if(!(pszCloakPort = strchr(pszTransport, '\t')))
	    {
		continue;
	    }
	    *pszCloakPort++ = '\0';
	    if(*pszCloakPort == CR || *pszCloakPort == LF || *pszCloakPort == 0)
	    {
		continue;
	    }

	    if(!(pszExpires = strchr(pszCloakPort, '\t')))
	    {
		continue;
	    }
	    *pszExpires++ = '\0';
	    if(*pszExpires == CR || *pszExpires == LF || *pszExpires == 0)
	    {
		continue;
	    }

	    if(!(pszHTTPNG = strchr(pszExpires, '\t')))
	    {
		continue;
	    }
	    *pszHTTPNG++ = '\0';
	    if(*pszHTTPNG == CR || *pszHTTPNG == LF || *pszHTTPNG == 0)
	    {
		continue;
	    }

	    if (!(pszPlaybacks = strchr(pszHTTPNG, '\t')))
	    {
		continue;
	    }
	    *pszPlaybacks++ = '\0';
	    if(*pszPlaybacks == CR || *pszPlaybacks == LF || *pszPlaybacks == 0)
	    {
		continue;
	    }
	    
	    if (!(pszUnknownField = strchr(pszPlaybacks, '\t')))
	    {
		// remove the '\n' from the end of the entry
		pszPlaybacks = ::StripLine(pszPlaybacks);
	    }
	    else
	    {
		*pszUnknownField++ = '\0';
	    }

	    // construct a new preferred transport struct
	    pTransport = new HXPreferredTransport(this);
	    pTransport->AddRef();

	    pTransport->m_pHost = new CHXString(pszHostName);
	    pTransport->m_prefTransportClass = (PreferredTransportClass)atoi(pszClass);
	    pTransport->m_prefTransportProtocol = (PreferredTransportProtocol)atoi(pszProtocol);
	    pTransport->m_prefTransportType = (TransportMode)atoi(pszTransport);
	    pTransport->m_uCloakPort = atoi(pszCloakPort);
#ifdef _MACINTOSH
	    pTransport->m_lastUsedTime = (time_t)atoi64(pszExpires);
#else
	    pTransport->m_lastUsedTime = atol(pszExpires);
#endif
	    pTransport->m_bHTTPNG = atoi(pszHTTPNG);
	    pTransport->m_uPlaybacks = atoi(pszPlaybacks);
	    pTransport->m_state = PTS_READY;

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

	    m_pPrefHostTransportList->AddTail(pTransport);
	}
    }

cleanup:

#if defined (_UNIX) && !defined(_SUN) && !defined(_SCO_UW) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
    flock(m_fileID, LOCK_UN);
#endif /* _UNIX */

    if (fp)
    {
	fclose(fp);
    }

#ifdef _WINDOWS
    if (m_pLock)
    {
	m_pLock->SignalEvent();
    }
#endif /* _WINDOWS */

    return hr;
}

HX_RESULT	
HXPreferredTransportManager::SavePrefTransport(void)
{
    HX_RESULT		    hr = HXR_OK;
    FILE*		    fp = NULL;
    UINT32		    ulTransportMask = 0;
    HXPreferredTransport*  pTransport = NULL;
    CHXSimpleList::Iterator  i;

    if (!m_pszFile)
    {
	goto cleanup;
    }

#ifdef _WINDOWS
    if (!m_pLock)
    {
#ifdef THREADS_SUPPORTED        
	HXEvent::MakeEvent(m_pLock, RM_PREFTRAN_FILE_LOCK, FALSE);
#else
	HXEvent::MakeStubEvent(m_pLock, RM_PREFTRAN_FILE_LOCK, FALSE);
#endif        
    }
    else
    {
	m_pLock->Wait();
    }
#endif /* _WINDOWS */

    if (!(fp = fopen(m_pszFile, "w")))
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

#ifdef _UNIX
    //Make the permisions on the cookies file User read/write only.
    if( chmod( m_pszFile, S_IRUSR | S_IWUSR ) != 0 )
    {
        HX_ASSERT( "Can't change permision on cookies file." == NULL );
    }
    
#endif    

#if defined (_UNIX) && !defined(_SUN) && !defined(_SCO_UW) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
    m_fileID = fileno(fp);    
    flock(m_fileID, LOCK_EX);
#endif /* _UNIX */

    fwrite(RM_PREFTRAN_CAPTION, sizeof(char), strlen(RM_PREFTRAN_CAPTION), fp);

    // save preferred class information first
    FileWriteClass(fp, PTC_INTERNAL, m_internalTransportType, PTP_RTSP, m_ulRTSPTransportMask, m_lastRTSPPreferencesModifiedTime);
    FileWriteClass(fp, PTC_EXTERNAL, m_externalTransportType, PTP_PNM, m_ulPNMTransportMask, m_lastPNMPreferencesModifiedTime);

    // save preferred host information
    if (m_pPrefHostTransportList)
    {
	for (i = m_pPrefHostTransportList->Begin(); i != m_pPrefHostTransportList->End(); ++i)
	{
	    pTransport = (HXPreferredTransport*)(*i);
	    if (pTransport->m_pHost && PTS_READY == pTransport->m_state)
	    {
		FileWriteLine(fp, pTransport);
	    }
	}
    }

    m_bSave = FALSE;
    
cleanup:

#if defined (_UNIX) && !defined(_SUN) && !defined(_SCO_UW) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
    flock(m_fileID, LOCK_UN);
#endif /* _UNIX */

    if (fp)
    {
	fclose(fp);
    }

#ifdef _WINDOWS
    if (m_pLock)
    {
	m_pLock->SignalEvent();
    }
#endif /* _WINDOWS */

    return(hr);
}

⌨️ 快捷键说明

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