| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include "Base.h"
- #include "DAEChannelTarget.h"
- namespace gameplay
- {
- DAEChannelTarget::DAEChannelTarget(const domChannelRef channelRef) : _channel(channelRef), _targetElement(NULL)
- {
- const std::string target = channelRef->getTarget();
- size_t index = target.find('/');
- if (index == std::string::npos)
- {
- // If the string doesn't contain a '/' then the whole string is the id
- // and there are no sid's being targeted.
- _targetId = target;
- }
- else
- {
- // The targetId is the part before the first '/'
- _targetId = target.substr(0, index);
- // each '/' denotes another sid
- size_t start;
- size_t end;
- do
- {
- start = index + 1;
- end = target.find('/', start);
-
- std::string sub;
- if (end == std::string::npos)
- {
- sub = target.substr(start);
- // break;
- }
- else
- {
- sub = target.substr(start, end - start);
- index = end + 1;
- }
- _attributeIds.push_back(sub);
- } while (end != std::string::npos);
- }
- }
- DAEChannelTarget::~DAEChannelTarget(void)
- {
- }
- daeElement* DAEChannelTarget::getTargetElement()
- {
- if (!_targetElement && _targetId.length() > 0)
- {
- daeSIDResolver resolver(_channel->getDocument()->getDomRoot(), _targetId.c_str());
- _targetElement = resolver.getElement();
- }
- return _targetElement;
- }
- const std::string& DAEChannelTarget::getTargetId() const
- {
- return _targetId;
- }
- size_t DAEChannelTarget::getTargetAttributeCount() const
- {
- return _attributeIds.size();
- }
- daeElement* DAEChannelTarget::getTargetAttribute(size_t index)
- {
- if (index >= _attributeIds.size())
- {
- return NULL;
- }
- const std::string& att = _attributeIds[index];
- std::string sid = att.substr(0, att.find('.'));
- daeSIDResolver resolver(getTargetElement(), sid.c_str());
- return resolver.getElement();
- }
- void DAEChannelTarget::getPropertyName(size_t index, std::string* str)
- {
- if (index < _attributeIds.size())
- {
- // The property name is the string segment after the '.'
- // The propery is optional so it might not be found.
- const std::string& att = _attributeIds[index];
- size_t i = att.find('.');
- if (i != std::string::npos && i < att.size())
- {
- str->assign(att.substr(i+1));
- return;
- }
- }
- str->clear();
- }
- }
|