summaryrefslogtreecommitdiff
path: root/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx')
-rw-r--r--writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx792
1 files changed, 792 insertions, 0 deletions
diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx
new file mode 100644
index 000000000000..f106972b23c0
--- /dev/null
+++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx
@@ -0,0 +1,792 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "OOXMLPropertySetImpl.hxx"
+#include <stdio.h>
+#include <iostream>
+#include <resourcemodel/QNameToString.hxx>
+#include <resourcemodel/Protocol.hxx>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <ooxml/OOXMLFastTokens.hxx>
+#include "ooxmlLoggers.hxx"
+
+//#define DEBUG_RESOLVE
+
+namespace writerfilter {
+namespace ooxml
+{
+using namespace ::std;
+
+static ::rtl::OUString strue(RTL_CONSTASCII_USTRINGPARAM("true"));
+static ::rtl::OUString sTrue(RTL_CONSTASCII_USTRINGPARAM("True"));
+static ::rtl::OUString s1(RTL_CONSTASCII_USTRINGPARAM("1"));
+static ::rtl::OUString sOn(RTL_CONSTASCII_USTRINGPARAM("On"));
+static ::rtl::OUString son(RTL_CONSTASCII_USTRINGPARAM("on"));
+
+OOXMLProperty::~OOXMLProperty()
+{
+}
+
+OOXMLPropertySet::~OOXMLPropertySet()
+{
+}
+
+OOXMLTable::~OOXMLTable()
+{
+}
+
+OOXMLPropertyImpl::OOXMLPropertyImpl(Id id, OOXMLValue::Pointer_t pValue,
+ OOXMLPropertyImpl::Type_t eType)
+: mId(id), mpValue(pValue), meType(eType)
+{
+}
+
+OOXMLPropertyImpl::OOXMLPropertyImpl(const OOXMLPropertyImpl & rSprm)
+: OOXMLProperty(), mId(rSprm.mId), mpValue(rSprm.mpValue), meType(rSprm.meType)
+{
+}
+
+OOXMLPropertyImpl::~OOXMLPropertyImpl()
+{
+}
+
+sal_uInt32 OOXMLPropertyImpl::getId() const
+{
+ return mId;
+}
+
+Value::Pointer_t OOXMLPropertyImpl::getValue()
+{
+ Value::Pointer_t pResult;
+
+ if (mpValue.get() != NULL)
+ pResult = Value::Pointer_t(mpValue->clone());
+ else
+ pResult = Value::Pointer_t(new OOXMLValue());
+
+ return pResult;
+}
+
+writerfilter::Reference<BinaryObj>::Pointer_t OOXMLPropertyImpl::getBinary()
+{
+ writerfilter::Reference<BinaryObj>::Pointer_t pResult;
+
+ if (mpValue.get() != NULL)
+ pResult = mpValue->getBinary();
+
+ return pResult;
+}
+
+writerfilter::Reference<Stream>::Pointer_t OOXMLPropertyImpl::getStream()
+{
+ writerfilter::Reference<Stream>::Pointer_t pResult;
+
+ if (mpValue.get() != NULL)
+ pResult = mpValue->getStream();
+
+ return pResult;
+}
+
+writerfilter::Reference<Properties>::Pointer_t OOXMLPropertyImpl::getProps()
+{
+ writerfilter::Reference<Properties>::Pointer_t pResult;
+
+ if (mpValue.get() != NULL)
+ pResult = mpValue->getProperties();
+
+ return pResult;
+}
+
+string OOXMLPropertyImpl::getName() const
+{
+ string sResult = (*QNameToString::Instance())(mId);
+
+ if (sResult.length() == 0)
+ sResult = (*SprmIdToString::Instance())(mId);
+
+ if (sResult.length() == 0)
+ sResult = fastTokenToId(mId);
+
+ if (sResult.length() == 0)
+ {
+ static char sBuffer[256];
+
+ snprintf(sBuffer, sizeof(sBuffer), "%" SAL_PRIxUINT32, mId);
+ sResult = sBuffer;
+ }
+
+ return sResult;
+}
+
+string OOXMLPropertyImpl::toString() const
+{
+ string sResult = "(";
+
+ sResult += getName();
+ sResult += ", ";
+ if (mpValue.get() != NULL)
+ sResult += mpValue->toString();
+ else
+ sResult +="(null)";
+ sResult +=")";
+
+ return sResult;
+}
+
+Sprm::Kind OOXMLPropertyImpl::getKind()
+{
+ return SprmKind(getId());
+}
+
+Sprm * OOXMLPropertyImpl::clone()
+{
+ return new OOXMLPropertyImpl(*this);
+}
+
+void OOXMLPropertyImpl::resolve(writerfilter::Properties & rProperties)
+{
+ writerfilter::Properties * pProperties = NULL;
+#ifdef DEBUG_PROTOCOL
+ writerfilter::PropertiesProtocol::Pointer_t pProtocol
+ (new writerfilter::PropertiesProtocol(&rProperties, debug_logger));
+ pProperties = pProtocol.get();
+#else
+ pProperties = &rProperties;
+#endif
+
+ switch (meType)
+ {
+ case SPRM:
+ if (mId != 0x0)
+ pProperties->sprm(*this);
+ break;
+ case ATTRIBUTE:
+ pProperties->attribute(mId, *getValue());
+ break;
+ }
+}
+
+/*
+ class OOXMLValue
+*/
+
+OOXMLValue::OOXMLValue()
+{
+}
+
+OOXMLValue::~OOXMLValue()
+{
+}
+
+bool OOXMLValue::getBool() const
+{
+ return false;
+}
+
+int OOXMLValue::getInt() const
+{
+ return 0;
+}
+
+::rtl::OUString OOXMLValue::getString() const
+{
+ return ::rtl::OUString();
+}
+
+uno::Any OOXMLValue::getAny() const
+{
+ return uno::Any();
+}
+
+writerfilter::Reference<Properties>::Pointer_t OOXMLValue::getProperties()
+{
+ return writerfilter::Reference<Properties>::Pointer_t();
+}
+
+writerfilter::Reference<Stream>::Pointer_t OOXMLValue::getStream()
+{
+ return writerfilter::Reference<Stream>::Pointer_t();
+}
+
+writerfilter::Reference<BinaryObj>::Pointer_t OOXMLValue::getBinary()
+{
+ return writerfilter::Reference<BinaryObj>::Pointer_t();
+}
+
+string OOXMLValue::toString() const
+{
+ return "OOXMLValue";
+}
+
+OOXMLValue * OOXMLValue::clone() const
+{
+ return new OOXMLValue(*this);
+}
+
+/*
+ class OOXMLBinaryValue
+ */
+
+OOXMLBinaryValue::OOXMLBinaryValue(OOXMLBinaryObjectReference::Pointer_t
+ pBinaryObj)
+: mpBinaryObj(pBinaryObj)
+{
+}
+
+OOXMLBinaryValue::~OOXMLBinaryValue()
+{
+}
+
+writerfilter::Reference<BinaryObj>::Pointer_t OOXMLBinaryValue::getBinary()
+{
+ return mpBinaryObj;
+}
+
+string OOXMLBinaryValue::toString() const
+{
+ return "BinaryObj";
+}
+
+OOXMLValue * OOXMLBinaryValue::clone() const
+{
+ return new OOXMLBinaryValue(mpBinaryObj);
+}
+
+/*
+ class OOXMLBooleanValue
+*/
+
+OOXMLBooleanValue::OOXMLBooleanValue(bool bValue)
+: mbValue(bValue)
+{
+}
+
+OOXMLBooleanValue::OOXMLBooleanValue(const rtl::OUString & rValue)
+: mbValue(false)
+{
+ if (strue.compareTo(rValue) == 0
+ || sTrue.compareTo(rValue) == 0
+ || s1.compareTo(rValue) == 0
+ || son.compareTo(rValue) == 0
+ || sOn.compareTo(rValue) == 0)
+ mbValue = true;
+ else
+ mbValue = false;
+}
+
+OOXMLBooleanValue::~OOXMLBooleanValue()
+{
+}
+
+bool OOXMLBooleanValue::getBool() const
+{
+ return mbValue;
+}
+
+int OOXMLBooleanValue::getInt() const
+{
+ return mbValue ? 1 : 0;
+}
+
+uno::Any OOXMLBooleanValue::getAny() const
+{
+ uno::Any aResult(mbValue);
+
+ return aResult;
+}
+
+string OOXMLBooleanValue::toString() const
+{
+ return mbValue ? "true" : "false";
+}
+
+OOXMLValue * OOXMLBooleanValue::clone() const
+{
+ return new OOXMLBooleanValue(*this);
+}
+
+/*
+ class OOXMLStringValue
+*/
+
+OOXMLStringValue::OOXMLStringValue(const rtl::OUString & rStr)
+: mStr(rStr)
+{
+}
+
+OOXMLStringValue::~OOXMLStringValue()
+{
+}
+
+uno::Any OOXMLStringValue::getAny() const
+{
+ uno::Any aAny(mStr);
+
+ return aAny;
+}
+
+rtl::OUString OOXMLStringValue::getString() const
+{
+ return mStr;
+}
+
+string OOXMLStringValue::toString() const
+{
+ return OUStringToOString(mStr, RTL_TEXTENCODING_ASCII_US).getStr();
+}
+
+OOXMLValue * OOXMLStringValue::clone() const
+{
+ return new OOXMLStringValue(*this);
+}
+
+/*
+ class OOXMLInputStreamValue
+ */
+OOXMLInputStreamValue::OOXMLInputStreamValue(uno::Reference<io::XInputStream> xInputStream)
+: mxInputStream(xInputStream)
+{
+}
+
+OOXMLInputStreamValue::~OOXMLInputStreamValue()
+{
+}
+
+uno::Any OOXMLInputStreamValue::getAny() const
+{
+ uno::Any aAny(mxInputStream);
+
+ return aAny;
+}
+
+string OOXMLInputStreamValue::toString() const
+{
+ return "InputStream";
+}
+
+OOXMLValue * OOXMLInputStreamValue::clone() const
+{
+ return new OOXMLInputStreamValue(mxInputStream);
+}
+
+/*
+ struct OOXMLPropertySetImplCompare
+ */
+
+bool OOXMLPropertySetImplCompare::operator()(const OOXMLProperty::Pointer_t x,
+ const OOXMLProperty::Pointer_t y) const
+{
+ bool bResult = false;
+
+ if (x.get() == NULL && y.get() != NULL)
+ bResult = true;
+ else if (x.get() != NULL && y.get() != NULL)
+ bResult = x->getId() < y->getId();
+
+ return bResult;
+}
+
+/**
+ class OOXMLPropertySetImpl
+*/
+
+OOXMLPropertySetImpl::OOXMLPropertySetImpl()
+: msType("OOXMLPropertySetImpl")
+{
+}
+
+OOXMLPropertySetImpl::~OOXMLPropertySetImpl()
+{
+}
+
+void OOXMLPropertySetImpl::resolve(Properties & rHandler)
+{
+ OOXMLProperties_t::iterator aIt = begin();
+ while (aIt != end())
+ {
+ OOXMLProperty::Pointer_t pProp = *aIt;
+
+ if (pProp.get() != NULL)
+ pProp->resolve(rHandler);
+#ifdef DEBUG_RESOLVE
+ else
+ {
+ debug_logger->startElement("error");
+ debug_logger->chars("zero-property");
+ debug_logger->endElement("error");
+ }
+#endif
+
+ aIt++;
+ }
+}
+
+OOXMLPropertySetImpl::OOXMLProperties_t::iterator OOXMLPropertySetImpl::begin()
+{
+ return mProperties.begin();
+}
+
+OOXMLPropertySetImpl::OOXMLProperties_t::iterator OOXMLPropertySetImpl::end()
+{
+ return mProperties.end();
+}
+
+OOXMLPropertySetImpl::OOXMLProperties_t::const_iterator
+OOXMLPropertySetImpl::begin() const
+{
+ return mProperties.begin();
+}
+
+OOXMLPropertySetImpl::OOXMLProperties_t::const_iterator
+OOXMLPropertySetImpl::end() const
+{
+ return mProperties.end();
+}
+
+string OOXMLPropertySetImpl::getType() const
+{
+ return msType;
+}
+
+void OOXMLPropertySetImpl::add(OOXMLProperty::Pointer_t pProperty)
+{
+ if (pProperty.get() != NULL && pProperty->getId() != 0x0)
+ {
+ mProperties.push_back(pProperty);
+ }
+#ifdef DEBUG_PROPERTIES
+ else
+ {
+ debug_logger->element("warning.property_not_added");
+ }
+#endif
+}
+
+void OOXMLPropertySetImpl::add(OOXMLPropertySet::Pointer_t pPropertySet)
+{
+ if (pPropertySet.get() != NULL)
+ {
+ OOXMLPropertySetImpl * pSet =
+ dynamic_cast<OOXMLPropertySetImpl *>(pPropertySet.get());
+
+ if (pSet != NULL)
+ {
+ mProperties.resize(mProperties.size() + pSet->mProperties.size());
+ for (OOXMLProperties_t::iterator aIt = pSet->mProperties.begin();
+ aIt != pSet->mProperties.end(); aIt++)
+ add(*aIt);
+ }
+ }
+}
+
+OOXMLPropertySet * OOXMLPropertySetImpl::clone() const
+{
+ return new OOXMLPropertySetImpl(*this);
+}
+
+void OOXMLPropertySetImpl::setType(const string & rsType)
+{
+ msType = rsType;
+}
+
+string OOXMLPropertySetImpl::toString()
+{
+ string sResult = "[";
+ char sBuffer[256];
+ snprintf(sBuffer, sizeof(sBuffer), "%p", this);
+ sResult += sBuffer;
+ sResult += ":";
+
+ OOXMLProperties_t::iterator aItBegin = begin();
+ OOXMLProperties_t::iterator aItEnd = end();
+
+ for (OOXMLProperties_t::iterator aIt = aItBegin; aIt != aItEnd; aIt++)
+ {
+ if (aIt != aItBegin)
+ sResult += ", ";
+
+ if ((*aIt).get() != NULL)
+ sResult += (*aIt)->toString();
+ else
+ sResult += "0x0";
+ }
+
+ sResult += "]";
+
+ return sResult;
+}
+
+/*
+ class OOXMLPropertySetValue
+*/
+
+OOXMLPropertySetValue::OOXMLPropertySetValue
+(OOXMLPropertySet::Pointer_t pPropertySet)
+: mpPropertySet(pPropertySet)
+{
+}
+
+OOXMLPropertySetValue::~OOXMLPropertySetValue()
+{
+}
+
+writerfilter::Reference<Properties>::Pointer_t OOXMLPropertySetValue::getProperties()
+{
+ return writerfilter::Reference<Properties>::Pointer_t
+ (mpPropertySet->clone());
+}
+
+string OOXMLPropertySetValue::toString() const
+{
+ char sBuffer[256];
+
+ snprintf(sBuffer, sizeof(sBuffer), "t:%p, m:%p", this, mpPropertySet.get());
+
+ return "OOXMLPropertySetValue(" + string(sBuffer) + ")";
+}
+
+OOXMLValue * OOXMLPropertySetValue::clone() const
+{
+ return new OOXMLPropertySetValue(*this);
+}
+
+/*
+ class OOXMLIntegerValue
+*/
+
+OOXMLIntegerValue::OOXMLIntegerValue(sal_Int32 nValue)
+: mnValue(nValue)
+{
+}
+
+OOXMLIntegerValue::OOXMLIntegerValue(const rtl::OUString & rValue)
+: mnValue(0)
+{
+ mnValue = rValue.toInt32();
+}
+
+OOXMLIntegerValue::~OOXMLIntegerValue()
+{
+}
+
+int OOXMLIntegerValue::getInt() const
+{
+ return mnValue;
+}
+
+uno::Any OOXMLIntegerValue::getAny() const
+{
+ uno::Any aResult(mnValue);
+
+ return aResult;
+}
+
+OOXMLValue * OOXMLIntegerValue::clone() const
+{
+ return new OOXMLIntegerValue(*this);
+}
+
+string OOXMLIntegerValue::toString() const
+{
+ char buffer[256];
+ snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, mnValue);
+
+ return buffer;
+}
+
+/*
+ class OOXMLHexValue
+*/
+
+OOXMLHexValue::OOXMLHexValue(sal_uInt32 nValue)
+: mnValue(nValue)
+{
+}
+
+OOXMLHexValue::OOXMLHexValue(const rtl::OUString & rValue)
+{
+ mnValue = static_cast<sal_uInt32>(rValue.toInt32(16));
+}
+
+OOXMLHexValue::~OOXMLHexValue()
+{
+}
+
+int OOXMLHexValue::getInt() const
+{
+ return mnValue;
+}
+
+OOXMLValue * OOXMLHexValue::clone() const
+{
+ return new OOXMLHexValue(*this);
+}
+
+string OOXMLHexValue::toString() const
+{
+ char buffer[256];
+ snprintf(buffer, sizeof(buffer), "0x%" SAL_PRIxUINT32, mnValue);
+
+ return buffer;
+}
+
+/*
+ class OOXMLShapeValue
+ */
+
+
+OOXMLShapeValue::OOXMLShapeValue(uno::Reference<XShape> rShape)
+: mrShape(rShape)
+{
+}
+
+OOXMLShapeValue::~OOXMLShapeValue()
+{
+}
+
+uno::Any OOXMLShapeValue::getAny() const
+{
+ return uno::Any(mrShape);
+}
+
+string OOXMLShapeValue::toString() const
+{
+ return "Shape";
+}
+
+OOXMLValue * OOXMLShapeValue::clone() const
+{
+ return new OOXMLShapeValue(mrShape);
+}
+
+/*
+ class OOXMLTableImpl
+ */
+
+OOXMLTableImpl::OOXMLTableImpl()
+{
+}
+
+OOXMLTableImpl::~OOXMLTableImpl()
+{
+}
+
+void OOXMLTableImpl::resolve(Table & rTable)
+{
+#ifdef DEBUG_PROTOCOL
+ Table::Pointer_t pTable(new TableProtocol(&rTable, debug_logger));
+#else
+ Table * pTable = &rTable;
+#endif
+
+ int nPos = 0;
+
+ PropertySets_t::iterator it = mPropertySets.begin();
+ PropertySets_t::iterator itEnd = mPropertySets.end();
+
+ while (it != itEnd)
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties
+ ((*it)->getProperties());
+
+ if (pProperties.get() != NULL)
+ pTable->entry(nPos, pProperties);
+
+ ++nPos;
+ it++;
+ }
+}
+
+void OOXMLTableImpl::add(ValuePointer_t pPropertySet)
+{
+ if (pPropertySet.get() != NULL)
+ mPropertySets.push_back(pPropertySet);
+}
+
+string OOXMLTableImpl::getType() const
+{
+ return "OOXMLTableImpl";
+}
+
+OOXMLTable * OOXMLTableImpl::clone() const
+{
+ return new OOXMLTableImpl(*this);
+}
+
+/*
+ class: OOXMLPropertySetEntryToString
+*/
+
+OOXMLPropertySetEntryToString::OOXMLPropertySetEntryToString(Id nId)
+: mnId(nId)
+{
+}
+
+OOXMLPropertySetEntryToString::~OOXMLPropertySetEntryToString()
+{
+}
+
+void OOXMLPropertySetEntryToString::sprm(Sprm & /*rSprm*/)
+{
+}
+
+void OOXMLPropertySetEntryToString::attribute(Id nId, Value & rValue)
+{
+ if (nId == mnId)
+ mStr = rValue.getString();
+}
+
+const ::rtl::OUString & OOXMLPropertySetEntryToString::getString() const
+{
+ return mStr;
+}
+
+OOXMLPropertySetEntryToInteger::OOXMLPropertySetEntryToInteger(Id nId)
+: mnId(nId)
+{
+}
+
+OOXMLPropertySetEntryToInteger::~OOXMLPropertySetEntryToInteger()
+{
+}
+
+void OOXMLPropertySetEntryToInteger::sprm(Sprm & /*rSprm*/)
+{
+}
+
+void OOXMLPropertySetEntryToInteger::attribute(Id nId, Value & rValue)
+{
+ if (nId == mnId)
+ mnValue = rValue.getInt();
+}
+
+int OOXMLPropertySetEntryToInteger::getValue() const
+{
+ return mnValue;
+}
+
+}}