summaryrefslogtreecommitdiff
path: root/oox/source/dump/dumperbase.cxx
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2008-09-30 13:51:36 +0000
committerVladimir Glazounov <vg@openoffice.org>2008-09-30 13:51:36 +0000
commit07cabd8e634679ff59db4d72eacdfb514feb3cd1 (patch)
tree41b064504b537ff35a017aad8373870ae2cc1738 /oox/source/dump/dumperbase.cxx
parenta53f44d8fba07d9f7a79ac594a85b1059f1ae4a6 (diff)
CWS-TOOLING: integrate CWS dr63
Diffstat (limited to 'oox/source/dump/dumperbase.cxx')
-rw-r--r--oox/source/dump/dumperbase.cxx1188
1 files changed, 736 insertions, 452 deletions
diff --git a/oox/source/dump/dumperbase.cxx b/oox/source/dump/dumperbase.cxx
index c1afec609480..fdea7c9c6e8d 100644
--- a/oox/source/dump/dumperbase.cxx
+++ b/oox/source/dump/dumperbase.cxx
@@ -7,7 +7,7 @@
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dumperbase.cxx,v $
- * $Revision: 1.4 $
+ * $Revision: 1.4.20.13 $
*
* This file is part of OpenOffice.org.
*
@@ -31,25 +31,26 @@
#include "oox/dump/dumperbase.hxx"
#include <algorithm>
-#include <rtl/math.hxx>
-#include <rtl/tencinfo.h>
-#include <osl/file.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
#include <com/sun/star/io/XActiveDataSink.hpp>
#include <com/sun/star/io/XActiveDataSource.hpp>
#include <com/sun/star/io/XTextInputStream.hpp>
#include <com/sun/star/io/XTextOutputStream.hpp>
-#include <comphelper/processfactory.hxx>
+#include <rtl/math.hxx>
+#include <osl/file.hxx>
#include "oox/helper/binaryoutputstream.hxx"
#include "oox/core/filterbase.hxx"
#include "oox/xls/biffhelper.hxx"
#if OOX_INCLUDE_DUMPER
+using ::rtl::OString;
+using ::rtl::OStringBuffer;
+using ::rtl::OStringToOUString;
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
-using ::rtl::OString;
+using ::rtl::OUStringToOString;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::UNO_QUERY_THROW;
@@ -76,7 +77,7 @@ const sal_Unicode OOX_DUMP_CFG_QUOTE = '\'';
const sal_Unicode OOX_DUMP_LF = '\n';
const sal_Unicode OOX_DUMP_ITEMSEP = '=';
const sal_Int32 OOX_DUMP_BYTESPERLINE = 16;
-const sal_Int32 OOX_DUMP_MAXARRAY = 16;
+const sal_Int64 OOX_DUMP_MAXARRAY = 16;
// ============================================================================
// ============================================================================
@@ -106,13 +107,22 @@ OUString InputOutputHelper::getFileNameExtension( const OUString& rFileUrl )
return OUString();
}
-Reference< XInputStream > InputOutputHelper::openInputStream( const OUString& rFileName )
+// input streams --------------------------------------------------------------
+
+Reference< XInputStream > InputOutputHelper::getXInputStream( BinaryInputStream& rStrm )
+{
+ if( BinaryXInputStream* pXStrm = dynamic_cast< BinaryXInputStream* >( &rStrm ) )
+ return pXStrm->getXInputStream();
+ return 0;
+}
+
+Reference< XInputStream > InputOutputHelper::openInputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const OUString& rFileName )
{
Reference< XInputStream > xInStrm;
- try
+ if( rxFactory.is() ) try
{
- Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
- Reference< XSimpleFileAccess > xFileAccess( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
+ Reference< XSimpleFileAccess > xFileAccess( rxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
xInStrm = xFileAccess->openFileRead( rFileName );
}
catch( Exception& )
@@ -121,13 +131,13 @@ Reference< XInputStream > InputOutputHelper::openInputStream( const OUString& rF
return xInStrm;
}
-Reference< XTextInputStream > InputOutputHelper::openTextInputStream( const Reference< XInputStream >& rxInStrm, const OUString& rEncoding )
+Reference< XTextInputStream > InputOutputHelper::openTextInputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const Reference< XInputStream >& rxInStrm, const OUString& rEncoding )
{
Reference< XTextInputStream > xTextInStrm;
- if( rxInStrm.is() ) try
+ if( rxFactory.is() && rxInStrm.is() ) try
{
- Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
- Reference< XActiveDataSink > xDataSink( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TextInputStream" ) ), UNO_QUERY_THROW );
+ Reference< XActiveDataSink > xDataSink( rxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TextInputStream" ) ), UNO_QUERY_THROW );
xDataSink->setInputStream( rxInStrm );
xTextInStrm.set( xDataSink, UNO_QUERY_THROW );
}
@@ -139,23 +149,22 @@ Reference< XTextInputStream > InputOutputHelper::openTextInputStream( const Refe
return xTextInStrm;
}
-Reference< XTextInputStream > InputOutputHelper::openTextInputStream( const OUString& rFileName, const OUString& rEncoding )
+Reference< XTextInputStream > InputOutputHelper::openTextInputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const OUString& rFileName, const OUString& rEncoding )
{
- return openTextInputStream( openInputStream( rFileName ), rEncoding );
+ return openTextInputStream( rxFactory, openInputStream( rxFactory, rFileName ), rEncoding );
}
-Reference< XOutputStream > InputOutputHelper::openOutputStream( const OUString& rFileName )
+// output streams -------------------------------------------------------------
+
+Reference< XOutputStream > InputOutputHelper::openOutputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const OUString& rFileName )
{
Reference< XOutputStream > xOutStrm;
- try
+ if( rxFactory.is() ) try
{
- Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
- Reference< XSimpleFileAccess > xFileAccess( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
- if( !xFileAccess->isFolder( rFileName ) )
- {
- try { xFileAccess->kill( rFileName ); } catch( Exception& ) {}
- xOutStrm = xFileAccess->openFileWrite( rFileName );
- }
+ Reference< XSimpleFileAccess > xFileAccess( rxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
+ xOutStrm = xFileAccess->openFileWrite( rFileName );
}
catch( Exception& )
{
@@ -163,13 +172,13 @@ Reference< XOutputStream > InputOutputHelper::openOutputStream( const OUString&
return xOutStrm;
}
-Reference< XTextOutputStream > InputOutputHelper::openTextOutputStream( const Reference< XOutputStream >& rxOutStrm, const OUString& rEncoding )
+Reference< XTextOutputStream > InputOutputHelper::openTextOutputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const Reference< XOutputStream >& rxOutStrm, const OUString& rEncoding )
{
Reference< XTextOutputStream > xTextOutStrm;
- if( rxOutStrm.is() ) try
+ if( rxFactory.is() && rxOutStrm.is() ) try
{
- Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
- Reference< XActiveDataSource > xDataSource( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TextOutputStream" ) ), UNO_QUERY_THROW );
+ Reference< XActiveDataSource > xDataSource( rxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TextOutputStream" ) ), UNO_QUERY_THROW );
xDataSource->setOutputStream( rxOutStrm );
xTextOutStrm.set( xDataSource, UNO_QUERY_THROW );
}
@@ -181,9 +190,10 @@ Reference< XTextOutputStream > InputOutputHelper::openTextOutputStream( const Re
return xTextOutStrm;
}
-Reference< XTextOutputStream > InputOutputHelper::openTextOutputStream( const OUString& rFileName, const OUString& rEncoding )
+Reference< XTextOutputStream > InputOutputHelper::openTextOutputStream(
+ const Reference< XMultiServiceFactory >& rxFactory, const OUString& rFileName, const OUString& rEncoding )
{
- return openTextOutputStream( openOutputStream( rFileName ), rEncoding );
+ return openTextOutputStream( rxFactory, openOutputStream( rxFactory, rFileName ), rEncoding );
}
// ============================================================================
@@ -247,7 +257,7 @@ OUStringVector ItemFormat::parse( const OUString& rFormatStr )
// append string to string ----------------------------------------------------
-void StringHelper::appendChar( ::rtl::OUStringBuffer& rStr, sal_Unicode cChar, sal_Int32 nCount )
+void StringHelper::appendChar( OUStringBuffer& rStr, sal_Unicode cChar, sal_Int32 nCount )
{
for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex )
rStr.append( cChar );
@@ -370,21 +380,20 @@ void StringHelper::appendHex( OUStringBuffer& rStr, double fData, bool bPrefix )
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_uInt8 nData, bool bPrefix )
{
- if( nData != 0 )
- appendHex( rStr, nData, bPrefix );
+ appendHex( rStr, nData, bPrefix );
}
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_Int8 nData, bool bPrefix )
{
- appendShortHex( rStr, static_cast< sal_uInt8 >( nData ), bPrefix );
+ appendHex( rStr, nData, bPrefix );
}
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_uInt16 nData, bool bPrefix )
{
- if( nData > 0xFF )
+ if( nData > SAL_MAX_UINT8 )
appendHex( rStr, nData, bPrefix );
else
- appendShortHex( rStr, static_cast< sal_uInt8 >( nData ), bPrefix );
+ appendHex( rStr, static_cast< sal_uInt8 >( nData ), bPrefix );
}
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_Int16 nData, bool bPrefix )
@@ -394,7 +403,7 @@ void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_Int16 nData, bool b
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_uInt32 nData, bool bPrefix )
{
- if( nData > 0xFFFF )
+ if( nData > SAL_MAX_UINT16 )
appendHex( rStr, nData, bPrefix );
else
appendShortHex( rStr, static_cast< sal_uInt16 >( nData ), bPrefix );
@@ -407,7 +416,7 @@ void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_Int32 nData, bool b
void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_uInt64 nData, bool bPrefix )
{
- if( nData > 0xFFFFFFFF )
+ if( nData > SAL_MAX_UINT32 )
appendHex( rStr, nData, bPrefix );
else
appendShortHex( rStr, static_cast< sal_uInt32 >( nData ), bPrefix );
@@ -418,6 +427,11 @@ void StringHelper::appendShortHex( OUStringBuffer& rStr, sal_Int64 nData, bool b
appendShortHex( rStr, static_cast< sal_uInt64 >( nData ), bPrefix );
}
+void StringHelper::appendShortHex( OUStringBuffer& rStr, double fData, bool bPrefix )
+{
+ appendHex( rStr, fData, bPrefix );
+}
+
// append binary --------------------------------------------------------------
void StringHelper::appendBin( OUStringBuffer& rStr, sal_uInt8 nData, bool bDots )
@@ -763,7 +777,7 @@ OUString StringHelper::trimSpaces( const OUString& rStr )
OString StringHelper::convertToUtf8( const OUString& rStr )
{
- return ::rtl::OUStringToOString( rStr, RTL_TEXTENCODING_UTF8 );
+ return OUStringToOString( rStr, RTL_TEXTENCODING_UTF8 );
}
DataType StringHelper::convertToDataType( const OUString& rStr )
@@ -799,6 +813,8 @@ FormatType StringHelper::convertToFormatType( const OUString& rStr )
eType = FORMATTYPE_DEC;
else if( rStr.equalsAscii( "hex" ) )
eType = FORMATTYPE_HEX;
+ else if( rStr.equalsAscii( "shorthex" ) )
+ eType = FORMATTYPE_SHORTHEX;
else if( rStr.equalsAscii( "bin" ) )
eType = FORMATTYPE_BIN;
else if( rStr.equalsAscii( "fix" ) )
@@ -912,32 +928,32 @@ FormulaStack::FormulaStack() :
{
}
-void FormulaStack::pushOperand( const StringWrapper& rOp, const OUString& rTokClass )
+void FormulaStack::pushOperand( const String& rOp, const OUString& rTokClass )
{
- maFmlaStack.push( rOp.getString() );
+ maFmlaStack.push( rOp );
maClassStack.push( rTokClass );
}
-void FormulaStack::pushOperand( const StringWrapper& rOp )
+void FormulaStack::pushOperand( const String& rOp )
{
pushOperand( rOp, OUString( OOX_DUMP_BASECLASS ) );
}
-void FormulaStack::pushUnaryOp( const StringWrapper& rLOp, const StringWrapper& rROp )
+void FormulaStack::pushUnaryOp( const String& rLOp, const String& rROp )
{
- pushUnaryOp( maFmlaStack, rLOp.getString(), rROp.getString() );
- pushUnaryOp( maClassStack, rLOp.getString(), rROp.getString() );
+ pushUnaryOp( maFmlaStack, rLOp, rROp );
+ pushUnaryOp( maClassStack, rLOp, rROp );
}
-void FormulaStack::pushBinaryOp( const StringWrapper& rOp )
+void FormulaStack::pushBinaryOp( const String& rOp )
{
- pushBinaryOp( maFmlaStack, rOp.getString() );
- pushBinaryOp( maClassStack, rOp.getString() );
+ pushBinaryOp( maFmlaStack, rOp );
+ pushBinaryOp( maClassStack, rOp );
}
-void FormulaStack::pushFuncOp( const StringWrapper& rFunc, const OUString& rTokClass, sal_uInt8 nParamCount )
+void FormulaStack::pushFuncOp( const String& rFunc, const OUString& rTokClass, sal_uInt8 nParamCount )
{
- pushFuncOp( maFmlaStack, rFunc.getString(), nParamCount );
+ pushFuncOp( maFmlaStack, rFunc, nParamCount );
pushFuncOp( maClassStack, rTokClass, nParamCount );
}
@@ -1097,18 +1113,18 @@ NameListBase::~NameListBase()
{
}
-void NameListBase::setName( sal_Int64 nKey, const StringWrapper& rNameWrp )
+void NameListBase::setName( sal_Int64 nKey, const String& rName )
{
- implSetName( nKey, rNameWrp.getString() );
+ implSetName( nKey, rName );
}
-void NameListBase::includeList( NameListRef xList )
+void NameListBase::includeList( const NameListRef& rxList )
{
- if( xList.get() )
+ if( rxList.get() )
{
- for( const_iterator aIt = xList->begin(), aEnd = xList->end(); aIt != aEnd; ++aIt )
+ for( const_iterator aIt = rxList->begin(), aEnd = rxList->end(); aIt != aEnd; ++aIt )
maMap[ aIt->first ] = aIt->second;
- implIncludeList( *xList );
+ implIncludeList( *rxList );
}
}
@@ -1285,8 +1301,22 @@ OUString FlagsList::implGetName( const Config& /*rCfg*/, sal_Int64 nKey ) const
sal_Int64 nMask = aIt->first;
const OUString& rFlagName = aIt->second;
bool bNegated = (rFlagName.getLength() > 0) && (rFlagName[ 0 ] == '!');
- if( getFlag( nFlags, nMask ) != bNegated )
- StringHelper::appendToken( aName, bNegated ? rFlagName.copy( 1 ) : rFlagName );
+ sal_Int32 nBothSep = bNegated ? rFlagName.indexOf( '!', 1 ) : -1;
+ bool bFlag = getFlag( nFlags, nMask );
+ if( bFlag )
+ {
+ if( !bNegated )
+ StringHelper::appendToken( aName, rFlagName );
+ else if( nBothSep > 0 )
+ StringHelper::appendToken( aName, rFlagName.copy( nBothSep + 1 ) );
+ }
+ else if( bNegated )
+ {
+ if( nBothSep > 0 )
+ StringHelper::appendToken( aName, rFlagName.copy( 1, nBothSep - 1 ) );
+ else
+ StringHelper::appendToken( aName, rFlagName.copy( 1 ) );
+ }
setFlag( nFound, nMask );
}
// add unknown flags
@@ -1430,24 +1460,19 @@ void UnitConverter::implIncludeList( const NameListBase& /*rList*/ )
NameListRef NameListWrapper::getNameList( const Config& rCfg ) const
{
- return mxList.get() ? mxList : (mxList = rCfg.getNameList( maNameWrp.getString() ));
+ return mxList.get() ? mxList : (mxList = rCfg.getNameList( maName ));
}
// ============================================================================
// ============================================================================
-SharedConfigData::SharedConfigData( const OUString& rFileName )
+SharedConfigData::SharedConfigData( const OUString& rFileName,
+ const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName ) :
+ mxFactory( rxFactory ),
+ mxRootStrg( rxRootStrg ),
+ maSysFileName( rSysFileName ),
+ mbLoaded( false )
{
- construct( rFileName );
-}
-
-SharedConfigData::~SharedConfigData()
-{
-}
-
-void SharedConfigData::construct( const OUString& rFileName )
-{
- mbLoaded = false;
OUString aFileUrl = InputOutputHelper::convertFileNameToUrl( rFileName );
if( aFileUrl.getLength() > 0 )
{
@@ -1457,6 +1482,10 @@ void SharedConfigData::construct( const OUString& rFileName )
}
}
+SharedConfigData::~SharedConfigData()
+{
+}
+
void SharedConfigData::setOption( const OUString& rKey, const OUString& rData )
{
maConfigData[ rKey ] = rData;
@@ -1468,10 +1497,10 @@ const OUString* SharedConfigData::getOption( const OUString& rKey ) const
return (aIt == maConfigData.end()) ? 0 : &aIt->second;
}
-void SharedConfigData::setNameList( const OUString& rListName, NameListRef xList )
+void SharedConfigData::setNameList( const OUString& rListName, const NameListRef& rxList )
{
if( rListName.getLength() > 0 )
- maNameLists[ rListName ] = xList;
+ maNameLists[ rListName ] = rxList;
}
void SharedConfigData::eraseNameList( const OUString& rListName )
@@ -1490,7 +1519,7 @@ NameListRef SharedConfigData::getNameList( const OUString& rListName ) const
bool SharedConfigData::implIsValid() const
{
- return mbLoaded;
+ return mbLoaded && mxFactory.is() && mxRootStrg.get() && (maSysFileName.getLength() > 0);
}
void SharedConfigData::implProcessConfigItemStr(
@@ -1520,7 +1549,7 @@ bool SharedConfigData::readConfigFile( const OUString& rFileUrl )
if( !bLoaded )
{
Reference< XTextInputStream > xTextInStrm =
- InputOutputHelper::openTextInputStream( rFileUrl, CREATE_OUSTRING( "UTF-8" ) );
+ InputOutputHelper::openTextInputStream( mxFactory, rFileUrl, CREATE_OUSTRING( "UTF-8" ) );
if( xTextInStrm.is() )
{
maConfigFiles.insert( rFileUrl );
@@ -1582,14 +1611,14 @@ Config::Config( const Config& rParent ) :
construct( rParent );
}
-Config::Config( const OUString& rFileName )
+Config::Config( const sal_Char* pcEnvVar, const FilterBase& rFilter )
{
- construct( rFileName );
+ construct( pcEnvVar, rFilter );
}
-Config::Config( const sal_Char* pcEnvVar )
+Config::Config( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName )
{
- construct( pcEnvVar );
+ construct( pcEnvVar, rxFactory, rxRootStrg, rSysFileName );
}
Config::~Config()
@@ -1601,32 +1630,33 @@ void Config::construct( const Config& rParent )
*this = rParent;
}
-void Config::construct( const OUString& rFileName )
+void Config::construct( const sal_Char* pcEnvVar, const FilterBase& rFilter )
{
- mxCfgData.reset( new SharedConfigData( rFileName ) );
+ if( rFilter.getFileUrl().getLength() > 0 )
+ construct( pcEnvVar, rFilter.getGlobalFactory(), rFilter.getStorage(), rFilter.getFileUrl() );
}
-void Config::construct( const sal_Char* pcEnvVar )
+void Config::construct( const sal_Char* pcEnvVar, const Reference< XMultiServiceFactory >& rxFactory, const StorageRef& rxRootStrg, const OUString& rSysFileName )
{
- if( pcEnvVar )
+ if( pcEnvVar && rxRootStrg.get() && (rSysFileName.getLength() > 0) )
if( const sal_Char* pcFileName = ::getenv( pcEnvVar ) )
- construct( OUString::createFromAscii( pcFileName ) );
+ mxCfgData.reset( new SharedConfigData( OUString::createFromAscii( pcFileName ), rxFactory, rxRootStrg, rSysFileName ) );
}
-void Config::setStringOption( const StringWrapper& rKey, const StringWrapper& rData )
+void Config::setStringOption( const String& rKey, const String& rData )
{
- mxCfgData->setOption( rKey.getString(), rData.getString() );
+ mxCfgData->setOption( rKey, rData );
}
-const OUString& Config::getStringOption( const StringWrapper& rKey, const OUString& rDefault ) const
+const OUString& Config::getStringOption( const String& rKey, const OUString& rDefault ) const
{
- const OUString* pData = implGetOption( rKey.getString() );
+ const OUString* pData = implGetOption( rKey );
return pData ? *pData : rDefault;
}
-bool Config::getBoolOption( const StringWrapper& rKey, bool bDefault ) const
+bool Config::getBoolOption( const String& rKey, bool bDefault ) const
{
- const OUString* pData = implGetOption( rKey.getString() );
+ const OUString* pData = implGetOption( rKey );
return pData ? StringHelper::convertStringToBool( *pData ) : bDefault;
}
@@ -1640,19 +1670,19 @@ bool Config::isImportEnabled() const
return getBoolOption( "enable-import", true );
}
-void Config::setNameList( const StringWrapper& rListName, NameListRef xList )
+void Config::setNameList( const String& rListName, const NameListRef& rxList )
{
- mxCfgData->setNameList( rListName.getString(), xList );
+ mxCfgData->setNameList( rListName, rxList );
}
-void Config::eraseNameList( const StringWrapper& rListName )
+void Config::eraseNameList( const String& rListName )
{
- mxCfgData->eraseNameList( rListName.getString() );
+ mxCfgData->eraseNameList( rListName );
}
-NameListRef Config::getNameList( const StringWrapper& rListName ) const
+NameListRef Config::getNameList( const String& rListName ) const
{
- return implGetNameList( rListName.getString() );
+ return implGetNameList( rListName );
}
bool Config::implIsValid() const
@@ -1673,78 +1703,14 @@ NameListRef Config::implGetNameList( const OUString& rListName ) const
// ============================================================================
// ============================================================================
-bool Input::implIsValid() const
-{
- return true;
-}
-
-Input& operator>>( Input& rIn, sal_Int64& rnData )
-{
- return rIn >> *reinterpret_cast< double* >( &rnData );
-}
-
-Input& operator>>( Input& rIn, sal_uInt64& rnData )
-{
- return rIn >> *reinterpret_cast< double* >( &rnData );
-}
-
-// ============================================================================
-
-BinaryInput::BinaryInput( BinaryInputStream& rStrm ) :
- mrStrm( rStrm )
-{
-}
-
-sal_Int64 BinaryInput::getSize() const
-{
- return mrStrm.getLength();
-}
-
-sal_Int64 BinaryInput::tell() const
-{
- return mrStrm.tell();
-}
-
-void BinaryInput::seek( sal_Int64 nPos )
-{
- mrStrm.seek( nPos );
-}
-
-void BinaryInput::skip( sal_Int32 nBytes )
-{
- mrStrm.skip( nBytes );
-}
-
-sal_Int32 BinaryInput::read( void* pBuffer, sal_Int32 nBytes )
-{
- return mrStrm.read( pBuffer, nBytes );
-}
-
-bool BinaryInput::implIsValid() const
-{
- return mrStrm.is() && Input::implIsValid();
-}
-
-BinaryInput& BinaryInput::operator>>( sal_Int8& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( sal_uInt8& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( sal_Int16& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( sal_uInt16& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( sal_Int32& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( sal_uInt32& rnData ) { mrStrm >> rnData; return *this; }
-BinaryInput& BinaryInput::operator>>( float& rfData ) { mrStrm >> rfData; return *this; }
-BinaryInput& BinaryInput::operator>>( double& rfData ) { mrStrm >> rfData; return *this; }
-
-// ============================================================================
-// ============================================================================
-
Output::Output( const Reference< XTextOutputStream >& rxStrm )
{
construct( rxStrm );
}
-Output::Output( const ::rtl::OUString& rFileName )
+Output::Output( const Reference< XMultiServiceFactory >& rxFactory, const OUString& rFileName )
{
- construct( InputOutputHelper::openTextOutputStream( rFileName, CREATE_OUSTRING( "UTF-8" ) ) );
+ construct( InputOutputHelper::openTextOutputStream( rxFactory, rFileName, CREATE_OUSTRING( "UTF-8" ) ) );
}
// ----------------------------------------------------------------------------
@@ -1860,15 +1826,15 @@ void Output::resetItemIndex( sal_Int64 nIdx )
mnItemIdx = nIdx;
}
-void Output::startItem( const sal_Char* pcName )
+void Output::startItem( const String& rItemName )
{
if( mnItemLevel == 0 )
{
if( (mnMultiLevel > 0) && (maLine.getLength() > 0) )
tab();
- if( pcName )
+ if( rItemName.has() )
{
- writeItemName( pcName );
+ writeItemName( rItemName );
writeChar( OOX_DUMP_ITEMSEP );
}
}
@@ -1951,16 +1917,16 @@ void Output::writeBool( bool bData )
StringHelper::appendBool( maLine, bData );
}
-void Output::writeColor( sal_Int32 nColor )
+void Output::writeColorABGR( sal_Int32 nColor )
{
writeChar( 'a' );
writeDec( static_cast< sal_uInt8 >( nColor >> 24 ) );
writeAscii( ",r" );
- writeDec( static_cast< sal_uInt8 >( nColor >> 16 ) );
+ writeDec( static_cast< sal_uInt8 >( nColor ) );
writeAscii( ",g" );
writeDec( static_cast< sal_uInt8 >( nColor >> 8 ) );
writeAscii( ",b" );
- writeDec( static_cast< sal_uInt8 >( nColor ) );
+ writeDec( static_cast< sal_uInt8 >( nColor >> 16 ) );
}
void Output::writeDateTime( const DateTime& rDateTime )
@@ -2035,9 +2001,7 @@ void Output::construct( const Reference< XTextOutputStream >& rxStrm )
if( mxStrm.is() )
{
writeChar( OOX_DUMP_BOM );
- writeAscii( "OpenOffice.org binary file dumper v2.0" );
newLine();
- emptyLine();
}
}
@@ -2046,15 +2010,67 @@ bool Output::implIsValid() const
return mxStrm.is();
}
-void Output::writeItemName( const sal_Char* pcName )
+void Output::writeItemName( const String& rItemName )
{
- if( pcName && (*pcName == '#') )
+ if( rItemName.has() && (rItemName[ 0 ] == '#') )
{
- writeAscii( pcName + 1 );
+ writeString( rItemName.copy( 1 ) );
StringHelper::appendIndex( maLine, mnItemIdx++ );
}
else
- writeAscii( pcName );
+ writeString( rItemName );
+}
+
+// ============================================================================
+
+StorageIterator::StorageIterator( const StorageRef& rxStrg ) :
+ mxStrg( rxStrg )
+{
+ if( mxStrg.get() )
+ mxStrg->getElementNames( maNames );
+ maIt = maNames.begin();
+}
+
+StorageIterator::~StorageIterator()
+{
+}
+
+size_t StorageIterator::getElementCount() const
+{
+ return maNames.size();
+}
+
+StorageIterator& StorageIterator::operator++()
+{
+ if( maIt != maNames.end() )
+ ++maIt;
+ return *this;
+}
+
+OUString StorageIterator::getName() const
+{
+ OUString aName;
+ if( maIt != maNames.end() )
+ aName = *maIt;
+ return aName;
+}
+
+bool StorageIterator::isStream() const
+{
+ return isValid() && mxStrg->openInputStream( *maIt ).is();
+}
+
+bool StorageIterator::isStorage() const
+{
+ if( !isValid() )
+ return false;
+ StorageRef xStrg = mxStrg->openSubStorage( *maIt, false );
+ return xStrg.get() && xStrg->isStorage();
+}
+
+bool StorageIterator::implIsValid() const
+{
+ return mxStrg.get() && mxStrg->isStorage() && (maIt != maNames.end());
}
// ============================================================================
@@ -2064,10 +2080,9 @@ ObjectBase::~ObjectBase()
{
}
-void ObjectBase::construct( const FilterBase& rFilter, ConfigRef xConfig )
+void ObjectBase::construct( const ConfigRef& rxConfig )
{
- mpFilter = &rFilter;
- mxConfig = xConfig;
+ mxConfig = rxConfig;
}
void ObjectBase::construct( const ObjectBase& rParent )
@@ -2083,141 +2098,149 @@ void ObjectBase::dump()
bool ObjectBase::implIsValid() const
{
- return mpFilter && mpFilter->isImportFilter() && isValid( mxConfig );
-}
-
-ConfigRef ObjectBase::implReconstructConfig()
-{
- return mxConfig;
+ return isValid( mxConfig );
}
void ObjectBase::implDump()
{
}
-void ObjectBase::reconstructConfig()
+void ObjectBase::reconstructConfig( const ConfigRef& rxConfig )
{
- mxConfig = implReconstructConfig();
+ if( isValid( rxConfig ) )
+ mxConfig = rxConfig;
}
// ============================================================================
// ============================================================================
-RootStorageObjectBase::~RootStorageObjectBase()
-{
-}
-
-void RootStorageObjectBase::construct( const ObjectBase& rParent )
+void StorageObjectBase::construct( const ObjectBase& rParent, const StorageRef& rxStrg, const OUString& rSysPath )
{
ObjectBase::construct( rParent );
+ mxStrg = rxStrg;
+ maSysPath = rSysPath;
}
-void RootStorageObjectBase::implDump()
+void StorageObjectBase::construct( const ObjectBase& rParent )
{
- StorageRef xStrg = getFilter().getStorage();
- if( xStrg.get() && xStrg->isStorage() )
- extractStorage( xStrg, getFilter().getFileUrl() + CREATE_OUSTRING( ".dump" ) );
+ ObjectBase::construct( rParent );
+ if( ObjectBase::implIsValid() )
+ {
+ mxStrg = cfg().getRootStorage();
+ maSysPath = cfg().getSysFileName();
+ }
}
-void RootStorageObjectBase::implDumpStream( BinaryInputStreamRef, const OUString&, const OUString&, const OUString& )
+bool StorageObjectBase::implIsValid() const
{
+ return mxStrg.get() && mxStrg->isStorage() && (maSysPath.getLength() > 0) && ObjectBase::implIsValid();
}
-void RootStorageObjectBase::extractStream( StorageBase& rStrg, const OUString& rStrmName, const OUString& rSystemFileName )
+void StorageObjectBase::implDump()
{
- BinaryInputStream aInStrm( rStrg.openInputStream( rStrmName ), true );
- if( aInStrm.is() )
+ try
{
- BinaryOutputStream aOutStrm( InputOutputHelper::openOutputStream( rSystemFileName ), true );
- if( aOutStrm.is() )
- aOutStrm.copy( aInStrm );
+ Reference< XSimpleFileAccess > xFileAccess( getFactory()->createInstance( CREATE_OUSTRING( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
+ xFileAccess->kill( maSysPath + OOX_DUMP_DUMPEXT );
}
- BinaryInputStreamRef xDumpStrm( new BinaryInputStream( InputOutputHelper::openInputStream( rSystemFileName ), true ) );
- if( xDumpStrm->is() )
- implDumpStream( xDumpStrm, rStrg.getPath(), rStrmName, rSystemFileName + CREATE_OUSTRING( ".dump" ) );
-}
-
-void RootStorageObjectBase::extractStorage( StorageRef xStrg, const OUString& rSystemPath )
-{
- // create directory in file system
- ::osl::FileBase::RC eRes = ::osl::Directory::create( rSystemPath );
- if( (eRes == ::osl::FileBase::E_None) || (eRes == ::osl::FileBase::E_EXIST) )
+ catch( Exception& )
{
- // process children of the storage
- for( StorageIterator aIt( xStrg ); aIt.isValid(); ++aIt )
- {
- // encode all characters < 0x20
- OUStringBuffer aBuffer;
- StringHelper::appendEncString( aBuffer, aIt.getName(), false );
-
- // replace all characters reserved in file system
- OUString aSystemName = aBuffer.makeStringAndClear();
- static const sal_Unicode spcReserved[] = { '/', '\\', ':', '*', '?', '<', '>', '|' };
- for( const sal_Unicode* pcChar = spcReserved; pcChar < STATIC_ARRAY_END( spcReserved ); ++pcChar )
- aSystemName = aSystemName.replace( *pcChar, '_' );
-
- // build full path
- OUString aFullSystemName = rSystemPath + OUString( sal_Unicode( '/' ) ) + aSystemName;
-
- // handle storages and streams
- if( aIt.isStorage() )
- extractStorage( xStrg->openSubStorage( aIt.getName(), false ), aFullSystemName );
- else if( aIt.isStream() )
- extractStream( *xStrg, aIt.getName(), aFullSystemName );
- }
}
+ extractStorage( mxStrg, OUString(), maSysPath );
}
-// ============================================================================
-
-StorageIterator::StorageIterator( StorageRef xStrg ) :
- mxStrg( xStrg )
+void StorageObjectBase::implDumpStream( const BinaryInputStreamRef&, const OUString&, const OUString&, const OUString& )
{
- if( mxStrg.get() )
- mxStrg->getElementNames( maNames );
- maIt = maNames.begin();
}
-StorageIterator::~StorageIterator()
+void StorageObjectBase::implDumpStorage( const StorageRef& rxStrg, const OUString& rStrgPath, const OUString& rSysPath )
{
+ extractStorage( rxStrg, rStrgPath, rSysPath );
}
-size_t StorageIterator::getElementCount() const
+void StorageObjectBase::addPreferredStream( const String& rStrmName )
{
- return maNames.size();
+ if( rStrmName.has() )
+ maPreferred.push_back( PreferredItem( rStrmName, false ) );
}
-StorageIterator& StorageIterator::operator++()
+void StorageObjectBase::addPreferredStorage( const String& rStrgPath )
{
- if( maIt != maNames.end() )
- ++maIt;
- return *this;
+ if( rStrgPath.has() )
+ maPreferred.push_back( PreferredItem( rStrgPath, true ) );
}
-OUString StorageIterator::getName() const
+OUString StorageObjectBase::getSysFileName( const OUString& rStrmName, const OUString& rSysOutPath )
{
- OUString aName;
- if( maIt != maNames.end() )
- aName = *maIt;
- return aName;
+ // encode all characters < 0x20
+ OUStringBuffer aBuffer;
+ StringHelper::appendEncString( aBuffer, rStrmName, false );
+
+ // replace all characters reserved in file system
+ OUString aFileName = aBuffer.makeStringAndClear();
+ static const sal_Unicode spcReserved[] = { '/', '\\', ':', '*', '?', '<', '>', '|' };
+ for( const sal_Unicode* pcChar = spcReserved; pcChar < STATIC_ARRAY_END( spcReserved ); ++pcChar )
+ aFileName = aFileName.replace( *pcChar, '_' );
+
+ // build full path
+ return rSysOutPath + OUString( sal_Unicode( '/' ) ) + aFileName;
}
-bool StorageIterator::isStream() const
+void StorageObjectBase::extractStream( StorageBase& rStrg, const OUString& rStrgPath, const OUString& rStrmName, const OUString& rSysFileName )
{
- return isValid() && mxStrg->openInputStream( *maIt ).is();
+ BinaryXInputStream aInStrm( rStrg.openInputStream( rStrmName ), true );
+ if( !aInStrm.isEof() )
+ {
+ BinaryXOutputStream aOutStrm( InputOutputHelper::openOutputStream( getFactory(), rSysFileName ), true );
+ if( !aOutStrm.isEof() )
+ aOutStrm.copyStream( aInStrm );
+ }
+ BinaryXInputStreamRef xDumpStrm( new BinaryXInputStream( InputOutputHelper::openInputStream( getFactory(), rSysFileName ), true ) );
+ if( !xDumpStrm->isEof() )
+ implDumpStream( xDumpStrm, rStrgPath, rStrmName, rSysFileName );
}
-bool StorageIterator::isStorage() const
+void StorageObjectBase::extractStorage( const StorageRef& rxStrg, const OUString& rStrgPath, const OUString& rSysPath )
{
- if( !isValid() )
- return false;
- StorageRef xStrg = mxStrg->openSubStorage( *maIt, false );
- return xStrg.get() && xStrg->isStorage();
+ OUString aSysOutPath = rSysPath + OOX_DUMP_DUMPEXT;
+
+ // create directory in file system
+ ::osl::FileBase::RC eRes = ::osl::Directory::create( aSysOutPath );
+ if( (eRes != ::osl::FileBase::E_None) && (eRes != ::osl::FileBase::E_EXIST) )
+ return;
+
+ // process preferred storages and streams in root storage first
+ if( rStrgPath.getLength() == 0 )
+ for( PreferredItemVector::iterator aIt = maPreferred.begin(), aEnd = maPreferred.end(); aIt != aEnd; ++aIt )
+ extractItem( rxStrg, rStrgPath, aIt->maName, aSysOutPath, aIt->mbStorage, !aIt->mbStorage );
+
+ // process children of the storage
+ for( StorageIterator aIt( rxStrg ); aIt.isValid(); ++aIt )
+ {
+ // skip processed preferred items
+ OUString aItemName = aIt.getName();
+ bool bFound = false;
+ if( rStrgPath.getLength() == 0 )
+ for( PreferredItemVector::iterator aIIt = maPreferred.begin(), aIEnd = maPreferred.end(); !bFound && (aIIt != aIEnd); ++aIIt )
+ bFound = aIIt->maName == aItemName;
+ if( !bFound )
+ extractItem( rxStrg, rStrgPath, aItemName, aSysOutPath, aIt.isStorage(), aIt.isStream() );
+ }
}
-bool StorageIterator::implIsValid() const
+void StorageObjectBase::extractItem( const StorageRef& rxStrg, const OUString& rStrgPath, const OUString& rItemName, const OUString& rSysOutPath, bool bIsStrg, bool bIsStrm )
{
- return mxStrg.get() && mxStrg->isStorage() && (maIt != maNames.end());
+ OUString aSysFileName = getSysFileName( rItemName, rSysOutPath );
+ if( bIsStrg )
+ {
+ OUStringBuffer aStrgPath( rStrgPath );
+ StringHelper::appendToken( aStrgPath, rItemName, '/' );
+ implDumpStorage( rxStrg->openSubStorage( rItemName, false ), aStrgPath.makeStringAndClear(), aSysFileName );
+ }
+ else if( bIsStrm )
+ {
+ extractStream( *rxStrg, rStrgPath, rItemName, aSysFileName );
+ }
}
// ============================================================================
@@ -2227,16 +2250,17 @@ OutputObjectBase::~OutputObjectBase()
{
}
-void OutputObjectBase::construct( const ObjectBase& rParent, const OUString& rOutFileName )
+void OutputObjectBase::construct( const ObjectBase& rParent, const OUString& rSysFileName )
{
ObjectBase::construct( rParent );
- mxOut.reset( new Output( rOutFileName ) );
+ if( ObjectBase::implIsValid() )
+ mxOut.reset( new Output( getFactory(), rSysFileName + OOX_DUMP_DUMPEXT ) );
}
-void OutputObjectBase::construct( const ObjectBase& rParent, OutputRef xOut )
+void OutputObjectBase::construct( const ObjectBase& rParent, const OutputRef& rxOut )
{
ObjectBase::construct( rParent );
- mxOut = xOut;
+ mxOut = rxOut;
}
void OutputObjectBase::construct( const OutputObjectBase& rParent )
@@ -2249,30 +2273,28 @@ bool OutputObjectBase::implIsValid() const
return isValid( mxOut ) && ObjectBase::implIsValid();
}
-OutputRef OutputObjectBase::implReconstructOutput()
-{
- return mxOut;
-}
-
-void OutputObjectBase::reconstructOutput()
+void OutputObjectBase::writeEmptyItem( const String& rName )
{
- mxOut = implReconstructOutput();
+ ItemGuard aItem( *mxOut, rName );
}
-void OutputObjectBase::writeEmptyItem( const sal_Char* pcName )
+void OutputObjectBase::writeInfoItem( const String& rName, const String& rData )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
+ mxOut->writeString( rData );
}
-void OutputObjectBase::writeInfoItem( const sal_Char* pcName, const StringWrapper& rData )
+void OutputObjectBase::writeCharItem( const String& rName, sal_Unicode cData )
{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->writeString( rData.getString() );
+ ItemGuard aItem( *mxOut, rName );
+ mxOut->writeChar( OOX_DUMP_STRQUOTE );
+ mxOut->writeChar( cData );
+ mxOut->writeChar( OOX_DUMP_STRQUOTE );
}
-void OutputObjectBase::writeStringItem( const sal_Char* pcName, const ::rtl::OUString& rData )
+void OutputObjectBase::writeStringItem( const String& rName, const OUString& rData )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
mxOut->writeAscii( "(len=" );
mxOut->writeDec( rData.getLength() );
mxOut->writeAscii( ")," );
@@ -2283,127 +2305,127 @@ void OutputObjectBase::writeStringItem( const sal_Char* pcName, const ::rtl::OUS
mxOut->writeAscii( ",cut" );
}
-void OutputObjectBase::writeArrayItem( const sal_Char* pcName, const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep )
+void OutputObjectBase::writeArrayItem( const String& rName, const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
mxOut->writeArray( pnData, nSize, cSep );
}
-void OutputObjectBase::writeBoolItem( const sal_Char* pcName, bool bData )
+void OutputObjectBase::writeBoolItem( const String& rName, bool bData )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
mxOut->writeBool( bData );
}
-double OutputObjectBase::writeRkItem( const sal_Char* pcName, sal_Int32 nRk )
+double OutputObjectBase::writeRkItem( const String& rName, sal_Int32 nRk )
{
MultiItemsGuard aMultiGuard( out() );
- writeHexItem( pcName, static_cast< sal_uInt32 >( nRk ), "RK-FLAGS" );
+ writeHexItem( rName, static_cast< sal_uInt32 >( nRk ), "RK-FLAGS" );
double fValue = ::oox::xls::BiffHelper::calcDoubleFromRk( nRk );
writeDecItem( "decoded", fValue );
return fValue;
}
-void OutputObjectBase::writeColorItem( const sal_Char* pcName, sal_Int32 nColor )
+void OutputObjectBase::writeColorABGRItem( const String& rName, sal_Int32 nColor )
{
- ItemGuard aItem( *mxOut, pcName );
- writeHexItem( pcName, nColor );
- mxOut->writeColor( nColor );
+ ItemGuard aItem( *mxOut, rName );
+ writeHexItem( rName, nColor );
+ mxOut->writeColorABGR( nColor );
}
-void OutputObjectBase::writeDateTimeItem( const sal_Char* pcName, const DateTime& rDateTime )
+void OutputObjectBase::writeDateTimeItem( const String& rName, const DateTime& rDateTime )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
mxOut->writeDateTime( rDateTime );
}
-void OutputObjectBase::writeGuidItem( const sal_Char* pcName, const OUString& rGuid )
+void OutputObjectBase::writeGuidItem( const String& rName, const OUString& rGuid )
{
- ItemGuard aItem( *mxOut, pcName );
+ ItemGuard aItem( *mxOut, rName );
mxOut->writeString( rGuid );
aItem.cont();
mxOut->writeString( cfg().getStringOption( rGuid, OUString() ) );
}
-void OutputObjectBase::writeColIndexItem( const sal_Char* pcName, sal_Int32 nCol )
+void OutputObjectBase::writeColIndexItem( const String& rName, sal_Int32 nCol )
{
Output& rOut = out();
- ItemGuard aItem( rOut, pcName );
+ ItemGuard aItem( rOut, rName );
rOut.writeDec( nCol );
aItem.cont();
rOut.writeColIndex( nCol );
}
-void OutputObjectBase::writeRowIndexItem( const sal_Char* pcName, sal_Int32 nRow )
+void OutputObjectBase::writeRowIndexItem( const String& rName, sal_Int32 nRow )
{
Output& rOut = out();
- ItemGuard aItem( rOut, pcName );
+ ItemGuard aItem( rOut, rName );
rOut.writeDec( nRow );
aItem.cont();
rOut.writeRowIndex( nRow );
}
-void OutputObjectBase::writeColRangeItem( const sal_Char* pcName, sal_Int32 nCol1, sal_Int32 nCol2 )
+void OutputObjectBase::writeColRangeItem( const String& rName, sal_Int32 nCol1, sal_Int32 nCol2 )
{
Output& rOut = out();
- ItemGuard aItem( rOut, pcName );
+ ItemGuard aItem( rOut, rName );
rOut.writeColRowRange( nCol1, nCol2 );
aItem.cont();
rOut.writeColRange( nCol1, nCol2 );
}
-void OutputObjectBase::writeRowRangeItem( const sal_Char* pcName, sal_Int32 nRow1, sal_Int32 nRow2 )
+void OutputObjectBase::writeRowRangeItem( const String& rName, sal_Int32 nRow1, sal_Int32 nRow2 )
{
Output& rOut = out();
- ItemGuard aItem( rOut, pcName );
+ ItemGuard aItem( rOut, rName );
rOut.writeColRowRange( nRow1, nRow2 );
aItem.cont();
rOut.writeRowRange( nRow1, nRow2 );
}
-void OutputObjectBase::writeAddressItem( const sal_Char* pcName, const Address& rPos )
+void OutputObjectBase::writeAddressItem( const String& rName, const Address& rPos )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
StringHelper::appendAddress( out().getLine(), rPos );
}
-void OutputObjectBase::writeRangeItem( const sal_Char* pcName, const Range& rRange )
+void OutputObjectBase::writeRangeItem( const String& rName, const Range& rRange )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
StringHelper::appendRange( out().getLine(), rRange );
}
-void OutputObjectBase::writeRangeListItem( const sal_Char* pcName, const RangeList& rRanges )
+void OutputObjectBase::writeRangeListItem( const String& rName, const RangeList& rRanges )
{
MultiItemsGuard aMultiGuard( out() );
- writeEmptyItem( pcName );
+ writeEmptyItem( rName );
writeDecItem( "count", static_cast< sal_uInt16 >( rRanges.size() ) );
ItemGuard aItem( out(), "ranges" );
StringHelper::appendRangeList( out().getLine(), rRanges );
}
-void OutputObjectBase::writeTokenAddressItem( const sal_Char* pcName, const TokenAddress& rPos, bool bNameMode )
+void OutputObjectBase::writeTokenAddressItem( const String& rName, const TokenAddress& rPos, bool bNameMode )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
StringHelper::appendAddress( out().getLine(), rPos, bNameMode );
}
-void OutputObjectBase::writeTokenAddress3dItem( const sal_Char* pcName, const OUString& rRef, const TokenAddress& rPos, bool bNameMode )
+void OutputObjectBase::writeTokenAddress3dItem( const String& rName, const OUString& rRef, const TokenAddress& rPos, bool bNameMode )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
out().writeString( rRef );
StringHelper::appendAddress( out().getLine(), rPos, bNameMode );
}
-void OutputObjectBase::writeTokenRangeItem( const sal_Char* pcName, const TokenRange& rRange, bool bNameMode )
+void OutputObjectBase::writeTokenRangeItem( const String& rName, const TokenRange& rRange, bool bNameMode )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
StringHelper::appendRange( out().getLine(), rRange, bNameMode );
}
-void OutputObjectBase::writeTokenRange3dItem( const sal_Char* pcName, const OUString& rRef, const TokenRange& rRange, bool bNameMode )
+void OutputObjectBase::writeTokenRange3dItem( const String& rName, const OUString& rRef, const TokenRange& rRange, bool bNameMode )
{
- ItemGuard aItem( out(), pcName );
+ ItemGuard aItem( out(), rName );
out().writeString( rRef );
StringHelper::appendRange( out().getLine(), rRange, bNameMode );
}
@@ -2415,22 +2437,22 @@ InputObjectBase::~InputObjectBase()
{
}
-void InputObjectBase::construct( const ObjectBase& rParent, const ::rtl::OUString& rOutFileName, InputRef xIn )
+void InputObjectBase::construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const OUString& rSysFileName )
{
- OutputObjectBase::construct( rParent, rOutFileName );
- mxIn = xIn;
+ OutputObjectBase::construct( rParent, rSysFileName );
+ mxStrm = rxStrm;
}
-void InputObjectBase::construct( const ObjectBase& rParent, OutputRef xOut, InputRef xIn )
+void InputObjectBase::construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const OutputRef& rxOut )
{
- OutputObjectBase::construct( rParent, xOut );
- mxIn = xIn;
+ OutputObjectBase::construct( rParent, rxOut );
+ mxStrm = rxStrm;
}
-void InputObjectBase::construct( const OutputObjectBase& rParent, InputRef xIn )
+void InputObjectBase::construct( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm )
{
OutputObjectBase::construct( rParent );
- mxIn = xIn;
+ mxStrm = rxStrm;
}
void InputObjectBase::construct( const InputObjectBase& rParent )
@@ -2440,31 +2462,21 @@ void InputObjectBase::construct( const InputObjectBase& rParent )
bool InputObjectBase::implIsValid() const
{
- return isValid( mxIn ) && OutputObjectBase::implIsValid();
-}
-
-InputRef InputObjectBase::implReconstructInput()
-{
- return mxIn;
-}
-
-void InputObjectBase::reconstructInput()
-{
- mxIn = implReconstructInput();
+ return mxStrm.get() && OutputObjectBase::implIsValid();
}
-void InputObjectBase::skipBlock( sal_Int32 nBytes, bool bShowSize )
+void InputObjectBase::skipBlock( sal_Int64 nBytes, bool bShowSize )
{
- sal_Int64 nEndPos = ::std::min< sal_Int64 >( mxIn->tell() + nBytes, mxIn->getSize() );
- if( mxIn->tell() < nEndPos )
+ sal_Int64 nEndPos = ::std::min< sal_Int64 >( mxStrm->tell() + nBytes, mxStrm->getLength() );
+ if( mxStrm->tell() < nEndPos )
{
if( bShowSize )
- writeDecItem( "skipped-data-size", static_cast< sal_uInt64 >( nEndPos - mxIn->tell() ) );
- mxIn->seek( nEndPos );
+ writeDecItem( "skipped-data-size", static_cast< sal_uInt64 >( nEndPos - mxStrm->tell() ) );
+ mxStrm->seek( nEndPos );
}
}
-void InputObjectBase::dumpRawBinary( sal_Int32 nBytes, bool bShowOffset, bool bStream )
+void InputObjectBase::dumpRawBinary( sal_Int64 nBytes, bool bShowOffset, bool bStream )
{
Output& rOut = out();
TableGuard aTabGuard( rOut,
@@ -2473,13 +2485,13 @@ void InputObjectBase::dumpRawBinary( sal_Int32 nBytes, bool bShowOffset, bool bS
3 * OOX_DUMP_BYTESPERLINE / 2 + 1,
OOX_DUMP_BYTESPERLINE / 2 + 1 );
- sal_Int32 nMaxShowSize = cfg().getIntOption< sal_Int32 >(
- bStream ? "max-binary-stream-size" : "max-binary-data-size", SAL_MAX_INT32 );
+ sal_Int64 nMaxShowSize = cfg().getIntOption< sal_Int64 >(
+ bStream ? "max-binary-stream-size" : "max-binary-data-size", SAL_MAX_INT64 );
- bool bSeekable = mxIn->getSize() >= 0;
- sal_Int64 nEndPos = bSeekable ? ::std::min< sal_Int64 >( mxIn->tell() + nBytes, mxIn->getSize() ) : 0;
- sal_Int64 nDumpEnd = bSeekable ? ::std::min< sal_Int64 >( mxIn->tell() + nMaxShowSize, nEndPos ) : nMaxShowSize;
- sal_Int64 nPos = bSeekable ? mxIn->tell() : 0;
+ bool bSeekable = mxStrm->getLength() >= 0;
+ sal_Int64 nEndPos = bSeekable ? ::std::min< sal_Int64 >( mxStrm->tell() + nBytes, mxStrm->getLength() ) : 0;
+ sal_Int64 nDumpEnd = bSeekable ? ::std::min< sal_Int64 >( mxStrm->tell() + nMaxShowSize, nEndPos ) : nMaxShowSize;
+ sal_Int64 nPos = bSeekable ? mxStrm->tell() : 0;
bool bLoop = true;
while( bLoop && (nPos < nDumpEnd) )
@@ -2488,8 +2500,8 @@ void InputObjectBase::dumpRawBinary( sal_Int32 nBytes, bool bShowOffset, bool bS
rOut.tab();
sal_uInt8 pnLineData[ OOX_DUMP_BYTESPERLINE ];
- sal_Int32 nLineSize = bSeekable ? ::std::min( static_cast< sal_Int32 >( nDumpEnd - mxIn->tell() ), OOX_DUMP_BYTESPERLINE ) : OOX_DUMP_BYTESPERLINE;
- sal_Int32 nReadSize = mxIn->read( pnLineData, nLineSize );
+ sal_Int32 nLineSize = bSeekable ? ::std::min( static_cast< sal_Int32 >( nDumpEnd - mxStrm->tell() ), OOX_DUMP_BYTESPERLINE ) : OOX_DUMP_BYTESPERLINE;
+ sal_Int32 nReadSize = mxStrm->readMemory( pnLineData, nLineSize );
bLoop = nReadSize == nLineSize;
nPos += nReadSize;
@@ -2505,7 +2517,7 @@ void InputObjectBase::dumpRawBinary( sal_Int32 nBytes, bool bShowOffset, bool bS
}
aTabGuard.tab( 3 );
- for( pnByte = pnLineData, pnEnd = pnLineData + nLineSize; pnByte != pnEnd; ++pnByte )
+ for( pnByte = pnLineData, pnEnd = pnLineData + nReadSize; pnByte != pnEnd; ++pnByte )
{
if( (pnByte - pnLineData) == (OOX_DUMP_BYTESPERLINE / 2) ) rOut.tab();
rOut.writeChar( static_cast< sal_Unicode >( (*pnByte < 0x20) ? '.' : *pnByte ) );
@@ -2516,108 +2528,221 @@ void InputObjectBase::dumpRawBinary( sal_Int32 nBytes, bool bShowOffset, bool bS
// skip undumped data
if( bSeekable )
- skipBlock( static_cast< sal_Int32 >( nEndPos - mxIn->tell() ) );
+ skipBlock( nEndPos - mxStrm->tell() );
}
-void InputObjectBase::dumpBinary( const sal_Char* pcName, sal_Int32 nBytes, bool bShowOffset )
+void InputObjectBase::dumpBinary( const String& rName, sal_Int64 nBytes, bool bShowOffset )
{
{
MultiItemsGuard aMultiGuard( out() );
- writeEmptyItem( pcName );
+ writeEmptyItem( rName );
writeDecItem( "size", nBytes );
}
IndentGuard aIndGuard( out() );
dumpRawBinary( nBytes, bShowOffset );
}
-void InputObjectBase::dumpArray( const sal_Char* pcName, sal_Int32 nBytes, sal_Unicode cSep )
+void InputObjectBase::dumpRemaining( sal_Int64 nBytes )
{
- sal_Int32 nDumpSize = getLimitedValue< sal_Int32, sal_Int64 >( mxIn->getSize() - mxIn->tell(), 0, nBytes );
+ if( nBytes > 0 )
+ {
+ if( cfg().getBoolOption( "show-trailing-unknown", true ) )
+ dumpBinary( "remaining-data", nBytes, false );
+ else
+ skipBlock( nBytes );
+ }
+}
+
+void InputObjectBase::dumpRemainingTo( sal_Int64 nPos )
+{
+ if( mxStrm->isEof() )
+ writeInfoItem( "stream-state", OOX_DUMP_ERR_STREAM );
+ else
+ dumpRemaining( nPos - mxStrm->tell() );
+ mxStrm->seek( nPos );
+}
+
+void InputObjectBase::dumpRemainingStream()
+{
+ dumpRemainingTo( mxStrm->getLength() );
+}
+
+void InputObjectBase::dumpArray( const String& rName, sal_Int32 nBytes, sal_Unicode cSep )
+{
+ sal_Int32 nDumpSize = getLimitedValue< sal_Int32, sal_Int64 >( mxStrm->getLength() - mxStrm->tell(), 0, nBytes );
if( nDumpSize > OOX_DUMP_MAXARRAY )
{
- dumpBinary( pcName, nBytes, false );
+ dumpBinary( rName, nBytes, false );
}
else if( nDumpSize > 1 )
{
sal_uInt8 pnData[ OOX_DUMP_MAXARRAY ];
- mxIn->read( pnData, nDumpSize );
- writeArrayItem( pcName, pnData, nDumpSize, cSep );
+ mxStrm->readMemory( pnData, nDumpSize );
+ writeArrayItem( rName, pnData, nDumpSize, cSep );
}
else if( nDumpSize == 1 )
- dumpHex< sal_uInt8 >( pcName );
+ dumpHex< sal_uInt8 >( rName );
}
-void InputObjectBase::dumpRemaining( sal_Int32 nBytes )
+sal_Unicode InputObjectBase::dumpChar( const String& rName, rtl_TextEncoding eTextEnc )
{
- if( nBytes > 0 )
- {
- if( cfg().getBoolOption( "show-trailing-unknown", true ) )
- dumpBinary( "remaining-data", nBytes, false );
- else
- skipBlock( nBytes );
- }
+ sal_uInt8 nChar;
+ *mxStrm >> nChar;
+ OUString aChar = OStringToOUString( OString( static_cast< sal_Char >( nChar ) ), eTextEnc );
+ sal_Unicode cChar = (aChar.getLength() > 0) ? aChar[ 0 ] : 0;
+ writeCharItem( rName( "char" ), cChar );
+ return cChar;
}
-OUString InputObjectBase::dumpCharArray( const sal_Char* pcName, sal_Int32 nSize, rtl_TextEncoding eTextEnc )
+sal_Unicode InputObjectBase::dumpUnicode( const String& rName )
{
- sal_Int32 nDumpSize = getLimitedValue< sal_Int32, sal_Int64 >( mxIn->getSize() - mxIn->tell(), 0, nSize );
+ sal_uInt16 nChar;
+ *mxStrm >> nChar;
+ sal_Unicode cChar = static_cast< sal_Unicode >( nChar );
+ writeCharItem( rName( "char" ), cChar );
+ return cChar;
+}
+
+OUString InputObjectBase::dumpCharArray( const String& rName, sal_Int32 nLen, rtl_TextEncoding eTextEnc )
+{
+ sal_Int32 nDumpSize = getLimitedValue< sal_Int32, sal_Int64 >( mxStrm->getLength() - mxStrm->tell(), 0, nLen );
OUString aString;
if( nDumpSize > 0 )
{
- ::std::vector< sal_Char > aBuffer( static_cast< sal_Size >( nSize ) + 1 );
- sal_Int32 nCharsRead = mxIn->read( &aBuffer.front(), nSize );
+ ::std::vector< sal_Char > aBuffer( static_cast< sal_Size >( nLen ) + 1 );
+ sal_Int32 nCharsRead = mxStrm->readMemory( &aBuffer.front(), nLen );
aBuffer[ nCharsRead ] = 0;
aString = OStringToOUString( OString( &aBuffer.front() ), eTextEnc );
}
- writeStringItem( pcName, aString );
+ writeStringItem( rName( "text" ), aString );
return aString;
}
-OUString InputObjectBase::dumpUnicodeArray( const sal_Char* pcName, sal_Int32 nSize )
+OUString InputObjectBase::dumpUnicodeArray( const String& rName, sal_Int32 nLen )
{
OUStringBuffer aBuffer;
- for( sal_Int32 nIndex = 0; mxIn->isValidPos() && (nIndex < nSize); ++nIndex )
- aBuffer.append( static_cast< sal_Unicode >( mxIn->readValue< sal_uInt16 >() ) );
+ for( sal_Int32 nIndex = 0; !mxStrm->isEof() && (nIndex < nLen); ++nIndex )
+ aBuffer.append( static_cast< sal_Unicode >( mxStrm->readuInt16() ) );
OUString aString = aBuffer.makeStringAndClear();
- writeStringItem( pcName, aString );
+ writeStringItem( rName( "text" ), aString );
return aString;
}
-double InputObjectBase::dumpRk( const sal_Char* pcName )
+OUString InputObjectBase::dumpNullCharArray( const String& rName, rtl_TextEncoding eTextEnc )
{
- sal_Int32 nRk;
- *mxIn >> nRk;
- return writeRkItem( pcName ? pcName : "rk-value", nRk );
+ OStringBuffer aBuffer;
+ sal_uInt8 nChar;
+ for( *mxStrm >> nChar; !mxStrm->isEof() && (nChar > 0); *mxStrm >> nChar )
+ aBuffer.append( static_cast< sal_Char >( nChar ) );
+ OUString aString = OStringToOUString( aBuffer.makeStringAndClear(), eTextEnc );
+ writeStringItem( rName( "text" ), aString );
+ return aString;
}
-OUString InputObjectBase::dumpGuid( const sal_Char* pcName )
+OUString InputObjectBase::dumpNullUnicodeArray( const String& rName )
+{
+ OUStringBuffer aBuffer;
+ sal_uInt16 nChar;
+ for( *mxStrm >> nChar; !mxStrm->isEof() && (nChar > 0); *mxStrm >> nChar )
+ aBuffer.append( static_cast< sal_Unicode >( nChar ) );
+ OUString aString = aBuffer.makeStringAndClear();
+ writeStringItem( rName( "text" ), aString );
+ return aString;
+}
+
+double InputObjectBase::dumpRk( const String& rName )
+{
+ sal_Int32 nRk;
+ *mxStrm >> nRk;
+ return writeRkItem( rName( "rk-value" ), nRk );
+}
+
+sal_Int32 InputObjectBase::dumpColorABGR( const String& rName )
+{
+ sal_Int32 nColor;
+ *mxStrm >> nColor;
+ writeColorABGRItem( rName( "color" ), nColor );
+ return nColor;
+}
+
+DateTime InputObjectBase::dumpFileTime( const String& rName )
+{
+ DateTime aDateTime;
+
+ ItemGuard aItem( out(), rName( "file-time" ) );
+ sal_Int64 nFileTime = dumpDec< sal_Int64 >( EMPTY_STRING );
+ // file time is in 10^-7 seconds (100 nanoseconds), convert to 1/100 seconds
+ nFileTime /= 100000;
+ // entire days
+ sal_Int64 nDays = nFileTime / sal_Int64( 360000 * 24 );
+ // number of entire years
+ sal_Int64 nYears = (nDays - (nDays / (4 * 365)) + (nDays / (100 * 365)) - (nDays / (400 * 365))) / 365;
+ // remaining days in the year
+ sal_Int64 nDaysInYear = nDays - (nYears * 365 + nYears / 4 - nYears / 100 + nYears / 400);
+ // the year (file dates start from 1601-01-01)
+ aDateTime.Year = static_cast< sal_uInt16 >( 1601 + nYears );
+ // leap year?
+ bool bLeap = ((aDateTime.Year % 4 == 0) && (aDateTime.Year % 100 != 0)) || (aDateTime.Year % 400 == 0);
+ // static arrays with number of days in month
+ static const sal_Int64 spnDaysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ static const sal_Int64 spnDaysInMonthL[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ const sal_Int64* pnDaysInMonth = bLeap ? spnDaysInMonthL : spnDaysInMonth;
+ // the month
+ aDateTime.Month = 1;
+ while( nDaysInYear >= *pnDaysInMonth )
+ {
+ nDaysInYear -= *pnDaysInMonth++;
+ ++aDateTime.Month;
+ }
+ // the day
+ aDateTime.Day = static_cast< sal_uInt16 >( nDaysInYear + 1 );
+ // number of 1/100 seconds in the day
+ sal_Int64 nTimeInDay = nFileTime % sal_Int64( 360000 * 24 );
+ // 1/100 seconds
+ aDateTime.HundredthSeconds = static_cast< sal_uInt16 >( nTimeInDay % 100 );
+ nTimeInDay /= 100;
+ // seconds
+ aDateTime.Seconds = static_cast< sal_uInt16 >( nTimeInDay % 60 );
+ nTimeInDay /= 60;
+ // minutes
+ aDateTime.Minutes = static_cast< sal_uInt16 >( nTimeInDay % 60 );
+ nTimeInDay /= 60;
+ // hours
+ aDateTime.Hours = static_cast< sal_uInt16 >( nTimeInDay );
+
+ writeDateTimeItem( EMPTY_STRING, aDateTime );
+ return aDateTime;
+}
+
+OUString InputObjectBase::dumpGuid( const String& rName )
{
OUStringBuffer aBuffer;
sal_uInt32 nData32;
sal_uInt16 nData16;
sal_uInt8 nData8;
- *mxIn >> nData32;
+ *mxStrm >> nData32;
StringHelper::appendHex( aBuffer, nData32, false );
aBuffer.append( sal_Unicode( '-' ) );
- *mxIn >> nData16;
+ *mxStrm >> nData16;
StringHelper::appendHex( aBuffer, nData16, false );
aBuffer.append( sal_Unicode( '-' ) );
- *mxIn >> nData16;
+ *mxStrm >> nData16;
StringHelper::appendHex( aBuffer, nData16, false );
aBuffer.append( sal_Unicode( '-' ) );
- *mxIn >> nData8;
+ *mxStrm >> nData8;
StringHelper::appendHex( aBuffer, nData8, false );
- *mxIn >> nData8;
+ *mxStrm >> nData8;
StringHelper::appendHex( aBuffer, nData8, false );
aBuffer.append( sal_Unicode( '-' ) );
for( int nIndex = 0; nIndex < 6; ++nIndex )
{
- *mxIn >> nData8;
+ *mxStrm >> nData8;
StringHelper::appendHex( aBuffer, nData8, false );
}
+ StringHelper::enclose( aBuffer, '{', '}' );
OUString aGuid = aBuffer.makeStringAndClear();
- writeGuidItem( pcName ? pcName : "guid", aGuid );
+ writeGuidItem( rName( "guid" ), aGuid );
return aGuid;
}
@@ -2641,70 +2766,100 @@ void InputObjectBase::dumpItem( const ItemFormat& rItemFmt )
}
// ============================================================================
+// ============================================================================
-InputStreamObject::InputStreamObject( const ObjectBase& rParent, const OUString& rOutFileName, BinaryInputStreamRef xStrm )
+BinaryStreamObject::BinaryStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const OUString& rSysFileName )
{
- construct( rParent, rOutFileName, xStrm );
+ InputObjectBase::construct( rParent, rxStrm, rSysFileName );
}
-InputStreamObject::~InputStreamObject()
+BinaryStreamObject::BinaryStreamObject( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm )
{
+ InputObjectBase::construct( rParent, rxStrm );
}
-void InputStreamObject::construct( const ObjectBase& rParent, const OUString& rOutFileName, BinaryInputStreamRef xStrm )
+void BinaryStreamObject::dumpBinaryStream( bool bShowOffset )
{
- mxStrm = xStrm;
- if( mxStrm.get() )
- InputObjectBase::construct( rParent, rOutFileName, InputRef( new BinaryInput( *mxStrm ) ) );
+ in().seek( 0 );
+ dumpRawBinary( in().getLength(), bShowOffset, true );
+ out().emptyLine();
}
-sal_Int64 InputStreamObject::getStreamSize() const
+void BinaryStreamObject::implDump()
{
- return mxStrm.get() ? mxStrm->getLength() : -1;
+ dumpBinaryStream();
}
-void InputStreamObject::dumpBinaryStream( bool bShowOffset )
+// ============================================================================
+
+namespace {
+
+bool lclIsEof( BinaryInputStream& rStrm )
{
- in().seek( 0 );
- dumpRawBinary( getLimitedValue< sal_Int32, sal_Int64 >( in().getSize(), 0, SAL_MAX_INT32 ), bShowOffset, true );
- out().emptyLine();
+ return rStrm.isEof() || (rStrm.isSeekable() && (rStrm.tell() >= rStrm.getLength()));
}
-bool InputStreamObject::implIsValid() const
+template< typename BufferType, typename CharType >
+CharType lclAppendChar( BufferType& orBuffer, CharType cChar )
{
- return mxStrm.get() && mxStrm->is() && InputObjectBase::implIsValid();
+ if( (cChar == 0x0A) || (cChar == 0x0D) )
+ return cChar;
+ orBuffer.append( cChar );
+ return 0;
}
-void InputStreamObject::implDump()
+template< typename BufferType, typename CharType, typename StreamDataType >
+bool lclReadLine( BufferType& orBuffer, sal_Unicode& orcNextLineChar, BinaryInputStream& rStrm )
{
- dumpBinaryStream();
+ CharType cLineEndChar = (orcNextLineChar == 0) ? 0 : lclAppendChar( orBuffer, static_cast< CharType >( orcNextLineChar ) );
+ orcNextLineChar = 0;
+
+ // read chars until EOF or line end character (LF or CR)
+ bool bIsEof = lclIsEof( rStrm );
+ while( !bIsEof && (cLineEndChar == 0) )
+ {
+ CharType cChar = static_cast< CharType >( rStrm.readValue< StreamDataType >() );
+ bIsEof = rStrm.isEof();
+ cLineEndChar = bIsEof ? 0 : lclAppendChar( orBuffer, cChar );
+ }
+
+ // try to skip LF following CR, or CR following LF
+ if( !lclIsEof( rStrm ) && (cLineEndChar != 0) )
+ {
+ CharType cChar = static_cast< CharType >( rStrm.readValue< StreamDataType >() );
+ bool bLineEnd = ((cChar == 0x0A) || (cChar == 0x0D)) && (cChar != cLineEndChar);
+ if( !rStrm.isEof() && !bLineEnd )
+ orcNextLineChar = static_cast< sal_Unicode >( cChar );
+ }
+
+ return (cLineEndChar != 0) || (orBuffer.getLength() > 0);
}
-// ============================================================================
-// ============================================================================
+} // namespace
+
+// ----------------------------------------------------------------------------
TextStreamObject::TextStreamObject( const ObjectBase& rParent,
- const OUString& rOutFileName, BinaryInputStreamRef xStrm, rtl_TextEncoding eTextEnc ) :
- InputStreamObject( rParent, rOutFileName, xStrm ),
+ const BinaryInputStreamRef& rxStrm, rtl_TextEncoding eTextEnc, const OUString& rSysFileName ) :
meTextEnc( eTextEnc )
{
+ InputObjectBase::construct( rParent, rxStrm, rSysFileName );
+}
+
+TextStreamObject::TextStreamObject( const OutputObjectBase& rParent,
+ const BinaryInputStreamRef& rxStrm, rtl_TextEncoding eTextEnc ) :
+ meTextEnc( eTextEnc )
+{
+ InputObjectBase::construct( rParent, rxStrm );
}
void TextStreamObject::implDump()
{
- const sal_Char* pcTextEnc = rtl_getBestMimeCharsetFromTextEncoding( meTextEnc );
- OUString aEncoding = OUString::createFromAscii( pcTextEnc ? pcTextEnc : "UTF-8" );
- Reference< XTextInputStream > xTextStrm = InputOutputHelper::openTextInputStream( getStream().getXInputStream(), aEncoding );
- if( xTextStrm.is() ) try
- {
- sal_uInt32 nLine = 0;
- while( !xTextStrm->isEOF() )
- implDumpLine( xTextStrm->readLine(), ++nLine );
- }
- catch( Exception& )
- {
- writeInfoItem( "stream-state", OOX_DUMP_ERR_STREAM );
- }
+ OUString aLine;
+ sal_Unicode cNextLineChar = 0;
+ sal_uInt32 nLine = 0;
+ while( readLine( aLine, cNextLineChar ) )
+ implDumpLine( aLine, ++nLine );
out().emptyLine();
}
@@ -2718,10 +2873,35 @@ void TextStreamObject::implDumpLine( const OUString& rLine, sal_uInt32 nLine )
rOut.newLine();
}
+bool TextStreamObject::readCharLine( OUString& orLine, sal_Unicode& orcNextLineChar )
+{
+ OStringBuffer aBuffer;
+ bool bHasData = lclReadLine< OStringBuffer, sal_Char, sal_uInt8 >( aBuffer, orcNextLineChar, in() );
+ if( bHasData )
+ orLine = OStringToOUString( aBuffer.makeStringAndClear(), meTextEnc );
+ return bHasData;
+}
+
+bool TextStreamObject::readUcs2Line( OUString& orLine, sal_Unicode& orcNextLineChar )
+{
+ OUStringBuffer aBuffer;
+ bool bHasData = lclReadLine< OUStringBuffer, sal_Unicode, sal_uInt16 >( aBuffer, orcNextLineChar, in() );
+ if( bHasData )
+ orLine = aBuffer.makeStringAndClear();
+ return bHasData;
+}
+
+bool TextStreamObject::readLine( OUString& orLine, sal_Unicode& orcNextLineChar )
+{
+ return (meTextEnc == RTL_TEXTENCODING_UCS2) ?
+ readUcs2Line( orLine, orcNextLineChar ) :
+ readCharLine( orLine, orcNextLineChar );
+}
+
// ============================================================================
-XmlStreamObject::XmlStreamObject( const ObjectBase& rParent, const OUString& rOutFileName, BinaryInputStreamRef xStrm ) :
- TextStreamObject( rParent, rOutFileName, xStrm, RTL_TEXTENCODING_UTF8 )
+XmlStreamObject::XmlStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const OUString& rSysFileName ) :
+ TextStreamObject( rParent, rxStrm, RTL_TEXTENCODING_UTF8, rSysFileName )
{
}
@@ -2832,60 +3012,164 @@ void XmlStreamObject::implDumpLine( const OUString& rLine, sal_uInt32 )
// ============================================================================
// ============================================================================
-RecordHeaderImplBase::~RecordHeaderImplBase()
+void RecordObjectBase::construct( const ObjectBase& rParent,
+ const BinaryInputStreamRef& rxBaseStrm, const OUString& rSysFileName,
+ const BinaryInputStreamRef& rxRecStrm, const String& rRecNames, const String& rSimpleRecs )
+{
+ InputObjectBase::construct( rParent, rxRecStrm, rSysFileName );
+ constructRecObjBase( rxBaseStrm, rRecNames, rSimpleRecs );
+}
+
+void RecordObjectBase::construct( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxBaseStrm,
+ const BinaryInputStreamRef& rxRecStrm, const String& rRecNames, const String& rSimpleRecs )
+{
+ InputObjectBase::construct( rParent, rxRecStrm );
+ constructRecObjBase( rxBaseStrm, rRecNames, rSimpleRecs );
+}
+
+bool RecordObjectBase::implIsValid() const
{
+ return mxBaseStrm.get() && InputObjectBase::implIsValid();
}
-void RecordHeaderImplBase::construct( const InputObjectBase& rParent, const RecordHeaderConfigInfo& rCfgInfo )
+void RecordObjectBase::implDump()
{
- InputObjectBase::construct( rParent );
- if( InputObjectBase::implIsValid() )
+ NameListRef xRecNames = getRecNames();
+
+ typedef ::std::map< sal_Int64, ItemFormat > ItemFormatMap;
+ ItemFormatMap aSimpleRecs;
+ if( NameListBase* pSimpleRecs = maSimpleRecs.getNameList( cfg() ).get() )
+ for( NameListBase::const_iterator aIt = pSimpleRecs->begin(), aEnd = pSimpleRecs->end(); aIt != aEnd; ++aIt )
+ aSimpleRecs[ aIt->first ].parse( aIt->second );
+
+ while( implStartRecord( *mxBaseStrm, mnRecPos, mnRecId, mnRecSize ) )
{
- const Config& rCfg = cfg();
- mpcTitle = rCfgInfo.mpcTitle;
- mxRecNames = rCfg.getNameList( rCfgInfo.mpcRecNames );
- mbShowRecPos = rCfg.getBoolOption( rCfgInfo.mpcShowRecPos, true );
- mbShowRecSize = rCfg.getBoolOption( rCfgInfo.mpcShowRecSize, true );
- mbShowRecId = rCfg.getBoolOption( rCfgInfo.mpcShowRecId, true );
- mbShowRecName = rCfg.getBoolOption( rCfgInfo.mpcShowRecName, true );
- mbShowRecBody = rCfg.getBoolOption( rCfgInfo.mpcShowRecBody, true );
+ // record header
+ out().emptyLine();
+ writeHeader();
+ implWriteExtHeader();
+ IndentGuard aIndGuard( out() );
+ sal_Int64 nRecPos = in().tell();
+
+ // record body
+ if( cfg().hasName( xRecNames, mnRecId ) )
+ {
+ ItemFormatMap::const_iterator aIt = aSimpleRecs.find( mnRecId );
+ if( aIt != aSimpleRecs.end() )
+ dumpItem( aIt->second );
+ else
+ implDumpRecordBody();
+ }
+
+ // remaining undumped data
+ else if( !in().isEof() && (in().tell() == nRecPos) )
+ dumpRawBinary( mnRecSize, false );
+ else
+ dumpRemainingTo( nRecPos + mnRecSize );
}
}
-bool RecordHeaderImplBase::implIsValid() const
+void RecordObjectBase::implWriteExtHeader()
{
- return isValid( mxRecNames ) && InputObjectBase::implIsValid();
}
-// ============================================================================
+void RecordObjectBase::implDumpRecordBody()
+{
+}
+
+void RecordObjectBase::constructRecObjBase( const BinaryInputStreamRef& rxBaseStrm, const String& rRecNames, const String& rSimpleRecs )
+{
+ mxBaseStrm = rxBaseStrm;
+ maRecNames = rRecNames;
+ maSimpleRecs = rSimpleRecs;
+ mnRecPos = mnRecId = mnRecSize = 0;
+}
+
+void RecordObjectBase::writeHeader()
+{
+ MultiItemsGuard aMultiGuard( out() );
+ writeEmptyItem( "REC" );
+ if( mxBaseStrm->isSeekable() )
+ writeShortHexItem( "pos", mnRecPos, "CONV-DEC" );
+ writeShortHexItem( "size", mnRecSize, "CONV-DEC" );
+ ItemGuard aItem( out(), "id" );
+ out().writeShortHex( mnRecId );
+ addNameToItem( mnRecId, "CONV-DEC" );
+ addNameToItem( mnRecId, maRecNames );
+}
+
// ============================================================================
-DumperBase::~DumperBase()
+void SequenceRecordObjectBase::construct(
+ const ObjectBase& rParent, const BinaryInputStreamRef& rxBaseStrm, const ::rtl::OUString& rSysFileName,
+ const BinaryInputStreamRef& rxRecStrm, const String& rRecNames, const String& rSimpleRecs )
{
+ RecordObjectBase::construct( rParent, rxBaseStrm, rSysFileName, rxRecStrm, rRecNames, rSimpleRecs );
}
-bool DumperBase::isImportEnabled() const
+void SequenceRecordObjectBase::construct( const OutputObjectBase& rParent,
+ const BinaryInputStreamRef& rxBaseStrm, const BinaryInputStreamRef& rxRecStrm,
+ const String& rRecNames, const String& rSimpleRecs )
{
- return !isValid() || cfg().isImportEnabled();
+ RecordObjectBase::construct( rParent, rxBaseStrm, rxRecStrm, rRecNames, rSimpleRecs );
}
-StorageRef DumperBase::getRootStorage() const
+void SequenceRecordObjectBase::construct( const ObjectBase& rParent,
+ const BinaryInputStreamRef& rxBaseStrm, const ::rtl::OUString& rSysFileName,
+ const String& rRecNames, const String& rSimpleRecs )
{
- return getFilter().getStorage();
+ BinaryInputStreamRef xRecStrm( new SequenceInputStream( *mxRecData ) );
+ RecordObjectBase::construct( rParent, rxBaseStrm, rSysFileName, xRecStrm, rRecNames, rSimpleRecs );
}
-BinaryInputStreamRef DumperBase::getRootStream() const
+void SequenceRecordObjectBase::construct( const OutputObjectBase& rParent,
+ const BinaryInputStreamRef& rxBaseStrm, const String& rRecNames, const String& rSimpleRecs )
{
- BinaryInputStreamRef xStrm;
- if( StorageBase* pStrg = getRootStorage().get() )
- xStrm.reset( new BinaryInputStream( pStrg->openInputStream( OUString() ), false ) );
- return xStrm;
+ BinaryInputStreamRef xRecStrm( new SequenceInputStream( *mxRecData ) );
+ RecordObjectBase::construct( rParent, rxBaseStrm, xRecStrm, rRecNames, rSimpleRecs );
+}
+
+bool SequenceRecordObjectBase::implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize )
+{
+ bool bValid = true;
+ if( rBaseStrm.isSeekable() )
+ {
+ ornRecPos = rBaseStrm.tell();
+ // do not try to overread seekable streams, may cause assertions
+ bValid = ornRecPos < rBaseStrm.getLength();
+ }
+
+ // read the record header
+ if( bValid )
+ bValid = implReadRecordHeader( rBaseStrm, ornRecId, ornRecSize ) && !rBaseStrm.isEof() && (0 <= ornRecSize) && (ornRecSize <= 0x00100000);
+
+ // read record contents into data sequence
+ if( bValid )
+ {
+ sal_Int32 nRecSize = static_cast< sal_Int32 >( ornRecSize );
+ mxRecData->realloc( nRecSize );
+ bValid = (nRecSize == 0) || (rBaseStrm.readData( *mxRecData, nRecSize ) == nRecSize);
+ in().seekToStart();
+ }
+ return bValid;
+}
+
+// ============================================================================
+// ============================================================================
+
+DumperBase::~DumperBase()
+{
+}
+
+bool DumperBase::isImportEnabled() const
+{
+ return !isValid() || cfg().isImportEnabled();
}
-void DumperBase::construct( const FilterBase& rFilter, ConfigRef xConfig )
+void DumperBase::construct( const ConfigRef& rxConfig )
{
- if( rFilter.isImportFilter() && isValid( xConfig ) && xConfig->isDumperEnabled() )
- ObjectBase::construct( rFilter, xConfig );
+ if( isValid( rxConfig ) && rxConfig->isDumperEnabled() )
+ ObjectBase::construct( rxConfig );
}
// ============================================================================