/* * Construct the filtered view. * This method is called when the underlying view sends an EReady or * ESortOrderChanged event. It is implemented by asking the underlying * view which contacts match the filter (via CContactViewBase_Reserved_1) */ void CContactFilteredView::CreateFilteredIdArray() { iFilteredIdArray.Reset(); CContactViewBase::TVirtualFunction2Params structOfParams(iFilter, iFilteredIdArray); TRAPD(err, iView.CContactViewBase_Reserved_1(CContactViewBase::ECContactViewBaseVirtualFunction2, &structOfParams)); //leaving method if(err==KErrNone) // View built OK, set to EReady or ESortOrderChanged { TState oldState = iState; iState=EReady; if (oldState == EInitializing) { NotifyObservers(TContactViewEvent(TContactViewEvent::EReady)); } else { NotifyObservers(TContactViewEvent(TContactViewEvent::ESortOrderChanged)); } } else // View building had problems { NotifyObservers(TContactViewEvent(TContactViewEvent::ESortError,err)); } }
/** Set database state @param aState database state to set. */ void CContactLocalView::SetState(TState aState) { switch (iState) { case EInitializing: case ENotReady: ASSERT(aState==EReady); iState=EReady; NotifyObservers(TContactViewEvent(TContactViewEvent::EReady)); HandleOutstandingEvents(); break; case EReady: ASSERT(aState==ENotReady || aState==EInitializing); // ensure sort error is reset iExtension->iError = KErrNone; iState=aState; NotifyObservers(TContactViewEvent(TContactViewEvent::EUnavailable)); break; default: ASSERT(EFalse); } }
void CContactConcatenatedView::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent) { TBool passOnNotification=ETrue; TContactViewEvent event=aEvent; TInt err; switch (event.iEventType) { case TContactViewEvent::ESortError: case TContactViewEvent::EServerError: case TContactViewEvent::EUnavailable: iState=ENotReady; break; case TContactViewEvent::EReady: SetComponentViewReady(aView); if (ComponentViewsReady()) // Need to wait for all views to be ready before changing state. { iState=EReady; } else { passOnNotification=EFalse; } break; case TContactViewEvent::ESortOrderChanged: iState=EReady; break; case TContactViewEvent::EItemAdded: case TContactViewEvent::EItemRemoved: TRAP(err,event.iInt+=OffsetL(aView)); if (err != KErrNone) { NotifyObservers(TContactViewEvent(TContactViewEvent::ESortError,err)); passOnNotification = EFalse; } break; case TContactViewEvent::EGroupChanged: break; default: ASSERT(EFalse); } if (passOnNotification) { NotifyObservers(event); } }
/* Update index mappings used in the filtered view. */ void CContactFilteredView::UpdateMappingsL() { // View mappings are now invalid Fix all mapped indexes TInt updatedViewIndex=KErrNotFound; for (TInt i=0; i < iFilteredIdArray.Count(); ++i) { TContactItemId idUpdate = iFilteredIdArray[i].iId; updatedViewIndex=iView.FindL(idUpdate); if(updatedViewIndex==KErrNotFound) { //local view has removed this contact, so we need to as well. iFilteredIdArray.Remove(i); NotifyObservers(TContactViewEvent(TContactViewEvent::EItemRemoved, i, idUpdate)); i--; continue; } iFilteredIdArray[i].iMapping=updatedViewIndex; } }
/** Called from view contact item manager to notify the sorting has finished. @param aSortErr error occurs in sorting or KErrNone if sorting completes without error. */ void CContactLocalView::SortComplete(TInt aSortErr) { if(aSortErr != KErrNone) { NotifySortError(aSortErr); return; } if (iState != EInitializing) { //The view has just been re-sorted, notifiy observers ESortOrderChanged iState = EReady; NotifyObservers(TContactViewEvent(TContactViewEvent::ESortOrderChanged)); HandleOutstandingEvents(); } else { // Sorted for the first time, notifiy ready SetState(EReady); } }
/** Notify observers that view construction failed. The error is stored so that if another client tries to open the view they will receive the same error. @param aError Leave code from CIdleContactSorter::RunL */ void CContactLocalView::NotifySortError(TInt aError) { iExtension->iError = aError; NotifyObservers(TContactViewEvent(TContactViewEvent::ESortError, aError)); }
void CContactFilteredView::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& aEvent) #endif { ASSERT(&aView==&iView); TBool doUpdate(EFalse); TContactViewEvent event=aEvent; switch (event.iEventType) { case TContactViewEvent::ESortError: case TContactViewEvent::EServerError: case TContactViewEvent::EUnavailable: iState=ENotReady; break; case TContactViewEvent::EReady: case TContactViewEvent::ESortOrderChanged: { //Underlying view is ready, create filtered view. CreateFilteredIdArray(); return; // Notification is handled in CreateFilteredIdArray } case TContactViewEvent::EItemAdded: { TBool viewModified(EFalse); TRAPD(err,UpdateFilteredIdArrayL(event,viewModified)); if(err!=KErrNone && err!=KErrNotFound) { NotifyObservers(TContactViewEvent(TContactViewEvent::ESortError,err)); return; } if (!viewModified) return; //If view wasn't modified, don't notify the observers } break; case TContactViewEvent::EItemRemoved: { TBool viewModified(EFalse); doUpdate = ETrue; TRAPD(err,UpdateFilteredIdArrayL(event,viewModified)); if(err!=KErrNone && err!=KErrNotFound) { NotifyObservers(TContactViewEvent(TContactViewEvent::ESortError,err)); return; } if (!viewModified) { UpdateMappingsL(); return; //If view wasn't modified, don't notify the observers } } break; case TContactViewEvent::EGroupChanged: break; default: ASSERT(EFalse); } NotifyObservers(event); if(doUpdate) { UpdateMappingsL(); //Update mappings for multiple changes and notify observers. } }