00001
00002
00003
00004
00005
00006
00007 #include "uniconf.h"
00008 #include "unicachegen.h"
00009 #include "wvmoniker.h"
00010
00011
00012
00013 static UniConfGen *creator(WvStringParm s, IObject *obj, void *)
00014 {
00015 UniConfGen *gen = NULL;
00016
00017 if (obj)
00018 gen = mutate<UniConfGen>(obj);
00019 if (!gen)
00020 gen = wvcreate<UniConfGen>(s);
00021
00022 return new UniCacheGen(gen);
00023 }
00024
00025 static WvMoniker<UniConfGen> reg("cache", creator);
00026
00027
00028
00029
00030 UniCacheGen::UniCacheGen(UniConfGen *_inner)
00031 : log("UniCache", WvLog::Debug1), inner(_inner)
00032 {
00033 loadtree();
00034
00035 if (inner)
00036 inner->setcallback(UniConfGenCallback(this,
00037 &UniCacheGen::deltacallback), NULL);
00038 }
00039
00040
00041 UniCacheGen::~UniCacheGen()
00042 {
00043 delete inner;
00044 }
00045
00046
00047 void UniCacheGen::loadtree(const UniConfKey &key)
00048 {
00049 UniConfGen::Iter *i = inner->iterator(key);
00050
00051 if (!i)
00052 return;
00053
00054 for (i->rewind(); i->next(); )
00055 {
00056 WvString newkey("%s/%s", key, (*i).key());
00057 WvString value(inner->get(newkey));
00058
00059 if (!!value)
00060 UniTempGen::set(newkey, value);
00061
00062 if (inner->haschildren(newkey))
00063 loadtree(newkey);
00064 }
00065
00066 delete i;
00067 }
00068
00069
00070 void UniCacheGen::deltacallback(const UniConfKey &key, WvStringParm value,
00071 void *userdata)
00072 {
00073 UniTempGen::set(key, value);
00074 }
00075
00076
00077 void UniCacheGen::set(const UniConfKey &key, WvStringParm value)
00078 {
00079 inner->set(key, value);
00080 }