summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--editeng/source/rtf/rtfgrf.cxx11
-rw-r--r--filter/source/config/cache/filtercache.cxx95
-rw-r--r--filter/source/config/cache/makefile.mk1
-rw-r--r--svtools/inc/svtools/filter.hxx7
-rw-r--r--svtools/inc/svtools/wmf.hxx25
-rw-r--r--svtools/source/filter.vcl/filter/filter.cxx10
-rw-r--r--svtools/source/filter.vcl/wmf/winmtf.hxx5
-rw-r--r--svtools/source/filter.vcl/wmf/winwmf.cxx22
-rw-r--r--svtools/source/filter.vcl/wmf/wmf.cxx4
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();