-rw-r--r-- | libopie/tododb.cpp | 237 | ||||
-rw-r--r-- | libopie/tododb.h | 6 | ||||
-rw-r--r-- | libopie/todoevent.h | 1 | ||||
-rw-r--r-- | libopie/todoresource.h | 14 |
4 files changed, 148 insertions, 110 deletions
diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp index eb17674..91331d0 100644 --- a/libopie/tododb.cpp +++ b/libopie/tododb.cpp @@ -1,22 +1,144 @@ #include <qdir.h> #include <opie/tododb.h> #include <opie/xmltree.h> +#include <opie/todoresource.h> #include <qpe/palmtoprecord.h> #include <qpe/global.h> -ToDoDB::ToDoDB(const QString &fileName = QString::null ){ +namespace { + +class FileToDoResource : public ToDoResource { +public: + FileToDoResource() {}; + bool save(const QString &name, const QValueList<ToDoEvent> &m_todos ){ + // prepare the XML + XMLElement *tasks = new XMLElement( ); + tasks->setTagName("Tasks" ); + for( QValueList<ToDoEvent>::ConstIterator it = m_todos.begin(); it != m_todos.end(); ++it ){ + XMLElement::AttributeMap map; + XMLElement *task = new XMLElement(); + map.insert( "Completed", QString::number((int)(*it).isCompleted() ) ); + map.insert( "HasDate", QString::number((int)(*it).hasDate() ) ); + map.insert( "Priority", QString::number( (*it).priority() ) ); + if(!(*it).category().isEmpty() ){ + QArray<int> arrat(1); + arrat = Qtopia::Record::idsFromString( (*it).category() ); + map.insert( "Categories", QString::number( arrat[0] ) ); + }else + map.insert( "Categories", QString::null ); + map.insert( "Description", (*it).description() ); + if( (*it).hasDate() ){ + map.insert("DateYear", QString::number( (*it).date().year() ) ); + map.insert("DateMonth", QString::number( (*it).date().month() ) ); + map.insert("DateDay", QString::number( (*it).date().day() ) ); + } + map.insert("Uid", QString::number( (*it).uid() ) ); + task->setTagName("Task" ); + task->setAttributes( map ); + tasks->appendChild(task); + } + QFile file( name); + if( file.open(IO_WriteOnly ) ){ + QTextStream stream(&file ); + stream << "<!DOCTYPE Tasks>" << endl; + tasks->save(stream ); + delete tasks; + file.close(); + return true; + } + return false; + } + QValueList<ToDoEvent> load( const QString &name ){ + qWarning("loading tododb" ); + QValueList<ToDoEvent> m_todos; + XMLElement *root = XMLElement::load( name ); + if(root != 0l ){ // start parsing + qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() ); + //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start + XMLElement *element = root->firstChild(); + element = element->firstChild(); + while( element ){ + qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() ); + QString dummy; + ToDoEvent event; + bool ok; + int dumInt; + // completed + dummy = element->attribute("Completed" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.setCompleted( dumInt == 0 ? false : true ); + // hasDate + dummy = element->attribute("HasDate" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.setHasDate( dumInt == 0 ? false: true ); + // set the date + bool hasDa = dumInt; + if ( hasDa ) { //parse the date + int year, day, month = 0; + year = day = month; + // year + dummy = element->attribute("DateYear" ); + dumInt = dummy.toInt(&ok ); + if( ok ) year = dumInt; + // month + dummy = element->attribute("DateMonth" ); + dumInt = dummy.toInt(&ok ); + if(ok ) month = dumInt; + dummy = element->attribute("DateDay" ); + dumInt = dummy.toInt(&ok ); + if(ok ) day = dumInt; + // set the date + QDate date( year, month, day ); + event.setDate( date); + } + dummy = element->attribute("Priority" ); + dumInt = dummy.toInt(&ok ); + if(!ok ) dumInt = ToDoEvent::NORMAL; + event.setPriority( dumInt ); + //description + dummy = element->attribute("Description" ); + event.setDescription( dummy ); + // category + dummy = element->attribute("Categories" ); + dumInt = dummy.toInt(&ok ); + if(ok ) { + QArray<int> arrat(1); + arrat[0] = dumInt; + event.setCategory( Qtopia::Record::idsToString( arrat ) ); + } + //uid + dummy = element->attribute("Uid" ); + dumInt = dummy.toInt(&ok ); + if(ok ) event.setUid( dumInt ); + m_todos.append( event ); + element = element->nextChild(); // next element + } + //} + }else { + qWarning("could not load" ); + } + delete root; + return m_todos; + } +}; + +} + +ToDoDB::ToDoDB(const QString &fileName = QString::null, ToDoResource *res ){ m_fileName = fileName; - if( fileName.isEmpty() ){ + if( fileName.isEmpty() && res == 0 ){ m_fileName = Global::applicationFileName("todolist","todolist.xml");; - qWarning("%s", m_fileName.latin1() ); + //qWarning("%s", m_fileName.latin1() ); + }else if(res == 0 ){ // let's create a ToDoResource for xml + res = new FileToDoResource(); } - + m_res = res; load(); } ToDoDB::~ToDoDB() { } QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to, bool all ) @@ -72,124 +194,21 @@ void ToDoDB::setFileName(const QString &file ) m_fileName =file; } QString ToDoDB::fileName()const { return m_fileName; } void ToDoDB::load() { - qWarning("loading tododb" ); - m_todos.clear(); - XMLElement *root = XMLElement::load( m_fileName ); - if(root != 0l ){ // start parsing - qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() ); - //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start - XMLElement *element = root->firstChild(); - element = element->firstChild(); - while( element ){ - qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() ); - QString dummy; - ToDoEvent event; - bool ok; - int dumInt; - // completed - dummy = element->attribute("Completed" ); - dumInt = dummy.toInt(&ok ); - if(ok ) event.setCompleted( dumInt == 0 ? false : true ); - // hasDate - dummy = element->attribute("HasDate" ); - dumInt = dummy.toInt(&ok ); - if(ok ) event.setHasDate( dumInt == 0 ? false: true ); - // set the date - bool hasDa = dumInt; - if ( hasDa ) { //parse the date - int year, day, month = 0; - year = day = month; - // year - dummy = element->attribute("DateYear" ); - dumInt = dummy.toInt(&ok ); - if( ok ) year = dumInt; - // month - dummy = element->attribute("DateMonth" ); - dumInt = dummy.toInt(&ok ); - if(ok ) month = dumInt; - dummy = element->attribute("DateDay" ); - dumInt = dummy.toInt(&ok ); - if(ok ) day = dumInt; - // set the date - QDate date( year, month, day ); - event.setDate( date); - } - dummy = element->attribute("Priority" ); - dumInt = dummy.toInt(&ok ); - if(!ok ) dumInt = ToDoEvent::NORMAL; - event.setPriority( dumInt ); - //description - dummy = element->attribute("Description" ); - event.setDescription( dummy ); - // category - dummy = element->attribute("Categories" ); - dumInt = dummy.toInt(&ok ); - if(ok ) { - QArray<int> arrat(1); - arrat[0] = dumInt; - event.setCategory( Qtopia::Record::idsToString( arrat ) ); - } - //uid - dummy = element->attribute("Uid" ); - dumInt = dummy.toInt(&ok ); - if(ok ) event.m_uid = dumInt; - m_todos.append( event ); - element = element->nextChild(); // next element - } - //} - }else { - qWarning("could not load" ); - } - delete root; + } bool ToDoDB::save() { -// prepare the XML - XMLElement *tasks = new XMLElement( ); - tasks->setTagName("Tasks" ); - for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it != m_todos.end(); ++it ){ - XMLElement::AttributeMap map; - XMLElement *task = new XMLElement(); - map.insert( "Completed", QString::number((int)(*it).isCompleted() ) ); - map.insert( "HasDate", QString::number((int)(*it).hasDate() ) ); - map.insert( "Priority", QString::number( (*it).priority() ) ); - if(!(*it).category().isEmpty() ){ - QArray<int> arrat(1); - arrat = Qtopia::Record::idsFromString( (*it).category() ); - map.insert( "Categories", QString::number( arrat[0] ) ); - }else - map.insert( "Categories", QString::null ); - map.insert( "Description", (*it).description() ); - if( (*it).hasDate() ){ - map.insert("DateYear", QString::number( (*it).date().year() ) ); - map.insert("DateMonth", QString::number( (*it).date().month() ) ); - map.insert("DateDay", QString::number( (*it).date().day() ) ); - } - map.insert("Uid", QString::number( (*it).uid() ) ); - task->setTagName("Task" ); - task->setAttributes( map ); - tasks->appendChild(task); - } - QFile file( m_fileName); - if( file.open(IO_WriteOnly ) ){ - QTextStream stream(&file ); - stream << "<!DOCTYPE Tasks>" << endl; - tasks->save(stream ); - delete tasks; - file.close(); - return true; - } - return false; + return m_res->save( m_fileName, m_todos ); } diff --git a/libopie/tododb.h b/libopie/tododb.h index 6478363..945f343 100644 --- a/libopie/tododb.h +++ b/libopie/tododb.h @@ -1,40 +1,44 @@ #ifndef tododb_h #define tododb_h #include <qvaluelist.h> #include <opie/todoevent.h> +class ToDoResource; class ToDoDB { public: // if no argument is supplied pick the default book - ToDoDB(const QString &fileName = QString::null ); + ToDoDB(const QString &fileName = QString::null, ToDoResource* resource= 0 ); ~ToDoDB(); QValueList<ToDoEvent> effectiveToDos(const QDate &from, const QDate &to, bool includeNoDates = true); QValueList<ToDoEvent> effectiveToDos(const QDate &start, bool includeNoDates = true ); QValueList<ToDoEvent> rawToDos(); // all events QValueList<ToDoEvent> overDue(); void addEvent(const ToDoEvent &event ); void editEvent(const ToDoEvent &editEvent ); void removeEvent(const ToDoEvent &event); void reload(); void setFileName(const QString & ); QString fileName()const; bool save(); + ToDoResource *resource(); + void setResource(ToDoResource* res); private: class ToDoDBPrivate; ToDoDBPrivate *d; QString m_fileName; + ToDoResource *m_res; QValueList<ToDoEvent> m_todos; void load(); }; #endif diff --git a/libopie/todoevent.h b/libopie/todoevent.h index dd8c0c9..79522b2 100644 --- a/libopie/todoevent.h +++ b/libopie/todoevent.h @@ -24,16 +24,17 @@ class ToDoEvent { void setHasDate( bool hasDate ); // if the category doesn't exist we will create it void setCategory( const QString &category ); void setPriority(int priority ); void setDate( QDate date ); void setDescription(const QString& ); bool isOverdue(); + void setUid(int id) {m_uid = id; }; bool operator<(const ToDoEvent &toDoEvent )const; bool operator<=(const ToDoEvent &toDoEvent )const; bool operator!=(const ToDoEvent &toDoEvent )const { return !(*this == toDoEvent); }; bool operator>(const ToDoEvent &toDoEvent )const; bool operator>=(const ToDoEvent &toDoEvent)const; bool operator==(const ToDoEvent &toDoEvent )const; ToDoEvent &operator=(const ToDoEvent &toDoEvent ); private: diff --git a/libopie/todoresource.h b/libopie/todoresource.h new file mode 100644 index 0000000..34edb04 --- a/dev/null +++ b/libopie/todoresource.h @@ -0,0 +1,14 @@ + + +#ifndef opietodoresource_h +#define opietodoresource_h + +class ToDoEvent; +class ToDoResource { + public: + ToDoResource( ) {}; + virtual QValueList<ToDoEvent> load(const QString &file ) = 0; + virtual bool save( const QString &file, const QValueList<ToDoEvent> & ) = 0; +}; + +#endif |