Merge branch 'main/atys-live' into main/gingo-test

merge-requests/32/head
Nuno 3 years ago
commit b7e5ac18e9

@ -969,6 +969,7 @@ namespace NLGUI
// stop all curl downalods (html and data) // stop all curl downalods (html and data)
void releaseDownloads(); void releaseDownloads();
void releaseDataDownloads();
void checkDownloads(); void checkDownloads();
// _CurlWWW download finished // _CurlWWW download finished

@ -299,6 +299,11 @@ namespace NLGUI
void CGroupHTML::ImageDownloadCB::finish() void CGroupHTML::ImageDownloadCB::finish()
{ {
// Image setTexture will remove itself from Images while iterating over it.
// Do the swap to keep iterator safe.
std::vector<SImageInfo> vec;
vec.swap(Images);
// tmpdest file does not exist if download skipped (ie cache was used) // tmpdest file does not exist if download skipped (ie cache was used)
if (CFile::fileExists(tmpdest) || CFile::getFileSize(tmpdest) == 0) if (CFile::fileExists(tmpdest) || CFile::getFileSize(tmpdest) == 0)
{ {
@ -322,7 +327,7 @@ namespace NLGUI
// to temp file temporarily. that forces driver to reload texture from disk // to temp file temporarily. that forces driver to reload texture from disk
// ITexture::touch() seem not to do this. // ITexture::touch() seem not to do this.
// cache was updated, first set texture as temp file // cache was updated, first set texture as temp file
for(std::vector<SImageInfo>::iterator it = Images.begin(); it != Images.end(); ++it) for(std::vector<SImageInfo>::iterator it = vec.begin(); it != vec.end(); ++it)
{ {
SImageInfo &img = *it; SImageInfo &img = *it;
Parent->setImage(img.Image, tmpdest, img.Type); Parent->setImage(img.Image, tmpdest, img.Type);
@ -339,7 +344,7 @@ namespace NLGUI
} }
// even if image was cached, incase there was 'http://' image set to CViewBitmap // even if image was cached, incase there was 'http://' image set to CViewBitmap
for(std::vector<SImageInfo>::iterator it = Images.begin(); it != Images.end(); ++it) for(std::vector<SImageInfo>::iterator it = vec.begin(); it != vec.end(); ++it)
{ {
SImageInfo &img = *it; SImageInfo &img = *it;
Parent->setImage(img.Image, dest, img.Type); Parent->setImage(img.Image, dest, img.Type);
@ -1053,6 +1058,13 @@ namespace NLGUI
_CurlWWW = NULL; _CurlWWW = NULL;
} }
releaseDataDownloads();
}
void CGroupHTML::releaseDataDownloads()
{
LOG_DL("Clear pointers to %d curls", Curls.size());
// remove all queued and already started downloads // remove all queued and already started downloads
for(std::list<CDataDownload*>::iterator it = Curls.begin(); it != Curls.end(); ++it) for(std::list<CDataDownload*>::iterator it = Curls.begin(); it != Curls.end(); ++it)
{ {
@ -3080,14 +3092,7 @@ namespace NLGUI
paragraphChange (); paragraphChange ();
// clear the pointer to the current image download since all the button are deleted releaseDataDownloads();
LOG_DL("Clear pointers to %d curls", Curls.size());
// remove image refs from downloads
/*for(std::list<CDataDownload>::iterator it = Curls.begin(); it != Curls.end(); ++it)
{
it->imgs.clear();
}*/
} }
// *************************************************************************** // ***************************************************************************

@ -1123,7 +1123,6 @@ namespace NLGUI
if(!pIE) if(!pIE)
{ {
ls.pushNil(); ls.pushNil();
nlerror("getCurrentWindowUnder(): No UICaller found. return Nil");
} }
else else
{ {

@ -70,7 +70,17 @@ namespace NLGUI
} }
catch( const ELuaError &e ) catch( const ELuaError &e )
{ {
nlwarning( e.luaWhat().c_str() ); #if !FINAL_VERSION
nlwarning("--- LUA ERROR ---");
nlwarning(e.luaWhat().c_str());
std::vector<std::string> res;
NLMISC::explode(luaScript, std::string("\n"), res);
for(uint k = 0; k < res.size(); ++k)
{
nlwarning("%.05u %s", k, res[k].c_str());
}
nlwarning("--- ********* ---");
#endif
return false; return false;
} }

@ -481,7 +481,13 @@ namespace NLGUI
} }
else else
{ {
_HtmlDownload = NULL; if (_HtmlDownload)
{
CGroupHTML *groupHtml = dynamic_cast<CGroupHTML*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html"));
if (groupHtml)
groupHtml->removeImageDownload(_HtmlDownload, dynamic_cast<CViewBase*>(this));
_HtmlDownload = NULL;
}
_TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false); _TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false);
} }
} }

