diff options
Diffstat (limited to 'Src/Wasabi/api/config/items/cfgitemi.cpp')
-rw-r--r-- | Src/Wasabi/api/config/items/cfgitemi.cpp | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/Src/Wasabi/api/config/items/cfgitemi.cpp b/Src/Wasabi/api/config/items/cfgitemi.cpp new file mode 100644 index 00000000..b8734031 --- /dev/null +++ b/Src/Wasabi/api/config/items/cfgitemi.cpp @@ -0,0 +1,274 @@ +#include <precomp.h> + +#include "cfgitemi.h" +#include <api/config/items/attrcb.h> +#include <api/config/items/attribs.h> + +#include <bfc/wasabi_std.h> +#include <bfc/memblock.h> + +CfgItemI::CfgItemI(const wchar_t *name, GUID guid) +:NamedW(name), myguid(guid), parent_guid(INVALID_GUID) { } + +CfgItemI::~CfgItemI() +{ + deregisterAll(); +} + +const wchar_t *CfgItemI::cfgitem_getName() +{ + return NamedW::getName(); +} + +GUID CfgItemI::cfgitem_getGuid() +{ + return myguid; +} + +void CfgItemI::cfgitem_setPrefix(const wchar_t *_prefix) +{ + prefix = _prefix; +} + +const wchar_t *CfgItemI::cfgitem_getPrefix() +{ + return prefix.c_str(); +} + +int CfgItemI::cfgitem_getNumAttributes() +{ + return attributes.getNumItems(); +} + +const wchar_t *CfgItemI::cfgitem_enumAttribute(int n) +{ + Attribute *attr = attributes[n]; + if (attr) return attr->getAttributeName(); + return NULL; +} + +const wchar_t *CfgItemI::cfgitem_getConfigXML() +{ + return cfgxml.c_str(); +} + +int CfgItemI::cfgitem_getNumChildren() +{ + return children.getNumItems(); +} + +CfgItem *CfgItemI::cfgitem_enumChild(int n) +{ + return children[n]; +} + +GUID CfgItemI::cfgitem_getParentGuid() +{ + return parent_guid; +} + +void CfgItemI::cfgitem_onRegister() +{ + foreach(children) + WASABI_API_CONFIG->config_registerCfgItem(children.getfor()); + endfor +} +void CfgItemI::cfgitem_onDeregister() +{ + foreach(children) + WASABI_API_CONFIG->config_deregisterCfgItem(children.getfor()); + endfor +} + +Attribute *CfgItemI::getAttributeByName(const wchar_t *name) +{ + Attribute *attr; + foreach(attributes) + attr = attributes.getfor(); + if (!WCSICMP(name, attr->getAttributeName())) return attr; + endfor + return NULL; +} + +int CfgItemI::cfgitem_getAttributeType(const wchar_t *name) +{ + Attribute *attr = getAttributeByName(name); + if (attr == NULL) return AttributeType::NONE; + return attr->getAttributeType(); +} + +const wchar_t *CfgItemI::cfgitem_getAttributeConfigGroup(const wchar_t *name) +{ + Attribute *attr = getAttributeByName(name); + if (attr == NULL) return NULL; + return attr->getConfigGroup(); +} + +int CfgItemI::cfgitem_getDataLen(const wchar_t *name) +{ + Attribute *attr = getAttributeByName(name); + if (attr == NULL) return -1; + return attr->getDataLen(); +} + +int CfgItemI::cfgitem_getData(const wchar_t *name, wchar_t *data, int data_len) +{ + Attribute *attr = getAttributeByName(name); + if (attr == NULL) return -1; + return attr->getData(data, data_len); +} + +int CfgItemI::cfgitem_setData(const wchar_t *name, const wchar_t *data) +{ + Attribute *attr = getAttributeByName(name); + if (attr == NULL) return -1; + int ret = attr->setDataNoCB(data); + if (ret) cfgitem_onAttribSetValue(attr); + return ret; +} + +int CfgItemI::cfgitem_onAttribSetValue(Attribute *attr) +{ + // notify dependency watchers that an attribute changed + dependent_sendEvent(CfgItem::depend_getClassGuid(), Event_ATTRIBUTE_CHANGED, 0, (void*)attr->getAttributeName()); + + //for (int i = 0; ; i++) + //{ + // AttrCallback *acb; + // if (!callbacks.multiGetItem(attr, i, &acb)) + // break; + // + // acb->onValueChange(attr); + //} + auto elements = callbacks.equal_range(attr); + for (auto& it = elements.first; it != elements.second; ++it) + { + AttrCallback* acb = it->second; + if (acb) + { + acb->onValueChange(attr); + } + } + + return 0; +} + +void CfgItemI::cfgitem_setGUID(GUID guid) +{ + myguid = guid; +} + +int CfgItemI::setName(const wchar_t *name) +{ + NamedW::setName(name); + // notify dependency watchers that name changed? + dependent_sendEvent(CfgItem::depend_getClassGuid(), Event_NAMECHANGE); + return 1; +} + +int CfgItemI::registerAttribute(Attribute *attr, AttrCallback *acb) +{ + if (attributes.haveItem(attr)) return 0; + int ret = attributes.addItem(attr) != NULL; + if (!ret) return ret; + + attr->setCfgItem(this); + + // set optional callback + if (acb != NULL) + { + addCallback(attr, acb); + } + + // notify dependency watchers of new attribute + dependent_sendEvent(CfgItem::depend_getClassGuid(), Event_ATTRIBUTE_ADDED, 0, (void*)attr->getAttributeName()); + + return ret; +} + +int CfgItemI::deregisterAttribute(Attribute *attr) +{ + if (!attributes.haveItem(attr)) return 0; + int ret = attributes.removeItem(attr); + // notify dependency watchers of attribute going away + dependent_sendEvent(CfgItem::depend_getClassGuid(), Event_ATTRIBUTE_REMOVED, 0, (void*)attr->getAttributeName()); + + // remove callbacks + //callbacks.multiDelAllForItem(attr, TRUE); + auto elements = callbacks.equal_range(attr); + for (auto& it = elements.first; it != elements.second; ++it) + { + AttrCallback* acb = it->second; + if (acb) + { + delete acb; + } + } + callbacks.erase(attr); + + + attr->disconnect(); + + return ret; +} + +void CfgItemI::addCallback(Attribute *attr, AttrCallback *acb) +{ + ASSERT(attr != NULL); + ASSERT(acb != NULL); + //callbacks.multiAddItem(attr, acb); + callbacks.insert({ attr, acb }); +} + +void CfgItemI::deregisterAll() +{ + foreach(children) + children.getfor()->deregisterAll(); + endfor + while (attributes.getNumItems()) deregisterAttribute(attributes[0]); +} + +void CfgItemI::addChildItem(CfgItemI *child) +{ + ASSERT(child != NULL); + if (!children.haveItem(child)) + { + children.addItem(child); + child->setParentGuid(myguid); + } +} + +void CfgItemI::setCfgXml(const wchar_t *groupname) +{ + cfgxml = groupname; +} + +void CfgItemI::setParentGuid(GUID guid) +{ + parent_guid = guid; +} + +void *CfgItemI::dependent_getInterface(const GUID *classguid) +{ + HANDLEGETINTERFACE(CfgItem); + return NULL; +} + +int CfgItemI::cfgitem_addAttribute(const wchar_t *name, const wchar_t *defval) +{ + if (getAttributeByName(name)) return 0; + registerAttribute(newattribs.addItem(new _string(name, defval))); + return 1; +} + +int CfgItemI::cfgitem_delAttribute(const wchar_t *name) +{ + Attribute *attr = getAttributeByName(name); + if (!newattribs.haveItem(attr)) return 0; + deregisterAttribute(attr); + delete attr; + newattribs.removeItem(attr); + return 1; +} + + |