summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/core
Side-by-side diff
Diffstat (limited to 'libopie2/opiepim/core') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/core/orecur.cpp25
-rw-r--r--libopie2/opiepim/core/orecur.h12
-rw-r--r--libopie2/opiepim/core/otimezone.cpp104
-rw-r--r--libopie2/opiepim/core/otimezone.h71
4 files changed, 193 insertions, 19 deletions
diff --git a/libopie2/opiepim/core/orecur.cpp b/libopie2/opiepim/core/orecur.cpp
index daf3506..e6a4787 100644
--- a/libopie2/opiepim/core/orecur.cpp
+++ b/libopie2/opiepim/core/orecur.cpp
@@ -10,17 +10,17 @@ struct ORecur::Data : public QShared {
freq = -1;
days = 0;
pos = 0;
- create = -1;
+ create = QDateTime::currentDateTime();
hasEnd = FALSE;
- end = 0;
+ end = QDate::currentDate();
}
char days; // Q_UINT8 for 8 seven days;)
ORecur::RepeatType type;
int freq;
int pos;
bool hasEnd : 1;
- time_t end;
- time_t create;
+ QDate end;
+ QDateTime create;
int rep;
QString app;
ExceptionList list;
@@ -52,6 +52,8 @@ bool ORecur::operator==( const ORecur& )const {
return false;
}
ORecur &ORecur::operator=( const ORecur& re) {
+ if ( *this == re ) return *this;
+
re.data->ref();
deref();
data = re.data;
@@ -366,15 +368,12 @@ bool ORecur::hasEndDate()const {
return data->hasEnd;
}
QDate ORecur::endDate()const {
- return TimeConversion::fromUTC( data->end ).date();
+ return data->end;
}
QDate ORecur::start()const{
return data->start;
}
-time_t ORecur::endDateUTC()const {
- return data->end;
-}
-time_t ORecur::createTime()const {
+QDateTime ORecur::createdDateTime()const {
return data->create;
}
int ORecur::repetition()const {
@@ -404,13 +403,9 @@ void ORecur::setDays( char c ) {
}
void ORecur::setEndDate( const QDate& dt) {
checkOrModify();
- data->end = TimeConversion::toUTC( dt );
-}
-void ORecur::setEndDateUTC( time_t t) {
- checkOrModify();
- data->end = t;
+ data->end = dt;
}
-void ORecur::setCreateTime( time_t t) {
+void ORecur::setCreatedDateTime( const QDateTime& t) {
checkOrModify();
data->create = t;
}
diff --git a/libopie2/opiepim/core/orecur.h b/libopie2/opiepim/core/orecur.h
index 8713d97..1e0014b 100644
--- a/libopie2/opiepim/core/orecur.h
+++ b/libopie2/opiepim/core/orecur.h
@@ -35,13 +35,18 @@ public:
bool hasEndDate()const;
QDate start()const;
QDate endDate()const;
- time_t endDateUTC()const;
- time_t createTime()const;
+ QDateTime createdDateTime()const;
+ /**
+ * starting on monday=0, sunday=6
+ * for convience
+ */
+ bool repeatOnWeekDay( int day )const;
/**
* FromWhereToStart is not included!!!
*/
bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate );
+
/**
* The module this ORecur belongs to
*/
@@ -63,8 +68,7 @@ public:
void setDays( char c);
void setEndDate( const QDate& dt );
void setStart( const QDate& dt );
- void setEndDateUTC( time_t );
- void setCreateTime( time_t );
+ void setCreatedDateTime( const QDateTime& );
void setHasEndDate( bool b );
void setRepitition(int );
diff --git a/libopie2/opiepim/core/otimezone.cpp b/libopie2/opiepim/core/otimezone.cpp
new file mode 100644
index 0000000..b2bd3aa
--- a/dev/null
+++ b/libopie2/opiepim/core/otimezone.cpp
@@ -0,0 +1,104 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+
+#include "otimezone.h"
+
+namespace {
+
+ QDateTime utcTime( time_t t) {
+ tm* broken = ::gmtime( &t );
+ QDateTime ret;
+ ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
+ ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
+ return ret;
+ }
+ QDateTime utcTime( time_t t, const QString& zone) {
+ QCString org = ::getenv( "TZ" );
+ ::setenv( "TZ", zone.latin1(), true );
+ ::tzset();
+
+ tm* broken = ::localtime( &t );
+ ::setenv( "TZ", org, true );
+
+ QDateTime ret;
+ ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
+ ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
+
+ return ret;
+ }
+ time_t to_Time_t( const QDateTime& utc, const QString& str ) {
+ QDate d = utc.date();
+ QTime t = utc.time();
+
+ tm broken;
+ broken.tm_year = d.year() - 1900;
+ broken.tm_mon = d.month() - 1;
+ broken.tm_mday = d.day();
+ broken.tm_hour = t.hour();
+ broken.tm_min = t.minute();
+ broken.tm_sec = t.second();
+
+ QCString org = ::getenv( "TZ" );
+ ::setenv( "TZ", str.latin1(), true );
+ ::tzset();
+
+ time_t ti = ::mktime( &broken );
+ ::setenv( "TZ", org, true );
+
+ return ti;
+ }
+}
+OTimeZone::OTimeZone( const ZoneName& zone )
+ : m_name(zone) {
+}
+OTimeZone::~OTimeZone() {
+}
+
+bool OTimeZone::isValid()const {
+ return !m_name.isEmpty();
+}
+
+/*
+ * we will get the current timezone
+ * and ask it to convert to the timezone date
+ */
+QDateTime OTimeZone::toLocalDateTime( const QDateTime& dt) {
+ return OTimeZone::current().toDateTime( dt, *this );
+}
+QDateTime OTimeZone::toUTCDateTime( const QDateTime& dt ) {
+ return OTimeZone::utc().toDateTime( dt, *this );
+}
+QDateTime OTimeZone::fromUTCDateTime( time_t t) {
+ return utcTime( t );
+}
+QDateTime OTimeZone::toDateTime( time_t t) {
+ return utcTime( t, m_name );
+}
+/*
+ * convert dt to utc using zone.m_name
+ * convert utc -> timeZoneDT using this->m_name
+ */
+QDateTime OTimeZone::toDateTime( const QDateTime& dt, const OTimeZone& zone ) {
+ time_t utc = to_Time_t( dt, zone.m_name );
+ qWarning("%d %s", utc, zone.m_name.latin1() );
+ return utcTime( utc, m_name );
+}
+time_t OTimeZone::fromDateTime( const QDateTime& time ) {
+ return to_Time_t( time, m_name );
+}
+time_t OTimeZone::fromUTCDateTime( const QDateTime& time ) {
+ return to_Time_t( time, "UTC" );
+}
+OTimeZone OTimeZone::current() {
+ QCString str = ::getenv("TZ");
+ OTimeZone zone( str );
+ return zone;
+}
+OTimeZone OTimeZone::utc() {
+ return OTimeZone("UTC");
+}
+QString OTimeZone::timeZone()const {
+ return m_name;
+}
diff --git a/libopie2/opiepim/core/otimezone.h b/libopie2/opiepim/core/otimezone.h
new file mode 100644
index 0000000..bb08349
--- a/dev/null
+++ b/libopie2/opiepim/core/otimezone.h
@@ -0,0 +1,71 @@
+#ifndef OPIE_TIME_ZONE_H
+#define OPIE_TIME_ZONE_H
+
+#include <time.h>
+#include <qdatetime.h>
+
+/**
+ * A very primitive class to convert time
+ * from one timezone to another
+ * and to localtime
+ * and time_t
+ */
+class OTimeZone {
+ public:
+ typedef QString ZoneName;
+ OTimeZone( const ZoneName& = ZoneName::null );
+ virtual ~OTimeZone(); // just in case.
+
+ bool isValid()const;
+
+ /**
+ * converts the QDateTime to a DateTime
+ * in the local timezone
+ * if QDateTime is 25th Jan and takes place in Europe/Berlin at 12h
+ * and the current timezone is Europe/London the returned
+ * time will be 11h.
+ */
+ QDateTime toLocalDateTime( const QDateTime& dt );
+
+ /**
+ * converts the QDateTime to UTC time
+ */
+ QDateTime toUTCDateTime( const QDateTime& dt );
+
+ /**
+ * reads the time_t into a QDateTime using UTC as timezone!
+ */
+ QDateTime fromUTCDateTime( time_t );
+
+ /**
+ * converts the time_t to the time in the timezone
+ */
+ QDateTime toDateTime( time_t );
+
+ /**
+ * converts the QDateTime from one timezone to this timeZone
+ */
+ QDateTime toDateTime( const QDateTime&, const OTimeZone& timeZone );
+
+ /**
+ * converts the date time into a time_t. It takes the timezone into account
+ */
+ time_t fromDateTime( const QDateTime& );
+
+ /**
+ * converts the datetime with timezone UTC
+ */
+ time_t fromUTCDateTime( const QDateTime& );
+
+ static OTimeZone current();
+ static OTimeZone utc();
+
+ QString timeZone()const;
+ private:
+ ZoneName m_name;
+ class Private;
+ Private* d;
+};
+
+
+#endif