@ -1297,7 +1297,6 @@ void CClientConfig::setValues()
if (varPtr) if (varPtr)
{ {
if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto; if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto;
else if (nlstricmp(varPtr->asString(), "FMod") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvFMod;
else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL; else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL;
else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound; else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound;
else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2; else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2;

@ -58,7 +58,7 @@ using std::string;
struct CClientConfig struct CClientConfig
{ {
enum TDriver3D { DrvAuto = 0, OpenGL, Direct3D, OpenGLES }; enum TDriver3D { DrvAuto = 0, OpenGL, Direct3D, OpenGLES };
enum TDriverSound { SoundDrvAuto = 0, SoundDrvFMod, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; enum TDriverSound { SoundDrvAuto = 0, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 };
enum TStageLCTUsage { StageUseNoLCT = 0, StageUseAllLCT, StageUsePosOnlyLCT }; enum TStageLCTUsage { StageUseNoLCT = 0, StageUseAllLCT, StageUsePosOnlyLCT };
// the config file must be always be available // the config file must be always be available

@ -408,18 +408,6 @@ NLMISC_COMMAND(afk, "Set the player as 'away from keyboard'","[<custom text>]")
return true; return true;
} }
NLMISC_COMMAND(selfkill, "Kill the player ","")
{
CBitMemStream out;
if(!GenericMsgHeaderMngr.pushNameToStream("COMMAND:SELFKILL", out))
{
nlwarning("Unknown message name COMMAND:SELFKILL");
return false;
}
NetMngr.push(out);
return true;
}
bool randomCheckCharset(std::string const& str) bool randomCheckCharset(std::string const& str)
{ {
std::string::const_iterator it, itEnd = str.end(); std::string::const_iterator it, itEnd = str.end();

@ -466,7 +466,7 @@ void CLoginStateMachine::run()
/// check the data to check if patch needed /// check the data to check if patch needed
CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login")); CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login"));
if (!ClientCfg.PatchWanted || (Args.haveArg("n") && Args.getLongArg("nopatch").front() == "1")) if (!ClientCfg.PatchWanted || Args.haveLongArg("nopatch"))
{ {
// client don't want to be patched ! // client don't want to be patched !
_CurrentState = st_display_eula; _CurrentState = st_display_eula;

@ -1095,20 +1095,6 @@ public:
REGISTER_ACTION_HANDLER( CHandlerContextWebPage, "context_web_page"); REGISTER_ACTION_HANDLER( CHandlerContextWebPage, "context_web_page");
// ***************************************************************************
class CHandlerFullMap : public IActionHandler
{
public:
void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */)
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
CLuaManager::getInstance().executeLuaScript("game:openFullMap()", true);
}
};
REGISTER_ACTION_HANDLER( CHandlerFullMap, "fullmap");
// *************************************************************************** // ***************************************************************************

@ -1960,15 +1960,16 @@ class CHandlerItemMenuCheck : public IActionHandler
for(i=0;i<MAX_INVENTORY_ANIMAL;i++) for(i=0;i<MAX_INVENTORY_ANIMAL;i++)
{ {
if (pMoveToPa[i]) if (pMoveToPa[i])
pMoveToPa[i]->setActive((uint)invId!=INVENTORIES::pet_animal+i && pMoveToPa[i]->setActive(invId!=INVENTORIES::guild &&
(uint)invId!=INVENTORIES::pet_animal+i &&
invMngr.isInventoryPresent((INVENTORIES::TInventory)(INVENTORIES::pet_animal+i)) ); invMngr.isInventoryPresent((INVENTORIES::TInventory)(INVENTORIES::pet_animal+i)) );
} }
if (pMoveToGuild) if (pMoveToGuild)
pMoveToGuild->setActive(invId!=INVENTORIES::guild && invMngr.isInventoryPresent(INVENTORIES::guild)); pMoveToGuild->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::guild));
if (pMoveToRoom) if (pMoveToRoom)
pMoveToRoom->setActive(invId!=INVENTORIES::player_room && invMngr.isInventoryPresent(INVENTORIES::player_room)); pMoveToRoom->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::player_room));
// std case: can drop / destroy // std case: can drop / destroy
if(pDrop) pDrop->setActive(invId!=INVENTORIES::guild); if(pDrop) pDrop->setActive(invId!=INVENTORIES::guild);
@ -2049,8 +2050,7 @@ class CHandlerItemMenuCheck : public IActionHandler
} }
// Only show lock menu item if inventory contains the info // Only show lock menu item if inventory contains the info
if (invId!=INVENTORIES::guild) if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock());
if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock());
// **** Gray Entries // **** Gray Entries

