BOOL Parse4CVMKADForChannels( //return false if file could not be parsed const TCHAR* pszTrgTypeName, //4cwin, 4cosai, ... const TCHAR* pszAutoDeclIni, //full path and file name of AutoDecl.ini IO_COMP_TYP** ppIOCmps //return, maqy be NULL if no channel def found ) { TCHAR szBuffer[2*MAX_PATH]; IXMLDOMNode* pNode; IXMLDOMNode* pNode2; IXMLDOMNodeList*pNList; IXMLDOMNodeList*pNList2; *ppIOCmps = NULL; strcpy(szBuffer, pszAutoDeclIni); FC_StringCutFilePart(szBuffer); _tcscat(szBuffer, _T("\\")); _tcscat(szBuffer, pszTrgTypeName); _tcscat(szBuffer, _T("_4cvm.kad")); pNode = XMLLoadFile(szBuffer); if(!pNode) return FALSE; pNode2 = NULL; pNode->get_firstChild(&pNode2); //assume first child is <TRGTYP EXT="4cwin" USECHANNELNUM="0"> FC_RELEASE_PTR(pNode) if(!pNode2) return FALSE; pNList = NULL; pNode2->selectNodes(L"IOCOMPONENTS", &pNList); FC_RELEASE_PTR(pNode2) if(!pNList) return FALSE; long len = 0; pNList->get_length(&len); ATLASSERT(len<=1); if(len>0) { pNList->get_item(0, &pNode); // <CHANNEL> pNList2 = NULL; pNode->selectNodes(L"CHANNEL", &pNList2); *ppIOCmps = ReadIOComponents(pNList2); FC_RELEASE_PTR(pNList2); FC_RELEASE_PTR(pNode); } FC_RELEASE_PTR(pNList); return TRUE; }
int DicomImageSet::insertFileItem(IXMLDOMDocument *pDom, IXMLDOMNode * pRoot, const QString &folderName, const QString &fileName) { DicomImage * dicomImage = new DicomImage (); if (!dicomImage->readHeader((QDir(folderName).absoluteFilePath(fileName)).toStdString().c_str())) { //fail to resolve header information return 0; } int nElement; char * patientsName = dicomImage->getCharTag(DicomImage::TAG_PATIENTS_NAME, nElement); char * patientsId = dicomImage->getCharTag(DicomImage::TAG_PATIENT_ID, nElement); char * protocolName = dicomImage->getCharTag(DicomImage::TAG_PROTOCOL_NAME, nElement); double * pInstanceNumber = dicomImage->getNumericTag(DicomImage::TAG_INSTANCE_NUMBER, nElement); double * pAcquisitionNumber = dicomImage->getNumericTag(DicomImage::TAG_ACQUISITION_NUMBER, nElement); double * pAcquisitionDate = dicomImage->getNumericTag(DicomImage::TAG_ACQUISITION_DATE, nElement); int instanceNumber = pInstanceNumber?(int)pInstanceNumber[0]:-1; int acquisitionNumber = pAcquisitionNumber?(int)pAcquisitionNumber[0]:-1; int acquisitionDate = pAcquisitionDate?(int)pAcquisitionDate[0]:0; IXMLDOMNode * pParent = findParentNode(pDom, pRoot, patientsName, patientsId, acquisitionDate, protocolName, acquisitionNumber); if (!pParent) { return 0; } HRESULT hr = S_OK; IXMLDOMElement *pNode = NULL; CHK_HR(CreateElement(pDom, L"File", &pNode)); CHK_HR(CreateAndAddAttributeNode(pDom, L"path", fileName.toStdWString().c_str(), pNode)); CHK_HR(CreateAndAddAttributeNode(pDom, L"instance_number", QString::number(instanceNumber).toStdWString().c_str(), pNode)); IXMLDOMNode * pSibling = NULL; CHK_HR(pParent->get_firstChild(&pSibling)); int sibInstanceNumber = -1; VARIANT varInstanceNumber; DOMNodeType nodeType; while (pSibling && instanceNumber >= sibInstanceNumber) { CHK_HR(pSibling->get_nodeType(&nodeType)); if(nodeType == NODE_ELEMENT) { CHK_HR(GetAttributeFromNode(pSibling, L"instance_number", &varInstanceNumber)); sibInstanceNumber = QString::fromWCharArray(_bstr_t(varInstanceNumber)).toInt(); if (instanceNumber < sibInstanceNumber) { break; } } IXMLDOMNode * tmpNode = NULL; CHK_HR(pSibling->get_nextSibling(&tmpNode)); SAFE_RELEASE(pSibling); pSibling = tmpNode; } if (pSibling) { IXMLDOMNode * tmpNode = NULL; CHK_HR(pSibling->get_previousSibling(&tmpNode)); SAFE_RELEASE(pSibling); pSibling = tmpNode; } CHK_HR(CreateAndAddTextNodeBefore(pDom, L"\n", pParent, pSibling)); CHK_HR(InsertChildToParent(pNode, pSibling, pParent)); CleanUp: SAFE_RELEASE(pNode); return 1; }
bool TextTable::InitializeFromXmlDoc(XMLDoc* pXmlDoc, WCHAR* pwszFileName, bool bReload) { if (NULL == pXmlDoc) { return false; } BSTR rowXPathFormat; rowXPathFormat = ::SysAllocString(L"/dataroot/%s/F%d"); WCHAR wszXPath[MAX_UNICODE_XPATH_LENGTH + 1]; DWORD dwSheetIndex = 0; WCHAR** ppwszSheetList = GetSheetListInWChar(); BSTR bstr = NULL; while (ppwszSheetList[dwSheetIndex]) { swprintf_s<_countof(wszXPath)>(wszXPath, rowXPathFormat, ppwszSheetList[dwSheetIndex], m_nField); IXMLDOMNodeList* pIndexNodeList = NULL; pIndexNodeList = pXmlDoc->SelectNodeList(wszXPath); if (!pIndexNodeList) { ::SysFreeString(rowXPathFormat); return false; } LONG nIndexLength = 0; if (FAILED(pIndexNodeList->get_length(&nIndexLength))) { pIndexNodeList->Release(); ::SysFreeString(rowXPathFormat); return false; } swprintf_s<_countof(wszXPath)>(wszXPath, rowXPathFormat, ppwszSheetList[dwSheetIndex], m_nField + 1); IXMLDOMNodeList* pTextNodeList = NULL; pTextNodeList = pXmlDoc->SelectNodeList(wszXPath); if (!pTextNodeList) { pIndexNodeList->Release(); ::SysFreeString(rowXPathFormat); return false; } LONG nTextLength = 0; if (FAILED(pTextNodeList->get_length(&nTextLength))) { pIndexNodeList->Release(); pTextNodeList->Release(); ::SysFreeString(rowXPathFormat); return false; } if (nTextLength != nIndexLength) { pIndexNodeList->Release(); pTextNodeList->Release(); ::SysFreeString(rowXPathFormat); return false; } // 제목은 버린다. for (INT j = 1; j < nIndexLength; ++j) { VOID* pvTable = AllocNewTable(ppwszSheetList[dwSheetIndex], m_dwCodePage); if (!pvTable) { pIndexNodeList->Release(); pTextNodeList->Release(); ::SysFreeString(rowXPathFormat); return false; } IXMLDOMNode* pCellNode = NULL; IXMLDOMNode* pDataNode = NULL; if (FAILED(pIndexNodeList->get_item(j, &pCellNode))) { pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } if (!pCellNode) { DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); break; } if (FAILED(pCellNode->get_firstChild(&pDataNode))) { pCellNode->Release(); pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } if (!pDataNode) { pCellNode->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); break; } if (FAILED(pDataNode->get_text(&bstr))) { ::SysFreeString(bstr); pDataNode->Release(); pCellNode->Release(); pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } SetTableData(pvTable, ppwszSheetList[dwSheetIndex], INDEX, bstr); ::SysFreeString(bstr); pCellNode->Release(); pDataNode->Release(); pCellNode = NULL; pDataNode = NULL; if (FAILED(pTextNodeList->get_item(j, &pCellNode))) { pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } if (!pCellNode) { DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); break; } if (FAILED(pCellNode->get_firstChild(&pDataNode))) { //- yoshiki : TODO!(Get the field name) Table::CallErrorCallbackFunction("[File] : %S\n[Error] : Table data is null.(Row Index : %d, Field Name = %S)", pwszFileName, j - 1, L"FIELD_NAME!"); pCellNode->Release(); pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } if (!pDataNode) { //- yoshiki : TODO!(Get the field name) Table::CallErrorCallbackFunction("[File] : %S\n[Error] : Table data is null.(Row Index : %d, Field Name = %S)", pwszFileName, j - 1, L"FIELD_NAME!"); pCellNode->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); _ASSERT(0); // Index는 있고 Data는 공란인경우. break; } if (FAILED(pDataNode->get_text(&bstr))) { ::SysFreeString(bstr); pDataNode->Release(); pCellNode->Release(); pIndexNodeList->Release(); pTextNodeList->Release(); DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); ::SysFreeString(rowXPathFormat); return false; } SetTableData(pvTable, ppwszSheetList[dwSheetIndex], TEXT, bstr); ::SysFreeString(bstr); pCellNode->Release(); pDataNode->Release(); if (!AddTable(pvTable, bReload)) { DeallocNewTable(pvTable, ppwszSheetList[dwSheetIndex]); } } pIndexNodeList->Release(); pTextNodeList->Release(); ++dwSheetIndex; } ::SysFreeString(rowXPathFormat); return true; }
//void SettingsXML::Save(const wchar_t *regName, const wchar_t *value) //{ // if (!value) value = L""; // сюда мог придти и NULL // // Save(regName, (LPCBYTE)value, REG_SZ, (_tcslen(value)+1)*sizeof(wchar_t)); //} void SettingsXML::Save(const wchar_t *regName, LPCBYTE value, DWORD nType, DWORD nSize) { HRESULT hr = S_OK; IXMLDOMNamedNodeMap* pAttrs = NULL; IXMLDOMNodeList* pList = NULL; IXMLDOMAttribute *pIXMLDOMAttribute = NULL; IXMLDOMNode *pNode = NULL; IXMLDOMNode* pChild = NULL; IXMLDOMNode *pNodeRmv = NULL; BSTR bsValue = NULL; BSTR bsType = NULL; bool bNeedSetType = false; // nType: // REG_DWORD: сохранение числа в 16-ричном или 10-чном формате, в зависимости от того, что сейчас указано в xml ("dword"/"ulong"/"long") // REG_BINARY: строго в hex (FF,FF,...) // REG_SZ: ASCIIZ строка, можно проконтролировать, чтобы nSize/2 не был меньше длины строки // REG_MULTI_SZ: ASCIIZZ. При формировании <list...> нужно убедиться, что мы не вылезли за пределы nSize pChild = FindItem(mp_Key, L"value", regName, true); // создать, если его еще нету if (!pChild) goto wrap; hr = pChild->get_attributes(&pAttrs); if (FAILED(hr) || !pAttrs) goto wrap; bsType = GetAttr(pChild, pAttrs, L"type"); switch(nType) { case REG_DWORD: { wchar_t szValue[32]; if (bsType && (bsType[0] == L'u' || bsType[0] == L'U')) { _wsprintf(szValue, SKIPLEN(countof(szValue)) L"%u", *(LPDWORD)value); } else if (bsType && (bsType[0] == L'l' || bsType[0] == L'L')) { _wsprintf(szValue, SKIPLEN(countof(szValue)) L"%i", *(int*)value); } else { _wsprintf(szValue, SKIPLEN(countof(szValue)) L"%08x", *(LPDWORD)value); if (bsType) ::SysFreeString(bsType); // нужно добавить/установить тип bsType = ::SysAllocString(L"dword"); bNeedSetType = true; } bsValue = ::SysAllocString(szValue); } break; case REG_BINARY: { if (nSize == 1 && bsType && (bsType[0] == L'u' || bsType[0] == L'U')) { wchar_t szValue[4]; BYTE bt = *value; _wsprintf(szValue, SKIPLEN(countof(szValue)) L"%u", (DWORD)bt); bsValue = ::SysAllocString(szValue); } else if (nSize == 1 && bsType && (bsType[0] == L'l' || bsType[0] == L'L')) { wchar_t szValue[4]; char bt = *value; _wsprintf(szValue, SKIPLEN(countof(szValue)) L"%i", (int)bt); bsValue = ::SysAllocString(szValue); } else { DWORD nLen = nSize*2 + (nSize-1); // по 2 символа на байт + ',' между ними bsValue = ::SysAllocStringLen(NULL, nLen); nLen ++; // Чтобы далее не добавлять WCHAR на '\0' wchar_t* psz = (wchar_t*)bsValue; LPCBYTE ptr = value; while(nSize) { _wsprintf(psz, SKIPLEN(nLen-(psz-bsValue)) L"%02x", (DWORD)*ptr); ptr++; nSize--; psz+=2; if (nSize) *(psz++) = L','; } if (bsType && lstrcmp(bsType, L"hex")) { // Допустим только "hex" ::SysFreeString(bsType); bsType = NULL; } if (!bsType) { // нужно добавить/установить тип bsType = ::SysAllocString(L"hex"); bNeedSetType = true; } } } break; case REG_SZ: { wchar_t* psz = (wchar_t*)value; bsValue = ::SysAllocString(psz); if (bsType && lstrcmp(bsType, L"string")) { // Допустим только "string" ::SysFreeString(bsType); bsType = NULL; } if (!bsType) { // нужно добавить/установить тип bsType = ::SysAllocString(L"string"); bNeedSetType = true; } } break; case REG_MULTI_SZ: { if (bsType && lstrcmp(bsType, L"multi")) { // Допустим только "multi" ::SysFreeString(bsType); bsType = NULL; } if (!bsType) { // нужно добавить/установить тип bsType = ::SysAllocString(L"multi"); bNeedSetType = true; } } break; default: goto wrap; // не поддерживается } if (bNeedSetType) { _ASSERTE(bsType!=NULL); SetAttr(pChild, pAttrs, L"type", bsType); ::SysFreeString(bsType); bsType = NULL; } // Теперь собственно значение if (nType != REG_MULTI_SZ) { _ASSERTE(bsValue != NULL); SetAttr(pChild, pAttrs, L"data", bsValue); ::SysFreeString(bsValue); bsValue = NULL; } else // Тут нужно формировать список элементов <list> { VARIANT_BOOL bHasChild = VARIANT_FALSE; DOMNodeType nodeType = NODE_INVALID; // Если ранее был параметр "data" - удалить его из списка атрибутов hr = pAttrs->getNamedItem(L"data", &pNode); if (SUCCEEDED(hr) && pNode) { hr = pChild->removeChild(pNode, &pNodeRmv); pNode->Release(); pNode = NULL; if (pNodeRmv) { pNodeRmv->Release(); pNodeRmv = NULL; } } //TODO: может оставить перевод строки? // Сначала почистим #ifdef _DEBUG hr = pChild->get_nodeType(&nodeType); #endif hr = pChild->hasChildNodes(&bHasChild); if (bHasChild) { while((hr = pChild->get_firstChild(&pNode)) == S_OK && pNode) { hr = pNode->get_nodeType(&nodeType); #ifdef _DEBUG BSTR bsDebug = NULL; pNode->get_text(&bsDebug); if (bsDebug) ::SysFreeString(bsDebug); bsDebug = NULL; #endif hr = pChild->removeChild(pNode, &pNodeRmv); if (pNodeRmv) { pNodeRmv->Release(); pNodeRmv = NULL; } pNode->Release(); pNode = NULL; } } // Теперь - добавляем список wchar_t* psz = (wchar_t*)value; BSTR bsNodeType = ::SysAllocString(L"line"); VARIANT vtType; vtType.vt = VT_I4; vtType.lVal = NODE_ELEMENT; long nAllLen = nSize/2; // длина в wchar_t long nLen = 0; while(psz && *psz && nAllLen > 0) { hr = mp_File->createNode(vtType, bsNodeType, L"", &pNode); if (FAILED(hr) || !pNode) break; if (!SetAttr(pNode, L"data", psz)) break; hr = pChild->appendChild(pNode, &pNodeRmv); pNode->Release(); pNode = NULL; if (pNodeRmv) { pNodeRmv->Release(); pNodeRmv = NULL; } if (FAILED(hr)) break; nLen = _tcslen(psz)+1; psz += nLen; nAllLen -= nLen; } _ASSERTE(nAllLen <= 1); } mb_Modified = true; wrap: if (pIXMLDOMAttribute) { pIXMLDOMAttribute->Release(); pIXMLDOMAttribute = NULL; } if (pNode) { pNode->Release(); pNode = NULL; } if (pNodeRmv) { pNodeRmv->Release(); pNodeRmv = NULL; } if (pChild) { pChild->Release(); pChild = NULL; } if (pAttrs) { pAttrs->Release(); pAttrs = NULL; } if (bsValue) { ::SysFreeString(bsValue); bsValue = NULL; } if (bsType) { ::SysFreeString(bsType); bsType = NULL; } }