22 #include "xmldiffalgo.h"
26 using namespace KSync;
32 static bool compareString(
const TQString &left,
const TQString &right )
34 if ( left.isEmpty() && right.isEmpty() )
41 XmlDiffAlgo::XmlDiffAlgo(
const TQString &leftXml,
const TQString &rightXml )
43 kdDebug() << __func__ <<
" " << __LINE__ << endl;
45 mLeftXml.setContent( leftXml );
46 mRightXml.setContent( rightXml );
50 XmlDiffAlgo::XmlDiffAlgo(
const TQDomDocument &leftXml,
const TQDomDocument &rightXml )
51 : mLeftXml( leftXml ), mRightXml( rightXml )
53 kdDebug() << __func__ <<
" " << __LINE__ << endl;
56 void XmlDiffAlgo::appendSingleNodes(TQDomElement &element,
bool isLeft)
60 for ( node = element.firstChild(); !node.isNull(); node = node.nextSibling() ) {
61 TQDomElement child = node.toElement();
64 additionalLeftField( node.nodeName(), child.text() );
66 additionalRightField( node.nodeName(), child.text() );
71 void XmlDiffAlgo::appendConflictNodes(TQDomElement &leftElement, TQDomElement &rightElement)
73 TQDomNode left, right;
74 TQDomElement leftChild, rightChild;
76 for ( left = leftElement.firstChild(); !left.isNull(); left = left.nextSibling() ) {
77 leftChild = left.toElement();
79 for ( right = rightElement.firstChild(); !right.isNull(); right = right.nextSibling() ) {
80 rightChild = right.toElement();
82 if ( leftChild.tagName() != rightChild.tagName() )
85 if (leftChild.text().isEmpty() || rightChild.text().isEmpty())
88 TQString
id = leftChild.tagName();
90 id = left.parentNode().nodeName();
92 conflictField(
id, leftChild.text(), rightChild.text() );
94 left.parentNode().removeChild( left );
95 left = leftElement.firstChild();
97 right.parentNode().removeChild( right );
98 right = rightElement.firstChild();
104 void XmlDiffAlgo::compareNode(TQDomElement &leftElement, TQDomElement &rightElement)
106 TQDomNode left, right;
107 TQDomElement leftChild, rightChild;
111 for ( left = leftElement.firstChild(); !left.isNull(); left = left.nextSibling() ) {
112 leftChild = left.toElement();
114 for ( right = rightElement.firstChild(); !right.isNull(); right = right.nextSibling() ) {
115 rightChild = right.toElement();
117 if (leftChild.tagName() != rightChild.tagName())
120 if ( left.childNodes().count() > 1 && right.childNodes().count() > 1 ) {
121 compareNode( leftChild, rightChild );
123 if ( !left.hasChildNodes() && !right.hasChildNodes() ) {
124 left.parentNode().removeChild( left );
125 right.parentNode().removeChild( right );
132 if ( leftChild.text() == rightChild.text() ) {
133 TQString
id = leftChild.tagName();
135 if (
id ==
"Content" )
136 id = left.parentNode().nodeName();
141 left.parentNode().removeChild( left );
142 right.parentNode().removeChild( right );
148 appendConflictNodes(rightElement, leftElement);
150 appendSingleNodes(rightElement,
false);
151 appendSingleNodes(leftElement,
true);
154 void XmlDiffAlgo::run()
156 kdDebug() << __func__ << endl;
159 TQDomElement leftElement = mLeftXml.documentElement();
160 TQDomElement rightElement = mRightXml.documentElement();
162 compareNode( leftElement, rightElement );