--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp Wed Sep 01 12:30:40 2010 +0100
@@ -0,0 +1,1570 @@
+/*
+* Copyright (c) 2005 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: This file implements the Screen Saver Animation Plugin which
+* is used by Screen Saver application to load animation
+* screen savers.
+*
+*/
+
+
+
+
+
+#include <eikenv.h>
+#include <bautils.h>
+#include <apgcli.h>
+#include <data_caging_path_literals.hrh>
+#include <centralrepository.h>
+#include <DRMHelper.h>
+#include <aknnotewrappers.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <npupp.h>
+#include <cecombrowserplugininterface.h>
+#include <browserplugininterface.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include <DRMHelperServerInternalCRKeys.h>
+#include <NPNExtensions.h>
+#include <screensaveranimplugin.rsg>
+#include <coecntrl.h>
+#include "ScreenSaverAnimPluginInternalCRKeys.h"
+#include "ScreenSaverAnimPlugin.h"
+#include "ScreenSaverAnimPluginContainer.h"
+#include "ScreenSaverAnimSettingDialog.h"
+#include "NpnImplementation.h"
+#include "ScreenSaverAnimPluginHelper.h"
+
+// Constants
+#ifdef SCREENSAVER_LOG_ENABLED
+const TInt KMaxBufLen = 64;
+#endif
+const TInt KSixteenBytes = 128;
+const TInt KUrlMaxLen = 1024;
+
+// Animation Timeout values
+const TInt KMinDurationValue = 5;
+const TInt KMaxDurationValue = 60;
+const TInt KDefaultDurationValue = 5;
+
+// Backlight Values
+const TInt KMinBackLightValue = 0;
+const TInt KMaxBackLightValue = 30;
+const TInt KDefaultBackLightValue = 0;
+
+const TInt KScreensaverAnimPluginInterfaceUid = 0x102750CB;
+
+
+_LIT( KResourceFileName, "Z:ScreenSaverAnimPlugin.rsc" );
+
+
+CScreenSaverAnimSettingObject::CScreenSaverAnimSettingObject()
+ {
+ iAnimationTimeout = KDefaultDurationValue;
+ iLightsTimeout = KDefaultBackLightValue;
+ }
+// ============================ MEMBER FUNCTIONS =============================
+
+
+// ---------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::NewL
+// ---------------------------------------------------------------------------
+//
+CScreenSaverAnimPlugin* CScreenSaverAnimPlugin::NewL()
+ {
+ CScreenSaverAnimPlugin* self = new ( ELeave ) CScreenSaverAnimPlugin;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::~CScreenSaverAnimPlugin
+// ----------------------------------------------------------------------------
+//
+CScreenSaverAnimPlugin::~CScreenSaverAnimPlugin()
+ {
+ if ( iResourceOffset != 0 )
+ {
+ iEikEnv->DeleteResourceFile( iResourceOffset );
+ }
+ UnregisterForDrmExpiry();
+ NotifyCenrepChangeCancel();
+ UnInitializeCenRep();
+
+ // Final place to delete plug-in. Plug-in is deleted here
+ // if plug-in notices runtime error.
+ SetPluginDeleted();
+
+ delete iDrmHelper;
+ delete iSettingObject;
+ delete iScreensaverName;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::InitializeL
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::InitializeL( MScreensaverPluginHost *aHost )
+ {
+
+ if ( !aHost )
+ {
+ return KErrCancel;
+ }
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "InitializeL called " );
+ PrintDebugMsg( msg );
+#endif
+
+ iScreenSaverHost = aHost;
+ iScreenSaverHost->UseRefreshTimer( EFalse );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( cenrepmsg, "before NotifyCenrepChangeL" );
+ PrintDebugMsg( cenrepmsg );
+#endif
+
+ NotifyCenrepChangeL();
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( cenrepmsg1, "After NotifyCenrepChangeL" );
+ PrintDebugMsg( cenrepmsg1 );
+#endif
+
+ iScreenSaverHost->OverrideStandardIndicators();
+
+ iScreenSaverHost->ExitPartialMode();
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( FindPluginLmsg, "before FindPluginL" );
+ PrintDebugMsg( FindPluginLmsg );
+#endif
+
+ TRAPD( err, FindPluginL( iSettingObject->iFileName ) )
+
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( FindPluginLmsg1, "After FindPluginL" );
+ PrintDebugMsg( FindPluginLmsg1 );
+#endif
+
+ return KErrNone;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::Draw
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::Draw(CWindowGc& /*aGc*/)
+ {
+ return KErrNone;
+ }
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::SetWindow
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::SetWindow( CCoeControl* aParent )
+ {
+
+ iParentControl = aParent;
+ NPWindow window;
+ TInt ret = KErrNone;
+
+ window.window = STATIC_CAST( MPluginAdapter*, this );
+ iNPPinstance->ndata = STATIC_CAST( MPluginAdapter*, this );
+ window.x = 0; /* Position of top left corner relative */
+ window.y = 0; /* to a netscape page.*/
+
+ if ( aParent )
+ {
+ window.width = aParent->Rect().Width(); /* Max window size */
+ window.height = aParent->Rect().Height();
+ window.type = NPWindowTypeDrawable;
+ }
+
+ if ( iPluginFuncs && !iPluginFuncs->setwindow( iNPPinstance, &window ) )
+ {
+ ret = KErrNone;
+ }
+ else
+ {
+ ret = KErrGeneral;
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::Name
+// -----------------------------------------------------------------------------
+//
+const TDesC16& CScreenSaverAnimPlugin::Name() const
+ {
+ if ( iScreensaverName )
+ {
+ return *iScreensaverName;
+ }
+ else
+ {
+ return KNullDesC;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::Capabilities
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::Capabilities()
+ {
+ return EScpCapsConfigure;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::PluginFunction
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::PluginFunction(
+ TScPluginCaps aFunction,
+ TAny* /*aParam*/)
+ {
+ if ( aFunction == EScpCapsSelectionNotification
+ || aFunction == EScpCapsPreviewNotification )
+ {
+ _LIT( msg, "Plugin function called Sel Notify" );
+ PrintDebugMsg( msg );
+
+ if ( iSettingObject->iFileName.Length() == 0 || UpdateFileName() )
+ {
+ // File is not configured yet or deleted/renamed,
+ // pop the settings dialog
+ TInt err = KErrNone;
+ TRAP( err, PopSettingsDialogL() );
+ return err;
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ if ( aFunction == EScpCapsConfigure )
+ {
+ _LIT( msg, "Plugin function called Configure" );
+ PrintDebugMsg( msg );
+ UpdateFileName();
+ TInt err = KErrNone;
+ TRAP( err, PopSettingsDialogL() );
+ return err;
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HandleScreensaverEventL
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::HandleScreensaverEventL(
+ TScreensaverEvent aEvent,
+ TAny* /*aData*/ )
+ {
+
+ if ( aEvent == EScreensaverEventDisplayChanged )
+ {
+ // Display Changed is called when there is a change in the size
+ // of the window and when the parent control is set for the
+ // first time.
+ TScreensaverDisplayInfo* displayInfo = new( ELeave )
+ TScreensaverDisplayInfo;
+ displayInfo->iSize = sizeof( TScreensaverDisplayInfo );
+ iScreenSaverHost->DisplayInfo( displayInfo );
+ iParentControl = displayInfo->iParent;
+ delete displayInfo;
+ }
+
+ if ( aEvent == EScreensaverEventStopping )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( KStopEventMsg, "Stop Event" );
+ PrintDebugMsg( KStopEventMsg );
+#endif
+
+ // Delete the Plugin
+ SendEndEvent();
+ DeletePlugin();
+ }
+
+ if ( aEvent == EScreensaverEventStarting )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( KStartEventMsg, "Start Event" );
+ PrintDebugMsg( KStartEventMsg );
+#endif
+ // Check for drm rights
+ // If the file is not valid, suspend and return
+ if ( iDrmHelper )
+ {
+ TBool yes = EFalse;
+ iDrmHelper->CanSetAutomated(
+ iSettingObject->iFileName, yes );
+ if ( !yes )
+ {
+ iScreenSaverHost->RevertToDefaultSaver();
+ return KErrNotFound;
+ }
+ }
+
+ if ( iScreenSaverHost )
+ {
+ iScreenSaverHost->RequestTimeout(
+ iSettingObject->iAnimationTimeout );
+ }
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( KStartMsg, "Starting" );
+ PrintDebugMsg( KStartMsg );
+#endif
+
+ // Reset plugin creation error
+ // The plugin cannot leave or return error
+ // The plugin sets the error using pluginFinishedL
+ iPluginError = KErrNone;
+ // Create the plugin
+ TRAPD( err,CreatePluginL() );
+ if ( err != KErrNone )
+ {
+ DeletePlugin();
+ return err;
+ }
+
+ // Check whether the plugin has
+ // reported any error using PluginFinishedL
+ if ( iPluginError )
+ {
+ SetPluginDeleted();
+ return iPluginError;
+ }
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( KStartedMsg, "Started" );
+ PrintDebugMsg( KStartedMsg );
+#endif
+
+ // send an event to plugins
+ if ( iPluginFuncs )
+ {
+ NPAnimationEvent event;
+ event = NPStartAnimation;
+ iPluginFuncs->setvalue( iNPPinstance,
+ ( NPNVariable )NPNScreenSaverAnimationEvent,
+ &event );
+ }
+
+ // Request lights only if set - otherwise it will turn off lights
+ // (e.g. in preview). Not nice.
+ TInt nLights = iSettingObject->iLightsTimeout;
+
+ if ( nLights > 0 )
+ {
+ iScreenSaverHost->RequestLights( nLights );
+ }
+ }
+
+ if ( aEvent == EScreensaverEventTimeout )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( KTimeoutEventMsg, "Timeout Event" );
+ PrintDebugMsg( KTimeoutEventMsg );
+#endif
+ // Delete the Plugin
+ SendEndEvent();
+ DeletePlugin();
+ iScreenSaverHost->Suspend( -1) ;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::GetAnimSettings
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::GetAnimSettings()
+ {
+ // Read the file last, since if it is missing the reading will be
+ // stopped and settings all wrong
+ TInt err = iAnimPluginSession->Get( KScreenSaverAnimationTimeOut,
+ iSettingObject->iAnimationTimeout );
+
+ if ( iSettingObject->iAnimationTimeout < KMinDurationValue ||
+ iSettingObject->iAnimationTimeout > KMaxDurationValue )
+ {
+ // Out of range set it to default
+ iSettingObject->iAnimationTimeout = KDefaultDurationValue;
+ }
+
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ err = iAnimPluginSession->Get( KScreenSaverLightsTimeOut,
+ iSettingObject->iLightsTimeout );
+
+ if ( iSettingObject->iLightsTimeout < KMinBackLightValue ||
+ iSettingObject->iLightsTimeout > KMaxBackLightValue )
+ {
+ // Out of range set it to default
+ iSettingObject->iLightsTimeout = KDefaultBackLightValue;
+ }
+
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ // read the file from central repository and return
+ err = iAnimPluginSession->Get( KScreenSaverAnimatedFileName,
+ iSettingObject->iFileName );
+
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ if ( !BaflUtils::FileExists( iEikEnv->FsSession(),
+ iSettingObject->iFileName ) )
+ {
+ return KErrNotFound;
+ }
+
+ TBool yes = EFalse;
+ if ( iDrmHelper )
+ {
+ TInt err = iDrmHelper->CanSetAutomated(
+ iSettingObject->iFileName, yes );
+ if ( !yes )
+ {
+ return KErrNotFound;
+ }
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::SetAnimSettings
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::SetAnimSettings() const
+ {
+
+ TInt err = KErrNone;
+ err = iAnimPluginSession->Set( KScreenSaverAnimatedFileName,
+ iSettingObject->iFileName );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+ err = iAnimPluginSession->Set( KScreenSaverAnimationTimeOut,
+ iSettingObject->iAnimationTimeout );
+
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ err = iAnimPluginSession->Set( KScreenSaverLightsTimeOut,
+ iSettingObject->iLightsTimeout );
+
+ return err;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::RegisterForDrmExpiry
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::RegisterForDrmExpiry()
+ {
+ TInt err = iDrmHelper->SetAutomatedType(
+ CDRMHelper::EAutomatedTypeScreenSaver );
+ if ( err == KErrNone )
+ {
+ return iDrmHelper->SetAutomatedSilent( iSettingObject->iFileName,
+ ETrue );
+ }
+ else
+ {
+ return err;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::UnregisterForDrmExpiry
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::UnregisterForDrmExpiry()
+ {
+ if ( iDrmHelper )
+ {
+ iDrmHelper->SetAutomatedType(
+ CDRMHelper::EAutomatedTypeScreenSaver );
+ return iDrmHelper->RemoveAutomated( iSettingObject->iFileName );
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::ReadDrmNotification
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::ReadDrmNotification( TDes8& aString )
+ {
+ return iDrmSession->Get( KDRMHelperServerNotification, aString );
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::ProcessDrmNotificationL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::ProcessDrmNotificationL()
+ {
+
+ TInt size = KSixteenBytes;
+ HBufC8* buf = HBufC8::NewLC( size );
+ TPtr8 bufPtr = buf->Des();
+
+ TInt error = ReadDrmNotification( bufPtr );
+ while ( error == KErrTooBig )
+ {
+ size += KSixteenBytes;
+ CleanupStack::PopAndDestroy( buf ); // buf
+ buf = HBufC8::NewLC( size );
+ bufPtr = buf->Des();
+ error = ReadDrmNotification( bufPtr );
+ }
+
+ TUint8 count = ( TUint8 )( *( buf->Ptr() ) );
+ TChar type = ( TUint8 )( *( buf->Ptr() + 1 ) );
+
+ TUint8 permType = ( TUint8 )( *( buf->Ptr() + 2 ) );
+ TUint8 autoType = ( TUint8 )( *( buf->Ptr() + 3 ) );
+
+ TPtr8 ptr( ( TUint8* ) ( buf->Ptr() + 4 ) , buf->Length() - 5 , buf->Length() - 5 );
+ HBufC8* content = HBufC8::NewLC( ptr.Length() );
+ *content = ptr;
+
+ TBool matched = CheckContentIdL( iSettingObject->iFileName, *content );
+
+ CleanupStack::PopAndDestroy( content );
+ CleanupStack::PopAndDestroy( buf );
+
+ if ( !matched )
+ {
+ return;
+ }
+
+ if ( type == 'E')
+ {
+ if ( count == 0 )
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "First Notification" );
+ PrintDebugMsg( msg );
+#endif
+
+ // Expire screen saver here..., no note
+ if ( iScreenSaverHost )
+ {
+ SendEndEvent();
+ // Delete the Plugin
+ DeletePlugin();
+ iScreenSaverHost->Suspend(-1);
+ }
+ }
+ else
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "Second Notification" );
+ PrintDebugMsg( msg );
+#endif
+
+ // Show expiration notes...
+ iDrmHelper->SetAutomatedType(
+ CDRMHelper::EAutomatedTypeScreenSaver );
+ iDrmHelper->CheckRightsAmountL( iSettingObject->iFileName );
+ UnregisterForDrmExpiry();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::FindAndStartPluginL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::FindAndStartPluginL( const TDesC& aFileName,
+ TBool aCheckFileMode )
+ {
+ FindPluginL( aFileName );
+ CreatePluginL( aCheckFileMode );
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::FindPluginL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::FindPluginL( const TDesC& aFileName )
+ {
+
+ RApaLsSession ls;
+ CleanupClosePushL( ls );
+ TUid dummyUid( KNullUid );
+ TDataType dataType;
+ User::LeaveIfError( ls.Connect() );
+ User::LeaveIfError( ls.AppForDocument( aFileName,
+ dummyUid, dataType ) );
+ CleanupStack::PopAndDestroy( &ls );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "before FindAnimPluginL" );
+ PrintDebugMsg( msg );
+#endif
+
+ iPluginUID = FindAnimPluginL( dataType.Des() );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg1, "After FindAnimPluginL" );
+ PrintDebugMsg( msg1 );
+#endif
+
+ if ( iPluginUID == KNullUid )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( registermsg, "Before RegisterForDrmExpiry" );
+ PrintDebugMsg( registermsg );
+#endif
+
+ RegisterForDrmExpiry();
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( registermsg1, "After RegisterForDrmExpiry" );
+ PrintDebugMsg( registermsg1 );
+#endif
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::CreatePluginL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::CreatePluginL( TBool aCheckFileMode )
+ {
+
+ /* Create the Netscape plugin for the animation format.
+ * Allocate memory for the plugin functions array. This
+ * would be filled by the netscape plugin.
+ * Initialize the plugin.
+ */
+
+ iPluginFuncs =
+ ( NPPluginFuncs* ) User::AllocL( sizeof( NPPluginFuncs ) );
+ Mem::FillZ( ( void* )iPluginFuncs, sizeof( NPPluginFuncs ) );
+
+ iNPPinstance = ( NPP ) User::AllocL( sizeof( NPP_t ) );
+ Mem::FillZ( ( void* )iNPPinstance, sizeof( NPP_t ) );
+
+ iPluginType = ( HBufC8* )User::AllocL( sizeof( NPMIMEType ) );
+ Mem::FillZ( ( void* )iPluginType, sizeof( NPMIMEType ) );
+
+ TRAPD( err, iPluginInterface =
+ CEcomBrowserPluginInterface::CreatePluginL( iPluginUID,
+ ( NPNetscapeFuncs* ) ( &NpnImplementationFuncs ),
+ iPluginFuncs ) );
+
+ if ( err != KErrNone )
+ {
+ SetPluginDeleted();
+ User::Leave( err );
+ }
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( newpmsg, "Before newp" );
+ PrintDebugMsg( newpmsg );
+#endif
+
+ // Create an instance.
+ // Flash Plugin needs the NPInteractionMode in the newp
+
+ CDesCArrayFlat* attributeNames = new( ELeave ) CDesCArrayFlat( 1 );
+ CDesCArrayFlat* attributeValues = new( ELeave ) CDesCArrayFlat( 1 );
+ attributeNames->AppendL( KAttributeInteractionMode );
+ attributeValues->AppendL( KValueScreensaver );
+
+ User::LeaveIfError( iPluginFuncs->newp( *iPluginType, iNPPinstance,
+ 0 /*mode*/,
+ attributeNames /*argn*/,
+ attributeValues /*argv*/,
+ NULL /*saved*/ ) );
+
+ delete attributeNames;
+ delete attributeValues;
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( newpmsg1, "After newp" );
+ PrintDebugMsg( newpmsg1 );
+#endif
+
+ // Set ScreenSaver Mode
+ if ( iPluginFuncs )
+ {
+ NPInteractionMode mode;
+ mode = NPScreenSaverMode;
+ iPluginFuncs->setvalue( iNPPinstance,
+ ( NPNVariable )NPNInteractionMode,
+ &mode );
+ }
+
+ if ( !aCheckFileMode )
+ {
+ SetWindow( iParentControl );
+ AsFile();
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::FindAnimPluginL
+// -----------------------------------------------------------------------------
+//
+TUid CScreenSaverAnimPlugin::FindAnimPluginL( const TDesC& aDataType )
+ {
+
+ TUid impUid = KNullUid;
+
+ TResourceReader reader;
+ iEikEnv->CreateResourceReaderLC( reader, R_MIMETYPE_SPECIFIC_PLUGIN_ARRAY );
+ TInt countResource = reader.ReadInt16();
+
+ for ( TInt i = 0; i < countResource; i++ )
+ {
+ HBufC* newMimeTypeEntry = reader.ReadHBufCL();
+ TPtr mimePtr( newMimeTypeEntry->Des() );
+ impUid.iUid = reader.ReadInt32();
+ if ( newMimeTypeEntry->Compare( aDataType ) == 0 )
+ {
+ delete newMimeTypeEntry;
+ break;
+ }
+ else
+ {
+ delete newMimeTypeEntry;
+ }
+ }
+ CleanupStack::PopAndDestroy(); // reader
+
+ if ( CheckIfPluginPresentL( KBrowserPluginInterfaceUid, impUid ) ||
+ CheckIfPluginPresentL( TUid::Uid( KScreensaverAnimPluginInterfaceUid ),impUid ) )
+ {
+ return impUid;
+ }
+
+ return KNullUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::CheckIfPluginPresentL
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::CheckIfPluginPresentL( TUid aInterfaceUid ,
+ TUid aImpUid )
+ {
+ TBool ret( EFalse );
+ RImplInfoPtrArray animPluginList;
+
+ REComSession::ListImplementationsL( aInterfaceUid, animPluginList );
+
+ const TInt count = animPluginList.Count();
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ CImplementationInformation* implInfo = animPluginList[i];
+ if ( aImpUid == implInfo->ImplementationUid() )
+ {
+ ret = ETrue;
+ break;
+ }
+ }
+ animPluginList.ResetAndDestroy();
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::ParseMimeStringL
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::ParseMimeStringL( const TDesC& aMIMEDescription,
+ const TDesC& aDataType )
+ {
+
+ if ( aMIMEDescription.Length() == 0 ||
+ aDataType.Length() == 0 )
+ {
+ return EFalse;
+ }
+
+ _LIT( KPattern1Ptr, ",;|" );
+ _LIT( KPattern2Ptr, ";|" );
+
+ TUint end( aMIMEDescription.Length() );
+ TUint i( 0 );
+ TUint marker( 0 );
+ TUint16 mimeSeparator( '|' );
+ TUint fieldSeparator( ';' );
+ HBufC* newMimeTypeEntry = NULL;
+
+ // Parse the aMIMEDescription string to populate the mimeTypes
+ for ( ; i < end; ) // outer for loop
+ {
+ // Search until end of buffer or match one of the delimiters ';' or '|'.
+ // We are looking for the mimeType, ie "text/html",
+ // "application/pdf", etc.
+ for ( ; ( i < end ) && ( KPattern2Ptr().Locate( ( aMIMEDescription )[i] ) ==
+ KErrNotFound ); i++ )
+ {
+ // Walking the aMIMEDescription string
+ }
+
+ if ( i > marker )
+ {
+ // Create new mimeType entry, the first entry is mimeType
+ newMimeTypeEntry = HBufC::NewLC( i - marker );
+ TPtr mimePtr( newMimeTypeEntry->Des() );
+ mimePtr.Copy( aMIMEDescription.Mid( marker, i - marker ) );
+ if ( newMimeTypeEntry->Compare( aDataType ) == 0 )
+ {
+ CleanupStack::PopAndDestroy( newMimeTypeEntry ); //newMimeTypeEntry
+ return ETrue;
+ }
+ CleanupStack::PopAndDestroy( newMimeTypeEntry ); //newMimeTypeEntry
+ }
+
+ // Are we at the end of the supported mime string
+ if ( i == end )
+ {
+ // This break with i=end means we leave outer for loop
+ break;
+ }
+
+ marker = ++i;
+ if ( ( aMIMEDescription )[i - 1] == mimeSeparator )
+ {
+ // Found a mime separator '|', get next supported mime
+ continue;
+ }
+
+ // There can be multiple mimeFileExtentions per mimeType
+ for ( ; ( i < end ); ) // inner for loop
+ {
+ // Search until end of buffer or match one of the delimiters
+ // ';' or ',' or '|'.
+ for ( ; (i < end) && ( KPattern1Ptr().Locate( ( aMIMEDescription )[i] ) ==
+ KErrNotFound ); i++ )
+ {
+ // Walking the aMIMEDescription string
+ }
+
+ // Are we at the end of the supported mime string
+ if ( i == end )
+ {
+ // This break means we leave the inner loop,
+ // and with i=end means
+ // we leave the outer loop
+ break;
+ }
+
+ marker = ++i;
+ if ( ( aMIMEDescription )[i - 1] == mimeSeparator )
+ {
+ // Found a mime separator '|', get next supported mime
+ break;
+ }
+
+ if ( ( aMIMEDescription )[i - 1] == fieldSeparator )
+ {
+ // Found a field separator ';', get the mimeDescription.
+ // Search until end of buffer or match one of the
+ // delimiters ';' or '|'.
+ for ( ; (i < end) &&
+ ( KPattern2Ptr().Locate( ( aMIMEDescription )[i] ) ==
+ KErrNotFound ); i++ )
+ {
+ // Walking the aMIMEDescription string
+ }
+
+
+ // Are we at the end of the supported mime string
+ if ( i == end )
+ {
+ // This break means we leave the inner loop,
+ // and with i=end means
+ // we leave the outer loop
+ break;
+ }
+
+ marker = ++i;
+ // Make sure we start at the next mime,
+ // after we found the mimeDescription.
+ // We are handling a mime string with an extra semi-colon(s),
+ // ie "...mimeDescription1;|mimeType2
+ for (; (i < end) &&
+ ((aMIMEDescription)[i-1] != mimeSeparator); i++)
+ {
+ // Walking the aMIMEDescription string
+ }
+
+ // Leave the inner loop and look for the next mime
+ break;
+ } // end of if fieldSeparator aka get mimeDescription
+
+ // If we get here, we have another mimeFileExtension.
+ // Continue on the
+ // inner loop to find additional mimeFileExtensions.
+
+ } // end of inner for (;i<end;)
+ } // end of outer for (;i<end;)
+
+ return EFalse;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::DeletePlugin
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::DeletePlugin()
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "delete called " );
+ PrintDebugMsg( msg );
+#endif
+ if ( iPluginFuncs )
+ {
+ iPluginFuncs->destroy( iNPPinstance, NULL );
+ }
+ SetPluginDeleted();
+ }
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::SetPluginDeleted
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::SetPluginDeleted()
+ {
+
+ delete iPluginType;
+ iPluginType = NULL;
+
+ delete iPluginFuncs;
+ iPluginFuncs = NULL;
+
+ delete iNPPinstance;
+ iNPPinstance = NULL;
+
+ delete iPluginInterface;
+ iPluginInterface = NULL;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::AsFile
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::AsFile()
+ {
+
+ // Set the File-name to the plugin.
+ // Note that the SVG-T plugin atleast wants setwindow
+ // to be called first
+ iPluginFuncs->asfile( iNPPinstance, NULL, iSettingObject->iFileName );
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::UpdateFileName
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::UpdateFileName()
+ {
+ if ( !BaflUtils::FileExists( iEikEnv->FsSession(),
+ iSettingObject->iFileName ) )
+ {
+ // File is deleted now, Show empty string
+ iSettingObject->iFileName.Copy( KEmptyString );
+ return ETrue;
+ }
+
+ TBool canbeautomated( EFalse );
+
+ TInt res = 0;
+ iDrmHelper->SetAutomatedType(
+ CDRMHelper::EAutomatedTypeScreenSaver );
+ res = iDrmHelper->CanSetAutomated( iSettingObject->iFileName,
+ canbeautomated );
+
+ if ( res || !canbeautomated )
+ {
+ iSettingObject->iFileName.Copy( KEmptyString );
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::PopSettingsDialogL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::PopSettingsDialogL()
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "Pop Settings Dialog" );
+ PrintDebugMsg( msg );
+#endif
+
+ // Get the Status Pane Control
+ CEikStatusPane* sp = iEikEnv->AppUiFactory()->StatusPane();
+
+ // Fetch pointer to the default navi pane control
+ CAknNavigationControlContainer* NaviPane =
+ ( CAknNavigationControlContainer* )sp->ControlL(
+ TUid::Uid( EEikStatusPaneUidNavi ) );
+
+ NaviPane->PushDefaultL( ETrue );
+
+ CScreenSaverAnimSettingDialog* dlg =
+ CScreenSaverAnimSettingDialog::NewL( this, iSettingObject );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg1, "dlg created Call executeld" );
+ PrintDebugMsg( msg1 );
+#endif
+
+ dlg->ExecuteLD();
+
+ NaviPane->Pop();
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg2, "Executed dlg, write to cenrep" );
+ PrintDebugMsg( msg2 );
+#endif
+
+ User::LeaveIfError( SetAnimSettings() );
+
+ // Check if a file is selected
+ if ( iSettingObject->iFileName.Length() == 0 )
+ {
+ // Don't Pop an error note
+ // Just leave
+ User::Leave( KErrCancel ) ;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HandleRepositoryCallBack
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::HandleRepositoryCallBack( TAny* aPtr )
+ {
+ STATIC_CAST( CScreenSaverAnimPlugin*, aPtr )->HandleSettingsChange( aPtr );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HandleRepositoryCallBack
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::HandleDrmNotification( TAny* aPtr )
+ {
+ TRAPD( err, STATIC_CAST( CScreenSaverAnimPlugin*, aPtr )
+ ->ProcessDrmNotificationL() );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HandleSettingsChange
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::HandleSettingsChange( TAny* /*aPtr*/ )
+ {
+ if ( iScreensaverRepositoryWatcher )
+ {
+ if ( iScreensaverRepositoryWatcher->ChangedKey() ==
+ KScreenSaverAnimationTimeOut )
+ {
+ // Update the iSettingObject
+ iAnimPluginSession->Get( KScreenSaverAnimationTimeOut,
+ iSettingObject->iAnimationTimeout );
+ }
+ if ( iScreensaverRepositoryWatcher->ChangedKey() ==
+ KScreenSaverLightsTimeOut )
+ {
+ // Update the iSettingObject
+ iAnimPluginSession->Get( KScreenSaverLightsTimeOut,
+ iSettingObject->iLightsTimeout );
+ }
+
+ if ( iScreensaverRepositoryWatcher->ChangedKey() ==
+ KScreenSaverAnimatedFileName )
+ {
+ UnregisterForDrmExpiry();
+ iAnimPluginSession->Get( KScreenSaverAnimatedFileName,
+ iSettingObject->iFileName );
+ // Find the Plugin for the new file
+ TInt err;
+ TRAP( err, FindPluginL( iSettingObject->iFileName ) );
+ if ( err != KErrNone )
+ {
+ NotifyCenrepChangeCancel();
+ iScreenSaverHost->RevertToDefaultSaver();
+ return;
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::InitializeCenRepL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::InitializeCenRepL()
+ {
+
+ TRAPD( err, iAnimPluginSession =
+ CRepository::NewL( KCRUidScreenSaverAnimPlugin ) );
+#ifdef SCREENSAVER_LOG_ENABLED
+ TBuf<KMaxBufLen> buffer;
+ _LIT( msg, "After SS Cenrep Init : %d" );
+ buffer.Format( msg, err );
+ PrintDebugMsg( buffer );
+#endif
+ User::LeaveIfError( err );
+
+ TRAPD( err1, iDrmSession = CRepository::NewL( KCRUidDRMHelperServer ) );
+#ifdef SCREENSAVER_LOG_ENABLED
+ TBuf<KMaxBufLen> buffer1;
+ _LIT( msg1, "After DRM Cenrep Init : %d" );
+ buffer1.Format( msg1, err1 );
+ PrintDebugMsg( buffer1 );
+#endif
+ User::LeaveIfError( err1 );
+
+ }
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::NotifyCenrepChangeL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::NotifyCenrepChangeL()
+ {
+
+ iScreensaverRepositoryWatcher = CScreensaverRepositoryWatcher::NewL(
+ KCRUidScreenSaverAnimPlugin,
+ TCallBack( HandleRepositoryCallBack, this ),
+ iAnimPluginSession );
+
+ iDrmExpiryWatcher = CScreensaverRepositoryWatcher::NewL(
+ KCRUidDRMHelperServer,
+ KDRMHelperServerNotification,
+ CCenRepNotifyHandler::EIntKey,
+ TCallBack( HandleDrmNotification, this ),
+ iDrmSession );
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::NotifyCenrepChangeCancel
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::NotifyCenrepChangeCancel()
+ {
+
+ delete iScreensaverRepositoryWatcher;
+ iScreensaverRepositoryWatcher = NULL;
+
+ delete iDrmExpiryWatcher;
+ iDrmExpiryWatcher = NULL;
+
+ }
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::UnInitializeCenRep
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::UnInitializeCenRep()
+ {
+ if ( iAnimPluginSession )
+ {
+ delete iAnimPluginSession;
+ iAnimPluginSession = NULL;
+ }
+ if ( iDrmSession )
+ {
+ delete iDrmSession;
+ iDrmSession = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::CScreenSaverAnimPlugin
+// -----------------------------------------------------------------------------
+//
+CScreenSaverAnimPlugin::CScreenSaverAnimPlugin():
+ iParentControl( NULL ),iPluginError( KErrNone )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::ConstructL()
+ {
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg, "ConstructL of ScreenSaverAnimPlugin" );
+ PrintDebugMsg( msg );
+#endif
+
+ // Find which drive this DLL is installed.
+ TFileName fileName;
+
+ // Get the full resource file
+ TParse lParse;
+
+ // Add the resource dir
+ lParse.Set( KResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+
+ // Get the filename with full path
+ fileName = lParse.FullName();
+
+ iEikEnv = CEikonEnv::Static();
+
+ BaflUtils::NearestLanguageFile( iEikEnv->FsSession(), fileName ); //for
+ // localization
+
+ iDrmHelper = CDRMHelper::NewL( *iEikEnv );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg1, "Before Cenrep Init " );
+ PrintDebugMsg( msg1 );
+#endif
+
+ InitializeCenRepL();
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg2, "After Cenrep Init " );
+ PrintDebugMsg( msg2 );
+#endif
+
+ iSettingObject = new( ELeave ) CScreenSaverAnimSettingObject;
+
+ GetAnimSettings();
+
+ iResourceOffset = iEikEnv->AddResourceFileL( fileName );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ _LIT( msg3, "ConstructL end " );
+ PrintDebugMsg( msg3 );
+#endif
+
+ // Load localised name of screensaver to be returned for
+ // Themes app in Name() query
+ iScreensaverName = iEikEnv->AllocReadResourceL( R_SANIM_SCREENSAVER_NAME );
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::SendEndEvent
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::SendEndEvent()
+ {
+ NPAnimationEvent event;
+ event = NPEndAnimation;
+ if ( iPluginFuncs )
+ {
+ return iPluginFuncs->setvalue( iNPPinstance,
+ ( NPNVariable )NPNScreenSaverAnimationEvent,
+ &event );
+ }
+ return KErrNone;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::CheckFileValidity
+// -----------------------------------------------------------------------------
+//
+TInt CScreenSaverAnimPlugin::CheckFileValidityL( const TDesC& aFileName )
+ {
+ FindAndStartPluginL( aFileName , ETrue /* Check File Mode */);
+ NPCheckFile checkFile;
+ checkFile.fileValidityCheckError = KErrNone;
+ checkFile.fileName = HBufC::NewL( aFileName.Length() );
+ checkFile.fileName->Des().Copy( aFileName );
+
+ if ( iPluginFuncs )
+ {
+ iPluginFuncs->getvalue( iNPPinstance,
+ ( NPPVariable )NPPCheckFileIsValid,
+ &checkFile );
+ }
+ delete checkFile.fileName;
+ DeletePlugin();
+ return checkFile.fileValidityCheckError;
+
+ }
+
+/* MPluginAdapter Interface functions, The plugins call
+ * these back
+ */
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::GetVersion
+// -----------------------------------------------------------------------------
+//
+TUint16 CScreenSaverAnimPlugin::GetVersion()
+ {
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::PluginConstructedL
+// Called when the plug-in has completed its creation.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::PluginConstructedL( CCoeControl*
+ /*aPluginControl*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::PluginFinishedL
+// Called when the plug-in has completed its creation.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::PluginFinishedL()
+ {
+ TInt error;
+ iPluginFuncs->getvalue( iNPPinstance,
+ ( NPPVariable )NPPScreenSaverGetLastError,
+ &error );
+
+#ifdef SCREENSAVER_LOG_ENABLED
+ TBuf<KMaxBufLen> buffer1;
+ _LIT( msg, "Plugin finishedL Error: %d" );
+ buffer1.Format( msg, error );
+ PrintDebugMsg( buffer1 );
+#endif
+
+ if ( iScreenSaverHost )
+ {
+ if ( error != KErrNone )
+ {
+ iPluginError = error;
+ // Plugin has encountered an error
+ iScreenSaverHost->RevertToDefaultSaver();
+ }
+ }
+ }
+
+#ifndef __SERIES60_30__
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::OpenUrlL
+// Called by the plug-in to open a URL in the parent frame.
+// This function is not implemented in Series 60. It is supported
+// in Series 80 and in the Nokia 7710 smartphone
+// -----------------------------------------------------------------------------
+//
+
+void CScreenSaverAnimPlugin::OpenUrlL( const TDesC& /* aUrl */ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::OpenUrlInTargetWindowL
+// Called by the plug-in to open a URL in a named window or frame.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::OpenUrlInTargetWindowL( const TDesC& /* aUrl */,
+ const TDesC& /* aNewTargetWindowName */ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HasNavigationHistoryPrevious
+// Specifies whether or not the frame has a previous navigation history item.
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::HasNavigationHistoryPrevious() const
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::LoadNavigationHistoryPreviousL
+// Informs the browser to load the next navigation history URL in its parent
+// frame.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::LoadNavigationHistoryPreviousL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HasNavigationHistoryNext
+// Returns whether the frame has a next navigation history item.
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::HasNavigationHistoryNext() const
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::LoadNavigationHistoryNextL
+// Informs the browser to load the next navigation history URL in its parent
+// frame.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::LoadNavigationHistoryNextL()
+ {
+ }
+
+#endif
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::GetParentControl
+// Returns the window system level control object for the plug-in.
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CScreenSaverAnimPlugin::GetParentControl()
+ {
+ return iParentControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::GetParentControlObserver
+// Returns the observer for the plug-in control.
+// -----------------------------------------------------------------------------
+//
+MCoeControlObserver* CScreenSaverAnimPlugin::GetParentControlObserver()
+ {
+ return this;
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::GetParentControlObserver
+// Sets the plug-in notifier allowing the plug-in to control
+// portions of the browser.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::SetPluginNotifier( MPluginNotifier* /*aNotifier*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::SetContentInteractive
+// Tells the plugin adapter if plugin content can accept user interaction.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::SetContentInteractive( TBool /*aInteractive*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::HandleControlEventL
+// Handles an event from an observed control.This function is called
+// when a control for which this control is the observer calls
+// CCoeControl::ReportEventL(). It should be implemented by the observer
+// control, and should handle all events sent by controls it observes.
+// -----------------------------------------------------------------------------
+//
+void CScreenSaverAnimPlugin::HandleControlEventL( CCoeControl* /*aControl*/,
+ TCoeEvent /*aEventType*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScreenSaverAnimPlugin::CheckContentIdL
+// -----------------------------------------------------------------------------
+//
+TBool CScreenSaverAnimPlugin::CheckContentIdL( const TDesC& aFileName,
+ TDesC8& aContentUri )
+ {
+
+ TBool matched = EFalse;
+ HBufC* contentURI = NULL;
+ HBufC8* contentURI8 = NULL;
+
+ RFile fileHandle;
+
+ TInt error = fileHandle.Open( iEikEnv->FsSession(),
+ aFileName,
+ EFileRead | EFileShareReadersOnly );
+ if ( error != KErrNone )
+ {
+ return matched;
+ }
+
+ CleanupClosePushL( fileHandle );
+ CData* content = CData::NewL( fileHandle, KDefaultContentObject, EPeek );
+ CleanupStack::PopAndDestroy( &fileHandle );
+
+ CleanupStack::PushL( content );
+
+ contentURI = HBufC::NewLC( KUrlMaxLen );
+
+ // create attribute set
+ RStringAttributeSet stringAttributeSet;
+ CleanupClosePushL( stringAttributeSet );
+ // add the attributes we are interested in
+ stringAttributeSet.AddL( EContentID );
+
+ User::LeaveIfError( content->GetStringAttributeSet( stringAttributeSet ) );
+
+ // pass on values of string attributes
+ TPtr ptr = contentURI->Des();
+ error = stringAttributeSet.GetValue( EContentID, ptr );
+ if ( error == KErrNone )
+ {
+ contentURI8 = HBufC8::NewLC( contentURI->Length() );
+ contentURI8->Des().Copy( contentURI->Des() );
+ if ( contentURI8->Compare( aContentUri ) == 0 )
+ {
+ matched = ETrue;
+ }
+ CleanupStack::PopAndDestroy( contentURI8 );
+ }
+
+ CleanupStack::PopAndDestroy( 2, contentURI ); // stringAttributeSet.Close()
+ CleanupStack::PopAndDestroy( content );
+
+ return matched;
+ }
+
+// End Of file.
+