[Libreoffice-commits] .: 2 commits - filter/source

Jan Holesovsky kendy at kemper.freedesktop.org
Tue Mar 29 06:18:27 PDT 2011


 filter/source/config/fragments/filters/MS_Excel_2003_XML.xcu |    2 
 filter/source/config/fragments/filters/MS_Word_2003_XML.xcu  |    2 
 filter/source/xslt/common/measure_conversion.xsl             |  101 ++++
 filter/source/xslt/export/common/ooo2ms_docpr.xsl            |    4 
 filter/source/xslt/export/wordml/ooo2wordml_draw.xsl         |  126 -----
 filter/source/xslt/import/wordml/wordml2ooo.xsl              |   83 ---
 filter/source/xslt/import/wordml/wordml2ooo_draw.xsl         |   41 -
 filter/source/xsltfilter/LibXSLTTransformer.cxx              |  125 +++++
 filter/source/xsltfilter/LibXSLTTransformer.hxx              |   10 
 filter/source/xsltfilter/OleHandler.cxx                      |  249 +++++++++++
 filter/source/xsltfilter/OleHandler.hxx                      |  111 ++++
 filter/source/xsltfilter/makefile.mk                         |    5 
 12 files changed, 610 insertions(+), 249 deletions(-)

New commits:
commit 7cb34a1472f8d5274fa1dc5217e0a6f2c26015f5
Author: Jan Holesovsky <kendy at suse.cz>
Date:   Tue Mar 29 14:19:50 2011 +0200

    Namespace ZipUtils for the Inflater / Deflater classes.

diff --git a/filter/source/xsltfilter/OleHandler.cxx b/filter/source/xsltfilter/OleHandler.cxx
index 874b288..79b0773 100644
--- a/filter/source/xsltfilter/OleHandler.cxx
+++ b/filter/source/xsltfilter/OleHandler.cxx
@@ -146,7 +146,7 @@ namespace XSLT
             }
 
         // Decompress the bytes
-        ::Inflater* decompresser = new ::Inflater(sal_False);
+        ::ZipUtils::Inflater* decompresser = new ::ZipUtils::Inflater(sal_False);
         decompresser->setInput(content);
         Sequence<sal_Int8> result(oleLength);
         decompresser->doInflateSegment(result, 0, oleLength);
@@ -217,7 +217,7 @@ namespace XSLT
 
         // Compress the bytes
         Sequence<sal_Int8> output(oledata.getLength());
-        ::Deflater* compresser = new ::Deflater((sal_Int32) 3, sal_False);
+        ::ZipUtils::Deflater* compresser = new ::ZipUtils::Deflater((sal_Int32) 3, sal_False);
         compresser->setInputSegment(oledata, 0, oledata.getLength());
         compresser->finish();
         int compressedDataLength = compresser->doDeflateSegment(output, 0, oledata.getLength());
commit 01cdd00bcae1e96cc123e59ae2ff7bc9d9ad9340
Author: Peter Jentsch <pjotr at guineapics.de>
Date:   Sat Mar 26 14:24:41 2011 +0100

    replaced saxon/j extension functions with libxslt/cxx impl in XSLTFilter

diff --git a/filter/source/config/fragments/filters/MS_Excel_2003_XML.xcu b/filter/source/config/fragments/filters/MS_Excel_2003_XML.xcu
index a0bb672..d0d2b13 100644
--- a/filter/source/config/fragments/filters/MS_Excel_2003_XML.xcu
+++ b/filter/source/config/fragments/filters/MS_Excel_2003_XML.xcu
@@ -2,7 +2,7 @@
         <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"><value>com.sun.star.comp.Writer.XmlFilterAdaptor</value></prop>
-        <prop oor:name="UserData"><value oor:separator=",">com.sun.star.documentconversion.XSLTFilter,com.sun.star.comp.JAXTHelper,com.sun.star.comp.Calc.XMLOasisImporter,com.sun.star.comp.Calc.XMLOasisExporter,../share/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl,../share/xslt/export/spreadsheetml/ooo2spreadsheetml.xsl</value></prop>
+        <prop oor:name="UserData"><value oor:separator=",">com.sun.star.documentconversion.XSLTFilter,,com.sun.star.comp.Calc.XMLOasisImporter,com.sun.star.comp.Calc.XMLOasisExporter,../share/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl,../share/xslt/export/spreadsheetml/ooo2spreadsheetml.xsl</value></prop>
         <prop oor:name="FileFormatVersion"><value>0</value></prop>
         <prop oor:name="Type"><value>calc_MS_Excel_2003_XML</value></prop>
         <prop oor:name="TemplateName"/>
diff --git a/filter/source/config/fragments/filters/MS_Word_2003_XML.xcu b/filter/source/config/fragments/filters/MS_Word_2003_XML.xcu
index 4568910..c953598 100644
--- a/filter/source/config/fragments/filters/MS_Word_2003_XML.xcu
+++ b/filter/source/config/fragments/filters/MS_Word_2003_XML.xcu
@@ -2,7 +2,7 @@
         <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"><value>com.sun.star.comp.Writer.XmlFilterAdaptor</value></prop>
-        <prop oor:name="UserData"><value oor:separator=",">com.sun.star.documentconversion.XSLTFilter,com.sun.star.comp.JAXTHelper,com.sun.star.comp.Writer.XMLOasisImporter,com.sun.star.comp.Writer.XMLOasisExporter,../share/xslt/import/wordml/wordml2ooo.xsl,../share/xslt/export/wordml/ooo2wordml.xsl</value></prop>
+        <prop oor:name="UserData"><value oor:separator=",">com.sun.star.documentconversion.XSLTFilter,,com.sun.star.comp.Writer.XMLOasisImporter,com.sun.star.comp.Writer.XMLOasisExporter,../share/xslt/import/wordml/wordml2ooo.xsl,../share/xslt/export/wordml/ooo2wordml.xsl</value></prop>
         <prop oor:name="FileFormatVersion"><value>0</value></prop>
         <prop oor:name="Type"><value>writer_MS_Word_2003_XML</value></prop>
         <prop oor:name="TemplateName"/>
