summaryrefslogtreecommitdiff
path: root/libopie2/opiepim
Side-by-side diff
Diffstat (limited to 'libopie2/opiepim') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp138
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.h3
-rw-r--r--libopie2/opiepim/otodo.cpp1
3 files changed, 89 insertions, 53 deletions
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp
index 692483e..31822d4 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.cpp
+++ b/libopie2/opiepim/backend/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 )
+ // 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;
- element = element->firstChild();
+ 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;
- while ( element ) {
- if ( element->tagName() != QString::fromLatin1("Task") ) {
- element = element->nextChild();
+ // 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;
}
- /* here is the right element for a task */
- OTodo ev = todo( &dict, element );
- m_events.insert( ev.uid(), ev );
- element = element->nextChild();
+ 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 );
+
}
- }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() ];
+
+ 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() );
+ ev.setUid( val.toInt() );
break;
case OTodo::Category:
- ev.setCategories( ev.idsFromString( it.data() ) );
+ ev.setCategories( ev.idsFromString( val ) );
break;
case OTodo::HasDate:
- ev.setHasDueDate( it.data().toInt() );
+ ev.setHasDueDate( val.toInt() );
break;
case OTodo::Completed:
- ev.setCompleted( it.data().toInt() );
+ ev.setCompleted( val.toInt() );
break;
case OTodo::Description:
- ev.setDescription( it.data() );
+ ev.setDescription( val );
break;
case OTodo::Summary:
- ev.setSummary( it.data() );
+ ev.setSummary( val );
break;
case OTodo::Priority:
- qWarning("ParsePriority " + it.data() );
- ev.setPriority( it.data().toInt() );
+ ev.setPriority( val.toInt() );
break;
case OTodo::DateDay:
- day = it.data().toInt();
+ m_day = val.toInt();
break;
case OTodo::DateMonth:
- month = it.data().toInt();
+ m_month = val.toInt();
break;
case OTodo::DateYear:
- year = it.data().toInt();
+ m_year = val.toInt();
break;
case OTodo::Progress:
- ev.setProgress( it.data().toInt() );
+ 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(';', it.data() );
+ 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() );
+ ev.setHasAlarmDateTime( val.toInt() );
break;
case OTodo::AlarmDateTime: {
/* this sounds better ;) zecke */
- ev.setAlarmDateTime( TimeConversion::fromISO8601( it.data().local8Bit() ) );
+ 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;
diff --git a/libopie2/opiepim/backend/otodoaccessxml.h b/libopie2/opiepim/backend/otodoaccessxml.h
index 6886bab..1e7e371 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.h
+++ b/libopie2/opiepim/backend/otodoaccessxml.h
@@ -30,26 +30,27 @@ public:
bool add( const OTodo& );
bool remove( int uid );
bool replace( const OTodo& );
/* our functions */
QArray<int> effectiveToDos( const QDate& start,
const QDate& end,
bool includeNoDates );
QArray<int> overDue();
QArray<int> sorted( bool asc, int sortOrder,
int sortFilter, int cat );
private:
- OTodo todo( QAsciiDict<int>*, Opie::XMLElement* )const;
+ void todo( QAsciiDict<int>*, OTodo&,const QCString&,const QString& );
QString toString( const OTodo& )const;
QString toString( const QArray<int>& ints ) const;
QMap<int, OTodo> m_events;
QString m_file;
QString m_app;
bool m_opened : 1;
bool m_changed : 1;
class OTodoAccessXMLPrivate;
OTodoAccessXMLPrivate* d;
+ int m_year, m_month, m_day;
};
#endif
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index eb9dad3..6dd4c0e 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -163,25 +163,24 @@ void OTodo::setDescription(const QString &desc )
{
// qWarning( "desc " + desc );
changeOrModify();
data->desc = Qtopia::simplifyMultiLineSpace(desc );
}
void OTodo::setSummary( const QString& sum )
{
changeOrModify();
data->sum = sum;
}
void OTodo::setPriority(int prio )
{
- qWarning("set priority %d", prio);
changeOrModify();
data->priority = prio;
}
void OTodo::setDueDate( QDate date )
{
changeOrModify();
data->date = date;
}
void OTodo::setAlarmDateTime( const QDateTime& alarm )
{
changeOrModify();
data->alarmDateTime = alarm;