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

📄 hxfsmgr.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 "hxresult.h"

#include "hxcom.h"
#include "hxcomm.h"
#include "hxchkpt.h"
#include "hxfiles.h"
#include "hxauth.h"

#include "hxlist.h"
#include "hxstrutl.h"
#include "dbcs.h"
#include "hxplugn.h"
#include "plghand2.h"
#include "hxrquest.h"
#include "hxplugn.h"

#include "hxfsmgr.h"
#include "hxmon.h"
#include "chxpckts.h"
#include "plghand2.h"

//#include "hxperf.h"

#ifdef _MACINTOSH
#include "hx_moreprocesses.h"
#endif

#include "hxheap.h"
#ifdef _DEBUG
#undef HX_THIS_FILE		
static const char HX_THIS_FILE[] = __FILE__;
#endif

#if !defined(HELIX_CONFIG_NOSTATICS)
BOOL HXFileSystemManager::zm_IsInited = FALSE;
CHXMapStringToOb    HXFileSystemManager::zm_ShortNameMap;
CHXMapStringToOb    HXFileSystemManager::zm_ProtocolMap;
CHXSimpleList	    HXFileSystemManager::zm_CacheList;
#else
#include "globals/hxglobals.h"
const BOOL HXFileSystemManager::zm_IsInited = FALSE;
const CHXMapStringToOb* const HXFileSystemManager::zm_ShortNameMap = NULL;
const CHXMapStringToOb* const HXFileSystemManager::zm_ProtocolMap = NULL;
const CHXSimpleList* const HXFileSystemManager::zm_CacheList = NULL;
#endif


HXFileSystemManager::HXFileSystemManager(IUnknown* pContext)
    : m_lRefCount(0)
    , m_pContext(pContext)
    , m_pSamePool(0)
    , m_pFSManagerResponse(0)
    , m_pRequest(NULL)
    , m_pCallback(NULL)
    , m_pScheduler(NULL)
    , m_pOriginalObject(NULL)
    , m_pRelativePath(NULL)
{
    if (m_pContext)
    {
	m_pContext->AddRef();
	InitMountPoints(m_pContext);
    }
}

void HXFileSystemManager::InitMountPoints(IUnknown* pContext)
{
    static const char* const 	PH_BASE_STR 			= "FSMount.";
    static const UINT32 	PH_BASE_LEN			= 8;
    static const char* const 	PH_ELEM_STR			= "elem";
    static const UINT32 	PH_ELEM_LEN 			= 4;
    static const UINT32 	PH_MAX_INT32_AS_STRING_LEN	= 20;
    static const UINT32 	PH_MAX_MEMBER_LEN 		= 20;

#if defined(HELIX_CONFIG_NOSTATICS)
    BOOL& zm_IsInited =
	(BOOL&)HXGlobalInt32::Get(&HXFileSystemManager::zm_IsInited);
#endif

    if (zm_IsInited)
	return;
    zm_IsInited = TRUE;

    IHXBuffer*			mount_point = 0;
    IHXBuffer*			real_short_name = 0;
    const char*			short_name = 0;
    IHXValues*			options = 0;

    IHXRegistry* pRegistry;
    IHXValues* pNameList;

    if(HXR_OK != pContext->QueryInterface(IID_IHXRegistry,
					    (void**)&pRegistry))
    {
	return;
    }

    if(HXR_OK != pRegistry->GetPropListByName("config.FSMount", pNameList))
    {
	pRegistry->Release();
	return;
    }

    HX_RESULT res;
    const char* plugName;
    UINT32 plug_id;

    res = pNameList->GetFirstPropertyULONG32(plugName, plug_id);
    while(res == HXR_OK)
    {
	HXPropType plugtype = pRegistry->GetTypeById(plug_id);
	if(plugtype != PT_COMPOSITE)
	    res = HXR_FAIL;
	else
	{
	    short_name = strrchr(plugName, '.');
	    if(!short_name)
		short_name = plugName;
	    else
		short_name++;

	    IHXValues* pPropList;
	    if(HXR_OK == pRegistry->GetPropListById(plug_id, pPropList))
	    {
		const char* propName;
		UINT32 prop_id;
		options = new CHXHeader();
		options->AddRef();
		res = pPropList->GetFirstPropertyULONG32(propName, prop_id);
		while(res == HXR_OK)
		{
		    HXPropType type = pRegistry->GetTypeById(prop_id);
		    const char*propSubName = strrchr(propName, '.') + 1;
		    switch(type)
		    {
			case PT_INTEGER:
			{
			    INT32 val;
			    if(HXR_OK == pRegistry->GetIntById(prop_id, val))
			    {
				options->SetPropertyULONG32(propSubName, val);
			    }
			    break;
			}
			case PT_STRING:
			{
			    IHXBuffer* pBuffer;
			    if(HXR_OK == pRegistry->GetStrById(prop_id,
							       pBuffer))
			    {
				options->SetPropertyBuffer(propSubName,
							    pBuffer);
				pBuffer->Release();
			    }
			    break;
			}
			case PT_BUFFER:
			{
			    IHXBuffer* pBuffer;
			    if(HXR_OK == pRegistry->GetBufById(prop_id,
							       pBuffer))
			    {
				options->SetPropertyBuffer(propSubName,
							   pBuffer);
				pBuffer->Release();
			    }
			    break;
			}
			default:
			    break;
		    }
		    res = pPropList->GetNextPropertyULONG32(propName, prop_id);
		}
		res = HXR_OK;
	    }
	    
	    if(HXR_OK == options->GetPropertyBuffer("MountPoint",
						     mount_point))
	    {
		if(HXR_OK == options->GetPropertyBuffer("ShortName",
							real_short_name))
		    short_name = (const char*) real_short_name->GetBuffer();
							

		AddMountPoint(short_name,(const char*)mount_point->GetBuffer(),
						  options, pContext);
		if(real_short_name)
		{
		    real_short_name->Release();
		    real_short_name = 0;
		}
		mount_point->Release();
	    }
	    res = pNameList->GetNextPropertyULONG32(plugName, plug_id);
	}
    }
    pNameList->Release();
    pRegistry->Release();
}

