blob: be564564561dcddf03f48f216e41ea770a9ae909 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_OOXML_FAST_CONTEXT_HANDLER_HXX
#define INCLUDED_OOXML_FAST_CONTEXT_HANDLER_HXX
#include <com/sun/star/xml/sax/XFastShapeContextHandler.hpp>
#include <string>
#include <set>
#include "sal/config.h"
#include "com/sun/star/uno/XComponentContext.hpp"
#include "cppuhelper/implbase1.hxx"
#include "com/sun/star/xml/sax/XFastContextHandler.hpp"
#include "OOXMLParserState.hxx"
#include "OOXMLPropertySetImpl.hxx"
#include "OOXMLDocumentImpl.hxx"
#include "RefAndPointer.hxx"
#include <ooxml/OOXMLFastTokens.hxx>
namespace writerfilter {
namespace ooxml
{
using namespace ::std;
using namespace ::com::sun::star;
using namespace ::com::sun::star::xml::sax;
typedef boost::shared_ptr<Stream> StreamPointer_t;
class OOXMLFastContextHandler:
public ::cppu::WeakImplHelper1<
xml::sax::XFastContextHandler>
{
public:
typedef RefAndPointer<XFastContextHandler, OOXMLFastContextHandler>
RefAndPointer_t;
typedef boost::shared_ptr<OOXMLFastContextHandler> Pointer_t;
enum ResourceEnum_t { UNKNOWN, STREAM, PROPERTIES, TABLE, SHAPE };
OOXMLFastContextHandler();
explicit OOXMLFastContextHandler(
uno::Reference< uno::XComponentContext > const & context );
explicit OOXMLFastContextHandler(
OOXMLFastContextHandler * pContext );
virtual ~OOXMLFastContextHandler();
// ::com::sun::star::xml::sax::XFastContextHandler:
virtual void SAL_CALL startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL startUnknownElement
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL endUnknownElement
(const ::rtl::OUString & Namespace, const ::rtl::OUString & Name)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
createUnknownChildContext
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL characters(const ::rtl::OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
static const uno::Sequence< sal_Int8 > & getUnoTunnelId();
virtual sal_Int64 SAL_CALL getSomething(const uno::Sequence<sal_Int8> & rId)
throw (uno::RuntimeException);
// local
void setStream(Stream * pStream);
/**
Return value of this context(element).
@return the value
*/
virtual OOXMLValue::Pointer_t getValue() const;
/**
Returns a string describing the type of the context.
This is the name of the define normally.
@return type string
*/
virtual string getType() const { return "??"; }
virtual ResourceEnum_t getResource() const { return STREAM; }
virtual void attributes
(const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void newProperty(const Id & rId, OOXMLValue::Pointer_t pVal);
virtual void setPropertySet(OOXMLPropertySet::Pointer_t pPropertySet);
virtual OOXMLPropertySet::Pointer_t getPropertySet() const;
virtual void setToken(Token_t nToken);
virtual Token_t getToken() const;
void mark(const Id & rId, OOXMLValue::Pointer_t pVal);
void resolveFootnote( const sal_Int32 nIDForXNoteStream );
void resolveEndnote( const sal_Int32 nIDForXNoteStream );
void resolveComment( const sal_Int32 nIDForXNoteStream );
void resolvePicture(const rtl::OUString & rId);
void resolveHeader(const sal_Int32 type,
const rtl::OUString & rId);
void resolveFooter(const sal_Int32 type,
const rtl::OUString & rId);
void resolveOLE(const rtl::OUString & rId);
::rtl::OUString getTargetForId(const ::rtl::OUString & rId);
uno::Reference < xml::sax::XFastContextHandler >
createFromStart
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs);
void setDocument(OOXMLDocument * pDocument);
OOXMLDocument * getDocument();
void setIDForXNoteStream(OOXMLValue::Pointer_t pValue);
void setForwardEvents(bool bForwardEvents);
bool isForwardEvents() const;
virtual void setParent(OOXMLFastContextHandler * pParent);
virtual void setId(Id nId);
virtual Id getId() const;
void setDefine(Id nDefine);
Id getDefine() const;
OOXMLParserState::Pointer_t getParserState() 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 void propagateTableProperties();
virtual void propagateRowProperties();
virtual void propagateCellProperties();
virtual bool propagatesProperties() const;
void sendPropertiesWithId(const Id & rId);
void sendPropertiesToParent();
void sendCellProperties();
void sendRowProperties();
void sendTableProperties();
void clearTableProps();
void clearProps();
virtual void setDefaultBooleanValue();
virtual void setDefaultIntegerValue();
virtual void setDefaultHexValue();
virtual void setDefaultStringValue();
void sendPropertyToParent();
#ifdef DEBUG
static XMLTag::Pointer_t toPropertiesTag(OOXMLPropertySet::Pointer_t);
virtual XMLTag::Pointer_t toTag() const;
virtual string toString() const;
#endif
protected:
OOXMLFastContextHandler * mpParent;
Id mId;
Id mnDefine;
Token_t mnToken;
#ifdef DEBUG_CONTEXT_HANDLER
string msTokenString;
#endif
// the stream to send the stream events to.
Stream * mpStream;
// the current global parser state
OOXMLParserState::Pointer_t mpParserState;
// the table depth of this context
unsigned int mnTableDepth;
virtual void lcl_startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler >
lcl_createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_characters(const ::rtl::OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
void startAction(Token_t Element);
virtual void lcl_startAction(Token_t Element);
void endAction(Token_t Element);
virtual void lcl_endAction(Token_t Element);
// Returns string for resource of this context. (debug)
string getResourceString() const;
virtual OOXMLPropertySet * getPicturePropSet
(const ::rtl::OUString & rId);
virtual void resolvePropertySetAttrs();
uno::Reference< uno::XComponentContext > getComponentContext();
sal_uInt32 mnInstanceNumber;
sal_uInt32 mnRefCount;
private:
void operator =(OOXMLFastContextHandler &); // not defined
uno::Reference< uno::XComponentContext > m_xContext;
static sal_uInt32 mnInstanceCount;
};
class OOXMLFastContextHandlerStream : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerStream(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerStream();
virtual ResourceEnum_t getResource() const { return STREAM; }
OOXMLPropertySet::Pointer_t getPropertySetAttrs() const;
virtual void newProperty(const Id & rId, OOXMLValue::Pointer_t pVal);
virtual void sendProperty(Id nId);
virtual OOXMLPropertySet::Pointer_t getPropertySet() const;
void handleHyperlink();
protected:
virtual void resolvePropertySetAttrs();
virtual void lcl_characters(const ::rtl::OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
private:
mutable OOXMLPropertySet::Pointer_t mpPropertySetAttrs;
};
class OOXMLFastContextHandlerProperties : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerProperties(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerProperties();
virtual OOXMLValue::Pointer_t getValue() const;
virtual ResourceEnum_t getResource() const { return PROPERTIES; }
virtual void newProperty(const Id & nId, OOXMLValue::Pointer_t pVal);
void handleXNotes();
void handleHdrFtr();
void handleComment();
void handlePicture();
void handleBreak();
void handleOLE();
virtual void setPropertySet(OOXMLPropertySet::Pointer_t pPropertySet);
virtual OOXMLPropertySet::Pointer_t getPropertySet() const;
#ifdef DEBUG
virtual XMLTag::Pointer_t toTag() const;
#endif
protected:
/// the properties
OOXMLPropertySet::Pointer_t mpPropertySet;
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void setParent(OOXMLFastContextHandler * pParent);
private:
bool mbResolve;
};
class OOXMLFastContextHandlerPropertyTable :
public OOXMLFastContextHandlerProperties
{
public:
OOXMLFastContextHandlerPropertyTable(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerPropertyTable();
protected:
OOXMLTableImpl mTable;
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
};
class OOXMLFastContextHandlerValue :
public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerValue
(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerValue();
virtual void setValue(OOXMLValue::Pointer_t pValue);
virtual OOXMLValue::Pointer_t getValue() const;
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual string getType() const { return "Value"; }
virtual void setDefaultBooleanValue();
virtual void setDefaultIntegerValue();
virtual void setDefaultHexValue();
virtual void setDefaultStringValue();
protected:
OOXMLValue::Pointer_t mpValue;
};
class OOXMLFastContextHandlerTable : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerTable(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerTable();
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void newPropertySet(OOXMLPropertySet::Pointer_t pPropertySet);
protected:
OOXMLTableImpl mTable;
RefAndPointer_t mCurrentChild;
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual ResourceEnum_t getResource() const { return TABLE; }
virtual string getType() const { return "Table"; }
void addCurrentChild();
};
class OOXMLFastContextHandlerXNote : public OOXMLFastContextHandlerProperties
{
public:
OOXMLFastContextHandlerXNote(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerXNote();
void checkId(OOXMLValue::Pointer_t pValue);
virtual string getType() const { return "XNote"; }
private:
bool mbForwardEventsSaved;
sal_Int32 mnMyXNoteId;
virtual void lcl_startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual ResourceEnum_t getResource() const { return STREAM; }
};
class OOXMLFastContextHandlerTextTableCell : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerTextTableCell
(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerTextTableCell();
virtual string getType() const { return "TextTableCell"; }
void startCell();
void endCell();
};
class OOXMLFastContextHandlerTextTableRow : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerTextTableRow
(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerTextTableRow();
virtual string getType() const { return "TextTableRow"; }
void startRow();
void endRow();
};
class OOXMLFastContextHandlerTextTable : public OOXMLFastContextHandler
{
public:
OOXMLFastContextHandlerTextTable
(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerTextTable();
virtual string getType() const { return "TextTable"; }
protected:
virtual void lcl_startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
};
class OOXMLFastContextHandlerShape: public OOXMLFastContextHandlerProperties
{
private:
bool m_bShapeSent;
bool m_bShapeStarted;
public:
explicit OOXMLFastContextHandlerShape
(OOXMLFastContextHandler * pContext);
virtual ~OOXMLFastContextHandlerShape();
virtual string getType() const { return "Shape"; }
// ::com::sun::star::xml::sax::XFastContextHandler:
virtual void SAL_CALL startUnknownElement
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL endUnknownElement
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
createUnknownChildContext
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void setToken(Token_t nToken);
virtual ResourceEnum_t getResource() const { return SHAPE; }
void sendShape( Token_t Element );
protected:
typedef uno::Reference<XFastShapeContextHandler> ShapeContextRef;
ShapeContextRef mrShapeContext;
virtual void lcl_startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler >
lcl_createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_characters(const ::rtl::OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
};
/**
OOXMLFastContextHandlerWrapper wraps an OOXMLFastContextHandler.
The method calls for the interface
::com::sun::star::xml::sax::XFastContextHandler are forwarded to the wrapped
OOXMLFastContextHandler.
*/
class OOXMLFastContextHandlerWrapper : public OOXMLFastContextHandler
{
public:
explicit OOXMLFastContextHandlerWrapper
(OOXMLFastContextHandler * pParent,
uno::Reference<XFastContextHandler> xContext);
virtual ~OOXMLFastContextHandlerWrapper();
// ::com::sun::star::xml::sax::XFastContextHandler:
virtual void SAL_CALL startUnknownElement
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void SAL_CALL endUnknownElement
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
createUnknownChildContext
(const ::rtl::OUString & Namespace,
const ::rtl::OUString & Name,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void attributes
(const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual ResourceEnum_t getResource() const;
void addNamespace(const Id & nId);
void addToken( Token_t Element );
virtual void newProperty(const Id & rId, OOXMLValue::Pointer_t pVal);
virtual void setPropertySet(OOXMLPropertySet::Pointer_t pPropertySet);
virtual OOXMLPropertySet::Pointer_t getPropertySet() const;
virtual string getType() const;
protected:
virtual void lcl_startFastElement
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_endFastElement(Token_t Element)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual uno::Reference< xml::sax::XFastContextHandler >
lcl_createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void lcl_characters(const ::rtl::OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
virtual void setId(Id nId);
virtual Id getId() const;
virtual void setToken(Token_t nToken);
virtual Token_t getToken() const;
private:
uno::Reference<XFastContextHandler> mxContext;
set<Id> mMyNamespaces;
set<Token_t> mMyTokens;
OOXMLPropertySet::Pointer_t mpPropertySet;
OOXMLFastContextHandler * getFastContextHandler() const;
};
}}
#endif // INCLUDED_OOXML_FAST_CONTEXT_HANDLER_HXX