diff -r 000000000000 -r 2014ca87e772 imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagdaemon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagdaemon.cpp Tue Jan 26 15:18:05 2010 +0200 @@ -0,0 +1,472 @@ +/* +* Copyright (c) 2006-2007 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: Thumbnail Auto Generate Daemon +* +*/ + + +#include +#include + +#include +#include +#include +#include + +#include "thumbagdaemon.h" +#include "thumbnaillog.h" +#include "thumbnailmanagerconstants.h" +#include "thumbnailmanagerprivatecrkeys.h" + + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +CThumbAGDaemon* CThumbAGDaemon::NewLC() + { + TN_DEBUG1( "CThumbAGDaemon::NewLC() - begin" ); + + CThumbAGDaemon* self = new (ELeave) CThumbAGDaemon(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CThumbAGDaemon* CThumbAGDaemon::NewL() + { + TN_DEBUG1( "CThumbAGDaemon::NewL() - begin" ); + + CThumbAGDaemon* self = CThumbAGDaemon::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CThumbAGDaemon +// --------------------------------------------------------------------------- +// +CThumbAGDaemon::CThumbAGDaemon() + : CServer2( CActive::EPriorityStandard, CServer2::EUnsharableSessions ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CThumbAGDaemon::ConstructL() + { + TN_DEBUG1( "CThumbAGDaemon::ConstructL() - begin" ); + + StartL( KTAGDaemonName ); + +#ifdef _DEBUG + iAddCounter = 0; + iModCounter = 0; + iDelCounter = 0; +#endif + + if (DaemonEnabledL()) + { + TN_DEBUG1( "CThumbAGDaemon::ConstructL() - create observers" ); + + // create shutdown observer + iMDSShutdownObserver = CTMShutdownObserver::NewL( *this, KMdSPSShutdown, KMdSShutdown, EFalse ); + iShutdownObserver = CTMShutdownObserver::NewL( *this, KTAGDPSNotification, KShutdown, ETrue ); + iShutdown = EFalse; + + // create processor + iProcessor = NULL; + iProcessor = CThumbAGProcessor::NewL(); + + TN_DEBUG1( "CThumbAGDaemon::ConstructL() - connect to MDS" ); + + // connect to MDS + iMdESession = NULL; + iMdESession = CMdESession::NewL( *this ); + } + else + { + // no error here, but need to shutdown daemon neatly + User::Leave(KErrNone); + } + + TN_DEBUG1( "CThumbAGDaemon::ConstructL() - end" ); + } + +// --------------------------------------------------------------------------- +// ~CThumbAGDaemon +// --------------------------------------------------------------------------- +// +CThumbAGDaemon::~CThumbAGDaemon() + { + TN_DEBUG1( "CThumbAGDaemon::~CThumbAGDaemon() - begin" ); + + iShutdown = ETrue; + + delete iMDSShutdownObserver; + delete iShutdownObserver; + + if (iProcessor) + { + delete iProcessor; + iProcessor = NULL; + } + + if (iMdESession) + { + // 3 observers + TRAP_IGNORE( iMdESession->RemoveObjectObserverL( *this ) ); + TRAP_IGNORE( iMdESession->RemoveObjectObserverL( *this ) ); + TRAP_IGNORE( iMdESession->RemoveObjectObserverL( *this ) ); + TRAP_IGNORE(iMdESession->RemoveObjectPresentObserverL( * this )); + + delete iMdESession; + iMdESession = NULL; + } + + TN_DEBUG1( "CThumbAGDaemon::~CThumbAGDaemon() - end" ); + } + +// ----------------------------------------------------------------------------- +// CThumbnailServer::NewSessionL() +// ----------------------------------------------------------------------------- +// +CSession2* CThumbAGDaemon::NewSessionL( const TVersion& /*aVersion*/, + const RMessage2& /*aMessage*/ )const + { + // no services, no clients, no sessions + User::Leave(KErrNotSupported); + + //just for getting rid of compiler warning about missing return value + return NULL; + } + +// --------------------------------------------------------------------------- +// CThumbAGDaemon::ThreadFunctionL +// --------------------------------------------------------------------------- +// +void CThumbAGDaemon::ThreadFunctionL() + { + TN_DEBUG1( "CThumbAGDaemon::ThreadFunctionL() - begin" ); + + User::LeaveIfError( User::RenameThread( KTAGDaemonName ) ); + + CThumbAGDaemon* server = NULL; + CActiveScheduler* scheduler = new( ELeave )CActiveScheduler(); + + if ( scheduler ) + { + CActiveScheduler::Install( scheduler ); + + CleanupStack::PushL( scheduler ); + server = CThumbAGDaemon::NewL(); // Adds server in scheduler + + RProcess::Rendezvous( KErrNone ); + + CActiveScheduler::Start(); + + // comes here if server gets shut down + delete server; + + CleanupStack::PopAndDestroy( scheduler ); + } + + TN_DEBUG1( "CThumbAGDaemon::ThreadFunctionL() - end" ); + } + +// ----------------------------------------------------------------------------- +// CThumbAGDaemon::HandleSessionOpened +// ----------------------------------------------------------------------------- +// +void CThumbAGDaemon::HandleSessionOpened( CMdESession& /* aSession */, TInt aError ) + { + TN_DEBUG1( "CThumbAGDaemon::HandleSessionOpened"); + + if (aError == KErrNone) + { + iProcessor->SetMdESession(iMdESession); + TRAP_IGNORE(iProcessor->QueryForPlaceholdersL()); + + TRAPD( err, AddObserversL() ); + if (err != KErrNone) + { + TN_DEBUG2( "CThumbAGDaemon::HandleSessionOpened, AddObserversL error == %d", err ); + } + } + else + { + TN_DEBUG2( "CThumbAGDaemon::HandleSessionOpened error == %d", aError ); + } + } + +// ----------------------------------------------------------------------------- +// CThumbAGDaemon::HandleSessionError +// ----------------------------------------------------------------------------- +// +void CThumbAGDaemon::HandleSessionError( CMdESession& /*aSession*/, TInt aError ) + { + if (aError != KErrNone) + { + TN_DEBUG2( "CThumbAGDaemon::HandleSessionError == %d", aError ); + } + } + +// ----------------------------------------------------------------------------- +// CThumbAGDaemon::HandleObjectNotification +// ----------------------------------------------------------------------------- +// +void CThumbAGDaemon::HandleObjectNotification( CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aObjectIdArray ) + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectNotification() - begin" ); + + // no processor or shutting down + if (!iProcessor || iShutdown) + { + return; + } + +#ifdef _DEBUG + if (aType == ENotifyAdd) + { + TN_DEBUG2( "CThumbAGDaemon::HandleObjectNotification() - ENotifyAdd %d", aObjectIdArray.Count() ); + iAddCounter = iAddCounter + aObjectIdArray.Count(); + } + else if (aType == ENotifyModify) + { + TN_DEBUG2( "CThumbAGDaemon::HandleObjectNotification() - ENotifyModify %d", aObjectIdArray.Count() ); + iModCounter = iModCounter + aObjectIdArray.Count(); + } + else if (aType == ENotifyRemove) + { + TN_DEBUG2( "CThumbAGDaemon::HandleObjectNotification() - ENotifyRemove %d", aObjectIdArray.Count() ); + iDelCounter = iDelCounter + aObjectIdArray.Count(); + } +#endif + + if ( (aType == ENotifyAdd || aType == ENotifyModify || aType == ENotifyRemove) && + (aObjectIdArray.Count() > 0) ) + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectNotification() - AddToQueueL" ); + + // If delete event, remove IDs from Modify and Add queues + if ( aType == ENotifyRemove ) + { + iProcessor->RemoveFromQueues( aObjectIdArray ); + } + + // Add event to processing queue by type and enable force run + TRAPD(err, iProcessor->AddToQueueL(aType, aObjectIdArray, EFalse)); + if (err != KErrNone) + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectNotification() - error adding to queue" ); + } + } + else + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectNotification() - bad notification" ); + } + +#ifdef _DEBUG + TN_DEBUG6( "CThumbAGDaemon::IN-COUNTERS---------- Type: %d Amount: %d, Add = %d Modify = %d Delete = %d", + aType, aObjectIdArray.Count(), iAddCounter, iModCounter, iDelCounter ); +#endif + + TN_DEBUG1( "CThumbAGDaemon::HandleObjectNotification() - end" ); + } + +// ----------------------------------------------------------------------------- +// CThumbAGDaemon::HandleObjectPresentNotification +// ----------------------------------------------------------------------------- +// +void CThumbAGDaemon::HandleObjectPresentNotification(CMdESession& /*aSession*/, + TBool aPresent, const RArray& aObjectIdArray) + { + TN_DEBUG3( "CThumbAGDaemon::HandleObjectPresentNotification() - aPresent == %d count == %d", aPresent, aObjectIdArray.Count() ); + + // no processor or shutting down + if (!iProcessor || iShutdown) + { + return; + } + + TInt err = 0; + + //tread present objects as added + if(aPresent) + { + TRAP_IGNORE( iProcessor->QueryForPlaceholdersL()); + if ( aObjectIdArray.Count() > 0) + { + // do not force run of these items + TRAP(err, iProcessor->AddToQueueL(ENotifyModify, aObjectIdArray, ETrue)); + + TN_DEBUG2( "CThumbAGDaemon::HandleObjectPresentNotification() - ENotifyAdd %d", aObjectIdArray.Count() ); + + +#ifdef _DEBUG + iAddCounter = iAddCounter + aObjectIdArray.Count(); + if (err != KErrNone) + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectPresentNotification() - error adding to queue" ); + } +#endif + } + } + else + { + TN_DEBUG1( "CThumbAGDaemon::HandleObjectPresentNotification() - handle not present" ); + TRAP_IGNORE( iProcessor->QueryForPlaceholdersL() ); +#ifdef _DEBUG + if( iModCounter < aObjectIdArray.Count() ) + { + iModCounter = 0; + } + else + { + iModCounter = iModCounter - aObjectIdArray.Count(); + } +#endif + + if ( aObjectIdArray.Count() > 0) + { + iProcessor->RemoveFromQueues( aObjectIdArray, ETrue ); + } + } + + #ifdef _DEBUG + TN_DEBUG5( "CThumbAGDaemon::IN-COUNTERS---------- Amount: %d, Add = %d Modify = %d Delete = %d", + aObjectIdArray.Count(), iAddCounter, iModCounter, iDelCounter ); + #endif + + TN_DEBUG1( "CThumbAGDaemon::HandleObjectPresentNotification() - end" ); + } + +// ----------------------------------------------------------------------------- +// CThumbAGDaemon::ShutdownNotification +// ----------------------------------------------------------------------------- +// +void CThumbAGDaemon::ShutdownNotification() + { + TN_DEBUG1( "CThumbAGDaemon::ShutdownNotification()" ); + + if (!iShutdown) + { + CActiveScheduler::Stop(); + iShutdown = ETrue; + } + } + +// --------------------------------------------------------------------------- +// CThumbAGDaemon::AddObserversL +// --------------------------------------------------------------------------- +// +void CThumbAGDaemon::AddObserversL() + { + TN_DEBUG1( "CThumbAGDaemon::AddObserversL() - begin" ); + + CMdENamespaceDef& defaultNamespace = iMdESession->GetDefaultNamespaceDefL(); + CMdEObjectDef& imageDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject ); + CMdEObjectDef& videoDef = defaultNamespace.GetObjectDefL( MdeConstants::Video::KVideoObject ); + CMdEObjectDef& audioDef = defaultNamespace.GetObjectDefL( MdeConstants::Audio::KAudioObject ); + + // set observing conditions + CMdELogicCondition* addCondition = CMdELogicCondition::NewLC( ELogicConditionOperatorOr ); + addCondition->AddObjectConditionL( imageDef ); + addCondition->AddObjectConditionL( videoDef ); + addCondition->AddObjectConditionL( audioDef ); + CleanupStack::Pop( addCondition ); + + CMdELogicCondition* modifyCondition = CMdELogicCondition::NewLC( ELogicConditionOperatorOr ); + modifyCondition->AddObjectConditionL( imageDef ); + modifyCondition->AddObjectConditionL( videoDef ); + modifyCondition->AddObjectConditionL( audioDef ); + CleanupStack::Pop( modifyCondition ); + + // add observer + iMdESession->AddObjectObserverL( *this, addCondition, ENotifyAdd ); + + // modify observer + iMdESession->AddObjectObserverL( *this, modifyCondition, ENotifyModify ); + + // remove observer + iMdESession->AddObjectObserverL( *this, NULL, ENotifyRemove ); + + // object present observer + iMdESession->AddObjectPresentObserverL( *this ); + + TN_DEBUG1( "CThumbAGDaemon::AddObserversL() - end" ); + } + +// --------------------------------------------------------------------------- +// CThumbAGDaemon::DaemonEnabledL +// --------------------------------------------------------------------------- +// +TBool CThumbAGDaemon::DaemonEnabledL() + { + TN_DEBUG1( "CThumbAGDaemon::DaemonEnabledL() - begin" ); + CRepository* rep = CRepository::NewL( TUid::Uid( THUMBNAIL_CENREP_UID )); + + // get value + TBool val( EFalse ); + TInt ret = rep->Get( KEnableDaemon, val ); + + delete rep; + TN_DEBUG3( "CThumbAGDaemon::DaemonEnabledL() - val == %d, ret == %d", val, ret ); + return val; + } + +// --------------------------------------------------------------------------- +// E32Main +// --------------------------------------------------------------------------- +// +TInt E32Main() + { + TN_DEBUG1( "CThumbAGDaemon::E32Main() - begin" ); + + __UHEAP_MARK; + + CTrapCleanup* cleanup = CTrapCleanup::New(); + TInt result = KErrNoMemory; + + if ( cleanup ) + { + TRAP( result, CThumbAGDaemon::ThreadFunctionL()); + delete cleanup; + } + + if ( result != KErrNone ) + { + TN_DEBUG1( "CThumbAGDaemon::E32Main() - error" ); + + // Signal the client that server creation failed + RProcess::Rendezvous( result ); + } + + __UHEAP_MARKEND; + + TN_DEBUG1( "CThumbAGDaemon::E32Main() - end" ); + + return result; + } + +// End of file