00001
00002
00003
00004
00005
00006
00007 #include "unitempgen.h"
00008 #include "wvmoniker.h"
00009 #include "wvlog.h"
00010
00011 static UniConfGen *creator(WvStringParm, IObject *, void *)
00012 {
00013 return new UniTempGen();
00014 }
00015
00016 static WvMoniker<UniConfGen> reg("temp", creator);
00017
00018
00019
00020 UniTempGen::UniTempGen()
00021 : root(NULL)
00022 {
00023 }
00024
00025
00026 UniTempGen::~UniTempGen()
00027 {
00028 delete root;
00029 }
00030
00031
00032 WvString UniTempGen::get(const UniConfKey &key)
00033 {
00034 if (root)
00035 {
00036 UniConfValueTree *node = root->find(key);
00037 if (node)
00038 return node->value();
00039 }
00040 return WvString::null;
00041 }
00042
00043
00044 void UniTempGen::set(const UniConfKey &key, WvStringParm value)
00045 {
00046 hold_delta();
00047 if (value.isnull())
00048 {
00049
00050 if (root)
00051 {
00052 UniConfValueTree *node = root->find(key);
00053 if (node)
00054 {
00055 delete node;
00056 if (node == root)
00057 root = NULL;
00058 dirty = true;
00059 delta(key, WvString::null);
00060 }
00061 }
00062 }
00063 else
00064 {
00065 UniConfValueTree *node = root;
00066 UniConfValueTree *prev = NULL;
00067 UniConfKey prevkey;
00068
00069 UniConfKey::Iter it(key);
00070 it.rewind();
00071 for (;;)
00072 {
00073 bool more = it.next();
00074
00075 if (!node)
00076 {
00077
00078
00079 node = new UniConfValueTree(prev, prevkey,
00080 more ? WvStringParm("") : value);
00081 dirty = true;
00082 if (!prev)
00083 root = node;
00084 delta(node->fullkey(), value);
00085 if (!more)
00086 break;
00087 }
00088 else if (!more)
00089 {
00090
00091
00092
00093 if (value != node->value())
00094 {
00095 node->setvalue(value);
00096 dirty = true;
00097 delta(node->fullkey(), value);
00098 }
00099 break;
00100 }
00101 prevkey = *it;
00102 prev = node;
00103 node = prev->findchild(prevkey);
00104 }
00105 assert(node);
00106 }
00107
00108 unhold_delta();
00109 }
00110
00111
00112 bool UniTempGen::exists(const UniConfKey &key)
00113 {
00114 if (root)
00115 {
00116 UniConfValueTree *node = root->find(key);
00117 return node != NULL;
00118 }
00119 return false;
00120 }
00121
00122
00123 bool UniTempGen::haschildren(const UniConfKey &key)
00124 {
00125 if (root)
00126 {
00127 UniConfValueTree *node = root->find(key);
00128 return node != NULL && node->haschildren();
00129 }
00130 return false;
00131 }
00132
00133
00134 UniConfGen::Iter *UniTempGen::iterator(const UniConfKey &key)
00135 {
00136 if (root)
00137 {
00138 UniConfValueTree *node = root->find(key);
00139 if (node)
00140 return new NodeIter(this, UniConfValueTree::Iter(*node));
00141 }
00142 return new NullIter();
00143 }
00144
00145
00146
00147
00148
00149 UniTempGen::NodeIter::NodeIter(UniTempGen *gen,
00150 const UniConfValueTree::Iter &it) :
00151 xgen(gen), xit(it)
00152 {
00153 }
00154
00155
00156 UniTempGen::NodeIter::~NodeIter()
00157 {
00158 }
00159
00160
00161 void UniTempGen::NodeIter::rewind()
00162 {
00163 xit.rewind();
00164 }
00165
00166
00167 bool UniTempGen::NodeIter::next()
00168 {
00169 return xit.next();
00170 }
00171
00172
00173 UniConfKey UniTempGen::NodeIter::key() const
00174 {
00175 return xit->key();
00176 }