WvStreams
uniconfroot.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * Defines the root management class for UniConf.
00006  */
00007 #ifndef __UNICONFROOT_H
00008 #define __UNICONFROOT_H
00009 
00010 #include "uniconf.h"
00011 #include "uniconftree.h"
00012 #include "unimountgen.h"
00013 
00014 
00019 class UniWatchInfo
00020 {
00021 public:
00022     void *cookie;
00023     bool recurse;
00024     UniConfCallback cb;
00025 
00026     UniWatchInfo(void *_cookie, bool _recurse, UniConfCallback _cb)
00027         : cookie(_cookie), recurse(_recurse), cb(_cb) { }
00028 
00030     bool recursive()
00031         { return recurse; }
00032 
00034     void notify(const UniConf &cfg, const UniConfKey &key)
00035         { cb(cfg, key); }
00036 
00038     bool operator== (const UniWatchInfo &other) const
00039         { return other.cookie == cookie; }
00040 };
00041 DeclareWvList(UniWatchInfo);
00042 
00043 
00048 class UniWatchInfoTree : public UniConfTree<UniWatchInfoTree>
00049 {
00050 public:
00051     UniWatchInfoList watches;
00052     
00053     UniWatchInfoTree(UniWatchInfoTree *parent,
00054                  const UniConfKey &key = UniConfKey::EMPTY)
00055         : UniConfTree<UniWatchInfoTree>(parent, key) { }
00056 
00058     bool isessential()
00059         { return haschildren() || ! watches.isempty(); }
00060 };
00061 
00062 
00073 class UniConfRoot : public UniConf
00074 {
00075     friend class UniConf;
00076     friend class UniConf::Iter;
00077     friend class UniConf::RecursiveIter;
00078 
00079     UniWatchInfoTree watchroot;
00080     
00082     UniConfRoot(const UniConfRoot &other);
00083 
00084 public:
00086     UniConfRoot();
00087 
00093     UniConfRoot(WvStringParm moniker, bool refresh = true);
00094 
00100     UniConfRoot(UniConfGen *gen, bool refresh = true);
00101     
00103     ~UniConfRoot();
00104 
00109     void add_callback(void *cookie, const UniConfKey &key,
00110                       const UniConfCallback &callback, bool recurse = true);
00111     
00115     void del_callback(void *cookie, const UniConfKey &key,
00116                       bool recurse = true);
00117 
00122     void add_setbool(const UniConfKey &key, bool *flag, bool recurse = true);
00123 
00127     void del_setbool(const UniConfKey &key, bool *flag, bool recurse = true);
00128 
00129 private:
00136     void check(UniWatchInfoTree *node, const UniConfKey &key, int segleft);
00137 
00143     void deletioncheck(UniWatchInfoTree *node, const UniConfKey &key);
00144 
00146     void prune(UniWatchInfoTree *node);
00147     
00149     void gen_callback(const UniConfKey &key, WvStringParm value);
00150 
00151 protected:
00152     friend class UniUnwrapGen;
00153     UniMountGen mounts;
00154     
00155 public:
00157     static void setbool_callback(bool *flag, const UniConf &,
00158                                  const UniConfKey &)
00159         { *flag = true; }
00160 
00161 };
00162 
00163 #endif //__UNICONFROOT_H