WvStreams
unicallbackgen.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 2002 Net Integration Technologies, Inc.
00004  *
00005  * A UniConf generator that executes callbacks to generate the value of keys
00006  */
00007 #ifndef __UNICALLBACKGEN_H
00008 #define __UNICALLBACKGEN_H
00009 
00010 #include <map>
00011 
00012 #include "unitempgen.h"
00013 #include "wvstream.h"
00014 #include "wvtr1.h"
00015 
00016 typedef wv::function<WvString(const UniConfKey&)>
00017         UniCallbackGenGetCallback;
00018 typedef wv::function<void(const UniConfKey&, WvStringParm)>
00019         UniCallbackGenSetCallback;
00020 
00028 class UniCallbackGen: public UniTempGen
00029 {
00030     typedef std::map<UniConfKey, UniCallbackGenGetCallback> GetCallbackMap;
00031     GetCallbackMap get_callbacks;
00032     typedef std::map<UniConfKey, UniCallbackGenSetCallback> SetCallbackMap;
00033     SetCallbackMap set_callbacks;
00034 
00035 public:
00036     
00037     bool update_before_get;
00038     bool update_after_set;
00039 
00040     UniCallbackGen():
00041         update_before_get(false),
00042         update_after_set(true) {}
00043     virtual ~UniCallbackGen() {}
00044 
00045     virtual void setgetcallback(const UniConfKey &key,
00046             UniCallbackGenGetCallback get_callback)
00047     {
00048         if (get_callback)
00049             get_callbacks[key] = get_callback;
00050         else
00051             get_callbacks.erase(key);
00052     }
00053     virtual void setsetcallback(const UniConfKey &key,
00054             UniCallbackGenSetCallback set_callback)
00055     {
00056         if (set_callback)
00057             set_callbacks[key] = set_callback;
00058         else
00059             set_callbacks.erase(key);
00060     }
00061 
00062     virtual void update(const UniConfKey &key, 
00063             WvStringParm value = WvString::null)
00064     {
00065         GetCallbackMap::iterator it = get_callbacks.find(key);
00066         if (it != get_callbacks.end())
00067             UniTempGen::set(key, it->second(key));
00068         else
00069             UniTempGen::set(key, value);
00070     }
00071 
00072     /***** Overridden members *****/
00073     virtual WvString get(const UniConfKey &key)
00074     {
00075         if (update_before_get) update(key);
00076 
00077         return UniTempGen::get(key);
00078     }
00079     virtual void set(const UniConfKey &key, WvStringParm value)
00080     {
00081         SetCallbackMap::iterator it = set_callbacks.find(key);
00082         if (it != set_callbacks.end())
00083             it->second(key, value);
00084 
00085         if (update_after_set)
00086             update(key, value);
00087     }
00088 };
00089 
00090 
00091 #endif // __UNICALLBACKGEN_H