Fixed bug 188095: Z on the end of time stamp ignored. time zone misinterpreted.

This commit is contained in:
mostafah%oeone.com 2003-04-24 22:17:01 +00:00
parent 1d623fd80b
commit 25445d9df9
4 changed files with 115 additions and 44 deletions

View File

@ -240,6 +240,21 @@ NS_IMETHODIMP oeDateTimeImpl::GetTzID(char **aRetVal)
return NS_OK;
}
void oeDateTimeImpl::SetTzID(const char *aNewVal)
{
#ifdef ICAL_DEBUG_ALL
printf( "SetTzID( %s )\n", aNewVal );
#endif
if( m_tzid )
nsMemory::Free( m_tzid );
if( aNewVal )
m_tzid= (char*) nsMemory::Clone( aNewVal, strlen(aNewVal)+1);
else
m_tzid = nsnull;
return NS_OK;
}
int oeDateTimeImpl::CompareDate( oeDateTimeImpl *anotherdt ) {
if( m_datetime.year == anotherdt->m_datetime.year &&
m_datetime.month == anotherdt->m_datetime.month &&

View File

@ -61,8 +61,10 @@ public:
virtual ~oeDateTimeImpl();
void AdjustToWeekday( short weekday );
int CompareDate( oeDateTimeImpl *anotherdt );
void SetTzID(const char *aNewVal);
/* additional members */
struct icaltimetype m_datetime;
private:
char *m_tzid;
};

View File

@ -73,6 +73,11 @@ TZNAME:NHD-GMT%c%02d:%02d\n\
DTSTART:20000402T020000\n\
RRULE:FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=1,2,3,4,5,6,7;BYDAY=SU\n\
END:DAYLIGHT\n\
END:VTIMEZONE\n";
char *zulutimezonestr = "BEGIN:VTIMEZONE\n\
TZID:/Mozilla.org/BasicTimezones/GMT\n\
LOCATION:GMT\n\
END:VTIMEZONE\n";
char timezonestr[1024];
@ -85,6 +90,10 @@ END:VTIMEZONE\n";
icalcomponent *vcalendar = icalparser_parse_string(timezonecalstr);
icalcomponent *vtimezone;
//first add the UTC timezone
vtimezone = icalcomponent_new_from_string( zulutimezonestr );
icalcomponent_add_component( vcalendar, vtimezone );
//Components should be sorted by location
//+00:00 to +12:00
int i;

View File

@ -1934,21 +1934,29 @@ bool oeICalEventImpl::ParseIcalComponent( icalcomponent *comp )
prop = icalcomponent_get_first_property( vevent, ICAL_DTSTART_PROPERTY );
if ( prop != 0) {
m_start->m_datetime = icalproperty_get_dtstart( prop );
bool datevalue=m_start->m_datetime.is_date;
m_start->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
const char *tzid=nsnull;
if( m_start->m_datetime.is_utc && !datevalue )
tzid="/Mozilla.org/BasicTimezones/GMT";
m_start->m_datetime.is_utc = false;
if( m_start->m_datetime.is_date == true ) {
if( datevalue ) {
m_allday = true;
m_start->SetHour( 0 );
m_start->SetMinute( 0 );
m_start->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
}
icalparameter *tmppar = icalproperty_get_first_parameter( prop, ICAL_TZID_PARAMETER );
const char *tzid=nsnull;
if( tmppar )
tzid = icalparameter_get_tzid( tmppar );
if( tzid ) {
PRTime timeinms;
m_start->GetTime( &timeinms );
m_start->SetTimeInTimezone( timeinms, tzid );
if( !datevalue ) {
PRTime timeinms;
m_start->GetTime( &timeinms );
m_start->SetTimeInTimezone( timeinms, tzid );
} else {
m_start->SetTzID( tzid );
}
}
} else {
m_start->m_datetime = icaltime_null_time();
@ -1967,20 +1975,27 @@ bool oeICalEventImpl::ParseIcalComponent( icalcomponent *comp )
prop = icalcomponent_get_first_property( vevent, ICAL_DTEND_PROPERTY );
if ( prop != 0) {
m_end->m_datetime = icalproperty_get_dtend( prop );
bool datevalue=m_end->m_datetime.is_date;
m_end->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
const char *tzid=nsnull;
if( m_end->m_datetime.is_utc && !datevalue )
tzid="/Mozilla.org/BasicTimezones/GMT";
m_end->m_datetime.is_utc = false;
if( m_end->m_datetime.is_date == true ) {
if( datevalue ) {
m_end->SetHour( 0 );
m_end->SetMinute( 0 );
m_end->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
}
icalparameter *tmppar = icalproperty_get_first_parameter( prop, ICAL_TZID_PARAMETER );
const char *tzid=nsnull;
if( tmppar )
tzid = icalparameter_get_tzid( tmppar );
if( tzid ) {
PRTime timeinms;
m_end->GetTime( &timeinms );
m_end->SetTimeInTimezone( timeinms, tzid );
if( !datevalue ) {
PRTime timeinms;
m_end->GetTime( &timeinms );
m_end->SetTimeInTimezone( timeinms, tzid );
} else {
m_end->SetTzID( tzid );
}
}
} else if( !icaltime_is_null_time( m_start->m_datetime ) ) {
m_end->m_datetime = m_start->m_datetime;
@ -2447,54 +2462,84 @@ icalcomponent* oeICalEventImpl::AsIcalComponent()
char *starttzid=nsnull;
if( m_start && !icaltime_is_null_time( m_start->m_datetime ) ) {
m_start->GetTzID( &starttzid );
if( m_allday && !starttzid ) {
if( m_allday ) {
m_start->SetHour( 0 );
m_start->SetMinute( 0 );
m_start->m_datetime.is_date = true; //This will reflect the event being an all-day event
}
prop = icalproperty_new_dtstart( m_start->m_datetime );
if( starttzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (starttzid);
icaltimetype convertedtime = m_start->m_datetime;
icaltimezone_convert_time ( &convertedtime, currenttimezone, timezone );
if( m_allday ) {
convertedtime.is_date = true; //This will reflect the event being an all-day event
prop = icalproperty_new_dtstart( m_start->m_datetime );
if( starttzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (starttzid);
icalparameter *tmppar = icalparameter_new_tzid( starttzid );
icalproperty_add_parameter( prop, tmppar );
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
}
icalproperty_set_dtstart( prop, convertedtime );
icalparameter *tmppar = icalparameter_new_tzid( starttzid );
icalproperty_add_parameter( prop, tmppar );
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
m_start->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
} else {
if( starttzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (starttzid);
icaltimetype convertedtime = m_start->m_datetime;
icaltimezone_convert_time ( &convertedtime, currenttimezone, timezone );
if( strcmp( starttzid, "/Mozilla.org/BasicTimezones/GMT" )==0 ) {
convertedtime.is_utc = true;
prop = icalproperty_new_dtstart( convertedtime );
} else {
prop = icalproperty_new_dtstart( convertedtime );
icalparameter *tmppar = icalparameter_new_tzid( starttzid );
icalproperty_add_parameter( prop, tmppar );
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
}
} else
prop = icalproperty_new_dtstart( m_start->m_datetime );
}
icalcomponent_add_property( vevent, prop );
m_start->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
}
//enddate
if( m_end && !icaltime_is_null_time( m_end->m_datetime ) ) {
char *tzid=nsnull;
m_end->GetTzID( &tzid );
if( m_allday && !tzid && m_end->CompareDate( m_start )==0 ) {
m_end->SetHour( 23 );
m_end->SetMinute( 59 );
}
prop = icalproperty_new_dtend( m_end->m_datetime );
if( tzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
icaltimetype convertedtime = m_end->m_datetime;
icaltimezone_convert_time ( &convertedtime, currenttimezone, timezone );
if( m_allday ) {
convertedtime.hour=23;
convertedtime.minute=59;
if( m_allday ) {
if( m_end->CompareDate( m_start )==0 ) {
m_end->m_datetime = m_start->m_datetime;
icaltime_adjust( &(m_end->m_datetime), 1, 0, 0, 0 );
} else {
m_end->SetHour( 0 );
m_end->SetMinute( 0 );
}
icalproperty_set_dtend( prop, convertedtime );
icalparameter *tmppar = icalparameter_new_tzid( tzid );
icalproperty_add_parameter( prop, tmppar );
if( !starttzid || strcmp( starttzid, tzid ) != 0 )
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
nsMemory::Free( tzid );
m_end->m_datetime.is_date = true;
prop = icalproperty_new_dtend( m_end->m_datetime );
if( tzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
icalparameter *tmppar = icalparameter_new_tzid( tzid );
icalproperty_add_parameter( prop, tmppar );
if( !starttzid || strcmp( starttzid, tzid ) != 0 )
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
nsMemory::Free( tzid );
}
icalcomponent_add_property( vevent, prop );
m_end->m_datetime.is_date = false; //Because currently we depend on m_datetime being a complete datetime value.
} else {
if( tzid ) {
icaltimezone *timezone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
icaltimetype convertedtime = m_end->m_datetime;
icaltimezone_convert_time ( &convertedtime, currenttimezone, timezone );
if( strcmp( tzid, "/Mozilla.org/BasicTimezones/GMT" )==0 ) {
convertedtime.is_utc = true;
prop = icalproperty_new_dtend( convertedtime );
} else {
prop = icalproperty_new_dtend( convertedtime );
icalparameter *tmppar = icalparameter_new_tzid( tzid );
icalproperty_add_parameter( prop, tmppar );
if( !starttzid || strcmp( starttzid, tzid ) != 0 )
icalcomponent_add_component( newcalendar, icalcomponent_new_clone( icaltimezone_get_component ( timezone ) ) );
}
nsMemory::Free( tzid );
} else
prop = icalproperty_new_dtend( m_end->m_datetime );
icalcomponent_add_property( vevent, prop );
}
icalcomponent_add_property( vevent, prop );
}
if( starttzid )
nsMemory::Free( starttzid );