diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 (;idestroy( 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 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 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 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. +