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.
214 lines
5.6 KiB
214 lines
5.6 KiB
#include "kmgroupwarefuncs.h" |
|
|
|
#include <stdlib.h> |
|
#include <time.h> |
|
|
|
|
|
/* temporarily go to a different timezone */ |
|
struct save_tz set_tz( const char* _tc ) |
|
{ |
|
const char *tc = _tc?_tc:"UTC"; |
|
|
|
struct save_tz rv; |
|
|
|
rv.old_tz = 0; |
|
rv.tz_env_str = 0; |
|
|
|
//kdDebug(5006) << "set_tz(), timezone before = " << timezone << endl; |
|
|
|
char* tz_env = 0; |
|
if( getenv( "TZ" ) ) { |
|
tz_env = strdup( getenv( "TZ" ) ); |
|
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(); |
|
//kdDebug(5006) << "set_tz(), timezone after = " << timezone << endl; |
|
|
|
return rv; |
|
} |
|
|
|
/* restore previous timezone */ |
|
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 ); |
|
} |
|
|
|
QDateTime utc2Local( const QDateTime& utcdt ) |
|
{ |
|
struct tm tmL; |
|
|
|
save_tz tmp_tz = set_tz("UTC"); |
|
time_t utc = utcdt.toTime_t(); |
|
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 ) ); |
|
} |
|
|
|
QDateTime pureISOToLocalQDateTime( const QString& dtStr, bool bDateOnly ) |
|
{ |
|
QDate tmpDate; |
|
QTime tmpTime; |
|
int year, month, day, hour, minute, second; |
|
|
|
if( bDateOnly ){ |
|
year = dtStr.left(4).toInt(); |
|
month = dtStr.mid(4,2).toInt(); |
|
day = dtStr.mid(6,2).toInt(); |
|
hour = 0; |
|
minute = 0; |
|
second = 0; |
|
}else{ |
|
year = dtStr.left(4).toInt(); |
|
month = dtStr.mid(4,2).toInt(); |
|
day = dtStr.mid(6,2).toInt(); |
|
hour = dtStr.mid(9,2).toInt(); |
|
minute = dtStr.mid(11,2).toInt(); |
|
second = dtStr.mid(13,2).toInt(); |
|
} |
|
tmpDate.setYMD(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) == 'Z'){ |
|
//dT = dT.addSecs( 60 * KRFCDate::localUTCOffset() );//localUTCOffset( dT ) ); |
|
dT = utc2Local( dT ); |
|
} |
|
} |
|
return dT; |
|
}else |
|
return QDateTime(); |
|
} |
|
|
|
|
|
QString ISOToLocalQDateTime( const QString& dtStr ) |
|
{ |
|
const QString sDateFlag("VALUE=DATE:"); |
|
|
|
QString tmpStr = dtStr.upper(); |
|
const bool bDateOnly = tmpStr.startsWith( sDateFlag ); |
|
if( bDateOnly ) |
|
tmpStr = tmpStr.remove( sDateFlag ); |
|
QDateTime dT( pureISOToLocalQDateTime(tmpStr, bDateOnly) ); |
|
if( dT.isValid() ) |
|
tmpStr = dT.toString( Qt::ISODate ) + '@' + dT.toString( Qt::LocalDate ); |
|
else |
|
tmpStr = "?@?"; |
|
return tmpStr; |
|
} |
|
|
|
|
|
// This is a very light-weight and fast 'parser' to retrieve up |
|
// to 7 data entries from a vCal taking continuation lines |
|
// into account |
|
// This very primitive function may be removed once a link |
|
// to an iCal/vCal parsing library is established... |
|
QString nullQString; |
|
void vPartMicroParser( const QCString& str, QString& s1, QString& s2, QString& s3, |
|
QString& s4, QString& s5, QString& s6, QString& s7 ) |
|
{ |
|
QString line; |
|
uint len = str.length(); |
|
|
|
// "b1 (or b2..b7, resp.) == true" means "seach for s1 (or s2..s7, resp.)" |
|
bool b1 = true, b2 = (&s2!=&nullQString), b3 = (&s3!=&nullQString); |
|
bool b4 = (&s4!=&nullQString), b5 = (&s5!=&nullQString), b6 = (&s6!=&nullQString); |
|
bool b7 = (&s7!=&nullQString); |
|
|
|
for( uint i=0; i<len && (b1 || b2 || b3 || b4 || b5 || b6 || b7 ); ++i){ |
|
if( str[i] == '\r' || str[i] == '\n' ){ |
|
if( str[i] == '\r' ) |
|
++i; |
|
if( i+1 < len && str[i+1] == ' ' ){ |
|
// found a continuation line, skip it's leading blanc |
|
++i; |
|
}else{ |
|
// found a logical line end, process the line |
|
if( b1 && line.startsWith( s1 ) ){ |
|
s1 = line.mid( s1.length() + 1 ); |
|
b1 = false; |
|
}else if( b2 && line.startsWith( s2 ) ){ |
|
s2 = line.mid( s2.length() + 1 ); |
|
b2 = false; |
|
}else if( b3 && line.startsWith( s3 ) ){ |
|
s3 = line.mid( s3.length() + 1 ); |
|
b3 = false; |
|
}else if( b4 && line.startsWith( s4 ) ){ |
|
s4 = line.mid( s4.length() + 1 ); |
|
b4 = false; |
|
}else if( b5 && line.startsWith( s5 ) ){ |
|
s5 = line.mid( s5.length() + 1 ); |
|
b5 = false; |
|
}else if( b6 && line.startsWith( s6 ) ){ |
|
s6 = line.mid( s6.length() + 1 ); |
|
b6 = false; |
|
}else if( b7 && line.startsWith( s7 ) ){ |
|
s7 = line.mid( s7.length() + 1 ); |
|
b7 = false; |
|
} |
|
line = ""; |
|
} |
|
}else{ |
|
line += str[i]; |
|
} |
|
} |
|
if( b1 ) |
|
s1.truncate(0); |
|
if( b2 ) |
|
s2.truncate(0); |
|
if( b3 ) |
|
s3.truncate(0); |
|
if( b4 ) |
|
s4.truncate(0); |
|
if( b5 ) |
|
s5.truncate(0); |
|
if( b6 ) |
|
s6.truncate(0); |
|
if( b7 ) |
|
s7.truncate(0); |
|
} |
|
|
|
QString isoDateTimeToLocal(const QString& isoStr ) |
|
{ |
|
const QDateTime dt( QDateTime::fromString( isoStr, Qt::ISODate ) ); |
|
if( dt.time() == QTime(0,0,0) ) |
|
return dt.date().toString( Qt::LocalDate ); |
|
return dt.toString( Qt::LocalDate ); |
|
} |
|
|
|
void string2HTML( QString& str ) { |
|
str.replace( QChar('&'), "&" ); |
|
str.replace( QChar('<'), "<" ); |
|
str.replace( QChar('>'), ">" ); |
|
str.replace( QChar('\"'), """ ); |
|
str.replace( "\\n", "<br>" ); |
|
str.replace( "\\,", "," ); |
|
}
|
|
|