1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sdext.hxx" 26 27 #include "saxemitter.hxx" 28 #include "emitcontext.hxx" 29 #include "saxattrlist.hxx" 30 31 #include <rtl/strbuf.hxx> 32 #include <cppuhelper/exc_hlp.hxx> 33 #include <com/sun/star/xml/sax/XDocumentHandler.hpp> 34 35 #if OSL_DEBUG_LEVEL > 1 36 #include <osl/file.hxx> 37 static osl::File* pStream = NULL; 38 static int nIndent = 0; 39 #endif 40 41 using namespace com::sun::star; 42 43 namespace pdfi 44 { 45 46 SaxEmitter::SaxEmitter( const uno::Reference< xml::sax::XDocumentHandler >& xDocHdl ) : 47 m_xDocHdl( xDocHdl ) 48 { 49 OSL_PRECOND(m_xDocHdl.is(), "SaxEmitter(): invalid doc handler"); 50 try 51 { 52 m_xDocHdl->startDocument(); 53 } 54 catch( xml::sax::SAXException& ) 55 { 56 } 57 #if OSL_DEBUG_LEVEL > 1 58 static const char* pDir = getenv( "DBG_PDFIMPORT_DIR" ); 59 if( pDir ) 60 { 61 rtl::OUString aStr( rtl::OStringToOUString( pDir, RTL_TEXTENCODING_UTF8 ) ); 62 rtl::OUString aFileURL; 63 osl_getFileURLFromSystemPath( aStr.pData, &aFileURL.pData ); 64 rtl::OUStringBuffer aBuf( 256 ); 65 aBuf.append( aFileURL ); 66 aBuf.appendAscii( "/pdfimport.xml" ); 67 pStream = new osl::File( aBuf.makeStringAndClear() ); 68 if( pStream->open( OpenFlag_Write | OpenFlag_Create ) ) 69 { 70 pStream->open( OpenFlag_Write ); 71 pStream->setSize( 0 ); 72 } 73 } 74 else 75 pStream = 0; 76 #endif 77 } 78 79 SaxEmitter::~SaxEmitter() 80 { 81 try 82 { 83 m_xDocHdl->endDocument(); 84 } 85 catch( xml::sax::SAXException& ) 86 { 87 } 88 #if OSL_DEBUG_LEVEL > 1 89 if( pStream ) 90 { 91 pStream->close(); 92 delete pStream; 93 pStream = 0; 94 } 95 #endif 96 } 97 98 void SaxEmitter::beginTag( const char* pTag, const PropertyMap& rProperties ) 99 { 100 rtl::OUString aTag = rtl::OUString::createFromAscii( pTag ); 101 uno::Reference< xml::sax::XAttributeList > xAttr( 102 new SaxAttrList( rProperties ) ); 103 try 104 { 105 m_xDocHdl->startElement( aTag, xAttr ); 106 } 107 catch( xml::sax::SAXException& ) 108 { 109 } 110 #if OSL_DEBUG_LEVEL > 1 111 if( pStream ) 112 { 113 sal_uInt64 nWritten = 0; 114 for( int i = 0; i < nIndent; i++ ) 115 pStream->write( " ", 4, nWritten ); 116 117 rtl::OStringBuffer aBuf( 1024 ); 118 aBuf.append( '<' ); 119 aBuf.append( pTag ); 120 for( PropertyMap::const_iterator it = rProperties.begin(); it != rProperties.end(); ++it ) 121 { 122 aBuf.append( ' ' ); 123 aBuf.append( rtl::OUStringToOString( it->first, RTL_TEXTENCODING_UTF8 ) ); 124 aBuf.append( "=\"" ); 125 aBuf.append( rtl::OUStringToOString( it->second, RTL_TEXTENCODING_UTF8 ) ); 126 aBuf.append( "\"" ); 127 } 128 aBuf.append( ">\n" ); 129 pStream->write( aBuf.getStr(), aBuf.getLength(), nWritten ); 130 nIndent++; 131 } 132 #endif 133 } 134 135 void SaxEmitter::write( const rtl::OUString& rText ) 136 { 137 try 138 { 139 m_xDocHdl->characters( rText ); 140 } 141 catch( xml::sax::SAXException& ) 142 { 143 } 144 #if OSL_DEBUG_LEVEL > 1 145 if( pStream ) 146 { 147 rtl::OString aStr( rtl::OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ) ); 148 sal_uInt64 nWritten = 0; 149 pStream->write( aStr.getStr(), aStr.getLength(), nWritten ); 150 } 151 #endif 152 } 153 154 void SaxEmitter::endTag( const char* pTag ) 155 { 156 rtl::OUString aTag = rtl::OUString::createFromAscii( pTag ); 157 try 158 { 159 m_xDocHdl->endElement( aTag ); 160 } 161 catch( xml::sax::SAXException& ) 162 { 163 } 164 #if OSL_DEBUG_LEVEL > 1 165 if( pStream ) 166 { 167 sal_uInt64 nWritten = 0; 168 for( int i = 0; i < nIndent; i++ ) 169 pStream->write( " ", 4, nWritten ); 170 171 rtl::OStringBuffer aBuf( 1024 ); 172 aBuf.append( "</" ); 173 aBuf.append( pTag ); 174 aBuf.append( ">\n" ); 175 pStream->write( aBuf.getStr(), aBuf.getLength(), nWritten ); 176 nIndent--; 177 } 178 #endif 179 } 180 181 XmlEmitterSharedPtr createSaxEmitter( const uno::Reference< xml::sax::XDocumentHandler >& xDocHdl ) 182 { 183 return XmlEmitterSharedPtr(new SaxEmitter(xDocHdl)); 184 } 185 186 } 187