diff options
Diffstat (limited to 'libkdegames/kgame/kgamepropertyarray.h')
-rw-r--r-- | libkdegames/kgame/kgamepropertyarray.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/libkdegames/kgame/kgamepropertyarray.h b/libkdegames/kgame/kgamepropertyarray.h new file mode 100644 index 00000000..f91bd75c --- /dev/null +++ b/libkdegames/kgame/kgamepropertyarray.h @@ -0,0 +1,309 @@ +/* + This file is part of the KDE games library + Copyright (C) 2001 Martin Heni (martin@heni-online.de) + Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de) + + 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 __KGAMEPROPERTYARRAY_H_ +#define __KGAMEPROPERTYARRAY_H_ + +#include <qdatastream.h> +#include <kdebug.h> + +#include "kgamemessage.h" +#include "kgameproperty.h" +#include "kgamepropertyhandler.h" + + +template<class type> +class KGamePropertyArray : public QMemArray<type>, public KGamePropertyBase +{ +public: + KGamePropertyArray() :QMemArray<type>(), KGamePropertyBase() + { + //kdDebug(11001) << "KGamePropertyArray init" << endl; + } + + KGamePropertyArray( int size ) + { + resize(size); + } + + KGamePropertyArray( const KGamePropertyArray<type> &a ) : QMemArray<type>(a) + { + } + + bool resize( uint size ) + { + if (size!=QMemArray<type>::size()) + { + bool a=true; + QByteArray b; + QDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdResize); + s << size ; + if (policy()==PolicyClean || policy()==PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + extractProperty(b); +// a=QMemArray<type>::resize(size);// FIXME: return value! + } + return a; + } + else return true; + } + + void setAt(uint i,type data) + { + QByteArray b; + QDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdAt); + s << i ; + s << data; + if (policy()==PolicyClean || policy()==PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + extractProperty(b); + } + //kdDebug(11001) << "KGamePropertyArray setAt send COMMAND for id="<<id() << " type=" << 1 << " at(" << i<<")="<<data << endl; + } + + type at( uint i ) const + { + return QMemArray<type>::at(i); + } + + type operator[]( int i ) const + { + return QMemArray<type>::at(i); + } + + KGamePropertyArray<type> &operator=(const KGamePropertyArray<type> &a) + { + return assign(a); + } + + bool truncate( uint pos ) + { + return resize(pos); + } + + bool fill( const type &data, int size = -1 ) + { + bool r=true; + QByteArray b; + QDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdFill); + s << data; + s << size ; + if (policy()==PolicyClean || policy()==PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + extractProperty(b); +// r=QMemArray<type>::fill(data,size);//FIXME: return value! + } + return r; + } + + KGamePropertyArray<type>& assign( const KGamePropertyArray<type>& a ) + { +// note: send() has been replaced by sendProperty so it might be broken now! + if (policy()==PolicyClean || policy()==PolicyDirty) + { + sendProperty(); + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + QMemArray<type>::assign(a); + } + return *this; + } + KGamePropertyArray<type>& assign( const type *a, uint n ) + { + if (policy()==PolicyClean || policy()==PolicyDirty) + { + sendProperty(); + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + QMemArray<type>::assign(a,n); + } + return *this; + } + KGamePropertyArray<type>& duplicate( const KGamePropertyArray<type>& a ) + { + if (policy()==PolicyClean || policy()==PolicyDirty) + { + sendProperty(); + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + QMemArray<type>::duplicate(a); + } + return *this; + } + KGamePropertyArray<type>& duplicate( const type *a, uint n ) + { + if (policy()==PolicyClean || policy()==PolicyDirty) + { + sendProperty(); + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + QMemArray<type>::duplicate(a,n); + } + return *this; + } + KGamePropertyArray<type>& setRawData( const type *a, uint n ) + { + if (policy()==PolicyClean || policy()==PolicyDirty) + { + sendProperty(); + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + QMemArray<type>::setRawData(a,n); + } + return *this; + } + void sort() + { + QByteArray b; + QDataStream s(b, IO_WriteOnly); + KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,id(),CmdSort); + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + if (mOwner) + { + mOwner->sendProperty(s); + } + } + if (policy()==PolicyLocal || policy()==PolicyDirty) + { + extractProperty(b); + } + } + + void load(QDataStream& s) + { + //kdDebug(11001) << "KGamePropertyArray load " << id() << endl; + type data; + for (unsigned int i=0; i<QMemArray<type>::size(); i++) + { + s >> data; + QMemArray<type>::at(i)=data; + } + if (isEmittingSignal()) + { + emitSignal(); + } + } + void save(QDataStream &s) + { + //kdDebug(11001) << "KGamePropertyArray save "<<id() << endl; + for (unsigned int i=0; i<QMemArray<type>::size(); i++) + { + s << at(i); + } + } + + void command(QDataStream &s,int cmd,bool) + { + KGamePropertyBase::command(s, cmd); + //kdDebug(11001) << "Array id="<<id()<<" got command ("<<cmd<<") !!!" <<endl; + switch(cmd) + { + case CmdAt: + { + uint i; + type data; + s >> i >> data; + QMemArray<type>::at(i)=data; + //kdDebug(11001) << "CmdAt:id="<<id()<<" i="<<i<<" data="<<data <<endl; + if (isEmittingSignal()) + { + emitSignal(); + } + break; + } + case CmdResize: + { + uint size; + s >> size; + //kdDebug(11001) << "CmdResize:id="<<id()<<" oldsize="<<QMemArray<type>::size()<<" newsize="<<size <<endl; + if (QMemArray<type>::size() != size) + { + QMemArray<type>::resize(size); + } + break; + } + case CmdFill: + { + int size; + type data; + s >> data >> size; + //kdDebug(11001) << "CmdFill:id="<<id()<<"size="<<size <<endl; + QMemArray<type>::fill(data,size); + if (isEmittingSignal()) + { + emitSignal(); + } + break; + } + case CmdSort: + { + //kdDebug(11001) << "CmdSort:id="<<id()<<endl; + QMemArray<type>::sort(); + break; + } + default: + kdError(11001) << "Error in KPropertyArray::command: Unknown command " << cmd << endl; + break; + } + } +protected: + void extractProperty(const QByteArray& b) + { + QDataStream s(b, IO_ReadOnly); + int cmd; + int propId; + KGameMessage::extractPropertyHeader(s, propId); + KGameMessage::extractPropertyCommand(s, propId, cmd); + command(s, cmd, true); + } + +}; + +#endif |