--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/contentharvesterplugin/src/glxcontentharvesterpluginbase.cpp Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,570 @@
+/*
+ * 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: Updates CPS storage
+ *
+ */
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <featmgr.h>
+#include <apgtask.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include <liwservicehandler.h>
+#include <glxuistd.h> // KGlxFetchontextPriorityNormal and KGlxIconsFilename
+#include <AknIconUtils.h>
+#include <data_caging_path_literals.hrh>
+
+#include <glxattributecontext.h>
+#include <glxtracer.h>
+#include <glxlog.h>
+#include <mglxmedialist.h> // for MGlxMediaList
+#include <glxcollectiongeneraldefs.h>
+#include <glxgallery.hrh> // for KGlxGalleryApplicationUid
+#include <glxfilterfactory.h>
+#include <glxuistd.h>
+#include <glxthumbnailcontext.h>
+#include <glxmedialistiterator.h>
+#include <mglxcache.h>
+
+#include "glxcontentharvesterplugin.h"
+#include "glxcontentharvesterpluginbase.h"
+#include "glxcontentharvesterplugin.hrh"
+#include "glxmapconstants.h"
+#include "glxcontentharvesterpluginalbums.h"
+
+// Matrixmenu uid - needed to check if photo suite is in foreground
+const TInt KMatrixMenuUid = 0x101F4CD2;
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CGlxContentHarvesterPluginBase::CGlxContentHarvesterPluginBase( )
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::CGlxContentHarvesterPluginBase" );
+ // No Implementation
+ }
+
+// ----------------------------------------------------------------------------
+// Symbian 2nd phase constructor.
+// ----------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::ConstructL(TInt aDefaultIconId )
+ {
+ SetGridIconSizeL();
+ TSize gridIconSize = GetGridIconSize();
+ TFileName resFile(KDC_APP_BITMAP_DIR);
+ resFile.Append(KGlxIconsFilename);
+ iBitmap = AknIconUtils::CreateIconL(resFile,aDefaultIconId);
+ AknIconUtils::SetSize(iBitmap, gridIconSize);
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CGlxContentHarvesterPluginBase::~CGlxContentHarvesterPluginBase()
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::~CGlxContentHarvesterPluginBase" );
+ if ( iCPSNotificationInterface )
+ {
+ iCPSNotificationInterface->Close();
+ }
+
+ delete iServiceHandler;
+
+ if(iBitmap)
+ {
+ delete iBitmap;
+ iBitmap=NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetGridIconSizeL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::SetGridIconSizeL()
+ {
+ TRACER("CGlxContentHarvesterPluginBase::SetGridIconSizeL()");
+ // Sets up TLS, must be done before FeatureManager is used.
+ FeatureManager::InitializeLibL();
+
+ if(FeatureManager::FeatureSupported( KFeatureIdLayout640_360_Touch ) || FeatureManager::FeatureSupported( KFeatureIdLayout360_640_Touch ))
+ {
+ iGridIconSize = TSize(111,83);
+ }
+ else if(FeatureManager::FeatureSupported(KFeatureIdLayout640_480_Touch) || FeatureManager::FeatureSupported(KFeatureIdLayout480_640_Touch) ||
+ FeatureManager::FeatureSupported(KFeatureIdLayout640_480) || FeatureManager::FeatureSupported(KFeatureIdLayout480_640))
+ {
+ iGridIconSize = TSize(146,110);
+ }
+ else
+ {
+ iGridIconSize = TSize(146,110);
+ }
+ // Frees the TLS. Must be done after FeatureManager is used.
+ FeatureManager::UnInitializeLib();
+ }
+
+// ---------------------------------------------------------------------------
+// GetGridIconSize
+// ---------------------------------------------------------------------------
+//
+TSize CGlxContentHarvesterPluginBase::GetGridIconSize()
+ {
+ TRACER("CGlxContentHarvesterPluginBase::GetGridIconSize()");
+ return iGridIconSize;
+ }
+
+// ---------------------------------------------------------------------------
+// GetBitmapHandle
+// ---------------------------------------------------------------------------
+//
+TInt CGlxContentHarvesterPluginBase::GetBitmapHandle() const
+ {
+ TRACER("CGlxContentHarvesterPluginBase::GetBitmapHandle");
+ return iBitmap->Handle();
+ }
+
+// ---------------------------------------------------------------------------
+// GetInterfaceForNotificationL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::GetInterfaceForNotificationL()
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::GetInterfaceForNotificationL" );
+ // create Service Handler and keep as long as access to Service needed
+ iServiceHandler = CLiwServiceHandler::NewL();
+ //keep for convenience, not owned
+ iInParamList = &iServiceHandler->InParamListL();
+ iOutParamList = &iServiceHandler->OutParamListL();
+
+ RCriteriaArray criteriaArray;
+ CleanupResetAndDestroyPushL( criteriaArray );
+
+ // create Liw criteria
+ CLiwCriteriaItem* criterion =
+ CLiwCriteriaItem::NewLC( KLiwCmdAsStr, KCPInterface, KCPService );
+ criterion->SetServiceClass( TUid::Uid( KLiwClassBase ) );
+
+ criteriaArray.AppendL( criterion );
+ CleanupStack::Pop( criterion );
+
+ // attach Liw criteria
+ iServiceHandler->AttachL( criteriaArray );
+ // get Service interface
+ iServiceHandler->ExecuteServiceCmdL( *criterion,
+ *iInParamList,
+ *iOutParamList );
+
+ CleanupStack::PopAndDestroy( &criteriaArray );
+
+ // extract interface from output params
+ TInt pos( 0 );
+ iOutParamList->FindFirst( pos, KCPInterface );
+ if( pos != KErrNotFound )
+ {
+ iCPSNotificationInterface =
+ (*iOutParamList)[pos].Value().AsInterface();
+ }
+
+ iInParamList->Reset();
+ iOutParamList->Reset();
+
+ if ( !iCPSNotificationInterface )
+ {
+ // handle no Service
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// RequestCpsNotificationL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::RequestCpsNotificationL(TInt aSuiteItem)
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::RequestCpsNotificationL" );
+
+ TLiwGenericParam cptype( KType, TLiwVariant( KPublisherId ));
+ iInParamList->AppendL( cptype );
+
+ //create filter
+ CLiwDefaultMap* filterMap = CLiwDefaultMap::NewLC();
+ filterMap->InsertL( KPublisherId, TLiwVariant( KSuitePublisher ));
+
+ switch (aSuiteItem)
+ {
+ case KItemIndexMonths:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationMonths ) );
+ break;
+ case KItemIndexAlbums:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAlbums ) );
+ break;
+ case KItemIndexTags:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationTags ) );
+ break;
+ case KItemIndexAll:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAll ) );
+ break;
+ }
+
+ filterMap->InsertL( KContentId, TLiwVariant( KContentDefault ) );
+
+ //we are only interested in update events
+ filterMap->InsertL( KOperation, TLiwVariant( KOperationUpdate ) );
+
+ TLiwGenericParam filter( KFilter, TLiwVariant( filterMap ));
+ iInParamList->AppendL( filter );
+
+ iCPSNotificationInterface->ExecuteCmdL( KRequestNotification,
+ *iInParamList,
+ *iOutParamList,
+ KLiwOptASyncronous,
+ this );
+
+ CleanupStack::PopAndDestroy( filterMap );
+ filter.Reset();
+ cptype.Reset();
+
+ iInParamList->Reset();
+ iOutParamList->Reset();
+ }
+
+// ---------------------------------------------------------------------------
+// SetupPublisherL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::SetupPublisherL(TInt aSuiteItem)
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::SetupPublisherL" );
+
+ //add mandatory type param
+ TLiwGenericParam cptype( KType, TLiwVariant( KPublisherId ));
+ iInParamList->AppendL( cptype );
+
+ //create publisher definition
+ CLiwDefaultMap* filterMap = CLiwDefaultMap::NewLC();
+ filterMap->InsertL( KPublisherId, TLiwVariant( KSuitePublisher ));
+ switch (aSuiteItem)
+ {
+ case KItemIndexMonths:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationMonths ) );
+ break;
+ case KItemIndexAlbums:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAlbums ) );
+ break;
+ case KItemIndexTags:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationTags ) );
+ break;
+ case KItemIndexAll:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAll ) );
+ break;
+ }
+ filterMap->InsertL( KContentId, TLiwVariant( KContentDefault ) );
+ // initial value for activation flag
+ filterMap->InsertL( KFlag, TLiwVariant( TUint(0) ) );
+
+
+ // prepare Access Control List for the publisher
+ CLiwDefaultMap* cpsAclMap = CLiwDefaultMap::NewLC();
+ CLiwDefaultMap* cpsAclWriteMap = CLiwDefaultMap::NewLC();
+ CLiwDefaultMap* cpsAclReadMap = CLiwDefaultMap::NewLC();
+
+ // write policy - allow only MatrixMenu,
+ // Matrix has 2 UIDs:
+ // - 0x20012474 is used if it is compiled as a standalone application
+ // - 0x101F4CD2 is used if it should replace AppShell
+ // add both for convenience
+ cpsAclWriteMap->InsertL( KUIDs, TLiwVariant( _L("0x101F4CD2:0x20012474") ) );
+
+ // read policy - allow only the Content Harvester plug-in,
+ // this plug-in runs inside Content Harvester server - UID 0x10282E5A
+ cpsAclReadMap->InsertL( KUIDs, TLiwVariant( _L("0x10282E5A") ) );
+
+ cpsAclMap->InsertL( KACLWrite, TLiwVariant( cpsAclWriteMap ) );
+ cpsAclMap->InsertL( KACLRead, TLiwVariant( cpsAclReadMap ) );
+
+ filterMap->InsertL( KAccessList, TLiwVariant( cpsAclMap ) );
+
+ // create a dummy data map,
+ // mandatory for adding publisher data - can be left empty
+ CLiwDefaultMap* cpsDummyDataMap = CLiwDefaultMap::NewLC();
+ filterMap->InsertL( KDataMap, TLiwVariant( cpsDummyDataMap ) );
+
+ TLiwGenericParam cpsItemParam( KItem, TLiwVariant( filterMap ) );
+ iInParamList->AppendL( cpsItemParam );
+
+
+ iCPSNotificationInterface->ExecuteCmdL( KAdd,
+ *iInParamList,
+ *iOutParamList,
+ 0,
+ NULL );
+ CleanupStack::PopAndDestroy( cpsDummyDataMap );
+ CleanupStack::PopAndDestroy( cpsAclReadMap );
+ CleanupStack::PopAndDestroy( cpsAclWriteMap );
+ CleanupStack::PopAndDestroy( cpsAclMap );
+ CleanupStack::PopAndDestroy( filterMap );
+ cpsItemParam.Reset();
+ // filter.Reset();
+ cptype.Reset();
+
+ iInParamList->Reset();
+ iOutParamList->Reset();
+ }
+
+// ---------------------------------------------------------------------------
+// HandleStateChangeL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::HandleStateChangeL(TInt aSuiteItem)
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::HandleStateChangeL" );
+
+ TLiwGenericParam cptype( KType, TLiwVariant( KPublisher ));
+ iInParamList->AppendL( cptype );
+
+ CLiwDefaultMap* filterMap = CLiwDefaultMap::NewLC();
+ filterMap->InsertL( KPublisherId, TLiwVariant( KSuitePublisher ));
+ switch (aSuiteItem)
+ {
+ case KItemIndexMonths:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationMonths ) );
+ break;
+
+ case KItemIndexAlbums:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAlbums ) );
+ break;
+
+ case KItemIndexTags:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationTags ) );
+ break;
+
+ case KItemIndexAll:
+ filterMap->InsertL( KContentType, TLiwVariant( KContentActivationAll ) );
+ break;
+ }
+
+ TLiwGenericParam filter( KFilter, TLiwVariant( filterMap ));
+ iInParamList->AppendL( filter );
+
+
+ iCPSNotificationInterface->ExecuteCmdL( KGetList,
+ *iInParamList,
+ *iOutParamList,
+ 0,
+ NULL );
+
+ CleanupStack::PopAndDestroy( filterMap );
+
+ filter.Reset();
+ cptype.Reset();
+
+ TInt posStat( 0 );
+ iOutParamList->FindFirst( posStat, KResults );
+ if( posStat != KErrNotFound )
+ {
+ // status info present - extract and return
+ CLiwIterable* results = (*iOutParamList)[posStat].Value().AsIterable();
+ TLiwVariant cpdata;
+ if ( results->NextL( cpdata ) )
+ {
+ const CLiwMap* map = cpdata.AsMap();
+ TLiwVariant dataMapVar;
+ if ( map->FindL( _L8("flag"), dataMapVar ) )
+ {
+ ActivateL(dataMapVar.AsTInt32());
+ }
+ dataMapVar.Reset();
+ }
+ cpdata.Reset();
+ }
+ else
+ {
+ // no return value
+ // this will happen if suite was never activated/deactivated before
+ // handle gracefuly - ignore and wait for action ;]
+ }
+
+ iInParamList->Reset();
+ iOutParamList->Reset();
+
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGlxContentHarvesterPluginBase::FillInputListWithDataL()
+// ----------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::FillInputListWithDataL(
+ CLiwGenericParamList* aInParamList,
+ const TDesC& aPublisherId, const TDesC& aContentType,
+ const TDesC& aContentId, TInt aHandle)
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::FillInputListWithDataL" );
+
+ aInParamList->Reset();
+
+ TLiwGenericParam cptype( KType, TLiwVariant( KCpData ));
+ aInParamList->AppendL( cptype );
+
+ CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC();
+ CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+
+ if(aHandle)
+ {
+ map->InsertL( KFirstIcon, TLiwVariant( (TInt32)aHandle) );
+ }
+
+ cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId ));
+ cpdatamap->InsertL( KContentType, TLiwVariant( aContentType ));
+ cpdatamap->InsertL( KContentId, TLiwVariant( aContentId ));
+ cpdatamap->InsertL( KDataMap, TLiwVariant(map) );
+
+ TLiwGenericParam item( KItem, TLiwVariant( cpdatamap ));
+ aInParamList->AppendL( item );
+ CleanupStack::PopAndDestroy( map );
+ CleanupStack::PopAndDestroy( cpdatamap );
+ item.Reset();
+ cptype.Reset();
+
+ }
+
+// ---------------------------------------------------------------------------
+// CreateMedialistAndThumbnailContextL
+// ---------------------------------------------------------------------------
+//
+MGlxMediaList* CGlxContentHarvesterPluginBase::CreateMedialistAndThumbnailContextL(const TGlxMediaId&
+ aPluginId,CGlxThumbnailContext* aThumbnailContext) const
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::CreateMedialistAndThumbnailContextL" );
+
+ CMPXCollectionPath* path = CMPXCollectionPath::NewL();
+ CleanupStack::PushL( path );
+ path->AppendL( aPluginId.Value() );
+
+ CMPXFilter* filter = NULL;
+ filter = TGlxFilterFactory::CreatePreviewFilterL();
+ CleanupStack::PushL( filter );
+
+ MGlxMediaList* mediaList = MGlxMediaList::InstanceL( *path, KGlxIdNone , filter);
+ CleanupStack::PopAndDestroy( filter );
+ CleanupStack::PopAndDestroy( path );
+ aThumbnailContext->SetDefaultSpec(iGridIconSize.iWidth,iGridIconSize.iHeight);
+ return mediaList;
+ }
+
+// ---------------------------------------------------------------------------
+// CGlxContentHarvesterPluginBase::IsFocused
+// ---------------------------------------------------------------------------
+//
+TBool CGlxContentHarvesterPluginBase::IsFocused() const
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::IsFocused" );
+ GLX_LOG_INFO1("CGlxContentHarvesterPluginBase::IsFocused,isFocused=%d",iIsFocused);
+ return iIsFocused;
+ }
+
+// ---------------------------------------------------------------------------
+// CGlxContentHarvesterPluginBase::Focused
+// ---------------------------------------------------------------------------
+//
+TBool CGlxContentHarvesterPluginBase::Focused()
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::Focused" );
+ GLX_LOG_INFO1("CGlxContentHarvesterPluginBase::Focused(%d)", iIsFocused);
+ return iIsFocused;
+ }
+
+// ---------------------------------------------------------------------------
+// CGlxContentHarvesterPluginBase::SetFocus
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::SetFocus(TBool aFocus )
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::SetFocus" );
+ iIsFocused=aFocus;
+ }
+
+// ---------------------------------------------------------------------------
+// ContainerCacheCleanupL
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::ContainerCacheCleanupL(MGlxMediaList* aMediaList)
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::ContainerCacheCleanupL" );
+
+ if ( IsMatrixMenuInForegroundL() )
+ {
+ MGlxCache* cacheManager = MGlxCache::InstanceL();
+ for(TInt i=0 ; i< aMediaList->Count();i++)
+ {
+ GLX_LOG_INFO1("CGlxContentHarvesterPluginBase::ForceCleanupMedia(%d)", i);
+ cacheManager->ForceCleanupMedia(aMediaList->IdSpaceId(i),
+ aMediaList->Item(i).Id());
+ }
+ cacheManager->Close();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// IsMatrixMenuInForegroundL
+// ---------------------------------------------------------------------------
+//
+TBool CGlxContentHarvesterPluginBase::IsMatrixMenuInForegroundL()
+ {
+ TRACER( "CGlxContentHarvesterPluginBase::IsMatrixMenuInForegroundL" );
+
+ RWsSession wssession;
+ User::LeaveIfError(wssession.Connect());
+ CleanupClosePushL(wssession);
+
+ TApaTaskList taskList( wssession );
+ TApaTask task = taskList.FindApp( TUid::Uid( KMatrixMenuUid ) );
+ // get fopreground app
+ TApaTask taskForeGround = taskList.FindByPos(0);
+
+ if ( task.Exists() && task.ThreadId() == taskForeGround.ThreadId() )
+ {
+ CleanupStack::PopAndDestroy( &wssession );
+ return ETrue;
+ }
+ CleanupStack::PopAndDestroy( &wssession );
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// SetCHPlugin
+// ---------------------------------------------------------------------------
+//
+void CGlxContentHarvesterPluginBase::SetCHPlugin(MGlxContentHarvesterPlugin* aCHplugin)
+ {
+ iCHplugin = aCHplugin;
+ }
+
+// ---------------------------------------------------------------------------
+// GetCHPlugin
+// ---------------------------------------------------------------------------
+//
+MGlxContentHarvesterPlugin* CGlxContentHarvesterPluginBase::GetCHPlugin()
+ {
+ return iCHplugin;
+ }
+
+// EOF