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 }