typo found by Andrey Cherepanov
[kdepim.git] / akonadi / resources / kolabproxy / task.cpp
blob93a2c179d0df3214e8c1ba15caef5272c549de54
1 /*
2 This file is part of the kolab resource - the implementation of the
3 Kolab storage format. See www.kolab.org for documentation on this.
5 Copyright (c) 2004 Bo Thorsen <bo@sonofthor.dk>
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
22 In addition, as a special exception, the copyright holders give
23 permission to link the code of this program with any edition of
24 the Qt library by Trolltech AS, Norway (or with modified versions
25 of Qt that use the same license as Qt), and distribute linked
26 combinations including the two. You must obey the GNU General
27 Public License in all respects for all of the code used other than
28 Qt. If you modify this file, you may extend this exception to
29 your version of the file, but you are not obligated to do so. If
30 you do not wish to do so, delete this exception statement from
31 your version.
34 #include "task.h"
36 #include <kcal/todo.h>
37 #include <kdebug.h>
39 using namespace Kolab;
42 KCal::Todo* Task::xmlToTask( const QString& xml, const QString& tz )
44 Task task( tz );
45 task.load( xml );
46 KCal::Todo* todo = new KCal::Todo();
47 task.saveTo( todo );
48 return todo;
51 QString Task::taskToXML( KCal::Todo* todo, const QString& tz )
53 Task task( tz, todo );
54 return task.saveXML();
57 Task::Task( const QString& tz, KCal::Todo* task )
58 : Incidence( tz, task ),
59 mPriority( 5 ), mPercentCompleted( 0 ),
60 mStatus( KCal::Incidence::StatusNone ),
61 mHasStartDate( false ), mHasDueDate( false ),
62 mHasCompletedDate( false )
64 if ( task )
65 setFields( task );
68 Task::~Task()
72 void Task::setPriority( int priority )
74 mPriority = priority;
77 int Task::priority() const
79 return mPriority;
82 void Task::setPercentCompleted( int percent )
84 mPercentCompleted = percent;
87 int Task::percentCompleted() const
89 return mPercentCompleted;
92 void Task::setStatus( KCal::Incidence::Status status )
94 mStatus = status;
97 KCal::Incidence::Status Task::status() const
99 return mStatus;
102 void Task::setParent( const QString& parentUid )
104 mParent = parentUid;
107 QString Task::parent() const
109 return mParent;
112 void Task::setDueDate( const KDateTime& date )
114 mDueDate = date;
115 mHasDueDate = true;
118 KDateTime Task::dueDate() const
120 return mDueDate;
123 void Task::setHasStartDate( bool v )
125 mHasStartDate = v;
128 bool Task::hasStartDate() const
130 return mHasStartDate;
133 bool Task::hasDueDate() const
135 return mHasDueDate;
138 void Task::setCompletedDate( const KDateTime& date )
140 mCompletedDate = date;
141 mHasCompletedDate = true;
144 KDateTime Task::completedDate() const
146 return mCompletedDate;
149 bool Task::hasCompletedDate() const
151 return mHasCompletedDate;
154 bool Task::loadAttribute( QDomElement& element )
156 QString tagName = element.tagName();
158 if ( tagName == "priority" ) {
159 bool ok;
160 int priority = element.text().toInt( &ok );
161 if ( !ok || priority < 0 || priority > 5 )
162 priority = 3;
163 setPriority( priority );
164 } else if ( tagName == "completed" ) {
165 bool ok;
166 int percent = element.text().toInt( &ok );
167 if ( !ok || percent < 0 || percent > 100 )
168 percent = 0;
169 setPercentCompleted( percent );
170 } else if ( tagName == "status" ) {
171 if ( element.text() == "in-progress" )
172 setStatus( KCal::Incidence::StatusInProcess );
173 else if ( element.text() == "completed" )
174 setStatus( KCal::Incidence::StatusCompleted );
175 else if ( element.text() == "waiting-on-someone-else" )
176 setStatus( KCal::Incidence::StatusNeedsAction );
177 else if ( element.text() == "deferred" )
178 // Guessing a status here
179 setStatus( KCal::Incidence::StatusCanceled );
180 else
181 // Default
182 setStatus( KCal::Incidence::StatusNone );
183 } else if ( tagName == "due-date" )
184 setDueDate( stringToDateTime( element.text() ) );
185 else if ( tagName == "parent" )
186 setParent( element.text() );
187 else if ( tagName == "x-completed-date" )
188 setCompletedDate( stringToDateTime( element.text() ) );
189 else if ( tagName == "start-date" ) {
190 setHasStartDate( true );
191 setStartDate( element.text() );
192 } else
193 return Incidence::loadAttribute( element );
195 // We handled this
196 return true;
199 bool Task::saveAttributes( QDomElement& element ) const
201 // Save the base class elements
202 Incidence::saveAttributes( element );
204 writeString( element, "priority", QString::number( priority() ) );
205 writeString( element, "completed", QString::number( percentCompleted() ) );
207 switch( status() ) {
208 case KCal::Incidence::StatusInProcess:
209 writeString( element, "status", "in-progress" );
210 break;
211 case KCal::Incidence::StatusCompleted:
212 writeString( element, "status", "completed" );
213 break;
214 case KCal::Incidence::StatusNeedsAction:
215 writeString( element, "status", "waiting-on-someone-else" );
216 break;
217 case KCal::Incidence::StatusCanceled:
218 writeString( element, "status", "deferred" );
219 break;
220 case KCal::Incidence::StatusNone:
221 writeString( element, "status", "not-started" );
222 break;
223 case KCal::Incidence::StatusTentative:
224 case KCal::Incidence::StatusConfirmed:
225 case KCal::Incidence::StatusDraft:
226 case KCal::Incidence::StatusFinal:
227 case KCal::Incidence::StatusX:
228 // All of these are saved as StatusNone.
229 writeString( element, "status", "not-started" );
230 break;
233 if ( hasDueDate() )
234 writeString( element, "due-date", dateTimeToString( dueDate() ) );
236 if ( !parent().isNull() )
237 writeString( element, "parent", parent() );
239 if ( hasCompletedDate() && percentCompleted() == 100)
240 writeString( element, "x-completed-date", dateTimeToString( completedDate() ) );
242 return true;
246 bool Task::loadXML( const QDomDocument& document )
248 QDomElement top = document.documentElement();
250 if ( top.tagName() != "task" ) {
251 qWarning( "XML error: Top tag was %s instead of the expected task",
252 top.tagName().toAscii().data() );
253 return false;
255 setHasStartDate( false ); // todo's don't necessarily have one
257 for ( QDomNode n = top.firstChild(); !n.isNull(); n = n.nextSibling() ) {
258 if ( n.isComment() )
259 continue;
260 if ( n.isElement() ) {
261 QDomElement e = n.toElement();
262 if ( !loadAttribute( e ) )
263 // TODO: Unhandled tag - save for later storage
264 kDebug() <<"Warning: Unhandled tag" << e.tagName();
265 } else
266 kDebug() <<"Node is not a comment or an element???";
269 return true;
272 QString Task::saveXML() const
274 QDomDocument document = domTree();
275 QDomElement element = document.createElement( "task" );
276 element.setAttribute( "version", "1.0" );
277 saveAttributes( element );
278 if ( !hasStartDate() && startDate().isValid() ) {
279 // events and journals always have a start date, but tasks don't.
280 // Remove the entry done by the inherited save above, because we
281 // don't have one.
282 QDomNodeList l = element.elementsByTagName( "start-date" );
283 Q_ASSERT( l.count() == 1 );
284 element.removeChild( l.item( 0 ) );
286 document.appendChild( element );
287 return document.toString();
290 void Task::setFields( const KCal::Todo* task )
292 Incidence::setFields( task );
294 setPriority( task->priority() );
295 setPercentCompleted( task->percentComplete() );
296 setStatus( task->status() );
297 setHasStartDate( task->hasStartDate() );
299 if ( task->hasDueDate() )
300 setDueDate( localToUTC( task->dtDue() ) );
301 else
302 mHasDueDate = false;
303 if ( task->relatedTo() )
304 setParent( task->relatedTo()->uid() );
305 else if ( !task->relatedToUid().isEmpty() )
306 setParent( task->relatedToUid( ) );
307 else
308 setParent( QString() );
310 if ( task->hasCompletedDate() && task->percentComplete() == 100 )
311 setCompletedDate( localToUTC( task->completed() ) );
312 else
313 mHasCompletedDate = false;
316 void Task::saveTo( KCal::Todo* task )
318 Incidence::saveTo( task );
320 task->setPriority( priority() );
321 task->setPercentComplete( percentCompleted() );
322 task->setStatus( status() );
323 task->setHasStartDate( hasStartDate() );
324 task->setHasDueDate( hasDueDate() );
325 if ( hasDueDate() )
326 task->setDtDue( utcToLocal( dueDate() ) );
328 if ( !parent().isEmpty() )
329 task->setRelatedToUid( parent() );
331 if ( hasCompletedDate() && task->percentComplete() == 100 )
332 task->setCompleted( utcToLocal( mCompletedDate ) );