Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

unitempgen.cc

Go to the documentation of this file.
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 2002 Net Integration Technologies, Inc.
00004  * 
00005  * A UniConf generator that stores keys in memory.
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 /***** UniTempGen *****/
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         // remove a subtree
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); // REMOVED
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(); // not the last node in the key?
00074             
00075             if (!node)
00076             {
00077                 // we'll have to create the sub-node, since we couldn't
00078                 // find the most recent part of the key.
00079                 node = new UniConfValueTree(prev, prevkey,
00080                                             more ? WvStringParm("") : value);
00081                 dirty = true;
00082                 if (!prev) // we just created the root
00083                     root = node;
00084                 delta(node->fullkey(), value); // ADDED
00085                 if (!more)
00086                     break; // done!
00087             }
00088             else if (!more)
00089             {
00090                 // don't have to create the most recent sub-node, but there
00091                 // are no more sub-nodes; that means we're changing the value
00092                 // of an existing node.
00093                 if (value != node->value())
00094                 {
00095                     node->setvalue(value);
00096                     dirty = true;
00097                     delta(node->fullkey(), value); // CHANGED
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 /***** UniTempGen::NodeIter *****/
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 }

Generated on Sat Mar 13 14:55:26 2004 for WvStreams by doxygen 1.3.6-20040222