#ifndef _H_PARAMETERS
#define _H_PARAMETERS
#include <Security/typedvalue.h>
#include <Security/debugging.h>
#include <vector>
#include <cstdarg>
namespace Security {
namespace Network {
class ParameterSource {
public:
typedef uint32 Key;
typedef GenericValue Value;
enum {
integerKey = 1, stringKey = 2, boolKey = 3, dataKey = 4 };
# define PARAMKEY(id,type) ((id) << 8 | (Security::Network::ParameterSource::type##Key))
inline int keyType(Key key) const { return key & 0xFF; }
public:
virtual ~ParameterSource() { }
public:
virtual bool getParams(Key key, Value &value) const = 0;
template <class T> bool get(Key key, T &result) const
{
TypedValue<T> value;
if (getParams(key, value)) {
result = value;
secdebug("paramsource", "%p key=0x%lx retrieved", this, key);
return true;
} else {
secdebug("paramsource", "%p key=0x%lx not found", this, key);
return false;
}
}
template <class T> T getv(Key key, T value = T()) const
{
get(key, value); return value; }
};
class ParameterPointer : public ParameterSource {
public:
ParameterPointer() : mBase(NULL) { }
ParameterPointer(ParameterSource *src) : mBase(src) { }
operator bool () const { return mBase; }
ParameterSource *parameters() const { return mBase; }
ParameterSource *parameters(ParameterSource *newBase)
{ ParameterSource *old = mBase; mBase = newBase; return old; }
ParameterSource *parameters(ParameterSource &newBase)
{ return parameters(&newBase); }
bool getParams(Key key, Value &value) const
{ return mBase && mBase->getParams(key, value); }
private:
ParameterSource *mBase; };
class ParameterStack : public ParameterSource, public vector<ParameterSource *> {
public:
bool getParams(Key key, Value &value) const;
};
} }
#endif //_H_PARAMETERS