mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-24 11:27:49 +00:00
Adding new EventDisplay component. Fixing getEvents functions to return sorted-by-occurence events
This commit is contained in:
parent
a43cd20380
commit
fc2f16b790
@ -19,6 +19,7 @@
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Mostafa Hosseini <mostafah@oeone.com>
|
||||
* Gary Frederick <gary.frederick@jsoft.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@ -102,6 +103,8 @@ PRTime ConvertToPrtime ( icaltimetype indate ) {
|
||||
return result;
|
||||
}
|
||||
|
||||
int gEventCount = 0;
|
||||
int gEventDisplayCount = 0;
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// ICalEvent Factory
|
||||
@ -128,7 +131,7 @@ NS_NewICalEvent( oeIICalEvent** inst )
|
||||
oeICalEventImpl::oeICalEventImpl()
|
||||
{
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "oeICalEventImpl::oeICalEventImpl()\n" );
|
||||
printf( "oeICalEventImpl::oeICalEventImpl(): %d\n", ++gEventCount );
|
||||
#endif
|
||||
NS_INIT_ISUPPORTS();
|
||||
/* member initializers and constructor code */
|
||||
@ -170,7 +173,7 @@ oeICalEventImpl::oeICalEventImpl()
|
||||
oeICalEventImpl::~oeICalEventImpl()
|
||||
{
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "oeICalEventImpl::~oeICalEventImpl( %d )\n", mRefCnt );
|
||||
printf( "oeICalEventImpl::~oeICalEventImpl(): %d\n", --gEventCount );
|
||||
#endif
|
||||
/* destructor code */
|
||||
if( m_id )
|
||||
@ -848,6 +851,19 @@ icaltimetype oeICalEventImpl::GetNextRecurrence( icaltimetype begin ) {
|
||||
return result;
|
||||
}
|
||||
|
||||
icaltimetype oeICalEventImpl::GetPreviousOccurrence( icaltimetype beforethis ) {
|
||||
icaltimetype result = icaltime_null_time();
|
||||
PRTime beforethisinms = ConvertToPrtime( beforethis );
|
||||
PRTime resultinms;
|
||||
PRBool isvalid;
|
||||
GetPreviousOccurrence( beforethisinms ,&resultinms, &isvalid );
|
||||
if( !isvalid )
|
||||
return result;
|
||||
|
||||
result = ConvertFromPrtime( resultinms );
|
||||
return result;
|
||||
}
|
||||
|
||||
icaltimetype oeICalEventImpl::GetNextAlarmTime( icaltimetype begin ) {
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventImpl::GetNextAlarmTime()\n" );
|
||||
@ -1463,7 +1479,7 @@ bool oeICalEventImpl::ParseIcalComponent( icalcomponent *comp )
|
||||
}
|
||||
|
||||
#define ICALEVENT_VERSION "2.0"
|
||||
#define ICALEVENT_PRODID "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN" // ggf
|
||||
#define ICALEVENT_PRODID "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN"
|
||||
|
||||
icalcomponent* oeICalEventImpl::AsIcalComponent()
|
||||
{
|
||||
@ -1484,7 +1500,7 @@ icalcomponent* oeICalEventImpl::AsIcalComponent()
|
||||
icalproperty *prop = icalproperty_new_version( ICALEVENT_VERSION );
|
||||
icalcomponent_add_property( newcalendar, prop );
|
||||
|
||||
//prodid - ggf
|
||||
//prodid
|
||||
prop = icalproperty_new_prodid( ICALEVENT_PRODID );
|
||||
icalcomponent_add_property( newcalendar, prop );
|
||||
|
||||
@ -1774,3 +1790,107 @@ icalcomponent* oeICalEventImpl::AsIcalComponent()
|
||||
icalcomponent_add_component( newcalendar, vevent );
|
||||
return newcalendar;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
#include <nsIServiceManager.h>
|
||||
|
||||
NS_IMPL_ADDREF(oeICalEventDisplayImpl)
|
||||
NS_IMPL_RELEASE(oeICalEventDisplayImpl)
|
||||
//NS_IMPL_ISUPPORTS1(oeICalEventDisplayImpl, oeIICalEventDisplay)
|
||||
|
||||
nsresult
|
||||
NS_NewICalEventDisplay( oeIICalEvent* event, oeIICalEventDisplay** inst )
|
||||
{
|
||||
NS_PRECONDITION(inst != nsnull, "null ptr");
|
||||
if (! inst)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*inst = new oeICalEventDisplayImpl( event );
|
||||
if (! *inst)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
NS_ADDREF(*inst);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
oeICalEventDisplayImpl::oeICalEventDisplayImpl( oeIICalEvent* event )
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventDisplayImpl::oeICalEventDisplayImpl(): %d\n", ++gEventDisplayCount );
|
||||
#endif
|
||||
NS_INIT_ISUPPORTS();
|
||||
nsresult rv;
|
||||
if( event == nsnull ) {
|
||||
mEvent = do_CreateInstance(OE_ICALEVENTDISPLAY_CONTRACTID, &rv);
|
||||
} else {
|
||||
NS_ADDREF( event );
|
||||
mEvent = event;
|
||||
}
|
||||
|
||||
/* member initializers and constructor code */
|
||||
m_displaydate = icaltime_null_time();
|
||||
}
|
||||
|
||||
oeICalEventDisplayImpl::~oeICalEventDisplayImpl()
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventDisplayImpl::~oeICalEventDisplayImpl(): %d\n", --gEventDisplayCount );
|
||||
#endif
|
||||
/* destructor code */
|
||||
mEvent = nsnull;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
oeICalEventDisplayImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
{
|
||||
if (nsnull == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(nsISupports))) {
|
||||
*aInstancePtr = (void*)(oeIICalEventDisplay*)this;
|
||||
*aInstancePtr = (nsISupports*)*aInstancePtr;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(oeIICalEventDisplay))) {
|
||||
*aInstancePtr = (void*)(oeIICalEventDisplay*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(NS_GET_IID(oeIICalEvent))) {
|
||||
return mEvent->QueryInterface( aIID, aInstancePtr );
|
||||
}
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP oeICalEventDisplayImpl::GetDisplayDate( PRTime *aRetVal )
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventDisplayImpl::GetDisplayDate()\n" );
|
||||
#endif
|
||||
*aRetVal = ConvertToPrtime( m_displaydate );
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP oeICalEventDisplayImpl::SetDisplayDate( PRTime aNewVal )
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventDisplayImpl::SetDisplayDate()\n" );
|
||||
#endif
|
||||
m_displaydate = ConvertFromPrtime( aNewVal );
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP oeICalEventDisplayImpl::GetEvent( oeIICalEvent **ev )
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalEventDisplayImpl::GetEvent()\n" );
|
||||
#endif
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "WARNING: .event is no longer needed to access event fields\n" );
|
||||
#endif
|
||||
*ev = mEvent;
|
||||
NS_ADDREF(*ev);
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -86,6 +86,7 @@ public:
|
||||
icaltimetype GetNextAlarmTime( icaltimetype begin );
|
||||
bool matchId( const char *id );
|
||||
icaltimetype GetNextRecurrence( icaltimetype begin );
|
||||
icaltimetype GetPreviousOccurrence( icaltimetype beforethis );
|
||||
private:
|
||||
char *m_id;
|
||||
char *m_syncid;
|
||||
@ -117,4 +118,22 @@ private:
|
||||
bool IsExcepted( PRTime date );
|
||||
};
|
||||
|
||||
/*******************************************************************************************/
|
||||
#define OE_ICALEVENTDISPLAY_CONTRACTID "@mozilla.org/icaleventdisplay;1"
|
||||
|
||||
class oeICalEventDisplayImpl : public oeIICalEventDisplay
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_FORWARD_OEIICALEVENT(mEvent->)
|
||||
NS_DECL_OEIICALEVENTDISPLAY
|
||||
oeICalEventDisplayImpl( oeIICalEvent *event );
|
||||
virtual ~oeICalEventDisplayImpl();
|
||||
private:
|
||||
icaltimetype m_displaydate;
|
||||
nsCOMPtr<oeIICalEvent> mEvent;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "nsIURL.h"
|
||||
#include "nsNetCID.h"
|
||||
#include "nsEscape.h"
|
||||
#include "nsISupportsArray.h"
|
||||
|
||||
extern "C" {
|
||||
#include "icalss.h"
|
||||
@ -136,7 +137,7 @@ oeEventEnumerator::HasMoreElements(PRBool *result)
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
NS_IMETHODIMP
|
||||
oeEventEnumerator::GetNext(nsISupports **_retval)
|
||||
{
|
||||
@ -153,6 +154,24 @@ oeEventEnumerator::GetNext(nsISupports **_retval)
|
||||
++mCurrentIndex;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}*/
|
||||
NS_IMETHODIMP
|
||||
oeEventEnumerator::GetNext(nsISupports **_retval)
|
||||
{
|
||||
|
||||
if( mCurrentIndex >= mEventVector.size() )
|
||||
{
|
||||
*_retval = nsnull;
|
||||
}
|
||||
else
|
||||
{
|
||||
oeIICalEvent* event = mEventVector[ mCurrentIndex ];
|
||||
nsresult rv = NS_NewICalEventDisplay( event, (oeIICalEventDisplay**) _retval );
|
||||
++mCurrentIndex;
|
||||
return rv;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -865,7 +884,7 @@ NS_IMETHODIMP oeICalImpl::ModifyEvent(oeIICalEvent *icalevent, char **retid)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
((oeICalEventImpl *)icalevent)->GetId( retid );
|
||||
icalevent->GetId( retid );
|
||||
if( *retid == nsnull ) {
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "oeICalImpl::ModifyEvent() - Invalid Id.\n" );
|
||||
@ -1045,11 +1064,11 @@ oeICalImpl::DeleteEvent( const char *id )
|
||||
SetupAlarmManager();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
|
||||
{
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "oeICalImpl::GetAllEvents()\n" );
|
||||
#endif
|
||||
nsCOMPtr<oeEventEnumerator> eventEnum = new oeEventEnumerator();
|
||||
@ -1065,6 +1084,119 @@ oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
|
||||
tmplistptr = tmplistptr->next;
|
||||
}
|
||||
|
||||
// bump ref count
|
||||
return eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)resultList);
|
||||
}*/
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetAllEvents(nsISimpleEnumerator **resultList )
|
||||
{
|
||||
#ifdef ICAL_DEBUG
|
||||
printf( "oeICalImpl::GetAllEvents()\n" );
|
||||
#endif
|
||||
nsCOMPtr<oeEventEnumerator> eventEnum = new oeEventEnumerator();
|
||||
|
||||
if (!eventEnum)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
nsCOMPtr<nsISupportsArray> eventArray;
|
||||
NS_NewISupportsArray(getter_AddRefs(eventArray));
|
||||
if (eventArray == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
EventList *tmplistptr = &m_eventlist;
|
||||
while( tmplistptr ) {
|
||||
if( tmplistptr->event ) {
|
||||
eventArray->AppendElement( tmplistptr->event );
|
||||
}
|
||||
tmplistptr = tmplistptr->next;
|
||||
}
|
||||
|
||||
PRTime todayinms = PR_Now();
|
||||
PRInt64 usecpermsec;
|
||||
LL_I2L( usecpermsec, PR_USEC_PER_MSEC );
|
||||
LL_DIV( todayinms, todayinms, usecpermsec );
|
||||
|
||||
struct icaltimetype checkdate = ConvertFromPrtime( todayinms );
|
||||
struct icaltimetype now = ConvertFromPrtime( todayinms );
|
||||
icaltime_adjust( &now, 0, 0, 0, -1 );
|
||||
|
||||
icaltimetype nextcheckdate;
|
||||
PRUint32 num;
|
||||
|
||||
do {
|
||||
icaltimetype soonest = icaltime_null_time();
|
||||
eventArray->Count( &num );
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( now );
|
||||
if( !icaltime_is_null_time( next ) )
|
||||
continue;
|
||||
icaltimetype previous = ((oeICalEventImpl *)tmpevent)->GetPreviousOccurrence( checkdate );
|
||||
if( !icaltime_is_null_time( previous ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, previous ) > 0) ) ) {
|
||||
soonest = previous;
|
||||
}
|
||||
}
|
||||
|
||||
nextcheckdate = soonest;
|
||||
if( !icaltime_is_null_time( nextcheckdate )) {
|
||||
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( now );
|
||||
if( !icaltime_is_null_time( next ) )
|
||||
continue;
|
||||
icaltimetype previous = ((oeICalEventImpl *)tmpevent)->GetPreviousOccurrence( checkdate );
|
||||
if( !icaltime_is_null_time( previous ) && (icaltime_compare( nextcheckdate, previous ) == 0) ) {
|
||||
eventEnum->AddEvent( tmpevent );
|
||||
// PRTime nextdateinms = ConvertToPrtime( nextcheckdate );
|
||||
// dateEnum->AddDate( nextdateinms );
|
||||
eventArray->RemoveElementAt( i );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while ( !icaltime_is_null_time( nextcheckdate ) );
|
||||
|
||||
checkdate = ConvertFromPrtime( todayinms );
|
||||
icaltime_adjust( &checkdate, 0, 0, 0, -1 );
|
||||
|
||||
do {
|
||||
|
||||
icaltimetype soonest = icaltime_null_time();
|
||||
eventArray->Count( &num );
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate );
|
||||
if( !icaltime_is_null_time( next ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, next ) > 0) ) ) {
|
||||
soonest = next;
|
||||
}
|
||||
}
|
||||
|
||||
nextcheckdate = soonest;
|
||||
|
||||
if( !icaltime_is_null_time( nextcheckdate )) {
|
||||
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate );
|
||||
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
|
||||
eventEnum->AddEvent( tmpevent );
|
||||
// PRTime nextdateinms = ConvertToPrtime( nextcheckdate );
|
||||
// dateEnum->AddDate( nextdateinms );
|
||||
eventArray->RemoveElementAt( i );
|
||||
icaltime_adjust( &nextcheckdate, 0, 0, 0, -1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
checkdate = nextcheckdate;
|
||||
}
|
||||
} while ( !icaltime_is_null_time( nextcheckdate ) );
|
||||
|
||||
|
||||
// bump ref count
|
||||
return eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)resultList);
|
||||
}
|
||||
@ -1209,7 +1341,7 @@ oeICalImpl::GetEventsForDay( PRTime datems, nsISimpleEnumerator **datelist, nsIS
|
||||
|
||||
return GetEventsForRange(checkdateinms ,checkenddateinms ,datelist ,eventlist );
|
||||
}
|
||||
|
||||
/*
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **datelist, nsISimpleEnumerator **eventlist ) {
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
@ -1245,8 +1377,57 @@ oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, ns
|
||||
eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist);
|
||||
dateEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)datelist);
|
||||
return NS_OK;
|
||||
}
|
||||
}*/
|
||||
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **datelist, nsISimpleEnumerator **eventlist ) {
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalImpl::GetEventsForRange()\n" );
|
||||
#endif
|
||||
|
||||
nsCOMPtr<oeEventEnumerator> eventEnum = new oeEventEnumerator( );
|
||||
|
||||
if (!eventEnum)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
nsCOMPtr<oeDateEnumerator> dateEnum = new oeDateEnumerator( );
|
||||
|
||||
if (!dateEnum)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
struct icaltimetype checkdate = ConvertFromPrtime( checkdateinms );
|
||||
icaltime_adjust( &checkdate, 0, 0, 0, -1 );
|
||||
|
||||
struct icaltimetype checkenddate = ConvertFromPrtime( checkenddateinms );
|
||||
|
||||
icaltimetype nextcheckdate;
|
||||
do {
|
||||
nextcheckdate = GetNextEvent( checkdate );
|
||||
if( icaltime_compare( nextcheckdate, checkenddate ) >= 0 )
|
||||
break;
|
||||
if( !icaltime_is_null_time( nextcheckdate )) {
|
||||
EventList *tmplistptr = &m_eventlist;
|
||||
while( tmplistptr ) {
|
||||
if( tmplistptr->event ) {
|
||||
oeIICalEvent* tmpevent = tmplistptr->event;
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate );
|
||||
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
|
||||
eventEnum->AddEvent( tmpevent );
|
||||
PRTime nextdateinms = ConvertToPrtime( nextcheckdate );
|
||||
dateEnum->AddDate( nextdateinms );
|
||||
}
|
||||
}
|
||||
tmplistptr = tmplistptr->next;
|
||||
}
|
||||
checkdate = nextcheckdate;
|
||||
}
|
||||
} while ( !icaltime_is_null_time( nextcheckdate ) );
|
||||
|
||||
eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist);
|
||||
dateEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)datelist);
|
||||
return NS_OK;
|
||||
}
|
||||
/*
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **eventlist ) {
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
@ -1274,6 +1455,72 @@ oeICalImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checkenddateinm
|
||||
|
||||
eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist);
|
||||
return NS_OK;
|
||||
}*/
|
||||
NS_IMETHODIMP
|
||||
oeICalImpl::GetFirstEventsForRange( PRTime checkdateinms, PRTime checkenddateinms, nsISimpleEnumerator **eventlist ) {
|
||||
//NOTE: checkenddateinms is being ignored for now
|
||||
#ifdef ICAL_DEBUG_ALL
|
||||
printf( "oeICalImpl::GetFirstEventsForRange()\n" );
|
||||
#endif
|
||||
nsCOMPtr<oeEventEnumerator> eventEnum = new oeEventEnumerator();
|
||||
|
||||
if (!eventEnum)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
nsCOMPtr<nsISupportsArray> eventArray;
|
||||
NS_NewISupportsArray(getter_AddRefs(eventArray));
|
||||
if (eventArray == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
EventList *tmplistptr = &m_eventlist;
|
||||
while( tmplistptr ) {
|
||||
if( tmplistptr->event ) {
|
||||
eventArray->AppendElement( tmplistptr->event );
|
||||
}
|
||||
tmplistptr = tmplistptr->next;
|
||||
}
|
||||
|
||||
struct icaltimetype checkdate = ConvertFromPrtime( checkdateinms );
|
||||
icaltime_adjust( &checkdate, 0, 0, 0, -1 );
|
||||
|
||||
icaltimetype nextcheckdate;
|
||||
do {
|
||||
PRUint32 num;
|
||||
icaltimetype soonest = icaltime_null_time();
|
||||
eventArray->Count( &num );
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate );
|
||||
if( !icaltime_is_null_time( next ) && ( icaltime_is_null_time( soonest ) || (icaltime_compare( soonest, next ) > 0) ) ) {
|
||||
soonest = next;
|
||||
}
|
||||
}
|
||||
|
||||
nextcheckdate = soonest;
|
||||
|
||||
if( !icaltime_is_null_time( nextcheckdate )) {
|
||||
|
||||
for ( unsigned int i=0; i<num; i++ ) {
|
||||
oeIICalEvent* tmpevent;
|
||||
eventArray->GetElementAt( i, (nsISupports **)&tmpevent );
|
||||
icaltimetype next = ((oeICalEventImpl *)tmpevent)->GetNextRecurrence( checkdate );
|
||||
if( !icaltime_is_null_time( next ) && (icaltime_compare( nextcheckdate, next ) == 0) ) {
|
||||
eventEnum->AddEvent( tmpevent );
|
||||
// PRTime nextdateinms = ConvertToPrtime( nextcheckdate );
|
||||
// dateEnum->AddDate( nextdateinms );
|
||||
eventArray->RemoveElementAt( i );
|
||||
icaltime_adjust( &nextcheckdate, 0, 0, 0, -1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
checkdate = nextcheckdate;
|
||||
}
|
||||
} while ( !icaltime_is_null_time( nextcheckdate ) );
|
||||
|
||||
|
||||
// bump ref count
|
||||
return eventEnum->QueryInterface(NS_GET_IID(nsISimpleEnumerator), (void **)eventlist);
|
||||
}
|
||||
|
||||
icaltimetype oeICalImpl::GetNextEvent( icaltimetype starting ) {
|
||||
|
@ -104,7 +104,7 @@ oeICalTodoImpl::~oeICalTodoImpl()
|
||||
m_due->Release();
|
||||
if( m_completed )
|
||||
m_completed->Release();
|
||||
mEvent->Release();
|
||||
mEvent = nsnull;
|
||||
}
|
||||
|
||||
/* readonly attribute oeIDateTime due; */
|
||||
|
@ -101,6 +101,13 @@ interface oeIICalEvent : nsISupports
|
||||
oeIICalEvent clone();
|
||||
};
|
||||
|
||||
[scriptable, uuid(f95df40e-0d5f-49ec-9ba8-4b88d3eb53e0)]
|
||||
interface oeIICalEventDisplay : oeIICalEvent
|
||||
{
|
||||
readonly attribute oeIICalEvent event;
|
||||
attribute PRTime displayDate;
|
||||
};
|
||||
|
||||
[scriptable, uuid(d44987b4-1dd1-11b2-9783-8a78ed685caf)]
|
||||
interface oeIICalTodo : oeIICalEvent
|
||||
{
|
||||
@ -153,4 +160,6 @@ extern nsresult
|
||||
NS_NewICalEvent(oeIICalEvent** inst);
|
||||
extern nsresult
|
||||
NS_NewDateTime(oeIDateTime** inst);
|
||||
extern nsresult
|
||||
NS_NewICalEventDisplay( oeIICalEvent* event, oeIICalEventDisplay** inst );
|
||||
%}
|
||||
|
Loading…
x
Reference in New Issue
Block a user