00001
00002
00003
00004
00005
00006
00007 #ifndef __UNICALLBACKGEN_H
00008 #define __UNICALLBACKGEN_H
00009
00010 #include "unitempgen.h"
00011 #include "wvhashtable.h"
00012 #include "wvcallback.h"
00013 #include "wvstream.h"
00014
00015 typedef WvCallback<WvString, const UniConfKey &>
00016 UniCallbackGenGetCallback;
00017 typedef WvCallback<void, const UniConfKey &, WvStringParm>
00018 UniCallbackGenSetCallback;
00019
00027 class UniCallbackGen : public UniTempGen
00028 {
00029 WvMap<UniConfKey, UniCallbackGenGetCallback> get_callbacks;
00030 WvMap<UniConfKey, UniCallbackGenSetCallback> set_callbacks;
00031
00032 public:
00033
00034 bool update_before_get;
00035 bool update_after_set;
00036
00037 UniCallbackGen(int size) :
00038 get_callbacks(size),
00039 set_callbacks(size),
00040 update_before_get(false),
00041 update_after_set(true) {}
00042 virtual ~UniCallbackGen() {}
00043
00044 virtual void setgetcallback(const UniConfKey &key,
00045 UniCallbackGenGetCallback get_callback)
00046 {
00047 if (!!get_callback)
00048 get_callbacks.set(key, get_callback);
00049 else
00050 get_callbacks.remove(key);
00051 }
00052 virtual void setsetcallback(const UniConfKey &key,
00053 UniCallbackGenSetCallback set_callback)
00054 {
00055 if (!!set_callback)
00056 set_callbacks.set(key, set_callback);
00057 else
00058 set_callbacks.remove(key);
00059 }
00060
00061 virtual void update(const UniConfKey &key)
00062 {
00063 if (get_callbacks.exists(key))
00064 {
00065 UniCallbackGenGetCallback &get_callback = get_callbacks[key];
00066 UniTempGen::set(key, get_callback(key));
00067 }
00068 else UniTempGen::set(key, WvString::null);
00069 }
00070
00071
00072 virtual WvString get(const UniConfKey &key)
00073 {
00074 if (update_before_get) update(key);
00075
00076 return UniTempGen::get(key);
00077 }
00078 virtual void set(const UniConfKey &key, WvStringParm value)
00079 {
00080 if (set_callbacks.exists(key))
00081 {
00082 UniCallbackGenSetCallback &set_callback = set_callbacks[key];
00083 set_callback(key, value);
00084 }
00085
00086 if (update_after_set) update(key);
00087 }
00088 };
00089
00090
00091 #endif // __UNICALLBACKGEN_H