diff -r 000000000000 -r d0791faffa3f mtpdataproviders/mtpimagedp/src/cmtpimagedpmdeobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpmdeobserver.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,218 @@ +// 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 + +#include + +#include +#include +#include +#include + +#include "mtpdebug.h" +#include "mtpimagedpconst.h" +#include "cmtpimagedpmdeobserver.h" +#include "cmtpimagedp.h" +#include "cmtpimagedpobjectpropertymgr.h" +#include "mtpimagedputilits.h" + +__FLOG_STMT(_LIT8(KComponent, "CMTPImageDpMdeObserver");) + +CMTPImageDpMdeObserver* CMTPImageDpMdeObserver::NewL(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& aDataProvider) + { + CMTPImageDpMdeObserver* self = new (ELeave) CMTPImageDpMdeObserver(aFramework, aDataProvider); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } +// -------------------------------------------------------------------------- +// Constructor +// -------------------------------------------------------------------------- +// +CMTPImageDpMdeObserver::CMTPImageDpMdeObserver(MMTPDataProviderFramework& aFramework, CMTPImageDataProvider& aDataProvider) : + iFramework(aFramework), + iDataProvider(aDataProvider), + iSubscribed(EFalse) + { + } + +void CMTPImageDpMdeObserver::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("CMTPImageDpMdeObserver::ConstructL - Entry")); + __FLOG(_L8("CMTPImageDpMdeObserver::ConstructL - Exit")); + } + +CMTPImageDpMdeObserver::~CMTPImageDpMdeObserver() + { + __FLOG(_L8("CMTPImageDpMdeObserver::~CMTPImageDpMdeObserver - Entry")); + __FLOG(_L8("CMTPImageDpMdeObserver::~CMTPImageDpMdeObserver - Exit")); + __FLOG_CLOSE; + } + +void CMTPImageDpMdeObserver::CreateMetadataL(const CMdEObject& aMdeObject, CMTPObjectMetaData& aMetaData) + { + const TDesC& uri = aMdeObject.Uri(); + TParsePtrC parse(uri); + TMTPFormatCode format = iDataProvider.FindFormatL(parse.Ext().Mid(1)); + TInt32 storageId = MTPImageDpUtilits::FindStorage(iFramework, uri); + TUint32 parentHandle = MTPImageDpUtilits::FindParentHandleL(iFramework, iDataProvider, uri); + + aMetaData.SetUint(CMTPObjectMetaData::EDataProviderId, iFramework.DataProviderId()); + aMetaData.SetUint(CMTPObjectMetaData::EFormatCode, format); + aMetaData.SetUint(CMTPObjectMetaData::EStorageId, storageId); + aMetaData.SetDesCL(CMTPObjectMetaData::ESuid, uri); + aMetaData.SetUint(CMTPObjectMetaData::EParentHandle, parentHandle); + aMetaData.SetDesCL(CMTPObjectMetaData::EName, parse.Name()); + + //Increate the new pictures variable + ++iNewPics; + } + +void CMTPImageDpMdeObserver::ProcessMdeNotificationL(const RArray& aObjectIdArray, TObserverNotificationType /*aType*/) + { + __FLOG_VA((_L8("CMTPImageDpMdeObserver::ProcessMdeNotificationL Start"))); + + //Because image dp only subscribe add notification from MdS, only the add notifictions can reach here + //we ignore checking ENotifyAdd notification type to reduce complexity. + CMdESession& mdeSession = iDataProvider.PropertyMgr().MdeSession(); + CMdENamespaceDef& defaultNamespaceDef = mdeSession.GetDefaultNamespaceDefL(); + CMdEObjectDef& imageObjDef = defaultNamespaceDef.GetObjectDefL(MdeConstants::Image::KImageObject); + + TInt objectCount = aObjectIdArray.Count(); + for (TInt i(0); i < objectCount; ++i) + { + CMdEObject* mdeObject = mdeSession.GetObjectL(aObjectIdArray[i], imageObjDef); + if (mdeObject == NULL) + { + continue; + } + CleanupStack::PushL(mdeObject); + + TUint32 handle = iFramework.ObjectMgr().HandleL(mdeObject->Uri()); + if (handle == KMTPHandleNone) + { + CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC(); + CreateMetadataL(*mdeObject, *object); + iFramework.ObjectMgr().InsertObjectL(*object); + __FLOG_VA((_L16("Addition - Handle:%u, ObjectId:%u, URI:%S"), object->Uint(CMTPObjectMetaData::EHandle), aObjectIdArray[i], &mdeObject->Uri())); + + TMTPTypeEvent event; + event.SetUint16(TMTPTypeEvent::EEventCode, EMTPEventCodeObjectAdded); + event.SetUint32(TMTPTypeEvent::EEventSessionID, KMTPSessionAll); + event.SetUint32(TMTPTypeEvent::EEventTransactionID, KMTPTransactionIdNone); + + TUint32 handle = object->Uint(CMTPObjectMetaData::EHandle); + event.SetUint32(TMTPTypeEvent::EEventParameter1, handle); + iFramework.SendEventL(event); + __FLOG_VA((_L8("ProcessMdeNotificationL - EMTPEventCodeObjectAdd, object handle:%u"), handle)); + + CleanupStack::PopAndDestroy(object);//object + } + + CleanupStack::PopAndDestroy(mdeObject);//mdeObject + } + + __FLOG_VA((_L8("CMTPImageDpMdeObserver::ProcessMdeNotificationL - Exit"))); + } + +/* + * 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 CMTPImageDpMdeObserver::HandleObjectNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aObjectIdArray) + { + TRAP_IGNORE(HandleObjectNotificationL(aSession, aType, aObjectIdArray)); + } + +/* + * L Function + */ +void CMTPImageDpMdeObserver::HandleObjectNotificationL(CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aObjectIdArray) + { + __FLOG_VA((_L8("CMTPImageDpMdeObserver::HandleObjectNotificationL - changeType = %d"), aType)); + + ProcessMdeNotificationL(aObjectIdArray, aType); + + //Update RProperty to notify the subscribers. + if (iNewPics > 0) + { + __FLOG_1(_L16("CMTPImageDpMdeObserver::CMTPImageDpMdeObserver - New Pics: %u"), iNewPics); + MTPImageDpUtilits::UpdateNewPicturesValue(iDataProvider, iNewPics, ETrue); + iNewPics = 0; + } + + __FLOG(_L8("CMTPImageDpMdeObserver::CMTPImageDpMdeObserver - Exit")); + } + +/* + * Subscribe MdS notifications + */ +void CMTPImageDpMdeObserver::SubscribeForChangeNotificationL() + { + __FLOG_VA((_L8("CMTPImageDpMdeObserver::SubscribeForChangeNotificationL"))); + + if (!iSubscribed) + { + CMdESession& mdeSession = iDataProvider.PropertyMgr().MdeSession(); + + CMdENamespaceDef& def = mdeSession.GetDefaultNamespaceDefL(); + CMdEObjectDef& imageObjDef = def.GetObjectDefL(MdeConstants::Image::KImageObject); + + //Only subscribe add observer + CMdELogicCondition* addCondition = CMdELogicCondition::NewLC(ELogicConditionOperatorAnd); + CMdEPropertyDef& itemTypePropDef = imageObjDef.GetPropertyDefL(MdeConstants::Object::KItemTypeProperty); + addCondition->AddPropertyConditionL(itemTypePropDef, ETextPropertyConditionCompareEndsWith, _L("jpeg")); + mdeSession.AddObjectObserverL(*this, addCondition, ENotifyAdd); + CleanupStack::Pop(addCondition); + + iSubscribed = ETrue; + } + + __FLOG(_L8("CMTPImageDpMdeObserver::SubscribeForChangeNotificationL - Exit")); + } + +/* + * Unsubscribe MdS notifications + */ +void CMTPImageDpMdeObserver::UnsubscribeForChangeNotificationL() + { + __FLOG_VA((_L8("CMTPImageDpMdeObserver::UnsubscribeForChangeNotificationL"))); + + if (iSubscribed) + { + CMdESession& mdeSession = iDataProvider.PropertyMgr().MdeSession(); + + mdeSession.RemoveObjectObserverL(*this);//add observer + iSubscribed = EFalse; + } + + __FLOG(_L8("CMTPImageDpMdeObserver::UnsubscribeForChangeNotificationL - Exit")); + }