зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
20d9c33ab6
Коммит
8ab7eaf00c
|
@ -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];
|
||||||
|
|
Загрузка…
Ссылка в новой задаче