コード例 #1
0
ファイル: cMsXml.cpp プロジェクト: achacha/AOS
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;
}
コード例 #2
0
ファイル: parseChildTsl.cpp プロジェクト: kravietz/TSLwatch
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
コード例 #3
0
ファイル: parseRootTsl.cpp プロジェクト: kravietz/TSLwatch
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
コード例 #4
0
ファイル: QuickConnection.cpp プロジェクト: RaoMiao/freestyle
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();
}