/* KPilot ** ** Copyright (C) 2002-2003 Reinhold Kainhofer ** Copyright (C) 2001 by Dan Pilone ** ** This file defines the vcal-conduit plugin. */ /* ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program 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 General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program in a file called COPYING; if not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ** MA 02110-1301, USA. */ /* ** Bug reports and questions can be sent to kde-pim@kde.org */ #include "options.h" #include #include #include #include #include "pilotDateEntry.h" #include "pilotDatabase.h" #include "vcal-conduit.moc" #include "vcalconduitSettings.h" #include "kcalRecord.h" #include "vcalRecord.h" extern "C" { unsigned long version_conduit_vcal = Pilot::PLUGIN_API; } VCalConduitPrivate::VCalConduitPrivate(KCal::Calendar *b) : VCalConduitPrivateBase(b) { fAllEvents.setAutoDelete(false); } void VCalConduitPrivate::addIncidence(KCal::Incidence*e) { fAllEvents.append(dynamic_cast(e)); fCalendar->addEvent(dynamic_cast(e)); } int VCalConduitPrivate::updateIncidences() { FUNCTIONSETUP; if (!fCalendar) return 0; fAllEvents = fCalendar->events(); fAllEvents.setAutoDelete(false); return fAllEvents.count(); } void VCalConduitPrivate::removeIncidence(KCal::Incidence *e) { // use dynamic_cast which returns a null pointer if the class does not match... fAllEvents.remove(dynamic_cast(e)); if (!fCalendar) return; fCalendar->deleteEvent(dynamic_cast(e)); // now just in case we're in the middle of reading through our list // and we delete something, set reading to false so we start at the // top again next time and don't have problems with our iterator reading = false; } KCal::Incidence *VCalConduitPrivate::findIncidence(recordid_t id) { KCal::Event::List::ConstIterator it; for( it = fAllEvents.begin(); it != fAllEvents.end(); ++it ) { KCal::Event *event = *it; if ((recordid_t)event->pilotId() == id) return event; } return 0L; } KCal::Incidence *VCalConduitPrivate::findIncidence(PilotRecordBase *tosearch) { PilotDateEntry*entry=dynamic_cast(tosearch); if (!entry) return 0L; TQString title=entry->getDescription(); TQDateTime dt=readTm( entry->getEventStart() ); KCal::Event::List::ConstIterator it; for( it = fAllEvents.begin(); it != fAllEvents.end(); ++it ) { KCal::Event *event = *it; if ( (event->dtStart() == dt) && (event->summary() == title) ) return event; } return 0L; } KCal::Incidence *VCalConduitPrivate::getNextIncidence() { FUNCTIONSETUP; if (reading) { ++fAllEventsIterator; } else { reading=true; fAllEventsIterator = fAllEvents.begin(); } // At end of list, or empty list. return (fAllEventsIterator == fAllEvents.end()) ? 0L : *fAllEventsIterator; } /** Find the next incidence in the list which ddoes not have the SYNCNONE flag set. The * current position is always stored in the iteratoor fAllEventsIterator, so we can just * start from there. Only if reading==false, we haven't yet started goind through the * incidents, so start at fAllEvents.begin() in that case */ KCal::Incidence *VCalConduitPrivate::getNextModifiedIncidence() { FUNCTIONSETUP; KCal::Event*e=0L; if (!reading) { // Start from the top reading=true; fAllEventsIterator = fAllEvents.begin(); } else { // Move on from current position ++fAllEventsIterator; } // Fetch (new) current if possible. if ( fAllEventsIterator != fAllEvents.end() ) e = *fAllEventsIterator; // Then walk the list until we find an unsynced entry while ( fAllEventsIterator != fAllEvents.end() && e && e->syncStatus()!=KCal::Incidence::SYNCMOD && e->pilotId() > 0) { e = (++fAllEventsIterator != fAllEvents.end()) ? *fAllEventsIterator : 0L; } return (fAllEventsIterator == fAllEvents.end()) ? 0L : *fAllEventsIterator; } /**************************************************************************** * VCalConduit class * ****************************************************************************/ VCalConduit::VCalConduit(KPilotLink *d, const char *n, const TQStringList &a) : VCalConduitBase(d,n,a), fAppointmentAppInfo( 0L ) { FUNCTIONSETUP; fConduitName=i18n("Calendar"); } VCalConduit::~VCalConduit() { // FUNCTIONSETUP; } VCalConduitPrivateBase *VCalConduit::createPrivateCalendarData(KCal::Calendar *fCalendar) { return new VCalConduitPrivate(fCalendar); } void VCalConduit::_getAppInfo() { FUNCTIONSETUP; // get the address application header information KPILOT_DELETE(fAppointmentAppInfo); fAppointmentAppInfo = new PilotDateInfo( fDatabase ); } const TQString VCalConduit::getTitle(PilotRecordBase *de) { PilotDateEntry*d=dynamic_cast(de); if (d) return TQString(d->getDescription()); return TQString(); } PilotRecord *VCalConduit::recordFromIncidence(PilotRecordBase *de, const KCal::Incidence*e) { FUNCTIONSETUP; if (!de || !e) { DEBUGKPILOT << fname << ": got NULL entry or NULL incidence." << endl; return 0L; } if ( (e->recurrenceType() == KCal::Recurrence::rYearlyDay) || (e->recurrenceType() == KCal::Recurrence::rYearlyPos) ) { // Warn ahead of time emit logMessage(i18n("Event \"%1\" has a yearly recurrence other than by month, will change this to recurrence by month on handheld.").arg(e->summary())); } PilotDateEntry *dateEntry = dynamic_cast(de); if (!dateEntry) { // Secretly wasn't a date entry after all return 0L; } const KCal::Event *event = dynamic_cast(e); if (!event) { DEBUGKPILOT << fname << ": Incidence is not an event." << endl; return 0L; } if (KCalSync::setDateEntry(dateEntry, event,*fAppointmentAppInfo->categoryInfo())) { return dateEntry->pack(); } else { return 0L; } } KCal::Incidence *VCalConduit::incidenceFromRecord(KCal::Incidence *e, const PilotRecordBase *de) { FUNCTIONSETUP; if (!de || !e) { DEBUGKPILOT << fname << ": Got NULL entry or NULL incidence." << endl; return 0L; } const PilotDateEntry *dateEntry = dynamic_cast(de); if (!dateEntry) { DEBUGKPILOT << fname << ": HH record not a date entry." << endl; return 0L; } KCal::Event *event = dynamic_cast(e); if (!event) { DEBUGKPILOT << fname << ": Incidence is not an event." << endl; return 0L; } KCalSync::setEvent(event, dateEntry,*fAppointmentAppInfo->categoryInfo()); return e; } PilotRecordBase * VCalConduit::newPilotEntry(PilotRecord*r) { return new PilotDateEntry(r); } KCal::Incidence* VCalConduit::newIncidence() { return new KCal::Event; } static VCalConduitSettings *config_vcal = 0L; VCalConduitSettings *VCalConduit::theConfig() { if (!config_vcal) { config_vcal = new VCalConduitSettings(CSL1("Calendar")); } return config_vcal; } VCalConduitSettings *VCalConduit::config() { return theConfig(); }