Files
Webcam/include/engine/script/scripted_object.cpp

79 lines
2.1 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "script/scripted_object.h"
#include "script/script_unit.h"
#include "metafile/nml.h"
#include "log/log.h"
using namespace GS::Script;
using namespace GS::NML;
//------------------------------------------------------------------------------
Unit *ScriptedObject::AddUnit(Unit *unit)
{
unit_list.Add(unit);
return unit;
}
bool ScriptedObject::RemoveUnit(Unit *unit)
{
if (!unit || !unit_list.Remove(unit))
return false;
_safe_delete(unit);
return true;
}
Unit *ScriptedObject::GetUnit(const char *script_file, const char *script_class) const
{
ListForeachPtr(Unit *, unit, GetUnitList())
if ((unit->script_file == script_file) && (unit->script_class == script_class))
return unit;
return NULL;
}
void ScriptedObject::RemoveAllUnit()
{ ListDeleteAllPtr(Unit *, unit_list) }
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
bool ScriptedObject::FromMetaTag(Tag &tag)
{
if (tag.name != "ScriptedObject")
__ERR__(__LOG_E__ << "Could not parse scripted object, incorrect root tag (" << tag.name << ").\n", false)
ListDeleteAllPtr(Unit *, unit_list)
NMLTagForeach(pt, tag)
{
if (pt->name == "ScriptUnit")
{
if (Unit *unit = AddUnit(NewUnit()))
if (unit->FromMetaTag(*pt))
unit->Open();
}
else __LOG_W__ << "Unknown tag '" << pt->name << "' in <ScriptedObject>.\n";
}
return true;
}
Tag *ScriptedObject::AsMetaTag() const
{
if (!GetUnitList().GetCount())
return NULL;
Tag *root = new Tag("ScriptedObject");
if (!root)
__ERR__(__LOG_E__ << "Could not create root tag to serialize.\n", NULL)
// Dump script units.
ListForeachPtr(Unit *, unit, GetUnitList())
root->AddChild(unit->AsMetaTag());
return root;
}
//------------------------------------------------------------------------------
ScriptedObject::~ScriptedObject()
{ RemoveAllUnit(); }