harvester/composerplugins/imagecomposer/src/locationrelationobserver.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /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 <mdelogiccondition.h>
+#include <mdequery.h>
+
+#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<TItemId>& 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<TItemId> 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() );
+    }