// base function to obtain text from // node described by XPATH. HRESULT CIhvProfileBase::GetTextFromNode ( IN LPCWSTR pszQuery, OUT BSTR* pbstrText ) { HRESULT hr = S_OK; BSTR bstrQuery = NULL; IXMLDOMNode* pQueryNode = NULL; ASSERT( pszQuery ); ASSERT( pbstrText ); // if node is NULL, return empty string. if ( !m_pRootNode ) { hr = Wstr2Bstr ( L"", pbstrText ); BAIL( ); } hr = Wstr2Bstr ( pszQuery, &bstrQuery ); BAIL_ON_FAILURE( hr ); hr = m_pRootNode->selectSingleNode( bstrQuery, &pQueryNode ); BAIL_ON_FAILURE( hr ); if (!pQueryNode) { hr = E_UNEXPECTED; BAIL_ON_FAILURE( hr ); } hr = pQueryNode->get_text( pbstrText ); BAIL_ON_FAILURE( hr ); if ( !(*pbstrText) ) { hr = E_UNEXPECTED; BAIL_ON_FAILURE( hr ); } error: RELEASE_INTERFACE( pQueryNode ); SYS_FREE_STRING( bstrQuery ); return hr; }
IXMLDOMNode * DicomImageSet::findParentNode(IXMLDOMDocument *pXMLDom, IXMLDOMNode * pRoot, const char * patientsName, const char * patientsId, int acquisitionDate, const char * protocol, int acquisitionNumber) { if (!pXMLDom) { return NULL; } HRESULT hr = S_OK; IXMLDOMElement *pPatient = NULL, *pDate = NULL, *pProtocol = NULL, *pCollection = NULL; BSTR bstrQuery = NULL; QString strQuery; bool nodeExist = false; //look for the patient node strQuery = QString("root/Patient[@patients_name = '%1' and @patient_id = '%2']").arg(patientsName).arg(patientsId); bstrQuery = SysAllocString(strQuery.toStdWString().c_str()); CHK_ALLOC(bstrQuery); CHK_HR(pXMLDom->selectSingleNode(bstrQuery, (IXMLDOMNode**)&pPatient)); SysFreeString(bstrQuery); nodeExist = pPatient; if (!nodeExist) { //create the patient node CHK_HR(CreateElement(pXMLDom, L"Patient", &pPatient)); CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"patients_name", QString(patientsName).toStdWString().c_str(), pPatient)); CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"patient_id", QString(patientsId).toStdWString().c_str(), pPatient)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n", pRoot)); CHK_HR(AppendChildToParent(pPatient, pRoot)); } if (nodeExist) { //look for the date node strQuery = QString("Date[@acquisition_date = '%1']").arg(acquisitionDate); bstrQuery = SysAllocString(strQuery.toStdWString().c_str()); CHK_ALLOC(bstrQuery); CHK_HR(pPatient->selectSingleNode(bstrQuery, (IXMLDOMNode**)&pDate)); SysFreeString(bstrQuery); nodeExist = pDate; } if (!nodeExist) { CHK_HR(CreateElement(pXMLDom, L"Date", &pDate)); CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"acquisition_date", QString::number(acquisitionDate).toStdWString().c_str(), pDate)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n", pPatient)); CHK_HR(AppendChildToParent(pDate, pPatient)); } if (nodeExist) { //look for the protocol node strQuery = QString("Protocol[@protocol_name = '%1']").arg(protocol); bstrQuery = SysAllocString(strQuery.toStdWString().c_str()); CHK_ALLOC(bstrQuery); CHK_HR(pDate->selectSingleNode(bstrQuery, (IXMLDOMNode**)&pProtocol)); SysFreeString(bstrQuery); nodeExist = pProtocol; } if (!nodeExist) { CHK_HR(CreateElement(pXMLDom, L"Protocol", &pProtocol)); CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"protocol_name", QString(protocol).toStdWString().c_str(), pProtocol)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n", pDate)); CHK_HR(AppendChildToParent(pProtocol, pDate)); } if (nodeExist) { //look for the collection node strQuery = QString("Collection[@acquisition_number = '%1']").arg(acquisitionNumber); bstrQuery = SysAllocString(strQuery.toStdWString().c_str()); CHK_ALLOC(bstrQuery); CHK_HR(pProtocol->selectSingleNode(bstrQuery, (IXMLDOMNode**)&pCollection)); SysFreeString(bstrQuery); nodeExist = pCollection; } if (!nodeExist) { CHK_HR(CreateElement(pXMLDom, L"Collection", &pCollection)); CHK_HR(CreateAndAddAttributeNode(pXMLDom, L"acquisition_number", QString::number(acquisitionNumber).toStdWString().c_str(), pCollection)); CHK_HR(CreateAndAddTextNode(pXMLDom, L"\n", pProtocol)); CHK_HR(AppendChildToParent(pCollection, pProtocol)); } CleanUp: SAFE_RELEASE(pPatient); SAFE_RELEASE(pDate); SAFE_RELEASE(pProtocol); if(SUCCEEDED(hr)) { return pCollection; } SAFE_RELEASE(pCollection); return NULL; }