00001
00002
00003
00004
00005
00006
00007 #include "wvconf.h"
00008 #include "uniwvconfgen.h"
00009 #include "wvmoniker.h"
00010
00014 class UniWvConfGen::WvConfIter : public UniConfGen::Iter
00015 {
00016 protected:
00017 WvConfigSection::Iter i;
00018
00019 public:
00020 WvConfIter(WvConfigSection *sect);
00021
00022
00023
00024 virtual void rewind();
00025 virtual bool next();
00026 virtual UniConfKey key() const;
00027 virtual WvString value() const;
00028 };
00029
00030
00031 static IUniConfGen *creator(WvStringParm s)
00032 {
00033 return new UniWvConfGen(new WvConf(s));
00034 }
00035
00036 static WvMoniker<IUniConfGen> reg("wvconf", creator);
00037
00038
00039 void UniWvConfGen::notify(void *userdata, WvStringParm section,
00040 WvStringParm entry, WvStringParm oldval,
00041 WvStringParm newval)
00042 {
00043 UniConfKey key(section, entry);
00044
00045 tempvalue = newval;
00046 tempkey = &key;
00047 delta(key, newval);
00048 tempkey = NULL;
00049 }
00050
00051
00052 UniWvConfGen::UniWvConfGen(WvConf *_cfg):
00053 tempkey(NULL), tempvalue(), cfg(_cfg)
00054 {
00055 cfg->add_callback(WvConfCallback(this, &UniWvConfGen::notify), NULL,
00056 "", "", this);
00057 }
00058
00059
00060 UniWvConfGen::~UniWvConfGen()
00061 {
00062 if (cfg)
00063 delete cfg;
00064 }
00065
00066
00067 WvString UniWvConfGen::get(const UniConfKey &key)
00068 {
00069 if (tempkey && key == *tempkey)
00070 return tempvalue;
00071 else
00072 return cfg->get(key.first(), key.last(key.numsegments() - 1));
00073 }
00074
00075
00076 void UniWvConfGen::set(const UniConfKey &key, WvStringParm value)
00077 {
00078 WvString section = key.first();
00079 WvString keyname = key.last(key.numsegments() - 1);
00080
00081 WvConfigSection *sect = (*cfg)[section];
00082 if (value == WvString::null && sect)
00083 cfg->delete_section(key);
00084 else
00085 cfg->set(section, keyname, value);
00086 }
00087
00088
00089 void UniWvConfGen::setv(const UniConfPairList &pairs)
00090 {
00091 setv_naive(pairs);
00092 }
00093
00094
00095 bool UniWvConfGen::haschildren(const UniConfKey &key)
00096 {
00097 WvConfigSection *sect = (*cfg)[key];
00098 if (sect)
00099 return true;
00100 return false;
00101 }
00102
00103
00104 UniWvConfGen::Iter *UniWvConfGen::iterator(const UniConfKey &key)
00105 {
00106 WvConfigSection *sect = (*cfg)[key];
00107
00108 if (sect)
00109 return new WvConfIter(sect);
00110 else
00111 return NULL;
00112 }
00113
00114
00115
00116
00117
00118 UniWvConfGen::WvConfIter::WvConfIter(WvConfigSection *sect)
00119 : i(*sect)
00120 {
00121 }
00122
00123
00124 void UniWvConfGen::WvConfIter::rewind()
00125 {
00126 i.rewind();
00127 }
00128
00129
00130 bool UniWvConfGen::WvConfIter::next()
00131 {
00132 return i.next();
00133 }
00134
00135
00136 UniConfKey UniWvConfGen::WvConfIter::key() const
00137 {
00138 return i->name;
00139 }
00140
00141
00142 WvString UniWvConfGen::WvConfIter::value() const
00143 {
00144 return i->value;
00145 }