diff --git a/src/formatter.cpp b/src/formatter.cpp --- a/src/formatter.cpp +++ b/src/formatter.cpp @@ -72,114 +72,29 @@ return tnefMsg->findNamedProp(name, fallback); } -struct save_tz { - char *old_tz = nullptr; - char *tz_env_str = nullptr; -}; - -/* temporarily go to a different timezone */ -static struct save_tz set_tz(const char *_tc) -{ - const char *tc = _tc ? _tc : "UTC"; - - struct save_tz rv; - - rv.old_tz = nullptr; - rv.tz_env_str = nullptr; - - //qCDebug(KTNEF_LOG) << "set_tz(), timezone before =" << timezone; - - char *tz_env = nullptr; - const QByteArray tzEnv = qgetenv("TZ"); - if (!tzEnv.isEmpty()) { - tz_env = qstrdup(tzEnv.constData()); - rv.old_tz = tz_env; - } - char *tmp_env = (char *)malloc(strlen(tc) + 4); - strcpy(tmp_env, "TZ="); - strcpy(tmp_env + 3, tc); - putenv(tmp_env); - - rv.tz_env_str = tmp_env; - - /* tmp_env is not free'ed -- it is part of the environment */ - - tzset(); - //qCDebug(KTNEF_LOG) << "set_tz(), timezone after =" << timezone; - - return rv; -} - -/* restore previous timezone */ -static void unset_tz(struct save_tz old_tz) -{ - if (old_tz.old_tz) { - char *tmp_env = (char *)malloc(strlen(old_tz.old_tz) + 4); - strcpy(tmp_env, "TZ="); - strcpy(tmp_env + 3, old_tz.old_tz); - putenv(tmp_env); - /* tmp_env is not free'ed -- it is part of the environment */ - free(old_tz.old_tz); - } else { - /* clear TZ from env */ - putenv(strdup("TZ")); - } - tzset(); - - /* is this OK? */ - if (old_tz.tz_env_str) { - free(old_tz.tz_env_str); - } -} - -static QDateTime utc2Local(const QDateTime &utcdt) -{ - struct tm tmL; - - save_tz tmp_tz = set_tz("UTC"); - time_t utc = utcdt.toSecsSinceEpoch(); - unset_tz(tmp_tz); - - localtime_r(&utc, &tmL); - return QDateTime(QDate(tmL.tm_year + 1900, tmL.tm_mon + 1, tmL.tm_mday), - QTime(tmL.tm_hour, tmL.tm_min, tmL.tm_sec)); -} - -static QDateTime pureISOToLocalQDateTime(const QString &dtStr, - bool bDateOnly = false) +static QDateTime pureISOToLocalQDateTime(const QString &dtStr) { QDate tmpDate; QTime tmpTime; int year, month, day, hour, minute, second; - if (bDateOnly) { - year = dtStr.leftRef(4).toInt(); - month = dtStr.midRef(4, 2).toInt(); - day = dtStr.midRef(6, 2).toInt(); - hour = 0; - minute = 0; - second = 0; - } else { - year = dtStr.leftRef(4).toInt(); - month = dtStr.midRef(4, 2).toInt(); - day = dtStr.midRef(6, 2).toInt(); - hour = dtStr.midRef(9, 2).toInt(); - minute = dtStr.midRef(11, 2).toInt(); - second = dtStr.midRef(13, 2).toInt(); - } + year = dtStr.leftRef(4).toInt(); + month = dtStr.midRef(4, 2).toInt(); + day = dtStr.midRef(6, 2).toInt(); + hour = dtStr.midRef(9, 2).toInt(); + minute = dtStr.midRef(11, 2).toInt(); + second = dtStr.midRef(13, 2).toInt(); tmpDate.setDate(year, month, day); tmpTime.setHMS(hour, minute, second); if (tmpDate.isValid() && tmpTime.isValid()) { QDateTime dT = QDateTime(tmpDate, tmpTime); - if (!bDateOnly) { - // correct for GMT ( == Zulu time == UTC ) - if (dtStr.at(dtStr.length() - 1) == QLatin1Char('Z')) { - //dT = dT.addSecs( 60 * KRFCDate::localUTCOffset() ); - //localUTCOffset( dT ) ); - dT = utc2Local(dT); - } + // correct for GMT ( == Zulu time == UTC ) + if (dtStr.at(dtStr.length() - 1) == QLatin1Char('Z')) { + //dT = dT.addSecs( 60 * KRFCDate::localUTCOffset() ); + //localUTCOffset( dT ) ); + dT = dT.toLocalTime(); } return dT; } else { @@ -269,6 +184,9 @@ //ScheduleMessage schedMsg( event, method, ScheduleMessage::Unknown ); QString sSenderSearchKeyEmail(tnefMsg->findProp(0x0C1D)); + if (sSenderSearchKeyEmail.isEmpty()) { + sSenderSearchKeyEmail = tnefMsg->findProp(0x0C1f); + } if (!sSenderSearchKeyEmail.isEmpty()) { const int colon = sSenderSearchKeyEmail.indexOf(QLatin1Char(':')); @@ -337,20 +255,27 @@ event->setOrganizer(s); } - s = tnefMsg->findProp(0x819b).remove(QLatin1Char('-')).remove(QLatin1Char(':')); - event->setDtStart(QDateTime::fromString(s)); // ## Format?? + QDateTime dt = tnefMsg->property(0x819b).toDateTime(); + if (!dt.isValid()) { + dt = tnefMsg->property(0x0060).toDateTime(); + } + event->setDtStart(dt); // ## Format?? - s = tnefMsg->findProp(0x819c).remove(QLatin1Char('-')).remove(QLatin1Char(':')); - event->setDtEnd(QDateTime::fromString(s)); + dt = tnefMsg->property(0x819c).toDateTime(); + if (!dt.isValid()) + { + dt = tnefMsg->property(0x0061).toDateTime(); + } + event->setDtEnd(dt); s = tnefMsg->findProp(0x810d); event->setLocation(s); // is it OK to set this to OPAQUE always ?? //vPart += "TRANSP:OPAQUE\n"; ###FIXME, portme! //vPart += "SEQUENCE:0\n"; // is "0x0023" OK - or should we look for "0x0003" ?? - s = tnefMsg->findProp(0x0023); + s = tnefMsg->findProp(0x0062); event->setUid(s); // PENDING(khz): is this value in local timezone? Must it be @@ -364,9 +289,15 @@ event->setCategories(s); s = tnefMsg->findProp(0x1000); + if (s.isEmpty()) { + s = tnefMsg->findProp(0x3fd9); + } event->setDescription(s); s = tnefMsg->findProp(0x0070); + if (s.isEmpty()) { + s = tnefMsg->findProp(0x0037); + } event->setSummary(s); s = tnefMsg->findProp(0x0026); diff --git a/src/ktnefparser.cpp b/src/ktnefparser.cpp --- a/src/ktnefparser.cpp +++ b/src/ktnefparser.cpp @@ -390,8 +390,14 @@ delete current_; current_ = nullptr; - if (!device_->open(QIODevice::ReadOnly)) { - qCDebug(KTNEF_LOG) << "Couldn't open device"; + if (!device_->isOpen()) { + if (!device_->open(QIODevice::ReadOnly)) { + qCDebug(KTNEF_LOG) << "Couldn't open device"; + return false; + } + } + if (!device_->isReadable()) { + qCDebug(KTNEF_LOG) << "Device not readable"; return false; } @@ -618,12 +624,11 @@ u64 -= 116444736000000000LL; u64 /= 10000000; if (u64 <= 0xffffffffU) { - dt.fromSecsSinceEpoch((unsigned int)u64); + dt = QDateTime::fromSecsSinceEpoch((unsigned int)u64); } else { qCWarning(KTNEF_LOG).nospace() << "Invalid date: low byte=" << showbase << qSetFieldWidth(8) << qSetPadChar(QLatin1Char('0')) << lowB << ", high byte=" << highB; - dt.fromSecsSinceEpoch(0xffffffffU); } return dt; }