Applied attachment #161704 from bug 262620:GetAllEvents() is slow

(fixed indents, added missing {}, and added a break for speed)
Applied attachment #162865 and attachment#162881 from bug 265457:
GetEventsForRange is inefficient
(fixed indents and fixed incorrect variable)
Also removed obsolete EventList class.
This commit is contained in:
mostafah%oeone.com 2004-10-28 15:18:12 +00:00
Родитель 20d9c33ab6
Коммит 8ab7eaf00c
3 изменённых файлов: 236 добавлений и 339 удалений

Просмотреть файл

@ -832,20 +832,18 @@ oeICalContainerImpl::GetNextNEvents( PRTime datems, PRInt32 maxcount, nsISimpleE
nsCOMPtr<oeIICal> tmpcalendar; nsCOMPtr<oeIICal> tmpcalendar;
m_calendarArray->GetElementAt( i, getter_AddRefs(tmpcalendar) ); m_calendarArray->GetElementAt( i, getter_AddRefs(tmpcalendar) );
oeICalImpl *calendar = (oeICalImpl *)(&tmpcalendar); oeICalImpl *calendar = (oeICalImpl *)(&tmpcalendar);
EventList *tmplistptr = calendar->GetEventList(); nsVoidArray *tmplistptr = calendar->GetEventList();
while( tmplistptr && count<maxcount ) { oeIICalEvent *tmpevent;
if( tmplistptr->event ) { for ( PRInt32 j = 0 ; (count < maxcount) && (j < tmplistptr->Count()); ++j) {
bool isbeginning,isallday; bool isbeginning,isallday;
oeIICalEvent* tmpevent = tmplistptr->event; tmpevent = NS_STATIC_CAST(oeIICalEvent*, tmplistptr->ElementAt(j));
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning ); icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning );
isallday = next.is_date; isallday = next.is_date;
next.is_date = false; next.is_date = false;
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) { if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning ); ((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning );
count++; count++;
}
} }
tmplistptr = tmplistptr->next;
} }
} }
checkdate = nextcheckdate; checkdate = nextcheckdate;

Просмотреть файл

