summaryrefslogtreecommitdiff
path: root/writerfilter/source/resourcemodel/TagLogger.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/resourcemodel/TagLogger.cxx')
-rw-r--r--writerfilter/source/resourcemodel/TagLogger.cxx350
1 files changed, 350 insertions, 0 deletions
diff --git a/writerfilter/source/resourcemodel/TagLogger.cxx b/writerfilter/source/resourcemodel/TagLogger.cxx
new file mode 100644
index 000000000000..1d9b23623e56
--- /dev/null
+++ b/writerfilter/source/resourcemodel/TagLogger.cxx
@@ -0,0 +1,350 @@
+/*************************************************************************
+ *
+ * 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 <fstream>
+#include <string.h>
+#include <resourcemodel/TagLogger.hxx>
+#include <resourcemodel/util.hxx>
+#include <resourcemodel/QNameToString.hxx>
+
+namespace writerfilter
+{
+ XMLTag::Pointer_t XMLTag::NIL(new XMLTag("NIL"));
+
+ void XMLTag::addAttr(string sName, string sValue)
+ {
+ XMLAttribute aAttr(sName, sValue);
+
+ mAttrs.push_back(aAttr);
+ }
+
+ void XMLTag::addAttr(string sName, const ::rtl::OUString & sValue)
+ {
+ addAttr(sName,
+ OUStringToOString
+ (sValue, RTL_TEXTENCODING_ASCII_US).getStr());
+ }
+
+ void XMLTag::addAttr(string sName, sal_uInt32 nValue)
+ {
+ char buffer[256];
+ snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, nValue);
+ addAttr(sName, buffer);
+ }
+
+ void XMLTag::addTag(XMLTag::Pointer_t pTag)
+ {
+ if (pTag != XMLTag::Pointer_t())
+ mTags.push_back(pTag);
+ }
+
+ void XMLTag::chars(const string & rChars)
+ {
+ mChars = rChars;
+ }
+
+ const string & XMLTag::getTag() const
+ {
+ return mTag;
+ }
+
+ string XMLTag::toString() const
+ {
+ if (mChars.length() > 0)
+ return mChars;
+
+ string sResult;
+
+ if (mMode == START || mMode == COMPLETE)
+ {
+ sResult += "<" + mTag;
+
+ XMLAttributes_t::const_iterator aIt = mAttrs.begin();
+ while (aIt != mAttrs.end())
+ {
+ sResult += " ";
+ sResult += aIt->mName;
+ sResult += "=\"";
+ sResult += xmlify(aIt->mValue);
+ sResult += "\"";
+
+ aIt++;
+ }
+
+ sResult +=">";
+
+ if (mTags.size() > 0)
+ {
+ XMLTags_t::const_iterator aItTags = mTags.begin();
+ while (aItTags != mTags.end())
+ {
+ if ((*aItTags).get() != NULL)
+ sResult += (*aItTags)->toString();
+
+ aItTags++;
+ }
+ }
+ }
+
+ if (mMode == END || mMode == COMPLETE)
+ sResult += "</" + mTag + ">";
+
+ return sResult;
+ }
+
+ ostream & XMLTag::output(ostream & o) const
+ {
+ if (mMode == START || mMode == COMPLETE)
+ {
+ o << "<" << mTag;
+
+ XMLAttributes_t::const_iterator aItAttrs(mAttrs.begin());
+ while (aItAttrs != mAttrs.end())
+ {
+ o << " " << aItAttrs->mName << "=\""
+ << xmlify(aItAttrs->mValue)
+ << "\"";
+
+ aItAttrs++;
+ }
+
+ o << ">";
+
+ XMLTags_t::const_iterator aItTags(mTags.begin());
+ while (aItTags != mTags.end())
+ {
+ (*aItTags)->output(o);
+ aItTags++;
+ }
+
+ o << mChars;
+ }
+
+ if (mMode == END || mMode == COMPLETE)
+ o << "</" << mTag << ">";
+
+ return o;
+ }
+
+ struct eqstr
+ {
+ bool operator()(const char* s1, const char* s2) const
+ {
+ return strcmp(s1, s2) == 0;
+ }
+ };
+
+ typedef hash_map<const char *, TagLogger::Pointer_t, hash<const char *>, eqstr> TagLoggerHashMap_t;
+ static TagLoggerHashMap_t * tagLoggers = NULL;
+
+ TagLogger::TagLogger()
+ {
+ }
+
+ TagLogger::~TagLogger()
+ {
+ }
+
+ TagLogger::Pointer_t TagLogger::getInstance(const char * name)
+ {
+ if (tagLoggers == NULL)
+ tagLoggers = new TagLoggerHashMap_t();
+
+ TagLoggerHashMap_t::iterator aIt = tagLoggers->end();
+
+ if (! tagLoggers->empty())
+ aIt = tagLoggers->find(name);
+
+ if (aIt == tagLoggers->end())
+ {
+ TagLogger::Pointer_t pTagLogger(new TagLogger());
+ pair<const char *, TagLogger::Pointer_t> entry(name, pTagLogger);
+ aIt = tagLoggers->insert(entry).first;
+ }
+
+ return aIt->second;
+ }
+
+ XMLTag::Pointer_t TagLogger::currentTag() const
+ {
+ bool bEmpty=mTags.empty();
+ if (!bEmpty)
+ return mTags.top();
+
+ return XMLTag::NIL;
+ }
+
+ void TagLogger::startDocument()
+ {
+ XMLTag::Pointer_t pTag(new XMLTag("root"));
+ mTags.push(pTag);
+ mpRoot = pTag;
+ }
+
+ void TagLogger::element(const string & name)
+ {
+ startElement(name);
+ endElement(name);
+ }
+
+ void TagLogger::startElement(const string & name)
+ {
+ XMLTag::Pointer_t pTag(new XMLTag(name));
+ currentTag()->addTag(pTag);
+ mTags.push(pTag);
+ }
+
+ void TagLogger::attribute(const string & name, const string & value)
+ {
+ currentTag()->addAttr(name, value);
+ }
+
+ void TagLogger::attribute(const string & name, const ::rtl::OUString & value)
+ {
+ currentTag()->addAttr(name, value);
+ }
+
+ void TagLogger::attribute(const string & name, sal_uInt32 value)
+ {
+ currentTag()->addAttr(name, value);
+ }
+
+ void TagLogger::addTag(XMLTag::Pointer_t pTag)
+ {
+ currentTag()->addTag(pTag);
+ }
+
+ void TagLogger::chars(const string & rChars)
+ {
+ currentTag()->chars(xmlify(rChars));
+ }
+
+ void TagLogger::chars(const ::rtl::OUString & rChars)
+ {
+ chars(OUStringToOString(rChars, RTL_TEXTENCODING_ASCII_US).getStr());
+ }
+
+ void TagLogger::endElement(const string & name)
+ {
+ string nameRemoved = currentTag()->getTag();
+
+ if (name == nameRemoved)
+ mTags.pop();
+ else {
+ XMLTag::Pointer_t pTag(new XMLTag("end.mismatch"));
+ pTag->addAttr("name", name);
+ pTag->addAttr("top", nameRemoved);
+
+ currentTag()->addTag(pTag);
+ }
+
+ }
+
+ void TagLogger::endDocument()
+ {
+ mTags.pop();
+ }
+
+ ostream & TagLogger::output(ostream & o) const
+ {
+ return mpRoot->output(o);
+ }
+
+ void TagLogger::dump(const char * name)
+ {
+ TagLoggerHashMap_t::iterator aIt(tagLoggers->find(name));
+ if (aIt != tagLoggers->end())
+ {
+ string fileName;
+ char * temp = getenv("TAGLOGGERTMP");
+
+ if (temp != NULL)
+ fileName += temp;
+ else
+ fileName += "/tmp";
+
+ fileName += "/writerfilter.";
+ fileName += name;
+ fileName += ".xml";
+
+ ofstream dumpStream(fileName.c_str());
+ aIt->second->output(dumpStream);
+ }
+ }
+
+ PropertySetToTagHandler::~PropertySetToTagHandler()
+ {
+ }
+
+ void PropertySetToTagHandler::resolve
+ (XMLTag & rTag, writerfilter::Reference<Properties>::Pointer_t pProps)
+ {
+ if (pProps.get() != NULL)
+ {
+ PropertySetToTagHandler aHandler(mpIdToString);
+ pProps->resolve(aHandler);
+ rTag.addTag(aHandler.getTag());
+ }
+ }
+
+ void PropertySetToTagHandler::attribute(Id name, Value & val)
+ {
+ XMLTag::Pointer_t pTag(new XMLTag("attribute"));
+
+ pTag->addAttr("name", (*QNameToString::Instance())(name));
+ pTag->addAttr("value", val.toString());
+
+ resolve(*pTag, val.getProperties());
+
+ mpTag->addTag(pTag);
+ }
+
+ void PropertySetToTagHandler::sprm(Sprm & rSprm)
+ {
+ XMLTag::Pointer_t pTag(new XMLTag("sprm"));
+
+ string sName;
+
+ if (mpIdToString != IdToString::Pointer_t())
+ sName = mpIdToString->toString(rSprm.getId());
+
+ pTag->addAttr("name", sName);
+
+ static char sBuffer[256];
+ snprintf(sBuffer, sizeof(sBuffer),
+ "0x%" SAL_PRIxUINT32 "x, %" SAL_PRIxUINT32 "d", rSprm.getId(),
+ rSprm.getId());
+ pTag->addAttr("id", sBuffer);
+ pTag->addAttr("value", rSprm.getValue()->toString());
+
+ resolve(*pTag, rSprm.getProps());
+
+ mpTag->addTag(pTag);
+ }
+
+
+}