void CElement::ReadCustomData ( CLuaMain* pLuaMain, CEvents* pEvents ) { assert ( pLuaMain ); assert ( pEvents ); // Got an XML node? if ( m_pXMLNode ) { // Iterate the attributes of our XML node CXMLAttributes* pAttributes = &(m_pXMLNode->GetAttributes ()); unsigned int uiAttributeCount = pAttributes->Count (); for ( unsigned int uiIndex = 0; uiIndex < uiAttributeCount; uiIndex++ ) { // Grab the node (we can assume it exists here) CXMLAttribute* pAttribute = pAttributes->Get ( uiIndex ); // Make a lua argument from it and set the content CLuaArguments args; if ( !args.ReadFromJSONString ( pAttribute->GetValue ().c_str() ) ) args.PushString ( pAttribute->GetValue ().c_str () ); // Don't trigger onElementDataChanged event SetCustomData ( pAttribute->GetName ().c_str (), *args[0], pLuaMain, g_pGame->GetConfig ()->GetSyncMapElementData (), NULL, false ); } } }
bool CAccountManager::LoadXML ( CXMLNode* pParent ) { CLogger::LogPrint ( "Converting Accounts.xml into internal.db\n" ); //##Keep for backwards compatability with accounts.xml## #define ACCOUNT_VALUE_LENGTH 128 std::string strBuffer, strName, strPassword, strIP, strDataKey, strDataValue; if ( pParent ) { CXMLNode* pAccountNode = NULL; unsigned int uiAccountNodesCount = pParent->GetSubNodeCount (); for ( unsigned int i = 0 ; i < uiAccountNodesCount ; i++ ) { pAccountNode = pParent->GetSubNode ( i ); if ( pAccountNode == NULL ) continue; strBuffer = pAccountNode->GetTagName (); if ( strBuffer.compare ( "account" ) == 0 ) { CXMLAttribute* pAttribute = pAccountNode->GetAttributes ().Find ( "name" ); if ( pAttribute ) { strName = pAttribute->GetValue (); pAttribute = pAccountNode->GetAttributes ().Find ( "password" ); if ( pAttribute ) { strPassword = pAttribute->GetValue (); if ( !strName.empty () && !strPassword.empty () ) { pAttribute = pAccountNode->GetAttributes ().Find ( "ip" ); if ( pAttribute ) { strIP = pAttribute->GetValue (); CAccount* pAccount = NULL; pAttribute = pAccountNode->GetAttributes ().Find ( "serial" ); if ( pAttribute ) { //Insert the entry into the accounts database m_pDatabaseManager->Execf ( m_hDbConnection, "INSERT INTO accounts (name, ip, serial, password) VALUES(?,?,?,?)", SQLITE_TEXT, strName.c_str(), SQLITE_TEXT, strIP.c_str(), SQLITE_TEXT, pAttribute->GetValue ().c_str(), SQLITE_TEXT, strPassword.c_str() ); pAccount = new CAccount ( this, true, strName, strPassword, strIP, m_iAccounts++, pAttribute->GetValue () ); } else { //Insert the entry into the accounts database m_pDatabaseManager->Execf ( m_hDbConnection, "INSERT INTO accounts (name, ip, password) VALUES(?,?,?)", SQLITE_TEXT, strName.c_str(), SQLITE_TEXT, strIP.c_str(), SQLITE_TEXT, strPassword.c_str() ); pAccount = new CAccount ( this, true, strName, strPassword, strIP, m_iAccounts++ ); } // Grab the data on this account CXMLNode* pDataNode = NULL; int iType = LUA_TNIL; unsigned int uiDataNodesCount = pAccountNode->GetSubNodeCount (); for ( unsigned int j = 0 ; j < uiDataNodesCount ; j++ ) { pDataNode = pAccountNode->GetSubNode ( j ); if ( pDataNode == NULL ) continue; strBuffer = pDataNode->GetTagName (); if ( strBuffer == "nil_data" ) iType = LUA_TNIL; else if ( strBuffer == "boolean_data" ) iType = LUA_TBOOLEAN; else if ( strBuffer == "string_data" ) iType = LUA_TSTRING; else if ( strBuffer == "number_data" ) iType = LUA_TNUMBER; CXMLAttributes* pAttributes = &(pDataNode->GetAttributes ()); CXMLAttribute* pAttribute = NULL; unsigned int uiDataValuesCount = pAttributes->Count (); for ( unsigned int a = 0 ; a < uiDataValuesCount ; a++ ) { pAttribute = pAttributes->Get ( a ); strDataKey = pAttribute->GetName (); strDataValue = pAttribute->GetValue (); char szKey[128]; STRNCPY( szKey, strDataKey.c_str(), 128 ); SetAccountData( pAccount, szKey, strDataValue, iType ); } } } else { CAccount* pAccount = NULL; pAttribute = pAccountNode->GetAttributes ().Find ( "serial" ); if ( pAttribute ) { //Insert the entry into the accounts database m_pDatabaseManager->Execf ( m_hDbConnection, "INSERT INTO accounts (name, password, serial) VALUES(?,?,?)", SQLITE_TEXT, strName.c_str(), SQLITE_TEXT, strPassword.c_str(), SQLITE_TEXT, pAttribute->GetValue().c_str() ); pAccount = new CAccount ( this, true, strName, strPassword, "", m_iAccounts++, pAttribute->GetValue () ); } else { //Insert the entry into the accounts database m_pDatabaseManager->Execf ( m_hDbConnection, "INSERT INTO accounts (name, password) VALUES(?,?)", SQLITE_TEXT, strName.c_str(), SQLITE_TEXT, strPassword.c_str() ); pAccount = new CAccount ( this, true, strName, strPassword, "", m_iAccounts++, "" ); } } } else { if ( strName == CONSOLE_ACCOUNT_NAME ) { //Add Console to the SQL Database (You don't need to create an account since the server takes care of that m_pDatabaseManager->Execf ( m_hDbConnection, "INSERT INTO accounts (name, password) VALUES(?,?)", SQLITE_TEXT, "Console", SQLITE_TEXT, "" ); ++m_iAccounts; } } } } } else { //Load the settings from XML LoadSetting ( pAccountNode ); } } //Save the settings to SQL SaveSettings(); CLogger::LogPrint ( "Conversion Complete.\n" ); m_bChangedSinceSaved = false; return true; } return false; }