@ -389,7 +389,7 @@ oeICalImpl::~oeICalImpl()
*/ */
NS_IMPL_ISUPPORTS1(oeICalImpl, oeIICal) NS_IMPL_ISUPPORTS1(oeICalImpl, oeIICal)
EventList *oeICalImpl::GetEventList() nsVoidArray *oeICalImpl::GetEventList()
{ {
return &m_eventlist; return &m_eventlist;
} }
@ -803,7 +803,7 @@ oeICalImpl::SetServer( const char *str ) {
return rv; return rv;
} }
if( icalevent->ParseIcalComponent( vevent ) ) { if( icalevent->ParseIcalComponent( vevent ) ) {
m_eventlist.Add( icalevent ); m_eventlist.AppendElement( icalevent );
icalevent->SetParent( this ); icalevent->SetParent( this );
} else { } else {
icalevent->Release(); icalevent->Release();
@ -1022,7 +1022,7 @@ NS_IMETHODIMP oeICalImpl::AddEvent(oeIICalEvent *icalevent,char **retid)
icalfileset_free( stream ); icalfileset_free( stream );
icalevent->AddRef(); icalevent->AddRef();
m_eventlist.Add( icalevent ); m_eventlist.AppendElement( icalevent );
((oeICalEventImpl *)icalevent)->SetParent( this ); ((oeICalEventImpl *)icalevent)->SetParent( this );
PRUint32 observercount; PRUint32 observercount;
@ -1187,11 +1187,18 @@ NS_IMETHODIMP oeICalImpl::FetchEvent( const char *id, oeIICalEvent **ev)
return NS_OK; return NS_OK;
} }
oeIICalEvent* event = m_eventlist.GetEventById( id ); *ev = nsnull; //initialize to null
if( event != nsnull ) {
event->AddRef(); oeIICalEvent *event;
for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
event = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
// XXX Evil cast
if (event && ((oeICalEventImpl *)event)->matchId(id)) {
*ev = event;
NS_ADDREF(*ev);
break;
}
} }
*ev = event;
return NS_OK; return NS_OK;
} }
@ -1269,7 +1276,7 @@ oeICalImpl::DeleteEvent( const char *id )
oeIICalEvent *icalevent; oeIICalEvent *icalevent;
FetchEvent( id , &icalevent ); FetchEvent( id , &icalevent );
m_eventlist.Remove( id ); m_eventlist.RemoveElement(icalevent);
PRUint32 observercount; PRUint32 observercount;
m_observerlist->Count(&observercount); m_observerlist->Count(&observercount);
@ -1291,6 +1298,31 @@ oeICalImpl::DeleteEvent( const char *id )
return NS_OK; return NS_OK;
} }
/**
* recurCompareFunc
*
* helper for GetAllEvents, compares two events by either the next recurrance,
* or the previous if no next
*/
int
recurCompareFunc(const void* aElement1, const void* aElement2, void* aData)
{
oeICalEventImpl* event1 = (oeICalEventImpl *)aElement1;
oeICalEventImpl* event2 = (oeICalEventImpl *)aElement2;
icaltimetype* now = (icaltimetype *)aData;
icaltimetype time1 = event1->GetNextRecurrence(*now, nsnull);
if (icaltime_is_null_time(time1)) {
time1 = event1->GetPreviousOccurrence(*now);
}
icaltimetype time2 = event2->GetNextRecurrence(*now, nsnull);
if (icaltime_is_null_time(time2)) {
time2 = event2->GetPreviousOccurrence(*now);
}
return icaltime_compare(time1, time2);
}
/** /**
* *
* GetAllEvents * GetAllEvents
@ -1302,7 +1334,6 @@ oeICalImpl::DeleteEvent( const char *id )
* -----(Last occurence of Event1)---(Last occurence of Event2)----(Now)----(Next occurence of Event3)----> * -----(Last occurence of Event1)---(Last occurence of Event2)----(Now)----(Next occurence of Event3)---->
* (Note that Event1 and Event2 will not recur in the future.) * (Note that Event1 and Event2 will not recur in the future.)
*/ */
NS_IMETHODIMP NS_IMETHODIMP
oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList ) oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
{ {
@ -1315,21 +1346,8 @@ oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
if (!eventEnum) if (!eventEnum)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
//Create an array to temporarily store the events in nsVoidArray eventlist;
//Events added to the enumerator will be removed from this array eventlist = m_eventlist;
nsCOMPtr<nsISupportsArray> eventArray;
NS_NewISupportsArray(getter_AddRefs(eventArray));
if (eventArray == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
//Fill in the array
EventList *tmplistptr = &m_eventlist;
while( tmplistptr ) {
if( tmplistptr->event ) {
eventArray->AppendElement( tmplistptr->event );
}
tmplistptr = tmplistptr->next;
}
//Calculate the present time in milliseconds //Calculate the present time in milliseconds
PRTime nowinms = PR_Now(); PRTime nowinms = PR_Now();
@ -1342,85 +1360,14 @@ oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
//use Now-1 so we ensure we consider Now in the calculation //use Now-1 so we ensure we consider Now in the calculation
icaltime_adjust( &now, 0, 0, 0, -1 ); icaltime_adjust( &now, 0, 0, 0, -1 );
PRUint32 num; // Sort the eventlist
oeIICalEvent* oldestEvent; eventlist.Sort(recurCompareFunc, &now);
//This do-while loop finds the last occurences of events that don't recur in the future PRUint32 num2;
//and adds them to the enumerator starting with the oldest occuring event num2 = eventlist.Count();
do { for (PRUint32 j = 0; j < num2; ++j) {
icaltimetype oldest; eventEnum->AddEvent((oeICalEventImpl *)(eventlist[j]));
eventArray->Count( &num ); }
int index_of_oldest=0;
oldestEvent=nsnull;
//This loop finds the oldest between the last instances of events in the passed
//that don't have a recurrence in the future.
for ( unsigned int i=0; i<num; i++ ) {
nsCOMPtr<oeIICalEvent> tmpcomp;
eventArray->GetElementAt( i, getter_AddRefs( tmpcomp ) );
oeIICalEvent* tmpevent = tmpcomp;
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( now, nsnull );
if( !icaltime_is_null_time( next ) )
continue;
icaltimetype previous = ((oeICalEventImpl *)tmpevent)->GetPreviousOccurrence( checkdate );
if( !icaltime_is_null_time( previous ) && ( !oldestEvent || (icaltime_compare( oldest, previous ) > 0) ) ) {
oldest = previous;
index_of_oldest = i;
oldestEvent = tmpevent;
}
}
//The oldest event is added to the enum and removed from the array
//so the loop can continue
if( oldestEvent ) {
eventEnum->AddEvent( oldestEvent );
eventArray->RemoveElementAt( index_of_oldest );
}
} while ( oldestEvent );
//start with Now
checkdate = ConvertFromPrtime( nowinms );
oeIICalEvent* soonestEvent;
//This do-while loop finds the next occurences of events
//and adds them to the enumerator starting with the soonest occuring event
do {
int index_of_soonest=0;
icaltimetype soonest;
eventArray->Count( &num );
soonestEvent=nsnull;
//start checking from checkdate-1 which ensures we consider
//events happening right on checkdate as well
icaltime_adjust( &checkdate, 0, 0, 0, -1 );
for ( unsigned int i=0; i<num; i++ ) {
nsCOMPtr<oeIICalEvent> tmpcomp;
eventArray->GetElementAt( i, getter_AddRefs( tmpcomp ) );
oeIICalEvent* tmpevent = tmpcomp;
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, nsnull );
next.is_date = false;
if( !icaltime_is_null_time( next ) && ( !soonestEvent || (icaltime_compare( soonest, next ) > 0) ) ) {
soonest = next;
index_of_soonest = i;
soonestEvent = tmpevent;
}
}
if( soonestEvent ) {
eventEnum->AddEvent( soonestEvent );
eventArray->RemoveElementAt( index_of_soonest );
//continue checking from soonest instead of Now
checkdate = soonest;
}
} while ( soonestEvent );
#ifdef ICAL_DEBUG
//There shouldn't be any events in the array when we get here
eventArray->Count( &num );
if( num )
printf( "oeICalImpl::GetAllEvents - WARNING: Not all events were processed\n" );
#endif
*resultList = eventEnum; *resultList = eventEnum;
// bump ref count // bump ref count
@ -1505,8 +1452,28 @@ oeICalImpl::GetEventsForDay( PRTime datems, nsISimpleEnumerator **eventlist ) {
return GetEventsForRange(checkdateinms ,checkenddateinms, eventlist ); return GetEventsForRange(checkdateinms ,checkenddateinms, eventlist );
} }
class eventOccurence {
public:
PRTime start;
nsCOMPtr<oeIICalEvent> event;
bool isbeginning;
bool isallday;
};
int
occurCompareFunc(const void* aElement1, const void* aElement2, void* aData)
{
eventOccurence* occur1 = (eventOccurence *)aElement1;
eventOccurence* occur2 = (eventOccurence *)aElement2;
return (occur1->start - occur2->start);
}
NS_IMETHODIMP NS_IMETHODIMP
oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **eventlist ) { oeICalImpl::GetEventsForRange(PRTime aBeginDate, PRTime aEndDate, nsISimpleEnumerator **aResult)
{
#ifdef ICAL_DEBUG_ALL #ifdef ICAL_DEBUG_ALL
printf( "oeICalImpl::GetEventsForRange()\n" ); printf( "oeICalImpl::GetEventsForRange()\n" );
#endif #endif
@ -1514,113 +1481,116 @@ oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, ns
oeEventEnumerator *eventEnum = new oeEventEnumerator(); oeEventEnumerator *eventEnum = new oeEventEnumerator();
if (!eventEnum) if (!eventEnum)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
*eventlist = eventEnum; *aResult = eventEnum;
NS_ADDREF(*eventlist); NS_ADDREF(*aResult);
struct icaltimetype checkdate = ConvertFromPrtime( checkdateinms ); struct icaltimetype checkdate = ConvertFromPrtime(aBeginDate);
icaltime_adjust( &checkdate, 0, 0, 0, -1 ); icaltime_adjust(&checkdate, 0, 0, 0, -1);
struct icaltimetype checkenddate = ConvertFromPrtime(aEndDate);
struct icaltimetype checkenddate = ConvertFromPrtime( checkenddateinms );
icaltimetype nextcheckdate; nsVoidArray occurList;
do { oeIICalEvent *tmpevent;
nextcheckdate = GetNextEvent( checkdate ); for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
if( icaltime_compare( nextcheckdate, checkenddate ) >= 0 ) tmpevent = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
break; struct icaltimetype check = checkdate;
if( !icaltime_is_null_time( nextcheckdate )) { bool isbeginning;
EventList *tmplistptr = &m_eventlist; check = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence(check, &isbeginning);
while( tmplistptr ) { while (!icaltime_is_null_time(check) && (icaltime_compare(check, checkenddate) < 0)) {
if( tmplistptr->event ) { eventOccurence *occur = new eventOccurence();
oeIICalEvent* tmpevent = tmplistptr->event; if (!occur) {
bool isbeginning; // I whish i knew a better way to do this cleanup stuff..
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning ); for (PRInt32 i = 0 ; i < occurList.Count(); ++i) {
bool isallday = next.is_date; eventOccurence *occur = NS_STATIC_CAST(eventOccurence*, occurList[i]);
next.is_date = false; delete occur;
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning );
}
} }
tmplistptr = tmplistptr->next; return NS_ERROR_OUT_OF_MEMORY;
} }
checkdate = nextcheckdate; occur->start = ConvertToPrtime(check);
occur->event = tmpevent;
occur->isbeginning = isbeginning;
occur->isallday = check.is_date;
occurList.AppendElement(occur);
check = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence(check, &isbeginning);
} }
} while ( !icaltime_is_null_time( nextcheckdate ) ); }
occurList.Sort(occurCompareFunc, nsnull);
for (PRInt32 i = 0 ; i < occurList.Count(); ++i) {
eventOccurence *occur = NS_STATIC_CAST(eventOccurence*, occurList[i]);
tmpevent = NS_STATIC_CAST(oeIICalEvent*, occur->event);
((oeICalEventImpl *)tmpevent)->
ChopAndAddEventToEnum(ConvertFromPrtime(occur->start), aResult,
occur->isallday, occur->isbeginning );
delete occur;
}
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
oeICalImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **eventlist ) { oeICalImpl::GetFirstEventsForRange(PRTime aBeginDate, PRTime aEndDate, nsISimpleEnumerator **aResult)
{
#ifdef ICAL_DEBUG #ifdef ICAL_DEBUG
printf( "oeICalImpl::GetFirstEventsForRange()\n" ); printf( "oeICalImpl::GetFirstEventsForRange()\n" );
#endif #endif
oeEventEnumerator *eventEnum = new oeEventEnumerator(); oeEventEnumerator *eventEnum = new oeEventEnumerator();
if (!eventEnum) if (!eventEnum)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
*eventlist = eventEnum; *aResult = eventEnum;
NS_ADDREF(*eventlist); NS_ADDREF(*aResult);
nsCOMPtr<nsISupportsArray> eventArray; nsCOMPtr<nsISupportsArray> eventArray;
NS_NewISupportsArray(getter_AddRefs(eventArray)); NS_NewISupportsArray(getter_AddRefs(eventArray));
if (eventArray == nsnull) if (eventArray == nsnull)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
EventList *tmplistptr = &m_eventlist; oeIICalEvent *event;
while( tmplistptr ) { for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
if( tmplistptr->event ) { event = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
eventArray->AppendElement( tmplistptr->event ); eventArray->AppendElement(event);
}
tmplistptr = tmplistptr->next;
} }
struct icaltimetype checkdate = ConvertFromPrtime( checkdateinms ); struct icaltimetype checkdate = ConvertFromPrtime(aBeginDate);
icaltime_adjust( &checkdate, 0, 0, 0, -1 ); icaltime_adjust(&checkdate, 0, 0, 0, -1);
struct icaltimetype checkenddate = ConvertFromPrtime( checkenddateinms ); struct icaltimetype checkenddate = ConvertFromPrtime(aEndDate);
icaltimetype nextcheckdate; nsVoidArray occurList;
do { oeIICalEvent *tmpevent;
PRUint32 num; for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
icaltimetype soonest = icaltime_null_time(); tmpevent = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
eventArray->Count( &num ); struct icaltimetype check = checkdate;
for ( unsigned int i=0; i<num; i++ ) { bool isbeginning;
nsCOMPtr<oeIICalEvent> tmpcomp; check = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence(check, &isbeginning);
eventArray->GetElementAt( i, getter_AddRefs( tmpcomp ) ); if (!icaltime_is_null_time(check) && (icaltime_compare(check, checkenddate) < 0)) {
oeIICalEvent* tmpevent = tmpcomp; eventOccurence *occur = new eventOccurence();
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, nsnull ); if (!occur) {
next.is_date = false; // I whish i knew a better way to do this cleanup stuff..
if( !icaltime_is_null_time( next ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, next ) > 0) ) ) { for (PRInt32 j = 0 ; i < occurList.Count(); ++j) {
soonest = next; eventOccurence *occur = NS_STATIC_CAST(eventOccurence*, occurList[j]);
} delete occur;
}
if ( icaltime_compare( soonest, checkenddate ) > 0 ) {
nextcheckdate = icaltime_null_time();
} else
nextcheckdate = soonest;
if( !icaltime_is_null_time( nextcheckdate )) {
for ( unsigned int i=0; i<num; i++ ) {
nsCOMPtr<oeIICalEvent> tmpcomp;
eventArray->GetElementAt( i, getter_AddRefs( tmpcomp ) );
oeIICalEvent* tmpevent = tmpcomp;
bool isbeginning;
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning );
bool isallday = next.is_date;
next.is_date = false;
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning );
eventArray->RemoveElementAt( i );
icaltime_adjust( &nextcheckdate, 0, 0, 0, -1 );
break;
} }
return NS_ERROR_OUT_OF_MEMORY;
} }
checkdate = nextcheckdate; occur->start = ConvertToPrtime(check);
occur->event = tmpevent;
occur->isbeginning = isbeginning;
occur->isallday = check.is_date;
occurList.AppendElement(occur);
check = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence(check, &isbeginning);
} }
} while ( !icaltime_is_null_time( nextcheckdate ) ); }
occurList.Sort(occurCompareFunc, nsnull);
for (PRInt32 i = 0 ; i < occurList.Count(); ++i) {
eventOccurence *occur = NS_STATIC_CAST(eventOccurence*, occurList[i]);
tmpevent = NS_STATIC_CAST(oeIICalEvent*, occur->event);
((oeICalEventImpl *)tmpevent)->
ChopAndAddEventToEnum(ConvertFromPrtime(occur->start), aResult,
occur->isallday, occur->isbeginning );
delete occur;
}
eventArray->Clear();
return NS_OK; return NS_OK;
} }
@ -1630,17 +1600,14 @@ icaltimetype oeICalImpl::GetNextEvent( icaltimetype starting ) {
#endif #endif
icaltimetype soonest = icaltime_null_time(); icaltimetype soonest = icaltime_null_time();
EventList *tmplistptr = &m_eventlist; oeIICalEvent *tmpevent;
while( tmplistptr ) { for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
if( tmplistptr->event ) { tmpevent = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
oeIICalEvent* tmpevent = tmplistptr->event; icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( starting, nsnull );
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( starting, nsnull ); next.is_date = false;
next.is_date = false; if( !icaltime_is_null_time( next ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, next ) > 0) ) ) {
if( !icaltime_is_null_time( next ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, next ) > 0) ) ) { soonest = next;
soonest = next;
}
} }
tmplistptr = tmplistptr->next;
} }
return soonest; return soonest;
} }
@ -1665,20 +1632,17 @@ oeICalImpl::GetNextNEvents( PRTime datems, PRInt32 maxcount, nsISimpleEnumerator
do { do {
nextcheckdate = GetNextEvent( checkdate ); nextcheckdate = GetNextEvent( checkdate );
if( !icaltime_is_null_time( nextcheckdate )) { if( !icaltime_is_null_time( nextcheckdate )) {
EventList *tmplistptr = &m_eventlist; oeIICalEvent *tmpevent;
while( tmplistptr && count<maxcount ) { for (PRInt32 i = 0 ; (count < maxcount) && (i < m_eventlist.Count()); ++i) {
if( tmplistptr->event ) { bool isbeginning,isallday;
bool isbeginning,isallday; tmpevent = NS_STATIC_CAST(oeIICalEvent*, m_eventlist[i]);
oeIICalEvent* tmpevent = tmplistptr->event; icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning );
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate, &isbeginning ); isallday = next.is_date;
isallday = next.is_date; next.is_date = false;
next.is_date = false; if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) { ((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning );
((oeICalEventImpl *)tmpevent)->ChopAndAddEventToEnum( nextcheckdate, eventlist, isallday, isbeginning ); count++;
count++;
}
} }
tmplistptr = tmplistptr->next;
} }
checkdate = nextcheckdate; checkdate = nextcheckdate;
} }
@ -1858,76 +1822,73 @@ void oeICalImpl::SetupAlarmManager() {
icaltimetype now = ConvertFromPrtime( todayinms ); icaltimetype now = ConvertFromPrtime( todayinms );
icaltimetype nextalarm = icaltime_null_time(); icaltimetype nextalarm = icaltime_null_time();
EventList *tmplistptr = &m_eventlist;
int processmissed = -1; // -1 means the value has not been read from the preferences. 0 or 1 are valid values. int processmissed = -1; // -1 means the value has not been read from the preferences. 0 or 1 are valid values.
while( tmplistptr ) { oeICalEventImpl *event;
oeICalEventImpl *event = (oeICalEventImpl *)(tmplistptr->event); for (PRInt32 i = 0 ; i < m_eventlist.Count(); ++i) {
if( event ) { event = NS_STATIC_CAST(oeICalEventImpl*, m_eventlist[i]);
icaltimetype begin=icaltime_null_time(); icaltimetype begin=icaltime_null_time();
begin.year = 1970; begin.month=1; begin.day=1; begin.year = 1970; begin.month=1; begin.day=1;
icaltimetype alarmtime = begin; icaltimetype alarmtime = begin;
do { do {
alarmtime = event->GetNextAlarmTime( alarmtime ); alarmtime = event->GetNextAlarmTime( alarmtime );
if( icaltime_is_null_time( alarmtime ) ) if( icaltime_is_null_time( alarmtime ) )
break; break;
if( icaltime_compare( alarmtime, now ) <= 0 ) { if( icaltime_compare( alarmtime, now ) <= 0 ) {
#ifdef ICAL_DEBUG #ifdef ICAL_DEBUG
printf( "ALARM WENT OFF: %s\n", icaltime_as_ical_string( alarmtime ) ); printf( "ALARM WENT OFF: %s\n", icaltime_as_ical_string( alarmtime ) );
#endif #endif
nsresult rv; nsresult rv;
if( processmissed == -1 ) { if( processmissed == -1 ) {
nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
if ( NS_SUCCEEDED(rv) && prefBranch ) { if ( NS_SUCCEEDED(rv) && prefBranch ) {
rv = prefBranch->GetBoolPref("calendar.alarms.showmissed", &processmissed); rv = prefBranch->GetBoolPref("calendar.alarms.showmissed", &processmissed);
} else { } else {
processmissed = true; //if anything goes wrong just consider the default setting processmissed = true; //if anything goes wrong just consider the default setting
}
} }
}
if( !processmissed ) { if( !processmissed ) {
time_t timediff = icaltime_as_timet( now ) - icaltime_as_timet( alarmtime ); time_t timediff = icaltime_as_timet( now ) - icaltime_as_timet( alarmtime );
if( timediff > 30 ) //if alarmtime is older than 30 seconds it won't be processed. if( timediff > 30 ) //if alarmtime is older than 30 seconds it won't be processed.
continue; continue;
} }
UpdateCalendarIcon( true ); UpdateCalendarIcon( true );
oeIICalEventDisplay* eventDisplay; oeIICalEventDisplay* eventDisplay;
rv = NS_NewICalEventDisplay( event, &eventDisplay ); rv = NS_NewICalEventDisplay( event, &eventDisplay );
#ifdef ICAL_DEBUG
if( NS_FAILED( rv ) ) {
printf( "oeICalImpl::SetupAlarmManager() : WARNING Cannot create oeIICalEventDisplay instance: %x\n", rv );
}
#endif
icaltimetype eventtime = event->CalculateEventTime( alarmtime );
eventDisplay->SetDisplayDate( ConvertToPrtime( eventtime ) );
PRUint32 observercount;
m_observerlist->Count( &observercount );
for( unsigned int i=0; i<observercount; i++ ) {
nsCOMPtr<oeIICalObserver>observer;
m_observerlist->QueryElementAt( i, NS_GET_IID(oeIICalObserver), getter_AddRefs(observer));
rv = observer->OnAlarm( eventDisplay );
#ifdef ICAL_DEBUG #ifdef ICAL_DEBUG
if( NS_FAILED( rv ) ) { if( NS_FAILED( rv ) ) {
printf( "oeICalImpl::SetupAlarmManager() : WARNING Cannot create oeIICalEventDisplay instance: %x\n", rv ); printf( "oeICalImpl::SetupAlarmManager() : WARNING Call to observer's onAlarm() unsuccessful: %x\n", rv );
} }
#endif #endif
icaltimetype eventtime = event->CalculateEventTime( alarmtime );
eventDisplay->SetDisplayDate( ConvertToPrtime( eventtime ) );
PRUint32 observercount;
m_observerlist->Count( &observercount );
for( unsigned int i=0; i<observercount; i++ ) {
nsCOMPtr<oeIICalObserver>observer;
m_observerlist->QueryElementAt( i, NS_GET_IID(oeIICalObserver), getter_AddRefs(observer));
rv = observer->OnAlarm( eventDisplay );
#ifdef ICAL_DEBUG
if( NS_FAILED( rv ) ) {
printf( "oeICalImpl::SetupAlarmManager() : WARNING Call to observer's onAlarm() unsuccessful: %x\n", rv );
}
#endif
}
NS_RELEASE( eventDisplay );
} }
else { NS_RELEASE( eventDisplay );
if( icaltime_is_null_time( nextalarm ) ) }
nextalarm = alarmtime; else {
else if( icaltime_compare( nextalarm, alarmtime ) > 0 ) if( icaltime_is_null_time( nextalarm ) )
nextalarm = alarmtime; nextalarm = alarmtime;
break; else if( icaltime_compare( nextalarm, alarmtime ) > 0 )
} nextalarm = alarmtime;
} while ( 1 ); break;
} }
tmplistptr = tmplistptr->next; } while ( 1 );
} }
TodoList *tmptodolistptr = &m_todolist; TodoList *tmptodolistptr = &m_todolist;

Просмотреть файл

@ -44,6 +44,7 @@
#include "nsITimer.h" #include "nsITimer.h"
#include "oeICalEventImpl.h" #include "oeICalEventImpl.h"
#include "oeICalTodoImpl.h" #include "oeICalTodoImpl.h"
#include "nsVoidArray.h"
#define OE_ICAL_CID \ #define OE_ICAL_CID \
{ 0x0a8c5de7, 0x0d19, 0x4b95, { 0x82, 0xf4, 0xe0, 0xaf, 0x92, 0x45, 0x32, 0x27 } } { 0x0a8c5de7, 0x0d19, 0x4b95, { 0x82, 0xf4, 0xe0, 0xaf, 0x92, 0x45, 0x32, 0x27 } }
@ -54,69 +55,6 @@ extern "C" {
#include "ical.h" #include "ical.h"
} }
class EventList {
public:
oeIICalEvent* event;
EventList* next;
EventList() {
event = nsnull;
next = nsnull;
}
~EventList() {
if( event )
event->Release();
if( next )
delete next;
}
void Add( oeIICalEvent* e) {
if( !event ) {
event = e;
} else {
if( !next ) {
next = new EventList();
}
next->Add( e );
}
}
oeIICalEvent* GetEventById( const char *id ) {
if( !event )
return nsnull;
if( ((oeICalEventImpl *)event)->matchId( id ) )
return event;
if( next )
return next->GetEventById( id );
return nsnull;
}
void Remove( const char *id ) {
if( !event )
return;
if( ((oeICalEventImpl *)event)->matchId( id ) ) {
event->Release();
if( next ) {
event = next->event;
EventList *tmp = next;
next = next->next;
tmp->next = nsnull;
tmp->event = nsnull;
delete tmp;
} else {
event = nsnull;
}
} else {
if( next )
next->Remove( id );
}
}
/* int Count() {
int result=0;
if( !event )
return 0;
result++;
if( next )
result += next->Count();
return result;
}*/
};
class TodoList { class TodoList {
public: public:
@ -241,13 +179,13 @@ class oeICalImpl : public oeIICal
NS_DECL_OEIICAL NS_DECL_OEIICAL
void SetupAlarmManager(); void SetupAlarmManager();
icaltimetype GetNextEvent( icaltimetype starting ); icaltimetype GetNextEvent( icaltimetype starting );
EventList *GetEventList(); nsVoidArray *GetEventList();
private: private:
nsCOMPtr<nsISupportsArray> m_observerlist; nsCOMPtr<nsISupportsArray> m_observerlist;
nsCOMPtr<nsISupportsArray> m_todoobserverlist; nsCOMPtr<nsISupportsArray> m_todoobserverlist;
bool m_batchMode; bool m_batchMode;
bool m_suppressAlarms; bool m_suppressAlarms;
EventList m_eventlist; nsVoidArray m_eventlist;
TodoList m_todolist; TodoList m_todolist;
nsITimer *m_alarmtimer; nsITimer *m_alarmtimer;
char serveraddr[200]; char serveraddr[200];