diff --git a/sdext/source/pdfimport/inc/pdfparse.hxx b/sdext/source/pdfimport/inc/pdfparse.hxx index 8f715e97e290..df3e4259ab1a 100644 --- a/sdext/source/pdfimport/inc/pdfparse.hxx +++ b/sdext/source/pdfimport/inc/pdfparse.hxx @@ -304,6 +304,9 @@ class PDFReader ~PDFReader() {} PDFEntry* read( const char* pFileName ); +#ifdef WIN32 + PDFEntry* read( const char* pBuffer, unsigned int nLen ); +#endif }; } // namespace diff --git a/sdext/source/pdfimport/pdfparse/pdfparse.cxx b/sdext/source/pdfimport/pdfparse/pdfparse.cxx index e5cae107695c..32dc0efa9293 100644 --- a/sdext/source/pdfimport/pdfparse/pdfparse.cxx +++ b/sdext/source/pdfimport/pdfparse/pdfparse.cxx @@ -556,9 +556,60 @@ public: } }; +#ifdef WIN32 +PDFEntry* PDFReader::read( const char* pBuffer, unsigned int nLen ) +{ + PDFGrammar aGrammar( pBuffer ); + + try + { + #if OSL_DEBUG_LEVEL > 1 + boost::spirit::parse_info aInfo = + #endif + boost::spirit::parse( pBuffer, + pBuffer+nLen, + aGrammar, + boost::spirit::space_p ); + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "parseinfo: stop = %p (buff=%p, offset = %d), hit = %s, full = %s, length = %d\n", + aInfo.stop, pBuffer, aInfo.stop - pBuffer, + aInfo.hit ? "true" : "false", + aInfo.full ? "true" : "false", + (int)aInfo.length ); + #endif + } + catch( const parser_error& rError ) + { + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "parse error: %s at buffer pos %u\nobject stack:\n", + rError.descriptor, rError.where - pBuffer ); + unsigned int nElem = aGrammar.m_aObjectStack.size(); + for( unsigned int i = 0; i < nElem; i++ ) + { + fprintf( stderr, " %s\n", typeid( *(aGrammar.m_aObjectStack[i]) ).name() ); + } + #endif + } + + PDFEntry* pRet = NULL; + unsigned int nEntries = aGrammar.m_aObjectStack.size(); + if( nEntries == 1 ) + { + pRet = aGrammar.m_aObjectStack.back(); + aGrammar.m_aObjectStack.pop_back(); + } + #if OSL_DEBUG_LEVEL > 1 + else if( nEntries > 1 ) + fprintf( stderr, "error got %u stack objects in parse\n", nEntries ); + #endif + + return pRet; +} +#endif + PDFEntry* PDFReader::read( const char* pFileName ) { - #ifdef WIN32 +#ifdef WIN32 /* #i106583# since converting to boost 1.39 file_iterator does not work anymore on all Windows systems C++ stdlib istream_iterator does not allow "-" apparently @@ -584,7 +635,7 @@ PDFEntry* PDFReader::read( const char* pFileName ) fclose( fp ); } return pRet; - #else +#else file_iterator<> file_start( pFileName ); if( ! file_start ) return NULL; @@ -644,7 +695,7 @@ PDFEntry* PDFReader::read( const char* pFileName ) } #endif return pRet; - #endif // WIN32 +#endif // WIN32 } #if defined __SUNPRO_CC