kgameproperty.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of the KDE games library
00003     Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
00004     Copyright (C) 2001 Martin Heni (martin@heni-online.de)
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License version 2 as published by the Free Software Foundation.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 /*
00021     $Id$
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  // this is very useful and used by e.g. KGameDialog so
00066  // it is activated by default. Big games may profit by deactivating it to get
00067  // a better performance. 
00068  setEmittingSignal(true);
00069 
00070  setOptimized(false); 
00071  
00072  //setReadOnly(false);
00073  mFlags.bits.locked = false ; // setLocked(false); is NOT possible as it checks whether isLocked() allows to change the status
00074 
00075  // local is default
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 // we don't support changing the id
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  //kdDebug(11001) << k_funcinfo << ": mOwnerP="<< mOwner << " id=" << id()   << endl;
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: // probably in derived classes
00208                 break;
00209  }
00210 }
00211 

Generated on Wed Aug 23 18:04:18 2006 for libkdegames by  doxygen 1.4.6