/* * * Copyright (C) 2000-2019, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by * * OFFIS e.V. * R&D Division Health * Escherweg 2 * D-26121 Oldenburg, Germany * * * Module: dcmsr * * Author: Joerg Riesmeier * * Purpose: * classes: DSRCodeTreeNode * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmsr/dsrtypes.h" #include "dcmtk/dcmsr/dsrcodtn.h" #include "dcmtk/dcmsr/dsrxmld.h" #include "dcmtk/dcmdata/dcdeftag.h" DSRCodeTreeNode::DSRCodeTreeNode(const E_RelationshipType relationshipType) : DSRDocumentTreeNode(relationshipType, VT_Code), DSRCodedEntryValue() { } DSRCodeTreeNode::DSRCodeTreeNode(const DSRCodeTreeNode &node) : DSRDocumentTreeNode(node), DSRCodedEntryValue(node) { } DSRCodeTreeNode::~DSRCodeTreeNode() { } OFBool DSRCodeTreeNode::operator==(const DSRDocumentTreeNode &node) const { /* call comparison operator of base class (includes check of value type) */ OFBool result = DSRDocumentTreeNode::operator==(node); if (result) { /* it's safe to cast the type since the value type has already been checked */ result = DSRCodedEntryValue::operator==(OFstatic_cast(const DSRCodeTreeNode &, node).getValue()); } return result; } OFBool DSRCodeTreeNode::operator!=(const DSRDocumentTreeNode &node) const { /* call comparison operator of base class (includes check of value type) */ OFBool result = DSRDocumentTreeNode::operator!=(node); if (!result) { /* it's safe to cast the type since the value type has already been checked */ result = DSRCodedEntryValue::operator!=(OFstatic_cast(const DSRCodeTreeNode &, node).getValue()); } return result; } DSRCodeTreeNode *DSRCodeTreeNode::clone() const { return new DSRCodeTreeNode(*this); } void DSRCodeTreeNode::clear() { DSRDocumentTreeNode::clear(); DSRCodedEntryValue::clear(); } OFBool DSRCodeTreeNode::isValid() const { /* ConceptNameCodeSequence required */ return DSRDocumentTreeNode::isValid() && getConceptName().isValid() && hasValidValue(); } OFBool DSRCodeTreeNode::hasValidValue() const { return DSRCodedEntryValue::isValid(); } OFCondition DSRCodeTreeNode::print(STD_NAMESPACE ostream &stream, const size_t flags) const { OFCondition result = DSRDocumentTreeNode::print(stream, flags); if (result.good()) { DCMSR_PRINT_ANSI_ESCAPE_CODE(DCMSR_ANSI_ESCAPE_CODE_DELIMITER) stream << "="; DCMSR_PRINT_ANSI_ESCAPE_CODE(DCMSR_ANSI_ESCAPE_CODE_ITEM_VALUE) DSRCodedEntryValue::print(stream, OFTrue /*printCodeValue*/, flags); } return result; } OFCondition DSRCodeTreeNode::readXMLContentItem(const DSRXMLDocument &doc, DSRXMLCursor cursor, const size_t flags) { OFCondition result = SR_EC_CorruptedXMLStructure; if (cursor.valid()) { /* goto "value" element */ const DSRXMLCursor childCursor = doc.getNamedChildNode(cursor, "value"); if (childCursor.valid()) { /* check whether code is stored as XML elements or attributes */ if (doc.hasAttribute(childCursor, "codValue")) result = DSRCodedEntryValue::readXML(doc, childCursor, flags); else result = DSRCodedEntryValue::readXML(doc, cursor, flags); } } return result; } OFCondition DSRCodeTreeNode::writeXML(STD_NAMESPACE ostream &stream, const size_t flags) const { OFCondition result = EC_Normal; writeXMLItemStart(stream, flags); result = DSRDocumentTreeNode::writeXML(stream, flags); if (flags & DSRTypes::XF_codeComponentsAsAttribute) { stream << "" is closed in next the writeXML() routine DSRCodedEntryValue::writeXML(stream, flags); stream << "" << OFendl; } else DSRCodedEntryValue::writeXML(stream, flags); writeXMLItemEnd(stream, flags); return result; } OFCondition DSRCodeTreeNode::readContentItem(DcmItem &dataset, const size_t flags) { /* read ConceptCodeSequence */ return DSRCodedEntryValue::readSequence(dataset, DCM_ConceptCodeSequence, "1" /*type*/, flags); } OFCondition DSRCodeTreeNode::writeContentItem(DcmItem &dataset) const { /* write ConceptCodeSequence */ return DSRCodedEntryValue::writeSequence(dataset, DCM_ConceptCodeSequence); } OFCondition DSRCodeTreeNode::renderHTMLContentItem(STD_NAMESPACE ostream &docStream, STD_NAMESPACE ostream & /*annexStream*/, const size_t /*nestingLevel*/, size_t & /*annexNumber*/, const size_t flags) const { /* render ConceptName */ OFCondition result = renderHTMLConceptName(docStream, flags); /* render Code */ if (result.good()) { const OFBool fullCode = (flags & DSRTypes::HF_renderInlineCodes) || (flags & DSRTypes::HF_renderItemsSeparately); if (!fullCode || (flags & DSRTypes::HF_useCodeDetailsTooltip)) { if (flags & DSRTypes::HF_XHTML11Compatibility) docStream << ""; else if (flags & DSRTypes::HF_HTML32Compatibility) docStream << ""; else /* HTML 4.01 */ docStream << ""; } result = DSRCodedEntryValue::renderHTML(docStream, flags, fullCode); if (!fullCode || (flags & DSRTypes::HF_useCodeDetailsTooltip)) { if (flags & DSRTypes::HF_HTML32Compatibility) docStream << ""; else docStream << ""; } docStream << OFendl; } return result; }