📄 resource.cpp
字号:
/* $Id: resource.cpp,v 1.26 2003/09/03 22:58:17 mbn Exp $
**
** ClanLib Game SDK
** Copyright (C) 2003 The ClanLib Team
** For a total list of contributers see the file CREDITS.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
*/
#include "Core/precomp.h"
#include "API/Core/Resources/resource.h"
#include "API/Core/Resources/resourcedata.h"
#include "API/Core/Resources/resource_manager.h"
#include "API/Core/System/cl_assert.h"
#include "Core/Resources/resource_manager_generic.h"
#include "resource_generic.h"
#include <ctype.h>
#include <algorithm>
/////////////////////////////////////////////////////////////////////////////
// CL_Resource construction:
CL_Resource::CL_Resource(
CL_DomElement &element,
CL_ResourceManager *manager)
: impl(0)
{
// std::string lower_name = name;
// std::transform(lower_name.begin(), lower_name.end(), lower_name.begin(), tolower);
impl = new CL_Resource_Generic(element, manager->impl);
impl->add_ref();
}
CL_Resource::CL_Resource(const CL_Resource ©)
: impl(NULL)
{
impl = copy.impl;
if (impl) impl->add_ref();
}
CL_Resource::CL_Resource(CL_Resource_Generic *impl)
: impl(impl)
{
if (impl) impl->add_ref();
}
CL_Resource::CL_Resource()
: impl(NULL)
{
}
CL_Resource::~CL_Resource()
{
if (impl) impl->release_ref();
}
/////////////////////////////////////////////////////////////////////////////
// CL_Resource attributes:
std::string CL_Resource::get_type() const
{
if (!impl) return 0;
return impl->element.get_tag_name();
}
std::string CL_Resource::get_name() const
{
if (!impl) return 0;
return impl->element.get_attribute("name");
}
/*
std::string CL_Resource::get_full_location() const
{
CL_InputSourceProvider *provider = (CL_InputSourceProvider *) impl->manager->get_resource_provider();
return provider->get_path(get_location().c_str());
}
*/
CL_DomElement &CL_Resource::get_element()
{
if (!impl)
{
static CL_DomElement null;
return null;
}
return impl->element;
}
CL_ResourceManager CL_Resource::get_manager()
{
return CL_ResourceManager(impl->manager);
}
CL_ResourceData *CL_Resource::get_data(const std::string &name)
{
if (!impl) return 0;
return impl->datas[name];
}
int CL_Resource::get_reference_count() const
{
if (!impl) return 0;
return impl->load_ref;
}
/////////////////////////////////////////////////////////////////////////////
// CL_Resource operations:
void CL_Resource::operator = (const CL_Resource ©)
{
if (impl) impl->release_ref();
impl = copy.impl;
if (impl) impl->add_ref();
}
void CL_Resource::attach_data(const std::string &name, CL_ResourceData *data)
{
impl->datas[name] = data;
}
void CL_Resource::detach_data(CL_ResourceData *data)
{
std::map<std::string, CL_ResourceData *>::iterator it;
for (it = impl->datas.begin(); it != impl->datas.end(); it++)
{
if (it->second == data)
{
impl->datas.erase(it);
break;
}
}
}
void CL_Resource::unload()
{
if (!impl) return;
if (impl->manager == 0) return;
impl->load_ref--;
cl_assert(impl->load_ref >= 0);
if (impl->load_ref == 0)
{
std::map<std::string, CL_ResourceData*>::iterator it;
for (it = impl->datas.begin(); it != impl->datas.end(); ++it)
{
CL_ResourceData *data = it->second;
data->on_unload();
}
}
}
void CL_Resource::load()
{
if (!impl) return;
if (impl->manager == 0) return;
impl->load_ref++;
if (impl->load_ref == 1)
{
std::map<std::string, CL_ResourceData*>::iterator it;
for (it = impl->datas.begin(); it != impl->datas.end(); ++it)
{
CL_ResourceData *data = it->second;
data->on_load();
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CL_Resource implementation:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -