diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/src/agendautil_p.cpp --- a/agendainterface/agendautil/src/agendautil_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/src/agendautil_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include "agendautil_p.h" #include "agendaentry.h" #include "agendaentry_p.h" +#include "CleanupResetAndDestroy.h" // Constants //recognition string for ical @@ -41,7 +43,6 @@ //recognition string for vcal _LIT8(KVersionVCal, "VERSION:1.0"); const TInt KReadDataAmount = 256; -const TInt KGuidLength = 30; const TInt KNoOfDaysInWeek = 7; static const int startDateArray[2] = { 1900, 1}; static const int endDateArray[2] = { 2100, 1}; @@ -108,70 +109,24 @@ delete filter; } - /* - // If view creation is in progress, then wait till it gets completed - if((iCalEntryView && !mEntryViewCreated) - || (iCalInstanceView && !mInstanceViewCreated)) - { - if(!iWait) - { - TRAP(iError, iWait = new (ELeave) CActiveSchedulerWait;); - if(!iWait->IsStarted()) - { - iWait->Start(); - } - } + // First construct the CCalInstanceView if not already available. + // The CCalEntryView is constructed in CompletedL. Instance view + // is created before entry view since entry view is required only + // when editing/saving any entry. So we will construct it later + if (!iCalInstanceView) { + TRAP (iError, iCalInstanceView = CCalInstanceView::NewL(*iCalSession, + *this);) } - */ - - // First construct the CCalEntryView if not already available. - // The CCalInstanceView is constructed in ::CompletedL. We block the - // thread here until everything is setup. - if (!iCalEntryView) - { - TRAP( - iError, - iCalEntryView = CCalEntryView::NewL(*iCalSession, *this); - ); - if (!iWait) - { - TRAP( - iError, - iWait = new (ELeave) CActiveSchedulerWait; - ) - if (!iWait->IsStarted()) - { - iWait->Start(); - } - } - } - - // Comes here only when timer is expired, hence one more - // check is needed here. - if (iCalSession && mEntryViewCreated && mInstanceViewCreated) - { - // Everything is ready. - return true; - } - - else - { - return false; - } + + // All the requests have been made + return true; } AgendaUtilPrivate::~AgendaUtilPrivate() { delete iCalEntryView; delete iCalInstanceView; - if (iWait && iWait->IsStarted()) - { - iWait->AsyncStop(); - } - - delete iWait; - if (iCalSession) - { + if (iCalSession) { iCalSession->StopChangeNotification(); } delete iCalSession; @@ -180,6 +135,8 @@ void AgendaUtilPrivate::Completed(TInt aError) { iError = aError; + static bool isInstanceViewDeleted = false; + static bool isEntryViewDeleted = false; if (mIsDeleting) { // If deletion was in progress, then it is completed now @@ -188,39 +145,35 @@ emit q->entriesDeleted(iError); } - if(KErrNone != iError) - { + if (KErrNone != iError) { // Something has gone wrong, return + if (iCalEntryView && !isEntryViewDeleted) { + isEntryViewDeleted = true; delete iCalEntryView; iCalEntryView = NULL; + } + if (iCalInstanceView && !isInstanceViewDeleted) { + isInstanceViewDeleted = true; delete iCalInstanceView; iCalInstanceView = NULL; + } return; } - if(iCalEntryView && !mEntryViewCreated) - { - mEntryViewCreated = true; - - // Start creating the instance view. - if(!iCalInstanceView) - { - TRAP(iError, iCalInstanceView = CCalInstanceView::NewL( - *iCalSession, *this);) + if (iCalInstanceView && !mInstanceViewCreated) { + // Instance view is now created. + mInstanceViewCreated = true; + emit q->instanceViewCreationCompleted(iError); + // Start with the construction of entry view + if (!iCalEntryView) { + TRAP (iError, + iCalEntryView = CCalEntryView::NewL(*iCalSession, *this); + ); } - } - else if(iCalInstanceView && !mInstanceViewCreated) - { - mInstanceViewCreated = true; - } - - // Stop the wait timer - if( iWait && iWait->IsStarted()) - { - if(mEntryViewCreated && mInstanceViewCreated) - { - iWait->AsyncStop(); - } + } else if(iCalEntryView && !mEntryViewCreated) { + // Entry view is now constructed + mEntryViewCreated = true; + emit q->entryViewCreationCompleted(iError); } } @@ -248,25 +201,21 @@ int success = 0; // First check if the session to the calendar database is prepared or not. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong return localUid; } + // Get the global uid. + CCalenInterimUtils2* calenInterimUtils2 = CCalenInterimUtils2::NewL(); + HBufC8* globalUid = calenInterimUtils2->GlobalUidL(); if (AgendaEntry::TypeNote == entry.type()) { TRAP( iError, RPointerArray entryArray; - CleanupClosePushL(entryArray); - - // Get the global uid. - TTime homeTime; - homeTime.HomeTime(); - TInt64 seed = homeTime.Int64(); - TInt randumNumber = Math::Rand(seed); - HBufC8* globalUid = HBufC8::NewLC(KGuidLength); - globalUid->Des().Num(randumNumber); + CleanupResetAndDestroyPushL(entryArray); + CleanupStack::PushL(globalUid); // Construct a CCalEntry object and start filling the details. CCalEntry* newEntry = 0; @@ -277,7 +226,6 @@ 0); CleanupStack::Pop(globalUid); - CleanupStack::PushL(newEntry); // Add description. TPtrC description(reinterpret_cast( @@ -309,7 +257,7 @@ dtStamp.time().minute(), 0, 0); TTime creationTTime(creationDateTime); creationCalTime.SetTimeLocalL(creationTTime); - //newEntry->SetDTStampL(creationCalTime); + newEntry->SetDTStampL(creationCalTime); // Finally set the entry to the database using the entry view. entryArray.AppendL(newEntry); @@ -317,7 +265,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } else { @@ -325,16 +272,8 @@ iError, RPointerArray entryArray; - CleanupClosePushL(entryArray); - - // Get the global uid. - TTime homeTime; - homeTime.HomeTime(); - TInt64 seed = homeTime.Int64(); - TInt randumNumber = Math::Rand(seed); - HBufC8* globalUid = HBufC8::NewLC(KGuidLength); - globalUid->Des().Num(randumNumber); - + CleanupResetAndDestroyPushL(entryArray); + CleanupStack::PushL(globalUid); // Construct a CCalEntry object and start filling the details. CCalEntry* newEntry = 0; newEntry = CCalEntry::NewL( @@ -344,7 +283,6 @@ 0); CleanupStack::Pop(globalUid); - CleanupStack::PushL(newEntry); // Add the summary. if (!entry.summary().isNull()) { @@ -443,10 +381,12 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } + + delete calenInterimUtils2; + // Emit signal upon successful creation of entry. if (0 < localUid && 1 == success) { emit q->entryAdded(localUid); @@ -467,7 +407,7 @@ const AgendaEntry &entry, AgendaEntry::Type type) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return 0; } @@ -497,9 +437,7 @@ // Now save the GUID of the saved entry. TRAP( iError, - - globalUid = HBufC8::NewL(KGuidLength); - *globalUid = originalEntry->UidL(); + globalUid = originalEntry->UidL().AllocL(); ) delete originalEntry; @@ -519,7 +457,6 @@ globalUid, static_cast(entry.method()), 0); - CleanupStack::PushL(newEntry); // Add description. TPtrC description(reinterpret_cast( @@ -535,7 +472,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } else { @@ -552,7 +488,6 @@ globalUid, static_cast(entry.method()), 0); - CleanupStack::PushL(newEntry); // Add the summary. if (!entry.summary().isNull()) { @@ -651,7 +586,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } @@ -671,7 +605,7 @@ bool AgendaUtilPrivate::deleteEntry(ulong id) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -706,10 +640,9 @@ AgendaEntry& entry, AgendaUtil::RecurrenceRange range) { - qDebug("AgendaUtilPrivate::deleteRepeatedEntry"); // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return; } @@ -736,18 +669,12 @@ // the exceptional entries share the global uid with the parent // entry. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); if (entries.Count()) { iCalEntryView->DeleteL(*entries[0]); } - // Cleanup. - int count = entries.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalEntry *entry = entries[i]; - delete entry; - } CleanupStack::PopAndDestroy(&entries); CleanupStack::PopAndDestroy(); } @@ -766,7 +693,7 @@ bool AgendaUtilPrivate::updateEntry(const AgendaEntry& entry, bool isChild) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -785,7 +712,6 @@ // Get the entry corresponding to the id. AgendaEntry storedEntry = fetchById(entry.id()); CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); // Update the description. if (storedEntry.description() != entry.description() @@ -839,12 +765,12 @@ // Update the entry using the CCalEntryView. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(calEntry); iCalEntryView->UpdateL(entryArray, success); // Cleanup. - CleanupStack::PopAndDestroy(2, calEntry); + CleanupStack::PopAndDestroy( &entryArray ); ) } else { TRAP( @@ -853,22 +779,18 @@ // Get the entry corresponding to the id. AgendaEntry storedEntry = fetchById(entry.id()); CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); // Update the attendees. if (!entry.isNull() && (entry.d->m_attendees != storedEntry.attendees())) { - RPointerArray attendeesArray = + RPointerArray& attendeesArray = calEntry->AttendeesL(); - CleanupClosePushL(attendeesArray); int iterator = 0; while (attendeesArray.Count() > iterator) { calEntry->DeleteAttendeeL(iterator); iterator++; } - // Cleanup. - CleanupStack::PopAndDestroy(&attendeesArray); addAttendeesToEntry(entry.d->m_attendees, *calEntry); } @@ -878,14 +800,11 @@ RPointerArray categories = calEntry->CategoryListL(); - CleanupClosePushL(categories); int iterator = 0; while (categories.Count() > iterator) { calEntry->DeleteCategoryL(iterator); iterator++; } - // Cleanup. - CleanupStack::PopAndDestroy(&categories); addCategoriesToEntry(entry.d->m_categories, *calEntry); } @@ -994,7 +913,7 @@ // Save the geo value if any AgendaGeoValue entryGeoValue = entry.geoValue(); - if (!entryGeoValue.isNull()) { + if (!entryGeoValue.isNull() && (entryGeoValue != storedEntry.geoValue())) { CCalGeoValue* geoValue = CCalGeoValue::NewL(); double latitude; double longitude; @@ -1006,11 +925,14 @@ // set it to CCalentry calEntry->SetGeoValueL(*geoValue); delete geoValue; + } else if (entryGeoValue.isNull()) { + // Clear the geo values if any + calEntry->ClearGeoValueL(); } // Update the entry using the calen entry view. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(calEntry); if (!isChild) { iCalEntryView->UpdateL(entryArray, success); @@ -1018,7 +940,7 @@ iCalEntryView->StoreL(entryArray, success); } // Cleanup. - CleanupStack::PopAndDestroy(2, calEntry); + CleanupStack::PopAndDestroy( &entryArray ); ) } @@ -1033,7 +955,7 @@ bool copyToChildren) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -1054,9 +976,10 @@ if (instance) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(instance->UidL(), entries); calEntry = entries[0]; + entries.Remove(0); CleanupStack::PopAndDestroy(&entries); } else { CleanupStack::PopAndDestroy(instance); @@ -1092,7 +1015,7 @@ // Entry is not a child, but does it have any children? // Fetch array of entries associated with this UID. RPointerArray oldEntries; - CleanupClosePushL(oldEntries); + CleanupResetAndDestroyPushL(oldEntries); iCalEntryView->FetchL(calEntry->UidL(), oldEntries); bool hasChildren = oldEntries.Count() > 0; @@ -1122,6 +1045,9 @@ // set it to CCalentry calEntry->SetGeoValueL(*geoValue); delete geoValue; + } else { + // Clear the geo values + calEntry->ClearGeoValueL(); } // set the description @@ -1199,11 +1125,11 @@ return success; } -bool AgendaUtilPrivate::createException(const AgendaEntry& entry) -{ - +bool AgendaUtilPrivate::createException(const AgendaEntry& entry, + QDateTime instanceOriginalDateTime) +{ // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -1226,18 +1152,12 @@ HBufC8* guid = calEntry->UidL().AllocLC(); // create new (child) entry // Use original instance time for recurrenceID as this entry hasn't got one. - TCalTime originalCalTime = calEntry->StartTimeL(); - TDateTime origDateTime = originalCalTime.TimeLocalL().DateTime(); - // set the instance date to this - QDate date = entry.startTime().date(); - QTime time =entry.startTime().time(); - origDateTime.Set(date.year(), - static_cast (date.month() - 1), - date.day() - 1, - time.hour(), - time.minute(),time.second(), 0); - TTime originalTime(origDateTime); - originalCalTime.SetTimeLocalL(originalTime); + TCalTime originalCalTime; + TDateTime originalDateTime(instanceOriginalDateTime.date().year(), + TMonth(instanceOriginalDateTime.date().month() - 1), + instanceOriginalDateTime.date().day() -1, 0, 0, 0, 0); + TTime originalDateTimeTTime(originalDateTime); + originalCalTime.SetTimeLocalL(originalDateTimeTTime); // create the new child now CCalEntry* newEntry = CCalEntry::NewL( calEntry->EntryTypeL(), guid, @@ -1248,7 +1168,6 @@ CleanupStack::Pop(guid); CleanupStack::PopAndDestroy(calEntry); - CleanupStack::PushL(newEntry); // Update the description. if (!entry.description().isNull()) { @@ -1285,13 +1204,13 @@ // Update the entry using the CCalEntryView. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(newEntry); iCalEntryView->StoreL(entryArray, success); localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(2, newEntry); + CleanupStack::PopAndDestroy(&entryArray); ) } else { TRAP( @@ -1303,20 +1222,12 @@ HBufC8* guid = calEntry->UidL().AllocLC(); // create new (child) entry // Use original instance time for recurrenceID as this entry hasn't got one. - TCalTime originalCalTime = calEntry->StartTimeL(); - TDateTime origDateTime = originalCalTime.TimeLocalL().DateTime(); - // set only the instance date but not the time to this - QDate date = entry.startTime().date(); - QTime time =entry.startTime().time(); - origDateTime.Set(date.year(), - static_cast (date.month() - 1), - date.day() - 1, - origDateTime.Hour(), - origDateTime.Minute(), - origDateTime.Second(), - origDateTime.MicroSecond()); - TTime originalTime(origDateTime); - originalCalTime.SetTimeLocalL(originalTime); + TCalTime originalCalTime; + TDateTime originalDateTime(instanceOriginalDateTime.date().year(), + TMonth(instanceOriginalDateTime.date().month() - 1), + instanceOriginalDateTime.date().day() -1, 0, 0, 0, 0); + TTime originalDateTimeTTime(originalDateTime); + originalCalTime.SetTimeLocalL(originalDateTimeTTime); // create the new child now CCalEntry* newEntry = CCalEntry::NewL( calEntry->EntryTypeL(), guid, @@ -1327,7 +1238,6 @@ CleanupStack::Pop(guid); CleanupStack::PopAndDestroy(calEntry); - CleanupStack::PushL(newEntry); // Store the attendees. if (!entry.isNull()) { addAttendeesToEntry(entry.d->m_attendees, *newEntry); @@ -1435,14 +1345,13 @@ newEntry->ClearRepeatingPropertiesL(); // Update the entry using the calen entry view. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(newEntry); iCalEntryView->StoreL(entryArray, success); localUid = newEntry->LocalUidL(); // Cleanup. CleanupStack::PopAndDestroy(&entryArray); - CleanupStack::PopAndDestroy(newEntry); ) } @@ -1464,7 +1373,7 @@ AgendaEntry entry; // First check if the session with the calendar exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty AgendaEntry. return entry; } @@ -1500,7 +1409,7 @@ QList listOfIds; // First check if the session with agenda server exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty list. return listOfIds; } @@ -1509,7 +1418,7 @@ iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1536,14 +1445,8 @@ listOfIds.append(instanceList[iter]->Entry().LocalUidL()); } - int count = instanceList.Count(); - for (int iter = count - 1; iter >= 0; --iter) { - CCalInstance *instance = instanceList[iter]; - delete instance; - } - // Cleanup. - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return listOfIds; @@ -1561,7 +1464,7 @@ QList entryList; // First check if the session with agenda server exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty list. return entryList; } @@ -1570,7 +1473,7 @@ iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1601,14 +1504,8 @@ instanceList[iter])); } - int count = instanceList.Count(); - for (int iter = count - 1; iter >= 0; --iter) { - CCalInstance *instance = instanceList[iter]; - delete instance; - } - // Cleanup. - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return entryList; @@ -1619,7 +1516,7 @@ AgendaUtil::FilterFlags filter) { QList entryList; - if(!prepareSession()) + if(!mInstanceViewCreated) { // return empty list return entryList; @@ -1628,7 +1525,7 @@ TRAP(iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1661,12 +1558,7 @@ { entryList.append(createAgendaEntryFromCalEntry(instanceList[i]->Entry(), instanceList[i])); } - int count = instanceList.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalInstance *instance = instanceList[i]; - delete instance; - } - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return entryList; @@ -1676,7 +1568,13 @@ QDateTime rangeEnd,AgendaUtil::FilterFlags filter, QList& dates) { RPointerArray instanceList; - CleanupClosePushL(instanceList); + + if(!mInstanceViewCreated) { + // return empty list + return; + } + + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1704,7 +1602,7 @@ endDateForInstanceSearch); iCalInstanceView->FindInstanceL(instanceList, filters, searchTimeRange); - + // Parse thru the list and mark the dates which have events for (int i = 0; i < instanceList.Count(); i++) { CCalEntry::TType type = instanceList[i]->Entry().EntryTypeL(); @@ -1712,52 +1610,106 @@ TCalTime startCalTime = instanceList[i]->StartTimeL(); TCalTime endCalTime = instanceList[i]->EndTimeL(); TDateTime startDateTime = startCalTime.TimeLocalL().DateTime(); + TDateTime endDateTime = endCalTime.TimeLocalL().DateTime(); QDate startDate(startDateTime.Year(), startDateTime.Month()+1, startDateTime.Day() + 1); + QDate endDate(endDateTime.Year(), endDateTime.Month()+1, + endDateTime.Day() + 1); if (type == CCalEntry::EEvent || type == CCalEntry::EAppt || type == CCalEntry::EReminder) { if(endsAtStartOfDay(instanceList[i], endCalTime.TimeLocalL())) { - // instance ends at start of endtime day, month view doesnt - // want to show event on this day TDateTime endDateTime = endCalTime.TimeLocalL().DateTime(); + // prevent problems with items ending tomorrow at 00:00 endDateTime.SetMinute(endDateTime.Minute() - 1); TTime time(endDateTime); + // If it is ending before the start of the grid if (time <= startDateForInstanceSearch.TimeLocalL()) { continue; } } - - // Mark the required dates frm start date to end date - TTimeIntervalDays days = endCalTime.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()); - for (int j = -1; j < days.Int(); j++) { - QDate date = startDate.addDays(j+1); - if (date <= rangeEnd.date()) { - dates.append(date); - } else { - break; - } - } - } else if (type == CCalEntry::EAnniv) { - if (startDate <= rangeEnd.date()) { - dates.append(startDate); - } - } else if (type == CCalEntry::ETodo) { - // if start time is less that today, then mark it for today - if (startDate < QDate::currentDate()) { - dates.append(QDate::currentDate()); - } else { - dates.append(startDate); - } - } - } - CleanupStack::PopAndDestroy(); + // Mark the required dates frm start date to end date + TTimeIntervalDays days ; + int numOfDays = 0; + //check if the start date of the entry is before the start day of the grid + if(startDate < rangeStart.date()){ + if(endDate<=rangeEnd.date()){ + //if the end date of entry is lying in the grid , + //then mark the entry from start day of the grid to the end date of the entry + days = endCalTime.TimeLocalL().DaysFrom(startDateForInstanceSearch.TimeLocalL()); + numOfDays = days.Int(); + } + else{ + //if end date of the entry is greater then the last date of grid, + //then mark all the date of the grid with the entry + days = endDateForInstanceSearch.TimeLocalL().DaysFrom(startDateForInstanceSearch.TimeLocalL()) ; + numOfDays = days.Int(); + } + // Check if the event is all-day + if (instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // no need to consider the date on which it ends + // reduce days count by 1 + numOfDays--; + } + //start the entries from the first day of the grid + for (int j = 0; j <= numOfDays; j++) { + QDate date = rangeStart.date().addDays(j); + if (date <= rangeEnd.date()) { + dates.append(date); + } else { + break; + } + } + } + //if the start date of the entry is lying inside the grid + else{ + if(endDate<=rangeEnd.date()){ + //if the end date of entry is lying in the grid , + //then mark the entry from start date of the entry to the end date of the entry + days = endCalTime.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()) ; + numOfDays = days.Int(); + } + else{ + //if end date of the entry is greater then the last date of grid, + //then mark all the date from start date of the entry to the end date of the grid + days = endDateForInstanceSearch.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()) ; + numOfDays = days.Int(); + } + // Check if the event is all-day + if (instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // no need to consider the date on which it ends + // reduce days count by 1 + numOfDays--; + } + for (int j = 0; j <= numOfDays; j++) { + QDate date = startDate.addDays(j); + if (date <= rangeEnd.date()) { + dates.append(date); + } else { + break; + } + } + } + } else if (type == CCalEntry::EAnniv) { + if (startDate <= rangeEnd.date()) { + dates.append(startDate); + } + } else if (type == CCalEntry::ETodo) { + // if start time is less that today, then mark it for today + if (startDate < QDate::currentDate()) { + dates.append(QDate::currentDate()); + } else { + dates.append(startDate); + } + } + } + CleanupStack::PopAndDestroy(&instanceList); } QList AgendaUtilPrivate::createEntryIdListForDay( QDateTime day, AgendaUtil::FilterFlags filter ) { QList entryList; - if(!prepareSession()) { + if(!mInstanceViewCreated) { // return empty list return entryList; } @@ -1766,7 +1718,7 @@ TRAP(iError, getDayRange(day, day, dayRange); RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; // Check if the filter has todos also to be included if(filter & CalCommon::EIncludeIncompletedTodos) @@ -1809,6 +1761,26 @@ { iCalInstanceView->FindInstanceL(instanceList, filters, dayRange); } + + // In this list, check if any all day events are there + // As all day events end at 12.00AM of next day, we should not show it again on next day + TCalTime calTime; + TDateTime dateTime( + day.date().year(), + static_cast(day.date().month() - 1), + day.date().day() - 1, day.time().hour(), + day.time().minute(), 0, 0); + TTime time(dateTime); + for (int i(0); i < instanceList.Count(); i++) { + if ((endsAtStartOfDay(instanceList[i], time)) && + instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // Previous day all-day event has been found, we are not supposed to + // show it on current day, hence remove it from the instance list + instanceList.Remove(i); + i--; + } + } + // Sort the list sortInstanceList(instanceList); for(TInt i = 0; iEntry(), instanceList[i])); } - int count = instanceList.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalInstance *instance = instanceList[i]; - delete instance; - } - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy( &instanceList ); ) return entryList; @@ -1833,7 +1800,7 @@ int success = -1 ; // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return success; } @@ -1886,7 +1853,7 @@ const QString& fileName, ulong calendarEntryId) { // First prepare session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } TRAP( @@ -1953,18 +1920,16 @@ // Fetch the calentry CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); calEntry->SetCompletedL(complete, calTime); // Update the entry in the Database RPointerArray array; - CleanupClosePushL(array); + CleanupResetAndDestroyPushL(array); array.AppendL(calEntry); iCalEntryView->UpdateL(array, success); // Cleanup. - CleanupStack::PopAndDestroy(&array); - CleanupStack::PopAndDestroy(calEntry); + CleanupStack::PopAndDestroy( &array ); ) if (0 < success) { @@ -2022,7 +1987,7 @@ { AgendaEntry parentEntry; // First check if the session with the calendar exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty AgendaEntry. return entry; } @@ -2036,7 +2001,7 @@ if (calEntry) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); parentEntry = createAgendaEntryFromCalEntry(*entries[0]); CleanupStack::PopAndDestroy(&entries); @@ -2064,7 +2029,7 @@ if (calEntry) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); entries[0]->ClearRepeatingPropertiesL(); CleanupStack::PopAndDestroy(&entries); @@ -2083,7 +2048,7 @@ QDateTime& endTime) { RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); TCalTime previousStartTime; TCalTime previousEndTime; TTime zero(TInt64(0)); @@ -2200,6 +2165,16 @@ // Is currentInstanceDate before parent dt start? if (currentInstanceDate.TimeLocalL() < entries[0]->StartTimeL().TimeLocalL()) { + TBool exceptionEntryBeforeParentStartPresent = EFalse; + for (TInt i=0; i= 0; --i) { - CCalEntry *instance = entries[i]; - delete instance; - } CleanupStack::PopAndDestroy(&entries); } @@ -2273,7 +2249,7 @@ QDateTime& endTime) { RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); TCalTime nextStartTime; TCalTime nextEndTime; TTime zero(TInt64(0)); @@ -2387,9 +2363,19 @@ keepLooking = EFalse; break; } - // Is currentInstanceDate before parent dt start? - if (currentInstanceDate.TimeLocalL() < - entries[0]->StartTimeL().TimeLocalL()) { + // Is currentInstanceDate after repeat until date? + if (currentInstanceDate.TimeLocalL() > + rrule.Until().TimeLocalL()) { + TBool exceptionEntryAfterRepeatUntilPresent = EFalse; + for (TInt i=0; i rrule.Until().TimeLocalL()) { + exceptionEntryAfterRepeatUntilPresent = ETrue; + } + } + if (!exceptionEntryAfterRepeatUntilPresent) { + currentInstanceDate.SetTimeLocalL(Time::NullTTime()); + nextStartTime = currentInstanceDate; + } // There are no instances before the exception keepLooking = EFalse; } else { @@ -2432,22 +2418,24 @@ CleanupStack::PopAndDestroy( &exdates ); } } - // Convert TCalTimes to QDateTimes - TDateTime nextStart = nextStartTime.TimeLocalL().DateTime(); - TDateTime nextEnd = nextEndTime.TimeLocalL().DateTime(); - startTime.setDate(QDate(nextStart.Year(), nextStart.Month()+1, - nextStart.Day() + 1)); - startTime.setTime(QTime(nextStart.Hour(), nextStart.Minute(), 0, 0)); - endTime.setDate(QDate(nextEnd.Year(), nextEnd.Month()+1, - nextEnd.Day() + 1)); - endTime.setTime(QTime(nextEnd.Hour(), nextEnd.Minute(), 0, 0)); + if (nextStartTime.TimeUtcL() != Time::NullTTime()) { + // Convert TCalTimes to QDateTimes + TDateTime nextStart = nextStartTime.TimeLocalL().DateTime(); + TDateTime nextEnd = nextEndTime.TimeLocalL().DateTime(); + startTime.setDate(QDate(nextStart.Year(), nextStart.Month()+1, + nextStart.Day() + 1)); + startTime.setTime(QTime(nextStart.Hour(), nextStart.Minute(), 0, 0)); + endTime.setDate(QDate(nextEnd.Year(), nextEnd.Month()+1, + nextEnd.Day() + 1)); + endTime.setTime(QTime(nextEnd.Hour(), nextEnd.Minute(), 0, 0)); + } else { + QDateTime nullDateTime; + startTime = nullDateTime; + endTime = nullDateTime; + } delete calEntry; - int count = entries.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalEntry *instance = entries[i]; - delete instance; - } + CleanupStack::PopAndDestroy(&entries); } @@ -2458,10 +2446,15 @@ */ bool AgendaUtilPrivate::areNoEntriesInCalendar() { + // First prepare the session with the agenda server. + if (!mInstanceViewCreated) { + return false; + } + bool isEmpty; // Query for the entries for entire range RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); // Create the filter CalCommon::TCalViewFilter filters = AgendaUtil::IncludeAnniversaries @@ -2498,7 +2491,9 @@ } else { isEmpty = true; } - CleanupStack::PopAndDestroy(); + + // Cleanup + CleanupStack::PopAndDestroy( &instanceList ); return isEmpty; } @@ -2662,8 +2657,7 @@ entry.setStartAndEndTime(startDateTime, endDateTime); // Attendees. - RPointerArray calAttendees = calEntry.AttendeesL(); - CleanupClosePushL(calAttendees); + RPointerArray& calAttendees = calEntry.AttendeesL(); for (int i = 0; i < calAttendees.Count(); i++) { AgendaAttendee attendee; @@ -2690,11 +2684,9 @@ calAttendees[i]->StatusL())); entry.addAttendee(attendee); } - CleanupStack::Pop(&calAttendees); // Categories. - RPointerArray calCategories = calEntry.CategoryListL(); - CleanupClosePushL(calCategories); + const RPointerArray& calCategories = calEntry.CategoryListL(); for (int i = 0; i < calCategories.Count(); i++) { AgendaCategory category; @@ -2710,7 +2702,6 @@ static_cast(categoryType)); entry.addCategory(category); } - CleanupStack::PopAndDestroy(&calCategories); // Id. entry.d->m_id = calEntry.LocalUidL(); @@ -2846,7 +2837,7 @@ const QList& attendees, CCalEntry& entry) { // First prepare the session with the agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } @@ -2878,7 +2869,7 @@ const QList& categories, CCalEntry& entry) { // First prepare the session with the agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } TRAP( @@ -2984,7 +2975,7 @@ CCalInstance* AgendaUtilPrivate::findPossibleInstance(AgendaEntry& entry) { - if(!prepareSession()) { + if(!mInstanceViewCreated) { // return empty list return NULL; } @@ -2992,7 +2983,7 @@ CalCommon::TCalTimeRange dayRange(dummy, dummy); getDayRange(entry.startTime(), entry.startTime(), dayRange); RPointerArray instances; - CleanupClosePushL(instances); + CleanupResetAndDestroyPushL(instances); iCalInstanceView->FindInstanceL(instances, CalCommon::EIncludeAll, dayRange); TTime entryStartTime(dayRange.StartTime().TimeLocalL()); @@ -3412,7 +3403,7 @@ const CalCommon::TCalTimeRange& timeRange) { RPointerArray allInstances; - CleanupClosePushL( allInstances ); + CleanupResetAndDestroyPushL(allInstances); TInt filter; // Get the entry type to be filtered @@ -3461,7 +3452,7 @@ const CalCommon::TCalTimeRange& timeRange) { RPointerArray allInstances; - CleanupClosePushL( allInstances ); + CleanupResetAndDestroyPushL(allInstances); TInt filter; // Get the entry type to be filtered @@ -3702,16 +3693,14 @@ oldEntries[i]->SequenceNumberL(), recId, oldEntries[i]->RecurrenceRangeL() ); - CleanupStack::PushL(exception); exception->CopyFromL(*oldEntries[i]); exception->SetLastModifiedDateL(); TInt successCount=0; RPointerArray entries; - CleanupClosePushL( entries ); + CleanupResetAndDestroyPushL(entries); entries.Append( exception ); iCalEntryView->StoreL( entries, successCount ); CleanupStack::PopAndDestroy( &entries ); - CleanupStack::PopAndDestroy(exception); } else { @@ -3724,10 +3713,10 @@ oldEntries[i]->SetLastModifiedDateL(); TInt successCount=0; RPointerArray entries; - CleanupClosePushL( entries ); + CleanupClosePushL(entries); entries.Append( oldEntries[i] ); iCalEntryView->StoreL( entries, successCount ); - CleanupStack::PopAndDestroy( &entries ); + CleanupStack::Pop( &entries ); } } }