summaryrefslogtreecommitdiffstats
path: root/kpilot/tests/mergecalendars.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kpilot/tests/mergecalendars.cc')
-rw-r--r--kpilot/tests/mergecalendars.cc228
1 files changed, 228 insertions, 0 deletions
diff --git a/kpilot/tests/mergecalendars.cc b/kpilot/tests/mergecalendars.cc
new file mode 100644
index 000000000..221da26b0
--- /dev/null
+++ b/kpilot/tests/mergecalendars.cc
@@ -0,0 +1,228 @@
+/* mergecalendars KPilot
+**
+** Copyright (C) 2007 by Jason 'vanRijn' Kasper <vR@movingparts.net)
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser 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 <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kconfigskeleton.h>
+
+#include <libkcal/calendar.h>
+#include <libkcal/calendarlocal.h>
+
+#include "options.h"
+
+static const KCmdLineOptions options[] =
+{
+ {"korgfile <path>","KOrganizer master file", 0},
+ {"newfile <path>","Calendar file to merge into korganizer", 0},
+ {"category <string>","Category to remove from 'korgfile' and to add to events in 'newfile' for synch purposes", 0},
+ {"verbose", "Verbose debugging", 0},
+ KCmdLineLastOption
+};
+
+
+
+int main(int argc, char **argv)
+{
+
+ KApplication::disableAutoDcopRegistration();
+
+ KAboutData aboutData("mergecalendars","Merge libkcal Calendars","0.1");
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KApplication app( false, false );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ int debug_level= (args->isSet("verbose")) ? 4 : 0;
+
+ QString korgfile = args->getOption("korgfile");
+ QString newfile = args->getOption("newfile");
+ QString category = args->getOption("category");
+
+ if (korgfile.isEmpty())
+ {
+ WARNINGKPILOT << "! Must provide a korganizer file." << endl;
+ }
+ if (newfile.isEmpty())
+ {
+ WARNINGKPILOT << "! Must provide a newfile file." << endl;
+ }
+ if (category.isEmpty())
+ {
+ WARNINGKPILOT << "! Must provide a category to use." << endl;
+ }
+ if (korgfile.isEmpty() || newfile.isEmpty() || category.isEmpty())
+ {
+ return 1;
+ }
+
+ QString korgsave = QString("%1.updated").arg(korgfile);
+ QString newfilesave = QString("%1.updated").arg(newfile);
+
+ DEBUGKPILOT << "Using korgfile: [" << korgfile
+ << "]" << endl;
+ DEBUGKPILOT << "Using newfile: [" << newfile
+ << "]" << endl;
+ DEBUGKPILOT << "Will save korgfile to: [" << korgsave
+ << "]" << endl;
+ DEBUGKPILOT << "Will save newfile to: [" << newfilesave
+ << "]" << endl << endl;
+
+ KCal::CalendarLocal *calkorg = new KCal::CalendarLocal( QString::fromLatin1("UTC") );
+ KCal::CalendarLocal *calnew = new KCal::CalendarLocal( QString::fromLatin1("UTC") );
+ if (!calkorg || !calnew)
+ {
+ WARNINGKPILOT << "Unable to create base calendar objects." << endl;
+ return 1;
+ }
+
+ if (!calkorg->load(korgfile) || !calnew->load(newfile))
+ {
+ WARNINGKPILOT << "Unable to load calendar files." << endl;
+ return 1;
+ }
+
+ int numkorgstart = calkorg->incidences().count();
+ int numnewstart = calnew->incidences().count();
+
+ DEBUGKPILOT << " - Opened korganizer calendar with: ["
+ << numkorgstart << "] incidences." << endl;
+ DEBUGKPILOT << " - Opened newfile calendar with: ["
+ << numnewstart << "] incidences." << endl;
+
+ KCal::Event::List korgEvents;
+ KCal::Event::List::ConstIterator korgIt;
+ korgEvents = calkorg->events();
+ korgEvents.setAutoDelete(false);
+
+ KCal::Event::List newEvents;
+ KCal::Event::List::ConstIterator newIt;
+ newEvents = calnew->events();
+ newEvents.setAutoDelete(false);
+
+ DEBUGKPILOT << "Looking for previous pilot ids for exchange events..." << endl;
+
+ // iterate through all events and try to find a korganizer event
+ // that matches up with this external event's UID
+ unsigned int numkorgpilotids = 0;
+ KCal::Event *ev = 0;
+ for (newIt = newEvents.begin(); newIt != newEvents.end(); ++newIt )
+ {
+ ev = *newIt;
+ QString uid = ev->uid();
+ if (debug_level)
+ DEBUGKPILOT << " - Looking at event: ["
+ << ev->summary() << "], uid: ["
+ << uid << "]" << endl;
+
+ KCal::Event * evkorg = calkorg->event(uid);
+ if ( evkorg && (evkorg->pilotId() > 0) )
+ {
+ unsigned long pilotId = evkorg->pilotId();
+
+ if (debug_level)
+ DEBUGKPILOT << "Found korg event for uid: ["
+ << uid << "], pilotId: ["
+ << pilotId << "]" << endl;
+
+ ev->setPilotId(pilotId);
+ ev->setSyncStatus(KCal::Incidence::SYNCMOD);
+
+ ++numkorgpilotids;
+ }
+ }
+
+ DEBUGKPILOT << "Matched: [" << numkorgpilotids << "] events."<< endl;
+
+ DEBUGKPILOT << "Now searching for previous events of category: [" << category << "] in korganizer's calendar." << endl;
+
+ // iterate through all events and try to find a korganizer event
+ // that matches up with this external event's UID
+ unsigned int numkorgremoved = 0;
+
+ QString categoryToken = category;
+
+ // careful iterating and removing...
+ KCal::Event *next = 0;
+
+ korgIt = korgEvents.begin();
+ for ( ev = *korgIt; ev != 0; ev = next )
+ {
+ if (++korgIt == korgEvents.end())
+ {
+ next = 0;
+ }
+ else
+ {
+ next = *korgIt;
+ }
+
+ if (ev->categoriesStr().contains(categoryToken))
+ {
+ if (debug_level)
+ DEBUGKPILOT << " - Found matching event: ["
+ << ev->summary() << "], uid: ["
+ << ev->uid() << "]. Removing." << endl;
+
+ korgEvents.remove(ev);
+ calkorg->deleteEvent(ev);
+
+ ++numkorgremoved;
+ }
+ }
+
+ DEBUGKPILOT << " - Found: [" << numkorgremoved
+ << "] prior: [" << categoryToken
+ << "] category events." << endl;
+
+ DEBUGKPILOT << "Merging new events into korganizer calendar..."
+ << endl;
+
+ for (newIt = newEvents.begin(); newIt != newEvents.end(); ++newIt )
+ {
+ ev = *newIt;
+ ev->setCategories(category);
+ korgEvents.append(ev);
+ calkorg->addEvent(ev);
+ }
+
+ DEBUGKPILOT << "Ended up with: [" << korgEvents.count()
+ << "] events in korganizer calendar." << endl;
+
+ DEBUGKPILOT << "Saving updated korganizer file..." << endl;
+ calkorg->save(korgsave);
+
+ DEBUGKPILOT << "Saving updated newfile file..." << endl;
+ calnew->save(newfilesave);
+
+ return 0;
+}
+