diff --git a/filter/source/xslt/common/measure_conversion.xsl b/filter/source/xslt/common/measure_conversion.xsl
index 4533013..6ad52e0 100644
--- a/filter/source/xslt/common/measure_conversion.xsl
+++ b/filter/source/xslt/common/measure_conversion.xsl
@@ -384,4 +384,105 @@
 			</xsl:otherwise>
 		</xsl:choose>
 	</xsl:template>
+	<xsl:template name="ConvertMeasure">
+		<xsl:param name="TargetMeasure" select="'cm'"/>
+		<xsl:param name="TargetTruncate" select=" 'all' "/>
+		<xsl:param name="value"/>
+		<!-- When TargetTruncate ='all'  it returns the number whichsoever the return value is negative or positive
+			When TargetTruncate ='nonNegative' it only returns nonNegative number, all negative number to be returned as 0
+			When TargetTruncate ='positive" it only returns positive number, all nonPositive number to be returned as 1 -->
+		<xsl:variable name="return_value">
+			<xsl:choose>
+				<!-- remove the measure mark, if the value is null, the result should be 0. Must be the first case  -->
+				<xsl:when test="string-length(translate(string($value),'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ','')) = 0">0</xsl:when>
+				<xsl:when test="string-length(translate(string($value),'- .0123456789','')) = 0">
+					<xsl:value-of select="$value"/>
+				</xsl:when>
+				<xsl:when test="$TargetMeasure = 'cm'">
+					<xsl:call-template name="convert2cm">
+						<xsl:with-param name="value" select="$value"/>
+					</xsl:call-template>
+				</xsl:when>
+				<xsl:when test="$TargetMeasure = 'pt'">
+					<xsl:call-template name="convert2pt">
+						<xsl:with-param name="value" select="$value"/>
+					</xsl:call-template>
+				</xsl:when>
+				<xsl:when test="$TargetMeasure = 'twip'">
+					<xsl:call-template name="convert2twip">
+						<xsl:with-param name="value" select="$value"/>
+					</xsl:call-template>
+				</xsl:when>
+				<xsl:when test="$TargetMeasure = 'in'">
+					<xsl:call-template name="convert2in">
+						<xsl:with-param name="value" select="$value"/>
+					</xsl:call-template>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:variable>
+		<xsl:choose>
+			<xsl:when test="$TargetTruncate = 'all' ">
+				<xsl:choose>
+					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
+						<xsl:value-of select=" '0' "/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="$return_value"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="$TargetTruncate = 'nonNegative' ">
+				<xsl:choose>
+					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
+						<xsl:value-of select=" '0' "/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:choose>
+							<xsl:when test=" $return_value &lt; 0  ">
+								<xsl:value-of select=" '0' "/>
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:value-of select="$return_value"/>
+							</xsl:otherwise>
+						</xsl:choose>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="$TargetTruncate = 'positive' ">
+				<xsl:choose>
+					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
+						<xsl:value-of select=" '1' "/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:choose>
+							<xsl:when test=" $return_value &lt;= 0 ">
+								<xsl:value-of select=" '1' "/>
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:value-of select="$return_value"/>
+							</xsl:otherwise>
+						</xsl:choose>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+		</xsl:choose>
+	</xsl:template>
+	<xsl:template name="Add-With-Measure">
+		<xsl:param name="value1"/>
+		<xsl:param name="value2"/>
+		<xsl:param name="TargetMeasure" select="'in'"/>
+		<xsl:variable name="number-value1">
+			<xsl:call-template name="ConvertMeasure">
+				<xsl:with-param name="value" select="$value1"/>
+				<xsl:with-param name="TargetMeasure" select="$TargetMeasure"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="number-value2">
+			<xsl:call-template name="ConvertMeasure">
+				<xsl:with-param name="value" select="$value2"/>
+				<xsl:with-param name="TargetMeasure" select="$TargetMeasure"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:value-of select="$number-value1 + $number-value2"/>
+	</xsl:template>
 </xsl:stylesheet>
diff --git a/filter/source/xslt/export/common/ooo2ms_docpr.xsl b/filter/source/xslt/export/common/ooo2ms_docpr.xsl
index cdf5ed9..fd3c6b9 100644
--- a/filter/source/xslt/export/common/ooo2ms_docpr.xsl
+++ b/filter/source/xslt/export/common/ooo2ms_docpr.xsl
@@ -127,7 +127,9 @@
             </o:Language>
             <xsl:for-each select="meta:user-defined">
                 <!-- transfer strings to XML QName, necessary to convert several characters -->
