WvStreams
|
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