diff -r 724d4ec22f0d -r aaeeca1f15af scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp --- a/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp Thu Aug 19 09:55:47 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1570 +0,0 @@ -/* -* 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. -