diff options
Diffstat (limited to 'tderesources/kolab/kcal/event.cpp')
-rw-r--r-- | tderesources/kolab/kcal/event.cpp | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/tderesources/kolab/kcal/event.cpp b/tderesources/kolab/kcal/event.cpp new file mode 100644 index 000000000..c15c567d8 --- /dev/null +++ b/tderesources/kolab/kcal/event.cpp @@ -0,0 +1,223 @@ +/* + This file is part of the kolab resource - the implementation of the + Kolab storage format. See www.kolab.org for documentation on this. + + Copyright (c) 2004 Bo Thorsen <bo@sonofthor.dk> + + 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., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the TQt library by Trolltech AS, Norway (or with modified versions + of TQt that use the same license as TQt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + TQt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "event.h" + +#include <libkcal/event.h> +#include <kdebug.h> + +using namespace Kolab; + + +KCal::Event* Event::xmlToEvent( const TQString& xml, const TQString& tz, KCal::ResourceKolab* res, + const TQString& subResource, TQ_UINT32 sernum ) +{ + Event event( res, subResource, sernum, tz ); + event.load( xml ); + KCal::Event* kcalEvent = new KCal::Event(); + event.saveTo( kcalEvent ); + return kcalEvent; +} + +TQString Event::eventToXML( KCal::Event* kcalEvent, const TQString& tz ) +{ + Event event( 0, TQString(), 0, tz, kcalEvent ); + return event.saveXML(); +} + +Event::Event( KCal::ResourceKolab *res, const TQString &subResource, TQ_UINT32 sernum, + const TQString& tz, KCal::Event* event ) + : Incidence( res, subResource, sernum, tz ), + mShowTimeAs( KCal::Event::Opaque ), mHasEndDate( false ) +{ + if ( event ) + setFields( event ); +} + +Event::~Event() +{ +} + +void Event::setTransparency( KCal::Event::Transparency transparency ) +{ + mShowTimeAs = transparency; +} + +KCal::Event::Transparency Event::transparency() const +{ + return mShowTimeAs; +} + +void Event::setEndDate( const TQDateTime& date ) +{ + mEndDate = date; + mHasEndDate = true; + if ( mFloatingStatus == AllDay ) + kdDebug() << "ERROR: Time on end date but no time on the event\n"; + mFloatingStatus = HasTime; +} + +void Event::setEndDate( const TQDate& date ) +{ + mEndDate = date; + mHasEndDate = true; + if ( mFloatingStatus == HasTime ) + kdDebug() << "ERROR: No time on end date but time on the event\n"; + mFloatingStatus = AllDay; +} + +void Event::setEndDate( const TQString& endDate ) +{ + if ( endDate.length() > 10 ) + // This is a date + time + setEndDate( stringToDateTime( endDate ) ); + else + // This is only a date + setEndDate( stringToDate( endDate ) ); +} + +TQDateTime Event::endDate() const +{ + return mEndDate; +} + +bool Event::loadAttribute( TQDomElement& element ) +{ + // This method doesn't handle the color-label tag yet + TQString tagName = element.tagName(); + + if ( tagName == "show-time-as" ) { + // TODO: Support tentative and outofoffice + if ( element.text() == "free" ) + setTransparency( KCal::Event::Transparent ); + else + setTransparency( KCal::Event::Opaque ); + } else if ( tagName == "end-date" ) + setEndDate( element.text() ); + else + return Incidence::loadAttribute( element ); + + // We handled this + return true; +} + +bool Event::saveAttributes( TQDomElement& element ) const +{ + // Save the base class elements + Incidence::saveAttributes( element ); + + // TODO: Support tentative and outofoffice + if ( transparency() == KCal::Event::Transparent ) + writeString( element, "show-time-as", "free" ); + else + writeString( element, "show-time-as", "busy" ); + if ( mHasEndDate ) { + if ( mFloatingStatus == HasTime ) + writeString( element, "end-date", dateTimeToString( endDate() ) ); + else + writeString( element, "end-date", dateToString( endDate().date() ) ); + } + + return true; +} + + +bool Event::loadXML( const TQDomDocument& document ) +{ + TQDomElement top = document.documentElement(); + + if ( top.tagName() != "event" ) { + tqWarning( "XML error: Top tag was %s instead of the expected event", + top.tagName().ascii() ); + return false; + } + + for ( TQDomNode n = top.firstChild(); !n.isNull(); n = n.nextSibling() ) { + if ( n.isComment() ) + continue; + if ( n.isElement() ) { + TQDomElement e = n.toElement(); + loadAttribute( e ); + } else + kdDebug() << "Node is not a comment or an element???" << endl; + } + + loadAttachments(); + return true; +} + +TQString Event::saveXML() const +{ + TQDomDocument document = domTree(); + TQDomElement element = document.createElement( "event" ); + element.setAttribute( "version", "1.0" ); + saveAttributes( element ); + document.appendChild( element ); + return document.toString(); +} + +void Event::setFields( const KCal::Event* event ) +{ + Incidence::setFields( event ); + + // note: if hasEndDate() is false and hasDuration() is true + // dtEnd() returns start+duration + if ( event->hasEndDate() || event->hasDuration() ) { + if ( event->doesFloat() ) { + // This is a floating event. Don't timezone move this one + mFloatingStatus = AllDay; + setEndDate( event->dtEnd().date() ); + } else { + mFloatingStatus = HasTime; + setEndDate( localToUTC( event->dtEnd() ) ); + } + } else { + mHasEndDate = false; + } + setTransparency( event->transparency() ); +} + +void Event::saveTo( KCal::Event* event ) +{ + Incidence::saveTo( event ); + + event->setHasEndDate( mHasEndDate ); + if ( mHasEndDate ) { + if ( mFloatingStatus == AllDay ) + // This is a floating event. Don't timezone move this one + event->setDtEnd( endDate() ); + else + event->setDtEnd( utcToLocal( endDate() ) ); + } + event->setTransparency( transparency() ); +} |