in xsec/xkms/impl/XKMSStatusImpl.cpp [279:360]
void XKMSStatusImpl::setStatusReason(StatusValue status, StatusReason reason, bool value) {
if (status == StatusUndefined || reason == ReasonUndefined) {
throw XSECException(XSECException::StatusError,
"XKMSStatus::setStatusReason - status or reason undefined");
}
if ((m_statusReasons[status-1][reason-1] != NULL) == value)
return;
/* Delete if necessary */
if (value == false) {
DOMNode * c = m_statusReasons[status-1][reason-1];
mp_statusElement->removeChild(c);
c->release();
m_statusReasons[status-1][reason-1] = NULL;
return;
}
/* Find a previously found element to insert before*/
DOMNode * found = NULL;
m_statusValue = XKMSStatus::StatusUndefined;
StatusValue i;
StatusReason j = XKMSStatus::Signature;
/* Clean out status codes */
for (i = Indeterminate ; i > StatusUndefined && !(i == status && j == reason); i = (StatusValue)(i-1)) {
for (j = XKMSStatus::Signature; j != XKMSStatus::ReasonUndefined && !(i == status && j == reason); j = (XKMSStatus::StatusReason) (j-1)) {
if (m_statusReasons[i-1][j-1] != NULL)
found = m_statusReasons[i-1][j-1];
}
}
/* Now lets create our new element and its text child */
safeBuffer str;
DOMDocument *doc = mp_env->getParentDocument();
// str.sbXMLChIn(XKMSConstants::s_unicodeStrURIXKMS);
const XMLCh * prefix = mp_env->getXKMSNSPrefix();
if (status == Valid) {
makeQName(str, prefix, XKMSConstants::s_tagValidReason);
}
else if (status == Invalid) {
makeQName(str, prefix, XKMSConstants::s_tagInvalidReason);
}
else {
makeQName(str, prefix, XKMSConstants::s_tagIndeterminateReason);
}
DOMElement * e = doc->createElementNS(XKMSConstants::s_unicodeStrURIXKMS,
str.rawXMLChBuffer());
/* Create the text node child */
str.sbXMLChIn(XKMSConstants::s_unicodeStrURIXKMS);
str.sbXMLChCat(XKMSConstants::s_tagStatusReasonCodes[reason]);
e->appendChild(doc->createTextNode(str.rawXMLChBuffer()));
/* Insert at correct place */
if (found == NULL) {
mp_statusElement->appendChild(e);
mp_env->doPrettyPrint(mp_statusElement);
}
else {
mp_statusElement->insertBefore(e, found);
if (mp_env->getPrettyPrintFlag() == true)
mp_statusElement->insertBefore(doc->createTextNode(DSIGConstants::s_unicodeStrNL), found);
}
m_statusReasons[status-1][reason-1] = e;
}