From 2dc3bf0cb0b38327e221324dfcddde11d0e15975 Mon Sep 17 00:00:00 2001 From: "mvl%exedo.nl" Date: Thu, 22 Jul 2004 20:07:03 +0000 Subject: [PATCH] Make less assumptions about calendar types in oeICalContainer. bug 252603, r=mostafah git-svn-id: svn://10.0.0.236/trunk@159684 18797224-902f-48f8-a5cc-f745e15eee43 --- .../libxpical/oeICalContainerImpl.cpp | 148 ++++++++++++------ mozilla/calendar/libxpical/oeICalImpl.cpp | 52 +++--- 2 files changed, 122 insertions(+), 78 deletions(-) diff --git a/mozilla/calendar/libxpical/oeICalContainerImpl.cpp b/mozilla/calendar/libxpical/oeICalContainerImpl.cpp index d674fc8104d..a77a5edcbe4 100644 --- a/mozilla/calendar/libxpical/oeICalContainerImpl.cpp +++ b/mozilla/calendar/libxpical/oeICalContainerImpl.cpp @@ -42,7 +42,51 @@ commands to individual calendars and a collector of calculated data for global q #include "oeICalContainerImpl.h" #include "nsISupportsArray.h" #include "nsComponentManagerUtils.h" - +#include "nsCOMArray.h" +#include "nsISimpleEnumerator.h" + +/** + * This enumerator collects items from an array of other enumerators, and + * returns it as a single one. + */ +class oeCollectedEventEnumerator : public nsISimpleEnumerator +{ + public: + NS_DECL_ISUPPORTS + + oeCollectedEventEnumerator(nsCOMArray& aListOfEnums) + : mListOfEnums(aListOfEnums), + mEnumIndex(0) + { + } + + NS_IMETHOD HasMoreElements(PRBool *aResult) + { + *aResult = PR_FALSE; + mListOfEnums[mEnumIndex]->HasMoreElements(aResult); + while (!*aResult && (++mEnumIndex < mListOfEnums.Count())) { + mListOfEnums[mEnumIndex]->HasMoreElements(aResult); + } + return NS_OK; + } + + NS_IMETHOD GetNext(nsISupports **aResult) + { + return mListOfEnums[mEnumIndex]->GetNext(aResult); + } + + virtual ~oeCollectedEventEnumerator() + { + } + + protected: + nsCOMArray mListOfEnums; + PRInt32 mEnumIndex; +}; + +NS_IMPL_ISUPPORTS1(oeCollectedEventEnumerator, nsISimpleEnumerator) + + icaltimetype ConvertFromPrtime( PRTime indate ); PRTime ConvertToPrtime ( icaltimetype indate ); extern "C" { @@ -530,29 +574,31 @@ oeICalContainerImpl::DeleteEvent( const char *id ) } NS_IMETHODIMP -oeICalContainerImpl::GetAllEvents(nsISimpleEnumerator **resultList ) +oeICalContainerImpl::GetAllEvents(nsISimpleEnumerator **eventlist ) { #ifdef ICAL_DEBUG printf( "oeICalContainerImpl::GetAllEvents()\n" ); #endif - oeEventEnumerator* eventEnum = new oeEventEnumerator(); - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)resultList); - PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetAllEvents( (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetAllEvents( getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } @@ -561,24 +607,26 @@ oeICalContainerImpl::GetEventsForMonth( PRTime datems, nsISimpleEnumerator **eve #ifdef ICAL_DEBUG printf( "oeICalContainerImpl::GetEventsForMonth()\n" ); #endif - nsCOMPtr eventEnum = new oeEventEnumerator( ); - - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetEventsForMonth( datems, (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetEventsForMonth( datems, getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } @@ -587,23 +635,26 @@ oeICalContainerImpl::GetEventsForWeek( PRTime datems, nsISimpleEnumerator **even #ifdef ICAL_DEBUG printf( "oeICalContainerImpl::GetEventsForWeek()\n" ); #endif - nsCOMPtr eventEnum = new oeEventEnumerator( ); - - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetEventsForWeek( datems, (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetEventsForWeek( datems, getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } @@ -613,23 +664,25 @@ oeICalContainerImpl::GetEventsForDay( PRTime datems, nsISimpleEnumerator **event printf( "oeICalContainerImpl::GetEventsForDay()\n" ); #endif - nsCOMPtr eventEnum = new oeEventEnumerator( ); - - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); - PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetEventsForDay( datems, (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetEventsForDay( datems, getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } @@ -639,24 +692,25 @@ oeICalContainerImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddat printf( "oeICalContainerImpl::GetEventsForRange()\n" ); #endif - nsCOMPtr eventEnum = new oeEventEnumerator( ); - - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); - PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetEventsForRange( checkdateinms, checkenddateinms, (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetEventsForRange( checkdateinms, checkenddateinms, getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } @@ -666,24 +720,26 @@ oeICalContainerImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checke #ifdef ICAL_DEBUG_ALL printf( "oeICalContainerImpl::GetFirstEventsForRange()\n" ); #endif - oeEventEnumerator* eventEnum = new oeEventEnumerator(); - - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); PRUint32 num; unsigned int i; + nsCOMArray listOfEnums; m_calendarArray->Count( &num ); for( i=0; i calendar; m_calendarArray->GetElementAt( i, getter_AddRefs(calendar) ); - calendar->GetFirstEventsForRange( checkdateinms, checkenddateinms, (nsISimpleEnumerator **)&eventEnum ); + nsCOMPtr eventEnum; + calendar->GetFirstEventsForRange( checkdateinms, checkenddateinms, getter_AddRefs(eventEnum) ); + listOfEnums.AppendObject(eventEnum); } + *eventlist = new oeCollectedEventEnumerator(listOfEnums); + if (!*eventlist) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*eventlist); return NS_OK; } diff --git a/mozilla/calendar/libxpical/oeICalImpl.cpp b/mozilla/calendar/libxpical/oeICalImpl.cpp index 303a9a02f33..22e20378751 100644 --- a/mozilla/calendar/libxpical/oeICalImpl.cpp +++ b/mozilla/calendar/libxpical/oeICalImpl.cpp @@ -1282,14 +1282,9 @@ oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList ) printf( "oeICalImpl::GetAllEvents()\n" ); #endif - nsCOMPtr eventEnum; - if( !*resultList ) { - eventEnum = new oeEventEnumerator(); - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)resultList); - } else - eventEnum = (oeEventEnumerator *)*resultList; + oeEventEnumerator *eventEnum = new oeEventEnumerator(); + if (!eventEnum) + return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr eventArray; NS_NewISupportsArray(getter_AddRefs(eventArray)); @@ -1397,6 +1392,8 @@ oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList ) // bump ref count // return eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)resultList); + *resultList = eventEnum; + NS_ADDREF(*resultList); return NS_OK; } @@ -1483,14 +1480,11 @@ oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, ns printf( "oeICalImpl::GetEventsForRange()\n" ); #endif - nsCOMPtr eventEnum; - if( !*eventlist ) { - eventEnum = new oeEventEnumerator(); - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); - } else - eventEnum = (oeEventEnumerator *)*eventlist; + oeEventEnumerator *eventEnum = new oeEventEnumerator(); + if (!eventEnum) + return NS_ERROR_OUT_OF_MEMORY; + *eventlist = eventEnum; + NS_ADDREF(*eventlist); struct icaltimetype checkdate = ConvertFromPrtime( checkdateinms ); icaltime_adjust( &checkdate, 0, 0, 0, -1 ); @@ -1529,14 +1523,11 @@ oeICalImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checkenddateinm #ifdef ICAL_DEBUG printf( "oeICalImpl::GetFirstEventsForRange()\n" ); #endif - nsCOMPtr eventEnum; - if( !*eventlist ) { - eventEnum = new oeEventEnumerator(); - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); - } else - eventEnum = (oeEventEnumerator *)*eventlist; + oeEventEnumerator *eventEnum = new oeEventEnumerator(); + if (!eventEnum) + return NS_ERROR_OUT_OF_MEMORY; + *eventlist = eventEnum; + NS_ADDREF(*eventlist); nsCOMPtr eventArray; NS_NewISupportsArray(getter_AddRefs(eventArray)); @@ -1629,14 +1620,11 @@ oeICalImpl::GetNextNEvents( PRTime datems, PRInt32 maxcount, nsISimpleEnumerator printf( "oeICalImpl::GetNextNEvents( %d )\n", maxcount ); #endif - nsCOMPtr eventEnum; - if( !*eventlist ) { - eventEnum = new oeEventEnumerator(); - if (!eventEnum) - return NS_ERROR_OUT_OF_MEMORY; - eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist); - } else - eventEnum = (oeEventEnumerator *)*eventlist; + oeEventEnumerator *eventEnum = new oeEventEnumerator(); + if (!eventEnum) + return NS_ERROR_OUT_OF_MEMORY; + *eventlist = eventEnum; + NS_ADDREF(*eventlist); struct icaltimetype checkdate = ConvertFromPrtime( datems ); icaltime_adjust( &checkdate, 0, 0, 0, -1 );