diff options
Diffstat (limited to 'Src/Agave/Config')
-rw-r--r-- | Src/Agave/Config/api_config.h | 135 | ||||
-rw-r--r-- | Src/Agave/Config/ifc_configgroup.h | 36 | ||||
-rw-r--r-- | Src/Agave/Config/ifc_configitem.h | 200 |
3 files changed, 371 insertions, 0 deletions
diff --git a/Src/Agave/Config/api_config.h b/Src/Agave/Config/api_config.h new file mode 100644 index 00000000..d71885d6 --- /dev/null +++ b/Src/Agave/Config/api_config.h @@ -0,0 +1,135 @@ +#ifndef NULLSOFT_AGAVE_API_CONFIG_H +#define NULLSOFT_AGAVE_API_CONFIG_H + +#include "bfc/dispatch.h" + +#include "ifc_configgroup.h" + +enum +{ + CONFIG_SUCCESS = 0, + CONFIG_FAILURE = 1, + CONFIG_GROUPNOTFOUND = 2, + CONFIG_ITEMNOTFOUND = 3, +}; + +class api_config : public Dispatchable +{ +protected: + api_config() {} + ~api_config() {} + +public: + ifc_configgroup *GetGroup( GUID groupGUID ); + void RegisterGroup( ifc_configgroup *newGroup ); + + /* Shortcut methods */ + bool GetBool( GUID groupGUID, const wchar_t *configItem, bool defaultValue ); + uintptr_t GetUnsigned( GUID groupGUID, const wchar_t *configItem, uintptr_t defaultValue ); + intptr_t GetInt( GUID groupGUID, const wchar_t *configItem, intptr_t defaultValue ); + float GetFloat( GUID groupGUID, const wchar_t *configItem, float defaultValue ); + const wchar_t *GetString( GUID groupGUID, const wchar_t *configItem, const wchar_t *defaultValue ); + ifc_configitem *GetItem( GUID groupGUID, const wchar_t *configItem ); + + DISPATCH_CODES + { + API_CONFIG_GETGROUP = 10, + API_CONFIG_REGISTERGROUP = 20, + }; +}; + +inline ifc_configgroup *api_config::GetGroup( GUID groupGUID ) +{ + return _call( API_CONFIG_GETGROUP, (ifc_configgroup *)0, groupGUID ); +} + +inline void api_config::RegisterGroup( ifc_configgroup *newGroup ) +{ + _voidcall( API_CONFIG_REGISTERGROUP, newGroup ); +} + +inline bool api_config::GetBool( GUID groupGUID, const wchar_t *configItem, bool defaultValue ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + { + ifc_configitem *item = group->GetItem( configItem ); + if ( item ) + return item->GetBool(); + } + + return defaultValue; +} + +inline uintptr_t api_config::GetUnsigned( GUID groupGUID, const wchar_t *configItem, uintptr_t defaultValue ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + { + ifc_configitem *item = group->GetItem( configItem ); + if ( item ) + return item->GetUnsigned(); + } + + return defaultValue; +} + +inline intptr_t api_config::GetInt( GUID groupGUID, const wchar_t *configItem, intptr_t defaultValue ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + { + ifc_configitem *item = group->GetItem( configItem ); + if ( item ) + return item->GetInt(); + } + + return defaultValue; +} + +inline float api_config::GetFloat( GUID groupGUID, const wchar_t *configItem, float defaultValue ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + { + ifc_configitem *item = group->GetItem( configItem ); + if ( item ) + return item->GetFloat(); + } + + return defaultValue; +} + +inline const wchar_t *api_config::GetString( GUID groupGUID, const wchar_t *configItem, const wchar_t *defaultValue ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + { + ifc_configitem *item = group->GetItem( configItem ); + if ( item ) + return item->GetString(); + } + + return defaultValue; +} + +inline ifc_configitem *api_config::GetItem( GUID groupGUID, const wchar_t *configItem ) +{ + ifc_configgroup *group = GetGroup( groupGUID ); + if ( group ) + return group->GetItem( configItem ); + + return 0; +} + +// {AEFBF8BE-E0AA-4318-8CC1-4353410B64DC} +static const GUID AgaveConfigGUID = +{ 0xaefbf8be, 0xe0aa, 0x4318, { 0x8c, 0xc1, 0x43, 0x53, 0x41, 0xb, 0x64, 0xdc } }; + +extern api_config *configApi; + +#ifndef AGAVE_API_CONFIG +#define AGAVE_API_CONFIG configApi +#endif // !AGAVE_API_CONFIG + +#endif
\ No newline at end of file diff --git a/Src/Agave/Config/ifc_configgroup.h b/Src/Agave/Config/ifc_configgroup.h new file mode 100644 index 00000000..20554865 --- /dev/null +++ b/Src/Agave/Config/ifc_configgroup.h @@ -0,0 +1,36 @@ +#ifndef NULLSOFT_AGAVE_IFC_CONFIGGROUP_H +#define NULLSOFT_AGAVE_IFC_CONFIGGROUP_H + +#include <bfc/dispatch.h> +#include <bfc/platform/types.h> +#include <bfc/platform/guid.h> +#include "ifc_configitem.h" + +class ifc_configgroup : public Dispatchable +{ +protected: + ifc_configgroup() {} + ~ifc_configgroup() {} + +public: + ifc_configitem *GetItem( const wchar_t *name ); + GUID GetGUID(); + + DISPATCH_CODES + { + IFC_CONFIGGROUP_GETITEM = 10, + IFC_CONFIGGROUP_GETGUID = 20, + }; + +}; + +inline ifc_configitem *ifc_configgroup::GetItem(const wchar_t *name) +{ + return _call(IFC_CONFIGGROUP_GETITEM, (ifc_configitem *)0, name); +} + +inline GUID ifc_configgroup::GetGUID() +{ + return _call(IFC_CONFIGGROUP_GETGUID, (GUID)INVALID_GUID); +} +#endif
\ No newline at end of file diff --git a/Src/Agave/Config/ifc_configitem.h b/Src/Agave/Config/ifc_configitem.h new file mode 100644 index 00000000..7a0f5180 --- /dev/null +++ b/Src/Agave/Config/ifc_configitem.h @@ -0,0 +1,200 @@ +#ifndef NULLSOFT_AGAVE_IFC_CONFIGITEM_H +#define NULLSOFT_AGAVE_IFC_CONFIGITEM_H + +#include <bfc/dispatch.h> +#include <stddef.h> +/* +notes: +The Set() functions are "public-facing", meaning that they can be called by anyone. If you want to make your config item read-only, +then simply don't implement these. You can always make "private" Set functions in your implementation. + +SetStringInternal and GetStringInternal are written for use with classes to load and save from INI files (or XML files or whatever). +It's up to you to figure out a clever way to encode yourself. + +*/ + +enum +{ + CONFIG_ITEM_TYPE_STRING = 0, + CONFIG_ITEM_TYPE_INT = 1, + CONFIG_ITEM_TYPE_UNSIGNED =2, + CONFIG_ITEM_TYPE_BOOL =3, + CONFIG_ITEM_TYPE_BINARY =4, + CONFIG_ITEM_TYPE_INT_ARRAY = 5, +}; + +class ifc_configitem : public Dispatchable +{ +protected: + ifc_configitem() {} + ~ifc_configitem() {} +public: + const wchar_t *GetName(); + int GetType(); + + const wchar_t *GetString(); + void SetString(const wchar_t *stringValue); + + intptr_t GetInt(); + void SetInt(intptr_t intValue); + + uintptr_t GetUnsigned(); + void SetUnsigned(uintptr_t unsignedValue); + + bool GetBool(); + void SetBool(bool boolValue); + + float GetFloat(); + void SetFloat(float floatValue); + + size_t GetBinarySize(); + size_t GetBinaryData(void *data, size_t bytes); // returns bytes written + void SetBinaryData(void *data, size_t bytes); + + size_t GetIntArrayElements(); + size_t GetIntArray(intptr_t *array, size_t elements); // returns elements written + void SetIntArray(intptr_t *array, size_t elements); + + const wchar_t *GetStringInternal(); // gets a string suitable for saving in an INI file or XML + void SetStringInternal(const wchar_t *internalString); + +public: + DISPATCH_CODES + { + IFC_CONFIGITEM_GETNAME = 10, + IFC_CONFIGITEM_GETTYPE = 20, + + IFC_CONFIGITEM_GETSTRING= 30, + IFC_CONFIGITEM_SETSTRING= 40, + + IFC_CONFIGITEM_GETINT= 50, + IFC_CONFIGITEM_SETINT= 60, + + IFC_CONFIGITEM_GETUNSIGNED= 70, + IFC_CONFIGITEM_SETUNSIGNED= 80, + + IFC_CONFIGITEM_GETBOOL= 90, + IFC_CONFIGITEM_SETBOOL= 100, + + IFC_CONFIGITEM_GETBINARYSIZE= 110, + IFC_CONFIGITEM_GETBINARYDATA= 120, + IFC_CONFIGITEM_SETBINARYDATA= 130, + + IFC_CONFIGITEM_GETINTARRAYELEMENTS= 140, + IFC_CONFIGITEM_GETINTARRAY= 150, + IFC_CONFIGITEM_SETINTARRAY= 160, + + IFC_CONFIGITEM_GETSTRINGINTERNAL= 170, + IFC_CONFIGITEM_SETSTRINGINTERNAL= 180, + + IFC_CONFIGITEM_GETFLOAT= 190, + IFC_CONFIGITEM_SETFLOAT= 200, + }; +}; + + + +inline const wchar_t *ifc_configitem::GetName() +{ + return _call(IFC_CONFIGITEM_GETNAME, (const wchar_t *)0); +} + +inline int ifc_configitem::GetType() +{ + return _call(IFC_CONFIGITEM_GETTYPE, (int)0); +} + +inline const wchar_t *ifc_configitem::GetString() +{ + return _call(IFC_CONFIGITEM_GETSTRING, (const wchar_t *)0); +} + +inline void ifc_configitem::SetString(const wchar_t *stringValue) +{ + _voidcall(IFC_CONFIGITEM_SETSTRING, stringValue); +} + + +inline intptr_t ifc_configitem::GetInt() +{ + return _call(IFC_CONFIGITEM_GETINT, (intptr_t)0); +} +#pragma warning(push) +#pragma warning(disable: 4244) +inline void ifc_configitem::SetInt(intptr_t intValue) +{ + _voidcall(IFC_CONFIGITEM_SETINT, intValue); +} +#pragma warning(pop) + +inline uintptr_t ifc_configitem::GetUnsigned() +{ + return _call(IFC_CONFIGITEM_GETUNSIGNED, (uintptr_t)0); +} + +inline void ifc_configitem::SetUnsigned(uintptr_t unsignedValue) +{ + _voidcall(IFC_CONFIGITEM_SETUNSIGNED, unsignedValue); +} + + +inline bool ifc_configitem::GetBool() +{ + return _call(IFC_CONFIGITEM_GETBOOL, (bool)false); +} + +inline void ifc_configitem::SetBool(bool boolValue) +{ + _voidcall(IFC_CONFIGITEM_SETBOOL, boolValue); +} + +inline size_t ifc_configitem::GetBinarySize() +{ + return _call(IFC_CONFIGITEM_GETBINARYSIZE, (size_t)0); +} + +inline size_t ifc_configitem::GetBinaryData(void *data, size_t bytes) +{ + return _call(IFC_CONFIGITEM_GETBINARYDATA, (size_t)0, data, bytes); +} + +inline void ifc_configitem::SetBinaryData(void *data, size_t bytes) +{ + _voidcall(IFC_CONFIGITEM_SETBINARYDATA, data, bytes); +} + +inline size_t ifc_configitem::GetIntArrayElements() +{ + return _call(IFC_CONFIGITEM_GETINTARRAYELEMENTS, (size_t)0); +} + +inline size_t ifc_configitem::GetIntArray(intptr_t *array, size_t elements) +{ + return _call(IFC_CONFIGITEM_GETINTARRAY, (size_t)0, array, elements); +} +inline void ifc_configitem::SetIntArray(intptr_t *array, size_t elements) +{ + _voidcall(IFC_CONFIGITEM_SETINTARRAY, array, elements); +} + +inline const wchar_t *ifc_configitem::GetStringInternal() +{ + return _call(IFC_CONFIGITEM_GETSTRINGINTERNAL, (const wchar_t *)0); +} +inline void ifc_configitem::SetStringInternal(const wchar_t *internalString) +{ + _voidcall(IFC_CONFIGITEM_SETSTRINGINTERNAL, internalString); +} + +inline float ifc_configitem::GetFloat() +{ + return _call(IFC_CONFIGITEM_GETFLOAT, (float)0); +} + +inline void ifc_configitem::SetFloat(float floatValue) +{ + _voidcall(IFC_CONFIGITEM_SETFLOAT, floatValue); +} + + +#endif
\ No newline at end of file |