int main() { IXMLDOMDocument2Ptr pXMLDoc = NULL; IXMLDOMDocument2Ptr pXSLDoc = NULL; IXMLDOMDocument2Ptr pXMLOut = NULL; //init xml doc, xsd doc and schemacache obj CoInitialize(NULL); try{ HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument40)), hr1 = pXSLDoc.CreateInstance(__uuidof(DOMDocument40)), hr2 = pXMLOut.CreateInstance(__uuidof(DOMDocument40)); if (FAILED(hr) || FAILED(hr1) || FAILED(hr2)) { std::cout << "Failed to created output DOM object." << std::endl; } //a_Load XML document pXMLDoc->async = VARIANT_FALSE; //set async to false if (! pXMLDoc->load(_bstr_t("Q:\\foo.xml")) ) { std::cout << "Failed to created XML DOM object." << std::endl; } //a_Load XSL document pXSLDoc->async = VARIANT_FALSE; //set async to false if (! pXSLDoc->load(_bstr_t("Q:\\foo.xsl")) ) { std::cout << "Failed to created XSL DOM object." << std::endl; } // Transform the XSLT to an XML string. _bstr_t xmlStr = pXMLDoc->transformNode(pXSLDoc); //Always remember to check for parse errors. if(pXMLDoc->parseError->errorCode != 0) { std::cout << "Failed to transformNode: " << (LPCSTR)pXMLDoc->parseError->Getreason() << std::endl; } else { std::cout << "RESULT:\n" << (LPCSTR)xmlStr << std::endl; } std::cout << std::endl; // Transform the XSLT to a DOM object. std::cout << pXMLDoc->xml << std::endl; std::cout << pXSLDoc->xml << std::endl; hr = pXMLDoc->transformNodeToObject(pXSLDoc, pXMLOut.GetInterfacePtr()); std::cout << pXMLOut->xml << std::endl; if (FAILED(hr)) { std::cout << "Failed to transformNodeToObject: " << pXMLDoc->parseError->Getreason() << std::endl; } else { hr = pXMLOut->save("foo.html"); if (FAILED(hr)) { std::cout << "Failed to save output DOM to foo.html\n"; } else { std::cout << "Saved to foo.html, output from transformNodeToObject:\n" << pXMLOut->xml << std::endl; } } } catch(_com_error &e) { dump_com_error(e); } if (pXMLDoc) pXMLDoc.Release(); if (pXSLDoc) pXSLDoc.Release(); if (pXMLOut) pXMLOut.Release(); CoUninitialize(); return 0; }
BOOL parseChildTsl(PSTR IN url, TCertListPtr IN pCertList, TURLListPtr IN URLListPtr) { BOOL ret; IXMLDOMDocument2Ptr pXMLDoc; LPWSTR pInsertStrings[2] = {NULL, NULL}; LPCWSTR searchTerm; MSXML2::IXMLDOMElementPtr pXMLDocElement = NULL; MSXML2::IXMLDOMNodeListPtr pXMLDomNodeList = NULL; INT i; pInsertStrings[0] = (LPWSTR) _strdup(url); ret = ReportEvent(hEventLog, EVENTLOG_INFORMATION_TYPE, CAT_TSL_PARSER, TSL_PARSE_START, NULL, 1, 0, (LPCWSTR*)pInsertStrings, NULL); printf("Opening child TSL %s...\n", url); // add currently processed URL ret = addUrl( url, &URLListPtr); // initialize XML trees CoInitialize(NULL); // attempt to fetch TSL file from Internet pXMLDoc = TslFetch(url); try{ #define DSIG_NS L"xmlns:tsl='http://uri.etsi.org/02231/v2#' xmlns:tslx='http://uri.etsi.org/02231/v2/additionaltypes#'" // Initialize XML parser pXMLDoc->async = VARIANT_FALSE; pXMLDoc->setProperty("SelectionLanguage", "XPath"); // tell MSXML that we will use XPath syntax pXMLDoc->setProperty("SelectionNamespaces", DSIG_NS); // set namespace pXMLDocElement = pXMLDoc->documentElement; // Structure for child TSL (root=false) //tsl:TrustServiceProvider // tsl:TSPInformation // tsl:TSPName // tsl:Name[xml:lang='en'] // tsl:TSPServices // tsl:TSPService // tsl:ServiceInformation // tsl:ServiceTypeIdentifier // tsl:ServiceDigitalIdentity // tsl:DigitalId // tsl:X509Certificate searchTerm = L"//tsl:TSPService"; pXMLDomNodeList = pXMLDocElement->selectNodes(searchTerm); INT count = 0; count = pXMLDomNodeList->length; wprintf(L"XML query: %s\n", searchTerm); printf("Found %d nodes.\n", count); for(i=0; i<count; i++) { // process sub-TSL location MSXML2::IXMLDOMElementPtr current_elem = NULL; MSXML2::IXMLDOMElementPtr cert_elem = NULL; MSXML2::IXMLDOMElementPtr name_elem = NULL; MSXML2::IXMLDOMElementPtr service_elem = NULL; MSXML2::IXMLDOMElementPtr status_elem = NULL; current_elem = pXMLDomNodeList->item[i]; // at tsl:TSPService level wprintf(L"Found %s\n", (LPWSTR) current_elem->tagName); // fetch operator name for current certificate name_elem = current_elem->selectSingleNode(L"../../tsl:TSPInformation/tsl:TSPName/tsl:Name[@xml:lang='en']"); assert(name_elem != NULL); wprintf(L"Operator name=%s\n", (LPWSTR) name_elem->text); // fetch service name identifier (QC, TSP etc) // Annex D.2 page 73 of ETSI TS 102 200 status_elem = current_elem->selectSingleNode(L"tsl:ServiceInformation/tsl:ServiceTypeIdentifier"); assert(status_elem != NULL); wprintf(L"Service id=%s\n", (LPWSTR) status_elem->text); // fetch service status identifier (active, discontinued etc) // Annex L.2 page 100 of ETSI TS 102 200 service_elem = current_elem->selectSingleNode(L"tsl:ServiceInformation/tsl:ServiceStatus"); assert(service_elem != NULL); wprintf(L"Service status=%s\n", (LPWSTR) service_elem->text); //assert( wcscmp(L"http://uri.etsi.org/TrstSvc/eSigDir-1999-93-EC-TrustedList/Svcstatus/undersupervision", status_elem->text) == 0); // fetch certificate cert_elem = current_elem->selectSingleNode(L"tsl:ServiceInformation/tsl:ServiceDigitalIdentity/tsl:DigitalId/tsl:X509Certificate"); assert(cert_elem != NULL); printf("Adding cert to urllist, size=%d\n", certCount(pCertList)); // add certificate to global certificate list for further processing ret = addCert((PSTR) cert_elem->text, &pCertList); if(certCount(pCertList) > 20) // XXX for faster debugging return true; } /* end of XML parsing loop */ } // end of try block catch(_com_error &e) { dump_com_error(e); return false; } return true; } // end of parseTSL
BOOL parseRootTsl(PSTR IN url, TCertListPtr IN pCertList, TURLListPtr IN URLListPtr) { BOOL ret; IXMLDOMDocument2Ptr pXMLDoc; LPWSTR pInsertStrings[2] = {NULL, NULL}; LPCWSTR searchTerm; MSXML2::IXMLDOMElementPtr pXMLDocElement = NULL; MSXML2::IXMLDOMNodeListPtr pXMLDomNodeList = NULL; INT i; pInsertStrings[0] = (LPWSTR) _strdup(url); ret = ReportEvent(hEventLog, EVENTLOG_INFORMATION_TYPE, CAT_TSL_PARSER, TSL_PARSE_START, NULL, 1, 0, (LPCWSTR*)pInsertStrings, NULL); printf("Opening %s...\n", url); // add currently processed URL ret = addUrl( url, &URLListPtr); // initialize XML trees CoInitialize(NULL); // attempt to fetch TSL file from Internet pXMLDoc = TslFetch(url); try{ #define DSIG_NS L"xmlns:tsl='http://uri.etsi.org/02231/v2#' xmlns:tslx='http://uri.etsi.org/02231/v2/additionaltypes#'" // Initialize XML parser pXMLDoc->async = VARIANT_FALSE; pXMLDoc->setProperty("SelectionLanguage", "XPath"); // tell MSXML that we will use XPath syntax pXMLDoc->setProperty("SelectionNamespaces", DSIG_NS); // set namespace pXMLDocElement = pXMLDoc->documentElement; // Structure for root TSL (root=true) // OtherTSLPointer // +- ServiceDigitalIdentities // +- ServiceDigitalIdentity // +- DigitalId // +- X509Certificate CERT - we add this to GlobalCertList // +- TSLLocation SUB-TSL - we parse this recursively // +- AdditionalInformation // +- OtherInformation* // +- tslx:MimeType MIME - need this to skip PDF files // +- OtherInformation* // +- SchemeOperatorName // +- Name searchTerm = L"//tsl:TSLLocation[../tsl:AdditionalInformation/tsl:OtherInformation/tslx:MimeType='application/vnd.etsi.tsl+xml']"; pXMLDomNodeList = pXMLDocElement->selectNodes(searchTerm); INT count = 0; count = pXMLDomNodeList->length; wprintf(L"XML query: %s\n", searchTerm); printf("Found %d nodes.\n", count); for(i=0; i<count; i++) { // process sub-TSL location MSXML2::IXMLDOMElementPtr current_elem = NULL; MSXML2::IXMLDOMElementPtr cert_elem = NULL; MSXML2::IXMLDOMElementPtr name_elem = NULL; BSTR tagName, newUrl; PSTR copyNewUrl; current_elem = pXMLDomNodeList->item[i]; // for root we are at TSLLocation level, for child at tagName = current_elem->tagName; newUrl = current_elem->text; copyNewUrl = (PSTR) malloc(wcslen(newUrl)*2); // convert URL to PSTR as this is what TslFetch expects later on WideCharToMultiByte(CP_ACP, 0, newUrl, -1, copyNewUrl, wcslen(newUrl)*2, NULL, NULL); // this part is recursively calling parseTSL() // need to check duplicate urls because most TSL will publish reference to EU TSL if(isKnownUrl((PSTR) copyNewUrl, URLListPtr) == false) { // fetch operator name for current certificate name_elem = current_elem->selectSingleNode(L"../tsl:AdditionalInformation/tsl:OtherInformation/tsl:SchemeOperatorName/tsl:Name"); assert(name_elem != NULL); wprintf(L"Child TSL operator name=%s\n", (LPWSTR) name_elem->text); // if this TSL wasn't previously parse, do it now wprintf(L"Found new TSL %s=%s\n", (LPWSTR) tagName, (LPWSTR) newUrl); ret = parseChildTsl( copyNewUrl, pCertList, URLListPtr); } // fetch certificate /* this is not really needed until we verify TSL signatures cert_elem = current_elem->selectSingleNode(L"../tsl:ServiceDigitalIdentities/tsl:ServiceDigitalIdentity/tsl:DigitalId/tsl:X509Certificate"); if(cert_elem == NULL) { printf("No certificate found in TSL: %s\n", copyNewUrl); } else { printf("Adding cert to urllist, size=%d\n", certCount(pCertList)); // add certificate to global certificate list for further processing ret = addCert((PSTR) cert_elem->text, &pCertList); } */ if(certCount(pCertList) > 4) // XXX for faster debugging just process 4 certs return true; } /* end of XML parsing loop */ } // end of try block catch(_com_error &e) { dump_com_error(e); return false; } return true; } // end of parseTSL
void CQuickConnection::Initial(void) { IXMLDOMDocument2Ptr pConfig; #ifdef _DEBUG CFileSys::ConvertBinaryXML( "script\\QuickConnection.xml","script\\QuickConnection.bml" ); FILE* fIn; if( NULL != (fIn=fopen( "script\\QuickConnection.bml","rb" ))) { CFileSys::LoadBinaryXML( pConfig, fIn ); } fclose( fIn ); #else DFileGPack packFile; packFile.Open(SFullName("script","QuickConnection.bml")); CFileSys::LoadBinaryXML(pConfig, packFile.GetFile(), packFile.GetSize()); packFile.Close(); #endif MSXML2::IXMLDOMNodePtr pNode = NULL; if( pNode = pConfig->selectSingleNode( L"./root/quick_mode" ) ) { long nIsQuickMode = pNode->GetnodeTypedValue(); m_nIsQuickMode = nIsQuickMode; } if( pNode = pConfig->selectSingleNode( L"./root/frame_speed_on" ) ) { long nFrameSpeedOn = pNode->GetnodeTypedValue(); m_nFrameSpeedOn = nFrameSpeedOn; } if( pNode = pConfig->selectSingleNode( L"./root/full_court" ) ) { long nFullCourt = pNode->GetnodeTypedValue(); m_nIsFullCourt = nFullCourt; } if( pNode = pConfig->selectSingleNode( L"./root/select_host" ) ) { long nIsHost = pNode->GetnodeTypedValue(); // long, short. m_nIsHost = nIsHost; // } // 중앙 서버의 ip 주소를 얻어 온다. if(pNode = pConfig->selectSingleNode(L"./root/server_option/server_addr")) { _bstr_t server_addr = pNode->GetnodeTypedValue(); m_sServerAddr = server_addr; } // 중앙 서버의 Port 를 얻어 온다. if(pNode = pConfig->selectSingleNode(L"./root/server_option/server_port")) { long nServerPort = pNode->GetnodeTypedValue(); m_iServerPort = nServerPort; } if(pNode = pConfig->selectSingleNode( L"./root/host_config/host_port" )) { long nHostPort = pNode->GetnodeTypedValue(); m_nHostPort = nHostPort; } if(pNode = pConfig->selectSingleNode( L"./root/host_config/player_on_player" )) { long nPlayerOn = pNode->GetnodeTypedValue(); m_nPlayerOn = nPlayerOn; } if(pNode = pConfig->selectSingleNode( L"./root/host_config/play_mode" )) { _bstr_t sPlayMode = pNode->GetnodeTypedValue(); m_sPlayMode = sPlayMode; } ///// MSXML2::IXMLDOMNodeListPtr pObjectList = pConfig->selectNodes(L"./root/host_db/character"); int nObject = pObjectList->Getlength(); for( int j = 0; j < nObject; j++ ) { MSXML2::IXMLDOMNodePtr pNode; MSXML2::IXMLDOMNodePtr pObject = pObjectList->Getitem(j); pNode = pObject->selectSingleNode(L"./position/x"); m_vecPos[j].X = pNode->GetnodeTypedValue(); pNode = pObject->selectSingleNode(L"./position/y"); m_vecPos[j].Y = pNode->GetnodeTypedValue(); pNode = pObject->selectSingleNode(L"./position/z"); m_vecPos[j].Z = pNode->GetnodeTypedValue(); } ///// if(pNode = pConfig->selectSingleNode( L"./root/client_option/connection_addr" )) { _bstr_t sConnectAddr = pNode->GetnodeTypedValue(); m_sConnectAddr = sConnectAddr; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/connection_id" )) { _bstr_t sConnectionId = pNode->GetnodeTypedValue(); m_sConnectionId = sConnectionId; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/char_id" )) { long nCharID = pNode->GetnodeTypedValue(); m_nCharID = nCharID; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/char_type" )) { long nCharType = pNode->GetnodeTypedValue(); m_nCharType = nCharType; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/client_port" )) { long nClientPort = pNode->GetnodeTypedValue(); m_nClientPort = nClientPort; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/with_ball" )) { long nWithBall = pNode->GetnodeTypedValue(); m_nWithBall = nWithBall; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/teamID" )) { long dwTeamID = pNode->GetnodeTypedValue(); m_dwTeamID = dwTeamID; } if(pNode = pConfig->selectSingleNode( L"./root/client_option/scale" )) { m_fScale = pNode->GetnodeTypedValue(); } if(pNode = pConfig->selectSingleNode( L"./root/client_option/latency" )) { m_fLatency = pNode->GetnodeTypedValue(); } ///// MSXML2::IXMLDOMNodeListPtr pItemList = pConfig->selectNodes(L"./root/client_option/item"); int nItemCnt = pItemList->Getlength(); m_nHaveItemCnt = nItemCnt; for( int k = 0; k < nItemCnt; k++ ) { MSXML2::IXMLDOMNodePtr pItemNode; MSXML2::IXMLDOMNodePtr pItmeObj = pItemList->Getitem(k); pItemNode = pItmeObj->selectSingleNode(L"./path"); _bstr_t ItemName = pItemNode->GetnodeTypedValue(); m_sHaveItemList[k] = ItemName; } //// pConfig.Release(); }