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
UniConfGen::isok
virtual bool isok()
Determines if the generator is usable and working properly.
Definition: uniconfgen.cc:152
UniConfGen::prefetch
virtual void prefetch(const UniConfKey &key, bool recursive)
Indicate that we will eventually be interested in doing get(), haschildren(), or other "get-like" ope...
Definition: uniconfgen.h:282
IUniConfGen::set
virtual void set(const UniConfKey &key, WvStringParm value)=0
Stores a string value for a key into the registry.
UniConfGen::NullIter::next
virtual bool next()
Seeks to the next element in the sequence.
Definition: uniconfgen.h:363
IUniConfGen::exists
virtual bool exists(const UniConfKey &key)=0
Without fetching its value, returns true if a key exists.
UniConfGen::Iter::value
virtual WvString value() const =0
Returns the value of the current key.
IUniConfGen::prefetch
virtual void prefetch(const UniConfKey &key, bool recursive)=0
Indicate that we will eventually be interested in doing get(), haschildren(), or other "get-like" ope...
UniConfGen::flush_buffers
virtual void flush_buffers()=0
Flushes any commitment/notification buffers .
UniConfGen::dispatch_delta
void dispatch_delta(const UniConfKey &key, WvStringParm value)
Immediately sends notification that a key has possibly changed.
Definition: uniconfgen.cc:71
UniConfGen::~UniConfGen
virtual ~UniConfGen()
Destroys the UniConfGen and may discard uncommitted data.
Definition: uniconfgen.cc:26
IUniConfGen::get
virtual WvString get(const UniConfKey &key)=0
Fetches a string value for a key from the registry.
IUniConfGen::flush_buffers
virtual void flush_buffers()=0
Flushes any commitment/notification buffers .
UniListIter
An iterator that iterates through a constant list of keys.
Definition: unilistiter.h:27
UniConfGen::str2int
virtual int str2int(WvStringParm s, int defvalue) const
Converts a string to an integer.
Definition: uniconfgen.cc:126
UniConfGen::recursiveiterator
virtual Iter * recursiveiterator(const UniConfKey &key)
Like iterator(), but the returned iterator is recursive, that is, it will return children of the imme...
Definition: uniconfgen.cc:260
IUniConfGen::ListIter
::UniListIter ListIter
An iterator over a constant list of keys (see below)
Definition: uniconfgen.h:160
UniConfGen::Iter::key
virtual UniConfKey key() const =0
Returns the current key.
UniConfGen::get
virtual WvString get(const UniConfKey &key)=0
Fetches a string value for a key from the registry.
IUniConfGen::haschildren
virtual bool haschildren(const UniConfKey &key)=0
Returns true if a key has children.
UniConfGen::unhold_delta
void unhold_delta()
Resumes notifications when each hold_delta() has been matched.
Definition: uniconfgen.cc:38
WvString
WvString is an implementation of a simple and efficient printable-string class.
Definition: wvstring.h:329
UniConfGen::commit
virtual void commit()
Commits any changes.
Definition: uniconfgen.h:280
IUniConfGen
An abstract data container that backs a UniConf tree.
Definition: uniconfgen.h:39
UniConfGen::NullIter::rewind
virtual void rewind()
Rewinds the iterator.
Definition: uniconfgen.h:362
UniConfKey
Represents a UniConf key which is a path in a hierarchy structured much like the traditional Unix fil...
Definition: uniconfkey.h:38
UniConfGen::NullIter::value
virtual WvString value() const
Returns the value of the current key.
Definition: uniconfgen.h:365
UniConfGen::set
virtual void set(const UniConfKey &key, WvStringParm value)=0
Stores a string value for a key into the registry.
UniConfGen::haschildren
virtual bool haschildren(const UniConfKey &key)
Returns true if a key has children.
Definition: uniconfgen.cc:101
UniConfGen::delta
void delta(const UniConfKey &key, WvStringParm value)
Call this when a key's value or children have possibly changed.
Definition: uniconfgen.cc:77
IUniConfGen::str2int
virtual int str2int(WvStringParm s, int defvalue) const =0
Converts a string to an integer.
IObject
Definition: IObject.h:65
IUniConfGen::commit
virtual void commit()=0
Commits any changes.
UniConfGen::clear_delta
void clear_delta()
Clears the list of pending notifications without sending them.
Definition: uniconfgen.cc:47
UniConfKey::EMPTY
static UniConfKey EMPTY
Definition: uniconfkey.h:171
UniConfGen
A default implementation of IUniConfGen, providing various handy features that save trouble when impl...
Definition: uniconfgen.h:199
UniConfGen::Iter::rewind
virtual void rewind()=0
Rewinds the iterator.
IUniConfGen::del_callback
virtual void del_callback(void *cookie)=0
Removes a callback for change notification.
UniConfGen::setv
virtual void setv(const UniConfPairList &pairs)=0
Stores multiple key-value pairs into the registry.
IUniConfGen::isok
virtual bool isok()=0
Determines if the generator is usable and working properly.
IUniConfGen::iterator
virtual Iter * iterator(const UniConfKey &key)=0
Returns an iterator over the children of the specified key.
IUniConfGen::refresh
virtual bool refresh()=0
Refreshes information about a key recursively.
WvCallbackList< UniConfGenCallback >
UniConfGen::Iter::next
virtual bool next()=0
Seeks to the next element in the sequence.
UniConfGen::NullIter
An iterator that's always empty.
Definition: uniconfgen.h:357
IUniConfGen::add_callback
virtual void add_callback(void *cookie, const UniConfGenCallback &callback)=0
Adds a callback for change notification.
UniConfGen::flush_delta
void flush_delta()
Flushes the list of pending notifications by sending them.
Definition: uniconfgen.cc:53
UniConfGen::refresh
virtual bool refresh()
Refreshes information about a key recursively.
Definition: uniconfgen.h:281
UniConfGen::Iter::~Iter
virtual ~Iter()
Destroys the iterator.
Definition: uniconfgen.h:327
UniConfGen::iterator
virtual Iter * iterator(const UniConfKey &key)=0
Returns an iterator over the children of the specified key.
UniConfGen::add_callback
virtual void add_callback(void *cookie, const UniConfGenCallback &callback)
Adds a callback for change notification.
Definition: uniconfgen.cc:158
IUniConfGen::setv
virtual void setv(const UniConfPairList &pairs)=0
Stores multiple key-value pairs into the registry.
IUniConfGen::recursiveiterator
virtual Iter * recursiveiterator(const UniConfKey &key)=0
Like iterator(), but the returned iterator is recursive, that is, it will return children of the imme...
UniConfGen::UniConfGen
UniConfGen()
Creates a UniConfGen object.
Definition: uniconfgen.cc:20
UniConfGen::del_callback
virtual void del_callback(void *cookie)
Removes a callback for change notification.
Definition: uniconfgen.cc:165
UniConfGen::hold_delta
void hold_delta()
Pauses notifications until matched with a call to unhold_delta().
Definition: uniconfgen.cc:32
UniConfGen::NullIter::key
virtual UniConfKey key() const
Returns the current key.
Definition: uniconfgen.h:364
UniConfGen::exists
virtual bool exists(const UniConfKey &key)
Without fetching its value, returns true if a key exists.
Definition: uniconfgen.cc:120
DEFINE_IID
#define DEFINE_IID(iface, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11)
Used to define the IID of an interface.
Definition: uuid.h:134
UniConfGen::Iter
An abstract iterator over keys and values in a generator.
Definition: uniconfgen.h:323