|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifndef RESMGR_H
|
|
Packit |
8f70b4 |
#define RESMGR_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "trio.h"
|
|
Packit |
8f70b4 |
#include <sys/types.h>
|
|
Packit |
8f70b4 |
#include <time.h>
|
|
Packit |
8f70b4 |
#include "TimeDate.h"
|
|
Packit |
8f70b4 |
#include "xstring.h"
|
|
Packit |
8f70b4 |
#include "xlist.h"
|
|
Packit |
8f70b4 |
#include "xmap.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
typedef const char *ResValValid(xstring_c *value);
|
|
Packit |
8f70b4 |
typedef const char *ResClValid(xstring_c *closure);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class ResValue;
|
|
Packit |
8f70b4 |
class ResMgr;
|
|
Packit |
8f70b4 |
class Resource;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
struct ResType
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static bool class_inited;
|
|
Packit |
8f70b4 |
static xmap<ResType*> *types_by_name;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *name;
|
|
Packit |
8f70b4 |
const char *defvalue;
|
|
Packit |
8f70b4 |
ResValValid *val_valid;
|
|
Packit |
8f70b4 |
ResClValid *closure_valid;
|
|
Packit |
8f70b4 |
xlist_head<Resource> *type_value_list;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *SimpleQuery(const char *closure) const;
|
|
Packit |
8f70b4 |
ResValue Query(const char *closure) const;
|
|
Packit |
8f70b4 |
bool QueryBool(const char *closure) const;
|
|
Packit |
8f70b4 |
bool QueryTriBool(const char *closure,bool a) const;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool IsAlias() const;
|
|
Packit |
8f70b4 |
const char *GetAliasTarget() const { return defvalue; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *Set(const char *cclosure,const char *cvalue,bool def=false);
|
|
Packit |
8f70b4 |
static const char *Set(const char *name,const char *closure,const char *value,bool def=false);
|
|
Packit |
8f70b4 |
static const char *SetDefault(const char *name,const char *closure,const char *value)
|
|
Packit |
8f70b4 |
{ return Set(name,closure,value,true); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Register();
|
|
Packit |
8f70b4 |
void Unregister();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static char *Format(bool with_defaults,bool only_defaults);
|
|
Packit |
8f70b4 |
static char **Generator(void);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static void ClassInit();
|
|
Packit |
8f70b4 |
static void ClassCleanup();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
enum CmpRes {
|
|
Packit |
8f70b4 |
EXACT_PREFIX=0x00,SUBSTR_PREFIX=0x01,
|
|
Packit |
8f70b4 |
EXACT_NAME =0x00,SUBSTR_NAME =0x10,
|
|
Packit |
8f70b4 |
DIFFERENT=-1
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
static int VarNameCmp(const char *name1,const char *name2);
|
|
Packit |
8f70b4 |
static const char *FindVar(const char *name,const ResType **type,const char **re_closure=0);
|
|
Packit |
8f70b4 |
static const char *FindVar(const char *name,ResType **type,const char **re_closure=0) { return FindVar(name,const_cast<const ResType **>(type),re_closure); }
|
|
Packit |
8f70b4 |
static const ResType *FindRes(const char *name);
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class Resource
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
friend class ResMgr;
|
|
Packit |
8f70b4 |
friend struct ResType;
|
|
Packit |
8f70b4 |
static xlist_head<Resource> all_list;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const ResType *type;
|
|
Packit |
8f70b4 |
xstring_c value;
|
|
Packit |
8f70b4 |
xstring_c closure;
|
|
Packit |
8f70b4 |
bool def;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xlist<Resource> all_node;
|
|
Packit |
8f70b4 |
xlist<Resource> type_value_node;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool ClosureMatch(const char *cl_data);
|
|
Packit |
8f70b4 |
void Format(xstring& buf) const;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Resource(ResType *type,const char *closure,const char *value,bool def=false);
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
~Resource();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class ResMgr : public ResType
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
ResMgr();
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
static const char *QueryNext(const char *name,const char **closure,Resource **ptr);
|
|
Packit |
8f70b4 |
static ResValue Query(const char *name,const char *closure);
|
|
Packit |
8f70b4 |
static bool QueryBool(const char *name,const char *closure);
|
|
Packit |
8f70b4 |
static bool QueryTriBool(const char *name,const char *closure,bool a);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *BoolValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *TriBoolValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *NumberValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *UNumberValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *FloatValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *TimeIntervalValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *RangeValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *ERegExpValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *IPv4AddrValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *IPv6AddrValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *UNumberPairValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *FileAccessible(xstring_c *value,int mode,bool want_dir=false);
|
|
Packit |
8f70b4 |
static const char *FileReadable(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *FileExecutable(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *DirReadable(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *FileCreatable(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *CharsetValidate(xstring_c *value);
|
|
Packit |
8f70b4 |
static const char *NoClosure(xstring_c *);
|
|
Packit |
8f70b4 |
static const char *HasClosure(xstring_c *);
|
|
Packit |
8f70b4 |
static bool str2bool(const char *value);
|
|
Packit |
8f70b4 |
static const char *AliasValidate(xstring_c *);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static int ResourceCompare(const Resource *a,const Resource *b);
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class ResDecl : public ResType
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
ResDecl(const char *a_name,const char *a_defvalue,
|
|
Packit |
8f70b4 |
ResValValid *a_val_valid,ResClValid *a_closure_valid=0);
|
|
Packit |
8f70b4 |
~ResDecl() { Unregister(); }
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
class ResDecls
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
xarray<ResType*> r;
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
ResDecls(ResType *array);
|
|
Packit |
8f70b4 |
ResDecls(ResType *r1,ResType *r2,...);
|
|
Packit |
8f70b4 |
~ResDecls();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class ResValue
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
const char *s;
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
ResValue(const char *s_new)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
s=s_new;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
bool to_bool() const
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
return ResMgr::str2bool(s);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
bool to_tri_bool(bool a) const;
|
|
Packit |
8f70b4 |
unsigned long long to_unumber(unsigned long long max) const;
|
|
Packit |
8f70b4 |
long long to_number(long long min,long long max) const;
|
|
Packit |
8f70b4 |
operator int() const;
|
|
Packit |
8f70b4 |
operator long() const;
|
|
Packit |
8f70b4 |
operator unsigned() const;
|
|
Packit |
8f70b4 |
operator unsigned long() const;
|
|
Packit |
8f70b4 |
operator double() const { return atof(s); }
|
|
Packit |
8f70b4 |
operator float() const { return atof(s); }
|
|
Packit |
8f70b4 |
operator const char*() const
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
return s;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
bool is_nil() const { return s==0; }
|
|
Packit |
8f70b4 |
bool is_empty() const { return s==0 || *s==0; }
|
|
Packit |
8f70b4 |
void ToNumberPair(int &a,int &b) const;
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class TimeIntervalR : public TimeInterval
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
const char *error_text;
|
|
Packit |
8f70b4 |
void init(const char *);
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
void Set(const char *s) { init(s); }
|
|
Packit |
8f70b4 |
TimeIntervalR() { error_text=0; }
|
|
Packit |
8f70b4 |
TimeIntervalR(const char *s) : TimeInterval(0,0) { init(s); }
|
|
Packit |
8f70b4 |
TimeIntervalR(ResValue r) : TimeInterval(0,0) { init(r); }
|
|
Packit |
8f70b4 |
TimeIntervalR(time_t s,int ms=0) : TimeInterval(s,ms) { error_text=0; }
|
|
Packit |
8f70b4 |
TimeIntervalR(const TimeDiff &d) : TimeInterval(d) { error_text=0; }
|
|
Packit |
8f70b4 |
bool Error() const { return error_text!=0; };
|
|
Packit |
8f70b4 |
const char *ErrorText() const { return error_text; }
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class NumberPair
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
long long n1,n2;
|
|
Packit |
8f70b4 |
bool no_n1,no_n2;
|
|
Packit |
8f70b4 |
const char *error_text;
|
|
Packit |
8f70b4 |
char sep;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *scale(long long *value,char suf);
|
|
Packit |
8f70b4 |
long long parse1(const char *s);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void init(char sep,const char *s);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
NumberPair(char sep) { init(sep,0); }
|
|
Packit |
8f70b4 |
NumberPair(char sep,const char *s) { init(sep,s); }
|
|
Packit |
8f70b4 |
void Set(const char *s);
|
|
Packit |
8f70b4 |
bool Error() { return error_text!=0; };
|
|
Packit |
8f70b4 |
const char *ErrorText() { return error_text; }
|
|
Packit |
8f70b4 |
long long N1() { return n1; }
|
|
Packit |
8f70b4 |
long long N2() { return n2; }
|
|
Packit |
8f70b4 |
bool HasN1() { return !no_n1; }
|
|
Packit |
8f70b4 |
bool HasN2() { return !no_n2; }
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
class Range : public NumberPair
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
Range(const char *s);
|
|
Packit |
8f70b4 |
bool Match(long long n) const { return (no_n1 || n>=n1) && (no_n2 || n<=n2); }
|
|
Packit |
8f70b4 |
bool IsFull() { return no_n1 && no_n2; }
|
|
Packit |
8f70b4 |
long long Random();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class ResClient
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static xlist_head<ResClient> list;
|
|
Packit |
8f70b4 |
xlist<ResClient> node;
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
virtual const char *ResPrefix() const { return 0; }
|
|
Packit |
8f70b4 |
virtual const char *ResClosure() const { return 0; }
|
|
Packit |
8f70b4 |
virtual void Reconfig(const char *) {}
|
|
Packit |
8f70b4 |
ResValue Query(const char *name,const char *closure=0) const;
|
|
Packit |
8f70b4 |
bool QueryBool(const char *name,const char *closure=0) const;
|
|
Packit |
8f70b4 |
bool QueryTriBool(const char *name,const char *closure,bool a) const;
|
|
Packit |
8f70b4 |
ResClient();
|
|
Packit |
8f70b4 |
virtual ~ResClient();
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
static void ReconfigAll(const char *);
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif //RESMGR_H
|