00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#include "kgameproperty.h"
00025
#include "kgamepropertyhandler.h"
00026
#include "kgamemessage.h"
00027
#include "kplayer.h"
00028
#include "kgame.h"
00029
00030
#define KPLAYERHANDLER_LOAD_COOKIE 6239
00031
00032
KGamePropertyBase::KGamePropertyBase(
int id,
KGame* parent)
00033 {
00034 init();
00035
registerData(
id, parent);
00036 }
00037
00038
KGamePropertyBase::KGamePropertyBase(
int id,
KPlayer* parent)
00039 {
00040 init();
00041
registerData(
id, parent);
00042 }
00043
00044 KGamePropertyBase::KGamePropertyBase(
int id,
KGamePropertyHandler* owner)
00045 {
00046 init();
00047
registerData(
id, owner);
00048 }
00049
00050 KGamePropertyBase::KGamePropertyBase()
00051 {
00052 init();
00053 }
00054
00055 KGamePropertyBase::~KGamePropertyBase()
00056 {
00057 unregisterData();
00058 }
00059
00060
void KGamePropertyBase::init()
00061 {
00062 mOwner = 0;
00063
setDirty(
false);
00064
00065
00066
00067
00068
setEmittingSignal(
true);
00069
00070
setOptimized(
false);
00071
00072
00073 mFlags.bits.locked =
false ;
00074
00075
00076
setPolicy(PolicyLocal);
00077 }
00078
00079 int KGamePropertyBase::registerData(
int id,
KGame* owner,
QString name)
00080 {
return registerData(
id, owner->
dataHandler(), name); }
00081
00082 int KGamePropertyBase::registerData(
int id,
KPlayer* owner,
QString name)
00083 {
return registerData(
id, owner->
dataHandler(), name); }
00084
00085 int KGamePropertyBase::registerData(
KGamePropertyHandler* owner,PropertyPolicy p,
QString name)
00086 {
return registerData(-1, owner,p, name); }
00087
00088 int KGamePropertyBase::registerData(
int id,
KGamePropertyHandler* owner,
QString name)
00089 {
return registerData(
id, owner,PolicyUndefined, name); }
00090
00091 int KGamePropertyBase::registerData(
int id,
KGamePropertyHandler* owner,PropertyPolicy p,
QString name)
00092 {
00093
00094
if (!owner) {
00095 kdWarning(11001) << k_funcinfo <<
"Resetting owner=0. Sure you want to do this?" << endl;
00096 mOwner=0;
00097
return -1;
00098 }
00099
if (!mOwner) {
00100
if (
id==-1) {
00101
id=owner->
uniquePropertyId();
00102 }
00103 mId =
id;
00104 mOwner = owner;
00105 mOwner->
addProperty(
this, name);
00106
if (p!=PolicyUndefined) {
00107
setPolicy(p);
00108 }
else {
00109
setPolicy(mOwner->
policy());
00110 }
00111 }
00112
return mId;
00113 }
00114
00115
void KGamePropertyBase::unregisterData()
00116 {
00117
if (!mOwner) {
00118
return;
00119 }
00120 mOwner->
removeProperty(
this);
00121 mOwner = 0;
00122 }
00123
00124 bool KGamePropertyBase::sendProperty()
00125 {
00126
QByteArray b;
00127
QDataStream s(b, IO_WriteOnly);
00128 KGameMessage::createPropertyHeader(s,
id());
00129
save(s);
00130
if (mOwner) {
00131
return mOwner->
sendProperty(s);
00132 }
else {
00133 kdError(11001) << k_funcinfo <<
"Cannot send because there is no receiver defined" << endl;
00134
return false;
00135 }
00136 }
00137
00138 bool KGamePropertyBase::sendProperty(
const QByteArray& data)
00139 {
00140
QByteArray b;
00141
QDataStream s(b, IO_WriteOnly);
00142 KGameMessage::createPropertyHeader(s,
id());
00143 s.writeRawBytes(data.data(), data.size());
00144
if (mOwner) {
00145
return mOwner->
sendProperty(s);
00146 }
else {
00147 kdError(11001) << k_funcinfo <<
": Cannot send because there is no receiver defined" << endl;
00148
return false;
00149 }
00150 }
00151
00152 bool KGamePropertyBase::lock()
00153 {
00154
if (
isLocked()) {
00155
return false;
00156 }
00157
setLock(
true);
00158
return true;
00159 }
00160
00161 bool KGamePropertyBase::unlock(
bool force)
00162 {
00163
if (
isLocked() && !force) {
00164
return false;
00165 }
00166
setLock(
false);
00167
return true;
00168 }
00169
00170 void KGamePropertyBase::setLock(
bool l)
00171 {
00172
QByteArray b;
00173
QDataStream s(b, IO_WriteOnly);
00174 KGameMessage::createPropertyCommand(s, IdCommand,
id(), CmdLock);
00175
00176 s << (Q_INT8)l;
00177
if (mOwner) {
00178 mOwner->
sendProperty(s);
00179 }
else {
00180 kdError(11001) << k_funcinfo <<
": Cannot send because there is no receiver defined" << endl;
00181
return ;
00182 }
00183 }
00184
00185 void KGamePropertyBase::emitSignal()
00186 {
00187
00188
if (mOwner ) {
00189 mOwner->
emitSignal(
this);
00190 }
else {
00191 kdError(11001) << k_funcinfo <<
":id="<<
id()<<
" Cannot emitSignal because there is no handler set" << endl;
00192 }
00193 }
00194
00195 void KGamePropertyBase::command(
QDataStream& s,
int cmd,
bool isSender)
00196 {
00197
switch (cmd) {
00198
case CmdLock:
00199 {
00200
if (!isSender) {
00201 Q_INT8 locked;
00202 s >> locked;
00203 mFlags.bits.locked = (
bool)locked ;
00204
break;
00205 }
00206 }
00207
default:
00208
break;
00209 }
00210 }
00211