@ -50,10 +50,6 @@ using namespace NLMISC;
// *************************************************************************** // ***************************************************************************
const std::string FaberPlanDB= "UI:PHRASE:FABER:FABER_PLAN:SHEET"; const std::string FaberPlanDB= "UI:PHRASE:FABER:FABER_PLAN:SHEET";
const std::string FaberPlanHpBuffDB= "UI:PHRASE:FABER:FABER_PLAN:HP_BUFF";
const std::string FaberPlanSapBuffDB= "UI:PHRASE:FABER:FABER_PLAN:SAP_BUFF";
const std::string FaberPlanStaBuffDB= "UI:PHRASE:FABER:FABER_PLAN:STA_BUFF";
const std::string FaberPlanFocusBuffDB= "UI:PHRASE:FABER:FABER_PLAN:FOCUS_BUFF";
const std::string MPFaberDB= "UI:PHRASE:FABER:MP_BUILD"; const std::string MPFaberDB= "UI:PHRASE:FABER:MP_BUILD";
const std::string MPSelectionDB= "UI:PHRASE:FABER:MP_SELECT"; const std::string MPSelectionDB= "UI:PHRASE:FABER:MP_SELECT";
const std::string MPQuantityDb= "UI:PHRASE:FABER:MP_QUANTITY"; const std::string MPQuantityDb= "UI:PHRASE:FABER:MP_QUANTITY";
@ -174,16 +170,6 @@ void CActionPhraseFaber::launchFaberCastWindow(sint32 memoryLine, uint memoryIn
if(node) if(node)
node->setValue32(0); node->setValue32(0);
// Reset buff values
node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanHpBuffDB, false);
if (node) node->setValue32(0);
node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanSapBuffDB, false);
if (node) node->setValue32(0);
node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanStaBuffDB, false);
if (node) node->setValue32(0);
node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanFocusBuffDB, false);
if (node) node->setValue32(0);
// Reset the result item // Reset the result item
node= NLGUI::CDBManager::getInstance()->getDbProp(ItemResultSheetDB, false); node= NLGUI::CDBManager::getInstance()->getDbProp(ItemResultSheetDB, false);
if(node) if(node)
@ -1579,14 +1565,6 @@ void CActionPhraseFaber::updateItemResult()
uint phraseSlot= pPM->getMemorizedPhrase(_ExecuteFromMemoryLine, _ExecuteFromMemoryIndex); uint phraseSlot= pPM->getMemorizedPhrase(_ExecuteFromMemoryLine, _ExecuteFromMemoryIndex);
const CSPhraseCom &phrase= pPM->getPhrase(phraseSlot); const CSPhraseCom &phrase= pPM->getPhrase(phraseSlot);
uint32 recommendedPropId= pBM->getBrickPropId("cr_recommended"); uint32 recommendedPropId= pBM->getBrickPropId("cr_recommended");
uint32 crHp = pBM->getBrickPropId("cr_hp");
uint32 crSap = pBM->getBrickPropId("cr_sap");
uint32 crSta = pBM->getBrickPropId("cr_sta");
uint32 crFocus = pBM->getBrickPropId("cr_focus");
sint32 hpBuff = 0;
sint32 sapBuff = 0;
sint32 staBuff = 0;
sint32 focusBuff = 0;
for(i=0;i<phrase.Bricks.size();i++) for(i=0;i<phrase.Bricks.size();i++)
{ {
CSBrickSheet *brick= pBM->getBrick(phrase.Bricks[i]); CSBrickSheet *brick= pBM->getBrick(phrase.Bricks[i]);
@ -1600,30 +1578,10 @@ void CActionPhraseFaber::updateItemResult()
// minimze the level // minimze the level
minLevel= min(minLevel, sint32(brick->Properties[j].Value)); minLevel= min(minLevel, sint32(brick->Properties[j].Value));
} }
if (brick->Properties[j].PropId == crHp)
hpBuff = sint32(brick->Properties[j].Value);
if (brick->Properties[j].PropId == crSap)
sapBuff = sint32(brick->Properties[j].Value);
if (brick->Properties[j].PropId == crSta)
staBuff = sint32(brick->Properties[j].Value);
if (brick->Properties[j].PropId == crFocus)
focusBuff = sint32(brick->Properties[j].Value);
} }
} }
} }
{
NLGUI::CDBManager *cdb = NLGUI::CDBManager::getInstance();
NLMISC::CCDBNodeLeaf *node = cdb->getDbProp(FaberPlanHpBuffDB, false);
if (node) node->setValue32(hpBuff);
node = cdb->getDbProp(FaberPlanSapBuffDB, false);
if (node) node->setValue32(sapBuff);
node = cdb->getDbProp(FaberPlanStaBuffDB, false);
if (node) node->setValue32(staBuff);
node = cdb->getDbProp(FaberPlanFocusBuffDB, false);
if (node) node->setValue32(focusBuff);
}
// **** Parse all MPs setuped, to compute level and stats // **** Parse all MPs setuped, to compute level and stats
uint totalItemPartMPReq= 0; uint totalItemPartMPReq= 0;

