summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/OLEHandler.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/OLEHandler.cxx')
-rw-r--r--writerfilter/source/dmapper/OLEHandler.cxx246
1 files changed, 246 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/OLEHandler.cxx b/writerfilter/source/dmapper/OLEHandler.cxx
new file mode 100644
index 000000000000..65f76f11cbfc
--- /dev/null
+++ b/writerfilter/source/dmapper/OLEHandler.cxx
@@ -0,0 +1,246 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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 <OLEHandler.hxx>
+#include <PropertyMap.hxx>
+#include "GraphicHelpers.hxx"
+
+#include <doctok/resourceids.hxx>
+#include <ooxml/resourceids.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/document/XEmbeddedObjectResolver.hpp>
+#include <com/sun/star/document/XStorageBasedDocument.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/embed/XEmbedObjectCreator.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/io/XStream.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+namespace writerfilter {
+namespace dmapper {
+
+using namespace ::com::sun::star;
+/*-- 23.04.2008 10:46:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OLEHandler::OLEHandler() :
+ m_nDxaOrig(0),
+ m_nDyaOrig(0),
+ m_nWrapMode(0)
+{
+}
+/*-- 23.04.2008 10:46:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OLEHandler::~OLEHandler()
+{
+}
+/*-- 23.04.2008 10:46:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void OLEHandler::attribute(Id rName, Value & rVal)
+{
+ rtl::OUString sStringValue = rVal.getString();
+ (void)rName;
+ /* WRITERFILTERSTATUS: table: OLEHandler_attributedata */
+ switch( rName )
+ {
+ /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
+ case NS_ooxml::LN_CT_OLEObject_Type:
+ m_sObjectType = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_OLEObject_ProgID:
+ m_sProgId = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_OLEObject_ShapeID:
+ m_sShapeId = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_OLEObject_DrawAspect:
+ m_sDrawAspect = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_OLEObject_ObjectID:
+ m_sObjectId = sStringValue;
+ break;
+ case NS_ooxml::LN_CT_OLEObject_r_id:
+ m_sr_id = sStringValue;
+ break;
+ case NS_ooxml::LN_inputstream:
+ rVal.getAny() >>= m_xInputStream;
+ break;
+ case NS_ooxml::LN_CT_Object_dxaOrig:
+ m_nDxaOrig = rVal.getInt();
+ break;
+ case NS_ooxml::LN_CT_Object_dyaOrig:
+ m_nDyaOrig = rVal.getInt();
+ break;
+ case NS_ooxml::LN_shape:
+ /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */
+ {
+ uno::Reference< drawing::XShape > xTempShape;
+ rVal.getAny() >>= xTempShape;
+ if( xTempShape.is() )
+ {
+ m_xShape.set( xTempShape );
+
+ try
+ {
+ m_aShapeSize = xTempShape->getSize();
+ m_aShapePosition = xTempShape->getPosition();
+
+ uno::Reference< beans::XPropertySet > xShapeProps( xTempShape, uno::UNO_QUERY_THROW );
+ PropertyNameSupplier& rNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+
+ xShapeProps->getPropertyValue( rNameSupplier.GetName( PROP_BITMAP ) ) >>= m_xReplacement;
+
+ xShapeProps->setPropertyValue(
+ rNameSupplier.GetName( PROP_SURROUND ),
+ uno::makeAny( m_nWrapMode ) );
+ }
+ catch( const uno::Exception& e )
+ {
+#if DEBUG
+ clog << "Exception in OLE Handler: ";
+ clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl;
+#endif
+ }
+ }
+ }
+ break;
+ default:
+ OSL_ENSURE( false, "unknown attribute");
+ }
+}
+/*-- 23.04.2008 10:46:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void OLEHandler::sprm(Sprm & rSprm)
+{
+ sal_uInt32 nSprmId = rSprm.getId();
+ switch( nSprmId )
+ {
+ case NS_ooxml::LN_OLEObject_OLEObject:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ if( pProperties.get())
+ {
+ pProperties->resolve(*this);
+ }
+ }
+ break;
+ case NS_ooxml::LN_wrap_wrap:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ if ( pProperties.get( ) )
+ {
+ WrapHandlerPtr pHandler( new WrapHandler );
+ pProperties->resolve( *pHandler );
+
+ m_nWrapMode = pHandler->getWrapMode( );
+
+ try
+ {
+ uno::Reference< beans::XPropertySet > xShapeProps( m_xShape, uno::UNO_QUERY_THROW );
+ PropertyNameSupplier& rNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+
+ xShapeProps->setPropertyValue(
+ rNameSupplier.GetName( PROP_SURROUND ),
+ uno::makeAny( m_nWrapMode ) );
+ }
+ catch( const uno::Exception& e )
+ {
+#if DEBUG
+ clog << "Exception in OLE Handler: ";
+ clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl;
+#endif
+ }
+ }
+ }
+ break;
+ default:
+ {
+ OSL_ENSURE( false, "unknown attribute");
+ }
+ }
+}
+/*-- 23.04.2008 11:15:19---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+::rtl::OUString OLEHandler::copyOLEOStream( uno::Reference< text::XTextDocument > xTextDocument )
+{
+ ::rtl::OUString sRet;
+ if( !m_xInputStream.is( ) )
+ return sRet;
+ try
+ {
+ uno::Reference < lang::XMultiServiceFactory > xFactory(xTextDocument, uno::UNO_QUERY_THROW);
+ uno::Reference< document::XEmbeddedObjectResolver > xEmbeddedResolver(
+ xFactory->createInstance(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportEmbeddedObjectResolver" ))), uno::UNO_QUERY_THROW );
+ //hack to work with the ImportEmbeddedObjectResolver
+ static sal_Int32 nObjectCount = 100;
+ uno::Reference< container::XNameAccess > xNA( xEmbeddedResolver, uno::UNO_QUERY_THROW );
+ ::rtl::OUString aURL(RTL_CONSTASCII_USTRINGPARAM("Obj" ));
+ aURL += ::rtl::OUString::valueOf( nObjectCount++ );
+ uno::Reference < io::XOutputStream > xOLEStream;
+ if( (xNA->getByName( aURL ) >>= xOLEStream) && xOLEStream.is() )
+ {
+ const sal_Int32 nReadRequest = 0x1000;
+ uno::Sequence< sal_Int8 > aData;
+
+ while( true )
+ {
+ sal_Int32 nRead = m_xInputStream->readBytes( aData, nReadRequest );
+ xOLEStream->writeBytes( aData );
+ if( nRead < nReadRequest )
+ {
+ xOLEStream->closeOutput();
+ break;
+ }
+ }
+
+ static const ::rtl::OUString sProtocol = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.EmbeddedObject:" ));
+ ::rtl::OUString aPersistName( xEmbeddedResolver->resolveEmbeddedObjectURL( aURL ) );
+ sRet = aPersistName.copy( sProtocol.getLength() );
+
+ }
+ uno::Reference< lang::XComponent > xComp( xEmbeddedResolver, uno::UNO_QUERY_THROW );
+ xComp->dispose();
+ }
+ catch( const uno::Exception& rEx)
+ {
+ (void)rEx;
+ OSL_ENSURE(false, "exception in OLEHandler::createOLEObject");
+ }
+ return sRet;
+}
+
+} //namespace dmapper
+} //namespace writerfilter