summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-09-25 01:04:17 (UTC)
committer zautrix <zautrix>2005-09-25 01:04:17 (UTC)
commitbd991f0a33d85385735ed4911b794b8740e4d296 (patch) (unidiff)
treef69fdacca2283e2602619e24bcbc30b46998d298
parentbada5cffd8f1b5f4f3719299e3615d7d06a1f0dc (diff)
downloadkdepimpi-bd991f0a33d85385735ed4911b794b8740e4d296.zip
kdepimpi-bd991f0a33d85385735ed4911b794b8740e4d296.tar.gz
kdepimpi-bd991f0a33d85385735ed4911b794b8740e4d296.tar.bz2
todo timer fix
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp31
-rw-r--r--libkcal/todo.h4
2 files changed, 33 insertions, 2 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 48d37d5..de07496 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,203 +1,230 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <kglobalsettings.h> 22#include <kglobalsettings.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kdebug.h> 24#include <kdebug.h>
25#include <qregexp.h> 25#include <qregexp.h>
26#include <qfileinfo.h> 26#include <qfileinfo.h>
27 27
28#include "calendarlocal.h" 28#include "calendarlocal.h"
29#include "icalformat.h" 29#include "icalformat.h"
30#include "todo.h" 30#include "todo.h"
31 31
32#define SAVETIMER_TIMEOUT_SECONDS 300
33//#define SAVETIMER_TIMEOUT_SECONDS 8
34#define SAVETIMER_TIMEOUT_RETRY_SECONDS 5
35
32using namespace KCal; 36using namespace KCal;
33 37
34Todo::Todo(): QObject(), Incidence() 38Todo::Todo(): QObject(), Incidence()
35{ 39{
36// mStatus = TENTATIVE; 40// mStatus = TENTATIVE;
37 41
38 mHasDueDate = false; 42 mHasDueDate = false;
39 setHasStartDate( false ); 43 setHasStartDate( false );
40 mCompleted = getEvenTime(QDateTime::currentDateTime()); 44 mCompleted = getEvenTime(QDateTime::currentDateTime());
41 mHasCompletedDate = false; 45 mHasCompletedDate = false;
42 mPercentComplete = 0; 46 mPercentComplete = 0;
43 mRunning = false; 47 mRunning = false;
44 mRunSaveTimer = 0; 48 mRunSaveTimer = 0;
45 setFloats( true ); 49 setFloats( true );
50 mCurrentTimerDelay = 0;
46} 51}
47 52
48Todo::Todo(const Todo &t) : QObject(),Incidence(t) 53Todo::Todo(const Todo &t) : QObject(),Incidence(t)
49{ 54{
50 mDtDue = t.mDtDue; 55 mDtDue = t.mDtDue;
51 mHasDueDate = t.mHasDueDate; 56 mHasDueDate = t.mHasDueDate;
52 mCompleted = t.mCompleted; 57 mCompleted = t.mCompleted;
53 mHasCompletedDate = t.mHasCompletedDate; 58 mHasCompletedDate = t.mHasCompletedDate;
54 mPercentComplete = t.mPercentComplete; 59 mPercentComplete = t.mPercentComplete;
55 mRunning = false; 60 mRunning = false;
56 mRunSaveTimer = 0; 61 mRunSaveTimer = 0;
62 mCurrentTimerDelay = 0;
57} 63}
58 64
59Todo::~Todo() 65Todo::~Todo()
60{ 66{
61 setRunning( false ); 67 setRunning( false );
62 //qDebug("Todo::~Todo() "); 68 //qDebug("Todo::~Todo() ");
63} 69}
64 70
65void Todo::setRunningFalse( QString s ) 71void Todo::setRunningFalse( QString s )
66{ 72{
67 if ( ! mRunning ) 73 if ( ! mRunning )
68 return; 74 return;
69 mRunning = false; 75 mRunning = false;
70 if ( mRunSaveTimer ) 76 if ( mRunSaveTimer )
71 mRunSaveTimer->stop(); 77 mRunSaveTimer->stop();
72 saveRunningInfoToFile( s ); 78 saveRunningInfoToFile( s );
73} 79}
74void Todo::stopRunning() 80void Todo::stopRunning()
75{ 81{
76 if ( !mRunning ) 82 if ( !mRunning )
77 return; 83 return;
78 if ( mRunSaveTimer ) 84 if ( mRunSaveTimer )
79 mRunSaveTimer->stop(); 85 mRunSaveTimer->stop();
80 mRunning = false; 86 mRunning = false;
81} 87}
82void Todo::setRunning( bool run ) 88void Todo::setRunning( bool run )
83{ 89{
84 if ( run == mRunning ) 90 if ( run == mRunning )
85 return; 91 return;
86 //qDebug("Todo::setRunning %d ", run); 92 //qDebug("Todo::setRunning %d ", run);
87 if ( !mRunSaveTimer ) { 93 if ( !mRunSaveTimer ) {
88 mRunSaveTimer = new QTimer ( this ); 94 mRunSaveTimer = new QTimer ( this );
89 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 95 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( timerSlotSaveRunningInfoToFile() ) );
90 } 96 }
91 mRunning = run; 97 mRunning = run;
98 mRunLastSave = QDateTime::currentDateTime();
92 if ( mRunning ) { 99 if ( mRunning ) {
93 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 100 mRunSaveTimer->start( SAVETIMER_TIMEOUT_SECONDS * 1000 ); // 5 min
94 mRunStart = QDateTime::currentDateTime(); 101 mRunStart = QDateTime::currentDateTime();
102 mRunLastSave = QDateTime::currentDateTime();
103 mCurrentTimerDelay = SAVETIMER_TIMEOUT_SECONDS;
95 } else { 104 } else {
96 mRunSaveTimer->stop(); 105 mRunSaveTimer->stop();
97 saveRunningInfoToFile(); 106 saveRunningInfoToFile();
98 } 107 }
99} 108}
100void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end ) 109void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end )
101{ 110{
102 if ( !mRunning) return; 111 if ( !mRunning) return;
103 mRunning = false; 112 mRunning = false;
104 mRunStart = start; 113 mRunStart = start;
105 mRunEnd = end; 114 mRunEnd = end;
106 saveRunningInfoToFile( comment ); 115 saveRunningInfoToFile( comment );
107} 116}
117void Todo::timerSlotSaveRunningInfoToFile()
118{
119 mRunEnd = QDateTime::currentDateTime();
120 int secsTo = mRunLastSave.secsTo( mRunEnd );
121 if( secsTo == 8 ) ++secsTo;
122 qDebug("KO Todo::saveTimerTimeout %d %d", secsTo, mCurrentTimerDelay );
123 if ( secsTo > mCurrentTimerDelay ) {
124 qDebug("KO Todo::saveTimerTimeout restart %d ", SAVETIMER_TIMEOUT_RETRY_SECONDS );
125 mRunSaveTimer->start( SAVETIMER_TIMEOUT_RETRY_SECONDS * 1000 );
126 mRunLastSave = QDateTime::currentDateTime();
127 mCurrentTimerDelay = SAVETIMER_TIMEOUT_RETRY_SECONDS;
128 return;
129 }
130 mRunSaveTimer->start( SAVETIMER_TIMEOUT_SECONDS * 1000 ); // 5 min
131 mRunLastSave = QDateTime::currentDateTime();
132 mCurrentTimerDelay = SAVETIMER_TIMEOUT_SECONDS;
133 saveRunningInfoToFile( QString::null );
134}
108void Todo::saveRunningInfoToFile() 135void Todo::saveRunningInfoToFile()
109{ 136{
110 mRunEnd = QDateTime::currentDateTime(); 137 mRunEnd = QDateTime::currentDateTime();
111 saveRunningInfoToFile( QString::null ); 138 saveRunningInfoToFile( QString::null );
112} 139}
113void Todo::saveRunningInfoToFile( QString comment ) 140void Todo::saveRunningInfoToFile( QString comment )
114{ 141{
115 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 142 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
116 if ( mRunStart.secsTo ( mRunEnd) < 15 ) { 143 if ( mRunStart.secsTo ( mRunEnd) < 15 ) {
117 qDebug("Running time < 15 seconds. Skipped. "); 144 qDebug("Running time < 15 seconds. Skipped. ");
118 return; 145 return;
119 } 146 }
120 QString dir = KGlobalSettings::timeTrackerDir(); 147 QString dir = KGlobalSettings::timeTrackerDir();
121 //qDebug("%s ", dir.latin1()); 148 //qDebug("%s ", dir.latin1());
122 QString file = "%1%2%3-%4%5%6-"; 149 QString file = "%1%2%3-%4%5%6-";
123 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 ); 150 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 );
124 file.replace ( QRegExp (" "), "0" ); 151 file.replace ( QRegExp (" "), "0" );
125 file += uid(); 152 file += uid();
126 //qDebug("File %s ",file.latin1() ); 153 //qDebug("File %s ",file.latin1() );
127 CalendarLocal cal; 154 CalendarLocal cal;
128 cal.setLocalTime(); 155 cal.setLocalTime();
129 Todo * to = (Todo*) clone(); 156 Todo * to = (Todo*) clone();
130 to->setFloats( false ); 157 to->setFloats( false );
131 to->setDtStart( mRunStart ); 158 to->setDtStart( mRunStart );
132 to->setHasStartDate( true ); 159 to->setHasStartDate( true );
133 to->setDtDue( mRunEnd ); 160 to->setDtDue( mRunEnd );
134 to->setHasDueDate( true ); 161 to->setHasDueDate( true );
135 to->setUid( file ); 162 to->setUid( file );
136 if ( !comment.isEmpty() ) { 163 if ( !comment.isEmpty() ) {
137 QString des = to->description(); 164 QString des = to->description();
138 if ( des.isEmpty () ) 165 if ( des.isEmpty () )
139 to->setDescription( "TT-Note: " + comment ); 166 to->setDescription( "TT-Note: " + comment );
140 else 167 else
141 to->setDescription( "TT-Note: " + comment +"\n" + des ); 168 to->setDescription( "TT-Note: " + comment +"\n" + des );
142 } 169 }
143 cal.addIncidence( to ); 170 cal.addIncidence( to );
144 ICalFormat format( false ); 171 ICalFormat format( false );
145 file = dir +"/" +file +".ics"; 172 file = dir +"/" +file +".ics";
146 format.save( &cal, file ); 173 format.save( &cal, file );
147 saveParents(); 174 saveParents();
148 175
149} 176}
150void Todo::saveParents() 177void Todo::saveParents()
151{ 178{
152 if (!relatedTo() ) 179 if (!relatedTo() )
153 return; 180 return;
154 Incidence * inc = relatedTo(); 181 Incidence * inc = relatedTo();
155 if ( inc->typeID() != todoID ) 182 if ( inc->typeID() != todoID )
156 return; 183 return;
157 Todo* to = (Todo*)inc; 184 Todo* to = (Todo*)inc;
158 bool saveTodo = false; 185 bool saveTodo = false;
159 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 186 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
160 QFileInfo fi ( file ); 187 QFileInfo fi ( file );
161 if ( fi.exists() ) { 188 if ( fi.exists() ) {
162 if ( fi.lastModified () < to->lastModified ()) 189 if ( fi.lastModified () < to->lastModified ())
163 saveTodo = true; 190 saveTodo = true;
164 } else { 191 } else {
165 saveTodo = true; 192 saveTodo = true;
166 } 193 }
167 if ( saveTodo ) { 194 if ( saveTodo ) {
168 CalendarLocal cal; 195 CalendarLocal cal;
169 cal.setLocalTime(); 196 cal.setLocalTime();
170 Todo * par = (Todo *) to->clone(); 197 Todo * par = (Todo *) to->clone();
171 cal.addIncidence( par ); 198 cal.addIncidence( par );
172 ICalFormat format( false ); 199 ICalFormat format( false );
173 format.save( &cal, file ); 200 format.save( &cal, file );
174 } 201 }
175 to->saveParents(); 202 to->saveParents();
176} 203}
177 204
178int Todo::runTime() 205int Todo::runTime()
179{ 206{
180 if ( !mRunning ) 207 if ( !mRunning )
181 return 0; 208 return 0;
182 return mRunStart.secsTo( QDateTime::currentDateTime() ); 209 return mRunStart.secsTo( QDateTime::currentDateTime() );
183} 210}
184bool Todo::hasRunningSub() 211bool Todo::hasRunningSub()
185{ 212{
186 if ( mRunning ) 213 if ( mRunning )
187 return true; 214 return true;
188 Incidence *aTodo; 215 Incidence *aTodo;
189 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 216 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
190 if ( ((Todo*)aTodo)->hasRunningSub() ) 217 if ( ((Todo*)aTodo)->hasRunningSub() )
191 return true; 218 return true;
192 } 219 }
193 return false; 220 return false;
194} 221}
195Incidence *Todo::clone() 222Incidence *Todo::clone()
196{ 223{
197 return new Todo(*this); 224 return new Todo(*this);
198} 225}
199 226
200bool Todo::contains ( Todo* from ) 227bool Todo::contains ( Todo* from )
201{ 228{
202 229
203 if ( !from->summary().isEmpty() ) 230 if ( !from->summary().isEmpty() )
diff --git a/libkcal/todo.h b/libkcal/todo.h
index 7feb32e..e6b8a21 100644
--- a/libkcal/todo.h
+++ b/libkcal/todo.h
@@ -38,119 +38,123 @@ namespace KCal {
38 public: 38 public:
39 Todo(); 39 Todo();
40 Todo(const Todo &); 40 Todo(const Todo &);
41 ~Todo(); 41 ~Todo();
42 typedef ListBase<Todo> List; 42 typedef ListBase<Todo> List;
43 QCString type() const { return "Todo"; } 43 QCString type() const { return "Todo"; }
44 IncTypeID typeID() const { return todoID; } 44 IncTypeID typeID() const { return todoID; }
45 45
46 /** Return an exact copy of this todo. */ 46 /** Return an exact copy of this todo. */
47 Incidence *clone(); 47 Incidence *clone();
48 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const; 48 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const;
49 49
50 /** for setting the todo's due date/time with a QDateTime. */ 50 /** for setting the todo's due date/time with a QDateTime. */
51 void setDtDue(const QDateTime &dtDue); 51 void setDtDue(const QDateTime &dtDue);
52 /** returns an event's Due date/time as a QDateTime. */ 52 /** returns an event's Due date/time as a QDateTime. */
53 QDateTime dtDue() const; 53 QDateTime dtDue() const;
54 /** returns an event's due time as a string formatted according to the 54 /** returns an event's due time as a string formatted according to the
55 users locale settings */ 55 users locale settings */
56 QString dtDueTimeStr() const; 56 QString dtDueTimeStr() const;
57 /** returns an event's due date as a string formatted according to the 57 /** returns an event's due date as a string formatted according to the
58 users locale settings */ 58 users locale settings */
59 QString dtDueDateStr(bool shortfmt=true) const; 59 QString dtDueDateStr(bool shortfmt=true) const;
60 /** returns an event's due date and time as a string formatted according 60 /** returns an event's due date and time as a string formatted according
61 to the users locale settings */ 61 to the users locale settings */
62 QString dtDueStr(bool shortfmt=true) const; 62 QString dtDueStr(bool shortfmt=true) const;
63 63
64 /** returns TRUE or FALSE depending on whether the todo has a due date */ 64 /** returns TRUE or FALSE depending on whether the todo has a due date */
65 bool hasDueDate() const; 65 bool hasDueDate() const;
66 /** sets the event's hasDueDate value. */ 66 /** sets the event's hasDueDate value. */
67 void setHasDueDate(bool f); 67 void setHasDueDate(bool f);
68 68
69 /* 69 /*
70 Looks for a subtodo (including itself ) which is not complete and is 70 Looks for a subtodo (including itself ) which is not complete and is
71 - overdue, or 71 - overdue, or
72 - due today. 72 - due today.
73 It returns 0 for nothing found, 73 It returns 0 for nothing found,
74 1 for found a todo which is due today and no overdue found 74 1 for found a todo which is due today and no overdue found
75 2 for found a overdue todo 75 2 for found a overdue todo
76 */ 76 */
77 int hasDueSubTodo( bool checkSubtodos = true ); 77 int hasDueSubTodo( bool checkSubtodos = true );
78 /* same as above, but a specific date can be specified*/ 78 /* same as above, but a specific date can be specified*/
79 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ); 79 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos );
80 80
81 81
82 /** sets the event's status to the string specified. The string 82 /** sets the event's status to the string specified. The string
83 * must be a recognized value for the status field, i.e. a string 83 * must be a recognized value for the status field, i.e. a string
84 * equivalent of the possible status enumerations previously described. */ 84 * equivalent of the possible status enumerations previously described. */
85// void setStatus(const QString &statStr); 85// void setStatus(const QString &statStr);
86 /** sets the event's status to the value specified. See the enumeration 86 /** sets the event's status to the value specified. See the enumeration
87 * above for possible values. */ 87 * above for possible values. */
88// void setStatus(int); 88// void setStatus(int);
89 /** return the event's status. */ 89 /** return the event's status. */
90// int status() const; 90// int status() const;
91 /** return the event's status in string format. */ 91 /** return the event's status in string format. */
92// QString statusStr() const; 92// QString statusStr() const;
93 93
94 /** return, if this todo is completed */ 94 /** return, if this todo is completed */
95 bool isCompleted() const; 95 bool isCompleted() const;
96 /** set completed state of this todo */ 96 /** set completed state of this todo */
97 void setCompleted(bool); 97 void setCompleted(bool);
98 98
99 /** 99 /**
100 Return how many percent of the task are completed. Returns a value 100 Return how many percent of the task are completed. Returns a value
101 between 0 and 100. 101 between 0 and 100.
102 */ 102 */
103 int percentComplete() const; 103 int percentComplete() const;
104 /** 104 /**
105 Set how many percent of the task are completed. Valid values are in the 105 Set how many percent of the task are completed. Valid values are in the
106 range from 0 to 100. 106 range from 0 to 100.
107 */ 107 */
108 void setPercentComplete(int); 108 void setPercentComplete(int);
109 109
110 /** return date and time when todo was completed */ 110 /** return date and time when todo was completed */
111 QDateTime completed() const; 111 QDateTime completed() const;
112 QString completedStr(bool shortF = true) const; 112 QString completedStr(bool shortF = true) const;
113 /** set date and time of completion */ 113 /** set date and time of completion */
114 void setCompleted(const QDateTime &completed); 114 void setCompleted(const QDateTime &completed);
115 115
116 /** Return true, if todo has a date associated with completion */ 116 /** Return true, if todo has a date associated with completion */
117 bool hasCompletedDate() const; 117 bool hasCompletedDate() const;
118 bool contains ( Todo*); 118 bool contains ( Todo*);
119 void checkSetCompletedFalse(); 119 void checkSetCompletedFalse();
120 bool setRecurDates(); 120 bool setRecurDates();
121 bool isRunning() {return mRunning;} 121 bool isRunning() {return mRunning;}
122 bool hasRunningSub(); 122 bool hasRunningSub();
123 void setRunning( bool ); 123 void setRunning( bool );
124 void setRunningFalse( QString ); 124 void setRunningFalse( QString );
125 void stopRunning(); 125 void stopRunning();
126 int runTime(); 126 int runTime();
127 QDateTime runStart () const { return mRunStart;} 127 QDateTime runStart () const { return mRunStart;}
128 void saveRunningInfo( QString comment, QDateTime start, QDateTime end ); 128 void saveRunningInfo( QString comment, QDateTime start, QDateTime end );
129 public slots: 129 public slots:
130 void saveRunningInfoToFile( QString st ); 130 void saveRunningInfoToFile( QString st );
131 void saveRunningInfoToFile( ); 131 void saveRunningInfoToFile( );
132 void saveParents(); 132 void saveParents();
133 QString durationText(); 133 QString durationText();
134 private slots:
135 void timerSlotSaveRunningInfoToFile( );
134 private: 136 private:
137 int mCurrentTimerDelay;
135 bool mRunning; 138 bool mRunning;
136 QTimer * mRunSaveTimer; 139 QTimer * mRunSaveTimer;
137 QDateTime mRunStart; 140 QDateTime mRunStart;
141 QDateTime mRunLastSave;
138 QDateTime mRunEnd; 142 QDateTime mRunEnd;
139 bool accept(Visitor &v) { return v.visit(this); } 143 bool accept(Visitor &v) { return v.visit(this); }
140 144
141 QDateTime mDtDue; // due date of todo 145 QDateTime mDtDue; // due date of todo
142 146
143 bool mHasDueDate; // if todo has associated due date 147 bool mHasDueDate; // if todo has associated due date
144 148
145// int mStatus; // confirmed/delegated/tentative/etc 149// int mStatus; // confirmed/delegated/tentative/etc
146 150
147 QDateTime mCompleted; 151 QDateTime mCompleted;
148 bool mHasCompletedDate; 152 bool mHasCompletedDate;
149 153
150 int mPercentComplete; 154 int mPercentComplete;
151}; 155};
152 156
153 bool operator==( const Todo&, const Todo& ); 157 bool operator==( const Todo&, const Todo& );
154} 158}
155 159
156#endif 160#endif