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