Garmin Fleet Management Controller  2.19.0
XMLTransformer.cpp
Go to the documentation of this file.
1 /*********************************************************************
2 *
3 * MODULE NAME:
4 * XMLTransformer.cpp
5 *
6 * Copyright 2013 by Garmin Ltd. or its subsidiaries.
7 *---------------------------------------------------------------------
8 * $NoKeywords$
9 *********************************************************************/
10 #include "XMLTransformer.h"
11 
12 //----------------------------------------------------------------------
14 //----------------------------------------------------------------------
16 {
17  m_stylesheet = txf;
18 }
19 
20 //----------------------------------------------------------------------
22 //----------------------------------------------------------------------
24 {
25 }
26 
27 //----------------------------------------------------------------------
35 //----------------------------------------------------------------------
36 BOOL XMLTransformer::transform(LPCTSTR src, IStream * dst, CMapStringToString & params)
37  {
38  BOOL bResult = FALSE;
39  HRESULT hr;
40 
41  // load stylesheet, create a template from it, and a processor from that
42  MSXML2::IXMLDOMDocument3Ptr pStyleSheet( MSXML2::CLSID_FreeThreadedDOMDocument60 );
43  MSXML2::IXSLTemplatePtr pTemplate( MSXML2::CLSID_XSLTemplate60 );
44  MSXML2::IXSLProcessorPtr pProcessor;
45  try {
46  pStyleSheet->async = VARIANT_FALSE;
47  pStyleSheet->resolveExternals = VARIANT_TRUE;
48  pStyleSheet->setProperty( "AllowDocumentFunction", VARIANT_TRUE );
49 
50  bResult = pStyleSheet->load( _variant_t( m_stylesheet ) );
51 
52  pTemplate->stylesheet = pStyleSheet;
53 
54  pProcessor = pTemplate->createProcessor();
55  }
56  catch ( _com_error &e ) {
57  TRACE1("Error loading XSL stylesheet : %s\n", ( const char * ) _bstr_t( e.Description() ) );
58  return FALSE;
59  }
60 
61  // now load the source XML document
62  MSXML2::IXMLDOMDocumentPtr pSrcDoc( MSXML2::CLSID_DOMDocument60 );
63 
64  try {
65  bResult = pSrcDoc->load( _variant_t( src ) );
66  if ( !bResult ) {
67  TRACE1( "Error parsing source document for transform: %s\n", src );
68  if ( pSrcDoc->parseError )
69  {
70  CString text = pSrcDoc->parseError->Getreason();
71  TRACE1( "Parse error: %s\n", text );
72  }
73  TRACE1( "error: %d\n", GetLastError() );
74  }
75 
76  hr = pProcessor->put_output( CComVariant( dst ) );
77  if ( !SUCCEEDED( hr ) ) {
78  TRACE1( "error: %d\n", GetLastError() );
79  }
80 
81  hr = pProcessor->put_input( _variant_t( ( IUnknown * ) pSrcDoc ) );
82  if ( !SUCCEEDED( hr ) ) {
83  TRACE1( "error: %d\n", GetLastError() );
84  }
85 
86  // assign the parameters for the transformation
87  CString key, val;
88  for ( POSITION pos = params.GetStartPosition(); pos != NULL; ) {
89  params.GetNextAssoc( pos, key, val );
90  pProcessor->addParameter( _bstr_t( key ), _variant_t( val ), "" );
91  TRACE2( "adding params: %s = %s\r\n", key, val );
92  }
93 
94  bResult = pProcessor->transform();
95  }
96  catch ( _com_error &e ) {
97  bResult = FALSE;
98  TRACE1( "Error processing XML : %s\n", ( const char * ) _bstr_t( e.Description() ) );
99  }
100 
101  return bResult;
102 }
CString m_stylesheet
The path to the XSL stylesheet use by this transformer.
#define FALSE
Definition: garmin_types.h:46
virtual ~XMLTransformer(void)
Destructor.
BOOL transform(LPCTSTR src, IStream *dst, CMapStringToString &params)
transform an XML document
XMLTransformer(LPCTSTR stylesheet)
Constructor.