diff options
Diffstat (limited to 'libtdegames/kgame/kgamepropertylist.h')
-rw-r--r-- | libtdegames/kgame/kgamepropertylist.h | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/libtdegames/kgame/kgamepropertylist.h b/libtdegames/kgame/kgamepropertylist.h new file mode 100644 index 00000000..df8eb604 --- /dev/null +++ b/libtdegames/kgame/kgamepropertylist.h @@ -0,0 +1,258 @@ +/* + This file is part of the KDE games library + Copyright (C) 2001 Martin Heni ([email protected]) + Copyright (C) 2001 Andreas Beckermann ([email protected]) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef __KGAMEPROPERTYLIST_H_ +#define __KGAMEPROPERTYLIST_H_ + +#include <tqvaluelist.h> + +#include <kdebug.h> + +#include "kgamemessage.h" +#include "kgameproperty.h" +#include "kgamepropertyhandler.h" + +// AB: also see README.LIB! + +template<class type> +class KGamePropertyList : public TQValueList<type>, public KGamePropertyBase +{ +public: + /** + * Typedefs + */ + typedef TQValueListIterator<type> Iterator; + typedef TQValueListConstIterator<type> ConstIterator; + + KGamePropertyList() :TQValueList<type>(), KGamePropertyBase() + { + } + + KGamePropertyList( const KGamePropertyList<type> &a ) : TQValueList<type>(a) + { + } + + uint findIterator(Iterator me) + { + Iterator it; + uint cnt=0; + for( it = this->begin(); it != this->end(); ++it ) + { + if (me==it) + { + return cnt; + } + cnt++; + } + return this->count(); + } + + Iterator insert( Iterator it, const type& d ) + { + it=TQValueList<type>::insert(it,d); + + TQByteArray b; + TQDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdInsert); + int i=findIterator(it); + s << i; + s << d; + if (policy() == PolicyClean || policy() == PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy() == PolicyDirty || policy() == PolicyLocal) + { + extractProperty(b); + } + return it; + } + + void prepend( const type& d) { insert(this->begin(),d); } + + void append( const type& d ) + { + TQByteArray b; + TQDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdAppend); + s << d; + if (policy() == PolicyClean || policy() == PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy() == PolicyDirty || policy() == PolicyLocal) + { + extractProperty(b); + } + } + + Iterator erase( Iterator it ) + { + TQByteArray b; + TQDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdRemove); + int i=findIterator(it); + s << i; + if (policy() == PolicyClean || policy() == PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy() == PolicyDirty || policy() == PolicyLocal) + { + extractProperty(b); + } + //TODO: return value - is it correct for PolicyLocal|PolicyDirty? +// return TQValueList<type>::remove(it); + return it; + } + + Iterator remove( Iterator it ) + { + return erase(it); + } + + void remove( const type& d ) + { + Iterator it=find(d); + remove(it); + } + + void clear() + { + TQByteArray b; + TQDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdClear); + if (policy() == PolicyClean || policy() == PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy() == PolicyDirty || policy() == PolicyLocal) + { + extractProperty(b); + } + } + + void load(TQDataStream& s) + { + kdDebug(11001) << "KGamePropertyList load " << id() << endl; + TQValueList<type>::clear(); + uint size; + type data; + s >> size; + + for (unsigned int i=0;i<size;i++) + { + s >> data; + TQValueList<type>::append(data); + } + if (isEmittingSignal()) emitSignal(); + } + + void save(TQDataStream &s) + { + kdDebug(11001) << "KGamePropertyList save "<<id() << endl; + type data; + uint size=this->count(); + s << size; + Iterator it; + for( it = this->begin(); it != this->end(); ++it ) + { + data=*it; + s << data; + } + } + + void command(TQDataStream &s,int cmd,bool) + { + KGamePropertyBase::command(s, cmd); + kdDebug(11001) << "---> LIST id="<<id()<<" got command ("<<cmd<<") !!!" <<endl; + Iterator it; + switch(cmd) + { + case CmdInsert: + { + uint i; + type data; + s >> i >> data; + it=this->at(i); + TQValueList<type>::insert(it,data); +// kdDebug(11001) << "CmdInsert:id="<<id()<<" i="<<i<<" data="<<data <<endl; + if (isEmittingSignal()) emitSignal(); + break; + } + case CmdAppend: + { + type data; + s >> data; + TQValueList<type>::append(data); +// kdDebug(11001) << "CmdAppend:id=" << id() << " data=" << data << endl; + if (isEmittingSignal()) emitSignal(); + break; + } + case CmdRemove: + { + uint i; + s >> i; + it=this->at(i); + TQValueList<type>::remove(it); + kdDebug(11001) << "CmdRemove:id="<<id()<<" i="<<i <<endl; + if (isEmittingSignal()) emitSignal(); + break; + } + case CmdClear: + { + TQValueList<type>::clear(); + kdDebug(11001) << "CmdClear:id="<<id()<<endl; + if (isEmittingSignal()) emitSignal(); + break; + } + default: + kdDebug(11001) << "Error in KPropertyList::command: Unknown command " << cmd << endl; + } + } + +protected: + void extractProperty(const TQByteArray& b) + // this is called for Policy[Dirty|Local] after putting the stuff into the + // stream + { + TQDataStream s(b, IO_ReadOnly); + int cmd; + int propId; + KGameMessage::extractPropertyHeader(s, propId); + KGameMessage::extractPropertyCommand(s, propId, cmd); + command(s, cmd, true); + } + +}; + +#endif |