diff options
author | Henning Brinkmann <hbrinkm@openoffice.org> | 2009-07-22 12:49:19 +0200 |
---|---|---|
committer | Henning Brinkmann <hbrinkm@openoffice.org> | 2009-07-22 12:49:19 +0200 |
commit | 235cea0dd1033f42933efcb494510a58606b7a6c (patch) | |
tree | 0d7b4f5989c5c5e256b34f90d241c66f71d5802e /writerfilter | |
parent | f0a58903c4ceb6a223799877aeda3ac27c4307db (diff) |
#i100754# initial version of new code generation
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 7 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 69 | ||||
-rw-r--r-- | writerfilter/source/ooxml/makefile.mk | 36 | ||||
-rw-r--r-- | writerfilter/source/ooxml/resourcestools.xsl | 705 |
4 files changed, 769 insertions, 48 deletions
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index f6f5f1ca7774..c9c6d6379989 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -41,6 +41,8 @@ #include "Handler.hxx" #include "ooxmlLoggers.hxx" +static const ::rtl::OUString aEmptyStr; + static const sal_uInt8 s0x7[] = { 0x7, 0x0 }; static const sal_uInt8 s0xd[] = { 0xd, 0x0 }; static const sal_uInt8 sCR[] = { 0xd, 0x0 }; @@ -985,6 +987,11 @@ void OOXMLFastContextHandler::clearProps() setPropertySet(OOXMLPropertySet::Pointer_t(new OOXMLPropertySetImpl())); } +const ::rtl::OUString & OOXMLFastContextHandler::getText() const +{ + return aEmptyStr; +} + void OOXMLFastContextHandler::setDocument(OOXMLDocument * pDocument) { mpParserState->setDocument(pDocument); diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index 479cf0e4e78f..7a31d044e2ff 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -191,6 +191,41 @@ public: sal_uInt32 getInstanceNumber() const; + void sendTableDepth() const; + void setHandle(); + + void startSectionGroup(); + void setLastParagraphInSection(); + void endSectionGroup(); + void startParagraphGroup(); + void endParagraphGroup(); + void startCharacterGroup(); + void endCharacterGroup(); + + void startField(); + void fieldSeparator(); + void endField(); + void ftnednref(); + void ftnedncont(); + void ftnednsep(); + void pgNum(); + void tab(); + void cr(); + void noBreakHyphen(); + void softHyphen(); + void handleLastParagraphInSection(); + void endOfParagraph(); + void text(const ::rtl::OUString & sText); + virtual void propagateCharacterProperties(); + virtual void propagateCharacterPropertiesAsSet(const Id & rId); + virtual bool propagatesProperties() const; + void sendPropertiesWithId(const Id & rId); + void propagateTableProperties(); + void clearProps(); + + const ::rtl::OUString & getText() const; + + void sendPropertyToParent(); static void dumpOpenContexts(); protected: @@ -241,40 +276,6 @@ protected: (const ::rtl::OUString & rId); virtual void resolvePropertySetAttrs(); - void sendTableDepth() const; - void setHandle(); - - void startSectionGroup(); - void setLastParagraphInSection(); - void endSectionGroup(); - void startParagraphGroup(); - void endParagraphGroup(); - void startCharacterGroup(); - void endCharacterGroup(); - - void startField(); - void fieldSeparator(); - void endField(); - void ftnednref(); - void ftnedncont(); - void ftnednsep(); - void pgNum(); - void tab(); - void cr(); - void noBreakHyphen(); - void softHyphen(); - void handleLastParagraphInSection(); - void endOfParagraph(); - void text(const ::rtl::OUString & sText); - virtual void propagateCharacterProperties(); - virtual void propagateCharacterPropertiesAsSet(const Id & rId); - virtual bool propagatesProperties() const; - void sendPropertiesWithId(const Id & rId); - void propagateTableProperties(); - void clearProps(); - - void sendPropertyToParent(); - uno::Reference< uno::XComponentContext > getComponentContext(); sal_uInt32 mnInstanceNumber; diff --git a/writerfilter/source/ooxml/makefile.mk b/writerfilter/source/ooxml/makefile.mk index 6eab209be473..07720da4fb49 100644 --- a/writerfilter/source/ooxml/makefile.mk +++ b/writerfilter/source/ooxml/makefile.mk @@ -74,9 +74,14 @@ NAMESPACES= \ SLOFASTNAMESPACES= \ $(SLO)$/OOXMLfastresources_{$(NAMESPACES)}.obj + +SLOFACTORIESNAMESPACES= \ + $(SLO)$/OOXMLFactory_{$(NAMESPACES)}.obj SLOFILES= \ + $(SLOFACTORIESNAMESPACES) \ $(SLOFASTNAMESPACES) \ + $(SLO)$/OOXMLFactory.obj \ $(SLO)$/OOXMLBinaryObjectReference.obj\ $(SLO)$/OOXMLfastresources.obj \ $(SLO)$/OOXMLvalues.obj \ @@ -134,6 +139,9 @@ OOXMLHXXOUTDIRCREATED=$(OOXMLHXXOUTDIR)/created OOXMLFASTRESOURCECXXS=$(OOXMLCXXOUTDIR)$/OOXMLfastresources_{$(NAMESPACES)}.cxx OOXMLFASTRESOURCEHXXS=$(OOXMLHXXOUTDIR)$/OOXMLfastresources_{$(NAMESPACES)}.hxx +OOXMLFACTORYCXXS=$(OOXMLCXXOUTDIR)$/OOXMLFactory_{$(NAMESPACES)}.cxx +OOXMLFACTORYHXXS=$(OOXMLHXXOUTDIR)$/OOXMLFactory_{$(NAMESPACES)}.hxx + OOXMLMODEL=model.xml OOXMLPREPROCESSXSL=modelpreprocess.xsl OOXMLRESOURCESTOOLSXSL=resourcestools.xsl @@ -154,6 +162,8 @@ OOXMLRESOURCEIDSHXX=$(OOXMLHXXOUTDIR)$/resourceids.hxx TOKENXML=$(OOXMLCXXOUTDIR)$/token.xml TOKENXMLTMP=$(OOXMLCXXOUTDIR)$/token.tmp +OOXMLFACTORYGENERATEDHXX=$(OOXMLHXXOUTDIR)$/OOXMLFactory_generated.hxx +OOXMLFACTORYGENERATEDCXX=$(OOXMLCXXOUTDIR)$/OOXMLFactory_generated.cxx OOXMLFASTTOKENSHXX=$(OOXMLHXXOUTDIR)$/OOXMLFastTokens.hxx OOXMLFASTRESOURCESHXX=$(OOXMLHXXOUTDIR)$/OOXMLfastresources.hxx OOXMLNAMESPACEIDSHXX=$(OOXMLHXXOUTDIR)$/OOXMLnamespaceids.hxx @@ -164,6 +174,8 @@ GPERFFASTTOKENHXX=$(OOXMLHXXOUTDIR)$/gperffasttoken.hxx MODELPROCESSED=$(MISC)$/model_preprocessed.xml OOXMLGENHEADERS= \ + $(OOXMLFACTORYGENERATEDHXX) \ + $(OOXMLFACTORYHXXS) \ $(OOXMLFASTRESOURCESHXX) \ $(OOXMLFASTTOKENSHXX) \ $(OOXMLVALUESHXX) \ @@ -175,6 +187,8 @@ OOXMLGENHEADERS= \ GENERATEDFILES= \ $(OOXMLGENHEADERS) \ $(MODELPROCESSED) \ + $(OOXMLFACTORYGENERATEDCXX) \ + $(OOXMLFACTORYCXXS) \ $(OOXMLFASTRESOURCECXXS) \ $(OOXMLVALUESCXX) \ $(TOKENXMLTMP) \ @@ -205,16 +219,36 @@ $(OOXMLFASTRESOURCESCXX): $(OOXMLFASTRESOURCEHXXS) \ $(OOXMLFASTRESOURCESIMPLXSL) $(MODELPROCESSED) $(XSLTPROC) $(OOXMLFASTRESOURCESIMPLXSL) $(MODELPROCESSED) > $@ +$(OOXMLFACTORYGENERATEDHXX): factoryinc.xsl + $(XSLTPROC) $< $(MODELPROCESSED) > $@ + +$(OOXMLFACTORYGENERATEDCXX): factoryimpl.xsl + $(XSLTPROC) $< $(MODELPROCESSED) > $@ + +$(OOXMLFACTORYGENERATEDCXX): $(MODELPROCESSED) + +$(OOXMLFACTORYGENERATEDHXX): $(MODELPROCESSED) + $(OOXMLFASTRESOURCECXXS): $(MODELPROCESSED) $(OOXMLFASTRESOURCEHXXS): $(MODELPROCESSED) +$(OOXMLFACTORYCXXS): $(MODELPROCESSED) + +$(OOXMLFACTORYHXXS): $(MODELPROCESSED) + $(OOXMLCXXOUTDIR)$/OOXMLfastresources%.cxx: fastresourcesimpl_ns.xsl $(XSLTPROC) --stringparam file $@ $< $(MODELPROCESSED) > $@ $(OOXMLHXXOUTDIR)$/OOXMLfastresources%.hxx: fastresources_ns.xsl $(XSLTPROC) --stringparam file $@ $< $(MODELPROCESSED) > $@ +$(OOXMLCXXOUTDIR)$/OOXMLFactory%.cxx: factoryimpl_ns.xsl + $(XSLTPROC) --stringparam file $@ $< $(MODELPROCESSED) > $@ + +$(OOXMLHXXOUTDIR)$/OOXMLFactory%.hxx: factory_ns.xsl + $(XSLTPROC) --stringparam file $@ $< $(MODELPROCESSED) > $@ + $(OOXMLVALUESHXX): $(OOXMLVALUESXSL) $(MODELPROCESSED) $(XSLTPROC) $(OOXMLVALUESXSL) $(MODELPROCESSED) > $@ @@ -235,6 +269,8 @@ $(GPERFFASTTOKENHXX): $(OOXMLGPERFFASTTOKENXSL) $(MODELPROCESSED) $(SLOFASTNAMESPACES): $(OOXMLFASTRESOURCESCXX) $(OOXMLGENHEADERS) +$(SLOFACTORIESNAMESPACES): $(OOXMLFACTORYSCXXS) $(OOXMLGENHEADERS) + $(GENERATEDFILES): $(OOXMLRESOURCESTOOLSXSL) $(SLOFILES): $(OOXMLGENHEADERS) diff --git a/writerfilter/source/ooxml/resourcestools.xsl b/writerfilter/source/ooxml/resourcestools.xsl index 9b17e4d3126f..2c2f7d73ff1f 100644 --- a/writerfilter/source/ooxml/resourcestools.xsl +++ b/writerfilter/source/ooxml/resourcestools.xsl @@ -1,4 +1,4 @@ -<!-- +<!-- /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -63,6 +63,7 @@ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xalan="http://xml.apache.org/xalan" xmlns:UML = 'org.omg.xmi.namespace.UML' + xmlns:common="http://exslt.org/common" exclude-result-prefixes = "xalan" xml:space="default"> <xsl:output method="text" /> @@ -249,15 +250,13 @@ const Token_t OOXML_FAST_TOKENS_END =</xsl:text> node according to the current <define>. --> <xsl:template name="contextresource"> - <xsl:variable name="mynsid" select="generate-id(ancestor::namespace)"/> - <xsl:choose> - <xsl:when test="count(key('context-resource', @name)) = 1"> - <xsl:value-of select="key('context-resource', @name)/@resource"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="key('context-resource', @name)[generate-id(ancestor::namespace)=$mynsid]/@resource"/> - </xsl:otherwise> - </xsl:choose> + <xsl:variable name="name" select="@name"/> + <xsl:variable name="nsid" select="generate-id(ancestor::namespace)"/> + <xsl:for-each select="key('context-resource', @name)"> + <xsl:if test="generate-id(ancestor::namespace) = $nsid"> + <xsl:value-of select="@resource"/> + </xsl:if> + </xsl:for-each> </xsl:template> <!-- @@ -2158,11 +2157,27 @@ void dumpAttribs <xsl:value-of select="@name"/> </xsl:template> +<xsl:template name="idfornamespace"> + <xsl:text>NN_</xsl:text> + <xsl:value-of select="translate(@name, '-', '_')"/> +</xsl:template> + +<xsl:template name="localidfordefine"> + <xsl:text>DEFINE_</xsl:text> + <xsl:value-of select="@name"/> +</xsl:template> + +<xsl:template name="idfordefine"> + <xsl:for-each select="ancestor::namespace"> + <xsl:call-template name="idfornamespace"/> + </xsl:for-each> + <xsl:text>|</xsl:text> + <xsl:call-template name="localidfordefine"/> +</xsl:template> + <xsl:template name="caselabeldefine"> - <xsl:text>case CLASS_</xsl:text> - <xsl:value-of select="translate(ancestor::namespace/@name, '-', '_')"/> - <xsl:text>_</xsl:text> - <xsl:value-of select="@name"/> + <xsl:text>case </xsl:text> + <xsl:call-template name="idfordefine"/> <xsl:text>:</xsl:text> </xsl:template> @@ -2249,4 +2264,666 @@ uno::Reference<XFastContextHandler> </xsl:text> </xsl:text> </xsl:template> +<!-- *** Factory *** --> + +<xsl:template name="factoryattributetoresourcemapinner"> + <xsl:for-each select=".//rng:attribute"> + <xsl:variable name="resource"> + <xsl:for-each select="rng:ref"> + <xsl:value-of select="key('context-resource', @name)/@resource"/> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($resource) > 0"> + <xsl:text> + (*pMap)[</xsl:text> + <xsl:call-template name="fasttoken"/> + <xsl:text>] = RT_</xsl:text> + <xsl:value-of select="$resource"/> + <xsl:text>;</xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:call-template name="factoryattributetoresourcemapinner"/> + </xsl:for-each> +</xsl:template> + +<!-- factoryattributetoresourcemap --> +<xsl:template name="factoryattributetoresourcemap"> + <xsl:text> +AttributeToResourceMapPointer </xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>::createAttributeToResourceMap(Id nId) +{ + AttributeToResourceMapPointer pMap(new AttributeToResourceMap()); + + switch (nId) + {</xsl:text> + <xsl:for-each select="rng:grammar/rng:define"> + <xsl:variable name="inner"> + <xsl:call-template name="factoryattributetoresourcemapinner"/> + </xsl:variable> + <xsl:if test="string-length($inner) > 0"> + <xsl:text> + </xsl:text> + <xsl:call-template name="caselabeldefine"/> + <xsl:value-of select="$inner"/> + <xsl:text> + break;</xsl:text> + </xsl:if> + </xsl:for-each> + default: + break; + } + + return pMap; +} +</xsl:template> + +<!-- factorylistvaluemap --> +<xsl:template name="factorylistvaluemap"> + <xsl:text> +ListValueMapPointer </xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>::createListValueMap(Id nId) +{ + ListValueMapPointer pMap(new ListValueMap()); + + switch (nId) + {</xsl:text> + <xsl:for-each select="resource[@resource='List']"> + <xsl:text> + </xsl:text> + <xsl:call-template name="caselabeldefine"/> + <xsl:for-each select="value"> + <xsl:text> + (*pMap)[</xsl:text> + <xsl:call-template name="valuestringname"> + <xsl:with-param name="string" select="text()"/> + </xsl:call-template> + <xsl:text>] = </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@tokenid"/> + </xsl:call-template> + <xsl:text>;</xsl:text> + </xsl:for-each> + <xsl:text> + break;</xsl:text> + </xsl:for-each> + <xsl:text> + default: + break; + } + + return pMap; +}</xsl:text> +</xsl:template> + +<xsl:template name="idforref"> + <xsl:variable name="name" select="@name"/> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$name]"> + <xsl:call-template name="idfordefine"/> + </xsl:for-each> +</xsl:template> + +<!-- factoryelementtoresorucemapinner --> +<xsl:template name="factorycreateelementmapinner"> + <xsl:for-each select=".//rng:element"> + <xsl:variable name="resource"> + <xsl:for-each select="rng:ref"> + <xsl:call-template name="contextresource"/> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($resource) > 0"> + <xsl:text> + (*pMap)[</xsl:text> + <xsl:call-template name="fasttoken"/> + <xsl:text>] = CreateElement(RT_</xsl:text> + <xsl:value-of select="$resource"/> + <xsl:text>, </xsl:text> + <xsl:for-each select="rng:ref"> + <xsl:call-template name="idforref"/> + </xsl:for-each> + <xsl:text>);</xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:variable name="name" select="@name"/> + <xsl:variable name="block"> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$name]"> + <xsl:call-template name="factorycreateelementmapinner"/> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($block) > 0"> + <xsl:text> + /* ref: </xsl:text> + <xsl:value-of select="$name"/> + <xsl:text>*/</xsl:text> + <xsl:value-of select="$block"/> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factorycreateelementmapfromstart"> + <xsl:for-each select="start"> + <xsl:variable name="name" select="@name"/> + <xsl:variable name="block"> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$name]"> + <xsl:call-template name="factorycreateelementmapinner"> + </xsl:call-template> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($block) > 0"> + <xsl:text> + /* start: </xsl:text> + <xsl:value-of select="$name"/> + <xsl:text>*/</xsl:text> + <xsl:value-of select="$block"/> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<!-- factoryelementtoresourcemap --> +<xsl:template name="factorycreateelementmap"> + <xsl:text> +CreateElementMapPointer </xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>::createCreateElementMap(Id nId) +{ + CreateElementMapPointer pMap(new CreateElementMap()); + + switch (nId) + {</xsl:text> + <xsl:for-each select="rng:grammar/rng:define"> + <xsl:variable name="inner"> + <xsl:call-template name="factorycreateelementmapinner"/> + </xsl:variable> + <xsl:if test="string-length($inner) > 0"> + <xsl:text> + </xsl:text> + <xsl:call-template name="caselabeldefine"/> + <xsl:value-of select="$inner"/> + <xsl:text> + break;</xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:text> + default:</xsl:text> + <xsl:call-template name="factorycreateelementmapfromstart"/> + <xsl:text> + break; + } + + return pMap; +}</xsl:text> +</xsl:template> + + <!-- + Chooses the action for the current <action> element. + --> + <xsl:template name="factorychooseaction"> + <xsl:if test="@tokenid"> + <xsl:text> + if (sal::static_int_cast<Id>(pHandler->getId()) == </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@tokenid"/> + </xsl:call-template> + <xsl:text>) + {</xsl:text> + </xsl:if> + <xsl:for-each select="./cond"> + <xsl:text> + { + OOXMLPropertySetEntryToInteger aHandler(</xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@tokenid"/> + </xsl:call-template> + <xsl:text>); + dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler)->getPropertySetAttrs()->resolve(aHandler); + + if (sal::static_int_cast<Id>(aHandler.getValue()) == </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@value"/> + </xsl:call-template> + <xsl:text>) + {</xsl:text> + </xsl:for-each> + <xsl:choose> + <xsl:when test="@action='handleXNotes' or + @action='handleHdrFtr' or + @action='handleComment' or + @action='handlePicture' or + @action='handleBreak' or + @action='handleOLE'"> + <xsl:text> + dynamic_cast<OOXMLFastContextHandlerProperties*>(pHandler)-></xsl:text> + <xsl:value-of select="@action"/> + <xsl:text>();</xsl:text> + </xsl:when> + <xsl:when test="@action='propagateCharacterPropertiesAsSet'"> + <xsl:text> + pHandler->propagateCharacterPropertiesAsSet(</xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@sendtokenid"/> + </xsl:call-template> + <xsl:text>);</xsl:text> + </xsl:when> + <xsl:when test="@action='startCell' or @action='endCell'"> + <xsl:text> + dynamic_cast<OOXMLFastContextHandlerTextTableCell*>(pHandler)-></xsl:text> + <xsl:value-of select="@action"/> + <xsl:text>();</xsl:text> + </xsl:when> + <xsl:when test="@action='sendProperty' or @action='handleHyperlink'"> + <xsl:text> + dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler)-></xsl:text> + <xsl:value-of select="@action"/> + <xsl:text>();</xsl:text> + </xsl:when> + <xsl:when test="@action='fieldstart'"> + <xsl:text> + pHandler->startField();</xsl:text> + </xsl:when> + <xsl:when test="@action='fieldsep'"> + <xsl:text> + pHandler->fieldSeparator();</xsl:text> + </xsl:when> + <xsl:when test="@action='fieldend'"> + <xsl:text> + pHandler->endField();</xsl:text> + </xsl:when> + <xsl:when test="@action='printproperty'"> + <xsl:text> + dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler)->sendProperty(</xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@sendtokenid"/> + </xsl:call-template> + <xsl:text>);</xsl:text> + </xsl:when> + <xsl:when test="@action='sendPropertiesWithId'"> + <xsl:text> + pHandler->sendPropertiesWithId(</xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@sendtokenid"/> + </xsl:call-template> + <xsl:text>);</xsl:text> + </xsl:when> + <xsl:when test="@action='text'"> + pHandler->text(sText); + </xsl:when> + <xsl:when test="@action='newProperty'"> + <xsl:text> + OOXMLFastHelper<OOXMLIntegerValue>::newProperty(pHandler, </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@tokenid"/> + </xsl:call-template> + <xsl:text>, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>")));</xsl:text> + </xsl:when> + <xsl:when test="@action='mark'"> + <xsl:text> + OOXMLFastHelper<OOXMLIntegerValue>::mark(pHandler, </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id" select="@sendtokenid"/> + </xsl:call-template> + <xsl:text>, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>")));</xsl:text> + </xsl:when> + <xsl:when test="@action='tokenproperty'"> + <xsl:text> + OOXMLFastHelper<OOXMLIntegerValue>::newProperty(pHandler, </xsl:text> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id">ooxml:token</xsl:with-param> + </xsl:call-template> + <xsl:text>, pHandler->getToken());</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text> + pHandler-></xsl:text> + <xsl:value-of select="@action"/> + <xsl:text>();</xsl:text> + </xsl:otherwise> + </xsl:choose> + <xsl:for-each select="./cond"> + <xsl:text> + } + }</xsl:text> + </xsl:for-each> + <xsl:if test="@tokenid"> + <xsl:text> + }</xsl:text> + </xsl:if> + </xsl:template> + +<!-- factoryaction --> +<xsl:template name="factoryaction"> + <xsl:param name="action"/> + <xsl:text> +void </xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>::</xsl:text> + <xsl:value-of select="$action"/> + <xsl:text>Action(OOXMLFastContextHandler * pHandler</xsl:text> + <xsl:if test="$action='characters'"> + <xsl:text>, const ::rtl::OUString & sText</xsl:text> + </xsl:if> + <xsl:text>) +{ + switch (pHandler->getId()) + {</xsl:text> + <xsl:for-each select="resource[action/@name=$action]"> + <xsl:text> + </xsl:text> + <xsl:call-template name="caselabeldefine"/> + <xsl:for-each select="action[@name=$action]"> + <xsl:call-template name="factorychooseaction"/> + </xsl:for-each> + <xsl:text> + break;</xsl:text> + </xsl:for-each> + <xsl:text> + default: + break; + } +}</xsl:text> +</xsl:template> + +<!-- Key: actions" --> +<xsl:key name="actions" match="/model/namespace/resource/action" + use="@name"/> + +<!-- factoryactions --> +<xsl:template name="factoryactions"> + <xsl:variable name="ns" select="@name"/> + <xsl:for-each select="resource/action"> + <xsl:sort select="@name"/> + <xsl:if test="generate-id(key('actions', @name)[ancestor::namespace/@name=$ns][1]) = generate-id(.)"> + <xsl:variable name="name" select="@name"/> + <xsl:for-each select="ancestor::namespace"> + <xsl:call-template name="factoryaction"> + <xsl:with-param name="action" select="$name"/> + </xsl:call-template> + </xsl:for-each> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factoryactiondecls"> + <xsl:variable name="ns" select="@name"/> + <xsl:for-each select="resource/action"> + <xsl:sort select="@name"/> + <xsl:if test="generate-id(key('actions', @name)[ancestor::namespace/@name=$ns][1]) = generate-id(.)"> + <xsl:text> + void </xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>Action(OOXMLFastContextHandler * pHandler</xsl:text> + <xsl:if test="@name='characters'"> + <xsl:text>, const ::rtl::OUString & sText</xsl:text> + </xsl:if> + <xsl:text>);</xsl:text> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<!-- factoryclassname --> +<xsl:template name="factoryclassname"> + <xsl:text>OOXMLFactory_</xsl:text> + <xsl:value-of select="translate(@name, '-', '_')"/> +</xsl:template> + +<!-- factorydecl --> +<xsl:template name="factorydecl"> + <xsl:variable name="classname"> + <xsl:call-template name="factoryclassname"/> + </xsl:variable> + <xsl:text> +class </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text> : public OOXMLFactory_ns +{ +public: + typedef boost::shared_ptr < OOXMLFactory_ns > Pointer_t; + + static Pointer_t getInstance(); + + virtual AttributeToResourceMapPointer createAttributeToResourceMap(Id nId); + virtual ListValueMapPointer createListValueMap(Id nId); + virtual CreateElementMapPointer createCreateElementMap(Id nId);</xsl:text> + <xsl:call-template name="factoryactiondecls"/> + <xsl:text> + + virtual ~</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>(); + +protected: + static Pointer_t m_pInstance; + + </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>(); +}; + </xsl:text> +</xsl:template> + +<xsl:template name="factoryincludes"> + <xsl:for-each select="/model/namespace"> + <xsl:text> +#include "</xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>.hxx"</xsl:text> + </xsl:for-each> +</xsl:template> + +<xsl:template name="getfactoryfornamespace"> + <xsl:text> +OOXMLFactory_ns::Pointer_t OOXMLFactory::getFactoryForNamespace(Id nId) +{ + OOXMLFactory_ns::Pointer_t pResult; + + switch (nId & 0xffff0000) + {</xsl:text> + <xsl:for-each select="/model/namespace"> + <xsl:text> + case </xsl:text> + <xsl:call-template name="idfornamespace"/> + <xsl:text>: + pResult.reset(</xsl:text> + <xsl:call-template name="factoryclassname"/> + <xsl:text>::getInstance()); + break;</xsl:text> + </xsl:for-each> + <xsl:text> + default: + break; + } + + return aResult; +} +</xsl:text> +</xsl:template> + +<xsl:template name="factorynamespaceiddecls"> + <xsl:for-each select="/model/namespace"> + <xsl:sort select="@name"/> + <xsl:text> +extern const Id </xsl:text> + <xsl:call-template name="idfornamespace"/> + <xsl:text>;</xsl:text> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factorynamespaceidimpls"> + <xsl:for-each select="/model/namespace"> + <xsl:sort select="@name"/> + <xsl:text> +const Id </xsl:text> + <xsl:call-template name="idfornamespace"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="position()"/> + <xsl:text> << 16;</xsl:text> + </xsl:for-each> +</xsl:template> + +<xsl:key name="definename" match="//rng:define" use="@name"/> + +<xsl:template name="factorydefineiddecls"> + <xsl:for-each select="//rng:define"> + <xsl:sort select="@name"/> + <xsl:if test="generate-id(key('definename', @name)[1]) = generate-id(.)"> + <xsl:text> +extern const Id </xsl:text> + <xsl:call-template name="localidfordefine"/> + <xsl:text>;</xsl:text> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factorydefineidimpls"> + <xsl:for-each select="//rng:define"> + <xsl:sort select="@name"/> + <xsl:if test="generate-id(key('definename', @name)[1]) = generate-id(.)"> + <xsl:text> +const Id </xsl:text> + <xsl:call-template name="localidfordefine"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="position()"/> + <xsl:text>;</xsl:text> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factorymutex"> + <xsl:call-template name="factoryclassname"/> + <xsl:text>_Mutex</xsl:text> +</xsl:template> + +<xsl:template name="factorymutexdecl"> + <xsl:variable name="classname"> + <xsl:call-template name="factoryclassname"/> + </xsl:variable> + <xsl:text> +typedef rtl::Static < osl::Mutex, </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text> > </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>_Mutex; +</xsl:text> +</xsl:template> + +<xsl:template name="factoryconstructor"> + <xsl:variable name="classname"> + <xsl:call-template name="factoryclassname"/> + </xsl:variable> + <xsl:text> +</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>() +{ + // multi-thread-safe mutex for all platforms + + osl::MutexGuard aGuard(</xsl:text> + <xsl:call-template name="factorymutex"/> + <xsl:text>::get()); +} +</xsl:text> +</xsl:template> + +<xsl:template name="factorydestructor"> + <xsl:variable name="classname"> + <xsl:call-template name="factoryclassname"/> + </xsl:variable> + <xsl:text> +</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>::~</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>() +{ +} +</xsl:text> +</xsl:template> + +<xsl:template name="factorygetinstance"> + <xsl:variable name="classname"> + <xsl:call-template name="factoryclassname"/> + </xsl:variable> + <xsl:text> +OOXMLFactory_ns::Pointer_t </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>::m_pInstance; + +OOXMLFactory_ns::Pointer_t </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>::getInstance() +{ + if (m_pInstance.get() == NULL) + m_pInstance.reset(new </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>()); + + return m_pInstance; +} +</xsl:text> +</xsl:template> + +<xsl:key name="resources" match="/model/namespace/resource" use="@resource"/> + +<xsl:template name="resources"> + <xsl:for-each select="/model/namespace/resource"> + <xsl:if test="generate-id(key('resources', @resource)[1])=generate-id(.)"> + <xsl:text>RT_</xsl:text> + <xsl:value-of select="@resource"/> + <xsl:text>,
</xsl:text> + </xsl:if> + </xsl:for-each> +</xsl:template> + +<xsl:template name="factorycreatecontext"> + <xsl:text> +uno::Reference< xml::sax::XFastContextHandler > OOXMLFactory::createFastChildContext +(OOXMLFastContextHandler * pHandler, Token_t Element) +{ + uno::Reference > xml::sax::XFastContextHandler < aResult; + Id nId = pHandler->getId(); + + OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nId); + + if (pFactory.get() != NULL) + { + CreateElementMapPointer pMap = pFactory->getCreateElementMap(nId); + + if (pMap.get() != NULL) + { + CreateElement aCreateElement = (*pMap)[Element]; + + switch (aCreateElement.m_nResource) + {</xsl:text> + <xsl:for-each select="/model/namespace/resource"> + <xsl:if test="generate-id(key('resources', @resource)) = generate-id(.)"> + <xsl:text> + case RT_</xsl:text> + <xsl:value-of select="@resource"/> + <xsl:text>: + aResult.set(OOXMLFastHelper<OOXMLFastContextHandler</xsl:text> + <xsl:value-of select="@resource"/> + <xsl:text>::createAndSetParent(pHandler, Element, aCreateElement.m_nId)); + break;</xsl:text> + </xsl:if> + </xsl:for-each> + <xsl:text> + default: + break; + } + } + } + + return aResult; +} +</xsl:text> +</xsl:template> + </xsl:stylesheet> |