summaryrefslogtreecommitdiff
path: root/libopie/pim/otodoaccessxml.cpp
Side-by-side diff
Diffstat (limited to 'libopie/pim/otodoaccessxml.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/otodoaccessxml.cpp240
1 files changed, 138 insertions, 102 deletions
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp
index 692483e..31822d4 100644
--- a/libopie/pim/otodoaccessxml.cpp
+++ b/libopie/pim/otodoaccessxml.cpp
@@ -37,54 +37,97 @@ bool OTodoAccessXML::load() {
dict.insert("Description" , new int(OTodo::Description) );
dict.insert("Summary" , new int(OTodo::Summary) );
dict.insert("Priority" , new int(OTodo::Priority) );
dict.insert("DateDay" , new int(OTodo::DateDay) );
dict.insert("DateMonth" , new int(OTodo::DateMonth) );
dict.insert("DateYear" , new int(OTodo::DateYear) );
dict.insert("Progress" , new int(OTodo::Progress) );
dict.insert("Completed", new int(OTodo::Completed) );
dict.insert("CrossReference", new int(OTodo::CrossReference) );
dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) );
dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) );
- Opie::XMLElement *root = Opie::XMLElement::load( m_file );
- int day, year, month;
- day = year = month = -1;
-
- /* if opened */
- if ( root != 0l ) {
- Opie::XMLElement *element = root->firstChild();
- if ( element == 0l )
- return false;
-
- element = element->firstChild();
+ // here the custom XML parser from TT it's GPL
+ // but we want to push that to TT.....
+ QFile f(m_file );
+ if (!f.open(IO_ReadOnly) )
+ return false;
- while ( element ) {
- if ( element->tagName() != QString::fromLatin1("Task") ) {
- element = element->nextChild();
- continue;
- }
- /* here is the right element for a task */
- OTodo ev = todo( &dict, element );
- m_events.insert( ev.uid(), ev );
+ QByteArray ba = f.readAll();
+ f.close();
+ char* dt = ba.data();
+ int len = ba.size();
+ int i = 0;
+ char *point;
+ const char* collectionString = "<Task ";
+ while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) {
+ i = point -dt;
+ i+= strlen(collectionString);
+ OTodo ev;
+ m_year = m_month = m_day = 0;
+
+ while ( TRUE ) {
+ while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') )
+ ++i;
+ if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') )
+ break;
+
+ // we have another attribute, read it.
+ int j = i;
+ while ( j < len && dt[j] != '=' )
+ ++j;
+ QCString attr( dt+i, j-i+1);
+
+ i = ++j; // skip =
+
+ // find the start of quotes
+ while ( i < len && dt[i] != '"' )
+ ++i;
+ j = ++i;
+
+ bool haveUtf = FALSE;
+ bool haveEnt = FALSE;
+ while ( j < len && dt[j] != '"' ) {
+ if ( ((unsigned char)dt[j]) > 0x7f )
+ haveUtf = TRUE;
+ if ( dt[j] == '&' )
+ haveEnt = TRUE;
+ ++j;
+ }
+ if ( i == j ) {
+ // empty value
+ i = j + 1;
+ continue;
+ }
+
+ QCString value( dt+i, j-i+1 );
+ i = j + 1;
+
+ QString str = (haveUtf ? QString::fromUtf8( value )
+ : QString::fromLatin1( value ) );
+ if ( haveEnt )
+ str = Qtopia::plainString( str );
+
+ /*
+ * add key + value
+ */
+ todo( &dict, ev, attr, str );
- element = element->nextChild();
}
- }else {
-// qWarning("could not parse");
- return false;;
+ /*
+ * now add it
+ */
+ m_events.insert(ev.uid(), ev );
}
- delete root;
-// qWarning("Access %d" + m_events.count() );
return true;
}
bool OTodoAccessXML::reload() {
return load();
}
bool OTodoAccessXML::save() {
// qWarning("saving");
if (!m_opened || !m_changed ) {
// qWarning("not saving");
return true;
}
QString strNewFile = m_file + ".new";
@@ -211,111 +254,104 @@ QArray<int> OTodoAccessXML::overDue() {
for ( it = m_events.begin(); it != m_events.end(); ++it ) {
if ( it.data().isOverdue() ) {
ids[i] = it.key();
i++;
}
}
ids.resize( i );
return ids;
}
/* private */
-OTodo OTodoAccessXML::todo( QAsciiDict<int>* dict, Opie::XMLElement* element)const {
+void OTodoAccessXML::todo( QAsciiDict<int>* dict, OTodo& ev,
+ const QCString& attr, const QString& val) {
// qWarning("parse to do from XMLElement" );
- OTodo ev;
- QMap<QString, QString> attributes = element->attributes();
- QMap<QString, QString>::Iterator it;
int *find=0;
- int day, month, year;
- day = month = year = -1;
- for ( it = attributes.begin(); it != attributes.end(); ++it ) {
- find = (*dict)[ it.key() ];
- if (!find ) {
+
+ find = (*dict)[ attr.data() ];
+ if (!find ) {
// qWarning("Unknown option" + it.key() );
- ev.setCustomField( it.key(), it.data() );
- continue;
- }
+ ev.setCustomField( attr, val );
+ return;
+ }
- switch( *find ) {
- case OTodo::Uid:
- ev.setUid( it.data().toInt() );
- break;
- case OTodo::Category:
- ev.setCategories( ev.idsFromString( it.data() ) );
- break;
- case OTodo::HasDate:
- ev.setHasDueDate( it.data().toInt() );
- break;
- case OTodo::Completed:
- ev.setCompleted( it.data().toInt() );
- break;
- case OTodo::Description:
- ev.setDescription( it.data() );
- break;
- case OTodo::Summary:
- ev.setSummary( it.data() );
- break;
- case OTodo::Priority:
- qWarning("ParsePriority " + it.data() );
- ev.setPriority( it.data().toInt() );
- break;
- case OTodo::DateDay:
- day = it.data().toInt();
- break;
- case OTodo::DateMonth:
- month = it.data().toInt();
- break;
- case OTodo::DateYear:
- year = it.data().toInt();
- break;
- case OTodo::Progress:
- ev.setProgress( it.data().toInt() );
- break;
- case OTodo::CrossReference:
- {
- /*
- * A cross refernce looks like
- * appname,id;appname,id
- * we need to split it up
- */
- QStringList refs = QStringList::split(';', it.data() );
- QStringList::Iterator strIt;
- for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) {
- int pos = (*strIt).find(',');
- if ( pos > -1 )
- ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() );
+ switch( *find ) {
+ case OTodo::Uid:
+ ev.setUid( val.toInt() );
+ break;
+ case OTodo::Category:
+ ev.setCategories( ev.idsFromString( val ) );
+ break;
+ case OTodo::HasDate:
+ ev.setHasDueDate( val.toInt() );
+ break;
+ case OTodo::Completed:
+ ev.setCompleted( val.toInt() );
+ break;
+ case OTodo::Description:
+ ev.setDescription( val );
+ break;
+ case OTodo::Summary:
+ ev.setSummary( val );
+ break;
+ case OTodo::Priority:
+ ev.setPriority( val.toInt() );
+ break;
+ case OTodo::DateDay:
+ m_day = val.toInt();
+ break;
+ case OTodo::DateMonth:
+ m_month = val.toInt();
+ break;
+ case OTodo::DateYear:
+ m_year = val.toInt();
+ break;
+ case OTodo::Progress:
+ ev.setProgress( val.toInt() );
+ break;
+ case OTodo::CrossReference:
+ {
+ /*
+ * A cross refernce looks like
+ * appname,id;appname,id
+ * we need to split it up
+ */
+ QStringList refs = QStringList::split(';', val );
+ QStringList::Iterator strIt;
+ for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) {
+ int pos = (*strIt).find(',');
+ if ( pos > -1 )
+ ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() );
- }
- break;
- }
- case OTodo::HasAlarmDateTime:
- ev.setHasAlarmDateTime( it.data().toInt() );
- break;
- case OTodo::AlarmDateTime: {
- /* this sounds better ;) zecke */
- ev.setAlarmDateTime( TimeConversion::fromISO8601( it.data().local8Bit() ) );
- break;
- }
- default:
- break;
}
+ break;
}
+ case OTodo::HasAlarmDateTime:
+ ev.setHasAlarmDateTime( val.toInt() );
+ break;
+ case OTodo::AlarmDateTime: {
+ /* this sounds better ;) zecke */
+ ev.setAlarmDateTime( TimeConversion::fromISO8601( val.local8Bit() ) );
+ break;
+ }
+ default:
+ break;
+ }
+
if ( ev.hasDueDate() ) {
- QDate date( year, month, day );
+ QDate date( m_year, m_month, m_day );
ev.setDueDate( date );
}
-
- return ev;
}
QString OTodoAccessXML::toString( const OTodo& ev )const {
QString str;
str += "Completed=\"" + QString::number( ev.isCompleted() ) + "\" ";
str += "HasDate=\"" + QString::number( ev.hasDueDate() ) + "\" ";
str += "Priority=\"" + QString::number( ev.priority() ) + "\" ";
str += "Progress=\"" + QString::number(ev.progress() ) + "\" ";
str += "Categories=\"" + toString( ev.categories() ) + "\" ";
str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" ";
str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" ";
@@ -471,25 +507,25 @@ public:
int m_sort;
};
QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder,
int sortFilter, int cat ) {
OTodoXMLVector vector(m_events.count(), asc,sortOrder );
QMap<int, OTodo>::Iterator it;
int item = 0;
bool bCat = sortFilter & 1 ? true : false;
bool bOver = sortFilter & 0 ? true : false;
- bool bOnly = split & 2 ? true : false;
+ bool bOnly = sortFilter & 2 ? true : false;
for ( it = m_events.begin(); it != m_events.end(); ++it ) {
/* show category */
if ( bCat )
if (!(*it).categories().contains( cat ) )
continue;
/* isOverdue but we should not show overdue */
if ( (*it).isOverdue() && ( !bOver || !bOnly ) )
continue;
if ( !(*it).isOverdue() && bOnly )
continue;