www.pudn.com > zfxcengine-0.1.0.zip > ceResourceManager.cpp


// $Id: ceResourceManager.cpp,v 1.13 2005/09/05 08:52:19 kimmi Exp $ 
///////////////////////////////////////////////////////////////// 
// 
//!   Module:     Core 
//!  \file:       ceResourceManager.cpp 
//!   Created:    18.09.2004 
//!   Author:     Kim Kulling aka kimmi 
// 
///////////////////////////////////////////////////////////////// 
#include "Core/ceResourceManager.h" 
#include "Core/ceExceptions.h" 
#include "Core/ceMemManager.h" 
#include "VFSystem/ceScratchSystem.h" 
#include "VFSystem/ceScratchFile.h" 
 
namespace ZFXCE { 
	///////////////////////////////////////////////////////////////// 
	ceResourceManager::ceResourceManager() 
	{ 
		PUSH_FUNCTION; 
 
		Init(0); 
	} 
	///////////////////////////////////////////////////////////////// 
	ceResourceManager::ceResourceManager(DWORD dwSize, ceVFSystem *pVFS) 
	{ 
		PUSH_FUNCTION; 
 
		Init(dwSize); 
		SetVFS(pVFS); 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::SetVFS(ceVFSystem *pVFS) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert(NULL != pVFS); 
		m_pVFS = pVFS; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Init(DWORD dwSize) 
	{ 
		PUSH_FUNCTION; 
 
		if (dwSize < 0) 
			m_dwMaxSize = 0; 
		else 
			m_dwMaxSize = dwSize; 
		 
		// Initialisiere Attribute 
		m_dwSize    = 0; 
		m_rhCurrent = 0; 
		m_uiMax     = 0; 
		m_pVFS      = NULL; 
		m_pCurrent  = NULL; 
		m_pLocked   = NULL; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Release() 
	{ 
		PUSH_FUNCTION; 
 
		ceResource *pRes = NULL; 
		// Release opened resources 
		if (0 != m_ResourceMap.size()) { 
			for (m_It = m_ResourceMap.begin(); m_It != m_ResourceMap.end(); 
					++m_It) { 
				pRes = (*m_It).second; 
			} 
			m_ResourceMap.clear(); 
		} 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::AddMemory(DWORD dwSize) 
	{ 
		PUSH_FUNCTION; 
 
		m_dwSize += dwSize; 
		if (m_dwSize > m_dwMaxSize) { 
			CE_EXCEPTION("Maximum memory of ressouremanager exceeded!", CELS_HARDERROR); 
			return; 
		} 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::DelMemory(DWORD dwSize) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (dwSize < m_dwSize); 
		m_dwSize -= dwSize; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::AddLoaderJob(ceResource *pResource) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (NULL != pResource); 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::DelLoaderJob(ceResource *pResource) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (NULL != pResource); 
	} 
	///////////////////////////////////////////////////////////////// 
	ceResourceManager::~ceResourceManager() 
	{ 
		PUSH_FUNCTION; 
 
		Release(); 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Clear() 
	{ 
		PUSH_FUNCTION; 
 
		Release(); 
		Init(0); 
	} 
	///////////////////////////////////////////////////////////////// 
	RHANDLE ceResourceManager::AddResource(ceResource *pResource) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert(NULL != pResource);		 
		 
		// Get a handle 
		UINT uiID = 0; 
		if (!m_lFreeHandles.empty()) {  
			uiID = m_lFreeHandles.front(); 
			m_lFreeHandles.pop_front();	 
		} 
		else { 
			++m_uiMax; 
			uiID = m_uiMax; 
		} 
			 
		// Assign resourceid to resource 
		m_ResourceMap[uiID] = pResource; 
		m_pCurrent  = pResource; 
		m_rhCurrent = uiID; 
		DWORD dwSize = (DWORD) pResource->GetSize(); 
		m_dwSize += dwSize; 
		 
		return uiID; 
	} 
	///////////////////////////////////////////////////////////////// 
	ceResource *ceResourceManager::GetResource(RHANDLE Handle)  
	{ 
		PUSH_FUNCTION; 
 
		ceResource *pRes = NULL; 
		if (Handle == m_rhCurrent) { 
			ce_assert(NULL != m_pCurrent); 
			return m_pCurrent; 
		} 
			 
		// Search for resoure in map 
		m_It = m_ResourceMap.find(Handle); 
		if (m_It != m_ResourceMap.end())  
			CE_EXCEPTION("Cannot delete resource!", CELS_HARDERROR); 
		pRes = (*m_It).second; 
		 
		return pRes; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::DelResource(RHANDLE Handle) 
	{ 
		PUSH_FUNCTION; 
 
		m_It = m_ResourceMap.find(Handle); 
		if (m_It != m_ResourceMap.end()) { 
			CE_EXCEPTION("Cannot delete ressource!", CELS_HARDERROR); 
		} 
		 
		m_ResourceMap.erase(m_It); 
	} 
	///////////////////////////////////////////////////////////////// 
	size_t ceResourceManager::GetNumResources() const 
	{ 
		PUSH_FUNCTION; 
 
		return m_ResourceMap.size(); 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Lock(RHANDLE Handle) 
	{ 
		PUSH_FUNCTION; 
 
		ceResource *pRes = NULL; 
		pRes = GetResource(Handle); 
		ce_assert(NULL != pRes); 
		m_pLocked = pRes; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Lock(ceResource *pRes) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert(NULL != pRes); 
		m_pLocked = pRes; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Unlock(RHANDLE Handle) 
	{ 
		PUSH_FUNCTION; 
 
		ceResource *pRes = NULL; 
		m_It = m_ResourceMap.find(Handle); 
		if (m_It != m_ResourceMap.end()) 
			CE_EXCEPTION("Cannot delete resource!", CELS_HARDERROR); 
		 
		pRes = (*m_It).second; 
		m_pLocked = NULL; 
	} 
	///////////////////////////////////////////////////////////////// 
	void ceResourceManager::Unlock(ceResource *pRes) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (NULL != pRes);		 
		m_pLocked = NULL; 
	} 
	///////////////////////////////////////////////////////////////// 
	DWORD ceResourceManager::GetSize() const 
	{ 
		PUSH_FUNCTION; 
 
		return m_dwSize; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	UINT ceResourceManager::RegisterResType(const char *pResTypeName) 
	{ 
		PUSH_FUNCTION; 
		ce_assert (NULL != pResTypeName); 
		 
		// Enshure unique typeid 
		const UINT uiRes = FindResTypeByName(pResTypeName); 
		if (0 != uiRes) 
			return uiRes; 
 
		// Create a new typeid 
		char *pTemp = new char[strlen(pResTypeName)]; 
		ce_assert(NULL != pTemp); 
		m_vRegIDContainer.push_back(pTemp); 
		 
		// Register resource type in scratch system 
		if (NULL != m_pVFS) { 
			// unused : ceScratchSystem *pSystem = m_pVFS->GetScratchSystem(); 
//			pSystem-> 
		} 
 
		return (UINT) m_vRegIDContainer.size(); 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	bool ceResourceManager::UnregisterResType(const char *pResTypeName) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (NULL != pResTypeName); 
		std::vector::iterator it; 
		UINT uiTypeID = FindResTypeByName(pResTypeName); 
		if (0 == uiTypeID) 
			return false; 
		m_vRegIDContainer[uiTypeID-1] = NULL; 
		 
		return true; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	bool ceResourceManager::UnregisterResType(const UINT uiResTypeID) 
	{ 
		PUSH_FUNCTION; 
 
		// Enshure valid parameter 
		ce_assert(m_vRegIDContainer.size() >= uiResTypeID); 
		ce_assert(NULL != m_vRegIDContainer[uiResTypeID]); 
		 
		// Set assigned type id to NULL 
		if (NULL != m_vRegIDContainer[uiResTypeID-1]) { 
			m_vRegIDContainer[uiResTypeID-1] = NULL;	 
			return true; 
		} 
		return false; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	UINT ceResourceManager::FindResTypeByName(const char *pResTypeName) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert(NULL != pResTypeName); 
		std::vector::iterator it; 
		bool bFound= false; 
		UINT uiPos=0; 
		for (it = this->m_vRegIDContainer.begin(); it != this->m_vRegIDContainer.end(); it++) { 
			++uiPos; 
			if (0 == strncmp(*it, pResTypeName, strlen(pResTypeName))) { 
				bFound = true;			 
				break; 
			} 
		} 
		if (bFound) 
			return uiPos; 
 
		return 0; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	bool ceResourceManager::Load(ceResource *pResource) 
	{ 
		ce_assert (NULL != pResource); 
		ceFile *pFile = pResource->GetFile(); 
		if (NULL == pFile) 
			return false; 
	 
		ceScratchSystem *pSystem = m_pVFS->GetScratchSystem(); 
		ceScratchFile *pScratch = pResource->GetScratchFile(); 
		size_t sSize = pScratch->GetFileSize(); 
		BYTE *pData = new BYTE[sSize]; 
		size_t sRead = pSystem->ReadScratchFile(pScratch , sSize, pData); 
		 
		// TODO Implement mesh serializer!!! 
		return (sRead == sSize); 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
 
} // Namespace ZFXCE