123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #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;
- }
|