diff -r 000000000000 -r c53acadfccc6 harvester/composerplugins/imagecomposer/src/locationrelationobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/composerplugins/imagecomposer/src/locationrelationobserver.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,210 @@ +/* +* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image Composer's listener for changes in db location relations +* +*/ + + +#include +#include + +#include "locationrelationobserver.h" +#include "harvesterlog.h" +#include "mdeconstants.h" +#include "composerimageplugin.h" + +using namespace MdeConstants; + + +CLocationRelationObserver::CLocationRelationObserver() : + iDefaultNamespace( NULL ), iSession( NULL ), iComposer( NULL ), + iQuery( NULL ), iQueryStarted( EFalse ) + { + // No implementation required + } + +CLocationRelationObserver::~CLocationRelationObserver() + { + iRelationIdArray.Close(); + + if( iSession ) + { + TRAP_IGNORE( iSession->RemoveRelationObserverL( *this ) ); + } + } + +CLocationRelationObserver* CLocationRelationObserver::NewL( CMdESession* aSession, CComposerImagePlugin* aComposer ) + { + WRITELOG( "CLocationRelationObserver::NewL start" ); + CLocationRelationObserver* self = new (ELeave)CLocationRelationObserver(); + CleanupStack::PushL(self); + self->ConstructL( aSession, aComposer ); + CleanupStack::Pop(); // self; + WRITELOG( "CLocationRelationObserver::NewL end" ); + return self; + } + +void CLocationRelationObserver::ConstructL( CMdESession* aSession, CComposerImagePlugin* aComposer ) + { + WRITELOG( "CLocationRelationObserver::ConstructL start" ); + User::LeaveIfNull( iSession = aSession ); + User::LeaveIfNull( iComposer = aComposer ); + + iDefaultNamespace = &iSession->GetDefaultNamespaceDefL(); + + // start listening to mde location object changes + CMdELogicCondition* condition = CMdELogicCondition::NewL( ELogicConditionOperatorAnd ); + CleanupStack::PushL( condition ); + + CMdERelationDef& relationDef = iDefaultNamespace->GetRelationDefL( + MdeConstants::Relations::KContainsLocation ); + + // Create relation condition + CMdERelationCondition* relCond = &condition->AddRelationConditionL( relationDef ); + + // Remove relation condition from logic condition + condition->Remove( 0 ); + // and delete logic condition + CleanupStack::PopAndDestroy( condition ); + + iSession->AddRelationObserverL( *this, relCond, ENotifyAdd | ENotifyModify | ENotifyRemove, iDefaultNamespace ); + + WRITELOG( "CLocationRelationObserver::ConstructL end" ); + } + +void CLocationRelationObserver::HandleRelationNotification( + CMdESession& /*aSession*/, TObserverNotificationType aType, + const RArray& aRelationIdArray) + { +#ifdef _DEBUG + WRITELOG2( "CLocationRelationObserver::HandleObjectModified() objects: %d, aType: %d", aRelationIdArray.Count(), aType ); +#endif + + if ( aType == ENotifyAdd || aType == ENotifyModify ) + { +#ifdef _DEBUG + WRITELOG1( "CLocationRelationObserver::HandleObjectModified() objects: %d", aRelationIdArray.Count() ); +#endif + + // get images + const TInt count = aRelationIdArray.Count(); + for( TInt i = 0; i < count; i ++ ) + { + iRelationIdArray.Append( aRelationIdArray[i] ); + } + + if( !iQueryStarted ) + { + TRAP_IGNORE( QueryRelationItemsL() ); + } + } + } + +// --------------------------------------------------------------------------- +// QueryImageObjectIdsL +// --------------------------------------------------------------------------- +// +void CLocationRelationObserver::QueryRelationItemsL() + { + if ( iRelationIdArray.Count() > 0 ) + { + iQueryStarted = ETrue; + } + else + { + iQueryStarted = EFalse; + return; + } + + delete iQuery; iQuery = NULL; + + RArray objectIds; + CleanupClosePushL( objectIds ); + const TInt count = iRelationIdArray.Count(); + for ( TInt i = 0; i < count; i++ ) + { + objectIds.Append( iRelationIdArray[i] ); + } + iRelationIdArray.Reset(); + + iQuery = iSession->NewRelationQueryL( *iDefaultNamespace, this ); + User::LeaveIfNull( iQuery ); + + iQuery->SetResultMode( EQueryResultModeId ); + iQuery->Conditions().SetOperator( ELogicConditionOperatorAnd ); + + // Relation id must be in array + iQuery->Conditions().AddRelationConditionL( objectIds ); + + CMdERelationCondition& filterCondLeft = iQuery->Conditions(). + AddRelationConditionL( ERelationConditionSideLeft ); + + // Left object in relation must be an image object. + CMdEObjectDef& imageObjDef = iDefaultNamespace->GetObjectDefL( + MdeConstants::Image::KImageObject ); + filterCondLeft.LeftL().AddObjectConditionL( imageObjDef ); + + CMdERelationCondition& filterCondRight = iQuery->Conditions(). + AddRelationConditionL( ERelationConditionSideRight ); + + // Right object in relation must be a location object. + CMdEObjectDef& locationObjDef = iDefaultNamespace->GetObjectDefL( + Location::KLocationObject ); + filterCondRight.RightL().AddObjectConditionL( locationObjDef ); + + iQuery->FindL(); // results to a call to HandleQueryCompleted() + + CleanupStack::PopAndDestroy( &objectIds ); + } + +// --------------------------------------------------------------------------- +// HandleQueryCompleted +// From MMdEQueryObserver. +// --------------------------------------------------------------------------- +// +void CLocationRelationObserver::HandleQueryNewResults( CMdEQuery& /*aQuery*/, + TInt /*aFirstNewItemIndex*/, TInt /*aNewItemCount*/ ) + { + } + +// --------------------------------------------------------------------------- +// HandleQueryCompleted +// From MMdEQueryObserver. +// --------------------------------------------------------------------------- +// +void CLocationRelationObserver::HandleQueryCompleted( CMdEQuery& aQuery, TInt /*aError*/ ) + { + if ( aQuery.Count() == 0 ) + { + WRITELOG( "CLocationObjectObserver::HandleQueryCompleted() - no items found" ); + } + else + { + TRAP_IGNORE( + const TInt count = aQuery.Count(); + for ( TInt i = 0; i < count; i++ ) + { + CMdERelation* relation = iSession->GetRelationL( aQuery.ResultId(i) ); + if ( iComposer && relation ) + { + iComposer->WriteGPSTagsL( relation->LeftObjectId(), relation->RightObjectId() ); + } + + delete relation; + } + ) + } + + TRAP_IGNORE( QueryRelationItemsL() ); + }