WvStreams
uniconfgen.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 2002 Net Integration Technologies, Inc.
00004  * 
00005  * An abstract data container that backs a UniConf tree.
00006  */
00007 #ifndef __UNICONFGEN_H
00008 #define __UNICONFGEN_H
00009  
00010 #include "uniconfpair.h"
00011 #include "wvcallbacklist.h"
00012 #include "wvtr1.h"
00013 
00014 class UniConfGen;
00015 class UniListIter;
00016 
00030 typedef wv::function<void(const UniConfKey&, WvStringParm)> 
00031     UniConfGenCallback;
00032 
00039 class IUniConfGen : public IObject
00040 {
00041 public:
00042     virtual ~IUniConfGen();
00043     
00044     /***** Notification API *****/
00045     
00047     virtual void add_callback(void *cookie,
00048                               const UniConfGenCallback &callback) = 0;
00049     
00051     virtual void del_callback(void *cookie) = 0;
00052     
00053 
00054     /***** Status API *****/
00055     
00060     virtual bool isok() = 0;
00061 
00062     
00063     /***** Key Persistence API *****/
00064     
00066     virtual void commit() = 0;
00067     
00074     virtual bool refresh() = 0;
00075 
00082     virtual void flush_buffers() = 0;
00083 
00084     /***** Key Retrieval API *****/
00085     
00095     virtual void prefetch(const UniConfKey &key, bool recursive) = 0;
00096     
00101     virtual WvString get(const UniConfKey &key) = 0;
00102     
00111     virtual bool exists(const UniConfKey &key) = 0;
00112 
00113 
00123     virtual int str2int(WvStringParm s, int defvalue) const = 0;
00124 
00125     
00126     /***** Key Storage API *****/
00127     
00132     virtual void set(const UniConfKey &key, WvStringParm value) = 0;
00133 
00134 
00139     virtual void setv(const UniConfPairList &pairs) = 0;
00140 
00141 
00142     /***** Key Enumeration API *****/
00143     
00154     virtual bool haschildren(const UniConfKey &key) = 0;
00155 
00157     class Iter;
00158 
00160     class NullIter;
00161     
00163     typedef ::UniListIter ListIter;
00164 
00172     virtual Iter *iterator(const UniConfKey &key) = 0;
00173     
00188     virtual Iter *recursiveiterator(const UniConfKey &key) = 0;
00189 };
00190 
00191 DEFINE_IID(IUniConfGen, {0x7ca76e98, 0xb694, 0x43ca,
00192     {0xb0, 0x56, 0x8b, 0x9d, 0xde, 0x9a, 0xbe, 0x9f}});
00193 
00194 
00199 class UniConfGen : public IUniConfGen
00200 {
00201     IMPLEMENT_IOBJECT(UniConfGen);
00202 
00203     // These fields are deliberately hidden to encourage use of the
00204     // special notification members
00205 
00206     WvCallbackList<UniConfGenCallback> cblist;
00207     int hold_nesting;
00208     UniConfPairList deltas;
00209     
00210 protected:
00212     UniConfGen();
00213 
00214 public:
00216     virtual ~UniConfGen();
00217 
00218     /***** Notification API *****/
00219     
00224     virtual void add_callback(void *cookie, 
00225                               const UniConfGenCallback &callback);
00226     virtual void del_callback(void *cookie);
00227     
00234     void dispatch_delta(const UniConfKey &key, WvStringParm value);
00235 
00244     void hold_delta();
00245 
00254     void unhold_delta();
00255 
00260     void clear_delta();
00261 
00266     void flush_delta();
00267 
00274     void delta(const UniConfKey &key, WvStringParm value);   
00275     
00276     /***** Status API *****/
00277     virtual bool isok();
00278     
00279     /***** Key Persistence API *****/
00280     virtual void commit() { }
00281     virtual bool refresh() { return true; }
00282     virtual void prefetch(const UniConfKey &key, bool recursive) { }
00283     virtual WvString get(const UniConfKey &key) = 0;
00284     virtual bool exists(const UniConfKey &key);
00285     virtual int str2int(WvStringParm s, int defvalue) const;
00286 
00287     /***** Key Storage API *****/
00288     virtual void set(const UniConfKey &key, WvStringParm value) = 0;
00289     virtual void setv(const UniConfPairList &pairs) = 0;
00290 
00291     virtual void flush_buffers() = 0;
00292 
00293     /***** Key Enumeration API *****/
00294     virtual bool haschildren(const UniConfKey &key);
00295     virtual Iter *iterator(const UniConfKey &key) = 0;
00296     
00297     // a helpful default that just calls iterator() recursively
00298     virtual Iter *recursiveiterator(const UniConfKey &key);
00299 
00300 protected:
00301     // A naive implementation of setv() that uses only set().
00302     void setv_naive(const UniConfPairList &pairs);
00303 };
00304 
00305 DeclareWvList(IUniConfGen);
00306 DeclareWvList2(UniConfGenList, IUniConfGen);
00307 
00308 
00323 class UniConfGen::Iter
00324 {
00325 public:
00327     virtual ~Iter() { }
00328 
00333     virtual void rewind() = 0;
00334 
00340     virtual bool next() = 0;
00341 
00343     virtual UniConfKey key() const = 0;
00344     
00349     virtual WvString value() const = 0;
00350 };
00351 
00352 
00357 class UniConfGen::NullIter : public UniConfGen::Iter
00358 {
00359 public:
00360     /***** Overridden members *****/
00361     
00362     virtual void rewind() { }
00363     virtual bool next() { return false; }
00364     virtual UniConfKey key() const { return UniConfKey::EMPTY; }
00365     virtual WvString value() const { return WvString(); }
00366 };
00367 
00368 
00369 #endif // __UNICONFGEN_H