WvStreams
|
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