summaryrefslogtreecommitdiff
path: root/oox/source/ole
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source/ole')
-rwxr-xr-xoox/source/ole/axbinaryreader.cxx216
-rw-r--r--oox/source/ole/axcontrol.cxx228
-rw-r--r--oox/source/ole/axcontrolfragment.cxx32
-rw-r--r--oox/source/ole/axcontrolhelper.cxx4
-rw-r--r--oox/source/ole/makefile.mk1
-rw-r--r--oox/source/ole/olehelper.cxx1
6 files changed, 442 insertions, 40 deletions
diff --git a/oox/source/ole/axbinaryreader.cxx b/oox/source/ole/axbinaryreader.cxx
new file mode 100755
index 000000000000..b0512b276ac4
--- /dev/null
+++ b/oox/source/ole/axbinaryreader.cxx
@@ -0,0 +1,216 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: axbinaryreader.cxx,v $
+ * $Revision: 1.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "oox/ole/axbinaryreader.hxx"
+#include "oox/ole/olehelper.hxx"
+
+using ::rtl::OUString;
+
+namespace oox {
+namespace ole {
+
+// ============================================================================
+
+namespace {
+
+const sal_uInt32 AX_STRING_SIZEMASK = 0x7FFFFFFF;
+const sal_uInt32 AX_STRING_COMPRESSED = 0x80000000;
+
+} // namespace
+
+// ============================================================================
+
+AxAlignedInputStream::AxAlignedInputStream( BinaryInputStream& rInStrm ) :
+ mrInStrm( rInStrm ),
+ mnStrmPos( 0 )
+{
+}
+
+sal_Int64 AxAlignedInputStream::tell() const
+{
+ return mnStrmPos;
+}
+
+void AxAlignedInputStream::seek( sal_Int64 nPos )
+{
+ mbEof = mbEof || (nPos < mnStrmPos);
+ if( !mbEof )
+ skip( static_cast< sal_Int32 >( nPos - mnStrmPos ) );
+}
+
+sal_Int32 AxAlignedInputStream::readData( StreamDataSequence& orData, sal_Int32 nBytes )
+{
+ sal_Int32 nReadSize = mrInStrm.readData( orData, nBytes );
+ mnStrmPos += nReadSize;
+ return nReadSize;
+}
+
+sal_Int32 AxAlignedInputStream::readMemory( void* opMem, sal_Int32 nBytes )
+{
+ sal_Int32 nReadSize = mrInStrm.readMemory( opMem, nBytes );
+ mnStrmPos += nReadSize;
+ return nReadSize;
+}
+
+void AxAlignedInputStream::skip( sal_Int32 nBytes )
+{
+ mrInStrm.skip( nBytes );
+ mnStrmPos += nBytes;
+}
+
+void AxAlignedInputStream::align( size_t nSize )
+{
+ skip( static_cast< sal_Int32 >( (nSize - (mnStrmPos % nSize)) % nSize ) );
+}
+
+// ============================================================================
+
+AxBinaryPropertyReader::ComplexProperty::~ComplexProperty()
+{
+}
+
+bool AxBinaryPropertyReader::PairProperty::readProperty( AxAlignedInputStream& rInStrm )
+{
+ rInStrm >> mrnValue1 >> mrnValue2;
+ return true;
+}
+
+bool AxBinaryPropertyReader::StringProperty::readProperty( AxAlignedInputStream& rInStrm )
+{
+ bool bCompressed = getFlag( mnSize, AX_STRING_COMPRESSED );
+ sal_uInt32 nBufSize = mnSize & AX_STRING_SIZEMASK;
+ sal_Int64 nEndPos = rInStrm.tell() + nBufSize;
+ sal_Int32 nChars = static_cast< sal_Int32 >( nBufSize / (bCompressed ? 1 : 2) );
+ bool bValidChars = nChars <= 65536;
+ OSL_ENSURE( bValidChars, "StringProperty::readProperty - string too long" );
+ nChars = ::std::min< sal_Int32 >( nChars, 65536 );
+ mrValue = bCompressed ?
+ // ISO-8859-1 maps all byte values xx to the same Unicode code point U+00xx
+ rInStrm.readCharArrayUC( nChars, RTL_TEXTENCODING_ISO_8859_1 ) :
+ rInStrm.readUnicodeArray( nChars );
+ rInStrm.seek( nEndPos );
+ return bValidChars;
+}
+
+bool AxBinaryPropertyReader::PictureProperty::readProperty( AxAlignedInputStream& rInStrm )
+{
+ return OleHelper::importStdPic( mrPicData, rInStrm, true );
+}
+
+// ----------------------------------------------------------------------------
+
+AxBinaryPropertyReader::AxBinaryPropertyReader( BinaryInputStream& rInStrm, bool b64BitPropFlags ) :
+ maInStrm( rInStrm ),
+ mbValid( true )
+{
+ // version and size of property block
+ maInStrm.skip( 2 );
+ sal_uInt16 nBlockSize = maInStrm.readValue< sal_uInt16 >();
+ mnPropsEnd = maInStrm.tell() + nBlockSize;
+ // flagfield containing existing properties
+ if( b64BitPropFlags )
+ maInStrm >> mnPropFlags;
+ else
+ mnPropFlags = maInStrm.readuInt32();
+ mnNextProp = 1;
+}
+
+void AxBinaryPropertyReader::readBoolProperty( bool& orbValue, bool bReverse )
+{
+ // there is no data, the boolean value is equivalent to the property flag itself
+ orbValue = startNextProperty() != bReverse;
+}
+
+void AxBinaryPropertyReader::readPairProperty( sal_Int32& ornValue1, sal_Int32& ornValue2 )
+{
+ if( startNextProperty() )
+ maLargeProps.push_back( ComplexPropVector::value_type( new PairProperty( ornValue1, ornValue2 ) ) );
+}
+
+void AxBinaryPropertyReader::readStringProperty( OUString& orValue )
+{
+ if( startNextProperty() )
+ {
+ sal_uInt32 nSize = maInStrm.readAligned< sal_uInt32 >();
+ maLargeProps.push_back( ComplexPropVector::value_type( new StringProperty( orValue, nSize ) ) );
+ }
+}
+
+void AxBinaryPropertyReader::readPictureProperty( StreamDataSequence& orPicData )
+{
+ if( startNextProperty() )
+ {
+ sal_Int16 nData = maInStrm.readAligned< sal_Int16 >();
+ if( ensureValid( nData == -1 ) )
+ maStreamProps.push_back( ComplexPropVector::value_type( new PictureProperty( orPicData ) ) );
+ }
+}
+
+bool AxBinaryPropertyReader::finalizeImport()
+{
+ // read large properties
+ maInStrm.align( 4 );
+ if( ensureValid( mnPropFlags == 0 ) && !maLargeProps.empty() )
+ {
+ for( ComplexPropVector::iterator aIt = maLargeProps.begin(), aEnd = maLargeProps.end(); ensureValid() && (aIt != aEnd); ++aIt )
+ {
+ ensureValid( (*aIt)->readProperty( maInStrm ) );
+ maInStrm.align( 4 );
+ }
+ }
+ maInStrm.seek( mnPropsEnd );
+
+ // read stream properties (no stream alignment between properties!)
+ if( ensureValid() && !maStreamProps.empty() )
+ for( ComplexPropVector::iterator aIt = maStreamProps.begin(), aEnd = maStreamProps.end(); ensureValid() && (aIt != aEnd); ++aIt )
+ ensureValid( (*aIt)->readProperty( maInStrm ) );
+
+ return mbValid;
+}
+
+bool AxBinaryPropertyReader::ensureValid( bool bCondition )
+{
+ mbValid = mbValid && bCondition && !maInStrm.isEof();
+ return mbValid;
+}
+
+bool AxBinaryPropertyReader::startNextProperty()
+{
+ bool bHasProp = getFlag( mnPropFlags, mnNextProp );
+ setFlag( mnPropFlags, mnNextProp, false );
+ mnNextProp <<= 1;
+ return ensureValid() && bHasProp;
+}
+
+// ============================================================================
+
+} // namespace ole
+} // namespace oox
+
diff --git a/oox/source/ole/axcontrol.cxx b/oox/source/ole/axcontrol.cxx
index 2495305d1c35..3247e03571fb 100644
--- a/oox/source/ole/axcontrol.cxx
+++ b/oox/source/ole/axcontrol.cxx
@@ -52,6 +52,7 @@
#include "oox/helper/propertymap.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/core/filterbase.hxx"
+#include "oox/ole/axbinaryreader.hxx"
#include "oox/ole/axcontrolhelper.hxx"
#include "oox/ole/olehelper.hxx"
@@ -254,25 +255,20 @@ void lclConvertVisualEffect( AxControlHelper& /*rHelper*/, PropertyMap& rPropMap
// ----------------------------------------------------------------------------
-/** Converts the AX picture to UNO properties. */
+/** Converts the passed picture stream to UNO properties. */
void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData )
{
if( rPicData.hasElements() )
{
- SequenceInputStream aInStrm( rPicData );
- StreamDataSequence aPictureData;
- if( OleHelper::importStdPic( aPictureData, aInStrm, true ) )
- {
- OUString aGraphicUrl = rHelper.getFilter().getGraphicHelper().importGraphicObject( aPictureData );
- if( aGraphicUrl.getLength() > 0 )
- rPropMap.setProperty( PROP_ImageURL, aGraphicUrl );
- }
+ OUString aGraphicUrl = rHelper.getFilter().getGraphicHelper().importGraphicObject( rPicData );
+ if( aGraphicUrl.getLength() > 0 )
+ rPropMap.setProperty( PROP_ImageURL, aGraphicUrl );
}
}
// ----------------------------------------------------------------------------
-/** Converts the AX picture and position to UNO properties. */
+/** Converts the passed picture stream and position to UNO properties. */
void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos )
{
// the picture
@@ -303,7 +299,7 @@ void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const S
// ----------------------------------------------------------------------------
-/** Converts the AX picture and position to UNO properties. */
+/** Converts the passed picture stream and position to UNO properties. */
void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ )
{
// the picture
@@ -392,7 +388,11 @@ void AxControlModelBase::importProperty( sal_Int32 nPropId, const OUString& rVal
}
}
-void AxControlModelBase::importPictureData( sal_Int32 /*nPropId*/, const StreamDataSequence& /*rDataSeq*/ )
+void AxControlModelBase::importBinaryModel( BinaryInputStream& /*rInStrm*/ )
+{
+}
+
+void AxControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ )
{
}
@@ -423,6 +423,20 @@ void AxFontDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue
}
}
+void AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.readStringProperty( maFontName );
+ aReader.readIntProperty< sal_uInt32 >( mnFontEffects );
+ aReader.readIntProperty< sal_Int32 >( mnFontHeight );
+ aReader.skipIntProperty< sal_Int32 >(); // font offset
+ aReader.readIntProperty< sal_uInt8 >( mnFontCharSet );
+ aReader.skipIntProperty< sal_uInt8 >(); // font pitch/family
+ aReader.readIntProperty< sal_uInt8 >( mnHorAlign );
+ aReader.skipIntProperty< sal_uInt16 >(); // font weight
+ aReader.finalizeImport();
+}
+
void AxFontDataModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const
{
namespace cssa = ::com::sun::star::awt;
@@ -491,15 +505,33 @@ void AxCommandButtonModel::importProperty( sal_Int32 nPropId, const OUString& rV
}
}
-void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, const StreamDataSequence& rDataSeq )
+void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
{
switch( nPropId )
{
- case XML_Picture: maPictureData = rDataSeq; break;
- default: AxFontDataModel::importPictureData( nPropId, rDataSeq );
+ case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break;
+ default: AxFontDataModel::importPictureData( nPropId, rInStrm );
}
}
+void AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.readIntProperty< sal_uInt32 >( mnTextColor );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.readStringProperty( maCaption );
+ aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.readPictureProperty( maPictureData );
+ aReader.skipIntProperty< sal_uInt16 >(); // accelerator
+ aReader.readBoolProperty( mbFocusOnClick, true ); // binary flag means "do not take focus"
+ aReader.skipPictureProperty(); // mouse icon
+ if( aReader.finalizeImport() )
+ AxFontDataModel::importBinaryModel( rInStrm );
+}
+
OUString AxCommandButtonModel::getServiceName() const
{
return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" );
@@ -545,6 +577,26 @@ void AxLabelModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
}
}
+void AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.readIntProperty< sal_uInt32 >( mnTextColor );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.readStringProperty( maCaption );
+ aReader.skipIntProperty< sal_uInt32 >(); // picture position
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
+ aReader.readIntProperty< sal_uInt16 >( mnBorderStyle );
+ aReader.readIntProperty< sal_uInt16 >( mnSpecialEffect );
+ aReader.skipPictureProperty(); // picture
+ aReader.skipIntProperty< sal_uInt16 >(); // accelerator
+ aReader.skipPictureProperty(); // mouse icon
+ if( aReader.finalizeImport() )
+ AxFontDataModel::importBinaryModel( rInStrm );
+}
+
OUString AxLabelModel::getServiceName() const
{
return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" );
@@ -592,15 +644,36 @@ void AxImageModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
}
}
-void AxImageModel::importPictureData( sal_Int32 nPropId, const StreamDataSequence& rDataSeq )
+void AxImageModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
{
switch( nPropId )
{
- case XML_Picture: maPictureData = rDataSeq; break;
- default: AxControlModelBase::importPictureData( nPropId, rDataSeq );
+ case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break;
+ default: AxControlModelBase::importPictureData( nPropId, rInStrm );
}
}
+void AxImageModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.skipUndefinedProperty();
+ aReader.skipUndefinedProperty();
+ aReader.skipBoolProperty(); // auto-size
+ aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode );
+ aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect );
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.readPictureProperty( maPictureData );
+ aReader.readIntProperty< sal_uInt8 >( mnPicAlign );
+ aReader.readBoolProperty( mbPicTiling );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.skipPictureProperty(); // mouse icon
+ aReader.finalizeImport();
+}
+
OUString AxImageModel::getServiceName() const
{
return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" );
@@ -662,15 +735,55 @@ void AxMorphDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue
}
}
-void AxMorphDataModel::importPictureData( sal_Int32 nPropId, const StreamDataSequence& rDataSeq )
+void AxMorphDataModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
{
switch( nPropId )
{
- case XML_Picture: maPictureData = rDataSeq; break;
- default: AxFontDataModel::importPictureData( nPropId, rDataSeq );
+ case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break;
+ default: AxFontDataModel::importPictureData( nPropId, rInStrm );
}
}
+void AxMorphDataModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm, true );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt32 >( mnTextColor );
+ aReader.readIntProperty< sal_Int32 >( mnMaxLength );
+ aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
+ aReader.readIntProperty< sal_uInt8 >( mnScrollBars );
+ aReader.readIntProperty< sal_uInt8 >( mnDisplayStyle );
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.readIntProperty< sal_uInt16 >( mnPasswordChar );
+ aReader.skipIntProperty< sal_uInt32 >(); // list width
+ aReader.skipIntProperty< sal_uInt16 >(); // bound column
+ aReader.skipIntProperty< sal_Int16 >(); // text column
+ aReader.skipIntProperty< sal_Int16 >(); // column count
+ aReader.readIntProperty< sal_uInt16 >( mnListRows );
+ aReader.skipIntProperty< sal_uInt16 >(); // column info count
+ aReader.readIntProperty< sal_uInt8 >( mnMatchEntry );
+ aReader.skipIntProperty< sal_uInt8 >(); // list style
+ aReader.readIntProperty< sal_uInt8 >( mnShowDropButton );
+ aReader.skipUndefinedProperty();
+ aReader.skipIntProperty< sal_uInt8 >(); // drop down style
+ aReader.readIntProperty< sal_uInt8 >( mnMultiSelect );
+ aReader.readStringProperty( maValue );
+ aReader.readStringProperty( maCaption );
+ aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
+ aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
+ aReader.readIntProperty< sal_uInt32 >( mnSpecialEffect );
+ aReader.skipPictureProperty(); // mouse icon
+ aReader.readPictureProperty( maPictureData );
+ aReader.skipIntProperty< sal_uInt16 >(); // accelerator
+ aReader.skipUndefinedProperty();
+ aReader.skipBoolProperty();
+ aReader.readStringProperty( maGroupName );
+ if( aReader.finalizeImport() )
+ AxFontDataModel::importBinaryModel( rInStrm );
+}
+
void AxMorphDataModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const
{
rPropMap.setProperty( PROP_TextColor, rHelper.convertColor( mnTextColor ) );
@@ -865,6 +978,27 @@ void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValu
}
}
+void AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.skipIntProperty< sal_uInt32 >(); // unused
+ aReader.readIntProperty< sal_Int32 >( mnMin );
+ aReader.readIntProperty< sal_Int32 >( mnMax );
+ aReader.readIntProperty< sal_Int32 >( mnPosition );
+ aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
+ aReader.skipIntProperty< sal_uInt32 >(); // next enabled
+ aReader.readIntProperty< sal_Int32 >( mnSmallChange );
+ aReader.readIntProperty< sal_Int32 >( mnOrientation );
+ aReader.readIntProperty< sal_Int32 >( mnDelay );
+ aReader.skipPictureProperty(); // mouse icon
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.finalizeImport();
+}
+
void AxSpinButtonModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const
{
sal_Int32 nMin = ::std::min( mnMin, mnMax );
@@ -924,6 +1058,29 @@ void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue
}
}
+void AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ AxBinaryPropertyReader aReader( rInStrm );
+ aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
+ aReader.readIntProperty< sal_uInt32 >( mnBackColor );
+ aReader.readIntProperty< sal_uInt32 >( mnFlags );
+ aReader.readPairProperty( mnWidth, mnHeight );
+ aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
+ aReader.readIntProperty< sal_Int32 >( mnMin );
+ aReader.readIntProperty< sal_Int32 >( mnMax );
+ aReader.readIntProperty< sal_Int32 >( mnPosition );
+ aReader.skipIntProperty< sal_uInt32 >(); // unused
+ aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
+ aReader.skipIntProperty< sal_uInt32 >(); // next enabled
+ aReader.readIntProperty< sal_Int32 >( mnSmallChange );
+ aReader.readIntProperty< sal_Int32 >( mnLargeChange );
+ aReader.readIntProperty< sal_Int32 >( mnOrientation );
+ aReader.readIntProperty< sal_Int16 >( mnPropThumb );
+ aReader.readIntProperty< sal_Int32 >( mnDelay );
+ aReader.skipPictureProperty(); // mouse icon
+ aReader.finalizeImport();
+}
+
void AxScrollBarModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const
{
sal_Int32 nMin = ::std::min( mnMin, mnMax );
@@ -962,27 +1119,28 @@ AxControl::~AxControl()
AxControlModelBase* AxControl::createModel( const OUString& rClassId )
{
// TODO: move into a factory
- if( rClassId.equalsIgnoreAsciiCaseAscii( "{D7053240-CE69-11CD-A777-00DD01143C57}" ) ) // Forms.CommandButton.1
+ maClassId = rClassId.toAsciiUpperCase();
+ if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{D7053240-CE69-11CD-A777-00DD01143C57}" ) ) ) // Forms.CommandButton.1
mxModel.reset( new AxCommandButtonModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{978C9E23-D4B0-11CE-BF2D-00AA003F40D0}" ) ) // Forms.Label.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{978C9E23-D4B0-11CE-BF2D-00AA003F40D0}" ) ) ) // Forms.Label.1
mxModel.reset( new AxLabelModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{4C599241-6926-101B-9992-00000B65C6F9}" ) ) // Forms.Image.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{4C599241-6926-101B-9992-00000B65C6F9}" ) ) ) // Forms.Image.1
mxModel.reset( new AxImageModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D60-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.ToggleButton.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D60-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ToggleButton.1
mxModel.reset( new AxToggleButtonModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.CheckBox.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.CheckBox.1
mxModel.reset( new AxCheckBoxModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D50-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.OptionButton.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D50-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.OptionButton.1
mxModel.reset( new AxOptionButtonModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D10-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.TextBox.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D10-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.TextBox.1
mxModel.reset( new AxTextBoxModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D20-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.ListBox.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D20-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ListBox.1
mxModel.reset( new AxListBoxModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{8BD21D30-EC42-11CE-9E0D-00AA006002F3}" ) ) // Forms.ComboBox.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D30-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ComboBox.1
mxModel.reset( new AxComboBoxModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{79176FB0-B7F2-11CE-97EF-00AA006D2776}" ) ) // Forms.SpinButton.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{79176FB0-B7F2-11CE-97EF-00AA006D2776}" ) ) ) // Forms.SpinButton.1
mxModel.reset( new AxSpinButtonModel );
- else if( rClassId.equalsIgnoreAsciiCaseAscii( "{DFD181E0-5E2F-11CE-A449-00AA004A803D}" ) ) // Forms.ScrollBar.1
+ else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{DFD181E0-5E2F-11CE-A449-00AA004A803D}" ) ) ) // Forms.ScrollBar.1
mxModel.reset( new AxScrollBarModel );
else
mxModel.reset();
@@ -990,6 +1148,12 @@ AxControlModelBase* AxControl::createModel( const OUString& rClassId )
return mxModel.get();
}
+void AxControl::importBinaryModel( BinaryInputStream& rInStrm )
+{
+ if( AxControlModelBase* pModel = createModel( OleHelper::importGuid( rInStrm ) ) )
+ pModel->importBinaryModel( rInStrm );
+}
+
Reference< XControlModel > AxControl::convertAndInsert( AxControlHelper& rHelper ) const
{
Reference< XControlModel > xCtrlModel;
diff --git a/oox/source/ole/axcontrolfragment.cxx b/oox/source/ole/axcontrolfragment.cxx
index ff1b1e1c8117..047fd8daf4f4 100644
--- a/oox/source/ole/axcontrolfragment.cxx
+++ b/oox/source/ole/axcontrolfragment.cxx
@@ -79,9 +79,8 @@ ContextHandlerRef AxControlPropertyContext::onCreateContext( sal_Int32 nElement,
OUString aPicturePath = getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) );
if( aPicturePath.getLength() > 0 )
{
- StreamDataSequence aPictureData;
- if( getFilter().importBinaryData( aPictureData, aPicturePath ) )
- mrModel.importPictureData( mnPropId, aPictureData );
+ BinaryXInputStream aInStrm( getFilter().openInputStream( aPicturePath ), true );
+ mrModel.importPictureData( mnPropId, aInStrm );
}
}
break;
@@ -101,11 +100,30 @@ ContextHandlerRef AxControlFragment::onCreateContext( sal_Int32 nElement, const
{
if( isRootElement() && (nElement == AX_TOKEN( ocx )) )
{
- if( rAttribs.getToken( AX_TOKEN( persistence ), XML_TOKEN_INVALID ) == XML_persistPropertyBag )
+ OUString aClassId = rAttribs.getString( AX_TOKEN( classid ), OUString() );
+ switch( rAttribs.getToken( AX_TOKEN( persistence ), XML_TOKEN_INVALID ) )
{
- OUString aClassId = rAttribs.getString( AX_TOKEN( classid ), OUString() );
- if( AxControlModelBase* pModel = mrControl.createModel( aClassId ) )
- return new AxControlPropertyContext( *this, *pModel );
+ case XML_persistPropertyBag:
+ if( AxControlModelBase* pModel = mrControl.createModel( aClassId ) )
+ return new AxControlPropertyContext( *this, *pModel );
+ break;
+
+ case XML_persistStreamInit:
+ {
+ OUString aFragmentPath = getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) );
+ if( aFragmentPath.getLength() > 0 )
+ {
+ BinaryXInputStream aInStrm( getFilter().openInputStream( aFragmentPath ), true );
+ if( !aInStrm.isEof() )
+ {
+ mrControl.importBinaryModel( aInStrm );
+ // binary stream contains a copy of the class ID, must be equal to attribute value
+ OSL_ENSURE( !mrControl.getModel() || aClassId.equalsIgnoreAsciiCase( mrControl.getClassId() ),
+ "AxControlFragment::importBinaryControl - form control class ID mismatch" );
+ }
+ }
+ }
+ break;
}
}
return 0;
diff --git a/oox/source/ole/axcontrolhelper.cxx b/oox/source/ole/axcontrolhelper.cxx
index cd8180728074..057adc6c20bc 100644
--- a/oox/source/ole/axcontrolhelper.cxx
+++ b/oox/source/ole/axcontrolhelper.cxx
@@ -93,8 +93,10 @@ AxControlHelper::~AxControlHelper()
Reference< XForm > AxControlHelper::getControlForm() const
{
if( !mbHasFormQuerried )
+ {
+ mbHasFormQuerried = true;
mxForm = createControlForm(); // virtual call
- mbHasFormQuerried = true;
+ }
return mxForm;
}
diff --git a/oox/source/ole/makefile.mk b/oox/source/ole/makefile.mk
index 6d466e1f39ab..d843b4295461 100644
--- a/oox/source/ole/makefile.mk
+++ b/oox/source/ole/makefile.mk
@@ -45,6 +45,7 @@ ENABLE_EXCEPTIONS=TRUE
# --- Files --------------------------------------------------------
SLOFILES = \
+ $(SLO)$/axbinaryreader.obj \
$(SLO)$/axcontrol.obj \
$(SLO)$/axcontrolfragment.obj \
$(SLO)$/axcontrolhelper.obj \
diff --git a/oox/source/ole/olehelper.cxx b/oox/source/ole/olehelper.cxx
index c0eb37003d9a..499c796f7756 100644
--- a/oox/source/ole/olehelper.cxx
+++ b/oox/source/ole/olehelper.cxx
@@ -42,6 +42,7 @@ namespace ole {
namespace {
+const sal_Char* const OLE_GUID_STDFONT = "{0BE35203-8F91-11CE-9DE3-00AA004BB851}";
const sal_Char* const OLE_GUID_STDPIC = "{0BE35204-8F91-11CE-9DE3-00AA004BB851}";
const sal_Char* const OLE_GUID_STDHLINK = "{79EAC9D0-BAF9-11CE-8C82-00AA004BA90B}";
const sal_Char* const OLE_GUID_URLMONIKER = "{79EAC9E0-BAF9-11CE-8C82-00AA004BA90B}";