2011-09-28 23:14:11 +01:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2011-09-23 17:51:41 +02:00
|
|
|
/*
|
2013-04-19 21:10:42 +01:00
|
|
|
* This file is part of the LibreOffice project.
|
2011-09-23 17:51:41 +02:00
|
|
|
*
|
2013-04-19 21:10:42 +01:00
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
2011-09-23 17:51:41 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "doc.hxx"
|
|
|
|
#include "ndtxt.hxx"
|
2013-02-15 16:07:03 +01:00
|
|
|
#include "MarkManager.hxx"
|
2013-02-16 12:20:08 +01:00
|
|
|
#include "docary.hxx"
|
|
|
|
#include "switerator.hxx"
|
|
|
|
#include "fmtfld.hxx"
|
|
|
|
#include "docufld.hxx"
|
2011-09-23 17:51:41 +02:00
|
|
|
|
2012-05-23 12:30:12 +01:00
|
|
|
#include <libxml/encoding.h>
|
|
|
|
#include <libxml/xmlwriter.h>
|
|
|
|
|
2011-09-23 17:51:41 +02:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
|
|
|
|
// Small helper class to ensure that we write to nodes.xml if nothing
|
|
|
|
// has been explicitly specified.
|
|
|
|
// Always use at the beginning of dumpAsXml().
|
|
|
|
// Also, there are some functions to save typing.
|
|
|
|
class WriterHelper
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
WriterHelper( xmlTextWriterPtr );
|
|
|
|
~WriterHelper();
|
|
|
|
operator xmlTextWriterPtr();
|
|
|
|
xmlTextWriterPtr operator->();
|
|
|
|
void startElement( const char* element );
|
|
|
|
void endElement();
|
2011-09-29 21:12:45 +03:00
|
|
|
void writeFormatAttribute( const char* attribute, const char* format, ... )
|
|
|
|
#ifdef LIBXML_ATTR_FORMAT
|
|
|
|
LIBXML_ATTR_FORMAT(3,4)
|
|
|
|
#endif
|
|
|
|
;
|
2011-09-23 17:51:41 +02:00
|
|
|
private:
|
|
|
|
xmlTextWriterPtr writer;
|
|
|
|
bool owns;
|
|
|
|
};
|
|
|
|
|
|
|
|
WriterHelper::WriterHelper( xmlTextWriterPtr w )
|
|
|
|
: writer( w )
|
|
|
|
, owns( false )
|
|
|
|
{
|
|
|
|
if( writer == NULL )
|
|
|
|
{
|
|
|
|
writer = xmlNewTextWriterFilename( "nodes.xml", 0 );
|
|
|
|
xmlTextWriterStartDocument( writer, NULL, NULL, NULL );
|
|
|
|
owns = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WriterHelper::~WriterHelper()
|
|
|
|
{
|
|
|
|
if( owns )
|
|
|
|
{
|
|
|
|
xmlTextWriterEndDocument( writer );
|
|
|
|
xmlFreeTextWriter( writer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WriterHelper::operator xmlTextWriterPtr()
|
|
|
|
{
|
|
|
|
return writer;
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlTextWriterPtr WriterHelper::operator->()
|
|
|
|
{
|
|
|
|
return writer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void WriterHelper::startElement( const char* element )
|
|
|
|
{
|
|
|
|
xmlTextWriterStartElement( writer, BAD_CAST( element ));
|
|
|
|
}
|
|
|
|
|
|
|
|
void WriterHelper::endElement()
|
|
|
|
{
|
|
|
|
xmlTextWriterEndElement( writer );
|
|
|
|
}
|
|
|
|
|
|
|
|
void WriterHelper::writeFormatAttribute( const char* attribute, const char* format, ... )
|
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
va_start( va, format );
|
|
|
|
xmlTextWriterWriteVFormatAttribute( writer, BAD_CAST( attribute ), format, va );
|
|
|
|
va_end( va );
|
|
|
|
}
|
|
|
|
|
2013-06-10 13:00:14 +02:00
|
|
|
// Hack: somehow conversion from "..." to va_list does
|
|
|
|
// bomb on two string litterals in the format.
|
|
|
|
static const char* TMP_FORMAT = "%" SAL_PRIuUINTPTR;
|
|
|
|
|
2011-09-23 17:51:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer( w );
|
|
|
|
writer.startElement( "doc" );
|
|
|
|
writer.writeFormatAttribute( "ptr", "%p", this );
|
|
|
|
m_pNodes->dumpAsXml( writer );
|
2013-02-18 07:54:37 +01:00
|
|
|
mpMarkManager->dumpAsXml( writer );
|
|
|
|
mpFldTypes->dumpAsXml( writer );
|
2011-09-23 17:51:41 +02:00
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
|
2013-02-15 16:07:03 +01:00
|
|
|
namespace sw {
|
|
|
|
namespace mark {
|
|
|
|
void MarkManager::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer(w);
|
|
|
|
writer.startElement("markManager");
|
|
|
|
writer.startElement("fieldmarks");
|
|
|
|
for (const_iterator_t it = m_vFieldmarks.begin(); it != m_vFieldmarks.end(); ++it)
|
|
|
|
{
|
|
|
|
pMark_t pMark = *it;
|
|
|
|
writer.startElement("fieldmark");
|
2013-06-10 13:00:14 +02:00
|
|
|
writer.writeFormatAttribute("startNode", TMP_FORMAT, pMark->GetMarkStart().nNode.GetIndex());
|
2013-02-15 16:07:03 +01:00
|
|
|
writer.writeFormatAttribute("startOffset", "%d", pMark->GetMarkStart().nContent.GetIndex());
|
2013-06-10 13:00:14 +02:00
|
|
|
writer.writeFormatAttribute("endNode", TMP_FORMAT, pMark->GetMarkEnd().nNode.GetIndex());
|
2013-02-15 16:07:03 +01:00
|
|
|
writer.writeFormatAttribute("endOffset", "%d", pMark->GetMarkEnd().nContent.GetIndex());
|
2013-02-15 22:58:15 +01:00
|
|
|
OString txt8 = OUStringToOString(pMark->GetName(), RTL_TEXTENCODING_UTF8);
|
|
|
|
writer.writeFormatAttribute("name", "%s", BAD_CAST( txt8.getStr()));
|
2013-02-15 16:07:03 +01:00
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
writer.endElement();
|
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
} // namespace mark
|
|
|
|
} // namespace sw
|
|
|
|
|
2013-02-16 12:20:08 +01:00
|
|
|
void SwFldTypes::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer(w);
|
|
|
|
writer.startElement("swfldtypes");
|
|
|
|
sal_uInt16 nCount = size();
|
|
|
|
for (sal_uInt16 nType = 0; nType < nCount; ++nType)
|
|
|
|
{
|
|
|
|
const SwFieldType *pCurType = (*this)[nType];
|
|
|
|
SwIterator<SwFmtFld, SwFieldType> aIter(*pCurType);
|
|
|
|
for (const SwFmtFld* pCurFldFmt = aIter.First(); pCurFldFmt; pCurFldFmt = aIter.Next())
|
|
|
|
{
|
|
|
|
writer.startElement("swfmtfld");
|
|
|
|
writer.writeFormatAttribute("ptr", "%p", pCurFldFmt);
|
|
|
|
writer.writeFormatAttribute("pTxtAttr", "%p", pCurFldFmt->GetTxtFld());
|
|
|
|
const char* name = "???";
|
|
|
|
switch(pCurFldFmt->GetFld()->GetTyp()->Which())
|
|
|
|
{
|
|
|
|
case RES_POSTITFLD:
|
|
|
|
name = "swpostitfield";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
SAL_INFO("sw.core", "unhandled field type " << pCurFldFmt->GetFld()->GetTyp()->Which());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
writer.startElement(name);
|
|
|
|
writer.writeFormatAttribute("ptr", "%p", pCurFldFmt->GetFld());
|
|
|
|
if (pCurFldFmt->GetFld()->GetTyp()->Which() == RES_POSTITFLD)
|
|
|
|
{
|
|
|
|
const SwPostItField* pField = dynamic_cast<const SwPostItField*>(pCurFldFmt->GetFld());
|
|
|
|
OString txt8 = OUStringToOString(pField->GetName(), RTL_TEXTENCODING_UTF8);
|
|
|
|
writer.writeFormatAttribute("name", "%s", BAD_CAST( txt8.getStr()));
|
|
|
|
}
|
|
|
|
writer.endElement();
|
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
|
2011-09-23 17:51:41 +02:00
|
|
|
void SwNodes::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer( w );
|
|
|
|
writer.startElement( "swnodes" );
|
|
|
|
writer.writeFormatAttribute( "ptr", "%p", this );
|
|
|
|
for( unsigned int i = 0; i < Count(); ++i )
|
|
|
|
{
|
|
|
|
( *this )[ i ]->dumpAsXml( writer );
|
|
|
|
}
|
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwNode::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer( w );
|
|
|
|
const char* name = "???";
|
|
|
|
switch( GetNodeType())
|
|
|
|
{
|
|
|
|
case ND_ENDNODE:
|
|
|
|
name = "end";
|
|
|
|
break;
|
|
|
|
case ND_STARTNODE:
|
|
|
|
case ND_TEXTNODE:
|
|
|
|
abort(); // overriden
|
|
|
|
case ND_TABLENODE:
|
|
|
|
name = "table";
|
|
|
|
break;
|
|
|
|
case ND_GRFNODE:
|
|
|
|
name = "grf";
|
|
|
|
break;
|
|
|
|
case ND_OLENODE:
|
|
|
|
name = "ole";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
writer.startElement( name );
|
|
|
|
writer.writeFormatAttribute( "ptr", "%p", this );
|
2013-06-10 13:00:14 +02:00
|
|
|
writer.writeFormatAttribute( "index", TMP_FORMAT, GetIndex() );
|
2011-09-23 17:51:41 +02:00
|
|
|
writer.endElement();
|
|
|
|
if( GetNodeType() == ND_ENDNODE )
|
|
|
|
writer.endElement(); // end start node
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwStartNode::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer( w );
|
|
|
|
const char* name = "???";
|
|
|
|
switch( GetStartNodeType())
|
|
|
|
{
|
|
|
|
case SwNormalStartNode:
|
|
|
|
name = "start";
|
|
|
|
break;
|
|
|
|
case SwTableBoxStartNode:
|
|
|
|
name = "tablebox";
|
|
|
|
break;
|
|
|
|
case SwFlyStartNode:
|
|
|
|
name = "fly";
|
|
|
|
break;
|
|
|
|
case SwFootnoteStartNode:
|
|
|
|
name = "footnote";
|
|
|
|
break;
|
|
|
|
case SwHeaderStartNode:
|
|
|
|
name = "header";
|
|
|
|
break;
|
|
|
|
case SwFooterStartNode:
|
|
|
|
name = "footer";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
writer.startElement( name );
|
|
|
|
writer.writeFormatAttribute( "ptr", "%p", this );
|
2013-06-10 13:00:14 +02:00
|
|
|
writer.writeFormatAttribute( "index", TMP_FORMAT, GetIndex() );
|
2011-09-23 17:51:41 +02:00
|
|
|
// writer.endElement(); - it is a start node, so don't end, will make xml better nested
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwTxtNode::dumpAsXml( xmlTextWriterPtr w )
|
|
|
|
{
|
|
|
|
WriterHelper writer( w );
|
|
|
|
writer.startElement( "text" );
|
|
|
|
writer.writeFormatAttribute( "ptr", "%p", this );
|
2013-06-10 13:00:14 +02:00
|
|
|
writer.writeFormatAttribute( "index", TMP_FORMAT, GetIndex() );
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString txt = GetTxt();
|
2011-09-23 17:51:41 +02:00
|
|
|
for( int i = 0; i < 32; ++i )
|
|
|
|
txt = txt.replace( i, '*' );
|
2013-04-07 12:06:47 +02:00
|
|
|
OString txt8 = OUStringToOString( txt, RTL_TEXTENCODING_UTF8 );
|
2011-09-23 17:51:41 +02:00
|
|
|
xmlTextWriterWriteString( writer, BAD_CAST( txt8.getStr()));
|
|
|
|
writer.endElement();
|
|
|
|
}
|
|
|
|
|
2011-09-28 23:14:11 +01:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|