You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/arts/modules/common/env_container_impl.cpp

137 lines
2.5 KiB

#include "artsmodulescommon.h"
#include "../runtime/sequenceutils.h"
#include <debug.h>
using namespace std;
namespace Arts {
namespace Environment {
class Container_impl : virtual public Container_skel {
protected:
string _dataDirectory;
Context _context;
vector<Item> _items;
Container self() { return Container::_from_base(_copy()); }
public:
~Container_impl()
{
// tell items we're going to leave before actually going away
clear();
}
string dataDirectory()
{
return _dataDirectory;
}
void dataDirectory(const string& newDataDirectory)
{
if(newDataDirectory != _dataDirectory)
{
_dataDirectory = newDataDirectory;
dataDirectory_changed(newDataDirectory);
}
}
Context context()
{
return _context;
}
void context(Context newContext)
{
_context = newContext;
}
vector<Item> *items()
{
return new vector<Item>(_items);
}
vector<string> *saveToList()
{
vector<string> *result = new vector<string>;
vector<Item>::iterator ii;
for(ii=_items.begin(); ii != _items.end(); ii++)
{
sqprintf(result,"item=%s",ii->_interfaceName().c_str());
vector<string> *itemresult = ii->saveToList();
addSubStringSeq(result,itemresult);
delete itemresult;
}
return result;
}
void clear()
{
/* FIXME: performance ;) */
while(!_items.empty())
removeItem(_items.front());
}
void loadFromList(const vector<string>& strlist)
{
string cmd,param;
unsigned long i;
clear();
for(i=0;i<strlist.size();i++)
{
if(parse_line(strlist[i],cmd,param)) // otherwise: empty or comment
{
if(cmd == "item")
{
Item item = createItem(param);
vector<string> *itemlist = getSubStringSeq(&strlist,i);
if(!item.isNull())
item.loadFromList(*itemlist);
else
{
// error handling
assert(false);
}
delete itemlist;
}
}
}
}
vector<Item>::iterator findItem(Item item)
{
vector<Item>::iterator i;
for(i = _items.begin(); i != _items.end(); i++)
if(i->_isEqual(item)) return i;
return _items.end();
}
void addItem(Item item)
{
vector<Item>::iterator i = findItem(item);
arts_return_if_fail(i == _items.end());
_items.push_back(item);
item.setContainer(self());
}
Item createItem(const string& name)
{
Item item = SubClass(name);
addItem(item);
return item;
}
void removeItem(Item item)
{
vector<Item>::iterator i = findItem(item);
arts_return_if_fail(i != _items.end());
_items.erase(i);
item.setContainer(Container::null());
}
};
REGISTER_IMPLEMENTATION(Container_impl);
}
}