HX_RESULT 
HXFileSystemManager::AddMountPoint(const char*	pszShortName,
					 const char* pszMountPoint,
					 IHXValues* pOptions,
					 IUnknown* pContext)
{
#if defined(HELIX_CONFIG_NOSTATICS)
    CHXSimpleList& zm_CacheList =
	HXGlobalList::Get(&HXFileSystemManager::zm_CacheList);
    CHXMapStringToOb& zm_ShortNameMap =
	HXGlobalMapStringToOb::Get(&HXFileSystemManager::zm_ShortNameMap);
    CHXMapStringToOb& zm_ProtocolMap =
	HXGlobalMapStringToOb::Get(&HXFileSystemManager::zm_ProtocolMap);
#endif

    HX_RESULT		    result	    = HXR_OK;
    IHXPlugin2Handler*	    pPlugin2Handler = NULL;
    CCacheInstance*	    pCCacheInstance = NULL;

    if (HXR_OK != pContext->QueryInterface(IID_IHXPlugin2Handler, (void**) &pPlugin2Handler))
	return HXR_FAIL;

    if (!pszShortName)
    {
	result = HXR_FAIL;
	goto cleanup;
    }
    
    UINT32 nIndex; 
    if (HXR_OK != pPlugin2Handler->FindIndexUsingStrings(PLUGIN_FILESYSTEMSHORT, 
	    (char*)pszShortName, NULL, NULL, NULL, NULL, nIndex))
    {
	result = HXR_FAIL;
	goto cleanup;
    }

    IHXValues* pValues;
    IHXBuffer* pProtocol;

    pPlugin2Handler->GetPluginInfo(nIndex, pValues);

    pValues->GetPropertyCString(PLUGIN_FILESYSTEMPROTOCOL, pProtocol);

    char*   pszProtocol;

    pszProtocol = (char*)pProtocol->GetBuffer();

    pCCacheInstance		    = new CCacheInstance;
    pCCacheInstance->m_mount_point  = pszMountPoint;
    pCCacheInstance->m_szProtocol   = pszProtocol;
    pCCacheInstance->m_szShortName  = pszShortName;
    pCCacheInstance->m_pOptions	    = pOptions;

    zm_ShortNameMap.SetAt(pszMountPoint, pCCacheInstance);
    zm_ProtocolMap.SetAt(pszMountPoint, pCCacheInstance);
    zm_CacheList.AddTail((void*)pCCacheInstance);

cleanup:

    return result;
}