@ -2534,8 +2534,7 @@ void CDBCtrlSheet::drawSheet (sint32 x, sint32 y, bool draging, bool showSelecti
// there is max 4 icons // there is max 4 icons
sint32 hArea = (hSheet / 4); sint32 hArea = (hSheet / 4);
sint32 xIcon = x; sint32 xIcon = x;
// move buff icons up a row, quantity text is displayed on bottom-left corner sint32 yIcon = y;
sint32 yIcon = y + hArea;
for (uint i = 0; i < _BuffIcons.size(); ++i) for (uint i = 0; i < _BuffIcons.size(); ++i)
{ {
sint32 wIcon = _BuffIcons[i].IconW; sint32 wIcon = _BuffIcons[i].IconW;

@ -799,11 +799,7 @@ static DECLARE_INTERFACE_USER_FCT(getAnimalInventoryStateText)
// According to server status, change the inventory text // According to server status, change the inventory text
uint status= (uint)args[0].getInteger(); uint status= (uint)args[0].getInteger();
if(ANIMAL_STATUS::isInBag((ANIMAL_STATUS::EAnimalStatus)status)) if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status))
{
result.setString("uiAnimalInBag");
}
else if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status))
{ {
result.setString("uiAnimalInStable"); result.setString("uiAnimalInStable");
} }

@ -468,9 +468,7 @@ void CSoundManager::init(IProgressCallback *progressCallBack)
_AudioMixer->setPackedSheetOption("", false); _AudioMixer->setPackedSheetOption("", false);
UAudioMixer::TDriver driverType= UAudioMixer::DriverAuto; UAudioMixer::TDriver driverType= UAudioMixer::DriverAuto;
if(ClientCfg.DriverSound==CClientConfig::SoundDrvFMod) if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL)
driverType= UAudioMixer::DriverFMod;
else if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL)
driverType= UAudioMixer::DriverOpenAl; driverType= UAudioMixer::DriverOpenAl;
else if(ClientCfg.DriverSound==CClientConfig::SoundDrvDirectSound) else if(ClientCfg.DriverSound==CClientConfig::SoundDrvDirectSound)
driverType= UAudioMixer::DriverDSound; driverType= UAudioMixer::DriverDSound;

