00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef __KGAMEPROPERTYLIST_H_
00022
#define __KGAMEPROPERTYLIST_H_
00023
00024
#include <qvaluelist.h>
00025
00026
#include <kdebug.h>
00027
00028
#include "kgamemessage.h"
00029
#include "kgameproperty.h"
00030
#include "kgamepropertyhandler.h"
00031
00032
00033
00034
template<
class type>
00035
class KGamePropertyList :
public QValueList<type>,
public KGamePropertyBase
00036 {
00037
public:
00041
typedef QValueListIterator<type> Iterator;
00042
typedef QValueListConstIterator<type> ConstIterator;
00043
00044 KGamePropertyList() :
QValueList<type>(),
KGamePropertyBase()
00045 {
00046 }
00047
00048 KGamePropertyList(
const KGamePropertyList<type> &a ) :
QValueList<type>(a)
00049 {
00050 send();
00051 }
00052
00053 uint findIterator(Iterator me)
00054 {
00055 Iterator it;
00056 uint cnt=0;
00057
for( it = begin(); it != end(); ++it )
00058 {
00059
if (me==it)
00060 {
00061
return cnt;
00062 }
00063 cnt++;
00064 }
00065
return count();
00066 }
00067
00068 Iterator insert( Iterator it,
const type& d )
00069 {
00070 it=
QValueList<type>::insert(it,d);
00071
00072
QByteArray b;
00073
QDataStream s(b, IO_WriteOnly);
00074 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdInsert);
00075
int i=findIterator(it);
00076 s << i;
00077 s << d;
00078
if (
policy() == PolicyClean ||
policy() == PolicyDirty)
00079 {
00080
if (mOwner)
00081 {
00082 mOwner->
sendProperty(s);
00083 }
00084 }
00085
if (
policy() == PolicyDirty ||
policy() == PolicyLocal)
00086 {
00087 extractProperty(b);
00088 }
00089
return it;
00090 }
00091
00092
void prepend(
const type& d) { insert(begin(),d); }
00093
00094
void append(
const type& d )
00095 {
00096
QByteArray b;
00097
QDataStream s(b, IO_WriteOnly);
00098 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdAppend);
00099 s << d;
00100
if (
policy() == PolicyClean ||
policy() == PolicyDirty)
00101 {
00102
if (mOwner)
00103 {
00104 mOwner->
sendProperty(s);
00105 }
00106 }
00107
if (
policy() == PolicyDirty ||
policy() == PolicyLocal)
00108 {
00109 extractProperty(b);
00110 }
00111 }
00112
00113 Iterator erase( Iterator it )
00114 {
00115
QByteArray b;
00116
QDataStream s(b, IO_WriteOnly);
00117 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdRemove);
00118
int i=findIterator(it);
00119 s << i;
00120
if (
policy() == PolicyClean ||
policy() == PolicyDirty)
00121 {
00122
if (mOwner)
00123 {
00124 mOwner->
sendProperty(s);
00125 }
00126 }
00127
if (
policy() == PolicyDirty ||
policy() == PolicyLocal)
00128 {
00129 extractProperty(b);
00130 }
00131
00132
00133
return it;
00134 }
00135
00136 Iterator remove( Iterator it )
00137 {
00138
return erase(it);
00139 }
00140
00141
void remove(
const type& d )
00142 {
00143 Iterator it=find(d);
00144 remove(it);
00145 }
00146
00147
void clear()
00148 {
00149
QByteArray b;
00150
QDataStream s(b, IO_WriteOnly);
00151 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdClear);
00152
if (
policy() == PolicyClean ||
policy() == PolicyDirty)
00153 {
00154
if (mOwner)
00155 {
00156 mOwner->
sendProperty(s);
00157 }
00158 }
00159
if (
policy() == PolicyDirty ||
policy() == PolicyLocal)
00160 {
00161 extractProperty(b);
00162 }
00163 }
00164
00165
void load(
QDataStream& s)
00166 {
00167 kdDebug(11001) <<
"KGamePropertyList load " <<
id() << endl;
00168
QValueList<type>::clear();
00169 uint size;
00170 type data;
00171 s >> size;
00172
00173
for (
unsigned int i=0;i<size;i++)
00174 {
00175 s >> data;
00176
QValueList<type>::append(data);
00177 }
00178
if (
isEmittingSignal())
emitSignal();
00179 }
00180
00181
void save(
QDataStream &s)
00182 {
00183 kdDebug(11001) <<
"KGamePropertyList save "<<
id() << endl;
00184 type data;
00185 uint size=count();
00186 s << size;
00187 Iterator it;
00188
for( it = begin(); it != end(); ++it )
00189 {
00190 data=*it;
00191 s << data;
00192 }
00193 }
00194
00195
void command(
QDataStream &s,
int cmd,
bool)
00196 {
00197
KGamePropertyBase::command(s, cmd);
00198 kdDebug(11001) <<
"---> LIST id="<<
id()<<
" got command ("<<cmd<<
") !!!" <<endl;
00199 Iterator it;
00200
switch(cmd)
00201 {
00202
case CmdInsert:
00203 {
00204 uint i;
00205 type data;
00206 s >> i >> data;
00207 it=at(i);
00208 QValueList<type>::insert(it,data);
00209
00210
if (
isEmittingSignal())
emitSignal();
00211
break;
00212 }
00213
case CmdAppend:
00214 {
00215 type data;
00216 s >> data;
00217
QValueList<type>::append(data);
00218
00219
if (
isEmittingSignal())
emitSignal();
00220
break;
00221 }
00222
case CmdRemove:
00223 {
00224 uint i;
00225 s >> i;
00226 it=at(i);
00227
QValueList<type>::remove(it);
00228 kdDebug(11001) <<
"CmdRemove:id="<<
id()<<
" i="<<i <<endl;
00229
if (
isEmittingSignal())
emitSignal();
00230
break;
00231 }
00232
case CmdClear:
00233 {
00234
QValueList<type>::clear();
00235 kdDebug(11001) <<
"CmdClear:id="<<
id()<<endl;
00236
if (
isEmittingSignal())
emitSignal();
00237
break;
00238 }
00239
default:
00240 kdDebug(11001) <<
"Error in KPropertyList::command: Unknown command " << cmd << endl;
00241 }
00242 }
00243
00244
protected:
00245
void extractProperty(
const QByteArray& b)
00246
00247
00248 {
00249
QDataStream s(b, IO_ReadOnly);
00250
int cmd;
00251
int propId;
00252 KGameMessage::extractPropertyHeader(s, propId);
00253 KGameMessage::extractPropertyCommand(s, propId, cmd);
00254 command(s, cmd,
true);
00255 }
00256
00257 };
00258
00259
#endif