IHXValues* HXFileSystemManager::GetOptionsGivenURL(const char* pURL)
{
    const char* pszFilePath = HXFindChar(pURL,':');
    if (pszFilePath == 0)
    {
	pszFilePath = pURL;
    }
    else
    {
	pszFilePath++;
    }

    /*
     * Must check all plugins, we cannot take just the first one who's mount point is the start
     * of the url.  We must find the one who matches with the mount point of the greatest length.
     * If p1 = /test and p2 = /test/test2 and the url is /test/test2/file we must use p2.
     */

#if defined(HELIX_CONFIG_NOSTATICS)
    CHXSimpleList& zm_CacheList =
	HXGlobalList::Get(&HXFileSystemManager::zm_CacheList);
#endif
    
    ULONG32	    mount_point_len = 0;
    CCacheInstance* pBestOptions = NULL;
    for(CHXSimpleList::Iterator i = zm_CacheList.Begin(); i != zm_CacheList.End(); ++i)
    {
	CCacheInstance* pCacheOptions = (CCacheInstance*) *i;

	if (pCacheOptions->m_mount_point.GetLength() > 0 &&
	    (strncmp(pCacheOptions->m_mount_point, pszFilePath, pCacheOptions->m_mount_point.GetLength()) == 0))
	{
	    if((UINT32)pCacheOptions->m_mount_point.GetLength() >= mount_point_len)
	    {
		mount_point_len = pCacheOptions->m_mount_point.GetLength();
		pBestOptions	= pCacheOptions;
	    }
	}
    }

    if (pBestOptions)
    {
	return pBestOptions->m_pOptions;
    }
	
    return NULL;
}



HXFileSystemManager::~HXFileSystemManager()
{
    if (m_pContext)
    {
	m_pContext->Release();
	m_pContext = 0;
    }

    if(m_pSamePool)
    {
	m_pSamePool->Release();
	m_pSamePool = NULL;
    }

    if (m_pFSManagerResponse)
    {
	m_pFSManagerResponse->Release();
	m_pFSManagerResponse = 0;
    }

    HX_RELEASE(m_pRequest);

    if (m_pCallback &&
	m_pCallback->m_bIsCallbackPending &&
	m_pScheduler)
    {
	m_pScheduler->Remove(m_pCallback->m_Handle);
    }

    HX_RELEASE(m_pCallback);
    HX_RELEASE(m_pScheduler);
    HX_RELEASE(m_pOriginalObject);
    HX_VECTOR_DELETE(m_pRelativePath);
}

// *** IUnknown methods ***

/////////////////////////////////////////////////////////////////////////
//  Method:
//	IUnknown::QueryInterface
//  Purpose:
//	Implement this to export the interfaces supported by your 
//	object.
//
STDMETHODIMP HXFileSystemManager::QueryInterface(REFIID riid, void** ppvObj)
{
    QInterfaceList qiList[] =
        {
            { GET_IIDHANDLE(IID_IHXFileSystemManager), (IHXFileSystemManager*)this },
            { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXFileSystemManager*)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) HXFileSystemManager::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

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

    delete this;
    return 0;
}


/*
 *	IHXFileSystemManager methods
 */

/************************************************************************
 *	Method:
 *	    IHXFileSystemManager::Init
 *	Purpose:
 */
STDMETHODIMP 
HXFileSystemManager::Init 
	    (
	    IHXFileSystemManagerResponse* /*IN*/  pFileManagerResponse
	    )
{
    if (!pFileManagerResponse)
    {
	return HXR_FAIL;
    }

    /* Release any earlier response */
    if (m_pFSManagerResponse)
    {
	m_pFSManagerResponse->Release();
	m_pFSManagerResponse = 0;
    }

    m_pFSManagerResponse = pFileManagerResponse;
    m_pFSManagerResponse->AddRef();


    /* 
     * We might get released (and deleted) in the response object. so 
     * Addref here and Release after the response function is called
     */
    AddRef();
    
    m_pFSManagerResponse->InitDone(HXR_OK);

    /* Release for extra Addref */
    Release();

    return HXR_OK;
}

STDMETHODIMP
HXFileSystemManager::GetFileObject(IHXRequest* pRequest,
				    IHXAuthenticator* pAuthenticator)
{
    HX_LOG_BLOCK( "HXFileSystemManager::GetFileObject" );
    
    HX_RESULT		    theErr = HXR_OK;

    HX_RELEASE(m_pRequest);

⌨️ 快捷键说明

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