summaryrefslogtreecommitdiff
authorzecke <zecke>2002-06-17 14:54:47 (UTC)
committer zecke <zecke>2002-06-17 14:54:47 (UTC)
commitdcba3fed4f2abf001ced72b573f6e50f6b37e1e6 (patch) (unidiff)
tree61432b2b0a68c9604d50df5eda4d2d6be832eecd
parentf27745ccf2ace20e5adc44bf630b20e5657feeb2 (diff)
downloadopie-dcba3fed4f2abf001ced72b573f6e50f6b37e1e6.zip
opie-dcba3fed4f2abf001ced72b573f6e50f6b37e1e6.tar.gz
opie-dcba3fed4f2abf001ced72b573f6e50f6b37e1e6.tar.bz2
Fix a possible crash when opening an empty file
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/tododb.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp
index 1e40c40..17163a0 100644
--- a/libopie/tododb.cpp
+++ b/libopie/tododb.cpp
@@ -1,198 +1,200 @@
1 1
2#include <qdir.h> 2#include <qdir.h>
3#include <opie/tododb.h> 3#include <opie/tododb.h>
4#include <opie/xmltree.h> 4#include <opie/xmltree.h>
5#include <opie/todoresource.h> 5#include <opie/todoresource.h>
6#include <qpe/palmtoprecord.h> 6#include <qpe/palmtoprecord.h>
7#include <qpe/global.h> 7#include <qpe/global.h>
8 8
9using namespace Opie; 9using namespace Opie;
10 10
11namespace { 11namespace {
12 12
13class FileToDoResource : public ToDoResource { 13class FileToDoResource : public ToDoResource {
14public: 14public:
15 FileToDoResource() {}; 15 FileToDoResource() {};
16 // FIXME better parsing 16 // FIXME better parsing
17 bool save(const QString &name, const QValueList<ToDoEvent> &m_todos ){ 17 bool save(const QString &name, const QValueList<ToDoEvent> &m_todos ){
18 // prepare the XML 18 // prepare the XML
19 XMLElement *tasks = new XMLElement( ); 19 XMLElement *tasks = new XMLElement( );
20 tasks->setTagName("Tasks" ); 20 tasks->setTagName("Tasks" );
21 for( QValueList<ToDoEvent>::ConstIterator it = m_todos.begin(); it != m_todos.end(); ++it ){ 21 for( QValueList<ToDoEvent>::ConstIterator it = m_todos.begin(); it != m_todos.end(); ++it ){
22 XMLElement::AttributeMap map; 22 XMLElement::AttributeMap map;
23 XMLElement *task = new XMLElement(); 23 XMLElement *task = new XMLElement();
24 map.insert( "Completed", QString::number((int)(*it).isCompleted() ) ); 24 map.insert( "Completed", QString::number((int)(*it).isCompleted() ) );
25 map.insert( "HasDate", QString::number((int)(*it).hasDate() ) ); 25 map.insert( "HasDate", QString::number((int)(*it).hasDate() ) );
26 map.insert( "Priority", QString::number( (*it).priority() ) ); 26 map.insert( "Priority", QString::number( (*it).priority() ) );
27 map.insert( "Progress", QString::number( (*it).progress() ) ); 27 map.insert( "Progress", QString::number( (*it).progress() ) );
28 map.insert( "Summary", (*it).summary() ); 28 map.insert( "Summary", (*it).summary() );
29 QArray<int> arrat = (*it).categories(); 29 QArray<int> arrat = (*it).categories();
30 QString attr; 30 QString attr;
31 for(uint i=0; i < arrat.count(); i++ ){ 31 for(uint i=0; i < arrat.count(); i++ ){
32 attr.append(QString::number(arrat[i])+";" ); 32 attr.append(QString::number(arrat[i])+";" );
33 } 33 }
34 if(!attr.isEmpty() ) // remove the last ; 34 if(!attr.isEmpty() ) // remove the last ;
35 attr.remove(attr.length()-1, 1 ); 35 attr.remove(attr.length()-1, 1 );
36 map.insert( "Categories", attr ); 36 map.insert( "Categories", attr );
37 //else 37 //else
38 //map.insert( "Categories", QString::null ); 38 //map.insert( "Categories", QString::null );
39 map.insert( "Description", (*it).description() ); 39 map.insert( "Description", (*it).description() );
40 if( (*it).hasDate() ){ 40 if( (*it).hasDate() ){
41 map.insert("DateYear", QString::number( (*it).date().year() ) ); 41 map.insert("DateYear", QString::number( (*it).date().year() ) );
42 map.insert("DateMonth", QString::number( (*it).date().month() ) ); 42 map.insert("DateMonth", QString::number( (*it).date().month() ) );
43 map.insert("DateDay", QString::number( (*it).date().day() ) ); 43 map.insert("DateDay", QString::number( (*it).date().day() ) );
44 } 44 }
45 map.insert("Uid", QString::number( (*it).uid() ) ); 45 map.insert("Uid", QString::number( (*it).uid() ) );
46 task->setTagName("Task" ); 46 task->setTagName("Task" );
47 task->setAttributes( map ); 47 task->setAttributes( map );
48 tasks->appendChild(task); 48 tasks->appendChild(task);
49 } 49 }
50 QFile file( name); 50 QFile file( name);
51 if( file.open(IO_WriteOnly ) ){ 51 if( file.open(IO_WriteOnly ) ){
52 QTextStream stream(&file ); 52 QTextStream stream(&file );
53 stream.setEncoding( QTextStream::UnicodeUTF8 ); 53 stream.setEncoding( QTextStream::UnicodeUTF8 );
54 stream << "<!DOCTYPE Tasks>" << endl; 54 stream << "<!DOCTYPE Tasks>" << endl;
55 tasks->save(stream ); 55 tasks->save(stream );
56 delete tasks; 56 delete tasks;
57 stream << "</Tasks>" << endl; 57 stream << "</Tasks>" << endl;
58 file.close(); 58 file.close();
59 return true; 59 return true;
60 } 60 }
61 return false; 61 return false;
62 } 62 }
63 QValueList<ToDoEvent> load( const QString &name ){ 63 QValueList<ToDoEvent> load( const QString &name ){
64 qWarning("loading tododb" ); 64 qWarning("loading tododb" );
65 QValueList<ToDoEvent> m_todos; 65 QValueList<ToDoEvent> m_todos;
66 XMLElement *root = XMLElement::load( name ); 66 XMLElement *root = XMLElement::load( name );
67 if(root != 0l ){ // start parsing 67 if(root != 0l ){ // start parsing
68 qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() ); 68 qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() );
69 //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start 69 //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start
70 XMLElement *element = root->firstChild(); 70 XMLElement *element = root->firstChild();
71 if (element == 0 )
72 return m_todos;
71 element = element->firstChild(); 73 element = element->firstChild();
72 while( element ){ 74 while( element ){
73 if( element->tagName() != QString::fromLatin1("Task") ){ 75 if( element->tagName() != QString::fromLatin1("Task") ){
74 element = element->nextChild(); 76 element = element->nextChild();
75 continue; 77 continue;
76 } 78 }
77 qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() ); 79 qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() );
78 QString dummy; 80 QString dummy;
79 ToDoEvent event; 81 ToDoEvent event;
80 bool ok; 82 bool ok;
81 int dumInt; 83 int dumInt;
82 // completed 84 // completed
83 dummy = element->attribute("Completed" ); 85 dummy = element->attribute("Completed" );
84 dumInt = dummy.toInt(&ok ); 86 dumInt = dummy.toInt(&ok );
85 if(ok ) event.setCompleted( dumInt == 0 ? false : true ); 87 if(ok ) event.setCompleted( dumInt == 0 ? false : true );
86 // progress 88 // progress
87 dummy = element->attribute("Progress" ); 89 dummy = element->attribute("Progress" );
88 { 90 {
89 ushort dumShort = dummy.toUShort(&ok); 91 ushort dumShort = dummy.toUShort(&ok);
90 event.setProgress( dumShort ); 92 event.setProgress( dumShort );
91 93
92 } 94 }
93 // hasDate 95 // hasDate
94 dummy = element->attribute("HasDate" ); 96 dummy = element->attribute("HasDate" );
95 dumInt = dummy.toInt(&ok ); 97 dumInt = dummy.toInt(&ok );
96 if(ok ) event.setHasDate( dumInt == 0 ? false: true ); 98 if(ok ) event.setHasDate( dumInt == 0 ? false: true );
97 // set the date 99 // set the date
98 bool hasDa = dumInt; 100 bool hasDa = dumInt;
99 if ( hasDa ) { //parse the date 101 if ( hasDa ) { //parse the date
100 int year, day, month = 0; 102 int year, day, month = 0;
101 year = day = month; 103 year = day = month;
102 // year 104 // year
103 dummy = element->attribute("DateYear" ); 105 dummy = element->attribute("DateYear" );
104 dumInt = dummy.toInt(&ok ); 106 dumInt = dummy.toInt(&ok );
105 if( ok ) year = dumInt; 107 if( ok ) year = dumInt;
106 // month 108 // month
107 dummy = element->attribute("DateMonth" ); 109 dummy = element->attribute("DateMonth" );
108 dumInt = dummy.toInt(&ok ); 110 dumInt = dummy.toInt(&ok );
109 if(ok ) month = dumInt; 111 if(ok ) month = dumInt;
110 dummy = element->attribute("DateDay" ); 112 dummy = element->attribute("DateDay" );
111 dumInt = dummy.toInt(&ok ); 113 dumInt = dummy.toInt(&ok );
112 if(ok ) day = dumInt; 114 if(ok ) day = dumInt;
113 // set the date 115 // set the date
114 QDate date( year, month, day ); 116 QDate date( year, month, day );
115 event.setDate( date); 117 event.setDate( date);
116 } 118 }
117 dummy = element->attribute("Priority" ); 119 dummy = element->attribute("Priority" );
118 dumInt = dummy.toInt(&ok ); 120 dumInt = dummy.toInt(&ok );
119 if(!ok ) dumInt = ToDoEvent::NORMAL; 121 if(!ok ) dumInt = ToDoEvent::NORMAL;
120 event.setPriority( dumInt ); 122 event.setPriority( dumInt );
121 //description 123 //description
122 dummy = element->attribute("Description" ); 124 dummy = element->attribute("Description" );
123 event.setDescription( dummy ); 125 event.setDescription( dummy );
124 dummy = element->attribute("Summary" ); 126 dummy = element->attribute("Summary" );
125 event.setSummary( dummy ); 127 event.setSummary( dummy );
126 // category 128 // category
127 dummy = element->attribute("Categories" ); 129 dummy = element->attribute("Categories" );
128 QStringList ids = QStringList::split(";", dummy ); 130 QStringList ids = QStringList::split(";", dummy );
129 event.setCategories( ids ); 131 event.setCategories( ids );
130 132
131 //uid 133 //uid
132 dummy = element->attribute("Uid" ); 134 dummy = element->attribute("Uid" );
133 dumInt = dummy.toInt(&ok ); 135 dumInt = dummy.toInt(&ok );
134 if(ok ) event.setUid( dumInt ); 136 if(ok ) event.setUid( dumInt );
135 m_todos.append( event ); 137 m_todos.append( event );
136 element = element->nextChild(); // next element 138 element = element->nextChild(); // next element
137 } 139 }
138 //} 140 //}
139 }else { 141 }else {
140 qWarning("could not load" ); 142 qWarning("could not load" );
141 } 143 }
142 delete root; 144 delete root;
143 qWarning("returning" ); 145 qWarning("returning" );
144 return m_todos; 146 return m_todos;
145 } 147 }
146}; 148};
147 149
148} 150}
149 151
150ToDoDB::ToDoDB(const QString &fileName, ToDoResource *res ){ 152ToDoDB::ToDoDB(const QString &fileName, ToDoResource *res ){
151 m_fileName = fileName; 153 m_fileName = fileName;
152 if( fileName.isEmpty() && res == 0 ){ 154 if( fileName.isEmpty() && res == 0 ){
153 m_fileName = Global::applicationFileName("todolist","todolist.xml"); 155 m_fileName = Global::applicationFileName("todolist","todolist.xml");
154 res = new FileToDoResource(); 156 res = new FileToDoResource();
155 //qWarning("%s", m_fileName.latin1() ); 157 //qWarning("%s", m_fileName.latin1() );
156 }else if(res == 0 ){ // let's create a ToDoResource for xml 158 }else if(res == 0 ){ // let's create a ToDoResource for xml
157 res = new FileToDoResource(); 159 res = new FileToDoResource();
158 } 160 }
159 m_res = res; 161 m_res = res;
160 load(); 162 load();
161} 163}
162ToDoResource* ToDoDB::resource(){ 164ToDoResource* ToDoDB::resource(){
163 return m_res; 165 return m_res;
164}; 166};
165void ToDoDB::setResource( ToDoResource *res ) 167void ToDoDB::setResource( ToDoResource *res )
166{ 168{
167 delete m_res; 169 delete m_res;
168 m_res = res; 170 m_res = res;
169} 171}
170ToDoDB::~ToDoDB() 172ToDoDB::~ToDoDB()
171{ 173{
172 delete m_res; 174 delete m_res;
173} 175}
174QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to, 176QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to,
175 bool all ) 177 bool all )
176{ 178{
177 QValueList<ToDoEvent> events; 179 QValueList<ToDoEvent> events;
178 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ 180 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
179 if( (*it).hasDate() ){ 181 if( (*it).hasDate() ){
180 if( (*it).date() >= from && (*it).date() <= to ) 182 if( (*it).date() >= from && (*it).date() <= to )
181 events.append( (*it) ); 183 events.append( (*it) );
182 }else if( all ){ 184 }else if( all ){
183 events.append( (*it) ); 185 events.append( (*it) );
184 } 186 }
185 } 187 }
186 return events; 188 return events;
187} 189}
188QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, 190QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from,
189 bool all) 191 bool all)
190{ 192{
191 return effectiveToDos( from, QDate::currentDate(), all ); 193 return effectiveToDos( from, QDate::currentDate(), all );
192} 194}
193QValueList<ToDoEvent> ToDoDB::overDue() 195QValueList<ToDoEvent> ToDoDB::overDue()
194{ 196{
195 QValueList<ToDoEvent> events; 197 QValueList<ToDoEvent> events;
196 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ 198 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
197 if( (*it).isOverdue() ) 199 if( (*it).isOverdue() )
198 events.append((*it) ); 200 events.append((*it) );