in xsec/xkms/impl/XKMSStatusImpl.cpp [104:214]
void XKMSStatusImpl::load() {
if (mp_statusElement == NULL) {
// Attempt to load an empty element
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - called on empty DOM");
}
/* Load the StatusValue attribute */
mp_statusValueAttr =
mp_statusElement->getAttributeNodeNS(NULL, XKMSConstants::s_tagStatusValue);
/* Decode as appropriate*/
if (mp_statusValueAttr == NULL) {
// Attempt to load an empty element
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - No StatusValue attribute found");
}
const XMLCh * res = mp_statusValueAttr->getNodeValue();
// This is actually an QName, but we cheat and find the ':' character by hand
// without actually checking the qualifier.
// TODO - CHECK the qualifier.
int res2 = XMLString::indexOf(res, chPound);
if (res2 == -1 || XMLString::compareNString(res, XKMSConstants::s_unicodeStrURIXKMS, res2)) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - StatusValue not in XKMS Name Space");
}
res = &res[res2+1];
for (m_statusValue = XKMSStatus::Indeterminate;
m_statusValue > XKMSStatus::StatusUndefined;
m_statusValue = (XKMSStatus::StatusValue) (m_statusValue-1)) {
if (strEquals(XKMSConstants::s_tagStatusValueCodes[m_statusValue], res))
break;
}
if (m_statusValue == XKMSStatus::StatusUndefined) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - Unknown StatusValue provided");
}
/* Now we need to run through the status values */
DOMElement * e = findFirstElementChild(mp_statusElement);
while (e != NULL) {
const XMLCh * vs = getXKMSLocalName(e);
StatusValue v;
if (strEquals(vs, XKMSConstants::s_tagValidReason)) {
v = Valid;
}
else if (strEquals(vs, XKMSConstants::s_tagInvalidReason)) {
v = Invalid;
}
else if (strEquals(vs, XKMSConstants::s_tagIndeterminateReason)) {
v = Indeterminate;
}
else {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - Unknown Reason element");
}
DOMNode *t = findFirstChildOfType(e, DOMNode::TEXT_NODE);
if (t == NULL) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - Expected text node child of reason element");
}
/* Strip out the URI prefix */
const XMLCh * reason = t->getNodeValue();
int res = XMLString::indexOf(reason, chPound);
if (res == -1 || XMLString::compareNString(reason, XKMSConstants::s_unicodeStrURIXKMS, res)) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - StatusReason not in XKMS Name Space");
}
reason = &reason[res+1];
/* Found out what we are! */
XKMSStatus::StatusReason i;
for (i = XKMSStatus::Signature; i != XKMSStatus::ReasonUndefined; i = (XKMSStatus::StatusReason) (i-1)) {
if (strEquals(XKMSConstants::s_tagStatusReasonCodes[i], reason))
break;
}
if (i == XKMSStatus::ReasonUndefined) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::load - Unknown StatusReason");
}
m_statusReasons[v-1][i-1] = e;
e = findNextElementChild(e);
}
}