@ -19,7 +19,22 @@
<!-- ##### Root template matcher ####### --> <!-- ##### Root template matcher ####### -->
<!-- ######################################################### --> <!-- ######################################################### -->
<xsl:template match="generator"> <xsl:template match="generator">
<xsl:if test="$output != 'php'"> <xsl:if test="$output != 'php'">// Ryzom - MMORPG Framework &lt;http://dev.ryzom.com/projects/ryzom/&gt;
// Copyright (C) 2010-2021 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 &lt;http://www.gnu.org/licenses/&gt;.
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// WARNING : this is a generated file, don't change it ! // WARNING : this is a generated file, don't change it !
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
@ -1676,13 +1691,14 @@ namespace <xsl:value-of select="@name"/>
<xsl:for-each select="child_class[@on-delete = 'cascade' and @cont='vector']"> <xsl:for-each select="child_class[@on-delete = 'cascade' and @cont='vector']">
{ {
// cascading deletion for vector child <xsl:value-of select="@name"/> // cascading deletion for vector child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__))
const std::vector &lt; <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
while (!childs.empty())
{ {
get<xsl:value-of select="@name"/>ByIndex(childs.size()-1)->remove(connection); const std::vector &lt; <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
while (!childs.empty())
{
get<xsl:value-of select="@name"/>ByIndex((uint32)childs.size()-1)->remove(connection);
}
} }
} }
@ -1690,72 +1706,77 @@ namespace <xsl:value-of select="@name"/>
<xsl:for-each select="child_class[@on-delete = 'cascade' and @cont='map']"> <xsl:for-each select="child_class[@on-delete = 'cascade' and @cont='map']">
{ {
// cascading deletion for map child <xsl:value-of select="@name"/> // cascading deletion for map child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__))
const std::map &lt; uint32, <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
while (!childs.empty())
{ {
get<xsl:value-of select="@name"/>ById(childs.begin()->first)->remove(connection); const std::map &lt; uint32, <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
while (!childs.empty())
{
get<xsl:value-of select="@name"/>ById(childs.begin()->first)->remove(connection);
}
} }
} }
</xsl:for-each> </xsl:for-each>
<xsl:for-each select="child_class[@on-delete = 'cascade' and @relation='one-to-one']"> <xsl:for-each select="child_class[@on-delete = 'cascade' and @relation='one-to-one']">
{ {
// cascading deletion for single child <xsl:value-of select="@name"/> // cascading deletion for single child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__))
{
if (get<xsl:value-of select="@name"/>() != NULL) if (get<xsl:value-of select="@name"/>() != NULL)
get<xsl:value-of select="@name"/>()->remove(connection); get<xsl:value-of select="@name"/>()->remove(connection);
}
} }
</xsl:for-each> </xsl:for-each>
<xsl:for-each select="child_class[@on-delete = 'update' and @cont='vector']"> <xsl:for-each select="child_class[@on-delete = 'update' and @cont='vector']">
{ {
// unreference (and update) for vector child <xsl:value-of select="@name"/> // unreference (and update) for vector child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__))
const std::vector &lt; <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
for (uint i=0; i &lt; childs.size(); ++i)
{ {
<xsl:variable name="type" select="@type"/> const std::vector &lt; <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
<xsl:variable name="child_name" select="@name"/>
<xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/> for (uint i=0; i &lt; childs.size(); ++i)
get<xsl:value-of select="@name"/>ByIndex(i)->set<xsl:value-of select="$parent_prop"/>(0); {
get<xsl:value-of select="@name"/>ByIndex(i)->update(connection); <xsl:variable name="type" select="@type"/>
<xsl:variable name="child_name" select="@name"/>
<xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/>
get<xsl:value-of select="@name"/>ByIndex(i)->set<xsl:value-of select="$parent_prop"/>(0);
get<xsl:value-of select="@name"/>ByIndex(i)->update(connection);
}
} }
} }
</xsl:for-each> </xsl:for-each>
<xsl:for-each select="child_class[@on-delete = 'update' and @cont='map']"> <xsl:for-each select="child_class[@on-delete = 'update' and @cont='map']">
{ {
// unreference (and update) for map child <xsl:value-of select="@name"/> // unreference (and update) for map child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)) {
const std::map &lt; uint32, <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>(); const std::map &lt; uint32, <xsl:value-of select="@type"/>Ptr &gt; &amp; childs = get<xsl:value-of select="@name"/>();
std::map&lt; uint32, <xsl:value-of select="@type"/>Ptr &gt;::const_iterator first(childs.begin()), last(childs.end()); std::map&lt; uint32, <xsl:value-of select="@type"/>Ptr &gt;::const_iterator first(childs.begin()), last(childs.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
<xsl:variable name="type" select="@type"/> <xsl:variable name="type" select="@type"/>
<xsl:variable name="child_name" select="@name"/> <xsl:variable name="child_name" select="@name"/>
<xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/> <xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/>
get<xsl:value-of select="@name"/>ById(it->first)->set<xsl:value-of select="$parent_prop"/>(0); get<xsl:value-of select="@name"/>ById(it->first)->set<xsl:value-of select="$parent_prop"/>(0);
get<xsl:value-of select="@name"/>ById(it->first)->update(connection); get<xsl:value-of select="@name"/>ById(it->first)->update(connection);
}
} }
} }
</xsl:for-each> </xsl:for-each>
<xsl:for-each select="child_class[@on-delete = 'update' and @relation='one-to-one']"> <xsl:for-each select="child_class[@on-delete = 'update' and @relation='one-to-one']">
{ {
// unreference (and update) for single child <xsl:value-of select="@name"/> // unreference (and update) for single child <xsl:value-of select="@name"/>
nlassert(load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__)); if (load<xsl:value-of select="@name"/>(connection, __FILE__, __LINE__))
<xsl:variable name="type" select="@type"/>
<xsl:variable name="child_name" select="@name"/>
<xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/>
if (get<xsl:value-of select="@name"/>() != NULL)
{ {
get<xsl:value-of select="@name"/>()->set<xsl:value-of select="parent_prop"/>(0); <xsl:variable name="type" select="@type"/>
get<xsl:value-of select="@name"/>()->update(connection); <xsl:variable name="child_name" select="@name"/>
<xsl:variable name="parent_prop" select="//class[@name = $type]/property[@db_col = //class[@name = $type]/parent[@class = $className]/@db_col]/@name"/>
if (get<xsl:value-of select="@name"/>() != NULL)
{
get<xsl:value-of select="@name"/>()->set<xsl:value-of select="parent_prop"/>(0);
get<xsl:value-of select="@name"/>()->update(connection);
}
} }
} }
</xsl:for-each> </xsl:for-each>
@ -1886,7 +1907,7 @@ namespace <xsl:value-of select="@name"/>
} }
else if (cmd == NOPE::cc_instance_count) else if (cmd == NOPE::cc_instance_count)
{ {
return _ObjectCache.size(); return (uint32)_ObjectCache.size();
} }
// default return value // default return value
@ -1904,7 +1925,7 @@ namespace <xsl:value-of select="@name"/>
TReleasedObject::iterator first(_ReleasedObject.begin()), last(_ReleasedObject.end()); TReleasedObject::iterator first(_ReleasedObject.begin()), last(_ReleasedObject.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
nbReleased += first->second.size(); nbReleased += (uint32)first->second.size();
} }
nlinfo(" There are %u object instances in cache not referenced (waiting deletion or re-use))", nbReleased); nlinfo(" There are %u object instances in cache not referenced (waiting deletion or re-use))", nbReleased);
@ -2117,7 +2138,7 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification
return false; return false;
} }
std::auto_ptr&lt;MSW::CStoreResult&gt; result = connection.storeResult(); CUniquePtr&lt;MSW::CStoreResult&gt; result(connection.storeResult());
for (uint i=0; i&lt;result->getNumRows(); ++i) for (uint i=0; i&lt;result->getNumRows(); ++i)
{ {
@ -2195,7 +2216,7 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification
return false; return false;
} }
std::auto_ptr&lt;MSW::CStoreResult&gt; result = connection.storeResult(); CUniquePtr&lt;MSW::CStoreResult&gt; result(connection.storeResult());
// check that the data description is consistent with database content // check that the data description is consistent with database content
nlassert(result->getNumRows() &lt;= 1); nlassert(result->getNumRows() &lt;= 1);
@ -2300,9 +2321,9 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification
} }
// no object with this id, return a null pointer // no object with this id, return a null pointer
static <xsl:value-of select="@type"/>Ptr nil; static <xsl:value-of select="@type"/>Ptr nilPtr;
return nil; return nilPtr;
} }
</xsl:when> </xsl:when>
@ -2321,8 +2342,8 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification
if (it == _<xsl:value-of select="@name"/>->end()) if (it == _<xsl:value-of select="@name"/>->end())
{ {
// no object with this id, return a null pointer // no object with this id, return a null pointer
static <xsl:value-of select="@type"/>Ptr nil; static <xsl:value-of select="@type"/>Ptr nilPtr;
return nil; return nilPtr;
} }
return const_cast&lt; <xsl:value-of select="@type"/>Ptr &amp; &gt;(it->second); return const_cast&lt; <xsl:value-of select="@type"/>Ptr &amp; &gt;(it->second);

Loading…
Cancel
Save