AtxProperties.h

Go to the documentation of this file.
00001 /*****************************************************************
00002 |
00003 |   Atomix - Properties Interface
00004 |
00005 |   (c) 2002-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00013 #ifndef _ATX_PROPERTIES_H_
00014 #define _ATX_PROPERTIES_H_
00015 
00016 /*----------------------------------------------------------------------
00017 |   includes
00018 +---------------------------------------------------------------------*/
00019 #include "AtxInterfaces.h"
00020 #include "AtxTypes.h"
00021 #include "AtxIterator.h"
00022 
00023 /*----------------------------------------------------------------------
00024 |   error codes
00025 +---------------------------------------------------------------------*/
00026 #define ATX_ERROR_NO_SUCH_PROPERTY       (ATX_ERROR_BASE_PROPERTIES - 0)
00027 #define ATX_ERROR_NO_SUCH_LISTENER       (ATX_ERROR_BASE_PROPERTIES - 1)
00028 #define ATX_ERROR_PROPERTY_TYPE_MISMATCH (ATX_ERROR_BASE_PROPERTIES - 2)
00029 
00030 /*----------------------------------------------------------------------
00031 |   types
00032 +---------------------------------------------------------------------*/
00036 typedef enum {
00037     ATX_PROPERTY_VALUE_TYPE_INTEGER,  
00038     ATX_PROPERTY_VALUE_TYPE_FLOAT,    
00039     ATX_PROPERTY_VALUE_TYPE_STRING,   
00040     ATX_PROPERTY_VALUE_TYPE_BOOLEAN,  
00041     ATX_PROPERTY_VALUE_TYPE_RAW_DATA  
00042 } ATX_PropertyValueType;
00043 
00044 typedef struct {
00045     ATX_Size size;
00046     ATX_Any  data;
00047 } ATX_PropertyRawData;
00048 
00053 typedef union {
00054     void*               any;      
00055     ATX_CString         string;   
00056     ATX_Int32           integer;  
00057     ATX_Float           fp;       
00058     ATX_Boolean         boolean;  
00059     ATX_PropertyRawData raw_data; 
00060 } ATX_PropertyValueData;
00061 
00065 typedef struct {
00066     ATX_PropertyValueType type;
00067     ATX_PropertyValueData data;
00068 } ATX_PropertyValue;
00069 
00070 typedef const void* ATX_PropertyListenerHandle;
00071 
00076 typedef struct {
00077     ATX_CString       name;  
00078     ATX_PropertyValue value; 
00079 } ATX_Property;
00080 
00081 /*----------------------------------------------------------------------
00082 |   ATX_PropertyListener interface
00083 +---------------------------------------------------------------------*/
00084 ATX_DECLARE_INTERFACE(ATX_PropertyListener)
00085 ATX_BEGIN_INTERFACE_DEFINITION(ATX_PropertyListener)
00098     void (*OnPropertyChanged)(ATX_PropertyListener*    self,
00099                               ATX_CString              name,
00100                               const ATX_PropertyValue* value);
00101 ATX_END_INTERFACE_DEFINITION
00102 
00103 /*----------------------------------------------------------------------
00104 |   ATX_Properties interface
00105 +---------------------------------------------------------------------*/
00106 ATX_DECLARE_INTERFACE(ATX_Properties)
00115 ATX_BEGIN_INTERFACE_DEFINITION(ATX_Properties)
00127     ATX_Result (*GetProperty)(ATX_Properties*    self,
00128                               ATX_CString        name,
00129                               ATX_PropertyValue* value);
00130 
00139     ATX_Result (*SetProperty)(ATX_Properties*          self,
00140                               ATX_CString              name,
00141                               const ATX_PropertyValue* value);
00142 
00148     ATX_Result (*Clear)(ATX_Properties* self);
00149 
00154     ATX_Result (*GetIterator)(ATX_Properties* self,
00155                               ATX_Iterator**  iterator);
00156 
00168     ATX_Result (*AddListener)(ATX_Properties*             self,
00169                               ATX_CString                 name,
00170                               ATX_PropertyListener*       listener, 
00171                               ATX_PropertyListenerHandle* handle);
00172 
00173     ATX_Result (*RemoveListener)(ATX_Properties*            self,
00174                                  ATX_PropertyListenerHandle handle);
00175 
00176 ATX_END_INTERFACE_DEFINITION
00177 
00178 /*----------------------------------------------------------------------
00179 |   convenience macros
00180 +---------------------------------------------------------------------*/
00185 #define ATX_Properties_GetProperty(object, name, value)  \
00186 ATX_INTERFACE(object)->GetProperty(object,               \
00187                                    name,                 \
00188                                    value)
00189 
00194 #define ATX_Properties_SetProperty(object, name, value)    \
00195 ATX_INTERFACE(object)->SetProperty(object,                 \
00196                                    name,                   \
00197                                    value)
00198 
00203 #define ATX_Properties_Clear(object)                            \
00204 ATX_INTERFACE(object)->Clear(object)
00205 
00210 #define ATX_Properties_GetIterator(object, iterator)               \
00211 ATX_INTERFACE(object)->GetIterator(object, iterator)
00212 
00217 #define ATX_Properties_AddListener(object, name, listener, handle) \
00218 ATX_INTERFACE(object)->AddListener(object,                         \
00219                                    name,                           \
00220                                    listener,                       \
00221                                    handle)
00222 
00227 #define ATX_Properties_RemoveListener(object, handle)    \
00228 ATX_INTERFACE(object)->RemoveListener(object, handle)
00229 
00234 #define ATX_PropertyListener_OnPropertyChanged(object, name, value) \
00235 ATX_INTERFACE(object)->OnPropertyChanged(object,                    \
00236                                          name,                      \
00237                                          value)
00238 
00239 /*----------------------------------------------------------------------
00240 |   implementation templates
00241 +---------------------------------------------------------------------*/
00242 #define ATX_IMPLEMENT_STATIC_PROPERTIES_INTERFACE(_class) \
00243 ATX_BEGIN_INTERFACE_MAP(_class, ATX_Properties)           \
00244     _class##_GetProperty,                                 \
00245     ATX_BaseProperties_SetProperty,                       \
00246     ATX_BaseProperties_Clear,                             \
00247     ATX_BaseProperties_GetIterator,                       \
00248     ATX_BaseProperties_AddListener,                       \
00249     ATX_BaseProperties_RemoveListener                     \
00250 ATX_END_INTERFACE_MAP
00251 
00252 /*----------------------------------------------------------------------
00253 |   functions
00254 +---------------------------------------------------------------------*/
00255 #ifdef __cplusplus
00256 extern "C" {
00257 #endif /* __cplusplus */
00258 
00259 ATX_Result 
00260 ATX_BaseProperties_SetProperty(ATX_Properties*          self, 
00261                                ATX_CString              name,
00262                                const ATX_PropertyValue* value);
00263 ATX_Result
00264 ATX_BaseProperties_Clear(ATX_Properties* self);
00265 ATX_Result
00266 ATX_BaseProperties_GetIterator(ATX_Properties* self, ATX_Iterator** iterator);
00267 ATX_Result
00268 ATX_BaseProperties_AddListener(ATX_Properties*             self,
00269                                ATX_CString                 name,
00270                                ATX_PropertyListener*       listener, 
00271                                ATX_PropertyListenerHandle* handle);
00272 ATX_Result
00273 ATX_BaseProperties_RemoveListener(ATX_Properties*            self,
00274                                   ATX_PropertyListenerHandle handle);
00275 
00276 ATX_Result ATX_Properties_Create(ATX_Properties** properties);
00277 
00278 #ifdef __cplusplus
00279 }
00280 #endif
00281 
00282 #endif /* _ATX_PROPERTIES_H_ */