WvStreams
uniconfgen.h
1 /* -*- Mode: C++ -*-
2  * Worldvisions Weaver Software:
3  * Copyright (C) 2002 Net Integration Technologies, Inc.
4  *
5  * An abstract data container that backs a UniConf tree.
6  */
7 #ifndef __UNICONFGEN_H
8 #define __UNICONFGEN_H
9 
10 #include "uniconfpair.h"
11 #include "wvcallbacklist.h"
12 #include "wvtr1.h"
13 
14 class UniConfGen;
15 class UniListIter;
16 
30 typedef wv::function<void(const UniConfKey&, WvStringParm)>
31  UniConfGenCallback;
32 
39 class IUniConfGen : public IObject
40 {
41 public:
42  virtual ~IUniConfGen();
43 
44  /***** Notification API *****/
45 
47  virtual void add_callback(void *cookie,
48  const UniConfGenCallback &callback) = 0;
49 
51  virtual void del_callback(void *cookie) = 0;
52 
53 
54  /***** Status API *****/
55 
60  virtual bool isok() = 0;
61 
62 
63  /***** Key Persistence API *****/
64 
66  virtual void commit() = 0;
67 
74  virtual bool refresh() = 0;
75 
82  virtual void flush_buffers() = 0;
83 
84  /***** Key Retrieval API *****/
85 
95  virtual void prefetch(const UniConfKey &key, bool recursive) = 0;
96 
101  virtual WvString get(const UniConfKey &key) = 0;
102 
111  virtual bool exists(const UniConfKey &key) = 0;
112 
113 
123  virtual int str2int(WvStringParm s, int defvalue) const = 0;
124 
125 
126  /***** Key Storage API *****/
127 
132  virtual void set(const UniConfKey &key, WvStringParm value) = 0;
133 
134 
139  virtual void setv(const UniConfPairList &pairs) = 0;
140 
141 
142  /***** Key Enumeration API *****/
143 
154  virtual bool haschildren(const UniConfKey &key) = 0;
155 
157  class Iter;
158 
160  class NullIter;
161 
163  typedef ::UniListIter ListIter;
164 
172  virtual Iter *iterator(const UniConfKey &key) = 0;
173 
188  virtual Iter *recursiveiterator(const UniConfKey &key) = 0;
189 };
190 
191 DEFINE_IID(IUniConfGen, {0x7ca76e98, 0xb694, 0x43ca,
192  {0xb0, 0x56, 0x8b, 0x9d, 0xde, 0x9a, 0xbe, 0x9f}});
193 
194 
199 class UniConfGen : public IUniConfGen
200 {
201  IMPLEMENT_IOBJECT(UniConfGen);
202 
203  // These fields are deliberately hidden to encourage use of the
204  // special notification members
205 
207  int hold_nesting;
208  UniConfPairList deltas;
209 
210 protected:
212  UniConfGen();
213 
214 public:
216  virtual ~UniConfGen();
217 
218  /***** Notification API *****/
219 
224  virtual void add_callback(void *cookie,
225  const UniConfGenCallback &callback);
226  virtual void del_callback(void *cookie);
227 
234  void dispatch_delta(const UniConfKey &key, WvStringParm value);
235 
244  void hold_delta();
245 
254  void unhold_delta();
255 
260  void clear_delta();
261 
266  void flush_delta();
267 
274  void delta(const UniConfKey &key, WvStringParm value);
275 
276  /***** Status API *****/
277  virtual bool isok();
278 
279  /***** Key Persistence API *****/
280  virtual void commit() { }
281  virtual bool refresh() { return true; }
282  virtual void prefetch(const UniConfKey &key, bool recursive) { }
283  virtual WvString get(const UniConfKey &key) = 0;
284  virtual bool exists(const UniConfKey &key);
285  virtual int str2int(WvStringParm s, int defvalue) const;
286 
287  /***** Key Storage API *****/
288  virtual void set(const UniConfKey &key, WvStringParm value) = 0;
289  virtual void setv(const UniConfPairList &pairs) = 0;
290 
291  virtual void flush_buffers() = 0;
292 
293  /***** Key Enumeration API *****/
294  virtual bool haschildren(const UniConfKey &key);
295  virtual Iter *iterator(const UniConfKey &key) = 0;
296 
297  // a helpful default that just calls iterator() recursively
298  virtual Iter *recursiveiterator(const UniConfKey &key);
299 
300 protected:
301  // A naive implementation of setv() that uses only set().
302  void setv_naive(const UniConfPairList &pairs);
303 };
304 
305 DeclareWvList(IUniConfGen);
306 DeclareWvList2(UniConfGenList, IUniConfGen);
307 
308 
324 {
325 public:
327  virtual ~Iter() { }
328 
333  virtual void rewind() = 0;
334 
340  virtual bool next() = 0;
341 
343  virtual UniConfKey key() const = 0;
344 
349  virtual WvString value() const = 0;
350 };
351 
352 
358 {
359 public:
360  /***** Overridden members *****/
361 
362  virtual void rewind() { }
363  virtual bool next() { return false; }
364  virtual UniConfKey key() const { return UniConfKey::EMPTY; }
365  virtual WvString value() const { return WvString(); }
366 };
367 
368 
369 #endif // __UNICONFGEN_H