-rw-r--r-- | libopie/oprocess.h | 2 | ||||
-rw-r--r-- | libopie/tododb.cpp | 8 | ||||
-rw-r--r-- | libopie/todoevent.cpp | 21 | ||||
-rw-r--r-- | libopie/todoevent.h | 11 |
4 files changed, 37 insertions, 5 deletions
diff --git a/libopie/oprocess.h b/libopie/oprocess.h index ce3c87d..fd726b4 100644 --- a/libopie/oprocess.h +++ b/libopie/oprocess.h @@ -1,155 +1,155 @@ /* This file is part of the KDE libraries Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // // KPROCESS -- A class for handling child processes in KDE without // having to take care of Un*x specific implementation details // // version 0.3.1, Jan 8th 1998 // // (C) Christian Czezatke // e9025461@student.tuwien.ac.at -// Ported by Holger Freyther +// Ported by Holger Freyther to the Open Palmtop Integrated Environment // #ifndef __kprocess_h__ #define __kprocess_h__ #include <sys/types.h> // for pid_t #include <sys/wait.h> #include <signal.h> #include <unistd.h> #include <qvaluelist.h> #include <qcstring.h> #include <qobject.h> class QSocketNotifier; class OProcessPrivate; /** * Child process invocation, monitoring and control. * * @sect General usage and features * *This class allows a KDE application to start child processes without having *to worry about UN*X signal handling issues and zombie process reaping. * *@see KProcIO * *Basically, this class distinguishes three different ways of running *child processes: * *@li OProcess::DontCare -- The child process is invoked and both the child *process and the parent process continue concurrently. * *Starting a DontCare child process means that the application is *not interested in any notification to determine whether the *child process has already exited or not. * *@li OProcess::NotifyOnExit -- The child process is invoked and both the *child and the parent process run concurrently. * *When the child process exits, the OProcess instance *corresponding to it emits the Qt signal @ref processExited(). * *Since this signal is @em not emitted from within a UN*X *signal handler, arbitrary function calls can be made. * *Be aware: When the OProcess objects gets destructed, the child *process will be killed if it is still running! *This means in particular, that you cannot use a OProcess on the stack *with OProcess::NotifyOnExit. * *@li OProcess::Block -- The child process starts and the parent process *is suspended until the child process exits. (@em Really not recommended *for programs with a GUI.) * *OProcess also provides several functions for determining the exit status *and the pid of the child process it represents. * *Furthermore it is possible to supply command-line arguments to the process *in a clean fashion (no null -- terminated stringlists and such...) * *A small usage example: *<pre> *OProcess *proc = new OProcess; * **proc << "my_executable"; **proc << "These" << "are" << "the" << "command" << "line" << "args"; *QApplication::connect(proc, SIGNAL(processExited(OProcess *)), * pointer_to_my_object, SLOT(my_objects_slot(OProcess *))); *proc->start(); *</pre> * *This will start "my_executable" with the commandline arguments "These"... * *When the child process exits, the respective Qt signal will be emitted. * *@sect Communication with the child process * *OProcess supports communication with the child process through *stdin/stdout/stderr. * *The following functions are provided for getting data from the child *process or sending data to the child's stdin (For more information, *have a look at the documentation of each function): * *@li bool @ref writeStdin(char *buffer, int buflen); *@li -- Transmit data to the child process's stdin. * *@li bool @ref closeStdin(); *@li -- Closes the child process's stdin (which causes it to see an feof(stdin)). *Returns false if you try to close stdin for a process that has been started *without a communication channel to stdin. * *@li bool @ref closeStdout(); *@li -- Closes the child process's stdout. *Returns false if you try to close stdout for a process that has been started *without a communication channel to stdout. * *@li bool @ref closeStderr(); *@li -- Closes the child process's stderr. *Returns false if you try to close stderr for a process that has been started *without a communication channel to stderr. * * *@sect QT signals: * *@li void @ref receivedStdout(OProcess *proc, char *buffer, int buflen); *@li void @ref receivedStderr(OProcess *proc, char *buffer, int buflen); *@li -- Indicates that new data has arrived from either the *child process's stdout or stderr. * *@li void @ref wroteStdin(OProcess *proc); *@li -- Indicates that all data that has been sent to the child process *by a prior call to @ref writeStdin() has actually been transmitted to the *client . * *@author Christian Czezakte e9025461@student.tuwien.ac.at * * **/ class OProcess : public QObject { Q_OBJECT public: /** * Modes in which the communication channel can be opened. * diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp index 6b10ec2..1e40c40 100644 --- a/libopie/tododb.cpp +++ b/libopie/tododb.cpp @@ -1,212 +1,220 @@ #include <qdir.h> #include <opie/tododb.h> #include <opie/xmltree.h> #include <opie/todoresource.h> #include <qpe/palmtoprecord.h> #include <qpe/global.h> using namespace Opie; namespace { class FileToDoResource : public ToDoResource { public: FileToDoResource() {}; // FIXME better parsing 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() ) ); + map.insert( "Progress", QString::number( (*it).progress() ) ); map.insert( "Summary", (*it).summary() ); QArray<int> arrat = (*it).categories(); QString attr; for(uint i=0; i < arrat.count(); i++ ){ attr.append(QString::number(arrat[i])+";" ); } if(!attr.isEmpty() ) // remove the last ; attr.remove(attr.length()-1, 1 ); map.insert( "Categories", attr ); //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.setEncoding( QTextStream::UnicodeUTF8 ); stream << "<!DOCTYPE Tasks>" << endl; tasks->save(stream ); delete tasks; stream << "</Tasks>" << endl; 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 ){ if( element->tagName() != QString::fromLatin1("Task") ){ element = element->nextChild(); continue; } 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 ); + // progress + dummy = element->attribute("Progress" ); + { + ushort dumShort = dummy.toUShort(&ok); + event.setProgress( dumShort ); + + } // 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 ); dummy = element->attribute("Summary" ); event.setSummary( dummy ); // category dummy = element->attribute("Categories" ); QStringList ids = QStringList::split(";", dummy ); event.setCategories( ids ); //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; qWarning("returning" ); return m_todos; } }; } ToDoDB::ToDoDB(const QString &fileName, ToDoResource *res ){ m_fileName = fileName; if( fileName.isEmpty() && res == 0 ){ m_fileName = Global::applicationFileName("todolist","todolist.xml"); res = new FileToDoResource(); //qWarning("%s", m_fileName.latin1() ); }else if(res == 0 ){ // let's create a ToDoResource for xml res = new FileToDoResource(); } m_res = res; load(); } ToDoResource* ToDoDB::resource(){ return m_res; }; void ToDoDB::setResource( ToDoResource *res ) { delete m_res; m_res = res; } ToDoDB::~ToDoDB() { delete m_res; } QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to, bool all ) { QValueList<ToDoEvent> events; for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ if( (*it).hasDate() ){ if( (*it).date() >= from && (*it).date() <= to ) events.append( (*it) ); }else if( all ){ events.append( (*it) ); } } return events; } QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, bool all) { return effectiveToDos( from, QDate::currentDate(), all ); } QValueList<ToDoEvent> ToDoDB::overDue() { QValueList<ToDoEvent> events; for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ if( (*it).isOverdue() ) events.append((*it) ); } return events; } QValueList<ToDoEvent> ToDoDB::rawToDos() { return m_todos; } void ToDoDB::addEvent( const ToDoEvent &event ) { m_todos.append( event ); } void ToDoDB::editEvent( const ToDoEvent &event ) { m_todos.remove( event ); m_todos.append( event ); } void ToDoDB::removeEvent( const ToDoEvent &event ) { m_todos.remove( event ); } void ToDoDB::replaceEvent(const ToDoEvent &event ) { diff --git a/libopie/todoevent.cpp b/libopie/todoevent.cpp index fb7073c..b35ac9d 100644 --- a/libopie/todoevent.cpp +++ b/libopie/todoevent.cpp @@ -1,269 +1,282 @@ #include <opie/todoevent.h> #include <qpe/palmtopuidgen.h> #include <qpe/stringutil.h> #include <qpe/palmtoprecord.h> #include <qpe/stringutil.h> #include <qpe/categories.h> #include <qpe/categoryselect.h> #include <qobject.h> ToDoEvent::ToDoEvent(const ToDoEvent &event ) { *this = event; } ToDoEvent::ToDoEvent(bool completed, int priority, const QStringList &category, const QString& summary, const QString &description, + ushort progress, bool hasDate, QDate date, int uid ) { m_date = date; m_isCompleted = completed; m_hasDate = hasDate; m_priority = priority; m_category = category; m_sum = summary; + m_prog = progress; m_desc = Qtopia::simplifyMultiLineSpace(description ); if (uid == -1 ) { Qtopia::UidGen *uidgen = new Qtopia::UidGen(); uid = uidgen->generate(); delete uidgen; }// generate the ids m_uid = uid; } QArray<int> ToDoEvent::categories()const { QArray<int> array(m_category.count() ); // currently the datebook can be only in one category array = Qtopia::Record::idsFromString( m_category.join(";") ); return array; } bool ToDoEvent::match( const QRegExp ®Exp )const { if( QString::number( m_priority ).find( regExp ) != -1 ){ return true; }else if( m_hasDate && m_date.toString().find( regExp) != -1 ){ return true; }else if(m_desc.find( regExp ) != -1 ){ return true; } return false; } bool ToDoEvent::isCompleted() const { return m_isCompleted; } bool ToDoEvent::hasDate() const { return m_hasDate; } int ToDoEvent::priority()const { return m_priority; } QStringList ToDoEvent::allCategories()const { return m_category; } QString ToDoEvent::extra(const QString& )const { return QString::null; } QString ToDoEvent::summary() const { return m_sum; } +ushort ToDoEvent::progress() const +{ + return m_prog; +} void ToDoEvent::insertCategory(const QString &str ) { m_category.append( str ); } void ToDoEvent::clearCategories() { m_category.clear(); } void ToDoEvent::setCategories(const QStringList &list ) { m_category = list; } QDate ToDoEvent::date()const { return m_date; } QString ToDoEvent::description()const { return m_desc; } void ToDoEvent::setCompleted( bool completed ) { m_isCompleted = completed; } void ToDoEvent::setHasDate( bool hasDate ) { m_hasDate = hasDate; } void ToDoEvent::setDescription(const QString &desc ) { m_desc = Qtopia::simplifyMultiLineSpace(desc ); } void ToDoEvent::setExtra( const QString&, const QString& ) { } void ToDoEvent::setSummary( const QString& sum ) { m_sum = sum; } void ToDoEvent::setCategory( const QString &cat ) { qWarning("setCategory %s", cat.latin1() ); m_category.clear(); m_category << cat; } void ToDoEvent::setPriority(int prio ) { m_priority = prio; } void ToDoEvent::setDate( QDate date ) { m_date = date; } bool ToDoEvent::isOverdue( ) { if( m_hasDate ) return QDate::currentDate() > m_date; return false; } - +void ToDoEvent::setProgress(ushort progress ) +{ + m_prog = progress; +} /*! Returns a richt text string */ QString ToDoEvent::richText() const { QString text; QStringList catlist; // Description of the todo if ( !description().isEmpty() ){ text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; - text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; + text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br><br><br>"; } text += "<b>" + QObject::tr( "Priority:") +" </b>" - + QString::number( priority() ) + "<br>"; + + QString::number( priority() ) + " <br>"; + text += "<b>" + QObject::tr( "Progress:") + " </b>" + + QString::number( progress() ) + " %<br>"; if (hasDate() ){ text += "<b>" + QObject::tr( "Deadline:") + " </b>"; text += date().toString(); text += "<br>"; } // Open database of all categories and get the list of // the categories this todoevent belongs to. // Then print them... // I am not sure whether there is no better way doing this !? Categories catdb; bool firstloop = true; catdb.load( categoryFileName() ); catlist = allCategories(); text += "<b>" + QObject::tr( "Category:") + "</b> "; for ( QStringList::Iterator it = catlist.begin(); it != catlist.end(); ++it ) { if (!firstloop){ text += ", "; } firstloop = false; text += catdb.label ("todo", (*it).toInt()); } text += "<br>"; return text; } bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{ if( !hasDate() && !toDoEvent.hasDate() ) return true; - if( !hasDate() && toDoEvent.hasDate() ) return true; + if( !hasDate() && toDoEvent.hasDate() ) return false; if( hasDate() && toDoEvent.hasDate() ){ if( date() == toDoEvent.date() ){ // let's the priority decide return priority() < toDoEvent.priority(); }else{ return date() < toDoEvent.date(); } } return false; } bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const { if( !hasDate() && !toDoEvent.hasDate() ) return true; if( !hasDate() && toDoEvent.hasDate() ) return true; if( hasDate() && toDoEvent.hasDate() ){ if( date() == toDoEvent.date() ){ // let's the priority decide return priority() <= toDoEvent.priority(); }else{ return date() <= toDoEvent.date(); } } return true; } bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const { if( !hasDate() && !toDoEvent.hasDate() ) return false; if( !hasDate() && toDoEvent.hasDate() ) return false; if( hasDate() && toDoEvent.hasDate() ){ if( date() == toDoEvent.date() ){ // let's the priority decide return priority() > toDoEvent.priority(); }else{ return date() > toDoEvent.date(); } } return false; } bool ToDoEvent::operator>=(const ToDoEvent &toDoEvent )const { if( !hasDate() && !toDoEvent.hasDate() ) return true; if( !hasDate() && toDoEvent.hasDate() ) return false; if( hasDate() && toDoEvent.hasDate() ){ if( date() == toDoEvent.date() ){ // let's the priority decide return priority() > toDoEvent.priority(); }else{ return date() > toDoEvent.date(); } } return true; } bool ToDoEvent::operator==(const ToDoEvent &toDoEvent )const { if( m_priority == toDoEvent.m_priority && + m_priority == toDoEvent.m_prog && m_isCompleted == toDoEvent.m_isCompleted && m_hasDate == toDoEvent.m_hasDate && m_date == toDoEvent.m_date && m_category == toDoEvent.m_category && m_sum == toDoEvent.m_sum && m_desc == toDoEvent.m_desc ) return true; return false; } ToDoEvent &ToDoEvent::operator=(const ToDoEvent &item ) { m_date = item.m_date; m_isCompleted = item.m_isCompleted; m_hasDate = item.m_hasDate; m_priority = item.m_priority; m_category = item.m_category; m_desc = item.m_desc; m_uid = item.m_uid; m_sum = item.m_sum; + m_prog = item.m_prog; return *this; } diff --git a/libopie/todoevent.h b/libopie/todoevent.h index 7454241..de4623f 100644 --- a/libopie/todoevent.h +++ b/libopie/todoevent.h @@ -1,151 +1,162 @@ #ifndef todoevent_h #define todoevent_h #include <qmap.h> #include <qregexp.h> #include <qstringlist.h> #include <qdatetime.h> class ToDoEvent { friend class ToDoDB; public: // priorities from Very low to very high enum Priority { VERYHIGH=1, HIGH, NORMAL, LOW, VERYLOW }; /* Constructs a new ToDoEvent @param completed Is the TodoEvent completed @param priority What is the priority of this ToDoEvent @param category Which category does it belong( uid ) @param summary A small summary of the todo @param description What is this ToDoEvent about @param hasDate Does this Event got a deadline @param date what is the deadline? @param uid what is the UUID of this Event **/ ToDoEvent( bool completed = false, int priority = NORMAL, const QStringList &category = QStringList(), const QString &summary = QString::null , const QString &description = QString::null, + ushort progress = 0, bool hasDate = false, QDate date = QDate::currentDate(), int uid = -1 ); /* Copy c'tor **/ ToDoEvent(const ToDoEvent & ); /* Is this event completed? **/ bool isCompleted() const; /* Does this Event have a deadline **/ bool hasDate() const; /* What is the priority? **/ int priority()const ; + /** + * progress as ushort 0, 20, 40, 60, 80 or 100% + */ + ushort progress() const; /* All category numbers as QString in a List **/ QStringList allCategories()const; /* * Same as above but with QArray<int> */ QArray<int> categories() const; /** * The end Date */ QDate date()const; /** * The description of the todo */ QString description()const; /** * A small summary of the todo */ QString summary() const; /** * Return this todoevent in a RichText formatted QString */ QString richText() const; /** * Returns the UID of the Todo */ int uid()const { return m_uid;}; QString extra(const QString& )const; /** * Set if this Todo is completed */ void setCompleted(bool completed ); /** * set if this todo got an end data */ void setHasDate( bool hasDate ); // if the category doesn't exist we will create it // this sets the the Category after this call category will be the only category void setCategory( const QString &category ); // adds a category to the Categories of this event void insertCategory(const QString &category ); /** * Removes this event from all categories */ void clearCategories(); /** * This todo belongs to xxx categories */ void setCategories(const QStringList& ); /** * Set the priority of the Todo */ void setPriority(int priority ); /** + * Set the progress. + */ + void setProgress( ushort progress ); + + /** * set the end date */ void setDate( QDate date ); void setDescription(const QString& ); void setSummary(const QString& ); void setExtra( const QString&, const QString& ); bool isOverdue(); bool match( const QRegExp &r )const; 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: class ToDoEventPrivate; ToDoEventPrivate *d; QDate m_date; bool m_isCompleted:1; bool m_hasDate:1; int m_priority; QStringList m_category; QString m_desc; QString m_sum; QMap<QString, QString> m_extra; int m_uid; + ushort m_prog; }; #endif |