// 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;
}