// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "egs_pd.h"
namespace EGSPD
{
/* -----------------------------------------
* Static Implementation of CGuildPD
* ----------------------------------------- */
TGuildId CGuildPD::getId() const
{
return _Id;
}
uint64 CGuildPD::getMoney() const
{
return _Money;
}
void CGuildPD::setMoney(uint64 __v, bool forceWrite)
{
if ((_Money != __v) || forceWrite)
{
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(1), __v);
}
_Money = __v;
}
uint32 CGuildPD::getCreationDate() const
{
return _CreationDate;
}
void CGuildPD::setCreationDate(uint32 __v, bool forceWrite)
{
if ((_CreationDate != __v) || forceWrite)
{
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(2), __v);
}
_CreationDate = __v;
}
CPeople::TPeople CGuildPD::getRace() const
{
return _Race;
}
void CGuildPD::setRace(CPeople::TPeople __v, bool forceWrite)
{
nlassert(__v::iterator _it = _Members.find(__k);
return (_it==_Members.end() ? NULL : (*_it).second);
}
const CGuildMemberPD* CGuildPD::getMembers(const TCharacterId& __k) const
{
std::map::const_iterator _it = _Members.find(__k);
return (_it==_Members.end() ? NULL : (*_it).second);
}
std::map::iterator CGuildPD::getMembersBegin()
{
return _Members.begin();
}
std::map::iterator CGuildPD::getMembersEnd()
{
return _Members.end();
}
std::map::const_iterator CGuildPD::getMembersBegin() const
{
return _Members.begin();
}
std::map::const_iterator CGuildPD::getMembersEnd() const
{
return _Members.end();
}
const std::map & CGuildPD::getMembers() const
{
return _Members;
}
void CGuildPD::setMembers(CGuildMemberPD* __v)
{
if (__v == NULL) return;
TCharacterId __k = __v->getId();
std::map::iterator _it = _Members.find(__k);
if (_it != _Members.end())
{
CGuildMemberPD* __prev = (*_it).second;
if (__prev == __v) return;
__prev->pds__setParent(NULL);
__prev->pds__unregister();
__prev->pds__destroy();
delete __prev;
}
__v->pds__setParent(this);
_Members[__k] = __v;
{
// callback the manager
IGuildManager::getInstance().guildMemberListChanged(this);
}
}
void CGuildPD::deleteFromMembers(const TCharacterId &__k)
{
std::map::iterator __it = _Members.find(__k);
if (__it == _Members.end()) return;
CGuildMemberPD* __o = (*__it).second;
__o->pds__unregister();
__o->pds__destroy();
delete __o;
{
// callback the manager
IGuildManager::getInstance().guildMemberListChanged(this);
}
}
CGuildFameContainerPD* CGuildPD::getFameContainer()
{
return _FameContainer;
}
const CGuildFameContainerPD* CGuildPD::getFameContainer() const
{
return _FameContainer;
}
void CGuildPD::setFameContainer(CGuildFameContainerPD* __v)
{
if (_FameContainer != NULL)
{
_FameContainer->pds__setParent(NULL);
}
__v->pds__setParent(this);
_FameContainer = __v;
}
CGuildContainerPD* CGuildPD::getParent()
{
return _Parent;
}
const CGuildContainerPD* CGuildPD::getParent() const
{
return _Parent;
}
void CGuildPD::clear()
{
_Money = (uint64)0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(1), (uint64)0);
_CreationDate = 0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(2), 0);
_Race = (CPeople::TPeople)0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(3), (uint32)(CPeople::TPeople)0);
_Icon = (uint64)0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(4), (uint64)0);
_Building = 0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(5), 0);
_Version = 0;
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(6), 0);
for (std::map::iterator __it=_Members.begin(); __it!=_Members.end(); )
{
std::map::iterator __itr=__it++;
CGuildMemberPD* __o = (*__itr).second;
__o->pds__unregister();
__o->pds__destroy();
delete __o;
}
_Members.clear();
CGuildFameContainerPD* __o = _FameContainer;
__o->pds__unregister();
__o->pds__destroy();
delete __o;
}
CGuildPD* CGuildPD::cast(RY_PDS::IPDBaseData* obj)
{
return (obj->getTable() == 4) ? static_cast(obj) : NULL;
}
const CGuildPD* CGuildPD::cast(const RY_PDS::IPDBaseData* obj)
{
return (obj->getTable() == 4) ? static_cast(obj) : NULL;
}
void CGuildPD::setFactory(RY_PDS::TPDFactory userFactory)
{
pds_static__setFactory(userFactory);
}
CGuildPD* CGuildPD::create(const TGuildId &Id)
{
CGuildPD *__o = static_cast(PDSLib.create(4));
__o->pds__init(Id);
__o->pds__register();
__o->pds__notifyInit();
return __o;
}
void CGuildPD::apply(CPersistentDataRecord &__pdr)
{
uint16 __Tok_MapKey = __pdr.addString("__Key__");
uint16 __Tok_MapVal = __pdr.addString("__Val__");
uint16 __Tok_ClassName = __pdr.addString("__Class__");
uint16 __TokId = __pdr.addString("Id");
uint16 __TokMoney = __pdr.addString("Money");
uint16 __TokCreationDate = __pdr.addString("CreationDate");
uint16 __TokRace = __pdr.addString("Race");
uint16 __TokIcon = __pdr.addString("Icon");
uint16 __TokBuilding = __pdr.addString("Building");
uint16 __TokVersion = __pdr.addString("Version");
uint16 __TokMembers = __pdr.addString("Members");
uint16 __TokFameContainer = __pdr.addString("FameContainer");
_Parent = NULL;
while (!__pdr.isEndOfStruct())
{
if (false) {}
else if (__pdr.peekNextToken() == __TokId)
{
__pdr.pop(__TokId, _Id);
}
else if (__pdr.peekNextToken() == __TokMoney)
{
__pdr.pop(__TokMoney, _Money);
}
else if (__pdr.peekNextToken() == __TokCreationDate)
{
__pdr.pop(__TokCreationDate, _CreationDate);
}
else if (__pdr.peekNextToken() == __TokRace)
{
{
std::string valuename;
__pdr.pop(__TokRace, valuename);
_Race = CPeople::fromString(valuename);
}
}
else if (__pdr.peekNextToken() == __TokIcon)
{
__pdr.pop(__TokIcon, _Icon);
}
else if (__pdr.peekNextToken() == __TokBuilding)
{
__pdr.pop(__TokBuilding, _Building);
}
else if (__pdr.peekNextToken() == __TokVersion)
{
__pdr.pop(__TokVersion, _Version);
}
// apply Members
else if (__pdr.peekNextToken() == __TokMembers)
{
__pdr.popStructBegin(__TokMembers);
while (!__pdr.isEndOfStruct())
{
TCharacterId key;
__pdr.pop(__Tok_MapKey, key);
__pdr.popStructBegin(__Tok_MapVal);
CGuildMemberPD* obj;
obj = NULL;
if (__pdr.peekNextToken() == __Tok_ClassName)
{
std::string __className;
__pdr.pop(__Tok_ClassName, __className);
obj = CGuildMemberPD::cast(PDSLib.create(__className));
if (obj != NULL)
{
__pdr.popStructBegin(__TokMembers);
obj->apply(__pdr);
obj->pds__setParentUnnotified(this);
__pdr.popStructEnd(__TokMembers);
}
else
{
__pdr.skipStruct();
}
}
if (obj != NULL)
{
_Members[key] = obj;
}
__pdr.popStructEnd(__Tok_MapVal);
}
__pdr.popStructEnd(__TokMembers);
}
// end of apply Members
// apply FameContainer
else if (__pdr.peekNextToken() == __TokFameContainer)
{
__pdr.popStructBegin(__TokFameContainer);
_FameContainer = NULL;
if (__pdr.peekNextToken() == __Tok_ClassName)
{
std::string __className;
__pdr.pop(__Tok_ClassName, __className);
_FameContainer = CGuildFameContainerPD::cast(PDSLib.create(__className));
if (_FameContainer != NULL)
{
__pdr.popStructBegin(__TokFameContainer);
_FameContainer->apply(__pdr);
_FameContainer->pds__setParentUnnotified(this);
__pdr.popStructEnd(__TokFameContainer);
}
else
{
__pdr.skipStruct();
}
}
__pdr.popStructEnd(__TokFameContainer);
}
else
{
// The following warning was removed because the pdr object for the guild contains both the stuff managed here and the stuff managed in guild_manager/guild.cpp
// - the latter is ignored by the code here. This is normal behaviour and doesn't deserve a warning
// nlwarning("Skipping unrecognised token: %s", __pdr.peekNextTokenName().c_str());
__pdr.skipData();
}
}
}
void CGuildPD::store(CPersistentDataRecord &__pdr) const
{
uint16 __Tok_MapKey = __pdr.addString("__Key__");
uint16 __Tok_MapVal = __pdr.addString("__Val__");
uint16 __Tok_ClassName = __pdr.addString("__Class__");
uint16 __TokId = __pdr.addString("Id");
uint16 __TokMoney = __pdr.addString("Money");
uint16 __TokCreationDate = __pdr.addString("CreationDate");
uint16 __TokRace = __pdr.addString("Race");
uint16 __TokIcon = __pdr.addString("Icon");
uint16 __TokBuilding = __pdr.addString("Building");
uint16 __TokVersion = __pdr.addString("Version");
uint16 __TokMembers = __pdr.addString("Members");
uint16 __TokFameContainer = __pdr.addString("FameContainer");
__pdr.push(__TokId, _Id);
__pdr.push(__TokMoney, _Money);
__pdr.push(__TokCreationDate, _CreationDate);
{
std::string valuename = CPeople::toString(_Race);
__pdr.push(__TokRace, valuename);
}
__pdr.push(__TokIcon, _Icon);
__pdr.push(__TokBuilding, _Building);
__pdr.push(__TokVersion, _Version);
// store Members
__pdr.pushStructBegin(__TokMembers);
for (std::map::const_iterator it=_Members.begin(); it!=_Members.end(); ++it)
{
TCharacterId key = (*it).first;
__pdr.push(__Tok_MapKey, key);
__pdr.pushStructBegin(__Tok_MapVal);
if ((*it).second != NULL)
{
std::string __className = PDSLib.getClassName((*it).second);
__pdr.push(__Tok_ClassName, __className);
__pdr.pushStructBegin(__TokMembers);
(*it).second->store(__pdr);
__pdr.pushStructEnd(__TokMembers);
}
__pdr.pushStructEnd(__Tok_MapVal);
}
__pdr.pushStructEnd(__TokMembers);
// end of store Members
// store FameContainer
__pdr.pushStructBegin(__TokFameContainer);
if (_FameContainer != NULL)
{
std::string __className = PDSLib.getClassName(_FameContainer);
__pdr.push(__Tok_ClassName, __className);
__pdr.pushStructBegin(__TokFameContainer);
_FameContainer->store(__pdr);
__pdr.pushStructEnd(__TokFameContainer);
}
__pdr.pushStructEnd(__TokFameContainer);
}
void CGuildPD::init()
{
}
void CGuildPD::release()
{
}
void CGuildPD::pds__init(const TGuildId &Id)
{
_Id = Id;
_Money = (uint64)0;
_CreationDate = 0;
_Race = (CPeople::TPeople)0;
_Icon = (uint64)0;
_Building = 0;
_Version = 0;
_FameContainer = NULL;
_Parent = NULL;
}
void CGuildPD::pds__destroy()
{
for (std::map::iterator __it=_Members.begin(); __it!=_Members.end(); )
{
std::map::iterator __itr=__it++;
CGuildMemberPD* __o = ((*__itr).second);
if (__o != NULL)
{
__o->pds__destroy();
delete __o;
}
}
_Members.clear();
if (_FameContainer != NULL)
{
CGuildFameContainerPD* __o = _FameContainer;
__o->pds__destroy();
delete __o;
}
}
void CGuildPD::pds__fetch(RY_PDS::CPData &data)
{
data.serial(_Id);
data.serial(_Money);
data.serial(_CreationDate);
data.serialEnum(_Race);
data.serial(_Icon);
data.serial(_Building);
data.serial(_Version);
RY_PDS::TTableIndex tableIndex;
RY_PDS::TRowIndex rowIndex;
do
{
// read table and row, create an object, affect to the ref, and fetch it
data.serial(tableIndex, rowIndex);
if (rowIndex == RY_PDS::INVALID_ROW_INDEX || tableIndex == RY_PDS::INVALID_TABLE_INDEX) break;
TCharacterId __k;
data.serial(__k);
CGuildMemberPD* __o = static_cast(PDSLib.create(tableIndex));
_Members.insert(std::pair(__k, __o));
PDSLib.setRowIndex(rowIndex, __o);
__o->pds__fetch(data);
__o->pds__setParentUnnotified(this);
}
while (true);
// read table and row, create an object, affect to the ref, and fetch it
_FameContainer = NULL;
data.serial(tableIndex, rowIndex);
if (rowIndex != RY_PDS::INVALID_ROW_INDEX && tableIndex != RY_PDS::INVALID_TABLE_INDEX)
{
_FameContainer = static_cast(PDSLib.create(tableIndex));
PDSLib.setRowIndex(rowIndex, _FameContainer);
_FameContainer->pds__fetch(data);
_FameContainer->pds__setParentUnnotified(this);
}
_Parent = NULL;
}
void CGuildPD::pds__register()
{
__BaseRow = _IndexAllocator.allocate();
PDSLib.allocateRow(4, __BaseRow, 0);
pds__registerAttributes();
}
void CGuildPD::pds__registerAttributes()
{
if (RY_PDS::PDVerbose) nldebug("CGuildPD: registerAttributes %u:%u", 4, __BaseRow);
PDSLib.set(4, __BaseRow, (RY_PDS::TColumnIndex)(0), _Id);
}
void CGuildPD::pds__unregister()
{
pds__unregisterAttributes();
PDSLib.deallocateRow(4, __BaseRow);
_IndexAllocator.deallocate(__BaseRow);
}
void CGuildPD::pds__unregisterAttributes()
{
if (RY_PDS::PDVerbose) nldebug("CGuildPD: unregisterAttributes %u:%u", 4, __BaseRow);
pds__setParent(NULL);
for (std::map::iterator __it=_Members.begin(); __it!=_Members.end(); )
{
std::map::iterator __itr=__it++;
CGuildMemberPD* __o = (*__itr).second;
__o->pds__unregister();
__o->pds__destroy();
delete __o;
}
if (_FameContainer != NULL)
{
CGuildFameContainerPD* __o = _FameContainer;
__o->pds__unregister();
__o->pds__destroy();
delete __o;
}
}
void CGuildPD::pds__setParent(CGuildContainerPD* __parent)
{
if (_Parent != NULL)
{
_Parent->pds__unlinkGuilds(_Id);
}
_Parent = __parent;
PDSLib.setParent(4, getRow(), (RY_PDS::TColumnIndex)(9), (__parent != NULL ? RY_PDS::CObjectIndex(5, __parent->getRow()) : RY_PDS::CObjectIndex::null()));
}
void CGuildPD::pds__setParentUnnotified(CGuildContainerPD* __parent)
{
_Parent = __parent;
}
void CGuildPD::pds__notifyInit()
{
init();
for (std::map::iterator __it=_Members.begin(); __it!=_Members.end(); )
{
std::map::iterator __itr=__it++;
(*__itr).second->pds__notifyInit();
}
if (_FameContainer != NULL)
{
_FameContainer->pds__notifyInit();
}
}
void CGuildPD::pds__notifyRelease()
{
release();
PDSLib.release(4, __BaseRow);
for (std::map::iterator __it=_Members.begin(); __it!=_Members.end(); )
{
std::map::iterator __itr=__it++;
(*__itr).second->pds__notifyRelease();
}
if (_FameContainer != NULL)
{
_FameContainer->pds__notifyRelease();
}
}
void CGuildPD::pds__unlinkMembers(TCharacterId __k)
{
_Members.erase(__k);
}
void CGuildPD::pds__unlinkFameContainer(NLMISC::CEntityId dummy)
{
{
_FameContainer = NULL;
}
}
void CGuildPD::pds_static__init()
{
PDSLib.setIndexAllocator(4, _IndexAllocator);
nlassertex(_FactoryInitialised, ("User Factory for class CGuildPD not set!"));
// factory must have been set by user before database init called!
// You must provide a factory for the class CGuildPD as it is marked as derived
// Call EGSPD::CGuildPD::setFactory() with a factory before any call to EGSPD::init()!
}
void CGuildPD::pds_static__setFactory(RY_PDS::TPDFactory userFactory)
{
if (!_FactoryInitialised)
{
PDSLib.registerClass(4, userFactory, pds_static__fetch, NULL);
_FactoryInitialised = true;
}
}
bool CGuildPD::_FactoryInitialised;
RY_PDS::CIndexAllocator CGuildPD::_IndexAllocator;
void CGuildPD::pds_static__fetch(RY_PDS::IPDBaseData *object, RY_PDS::CPData &data)
{
CGuildPD *__o = static_cast(object);
__o->pds__fetch(data);
__o->pds__notifyInit();
}
// End of static implementation of CGuildPD
} // End of EGSPD