summaryrefslogtreecommitdiff
path: root/libopie
Unidiff
Diffstat (limited to 'libopie') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/xmltree.cc42
-rw-r--r--libopie/xmltree.h2
2 files changed, 19 insertions, 25 deletions
diff --git a/libopie/xmltree.cc b/libopie/xmltree.cc
index d5ce74a..3d03cc6 100644
--- a/libopie/xmltree.cc
+++ b/libopie/xmltree.cc
@@ -12,44 +12,23 @@
12 Library General Public License for more details. 12 Library General Public License for more details.
13 13
14 You should have received a copy of the GNU Library General Public License 14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to 15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. 17 Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20 20#include <qpe/stringutil.h>
21#include <opie/xmltree.h> 21#include <opie/xmltree.h>
22 22
23#include <qxml.h> 23#include <qxml.h>
24 24
25#include <assert.h> 25#include <assert.h>
26 26
27namespace
28{
29
30/**
31 Encode an attribute value upon saving.
32 replaces '"' with "&quot"
33 replaces '<' with "&lt"
34 replaces '&' with "&amp"
35 replaces '>' with "&gt"
36*/
37QString encodeAttr( const QString& str )
38{
39 QString encAttr( str ); // cause of the const parameter
40 encAttr = encAttr.replace( QRegExp( "[<]" ), "&lt" );
41 encAttr = encAttr.replace( QRegExp( "[>]" ), "&gt" );
42 encAttr = encAttr.replace( QRegExp( "[\"]" ), "&quot" );
43 encAttr = encAttr.replace( QRegExp( "[&]" ), "&amp" );
44 return encAttr;
45}
46
47}
48 27
49XMLElement::XMLElement() 28XMLElement::XMLElement()
50 : m_parent( 0 ), m_next( 0 ), m_prev( 0 ), m_first( 0 ), m_last( 0 ) 29 : m_parent( 0 ), m_next( 0 ), m_prev( 0 ), m_first( 0 ), m_last( 0 )
51{ 30{
52} 31}
53 32
54XMLElement::~XMLElement() 33XMLElement::~XMLElement()
55{ 34{
@@ -105,17 +84,28 @@ void XMLElement::insertAfter( XMLElement *newChild, XMLElement *refChild )
105 refChild->m_next = newChild; 84 refChild->m_next = newChild;
106 85
107 newChild->m_prev = refChild; 86 newChild->m_prev = refChild;
108 newChild->m_next = next; 87 newChild->m_next = next;
109 88
110 if ( next ) 89 if ( next )
111 next->m_prev = newChild; 90 next->m_prev = newChild;
112} 91}
113 92QString XMLElement::attribute(const QString &attr )const
93{
94 if ( !m_attributes.contains( attr ) )
95 return QString::null;
96 AttributeMap::ConstIterator it = m_attributes.find( attr );
97 return it.data();
98}
99void XMLElement::setAttribute(const QString &attr, const QString &value )
100{
101 m_attributes.remove( attr );
102 m_attributes.insert( attr, value );
103}
114void XMLElement::insertBefore( XMLElement *newChild, XMLElement *refChild ) 104void XMLElement::insertBefore( XMLElement *newChild, XMLElement *refChild )
115{ 105{
116 assert( refChild ); 106 assert( refChild );
117 assert( refChild->m_parent ); 107 assert( refChild->m_parent );
118 assert( refChild->m_parent == this ); 108 assert( refChild->m_parent == this );
119 assert( newChild != refChild ); 109 assert( newChild != refChild );
120 110
121 if ( newChild->m_parent && newChild != refChild ) 111 if ( newChild->m_parent && newChild != refChild )
@@ -158,33 +148,33 @@ void XMLElement::removeChild( XMLElement *child )
158 child->m_prev = 0; 148 child->m_prev = 0;
159 child->m_next = 0; 149 child->m_next = 0;
160} 150}
161 151
162void XMLElement::save( QTextStream &s, uint indent ) 152void XMLElement::save( QTextStream &s, uint indent )
163{ 153{
164 if ( !m_value.isEmpty() ) 154 if ( !m_value.isEmpty() )
165 { 155 {
166 s << encodeAttr( m_value ); 156 s << Qtopia::escapeString( m_value );
167 return; 157 return;
168 } 158 }
169 159
170 for ( uint i = 0; i < indent; ++i ) 160 for ( uint i = 0; i < indent; ++i )
171 s << " "; 161 s << " ";
172 162
173 s << "<" << m_tag; 163 s << "<" << m_tag;
174 164
175 if ( !m_attributes.isEmpty() ) 165 if ( !m_attributes.isEmpty() )
176 { 166 {
177 s << " "; 167 s << " ";
178 AttributeMap::ConstIterator it = m_attributes.begin(); 168 AttributeMap::ConstIterator it = m_attributes.begin();
179 AttributeMap::ConstIterator end = m_attributes.end(); 169 AttributeMap::ConstIterator end = m_attributes.end();
180 for (; it != end; ++it ) 170 for (; it != end; ++it )
181 { 171 {
182 s << it.key() << "=\"" << encodeAttr( it.data() ) << "\""; 172 s << it.key() << "=\"" << Qtopia::escapeString( it.data() ) << "\"";
183 s << " "; 173 s << " ";
184 } 174 }
185 } 175 }
186 176
187 if ( m_last ) 177 if ( m_last )
188 { 178 {
189 if ( ( m_first && !m_first->value().isEmpty() ) || !m_parent ) 179 if ( ( m_first && !m_first->value().isEmpty() ) || !m_parent )
190 s << ">"; 180 s << ">";
@@ -319,8 +309,10 @@ XMLElement *XMLElement::load( const QString &fileName )
319 Handler handler; 309 Handler handler;
320 310
321 reader.setFeature( "http://trolltech.com/xml/features/report-whitespace-only-CharData", false ); 311 reader.setFeature( "http://trolltech.com/xml/features/report-whitespace-only-CharData", false );
322 reader.setContentHandler( &handler ); 312 reader.setContentHandler( &handler );
323 reader.parse( src ); 313 reader.parse( src );
324 314
325 return handler.root();; 315 return handler.root();;
326} 316}
317
318
diff --git a/libopie/xmltree.h b/libopie/xmltree.h
index 7f1b7b7..7f50365 100644
--- a/libopie/xmltree.h
+++ b/libopie/xmltree.h
@@ -79,16 +79,18 @@ public:
79 79
80 void setValue( const QString &val ) { m_value = val; } 80 void setValue( const QString &val ) { m_value = val; }
81 QString value() const { return m_value; } 81 QString value() const { return m_value; }
82 82
83 void setAttributes( const AttributeMap &attrs ) { m_attributes = attrs; } 83 void setAttributes( const AttributeMap &attrs ) { m_attributes = attrs; }
84 AttributeMap attributes() const { return m_attributes; } 84 AttributeMap attributes() const { return m_attributes; }
85 AttributeMap &attributes() { return m_attributes; } 85 AttributeMap &attributes() { return m_attributes; }
86 86
87 QString attribute(const QString &)const;
88 void setAttribute( const QString &attr, const QString &value );
87 void save( QTextStream &stream, uint indent = 0 ); 89 void save( QTextStream &stream, uint indent = 0 );
88 90
89 XMLElement *namedItem( const QString &name ); 91 XMLElement *namedItem( const QString &name );
90 92
91 XMLElement *clone() const; 93 XMLElement *clone() const;
92 94
93 static XMLElement *load( const QString &fileName ); 95 static XMLElement *load( const QString &fileName );
94 96