diff -r 000000000000 -r c53acadfccc6 harvester/server/src/mdeobjecthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/server/src/mdeobjecthandler.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2008-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: +*/ + +#include "mdeobjecthandler.h" +#include "mdesession.h" +#include "harvesterdata.h" +#include "harvesterlog.h" +#include "harvesterplugin.h" +#include "mdeconstants.h" +#include "mdsutils.h" +#include + +using namespace MdeConstants; + +CMdeObjectHandler::CMdeObjectHandler( CMdESession& aSession ) : iDefaultNamespace( NULL ) + { + iMdeSession = &aSession; + } + + +CMdeObjectHandler::~CMdeObjectHandler() + { + iFs.Close(); + } + +CMdeObjectHandler* CMdeObjectHandler::NewLC( CMdESession& aSession ) + { + CMdeObjectHandler* self = new (ELeave)CMdeObjectHandler( aSession ); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CMdeObjectHandler* CMdeObjectHandler::NewL( CMdESession& aSession ) + { + CMdeObjectHandler* self=CMdeObjectHandler::NewLC( aSession ); + CleanupStack::Pop(); // self; + return self; + } + +void CMdeObjectHandler::ConstructL() + { + iDefaultNamespace = &iMdeSession->GetDefaultNamespaceDefL(); + User::LeaveIfError( iFs.Connect() ); + } + +void CMdeObjectHandler::SetMetadataObjectL( CHarvesterData& aHD ) + { + WRITELOG( "CMdeObjectHandler::SetMetadataObjectL()" ); + + TTime time( 0 ); + time.UniversalTime(); + CMdEEventDef* eventDef = NULL; + CMdEObject& mdeObject = aHD.MdeObject(); + + const THarvesterEventType type( aHD.EventType() ); + if ( type == EHarvesterAdd ) + { + if( aHD.IsBinary() && !MdsUtils::FileExists( iFs, mdeObject.Uri() )) + { + const TDesC16& uri = mdeObject.Uri(); + WRITELOG1( "CMdeObjectHandler::SetMetadataObjectL - File doesn't exist any more! Uri: %S", &uri ); + aHD.SetErrorCode( KMdEErrHarvestingFailedPermanent ); + return; + } + + const TInt id( iMdeSession->AddObjectL( mdeObject ) ); + if( id == KNoId ) + { + // If add failure occures, retry + iMdeSession->AddObjectL( mdeObject ); + } + + if ( mdeObject.Id() == 0 ) + { + const TDesC16& uri = mdeObject.Uri(); + WRITELOG1( "CMdeObjectHandler::SetMetadataObjectL - Adding to db failed! Uri: %S", &uri ); + aHD.SetErrorCode( KMdEErrHarvestingFailedPermanent ); + return; + } + + // Since event was EHarvesterAdd + eventDef = &iDefaultNamespace->GetEventDefL( Events::KCreated ); + } + else if ( type== EHarvesterEdit ) + { + iMdeSession->CommitObjectL( mdeObject ); + eventDef = &iDefaultNamespace->GetEventDefL( Events::KEdited ); + } + + RPointerArray relationEventArray; + TCleanupItem cleanupItem( MdsUtils::CleanupPtrArray, &relationEventArray ); + CleanupStack::PushL( cleanupItem ); + + // If additional parameters are given, add relations between metadata objects and albums. + if ( aHD.ClientData() ) + { + WRITELOG( "CMdeObjectHandler::SetMetadataObjectL() - Creating album relations." ); + + CMdERelationDef& albumRelationDef = iDefaultNamespace-> + GetRelationDefL( Relations::KContains ); + + TItemId objectId = mdeObject.Id(); + if ( objectId != 0 ) + { + CHarvestClientData* clientData = STATIC_CAST( CHarvestClientData*, aHD.ClientData() ); + const TInt count = clientData->iAlbumIds.Count(); + for ( TInt i = 0 ; i < count; i++ ) + { + TItemId albumId = clientData->iAlbumIds[i]; + + WRITELOG1( "CMdeObjectHandler::SetMetadataObjectL() - AlbumID: %d", albumId ); + CMdERelation* relation = + iMdeSession->NewRelationLC( + albumRelationDef, albumId, objectId, 0 ); + relationEventArray.Append( STATIC_CAST( CMdEInstanceItem*, relation ) ); + CleanupStack::Pop(); + } + } + } + + if ( eventDef ) + { + WRITELOG( "CMdeObjectHandler::SetMetadataObjectL() - Creating event array" ); + const TItemId objectId = mdeObject.Id(); + if ( objectId != 0 ) + { + CMdEEvent* event = iMdeSession->NewEventLC( + *eventDef, objectId, time ); + relationEventArray.Append( STATIC_CAST( CMdEInstanceItem*, event ) ); + CleanupStack::Pop(); + } + } + + if ( relationEventArray.Count() > 0 ) + { +#ifdef _DEBUG + WRITELOG1( "CMdeObjectHandler::SetMetadataObjectL() - Event and relation array count: %d", relationEventArray.Count() ); +#endif + iMdeSession->AddItemsL( relationEventArray ); + } + + CleanupStack::PopAndDestroy( &relationEventArray ); + } + +// --------------------------------------------------------------------------- +// GetMetadataObjectL +// --------------------------------------------------------------------------- +// +CMdEObject* CMdeObjectHandler::GetMetadataObjectL( CHarvesterData& aHD, const TDesC& aObjectDefStr ) + { + WRITELOG( "CMdeObjectHandler::GetMetadataObjectL()" ); + + CMdEObjectDef& mdeObjectDef = + iDefaultNamespace->GetObjectDefL( aObjectDefStr ); + + if ( aHD.EventType() == EHarvesterEdit ) + { + if( aHD.IsBinary() ) + { + // Checking whether file is open + TBool isOpen( EFalse ); + TInt error = iFs.IsFileOpen( aHD.Uri(), isOpen ); + if ( error != KErrNone ) + { + WRITELOG1( "CMdeObjectHandler::GetMetadataObjectL() - file error %d", error ); + User::Leave( error ); + } + if ( isOpen ) + { + // The file can be open, as long as it is not open for modification anywhere + RFile64 tempFile; + error = tempFile.Open( iFs, aHD.Uri(), EFileRead | EFileShareReadersOnly ); + if( error != KErrNone ) + { + WRITELOG( "CMdeObjectHandler::GetMetadataObjectL() - file handle is open! Returning." ); + return NULL; + } + tempFile.Close(); + } + } + + WRITELOG( "CMdeObjectHandler::GetMetadataObjectL() - open object" ); + return iMdeSession->OpenObjectL( aHD.Uri(), mdeObjectDef ); + } + + WRITELOG( "CMdeObjectHandler::GetMetadataObjectL() - new object" ); + CMdEObject* mdeObject = iMdeSession->NewObjectL( mdeObjectDef, aHD.Uri() ); + + return mdeObject; + }