You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
11 KiB
314 lines
11 KiB
/* |
|
Copyright (c) 2009 Davide Bettio <davide.bettio@kdemail.net> |
|
Copyright (c) 2010 Frederik Gladhorn <gladhorn@kde.org> |
|
|
|
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. |
|
*/ |
|
|
|
|
|
#include "calendarengine.h" |
|
|
|
#include <QtCore/QDate> |
|
|
|
#include <KCalendarSystem> |
|
#include <KDateTime> |
|
#include <KSystemTimeZones> |
|
#include <KHolidays/HolidayRegion> |
|
|
|
#include <KCalCore/Event> |
|
#include <KCalCore/Todo> |
|
#include <KCalCore/Journal> |
|
|
|
#ifdef AKONADI_FOUND |
|
#include "eventdatacontainer.h" |
|
#endif |
|
|
|
CalendarEngine::CalendarEngine(QObject* parent, const QVariantList& args) |
|
: Plasma::DataEngine(parent) |
|
{ |
|
Q_UNUSED(args); |
|
} |
|
|
|
CalendarEngine::~CalendarEngine() |
|
{ |
|
qDeleteAll(m_regions); |
|
} |
|
|
|
bool CalendarEngine::sourceRequestEvent(const QString &request) |
|
{ |
|
qDebug() << "Request = " << request << '\n'; |
|
|
|
if (request.isEmpty()) { |
|
return false; |
|
} |
|
|
|
QStringList requestTokens = request.split(':'); |
|
QString requestKey = requestTokens.takeFirst(); |
|
|
|
if (requestKey == "holidaysRegions" || |
|
requestKey == "holidaysRegion" || |
|
requestKey == "holidaysDefaultRegion" || |
|
requestKey == "holidaysIsValidRegion" || |
|
requestKey == "holidays" || |
|
requestKey == "holidaysInMonth") { |
|
return holidayCalendarSourceRequest(requestKey, requestTokens, request); |
|
} |
|
|
|
#ifdef AKONADI_FOUND |
|
if (requestKey == "events" || requestKey == "eventsInMonth") { |
|
return akonadiCalendarSourceRequest(requestKey, requestTokens, request); |
|
} |
|
#endif |
|
|
|
return false; |
|
} |
|
|
|
bool CalendarEngine::holidayCalendarSourceRequest(const QString& key, const QStringList& args, const QString& request) |
|
{ |
|
if (key == "holidaysRegions") { |
|
QStringList regionList = KHolidays::HolidayRegion::regionCodes(); |
|
Plasma::DataEngine::Data data; |
|
foreach (const QString ®ionCode, regionList) { |
|
Plasma::DataEngine::Data regionData; |
|
KHolidays::HolidayRegion region(regionCode); |
|
regionData.insert("Name", region.name()); |
|
regionData.insert("Description", region.description()); |
|
regionData.insert("CountryCode", region.countryCode()); |
|
regionData.insert("Location", region.location()); |
|
regionData.insert("LanguageCode", region.languageCode()); |
|
data.insert(regionCode, regionData); |
|
} |
|
setData(request, data); |
|
return true; |
|
} |
|
|
|
if (key == "holidaysDefaultRegion") { |
|
// If not set or the locale has changed since last set, then try determine a default region. |
|
if(m_defaultHolidayRegion.isEmpty() || |
|
m_defaultHolidayRegionCountry != KLocale::global()->country() || |
|
m_defaultHolidayRegionLanguage != KLocale::global()->language()) { |
|
|
|
m_defaultHolidayRegion = QString(); |
|
m_defaultHolidayRegionCountry = KLocale::global()->country(); |
|
m_defaultHolidayRegionLanguage = KLocale::global()->language(); |
|
|
|
m_defaultHolidayRegion = KHolidays::HolidayRegion::defaultRegionCode( |
|
m_defaultHolidayRegionCountry.toLower(), |
|
m_defaultHolidayRegionLanguage.toLower() ); |
|
if (m_defaultHolidayRegion.isEmpty()) { |
|
m_defaultHolidayRegion = "NoDefault"; |
|
} |
|
} |
|
|
|
if (m_defaultHolidayRegion == "NoDefault") { |
|
setData(request, QString()); |
|
} else { |
|
setData(request, m_defaultHolidayRegion); |
|
} |
|
return true; |
|
} |
|
|
|
|
|
int argsCount = args.count(); |
|
if (argsCount < 1) { |
|
return false; |
|
} |
|
|
|
const QStringList regionCodeList = args.at(0).split(','); |
|
if (regionCodeList.count() < 1) { |
|
return false; |
|
} |
|
|
|
foreach ( const QString ®ionCode, regionCodeList ) { |
|
KHolidays::HolidayRegion *region = m_regions.value(regionCode); |
|
if (!region || !region->isValid()) { |
|
region = new KHolidays::HolidayRegion(regionCode); |
|
if (region->isValid()) { |
|
m_regions.insert(regionCode, region); |
|
} else { |
|
delete region; |
|
return false; |
|
} |
|
} |
|
} |
|
|
|
if (key == "holidaysIsValidRegion") { |
|
if (regionCodeList.count() > 1) { |
|
return false; |
|
} |
|
QString regionCode = regionCodeList.at(0); |
|
if (m_regions.contains(regionCode)) { |
|
setData(request, m_regions.value(regionCode)->isValid()); |
|
} else { |
|
setData(request, KHolidays::HolidayRegion::isValid(regionCode)); |
|
} |
|
return true; |
|
} |
|
|
|
if (key == "holidaysRegion") { |
|
Plasma::DataEngine::Data data; |
|
foreach (const QString ®ionCode, regionCodeList) { |
|
Plasma::DataEngine::Data regionData; |
|
KHolidays::HolidayRegion *region = m_regions.value(regionCode); |
|
regionData.insert("Name", region->name()); |
|
regionData.insert("Description", region->description()); |
|
regionData.insert("CountryCode", region->countryCode()); |
|
regionData.insert("Location", region->location()); |
|
regionData.insert("LanguageCode", region->languageCode()); |
|
data.insert(regionCode, regionData); |
|
} |
|
setData(request, data); |
|
return true; |
|
} |
|
|
|
if (argsCount < 2) { |
|
return false; |
|
} |
|
|
|
QDate dateArg = QDate::fromString(args.at(1), Qt::ISODate); |
|
if (!dateArg.isValid()) { |
|
return false; |
|
} |
|
|
|
if (key == "holidaysInMonth" || key == "holidays") { |
|
QDate startDate, endDate; |
|
if (key == "holidaysInMonth") { |
|
int requestYear, requestMonth; |
|
KLocale::global()->calendar()->getDate(dateArg, &requestYear, &requestMonth, 0); |
|
int lastDay = KLocale::global()->calendar()->daysInMonth(dateArg); |
|
KLocale::global()->calendar()->setDate(startDate, requestYear, requestMonth, 1); |
|
KLocale::global()->calendar()->setDate(endDate, requestYear, requestMonth, lastDay); |
|
} else if (argsCount == 2) { |
|
startDate = dateArg; |
|
endDate = dateArg; |
|
} else if (argsCount < 3) { |
|
return false; |
|
} else { |
|
startDate = dateArg; |
|
endDate = QDate::fromString(args.at(2), Qt::ISODate); |
|
} |
|
|
|
if (!startDate.isValid() || !endDate.isValid()) { |
|
return false; |
|
} |
|
|
|
QList<QVariant> holidayList; |
|
foreach ( const QString ®ionCode, regionCodeList ) { |
|
KHolidays::HolidayRegion *region = m_regions.value(regionCode); |
|
KHolidays::Holiday::List holidays; |
|
holidays = region->holidays(startDate, endDate, KHolidays::Holiday::MultidayHolidaysAsSingleEvents); |
|
|
|
foreach (const KHolidays::Holiday &holiday, holidays) { |
|
if (!holiday.text().isEmpty()) { |
|
Plasma::DataEngine::Data holidayData; |
|
holidayData.insert("Name", holiday.text()); |
|
holidayData.insert("RegionCode", regionCode); |
|
holidayData.insert("ObservanceStartDate", holiday.observedStartDate().toString(Qt::ISODate)); |
|
holidayData.insert("ObservanceEndDate", holiday.observedEndDate().toString(Qt::ISODate)); |
|
holidayData.insert("ObservanceDuration", holiday.duration()); |
|
// It's a blunt tool for now, we only know if it's a full public holiday or not |
|
if ( holiday.dayType() == KHolidays::Holiday::NonWorkday ) { |
|
holidayData.insert("ObservanceType", "PublicHoliday"); |
|
} else { |
|
holidayData.insert("ObservanceType", "Other"); |
|
} |
|
holidayList.append(QVariant(holidayData)); |
|
} |
|
} |
|
} |
|
|
|
setData(request, QVariant(holidayList)); |
|
return true; |
|
} |
|
|
|
if (key == "isHoliday") { |
|
bool isHoliday = false; |
|
foreach ( const QString ®ionCode, regionCodeList ) { |
|
KHolidays::HolidayRegion *region = m_regions.value(regionCode); |
|
if (region->isHoliday(dateArg)) { |
|
isHoliday = true; |
|
} |
|
} |
|
setData(request, isHoliday); |
|
return true; |
|
} |
|
|
|
if (key == "description") { |
|
QString summary; |
|
foreach ( const QString ®ionCode, regionCodeList ) { |
|
KHolidays::HolidayRegion *region = m_regions.value(regionCode); |
|
KHolidays::Holiday::List holidays; |
|
holidays = region->holidays(dateArg, KHolidays::Holiday::MultidayHolidaysAsSingleEvents); |
|
foreach (const KHolidays::Holiday &holiday, holidays) { |
|
if (!summary.isEmpty()) { |
|
summary.append("\n"); |
|
} |
|
summary.append(holiday.text()); |
|
} |
|
} |
|
|
|
setData(request, summary); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
#ifdef AKONADI_FOUND |
|
bool CalendarEngine::akonadiCalendarSourceRequest(const QString& key, const QStringList& args, const QString& request) |
|
{ |
|
// figure out what time range was requested from the source string |
|
QDate start; |
|
QDate end; |
|
if (key == "eventsInMonth") { |
|
if (args.count() < 1) { |
|
return false; |
|
} |
|
start = QDate::fromString(args.at(0), Qt::ISODate); |
|
start.setDate(start.year(), start.month(), 1); |
|
end = QDate(start.year(), start.month(), start.daysInMonth()); |
|
} else if (key == "events") { |
|
if (args.count() == 1) { |
|
start = QDate::fromString(args.at(0), Qt::ISODate); |
|
end = start.addDays(1); |
|
} else { |
|
if (args.count() < 2) { |
|
return false; |
|
} |
|
start = QDate::fromString(args.at(0), Qt::ISODate); |
|
end = QDate::fromString(args.at(1), Qt::ISODate); |
|
} |
|
} else { |
|
return false; |
|
} |
|
|
|
if (!start.isValid() || !end.isValid()) { |
|
return false; |
|
} |
|
|
|
if (!m_calendar) { |
|
m_calendar = Akonadi::ETMCalendar::Ptr(new Akonadi::ETMCalendar()); |
|
m_calendar->setCollectionFilteringEnabled(false); |
|
} |
|
|
|
// create the corresponding EventDataContainer |
|
addSource(new EventDataContainer(m_calendar, request, KDateTime(start, QTime(0, 0, 0)), KDateTime(end, QTime(23, 59, 59)))); |
|
return true; |
|
} |
|
|
|
#endif // AKONADI_FOUND |
|
|
|
|
|
|