diff -r 000000000000 -r d0791faffa3f mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncobserver.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,216 @@ +// Copyright (c) 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: +// + +/** + @file + @internalTechnology +*/ + +// +#include +#include + +#include "cmediasyncdatabase.h" +#include "cmediasyncobserver.h" + +__FLOG_STMT(_LIT8(KComponent,"MediaSyncObserver");) + +CMediaSyncObserver* CMediaSyncObserver::NewL(CMediaSyncDatabase* aDb) + { + CMediaSyncObserver* self = new (ELeave) CMediaSyncObserver(aDb); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CMediaSyncObserver::ConstructL() + { + __FLOG_OPEN(KMSSSubsystem, KComponent); + __FLOG(_L8("CMediaSyncObserver::ConstructL - Entry")); + + iSessionWait = new (ELeave) CActiveSchedulerWait(); + iSession = CMdESession::NewL(*this); + iSessionWait->Start(); + + User::LeaveIfError(iMdeSessionError); + +// SubscribeForChangeNotificationL(); + + __FLOG(_L8("CMediaSyncObserver::ConstructL - Exit")); + } + +CMediaSyncObserver::CMediaSyncObserver(CMediaSyncDatabase* aDb) + :iDb(aDb), + iSubscribed(EFalse) + { + } + +CMediaSyncObserver::~CMediaSyncObserver() + { + __FLOG(_L8("CMediaSyncObserver::~CMediaSyncObserver - Entry")); + +// TRAP_IGNORE(UnsubscribeForChangeNotificationL()); + + delete iSession; + delete iSessionWait; + + __FLOG(_L8("CMediaSyncObserver::~CMediaSyncObserver - Exit")); + __FLOG_CLOSE; + } + +void CMediaSyncObserver::SubscribeForChangeNotificationL() + { + __FLOG(_L8("CMediaSyncObserver::SubscribeForChangeNotificationL - Entry")); + + if (!iSubscribed) + { + CMdENamespaceDef& def = iSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& imageObjDef = def.GetObjectDefL(MdeConstants::Image::KImageObject); + + // add observer + CMdELogicCondition* addCondition = CMdELogicCondition::NewLC(ELogicConditionOperatorAnd); + CMdEPropertyDef& itemTypePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KItemTypeProperty); + addCondition->AddPropertyConditionL(itemTypePropDef, ETextPropertyConditionCompareEndsWith, _L("jpeg")); + iSession->AddObjectObserverL(*this, addCondition, ENotifyAdd); + CleanupStack::Pop(addCondition); + + // modify observer + CMdELogicCondition* modifyCondition = CMdELogicCondition::NewLC(ELogicConditionOperatorAnd); + CMdEPropertyDef& titlePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KTitleProperty); + modifyCondition->AddPropertyConditionL(titlePropDef); + iSession->AddObjectObserverL(*this, modifyCondition, ENotifyModify); + CleanupStack::Pop(modifyCondition); + + // remove observer + iSession->AddObjectObserverL(*this, NULL, ENotifyRemove); + + // present observer + iSession->AddObjectPresentObserverL(*this); + + iSubscribed = ETrue; + } + + __FLOG(_L8("CMediaSyncObserver::SubscribeForChangeNotificationL - Exit")); + } + +void CMediaSyncObserver::UnsubscribeForChangeNotificationL() + { + __FLOG(_L8("CMediaSyncObserver::UnsubscribeForChangeNotificationL - Entry")); + + if (iSubscribed) + { + iSession->RemoveObjectObserverL(*this);//add observer + iSession->RemoveObjectObserverL(*this);//modify observer + iSession->RemoveObjectObserverL(*this);//remove observer + iSession->RemoveObjectPresentObserverL(*this); + iSubscribed = EFalse; + } + + __FLOG(_L8("CMediaSyncObserver::UnsubscribeForChangeNotificationL - Exit")); + } + +// From MMdESessionObserver +void CMediaSyncObserver::HandleSessionOpened(CMdESession& /*aSession*/, TInt aError) + { + __FLOG(_L8("CMediaSyncObserver::HandleSessionOpened - Entry")); + + HandleSessionCallback(aError); + + __FLOG(_L8("CMediaSyncObserver::HandleSessionOpened - Exit")); + } + +void CMediaSyncObserver::HandleSessionError(CMdESession& /*aSession*/, TInt aError) + { + __FLOG(_L8("CMediaSyncObserver::HandleSessionError - Entry")); + + HandleSessionCallback(aError); + + __FLOG(_L8("CMediaSyncObserver::HandleSessionError - Exit")); + } + +void CMediaSyncObserver::HandleSessionCallback(TInt aError) + { + __ASSERT_DEBUG(iSessionWait, User::Invariant()); + iMdeSessionError = aError; + if (iSessionWait->IsStarted()) + { + iSessionWait->AsyncStop(); + } + } + +/* + * After receiving object change notification, check if there is any dp subscribed right now. + * if none, store change into database + * if yes, check the type of file with subscribed providers, if there is any match, just forward + * the change to that dp, if none, store change into database. + */ +void CMediaSyncObserver::HandleObjectNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aObjectIdArray) + { + TRAPD(err, HandleObjectNotificationL(aSession, aType, aObjectIdArray)); + + if (err != KErrNone) + { + __FLOG(_L8("CMediaSyncObserver::HandleObjectNotification - Rollback database")); + iDb->Rollback(); + } + } + +/* + * L Function + */ +void CMediaSyncObserver::HandleObjectNotificationL(CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aObjectIdArray) + { + __FLOG(_L8("CMediaSyncObserver::HandleObjectNotificationL - Entry")); + + iDb->SaveNotificationsL(aObjectIdArray, aType, *iSession); + + __FLOG(_L8("CMediaSyncObserver::HandleObjectNotificationL - Exit")); + } + +/* + * Called to notify the observer that objects has been set + * to present or not present state in the metadata engine database. + */ +void CMediaSyncObserver::HandleObjectPresentNotification(CMdESession& aSession, + TBool aPresent, + const RArray& aObjectIdArray) + { + TRAPD(err, HandleObjectPresentNotificationL(aSession, aPresent, aObjectIdArray)); + + if (err != KErrNone) + { + __FLOG(_L8("CMediaSyncObserver::HandleObjectPresentNotification - Rollback database")); + iDb->Rollback(); + } + } + +/* + * L Function + */ +void CMediaSyncObserver::HandleObjectPresentNotificationL(CMdESession& /*aSession*/, + TBool aPresent, + const RArray& aObjectIdArray) + { + __FLOG(_L8("CMediaSyncObserver::HandleObjectPresentNotificationL - Entry")); + + iDb->SaveNotificationsL(aObjectIdArray, aPresent, *iSession); + + __FLOG(_L8("CMediaSyncObserver::HandleObjectPresentNotificationL - Exit")); + }