khanat-opennel-code/code/ryzom/server/src/pd_lib/pd_string_manager.cpp
2010-05-06 02:08:41 +02:00

661 lines
15 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// 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 <http://www.gnu.org/licenses/>.
#error "deprecated"
//#include "pd_string_manager.h"
//#include "pd_lib.h"
//
//#include <string.h>
//
//#include <nel/misc/file.h>
//#include <nel/misc/command.h>
//#include <nel/net/unified_network.h>
//#include <nel/net/service.h>
//
//#include "pd_lib.h"
//#include "timestamp.h"
//
//using namespace std;
//using namespace NLMISC;
//using namespace NLNET;
//
//
//namespace RY_PDS
//{
//
////
////
//
////void cbStoreStringResult(CMessage& msgin, const string &serviceName, uint16 serviceId);
//
////TUnifiedCallbackItem PDStringManagerCbArray[] =
////{
//// { "STORE_STRING_RESULT", cbStoreStringResult },
////};
//
////void cbStoreStringResult(CMessage& msgin, const string &serviceName, uint16 serviceId)
////{
//// if (CPDStringManager::_NbProcessingStoreStringRequests)
//// {
//// CPDStringManager::_NbProcessingStoreStringRequests--;
//// }
//// else
//// nlwarning("<cbStoreStringResult> received more STORE_STRING_RESULT messages than sent STORE_STRING requests");
////
//// ucstring str;
//// uint32 stringId;
////
//// msgin.serial(str);
//// msgin.serial(stringId);
////
//// uint i;
//// for (i=0; i<CPDSLib::_Libs.size(); ++i)
//// {
//// CPDSLib* lib = CPDSLib::_Libs[i];
//// if (lib != NULL)
//// lib->getStringManager().setStringId(str, stringId);
//// }
////}
//
//
//// Is net callback ready?
//bool CPDStringManager::_InitCb = false;
//
///// Null String
//ucstring CPDStringManager::_NullStr;
//
///// Number of store string requests that have not been processed by IOS yet
//uint CPDStringManager::_NbProcessingStoreStringRequests = 0;
//
//
///*
// * Constructor
// */
//CPDStringManager::CPDStringManager()
//{
// _PDSLib = NULL;
// _Callback = NULL;
//}
//
//
///*
// * Destructor
// */
//CPDStringManager::~CPDStringManager()
//{
//}
//
//
///*
// * Init
// */
//void CPDStringManager::init(CPDSLib* lib)
//{
// //
// if (!_InitCb)
// {
// _InitCb = true;
// CUnifiedNetwork::getInstance()->addCallbackArray(PDStringManagerCbArray, sizeof(PDStringManagerCbArray)/sizeof(PDStringManagerCbArray[0]));
// }
//
// //
// _PDSLib = lib;
//}
//
//
///*
// * Get string entry (allocate a new entry if not yet in container)
// */
//CPDStringManager::TEntryId CPDStringManager::getEntryIdNonConst(const ucstring& str)
//{
// THash hash = getHash(str);
// TEntryId entryId = InvalidEntryId;
//
// if (_HashTable.size() > hash)
// entryId = _HashTable[hash];
//
// while (entryId != InvalidEntryId)
// {
// const CStringEntry& entry = _StringEntries[entryId];
//
// if (entry.String == str)
// {
// // DONE BY NICO : this forces the lib to update the string id value of the entry. Thus, EGS callbacks are called.
// // The real problem is that entries are never removed from _StringEntries. So when we add a string that should have been previously removed, setStringId is never called... )
// setStringId(str, entry.StringId);
// return entryId;
// }
//
// entryId = entry.NextInHash;
// }
//
// // allocate new entry
// entryId = _StringEntries.size();
// _StringEntries.resize(entryId+1);
//
// // check hash table size
// if (_HashTable.size() <= hash)
// _HashTable.resize(PD_STRING_HASHTABLE_SIZE, InvalidEntryId);
//
// // fill new entry
// CStringEntry& entry = _StringEntries[entryId];
//
// entry.String = str;
// entry.Hash = hash;
// entry.NextInHash = _HashTable[hash];
//
// // link entry in hash table
// _HashTable[hash] = entryId;
//
// if (_PDSLib != NULL)
// {
// storeStringInIOS(str);
// }
//
// return entryId;
//}
//
//
///*
// * Compares 2 ucchar strings
// */
//bool CPDStringManager::compare(const ucchar* a, const ucchar* b)
//{
// while (*a == *b && *a != 0)
// {
// ++a;
// ++b;
// }
// return *a == *b;
//}
//
//
//
//
///*
// * Explicitly add string to manager
// * \param eid is the associated entity id
// * \param string is the string to add
// * \return the persistant string id
// */
//void CPDStringManager::addString(NLMISC::CEntityId eid, const ucstring& str, bool addToLog)
//{
// TEntryId entry = getEntryIdNonConst(str);
//
// if (_PDSLib != NULL)
// {
// // client mode, send mapping to PDS
// _PDSLib->addString(eid, str);
// }
//
// if ((_PDSLib == NULL && addToLog) || (_PDSLib != NULL && !_PDSLib->PDSUsed() && PDEnableStringLog))
// {
// // PDS mode, log mapping
// _Log.Actions.push_back(CLogAction());
// _Log.Actions.back().MapId = true;
// _Log.Actions.back().EntityId = eid;
// _Log.Actions.back().String = str;
// }
//
// mapEid(eid, entry);
//}
//
///*
// * Unmap EntityId
// */
//void CPDStringManager::unmap(NLMISC::CEntityId eid, bool addToLog)
//{
// TEIdMap::iterator it = _EIdMap.find(eid);
// if (it == _EIdMap.end())
// return;
//
// if (_PDSLib != NULL)
// {
// // client mode, send unmapping to PDS
// _PDSLib->unmapString(eid);
// }
//
// if ((_PDSLib == NULL && addToLog) || (_PDSLib != NULL && !_PDSLib->PDSUsed() && PDEnableStringLog))
// {
// // PDS mode, log unmapping
// _Log.Actions.push_back(CLogAction());
// _Log.Actions.back().MapId = false;
// _Log.Actions.back().EntityId = eid;
// }
//
// CStringEntry& entry = _StringEntries[(*it).second];
//
// _EIdMap.erase(it);
//
// // remove from mapped eids
// std::vector<NLMISC::CEntityId>::iterator ite;
// for (ite=entry.MappedIds.begin(); ite!=entry.MappedIds.end(); )
// {
// if (*ite == eid)
// ite = entry.MappedIds.erase(ite);
// else
// ++ite;
// }
//}
//
//
///*
// * Set string callback
// * This callback is called when the string id is received from the IOS.
// * That is when string id is ready to be used
// */
//void CPDStringManager::setCallback(TStringCallback callback)
//{
// _Callback = callback;
//}
//
//
//
//
///*
// * Display Manager content
// */
//void CPDStringManager::display(NLMISC::CLog* log) const
//{
//}
//
//
//
///*
// * Serial String Manager
// */
//void CPDStringManager::serial(NLMISC::IStream& f)
//{
// H_AUTO( PDSSM_SERIAL );
// f.serialCheck((uint32)'PDSM');
// uint version = f.serialVersion(0);
//
// {
// H_AUTO( PDSSM_SERIAL_ENTRIES );
// f.serialCont(_StringEntries);
// }
// {
// H_AUTO( PDSSM_SERIAL_EIDMAP );
// f.serialCont(_EIdMap);
// }
//
// if (f.isReading())
// {
// H_AUTO( PDSSM_SERIAL_BUILDVOLATILEDATA );
// buildVolatileData();
// }
//}
//
//
///*
// * Set String (PDS side)
// */
///*
//bool CPDStringManager::setString(const NLMISC::CEntityId& eid, TEntryId id, const ucstring& str)
//{
// bool success = true;
//
// if (id >= _StringEntries.size())
// {
// // alloc string entry
// _StringEntries.resize(id+1);
//
// // fill up entry
// CStringEntry& entry = _StringEntries[id];
//
// entry.Hash = getHash(str);
// entry.String = str;
//
// // link in hash table
// if (_HashTable.size() <= entry.Hash)
// _HashTable.resize(PD_STRING_HASHTABLE_SIZE, InvalidEntryId);
//
// entry.NextInHash = _HashTable[entry.Hash];
// }
// else if (_StringEntries[id].String != str)
// {
// // entry was alread filled !
// nlwarning("CPDStringManager::setString(): entry '%d' already set, entry is kept unchanged", id);
// success = false;
// }
//
// _EIdMap[eid] = id;
//
// return success;
//}
//*/
//
//
//
///*
// * Set string Id
// */
//void CPDStringManager::setStringId(const ucstring& str, TStringId id)
//{
// THash hash = getHash(str);
// TEntryId entryId = InvalidEntryId;
//
// if (_HashTable.size() >= hash)
// {
// entryId = _HashTable[hash];
//
// while (entryId != InvalidEntryId)
// {
// CStringEntry& entry = _StringEntries[entryId];
//
// if (entry.String == str)
// {
// entry.StringId = id;
// _StringIdMap[id] = entryId;
// break;
// }
// entryId = entry.NextInHash;
// }
// }
//
// // callback
// if (_Callback != NULL)
// _Callback(str, id);
//}
//
//
//
///*
// * Build All String Associations
// */
//void CPDStringManager::buildStringAssociation()
//{
// uint i;
// for (i=0; i<CPDSLib::_Libs.size(); ++i)
// {
// CPDSLib* lib = CPDSLib::_Libs[i];
// if (lib != NULL)
// lib->getStringManager().askAssociations();
// }
//}
//
//
///*
// * Ask Associations
// */
//void CPDStringManager::askAssociations()
//{
// uint i;
// for (i=0; i<_StringEntries.size(); ++i)
// {
// storeStringInIOS(_StringEntries[i].String);
// }
//}
//
//
//
//
///*
// * Rebuild volatile data
// */
//void CPDStringManager::buildVolatileData()
//{
// static bool alreadyBuilt = false;
//
////#ifdef NL_DEBUG
//// if(alreadyBuilt)
//// nlstopex(("buildVolatileData() called 2 times, BEN, please fix me!!!"));
////#else
// if(alreadyBuilt)
// nlwarning("buildVolatileData() called 2 times, BEN, please fix me!!!");
////#endif
//
// _HashTable.clear();
//
// uint i;
// for (i=0; i<_StringEntries.size(); ++i)
// {
// CStringEntry& entry = _StringEntries[i];
//
// entry.Hash = getHash(entry.String);
//
// if (_HashTable.size() <= entry.Hash)
// _HashTable.resize(PD_STRING_HASHTABLE_SIZE, InvalidEntryId);
//
// entry.NextInHash = _HashTable[entry.Hash];
// _HashTable[entry.Hash] = i;
//
// entry.MappedIds.clear();
// }
//
// TEIdMap::const_iterator it;
// for (it=_EIdMap.begin(); it!=_EIdMap.end(); ++it)
// {
// CStringEntry& entry = _StringEntries[(*it).second];
// entry.MappedIds.push_back((*it).first);
// }
//
// alreadyBuilt = true;
//}
//
//
///*
// * Load String manager default file (to be used by client when PDS is not connected)
// */
//bool CPDStringManager::load()
//{
// if (_PDSLib == NULL)
// return false;
//
// std::string logDir = _PDSLib->getLogDirectory();
//
// if (!CFile::isDirectory(logDir))
// {
// if (!CFile::createDirectoryTree(logDir))
// {
// nlwarning("Failed to create log root directory '%s'", logDir.c_str());
// }
//
// if (!CFile::setRWAccess(logDir))
// {
// nlwarning("Failed, can't set RW access to directory '%s'", logDir.c_str());
// }
// }
//
// return load(logDir);
//}
//
///*
// * Save String manager default file (to be used by client when PDS is not connected)
// */
//bool CPDStringManager::save()
//{
// if (_PDSLib == NULL)
// return false;
//
// std::string logDir = _PDSLib->getLogDirectory();
//
// if (!CFile::isDirectory(logDir))
// {
// if (!CFile::createDirectoryTree(logDir))
// {
// nlwarning("Failed to create log root directory '%s'", logDir.c_str());
// }
//
// if (!CFile::setRWAccess(logDir))
// {
// nlwarning("Failed, can't set RW access to directory '%s'", logDir.c_str());
// }
// }
//
// return save(logDir);
//}
//
///*
// * Load String manager file
// */
//bool CPDStringManager::load(const std::string& path)
//{
// std::string filename = getFile(path);
//
// if (!CFile::fileExists(filename))
// {
// nlinfo("CPDStringManager::load(): file '%s' doesn't exist, assumes string manager empty", filename.c_str());
// return true;
// }
//
// CIFile file;
// if (!file.open(filename))
// {
// nlwarning("CPDStringManager::load(): failed to load file '%s', string manager left as is", filename.c_str());
// return false;
// }
//
// try
// {
// serial(file);
// }
// catch (Exception& e)
// {
// nlwarning("CPDStringManager::load(): failed to load file '%s', exception in serial '%s'", filename.c_str(), e.what());
// return false;
// }
//
// return true;
//}
//
///*
// * Save String manager file
// */
//bool CPDStringManager::save(const std::string& path)
//{
// std::string filename = getFile(path);
//
// COFile file;
// if (!file.open(filename))
// {
// nlwarning("CPDStringManager::save(): failed to save file '%s', string manager left as is", filename.c_str());
// return false;
// }
//
// try
// {
// serial(file);
// }
// catch (Exception& e)
// {
// nlwarning("CPDStringManager::save(): failed to save file '%s', exception in serial '%s'", filename.c_str(), e.what());
// return false;
// }
//
// return true;
//}
//
///*
// * Get String manager filename
// */
//std::string CPDStringManager::getFile(const std::string& path)
//{
// return CPath::standardizePath(path) + "string_manager.bin";
//}
//
//
///*
// * Apply log
// */
//bool CPDStringManager::applyLog(NLMISC::IStream& s)
//{
// try
// {
// s.serial(_Log);
// }
// catch (Exception &e)
// {
// nlwarning("CPDStringManager::applyLog(): failed to apply log from stream, exception in serial '%s'", e.what());
// return false;
// }
//
// uint i;
// for (i=0; i<_Log.Actions.size(); ++i)
// {
// CLogAction& action = _Log.Actions[i];
//
// if (action.MapId)
// {
// addString(action.EntityId, action.String, false);
// }
// else
// {
// unmap(action.EntityId, false);
// }
// }
//
// _Log.Actions.clear();
//
// return true;
//}
//
///*
// * Store log
// */
//bool CPDStringManager::storeLog(NLMISC::IStream& s)
//{
// try
// {
// s.serial(_Log);
// }
// catch (Exception &e)
// {
// nlwarning("CPDStringManager::storeLog(): failed to store log to stream, exception in serial '%s'", e.what());
// return false;
// }
//
// _Log.Actions.clear();
//
// return true;
//}
//
///*
// * Is log file
// */
//bool CPDStringManager::isLogFileName(const std::string& filename, CTimestamp& timestamp)
//{
// char buffer[32];
// if (NLMISC::CFile::getExtension(filename) != "xml" ||
// sscanf(NLMISC::CFile::getFilenameWithoutExtension(filename).c_str(), "string_%s", &buffer) != 1)
// return false;
// timestamp.fromString(buffer);
// return true;
//}
//
///*
// * Store string in IOS
// */
//void CPDStringManager::storeStringInIOS(const ucstring& str)
//{
// CMessage msgios("STORE_STRING");
// msgios.serial( const_cast<ucstring&>(str) );
// CUnifiedNetwork::getInstance()->send("IOS", msgios);
//
// _NbProcessingStoreStringRequests++;
//}
//
///*
// * Returns true if IOS has not processed all store string requests
// */
//bool CPDStringManager::isWaitingIOSStoreStringResult()
//{
// return (_NbProcessingStoreStringRequests != 0);
//}
//
//}
//