diff options
-rw-r--r-- | editeng/source/rtf/rtfgrf.cxx | 11 | ||||
-rw-r--r-- | filter/source/config/cache/filtercache.cxx | 95 | ||||
-rw-r--r-- | filter/source/config/cache/makefile.mk | 1 | ||||
-rw-r--r-- | svtools/inc/svtools/filter.hxx | 7 | ||||
-rw-r--r-- | svtools/inc/svtools/wmf.hxx | 25 | ||||
-rw-r--r-- | svtools/source/filter.vcl/filter/filter.cxx | 10 | ||||
-rw-r--r-- | svtools/source/filter.vcl/wmf/winmtf.hxx | 5 | ||||
-rw-r--r-- | svtools/source/filter.vcl/wmf/winwmf.cxx | 22 | ||||
-rw-r--r-- | svtools/source/filter.vcl/wmf/wmf.cxx | 4 |
9 files changed, 159 insertions, 21 deletions
diff --git a/editeng/source/rtf/rtfgrf.cxx b/editeng/source/rtf/rtfgrf.cxx index 85f398fbc529..7b8a08c16823 100644 --- a/editeng/source/rtf/rtfgrf.cxx +++ b/editeng/source/rtf/rtfgrf.cxx @@ -36,6 +36,7 @@ #include <svtools/rtfkeywd.hxx> #include <svtools/rtftoken.h> #include <svtools/filter.hxx> +#include <svtools/wmf.hxx> #include <editeng/svxrtf.hxx> @@ -492,9 +493,15 @@ sal_Bool SvxRTFParser::ReadBmpData( Graphic& rGrf, SvxRTFPictureType& rPicType ) } String sTmpStr; + WMF_APMFILEHEADER aAPMHeader; + aAPMHeader.left=0; + aAPMHeader.top=0; + aAPMHeader.right=rPicType.nWidth; + aAPMHeader.bottom=rPicType.nHeight; + + WMF_APMFILEHEADER *pAPMHeader=(aAPMHeader.right>0 && aAPMHeader.bottom>0?&aAPMHeader:NULL); pTmpFile->Seek( STREAM_SEEK_TO_BEGIN ); - bValidBmp = 0 == pGF->ImportGraphic( rGrf, sTmpStr, *pTmpFile, - nImportFilter ); + bValidBmp = 0 == pGF->ImportGraphic( rGrf, sTmpStr, *pTmpFile, nImportFilter, NULL, 0, pAPMHeader ); } delete pTmpFile; } diff --git a/filter/source/config/cache/filtercache.cxx b/filter/source/config/cache/filtercache.cxx index 07518dd2d0a9..3fb32e055d35 100644 --- a/filter/source/config/cache/filtercache.cxx +++ b/filter/source/config/cache/filtercache.cxx @@ -61,7 +61,15 @@ #include <tools/urlobj.hxx> #include <tools/wldcrd.hxx> +#include <com/sun/star/deployment/thePackageManagerFactory.hpp> + #include <comphelper/configurationhelper.hxx> +#include <ucbhelper/commandenvironment.hxx> +#include <rtl/bootstrap.hxx> + +#include <osl/file.hxx> + +using namespace com::sun::star; //_______________________________________________ // namespace @@ -1509,6 +1517,90 @@ void FilterCache::impl_load(EFillState eRequiredState) // <- SAFE } +static bool isOdfConverterInstalled() +{ + static bool bTested = false; + static bool bInstalled = false; + + if ( bTested ) + return bInstalled; + + bTested = true; + + // the easy path - check for the OdfConverter binary + rtl::OUString aPath; + + rtl::Bootstrap::get( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BRAND_BASE_DIR" ) ), aPath ); + aPath += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/program/OdfConverter" ) ); + + osl::DirectoryItem aDirItem; + if ( osl::DirectoryItem::get( aPath, aDirItem ) == osl::FileBase::E_None ) + { + bInstalled = true; + return bInstalled; + } + + // check the installed extensions + uno::Reference< ::com::sun::star::lang::XMultiServiceFactory> xMS(::comphelper::getProcessServiceFactory(), uno::UNO_QUERY); + uno::Reference< beans::XPropertySet > xProps(xMS, uno::UNO_QUERY); + uno::Reference< uno::XComponentContext > xContext(xProps->getPropertyValue(rtl::OUString::createFromAscii("DefaultContext")), uno::UNO_QUERY); + + uno::Reference< deployment::XPackageManager > xUserContext( + deployment::thePackageManagerFactory::get (xContext)->getPackageManager( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("user") ) ) ); + uno::Reference< ::com::sun::star::deployment::XPackageManager > xSharedContext( + deployment::thePackageManagerFactory::get (xContext)->getPackageManager( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("shared") ) ) ); + + uno::Reference< ::com::sun::star::task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > ( + xMS->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uui.InteractionHandler") ) ), uno::UNO_QUERY ); + ::ucbhelper::CommandEnvironment* pCommandEnv = new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ); + + uno::Reference< ucb::XCommandEnvironment > xCmdEnv( static_cast< ::com::sun::star::ucb::XCommandEnvironment* >( pCommandEnv ), uno::UNO_QUERY ); + + const uno::Sequence< uno::Reference< deployment::XPackage > > userPackages( + xUserContext->getDeployedPackages( NULL, xCmdEnv ) ); + const uno::Sequence< uno::Reference< deployment::XPackage > > sharedPackages( + xSharedContext->getDeployedPackages( NULL, xCmdEnv ) ); + + const uno::Sequence< uno::Reference< deployment::XPackage > > pkgsArray[2] = { + userPackages, + sharedPackages + }; + + for ( int i = 0; i < 2; i++ ) { + const uno::Sequence< uno::Reference< deployment::XPackage > > pkgs = pkgsArray[i]; + + for ( int j = 0; j < pkgs.getLength(); j++ ) { + rtl::OUString fname = pkgs[j]->getName(); + if ( fname.matchIgnoreAsciiCase( rtl::OUString::createFromAscii( "odf-converter-" ) ) ) { + printf( "Found match for odf-converter!\n"); + fflush( stdout ); + bInstalled = true; + return bInstalled; + } + } + } + + return false; +} + +static bool terribleHackToPreferOdfConverter( const rtl::OUString& rName ) +{ + if ( !isOdfConverterInstalled() ) + return false; + + if ( rName.equalsAscii( "Calc MS Excel 2007 XML" ) || + rName.equalsAscii( "MS Excel 2007 XML" ) || + rName.equalsAscii( "MS PowerPoint 2007 XML" ) || + rName.equalsAscii( "Impress MS PowerPoint 2007 XML" ) || + rName.equalsAscii( "writer_MS_Word_2007" ) || + rName.equalsAscii( "MS Word 2007 XML" ) ) + { + return true; + } + + return false; +} + void FilterCache::impl_loadSet(const css::uno::Reference< css::container::XNameAccess >& xConfig, @@ -1575,6 +1667,9 @@ void FilterCache::impl_loadSet(const css::uno::Reference< css::container::XNameA sal_Int32 c = lItems.getLength(); for (sal_Int32 i=0; i<c; ++i) { + if ( terribleHackToPreferOdfConverter( pItems[i] ) ) + continue; + CacheItemList::iterator pItem = pCache->find(pItems[i]); switch(eOption) { diff --git a/filter/source/config/cache/makefile.mk b/filter/source/config/cache/makefile.mk index d94c81e35010..dd4b4c7dbe61 100644 --- a/filter/source/config/cache/makefile.mk +++ b/filter/source/config/cache/makefile.mk @@ -60,6 +60,7 @@ SLOFILES= \ SHL1OBJS= $(SLOFILES) SHL1STDLIBS= \ + $(UCBHELPERLIB) \ $(COMPHELPERLIB) \ $(CPPUHELPERLIB) \ $(CPPULIB) \ diff --git a/svtools/inc/svtools/filter.hxx b/svtools/inc/svtools/filter.hxx index 105783013bdc..36211616dd4a 100644 --- a/svtools/inc/svtools/filter.hxx +++ b/svtools/inc/svtools/filter.hxx @@ -39,6 +39,7 @@ #include <com/sun/star/uno/Sequence.h> #include <com/sun/star/beans/PropertyValue.hpp> +struct WMF_APMFILEHEADER; // ----------------------- // - GraphicFilter-Types - // ----------------------- @@ -341,13 +342,15 @@ public: sal_uInt16 ImportGraphic( Graphic& rGraphic, const String& rPath, SvStream& rStream, sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW, - sal_uInt16 * pDeterminedFormat = NULL, sal_uInt32 nImportFlags = 0 ); + sal_uInt16 * pDeterminedFormat = NULL, sal_uInt32 nImportFlags = 0 + , WMF_APMFILEHEADER *pAPMHeader = NULL); sal_uInt16 ImportGraphic( Graphic& rGraphic, const String& rPath, SvStream& rStream, sal_uInt16 nFormat, sal_uInt16 * pDeterminedFormat, sal_uInt32 nImportFlags, - com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData ); + com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData + , WMF_APMFILEHEADER *pAPMHeader = NULL); sal_Bool Setup( sal_uInt16 nFormat ); diff --git a/svtools/inc/svtools/wmf.hxx b/svtools/inc/svtools/wmf.hxx index be1852701f33..3c1f07774a45 100644 --- a/svtools/inc/svtools/wmf.hxx +++ b/svtools/inc/svtools/wmf.hxx @@ -32,7 +32,30 @@ #include "svtools/svtdllapi.h" #include <svtools/fltcall.hxx> -sal_Bool ConvertWMFToGDIMetaFile( SvStream & rStreamWMF, GDIMetaFile & rGDIMetaFile, FilterConfigItem* pConfigItem = NULL ); +struct WMF_APMFILEHEADER { + sal_uInt32 key; + sal_uInt16 hmf; + sal_uInt16 left; + sal_uInt16 top; + sal_uInt16 right; + sal_uInt16 bottom; + sal_uInt16 inch; + sal_uInt32 reserved; + sal_uInt16 checksum; + + WMF_APMFILEHEADER() : key(0x9ac6cdd7L), + hmf(0), + left(0), + top(0), + right(0), + bottom(0), + inch(96), + reserved(0), + checksum(0) { + } +}; + +sal_Bool ConvertWMFToGDIMetaFile( SvStream & rStreamWMF, GDIMetaFile & rGDIMetaFile, FilterConfigItem* pConfigItem = NULL, WMF_APMFILEHEADER *pAPMHeader = NULL ); SVT_DLLPUBLIC sal_Bool ReadWindowMetafile( SvStream& rStream, GDIMetaFile& rMTF, FilterConfigItem* pConfigItem ); diff --git a/svtools/source/filter.vcl/filter/filter.cxx b/svtools/source/filter.vcl/filter/filter.cxx index 5ea07d2017f2..00bddb4fc221 100644 --- a/svtools/source/filter.vcl/filter/filter.cxx +++ b/svtools/source/filter.vcl/filter/filter.cxx @@ -1303,17 +1303,17 @@ sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const INetURLObject& return nRetValue; } -sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const String& rPath, SvStream& rIStream, - sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat, sal_uInt32 nImportFlags ) +sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const String& rPath, SvStream& rIStream, sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat, sal_uInt32 nImportFlags, WMF_APMFILEHEADER *pAPMHeader ) { - return ImportGraphic( rGraphic, rPath, rIStream, nFormat, pDeterminedFormat, nImportFlags, NULL ); + return ImportGraphic( rGraphic, rPath, rIStream, nFormat, pDeterminedFormat, nImportFlags, NULL, pAPMHeader ); } //------------------------------------------------------------------------- sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const String& rPath, SvStream& rIStream, sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat, sal_uInt32 nImportFlags, - com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData ) + com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData + , WMF_APMFILEHEADER *pAPMHeader) { String aFilterName; sal_uLong nStmBegin; @@ -1510,7 +1510,7 @@ sal_uInt16 GraphicFilter::ImportGraphic( Graphic& rGraphic, const String& rPath, aFilterName.EqualsIgnoreCaseAscii( IMP_EMF ) ) { GDIMetaFile aMtf; - if( !ConvertWMFToGDIMetaFile( rIStream, aMtf, NULL ) ) + if( !ConvertWMFToGDIMetaFile( rIStream, aMtf, NULL, pAPMHeader ) ) nStatus = GRFILTER_FORMATERROR; else { diff --git a/svtools/source/filter.vcl/wmf/winmtf.hxx b/svtools/source/filter.vcl/wmf/winmtf.hxx index d0b4e42cbed4..25551716e091 100644 --- a/svtools/source/filter.vcl/wmf/winmtf.hxx +++ b/svtools/source/filter.vcl/wmf/winmtf.hxx @@ -157,6 +157,7 @@ struct LOGFONTW sal_uInt8 lfPitchAndFamily; String alfFaceName; }; +struct WMF_APMFILEHEADER; #define TA_NOUPDATECP 0x0000 #define TA_UPDATECP 0x0001 @@ -770,7 +771,7 @@ private: sal_uInt32 nUnicodeEscapeAction; // Liesst den Kopf der WMF-Datei - sal_Bool ReadHeader(); + sal_Bool ReadHeader(WMF_APMFILEHEADER *pAPMHeader); // Liesst die Parameter des Rocords mit der Funktionsnummer nFunction. void ReadRecordParams( sal_uInt16 nFunction ); @@ -791,7 +792,7 @@ public: ~WMFReader(); // Liesst aus dem Stream eine WMF-Datei und fuellt das GDIMetaFile - void ReadWMF(); + void ReadWMF(WMF_APMFILEHEADER *pAPMHeader=NULL); }; #endif diff --git a/svtools/source/filter.vcl/wmf/winwmf.cxx b/svtools/source/filter.vcl/wmf/winwmf.cxx index 095b1c45eb68..a794da5b3274 100644 --- a/svtools/source/filter.vcl/wmf/winwmf.cxx +++ b/svtools/source/filter.vcl/wmf/winwmf.cxx @@ -31,6 +31,7 @@ #include "winmtf.hxx" #include <vcl/gdimtf.hxx> +#include <svtools/wmf.hxx> #include <rtl/crc.h> #include <rtl/tencinfo.h> #include <osl/endian.h> @@ -997,7 +998,7 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc ) // ------------------------------------------------------------------------ -sal_Bool WMFReader::ReadHeader() +sal_Bool WMFReader::ReadHeader(WMF_APMFILEHEADER *pAPMHeader) { Rectangle aPlaceableBound; sal_uInt32 nl, nStrmPos = pWMF->Tell(); @@ -1030,10 +1031,17 @@ sal_Bool WMFReader::ReadHeader() } else { - nUnitsPerInch = 96; - pWMF->Seek( nStrmPos + 18 ); // set the streampos to the start of the the metaactions - GetPlaceableBound( aPlaceableBound, pWMF ); - pWMF->Seek( nStrmPos ); + nUnitsPerInch = (pAPMHeader!=NULL?pAPMHeader->inch:96); + pWMF->Seek( nStrmPos + 18 ); // set the streampos to the start of the the metaactions + GetPlaceableBound( aPlaceableBound, pWMF ); + pWMF->Seek( nStrmPos ); + if (pAPMHeader!=NULL) { + // #n417818#: If we have an external header then overwrite the bounds! + aPlaceableBound=Rectangle(pAPMHeader->left*567*nUnitsPerInch/1440/1000, + pAPMHeader->top*567*nUnitsPerInch/1440/1000, + pAPMHeader->right*567*nUnitsPerInch/1440/1000, + pAPMHeader->bottom*567*nUnitsPerInch/1440/1000); + } } pOut->SetUnitsPerInch( nUnitsPerInch ); @@ -1069,7 +1077,7 @@ sal_Bool WMFReader::ReadHeader() return sal_True; } -void WMFReader::ReadWMF() +void WMFReader::ReadWMF(WMF_APMFILEHEADER *pAPMHeader) { sal_uInt16 nFunction; sal_uLong nPos, nPercent, nLastPercent; @@ -1094,7 +1102,7 @@ void WMFReader::ReadWMF() pWMF->Seek( nStartPos ); Callback( (sal_uInt16) ( nLastPercent = 0 ) ); - if ( ReadHeader() ) + if ( ReadHeader( pAPMHeader ) ) { nPos = pWMF->Tell(); diff --git a/svtools/source/filter.vcl/wmf/wmf.cxx b/svtools/source/filter.vcl/wmf/wmf.cxx index d78ce2d160bb..9b2a8edf2d6e 100644 --- a/svtools/source/filter.vcl/wmf/wmf.cxx +++ b/svtools/source/filter.vcl/wmf/wmf.cxx @@ -36,7 +36,7 @@ // ----------------------------------------------------------------------------- -sal_Bool ConvertWMFToGDIMetaFile( SvStream & rStreamWMF, GDIMetaFile & rGDIMetaFile, FilterConfigItem* pConfigItem ) +sal_Bool ConvertWMFToGDIMetaFile( SvStream & rStreamWMF, GDIMetaFile & rGDIMetaFile, FilterConfigItem* pConfigItem, WMF_APMFILEHEADER *pAPMHeader ) { sal_uInt32 nMetaType; sal_uInt32 nOrgPos = rStreamWMF.Tell(); @@ -52,7 +52,7 @@ sal_Bool ConvertWMFToGDIMetaFile( SvStream & rStreamWMF, GDIMetaFile & rGDIMetaF } else { - WMFReader( rStreamWMF, rGDIMetaFile, pConfigItem ).ReadWMF(); + WMFReader( rStreamWMF, rGDIMetaFile, pConfigItem ).ReadWMF( pAPMHeader ); } rStreamWMF.SetNumberFormatInt( nOrigNumberFormat ); return !rStreamWMF.GetError(); |