summaryrefslogtreecommitdiffstats
path: root/libkholidays/kholidays.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libkholidays/kholidays.cpp')
-rw-r--r--libkholidays/kholidays.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/libkholidays/kholidays.cpp b/libkholidays/kholidays.cpp
new file mode 100644
index 000000000..9bb5c1013
--- /dev/null
+++ b/libkholidays/kholidays.cpp
@@ -0,0 +1,148 @@
+/*
+ This file is part of KOrganizer.
+ Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@kde.org>
+
+ 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; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qfile.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include "kholidays.h"
+#include "kholidays_version.h"
+
+extern "C" {
+ char *parse_holidays( const char *, int year, short force );
+ /** \internal */
+ struct holiday {
+ char *string; /* name of holiday, 0=not a holiday */
+ int color; /* color code, see scanholiday.lex */
+ unsigned short dup; /* reference count */
+ holiday *next; /* single-linked list if more than one holida appears on a given date */
+ };
+ extern struct holiday holidays[366];
+}
+
+QStringList KHolidays::locations()
+{
+ QStringList files =
+ KGlobal::dirs()->findAllResources( "data", "libkholidays/" + generateFileName( "*" ),
+ false, true );
+ QStringList locs;
+
+ QStringList::ConstIterator it;
+ for ( it = files.begin(); it != files.end(); ++it )
+ locs.append( (*it).mid((*it).findRev('_') + 1) );
+
+ return locs;
+}
+
+QString KHolidays::fileForLocation( const QString &location )
+{
+ return locate( "data", "libkholidays/" + generateFileName( location ) );
+}
+
+QString KHolidays::userPath( bool create )
+{
+ return KGlobal::dirs()->saveLocation( "data", "libkholidays/", create );
+}
+
+QString KHolidays::generateFileName( const QString &location )
+{
+ return "holiday_" + location;
+}
+
+
+
+
+KHolidays::KHolidays( const QString& location )
+ : mLocation( location )
+{
+ mHolidayFile = fileForLocation( location );
+
+ mYearLast = 0;
+}
+
+KHolidays::~KHolidays()
+{
+}
+
+QString KHolidays::location() const
+{
+ return mLocation;
+}
+
+QString KHolidays::shortText( const QDate &date )
+{
+ QValueList<KHoliday> lst = getHolidays( date );
+ if ( !lst.isEmpty() )
+ return lst.first().text;
+ else return QString::null;
+}
+
+bool KHolidays::parseFile( const QDate &date )
+{
+// kdDebug()<<"KHolidays::parseFile( date=" << date << ")"<<endl;
+ int lastYear = 0; //current year less 1900
+
+ if ( mHolidayFile.isNull() || mHolidayFile.isEmpty() || date.isNull() || !date.isValid() )
+ return false;
+
+ if ( ( date.year() != mYearLast ) || ( mYearLast == 0 ) ) {
+// kdDebug()<<kdBacktrace();
+ mYearLast = date.year();
+ lastYear = date.year() - 1900; // silly parse_year takes 2 digit year...
+ parse_holidays( QFile::encodeName( mHolidayFile ), lastYear, 1 );
+ }
+
+ return true;
+}
+
+QString KHolidays::getHoliday( const QDate &date )
+{
+ QValueList<KHoliday> lst = getHolidays( date );
+ if ( !lst.isEmpty() )
+ return lst.first().text;
+ else return QString::null;
+}
+
+QValueList<KHoliday> KHolidays::getHolidays( const QDate &date )
+{
+ QValueList<KHoliday> list;
+ if ( !parseFile( date ) ) return list;
+ struct holiday *hd = &holidays[date.dayOfYear()-1];
+ while ( hd ) {
+ if ( hd->string ) {
+ KHoliday holiday;
+ holiday.text = QString::fromUtf8( hd->string );
+ holiday.shortText = holiday.text;
+ holiday.Category = (hd->color == 2/*red*/) || (hd->color == 9/*weekend*/) ? HOLIDAY : WORKDAY;
+ list.append( holiday );
+ }
+ hd = hd->next;
+ }
+ return list;
+}
+
+int KHolidays::category( const QDate &date )
+{
+ if ( !parseFile(date) ) return WORKDAY;
+
+ return (holidays[date.dayOfYear()-1].color == 2/*red*/) ||
+ (holidays[date.dayOfYear()-1].color == 9/*weekend*/) ? HOLIDAY : WORKDAY;
+}