// NeL - 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 .
#ifndef NL_RETRIEVER_BANK_H
#define NL_RETRIEVER_BANK_H
#include
#include
#include
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
#include "nel/misc/file.h"
#include "nel/misc/common.h"
#include "nel/misc/path.h"
#include "local_retriever.h"
#include "nel/pacs/u_retriever_bank.h"
namespace NLPACS
{
/**
* A bank of retrievers, shared by several global retrievers.
* \author Benjamin Legros
* \author Nevrax France
* \date 2001
*/
class CRetrieverBank : public URetrieverBank
{
friend class URetrieverBank;
protected:
/// The retrievers stored in the retriever bank.
std::vector _Retrievers;
/// All loaded ?
bool _AllLoaded;
/// Bank name prefix
std::string _NamePrefix;
/// The loaded retrievers, if the retriever bank is not in loadAll mode
std::set _LoadedRetrievers;
/// Tells if retrievers should be read from rbank directly or streamed from disk
bool _LrInRBank;
public:
/// Constructor
CRetrieverBank(bool allLoaded = true) : _AllLoaded(allLoaded), _LrInRBank(true) {}
/// Returns the vector of retrievers.
const std::vector &getRetrievers() const { return _Retrievers; }
/// Returns the number of retrievers in the bank.
uint size() const { return _Retrievers.size(); }
/// Gets nth retriever.
const CLocalRetriever &getRetriever(uint n) const
{
nlassert(n < _Retrievers.size());
/* if (!_Retrievers[n].isLoaded())
nlwarning("Trying to access rbank '%s', retriever %d not loaded", _NamePrefix.c_str(), n); */
return _Retrievers[n];
}
/// Adds the given retriever to the bank.
uint addRetriever(const CLocalRetriever &retriever) { _Retrievers.push_back(retriever); return _Retrievers.size()-1; }
/// Loads the retriever named 'filename' (using defined search paths) and adds it to the bank.
uint addRetriever(const std::string &filename)
{
NLMISC::CIFile input;
_Retrievers.resize(_Retrievers.size()+1);
CLocalRetriever &localRetriever = _Retrievers.back();
nldebug("load retriever file %s", filename.c_str());
input.open(filename);
localRetriever.serial(input);
input.close();
return _Retrievers.size()-1;
}
/// Cleans the bank up.
void clean();
/// Set the lr status
void setLrInFileFlag(bool status) { _LrInRBank = status; }
/// Serialises this CRetrieverBank.
void serial(NLMISC::IStream &f)
{
/*
Version 0:
- base version.
Version 1:
- saves & loads lr in rbank only if bool LrInFile true
*/
uint ver = f.serialVersion(1);
bool lrPresent = true;
if (ver > 0)
{
lrPresent = _LrInRBank;
f.serial(lrPresent);
}
if (f.isReading())
{
if (!_AllLoaded)
{
uint32 num = 0;
f.serial(num);
nlinfo("Presetting RetrieverBank '%s', %d retriever slots allocated", _NamePrefix.c_str(), num);
_Retrievers.resize(num);
}
else if (lrPresent)
{
f.serialCont(_Retrievers);
}
else
{
uint32 num = 0;
f.serial(num);
_Retrievers.resize(num);
uint i;
for (i=0; i &newlr, std::set &in, std::set &out)
{
std::set::const_iterator it;
for (it=_LoadedRetrievers.begin(); it!=_LoadedRetrievers.end(); ++it)
{
uint n = *it;
if (n >= _Retrievers.size())
continue;
_Retrievers[n].LoadCheckFlag = true;
}
for (it=newlr.begin(); it!=newlr.end(); ++it)
{
uint n = *it;
if (n >= _Retrievers.size())
continue;
if (!_Retrievers[n].LoadCheckFlag)
in.insert(n);
_Retrievers[n].LoadCheckFlag = false;
}
for (it=_LoadedRetrievers.begin(); it!=_LoadedRetrievers.end(); ++it)
{
uint n = *it;
if (n >= _Retrievers.size())
continue;
if (_Retrievers[n].LoadCheckFlag)
out.insert(n);
_Retrievers[n].LoadCheckFlag = false;
}
}
/// Loads nth retriever from stream
void loadRetriever(uint n, NLMISC::IStream &s)
{
if (_AllLoaded || n >= _Retrievers.size() || _Retrievers[n].isLoaded())
{
nlwarning("RetrieverBank '%s' asked to load retriever %n whereas not needed, aborted", _NamePrefix.c_str(), n);
return;
}
s.serial(_Retrievers[n]);
_LoadedRetrievers.insert(n);
}
/// Insert a retriever in loaded list
void setRetrieverAsLoaded(uint n)
{
_LoadedRetrievers.insert(n);
}
/// Unload nth retriever
void unloadRetriever(uint n)
{
if (_AllLoaded || n >= _Retrievers.size() || !_Retrievers[n].isLoaded())
{
nlwarning("RetrieverBank '%s' asked to unload retriever %n whereas not needed, aborted", _NamePrefix.c_str(), n);
return;
}
_Retrievers[n].clear();
_LoadedRetrievers.erase(n);
}
///
const std::string &getNamePrefix() const { return _NamePrefix; }
///
void setNamePrefix(const char *prefix) { _NamePrefix = prefix; }
///
bool allLoaded() const { return _AllLoaded; }
/// Tells if retriever is loaded
bool isLoaded(uint n) const
{
return (n < _Retrievers.size() && _Retrievers[n].isLoaded());
}
// @}
};
}; // NLPACS
#endif // NL_RETRIEVER_BANK_H
/* End of retriever_bank.h */