00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSUTIL_CSCONFIGEVENTNOTIFIER_H__
00020 #define __CS_CSUTIL_CSCONFIGEVENTNOTIFIER_H__
00021
00022 #include "csextern.h"
00023 #include "csutil/ref.h"
00024 #include "csutil/scf_implementation.h"
00025
00026 #include "iutil/eventh.h"
00027 #include "csutil/cseventq.h"
00028 #include "iutil/event.h"
00029
00030 #include "iutil/cfgnotifier.h"
00031
00032 struct iObjectRegistry;
00033 struct iEventQueue;
00034 struct iEventNameRegistry;
00035
00036 namespace CS
00037 {
00038 namespace Utility
00039 {
00040 class CS_CRYSTALSPACE_EXPORT ConfigEventNotifier :
00041 public scfImplementation1<ConfigEventNotifier, iConfigListener>
00042 {
00043 public:
00044 ConfigEventNotifier(iObjectRegistry* obj_reg);
00045 ~ConfigEventNotifier();
00046
00048 virtual void Set (const char* key, const char* value);
00050 virtual void Set (const char* key, int value);
00052 virtual void Set (const char* key, float value);
00054 virtual void Set (const char* key, bool value);
00056 virtual void Set (const char* key, iStringArray* value);
00057
00058 private:
00059 iObjectRegistry* obj_reg;
00061 csRef<iEventQueue> eventQueue;
00063 csRef<iEventNameRegistry> nameRegistry;
00064 };
00065
00066 class CS_CRYSTALSPACE_EXPORT ConfigListenerBase :
00067 public scfImplementation1<ConfigListenerBase, iEventHandler>
00068 {
00069 public:
00070 ConfigListenerBase (iObjectRegistry* obj_reg, const char* key);
00071 ~ConfigListenerBase ();
00072
00073 private:
00074 iObjectRegistry* obj_reg;
00076 csRef<iEventQueue> eventQueue;
00078 csRef<iEventNameRegistry> nameRegistry;
00079
00080 CS_EVENTHANDLER_NAMES ("crystalspace.ConfigListener")
00081 CS_EVENTHANDLER_NIL_CONSTRAINTS
00082 };
00083
00084 template<typename T>
00085 class ConfigListener : public scfImplementationExt0<ConfigListener<T>, ConfigListenerBase>
00086 {
00087 public:
00088 ConfigListener(iObjectRegistry* obj_reg, const char* key, T& val)
00089 : scfImplementationExt0<ConfigListener<T>, ConfigListenerBase> (this, obj_reg, key),
00090 value(val)
00091 {
00092 }
00093
00094 private:
00095 T& value;
00096
00097 virtual bool HandleEvent(iEvent& ev)
00098 {
00099 if (ev.Retrieve("value", value) != csEventErrNone)
00100 printf("E: ConfigListener::HandleEvent failed!\n");
00101 return true;
00102 }
00103 };
00104
00105 template<>
00106 class ConfigListener<csString> : public scfImplementationExt0<ConfigListener<csString>, ConfigListenerBase>
00107 {
00108 public:
00109 ConfigListener(iObjectRegistry* obj_reg, const char* key, csString& val)
00110 : scfImplementationExt0<ConfigListener<csString>, ConfigListenerBase> (this, obj_reg, key),
00111 value (val)
00112 {
00113 }
00114
00115 private:
00116 csString& value;
00117
00118 virtual bool HandleEvent(iEvent& ev)
00119 {
00120 const char* tmp;
00121 if (ev.Retrieve("value", tmp) != csEventErrNone)
00122 printf("E: ConfigListener<csString>::HandleEvent failed!\n");
00123 value = tmp;
00124 return true;
00125 }
00126 };
00127
00128 }
00129 }
00130
00131 #endif // __CS_CSUTIL_CSCONFIGEVENTNOTIFIER_H__