-                <xsl:element name="{concat( 'o:', translate(@meta:name,'.,| ~`!@#$%^&amp;&lt;&gt;*()+=[]{};:&quot;/\?','_'))}">
+                <!-- &#x7b;&#x7d; -->
+                <xsl:variable name="foo">.,| ~`!@#$%^*()&amp;&lt;&gt;+=[];:&quot;/\?{}'</xsl:variable>
+                <xsl:element name="{concat( 'o:', translate(@meta:name,string($foo),'_'))}">
                     <xsl:attribute name="dt:dt">string</xsl:attribute>
                     <xsl:value-of select="."/>
                 </xsl:element>
diff --git a/filter/source/xslt/export/wordml/ooo2wordml_draw.xsl b/filter/source/xslt/export/wordml/ooo2wordml_draw.xsl
index 2badb7c..b978e99 100644
--- a/filter/source/xslt/export/wordml/ooo2wordml_draw.xsl
+++ b/filter/source/xslt/export/wordml/ooo2wordml_draw.xsl
@@ -25,11 +25,9 @@
   for a copy of the LGPLv3 License.
 
 -->
-<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns
 :number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xalan="http://xml.apache.org/xalan" xmlns:oleextracter="MyOleExtracter" xmlns:ole="java:XSLTFilterOLEExtracter" xmlns:java="http://saxon.sf.net/java-type" exclude-result-prefixes="office table style text draw svg dc config xlink meta oooc dom ooo chart math dr3d form script ooow draw xalan ole oleextracter ja
 va" extension-element-prefixes="oleextracter">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns
 :number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:ole="http://libreoffice.org/2011/xslt/ole" exclude-result-prefixes="office table style text draw svg dc config xlink meta oooc dom ooo chart math dr3d form script ooow ole">
 	<xsl:include href="ooo2wordml_custom_draw.xsl"/>
-	<xsl:param name="oleExtractor" as="java:com.sun.star.comp.xsltfilter.XSLTFilterOLEExtracter" select="ole:new()"/>
-	<xsl:param name="XMultiServiceFactory" as="java:com.sun.star.lang.XMultiServiceFactory" select="ole:init($oleExtractor,  'uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager')"/>
-
+	
 	<xsl:key name="stroke-dash-style" match="draw:stroke-dash" use="@draw:name"/>
 	<xsl:key name="fill-image" match="draw:fill-image" use="@draw:name"/>
 	<xsl:key name="draw-gradient" match="draw:gradient " use="@draw:name"/>
@@ -1738,135 +1736,24 @@
 			<xsl:when test="$arrow-size &gt; 0">Narrow</xsl:when>
 		</xsl:choose>
 	</xsl:template>
-	<xsl:template name="ConvertMeasure">
-		<xsl:param name="TargetMeasure" select="'cm'"/>
-		<xsl:param name="TargetTruncate" select=" 'all' "/>
-		<xsl:param name="value"/>
-		<!-- When TargetTruncate ='all'  it returns the number whichsoever the return value is negative or positive
-			   When TargetTruncate ='nonNegative' it only returns nonNegative number, all negative number to be returned as 0
-			   When TargetTruncate ='positive" it only returns positive number, all nonPositive number to be returned as 1 -->
-		<xsl:variable name="return_value">
-			<xsl:choose>
-				<!-- remove the measure mark, if the value is null, the result should be 0. Must be the first case  -->
-				<xsl:when test="string-length(translate(string($value),'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ','')) = 0">0</xsl:when>
-				<xsl:when test="string-length(translate(string($value),'- .0123456789','')) = 0">
-					<xsl:value-of select="$value"/>
-				</xsl:when>
-				<xsl:when test="$TargetMeasure = 'cm'">
-					<xsl:call-template name="convert2cm">
-						<xsl:with-param name="value" select="$value"/>
-					</xsl:call-template>
-				</xsl:when>
-				<xsl:when test="$TargetMeasure = 'pt'">
-					<xsl:call-template name="convert2pt">
-						<xsl:with-param name="value" select="$value"/>
-					</xsl:call-template>
-				</xsl:when>
-				<xsl:when test="$TargetMeasure = 'twip'">
-					<xsl:call-template name="convert2twip">
-						<xsl:with-param name="value" select="$value"/>
-					</xsl:call-template>
-				</xsl:when>
-				<xsl:when test="$TargetMeasure = 'in'">
-					<xsl:call-template name="convert2in">
-						<xsl:with-param name="value" select="$value"/>
-					</xsl:call-template>
-				</xsl:when>
-			</xsl:choose>
-		</xsl:variable>
-		<xsl:choose>
-			<xsl:when test="$TargetTruncate = 'all' ">
-				<xsl:choose>
-					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
-						<xsl:value-of select=" '0' "/>
-					</xsl:when>
-					<xsl:otherwise>
-						<xsl:value-of select="$return_value"/>
-					</xsl:otherwise>
-				</xsl:choose>
-			</xsl:when>
-			<xsl:when test="$TargetTruncate = 'nonNegative' ">
-				<xsl:choose>
-					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
-						<xsl:value-of select=" '0' "/>
-					</xsl:when>
-					<xsl:otherwise>
-						<xsl:choose>
-							<xsl:when test=" $return_value &lt; 0  ">
-								<xsl:value-of select=" '0' "/>
-							</xsl:when>
-							<xsl:otherwise>
-								<xsl:value-of select="$return_value"/>
-							</xsl:otherwise>
-						</xsl:choose>
-					</xsl:otherwise>
-				</xsl:choose>
-			</xsl:when>
-			<xsl:when test="$TargetTruncate = 'positive' ">
-				<xsl:choose>
-					<xsl:when test="string(number($TargetMeasure)) = 'NaN' ">
-						<xsl:value-of select=" '1' "/>
-					</xsl:when>
-					<xsl:otherwise>
-						<xsl:choose>
-							<xsl:when test=" $return_value &lt;= 0 ">
-								<xsl:value-of select=" '1' "/>
-							</xsl:when>
-							<xsl:otherwise>
-								<xsl:value-of select="$return_value"/>
-							</xsl:otherwise>
-						</xsl:choose>
-					</xsl:otherwise>
-				</xsl:choose>
-			</xsl:when>
-		</xsl:choose>
-	</xsl:template>
-	<xsl:template name="Add-With-Measure">
-		<xsl:param name="value1"/>
-		<xsl:param name="value2"/>
-		<xsl:param name="TargetMeasure" select="'in'"/>
-		<xsl:variable name="number-value1">
-			<xsl:call-template name="ConvertMeasure">
-				<xsl:with-param name="value" select="$value1"/>
-				<xsl:with-param name="TargetMeasure" select="$TargetMeasure"/>
-			</xsl:call-template>
-		</xsl:variable>
-		<xsl:variable name="number-value2">
-			<xsl:call-template name="ConvertMeasure">
-				<xsl:with-param name="value" select="$value2"/>
-				<xsl:with-param name="TargetMeasure" select="$TargetMeasure"/>
-			</xsl:call-template>
-		</xsl:variable>
-		<xsl:value-of select="$number-value1 + $number-value2"/>
-	</xsl:template>
+
 	<xsl:template name="export-oledata">
 		<xsl:if test="//draw:object-ole[1]">
-			<xsl:choose>
-				<xsl:when test="element-available('oleextracter:init')">
-					<oleextracter:init UNOURL="uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"/>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:value-of select="ole:init($XMultiServiceFactory, 'uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager')"/>
-				</xsl:otherwise>
-			</xsl:choose>
 			<xsl:apply-templates select="//draw:object-ole" mode="oledata.mso"/>
 			<w:docOleData>
 				<w:binData w:name="oledata.mso">
 					<xsl:if test="function-available('ole:getByName')">
-						<xsl:value-of select="translate(ole:getByName($oleExtractor, 'oledata.mso'),'&#10;&#13;&#32;','')"/>
+						<xsl:value-of select="translate(ole:getByName('oledata.mso'),'&#10;&#13;&#32;','')"/>
 					</xsl:if>
 				</w:binData>
 			</w:docOleData>
-			<xsl:if test="function-available('ole:exit')">
-				<xsl:value-of select="ole:exit($oleExtractor)"/>
-			</xsl:if>
 		</xsl:if>
 	</xsl:template>
 	<xsl:template match="draw:object-ole" mode="oledata.mso">
 		<xsl:variable name="stream-name">
 			<xsl:apply-templates select="." mode="get-number"/>
 		</xsl:variable>
-		<xsl:variable name="tmp" select="ole:insertByName($oleExtractor, $stream-name, translate(office:binary-data/text(),'&#10;&#13;&#32;','' )  )"/>
+		<xsl:variable name="tmp" select="ole:insertByName($stream-name, translate(office:binary-data/text(),'&#10;&#13;&#32;','' )  )"/>
 	</xsl:template>
 	<xsl:template match="draw:object-ole" mode="output">
 		<xsl:param name="ShapeID"/>
@@ -1879,7 +1766,4 @@
 		<xsl:number from="/office:document" level="any" count="draw:object-ole" format="1"/>
 	</xsl:template>
 	<xsl:template match="draw:object-ole"/>
-	<xalan:component prefix="oleextracter" elements="init exit" functions="getByName insertByName">
-		<xalan:script lang="javaclass" src="xalan://com.sun.star.comp.xsltfilter.XSLTFilterOLEExtracter"/>
-	</xalan:component>
 </xsl:stylesheet>
diff --git a/filter/source/xslt/import/wordml/wordml2ooo.xsl b/filter/source/xslt/import/wordml/wordml2ooo.xsl
index 1f36f19..849e4a7 100644
--- a/filter/source/xslt/import/wordml/wordml2ooo.xsl
+++ b/filter/source/xslt/import/wordml/wordml2ooo.xsl
@@ -262,87 +262,4 @@
             <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content"/>
         </style:style>
     </xsl:template>
-    <xsl:template name="ConvertMeasure">
-        <xsl:param name="TargetMeasure" select="'cm'"/>
-        <xsl:param name="TargetTruncate" select=" 'all' "/>
-        <xsl:param name="value"/>
-        <!-- When TargetTruncate ='all'  it returns the number whichsoever the return value is negative or positive
-               When TargetTruncate ='nonNegative' it only returns nonNegative number, all negative number to be returned as 0
-               When TargetTruncate ='positive" it only returns positive number, all nonPositive number to be returned as 1 -->
-        <xsl:variable name="return_value">
-            <xsl:choose>
-                <!-- remove the measure mark, if the value is null, the result should be 0. Must be the first case  -->
-                <xsl:when test="string-length(translate($value,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ','')) = 0">0</xsl:when>
-                <xsl:when test="string-length(translate($value,'-.0123456789 ','')) = 0">
-                    <xsl:value-of select="$value"/>
-                </xsl:when>
-                <xsl:when test="$TargetMeasure = 'cm'">
-                    <xsl:call-template name="convert2cm">
-                        <xsl:with-param name="value" select="$value"/>
-                    </xsl:call-template>
-                </xsl:when>
-                <xsl:when test="$TargetMeasure = 'pt'">
-                    <xsl:call-template name="convert2pt">
-                        <xsl:with-param name="value" select="$value"/>
-                    </xsl:call-template>
-                </xsl:when>
-                <xsl:when test="$TargetMeasure = 'twip'">
-                    <xsl:call-template name="convert2twip">
-                        <xsl:with-param name="value" select="$value"/>
-                    </xsl:call-template>
-                </xsl:when>
-                <xsl:when test="$TargetMeasure = 'in'">
-                    <xsl:call-template name="convert2in">
-                        <xsl:with-param name="value" select="$value"/>
-                    </xsl:call-template>
-                </xsl:when>
-            </xsl:choose>
-        </xsl:variable>
-        <xsl:choose>
-            <xsl:when test="$TargetTruncate = 'all' ">
-                <xsl:choose>
-                    <xsl:when test="number($TargetMeasure) = 'NaN' ">
-                        <xsl:value-of select=" '0' "/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:value-of select="$return_value"/>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-            <xsl:when test="$TargetTruncate = 'nonNegative' ">
-                <xsl:choose>
-                    <xsl:when test="number($TargetMeasure) = 'NaN' ">
-                        <xsl:value-of select=" '0' "/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:choose>
-                            <xsl:when test=" $return_value &lt; 0  ">
-                                <xsl:value-of select=" '0' "/>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:value-of select="$return_value"/>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-            <xsl:when test="$TargetTruncate = 'positive' ">
-                <xsl:choose>
-                    <xsl:when test="number($TargetMeasure) = 'NaN' ">
-                        <xsl:value-of select=" '1' "/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:choose>
-                            <xsl:when test=" $return_value &lt;= 0 ">
-                                <xsl:value-of select=" '1' "/>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:value-of select="$return_value"/>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
 </xsl:stylesheet>
diff --git a/filter/source/xslt/import/wordml/wordml2ooo_draw.xsl b/filter/source/xslt/import/wordml/wordml2ooo_draw.xsl
index 0a12287..448923f 100644
--- a/filter/source/xslt/import/wordml/wordml2ooo_draw.xsl
+++ b/filter/source/xslt/import/wordml/wordml2ooo_draw.xsl
@@ -25,12 +25,8 @@
   for a copy of the LGPLv3 License.
 
 -->
-<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:dat
 astyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xalan="http://xml.apache.org/xalan" xmlns:oleextracter="MyOleExtracter" xmlns:ole="java:XSLTFilterOLEExtracter" xmlns:java="http://saxon.sf.net/java-type" exclude-result-prefixes="w wx aml o dt v xalan ole oleextracter java" extension-element-prefixes="oleextracter">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:dat
 astyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:ole="http://libreoffice.org/2011/xslt/ole" exclude-result-prefixes="w wx aml o dt v">
     <xsl:include href="wordml2ooo_custom_draw.xsl"/>
-    <xsl:include href="wordml2ooo_path.xsl"/>
-    <xsl:param name="oleExtractor" as="java:com.sun.star.comp.xsltfilter.XSLTFilterOLEExtracter" select="ole:new()"/>
-    <xsl:param name="XMultiServiceFactory" as="java:com.sun.star.lang.XMultiServiceFactory" select="ole:init($oleExtractor,  'uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager')"/>
-
     
     <xsl:key name="imagedata" match="w:binData" use="@w:name"/>
     <xsl:key name="shapetype" match="v:shapetype" use="concat('#', @id)"/>
@@ -581,7 +577,6 @@
                             </xsl:when>
                         </xsl:choose>
                         <xsl:if test="parent::w:pict/o:OLEObject">
-                            <xsl:variable name="style" select="concat(@style, ';')"/>
                             <xsl:variable name="width" select="substring-before( substring-after($style,'width:') ,';')"/>
                             <xsl:variable name="height" select="substring-before(substring-after($style,'height:'),';')"/>
                             <xsl:attribute name="draw:visible-area-left">0cm</xsl:attribute>
@@ -1642,43 +1637,16 @@
         </xsl:element>
     </xsl:template>
     <xsl:template match="w:docOleData" mode="init">
-        <xsl:choose>
-            <xsl:when test="element-available('oleextracter:init')">
-                <oleextracter:init UNOURL="uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="ole:init($oleExtractor, 'uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager')"/>                    
-            </xsl:otherwise>                
-        </xsl:choose>
         <xsl:apply-templates select="w:binData[@w:name='oledata.mso']" mode="oledata.mso"/>
     </xsl:template>
-    <xsl:template match="w:docOleData" mode="exit">
-        <oleextracter:exit/>
-    </xsl:template>
     <xsl:template match="w:binData" mode="oledata.mso">
-       <!--  <xsl:choose>
-            <xsl:when test="element-available('oleextracter:getByName')">
-                <xsl:variable name="tmp" select="oleextracter:insertByName('oledata.mso', translate(text(),'&#10;&#13;&#32;','' )  )"/>
-            </xsl:when>
-            <xsl:otherwise>-->
-                <xsl:variable name="tmp" select="ole:insertByName($oleExtractor,'oledata.mso', translate(text(),'&#10;&#13;&#32;','' )  )"/>                
-       <!--      </xsl:otherwise>                
-        </xsl:choose>      -->  
+           <xsl:variable name="tmp" select="ole:insertByName('oledata.mso', translate(text(),'&#10;&#13;&#32;','' )  )"/>                
     </xsl:template>
     <xsl:template match="o:OLEObject " mode="output">
         <!-- depends on i43230,we can uncomment this code or find another way after i43230 got fixed -->
         <draw:object-ole>
             <xsl:element name="office:binary-data">
-            <!-- 
-                <xsl:choose>
-                    <xsl:when test="element-available('oleextracter:getByName')">
-                      <xsl:value-of select="translate(oleextracter:getByName(@ObjectID),'&#13;','')"/>
-                    </xsl:when>
-                    <xsl:otherwise> -->
-                       <xsl:value-of select="translate(ole:getByName($oleExtractor, at ObjectID),'&#13;','')"/>            
-                    <!-- 
-                    </xsl:otherwise>                
-                </xsl:choose> -->                         
+                <xsl:value-of select="translate(ole:getByName(@ObjectID),'&#13;','')"/>            
             </xsl:element>
         </draw:object-ole>
     </xsl:template>
@@ -2207,7 +2175,4 @@
             </xsl:otherwise>
         </xsl:choose>
     </xsl:template>
-    <xalan:component prefix="oleextracter" elements="init exit" functions="getByName insertByName">
-        <xalan:script lang="javaclass" src="xalan://com.sun.star.comp.xsltfilter.XSLTFilterOLEExtracter"/>
-    </xalan:component>
 </xsl:stylesheet>
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx
index 190c20e..18f18dc 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.cxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx
@@ -39,9 +39,13 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <libxml/xmlIO.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+#include <libxml/xmlstring.h>
 #include <libxslt/transform.h>
 #include <libxslt/xsltutils.h>
 #include <libxslt/variables.h>
+#include <libxslt/extensions.h>
 
 #include <cppuhelper/factory.hxx>
 #include <cppuhelper/servicefactory.hxx>
@@ -62,6 +66,7 @@
 #include <com/sun/star/io/XStreamListener.hpp>
 
 #include <LibXSLTTransformer.hxx>
+#include <OleHandler.hxx>
 
 using namespace ::rtl;
 using namespace ::cppu;
@@ -93,6 +98,9 @@ namespace XSLT
 
     const sal_Int32 Reader::INPUT_BUFFER_SIZE = _INPUT_BUFFER_SIZE;
 
+    /**
+     * ParserInputBufferCallback forwards IO call-backs to libxml stream IO.
+     */
     struct ParserInputBufferCallback
     {
         static int
@@ -108,6 +116,9 @@ namespace XSLT
             return tmp->closeInput();
         }
     };
+    /**
+     * ParserOutputBufferCallback forwards IO call-backs to libxml stream IO.
+     */
     struct ParserOutputBufferCallback
     {
         static int
@@ -123,6 +134,99 @@ namespace XSLT
             return tmp->closeOutput();
         }
     };
+    /**
+     * ExtFuncOleCB forwards XPath extension function calls registers with libxslt to the OleHandler instance that actually
+     * provides the implementation for those functions.
+     *
+     * The OLE extension module currently supplies to functions
+     * insertByName: registers an OLE object to be later inserted into the output tree.
+     * getByName: reads a previously registered OLE object and returns a base64 encoded string representation.
+     */
+    struct ExtFuncOleCB
+    {
+        static void *
+        init(xsltTransformContextPtr, const xmlChar*)
+        {
+            return NULL;
+        }
+        static void
+        insertByName(xmlXPathParserContextPtr ctxt, int nargs)
+        {
+            xsltTransformContextPtr tctxt;
+            void *data;
+            if (nargs != 2) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "insertByName: requires exactly 2 arguments\n");
+                return;
+            }
+            tctxt = xsltXPathGetTransformContext(ctxt);
+            if (tctxt == NULL) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "xsltExtFunctionTest: failed to get the transformation context\n");
+                return;
+            }
+            // XXX: someone with better knowledge of libxslt might come up with a better
+            // idea to pass the OleHandler than by attaching it to tctxt->_private. See also
+            // below.
+            data = tctxt->_private;
+            if (data == NULL) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "xsltExtFunctionTest: failed to get module data\n");
+                return;
+            }
+            OleHandler * oh = static_cast<OleHandler*> (data);
+
+            xmlXPathObjectPtr value = valuePop(ctxt);
+            value = ensureStringValue(value, ctxt);
+            xmlXPathObjectPtr streamName = valuePop(ctxt);
+            streamName = ensureStringValue(streamName, ctxt);
+
+            oh->insertByName(::rtl::OUString::createFromAscii((sal_Char*) streamName->stringval), ::rtl::OString((sal_Char*) value->stringval));
+            valuePush(ctxt, xmlXPathNewCString(""));
+        }
+
+        static xmlXPathObjectPtr ensureStringValue(xmlXPathObjectPtr obj, const xmlXPathParserContextPtr ctxt)
+        {
+            if (obj->type != XPATH_STRING) {
+                valuePush(ctxt, obj);
+                xmlXPathStringFunction(ctxt, 1);
+                obj = valuePop(ctxt);
+            }
+            return obj;
+        }
+
+        static void getByName(xmlXPathParserContextPtr ctxt, int nargs)
+        {
+            xsltTransformContextPtr tctxt;
+            void *data;
+            if (nargs != 1) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "getByName: requires exactly 1 argument\n");
+                return;
+            }
+
+            tctxt = xsltXPathGetTransformContext(ctxt);
+            if (tctxt == NULL) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "xsltExtFunctionTest: failed to get the transformation context\n");
+                return;
+            }
+            // XXX: someone with better knowledge of libxslt might come up with a better
+            // idea to pass the OleHandler than by attaching it to tctxt->_private
+            data = tctxt->_private;
+            if (data == NULL) {
+                xsltGenericError(xsltGenericErrorContext,
+                    "xsltExtFunctionTest: failed to get module data\n");
+                return;
+            }
+            OleHandler * oh = static_cast<OleHandler*> (data);
+            xmlXPathObjectPtr streamName = valuePop(ctxt);
+            streamName = ensureStringValue(streamName, ctxt);
+            const OString content = oh->getByName(::rtl::OUString::createFromAscii((sal_Char*) streamName->stringval));
+            valuePush(ctxt, xmlXPathNewCString(content.getStr()));
+            xmlXPathFreeObject(streamName);
+        }
+    };
 
     Reader::Reader(LibXSLTTransformer* transformer) :
         m_transformer(transformer), m_terminated(false), m_readBuf(
@@ -218,9 +322,12 @@ namespace XSLT
                 (const xmlChar *) m_transformer->getStyleSheetURL().getStr());
         xmlDocPtr result = NULL;
         xsltTransformContextPtr tcontext = NULL;
+        registerExtensionModule();
+        OleHandler* oh = new OleHandler(m_transformer->getServiceFactory());
         if (styleSheet)
             {
                 tcontext = xsltNewTransformContext(styleSheet, doc);
+                tcontext->_private = static_cast<void *> (oh);
                 xsltQuoteUserParams(tcontext, &params[0]);
                 result = xsltApplyStylesheetUser(styleSheet, doc, 0, 0, 0,
                         tcontext);
@@ -249,19 +356,33 @@ namespace XSLT
                 m_transformer->error(msg);
             }
         closeOutput();
+        delete(oh);
         xsltFreeStylesheet(styleSheet);
         xsltFreeTransformContext(tcontext);
         xmlFreeDoc(doc);
         xmlFreeDoc(result);
     }
-    ;
 
     void
     Reader::onTerminated()
     {
         m_terminated = true;
     }
-    ;
+    void
+    Reader::registerExtensionModule()
+    {
+        const xmlChar* oleModuleURI = (const xmlChar *) EXT_MODULE_OLE_URI;
+        xsltRegisterExtModule(oleModuleURI, &ExtFuncOleCB::init, NULL);
+        xsltRegisterExtModuleFunction(
+                                 (const xmlChar*) "insertByName",
+                                 oleModuleURI,
+                                 &ExtFuncOleCB::insertByName);
+        xsltRegisterExtModuleFunction(
+                                (const xmlChar*) "getByName",
+                                oleModuleURI,
+                                 &ExtFuncOleCB::getByName);
+
+    }
 
     Reader::~Reader()
     {
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.hxx b/filter/source/xsltfilter/LibXSLTTransformer.hxx
index 16396a3..d5f93b0 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.hxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.hxx
@@ -40,6 +40,7 @@
 #include <libxml/tree.h>
 #include <libxml/xmlIO.h>
 #include <libxslt/transform.h>
+#include <libxml/xpathInternals.h>
 
 #include <cppuhelper/factory.hxx>
 #include <cppuhelper/servicefactory.hxx>
@@ -70,6 +71,8 @@ using namespace ::com::sun::star::lang;
 using ::std::list;
 using ::std::map;
 
+#define EXT_MODULE_OLE_URI "http://libreoffice.org/2011/xslt/ole"
+
 namespace XSLT
 {
 
@@ -156,6 +159,11 @@ namespace XSLT
         ::std::map<const char*, OString> SAL_CALL
         getParameters();
 
+        virtual SAL_CALL
+        Reference<XMultiServiceFactory> getServiceFactory() {
+            return m_rServiceFactory;
+        }
+
     };
 
     /*
@@ -192,6 +200,8 @@ namespace XSLT
         run();
         virtual void SAL_CALL
         onTerminated();
+        void SAL_CALL
+        registerExtensionModule();
     };
 
 }
diff --git a/filter/source/xsltfilter/OleHandler.cxx b/filter/source/xsltfilter/OleHandler.cxx
new file mode 100644
index 0000000..874b288
--- /dev/null
+++ b/filter/source/xsltfilter/OleHandler.cxx
@@ -0,0 +1,249 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ *       [ Peter Jentsch <pjotr at guineapics.de> ]
+ * Portions created by the Initial Developer are Copyright (C) 2011 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Peter Jentsch <pjotr at guineapics.de>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_filter.hxx"
+
+#include <cstdio>
+#include <cstring>
+#include <list>
+#include <map>
+#include <vector>
+#include <iostream>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlIO.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/variables.h>
+#include <xmloff/xmluconv.hxx>
+#include <package/Inflater.hxx>
+#include <package/Deflater.hxx>
+
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
+#include <com/sun/star/embed/XTransactedObject.hpp>
+
+#include <OleHandler.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::embed;
+using namespace ::rtl;
+
+
+namespace XSLT
+{
+    Reference<XStream> SAL_CALL OleHandler::createTempFile() {
+        Reference<XStream>
+                tempFile(
+                        m_msf->createInstance(
+                                OUString(
+                                        RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ))),
+                        UNO_QUERY);
+        OSL_ASSERT(tempFile.is());
+        return tempFile;
+    }
+
+    void SAL_CALL OleHandler::ensureCreateRootStorage()
+    {
+        if (m_storage == NULL || m_rootStream == NULL)
+            {
+                m_rootStream = createTempFile();
+                Sequence<Any> args(1);
+                args[0] <<= m_rootStream->getInputStream();
+                OUString serviceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.OLESimpleStorage"));
+
+                Reference<XNameContainer> cont(m_msf->createInstanceWithArguments(serviceName, args), UNO_QUERY);
+                m_storage = cont;
+            }
+    }
+
+    void SAL_CALL OleHandler::initRootStorageFromBase64(const OString& content)
+    {
+        Sequence<sal_Int8> oleData;
+        SvXMLUnitConverter::decodeBase64(oleData, ::rtl::OStringToOUString(content, RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS));
+        m_rootStream = createTempFile();
+        Reference<XOutputStream> xOutput = m_rootStream->getOutputStream();
+        xOutput->writeBytes(oleData);
+        xOutput->flush();
+        //Get the input stream and seek to begin
+        Reference<XSeekable> xSeek(m_rootStream->getInputStream(), UNO_QUERY);
+        xSeek->seek(0);
+
+        //create an com.sun.star.embed.OLESimpleStorage from the temp stream
+        Sequence<Any> args(1);
+        args[0] <<= xSeek;
+        Reference<XNameContainer> cont(m_msf->createInstanceWithArguments(OUString(
+                RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.embed.OLESimpleStorage" )), args), UNO_QUERY);
+        m_storage = cont;
+    }
+
+    OString SAL_CALL
+    OleHandler::encodeSubStorage(const OUString& streamName)
+    {
+        if (!m_storage->hasByName(streamName))
+            {
+                return "Not Found:";// + streamName;
+            }
+        ;
+        Reference<XInputStream> subStream((*(Reference< XInterface > *) m_storage->getByName(streamName).getValue()), UNO_QUERY);
+        if (!subStream.is())
+            {
+                return "Not Found:";// + streamName;
+            }
+        //The first four byte are the length of the uncompressed data
+        Sequence<sal_Int8> pLength(4);
+        Reference<XSeekable> xSeek(subStream, UNO_QUERY);
+        xSeek->seek(0);
+        //Get the uncompressed length
+        int readbytes = subStream->readBytes(pLength, 4);
+        if (4 != readbytes)
+            {
+                return "Can not read the length.";
+            }
+        int oleLength = (pLength[0] << 0) + (pLength[1] << 8)
+                + (pLength[2] << 16) + (pLength[3] << 24);
+        Sequence<sal_Int8> content(oleLength);
+        //Read all bytes. The compressed length should less then the uncompressed length
+        readbytes = subStream->readBytes(content, oleLength);
+        if (oleLength < readbytes)
+            {
+                return "oleLength";// +oleLength + readBytes;
+            }
+
+        // Decompress the bytes
+        ::Inflater* decompresser = new ::Inflater(sal_False);
+        decompresser->setInput(content);
+        Sequence<sal_Int8> result(oleLength);
+        decompresser->doInflateSegment(result, 0, oleLength);
+        decompresser->end();
+        delete decompresser;
+        //return the base64 string of the uncompressed data
+        OUStringBuffer buf(oleLength);
+        SvXMLUnitConverter::encodeBase64(buf, result);
+        return ::rtl::OUStringToOString(buf.toString(), RTL_TEXTENCODING_UTF8);
+    }
+
+    void SAL_CALL
+    OleHandler::insertByName(const OUString& streamName, const OString& content)
+    {
+        if (streamName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("oledata.mso")))
+            {
+                initRootStorageFromBase64(content);
+            }
+        else
+            {
+                ensureCreateRootStorage();
+                insertSubStorage(streamName, content);
+            }
+    }
+
+    const OString
+    SAL_CALL OleHandler::getByName(const OUString& streamName)
+    {
+        if (streamName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("oledata.mso")))
+            {
+                //get the length and seek to 0
+                Reference<XSeekable> xSeek (m_rootStream, UNO_QUERY);
+                int oleLength = (int) xSeek->getLength();
+                xSeek->seek(0);
+                //read all bytes
+                Reference<XInputStream> xInput = m_rootStream->getInputStream();
+                Sequence<sal_Int8> oledata(oleLength);
+                xInput->readBytes(oledata, oleLength);
+                //return the base64 encoded string
+                OUStringBuffer buf(oleLength);
+                SvXMLUnitConverter::encodeBase64(buf, oledata);
+                return ::rtl::OUStringToOString(buf.toString(), RTL_TEXTENCODING_UTF8);
+            }
+        else
+            {
+                return encodeSubStorage(streamName);
+            }
+        return "";
+    }
+
+    void SAL_CALL
+    OleHandler::insertSubStorage(const OUString& streamName, const OString& content)
+    {
+        //decode the base64 string
+        Sequence<sal_Int8> oledata;
+        SvXMLUnitConverter::decodeBase64(oledata, rtl::OUString::createFromAscii(content));
+        //create a temp stream to write data to
+        Reference<XStream> subStream = createTempFile();
+        Reference<XInputStream> xInput = subStream->getInputStream();
+        Reference<XOutputStream> xOutput = subStream->getOutputStream();
+        //write the length to the temp stream
+        Sequence<sal_Int8> header(4);
+        header[0] = (sal_Int8) (oledata.getLength() >> 0) & 0xFF;
+        header[1] = (sal_Int8) (oledata.getLength() >> 8) & 0xFF;
+        header[2] = (sal_Int8) (oledata.getLength() >> 16) & 0xFF;
+        header[3] = (sal_Int8) (oledata.getLength() >> 24) & 0xFF;
+        xOutput->writeBytes(header);
+
+        // Compress the bytes
+        Sequence<sal_Int8> output(oledata.getLength());
+        ::Deflater* compresser = new ::Deflater((sal_Int32) 3, sal_False);
+        compresser->setInputSegment(oledata, 0, oledata.getLength());
+        compresser->finish();
+        int compressedDataLength = compresser->doDeflateSegment(output, 0, oledata.getLength());
+        delete(compresser);
+        //realloc the data length
+        Sequence<sal_Int8> compressed(compressedDataLength);
+        for (int i = 0; i < compressedDataLength; i++) {
+            compressed[i] = output[i];
+        }
+
+        //write the compressed data to the temp stream
+        xOutput->writeBytes(compressed);
+        //seek to 0
+        Reference<XSeekable> xSeek(xInput, UNO_QUERY);
+        xSeek->seek(0);
+
+        //insert the temp stream as a sub stream and use an XTransactedObject to commit it immediately
+        Reference<XTransactedObject> xTransact(m_storage, UNO_QUERY);
+        Any entry;
+        entry <<= xInput;
+        m_storage->insertByName(streamName, entry);
+        xTransact->commit();
+    }
+
+
+
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/filter/source/xsltfilter/OleHandler.hxx b/filter/source/xsltfilter/OleHandler.hxx
new file mode 100644
index 0000000..1452b1a
--- /dev/null
+++ b/filter/source/xsltfilter/OleHandler.hxx
@@ -0,0 +1,111 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ *       [ Peter Jentsch <pjotr at guineapics.de> ]
+ * Portions created by the Initial Developer are Copyright (C) 2011 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Peter Jentsch <pjotr at guineapics.de>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#ifndef OLEHANDLER_HXX_
+#define OLEHANDLER_HXX_
+#include <cstdio>
+#include <cstring>
+#include <list>
+#include <map>
+#include <vector>
+#include <iostream>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlIO.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/variables.h>
+#include <xmloff/xmluconv.hxx>
+
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <cppuhelper/implbase4.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <osl/module.h>
+#include <osl/file.hxx>
+#include <osl/process.h>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/io/XStream.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::io;
+using namespace ::rtl;
+
+namespace XSLT
+{
+    /*
+     * OleHandler provides implementations for the XSLT extension functions used by the WordML 2003 XSLT filters.
+     *
+     * The extension functions takes base64 encoded string representations of embedded OLE objects provided by the XML filter framework,
+     * stores them into a com.sun.star.embed.OLESimpleStorage and retrieves them later as individual base64 OLE objects.
+     *
+     * The implementation is ported from the former Java based implementation XSLTOleExtrater (sic)
+     *
+     * I believe the whole thing should provide round-trip editing of embedded OLE objects.
+     * I'm not sure if it currently does anything meaningful, because the Java implementation seems to be broken both in OOo and LibO.
+     *
+     */
+    class OleHandler
+    {
+    public:
+        OleHandler(const Reference<XMultiServiceFactory>& msf){
+            m_msf =msf;
+        }
+        void SAL_CALL
+        insertByName(const OUString& streamName, const OString& content);
+        const OString SAL_CALL
+        getByName(const OUString& streamName);
+
+    private:
+        Reference<XMultiServiceFactory> m_msf;
+        Reference<XNameContainer> m_storage;
+        Reference<XStream> m_rootStream;
+        void SAL_CALL
+        ensureCreateRootStorage();
+        OString SAL_CALL
+        encodeSubStorage(const OUString& streamName);
+        void SAL_CALL
+        insertSubStorage(const OUString& streamName, const OString& content);
+        void SAL_CALL
+        initRootStorageFromBase64(const OString& content);
+        Reference<XStream> SAL_CALL
+        createTempFile();
+    };
+}
+
+
+#endif /* OLEHANDLER_HXX_ */
diff --git a/filter/source/xsltfilter/makefile.mk b/filter/source/xsltfilter/makefile.mk
index 6405fa7..473c98f 100644
--- a/filter/source/xsltfilter/makefile.mk
+++ b/filter/source/xsltfilter/makefile.mk
@@ -43,7 +43,7 @@ LIBXSLTINCDIR=external$/libxslt
 CFLAGS+= -I$(SOLARINCDIR)$/$(LIBXSLTINCDIR)
 .ENDIF
 
-SLOFILES=$(SLO)$/XSLTFilter.obj $(SLO)$/LibXSLTTransformer.obj $(SLO)$/fla.obj
+SLOFILES=$(SLO)$/XSLTFilter.obj $(SLO)$/LibXSLTTransformer.obj $(SLO)$/fla.obj $(SLO)/OleHandler.obj
 LIBNAME=xsltfilter
 SHL1TARGETDEPN=makefile.mk
 SHL1OBJS=$(SLOFILES)
@@ -60,7 +60,8 @@ SHL1STDLIBS= \
     $(XMLOFFLIB) \
     $(SALLIB) \
     $(LIBXML2LIB) \
-    $(XSLTLIB)
+    $(XSLTLIB) \
+    $(PACKAGE2LIB)
 
 .IF "$(SOLAR_JAVA)"!=""
 


More information about the Libreoffice-commits mailing list