/*
* 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:   ScreenSaverAnimPlugin provides an implementation of 
*                MScreensaverPlugin for animation files.
*
*/



#ifndef C_SCREENSAVERANIMPLUGIN_H
#define C_SCREENSAVERANIMPLUGIN_H

#include <gdi.h>
#include <ScreensaverpluginIntDef.h>
#include <coecntrl.h>
#include <e32cmn.h>
#include <screensaverplugin.h>
#include <coecobs.h>
#include <npupp.h>
#include <ecom/implementationinformation.h>    
#include <CEcomBrowserPluginInterface.h>
#include <PluginAdapterInterface.h>
#include <flogger.h>


class CEikonEnv;
class CDRMHelper;
class CScreensaverRepositoryWatcher;
class CRepository;


_LIT( KFileLoggingDir, "ScreenSaver" );
_LIT( KFileLog, "SaveLog.txt" );
_LIT( KEmptyString, "" );

#ifdef SCREENSAVER_LOG_ENABLED

inline void PrintDebugMsg( const TDesC& aMsg ) 
    {    
    RDebug::Print( aMsg );
#if 0
    RFileLogger::Write( KFileLoggingDir, 
                        KFileLog, EFileLoggingModeAppend, aMsg );
#endif
    }
#else

inline void PrintDebugMsg( const TDesC& /*aMsg*/ ) 
    {
    }

#endif

/**
*  Encapsulates the Settings that are written into the central repository
*  @lib ScreenSaverAnimPlugin.lib
*  @since 3.1
*/
class CScreenSaverAnimSettingObject : public CBase
    {

    public:
        CScreenSaverAnimSettingObject();

    public:

        // Name of the file to be set as screensaver
        TFileName iFileName;   

        // Animation Timeout
        TInt iAnimationTimeout;  

        // Lights Timeout
        TInt iLightsTimeout;  
    };

/**
*  Provides the Animated ScreenSaverPlugin functionality which implements
*  ScreenSaver Interface and gives a Netscape Browser Plugin Interface
*  to the format specific plugins like SVG, Flash, M3G etc.
*  @lib ScreenSaverAnimPlugin.lib
*  @since 3.1
*/
 
class CScreenSaverAnimPlugin: public CScreensaverPluginInterfaceDefinition,
                              public MPluginAdapter,
                              public MCoeControlObserver
    {

    public: 

        /**
        * Two-phased constructor.
        * @since 3.1
        */
        static CScreenSaverAnimPlugin* NewL();

        /**
        * Destructor.
        */
        virtual ~CScreenSaverAnimPlugin();

    public: // Functions From CScreensaverPluginInterfaceDefinition        

        /**
        * From MScreensaverPlugin, Method called by ScreenSaver Application
        * when an animation file is configured as a Screen Saver.
        * @param aHost  Screen saver plugin host.
        * @since 3.1
        */
        virtual TInt InitializeL( MScreensaverPluginHost *aHost );
            
        /**
        * From MScreensaverPlugin, Method called by ScreenSaver Application
        * when Screen Saver is activated.
        * @since 3.1
        */
        virtual TInt Draw( CWindowGc& aGc );

        /**
        * From MScreensaverPlugin, Method called by ScreenSaver Application
        * before the InitializeL.
        * @since 3.1
        */
        virtual const TDesC16& Name() const;

        /**
        * From MScreensaverPlugin, Method called by ScreenSaver Application
        * to get the capabilities of Screensaver plugin.
        * @since 3.1
        */
        virtual TInt Capabilities();

        /**
        * From MScreensaverPlugin, Method called by Psln Application
        * when the user selects Animated ScreenSaver 
        * @since 3.1
        */
        virtual TInt PluginFunction(
                TScPluginCaps /*aFunction*/,
                TAny* /*aParam*/ );

        /**
        * From MScreensaverPlugin, Method called by ScreenSaver Application
        * when there are Screen Saver events.
        * @since 3.1
        */
        virtual TInt HandleScreensaverEventL(
                TScreensaverEvent aEvent,
                TAny* aData );

    public: // New Functions

        /**
        * Reads the animation settings from the central repository
        * @since 3.1
        * @return System wide Error value
        */
        TInt GetAnimSettings();

        /**
        * Writes the animation settings to the central repository
        * @since 3.1
        * @return System wide Error value
        */
        TInt SetAnimSettings() const;

        /**
        * This method registers for expiry of drm content
        * @since 3.1
        * @return System wide Error value   
        */
        TInt RegisterForDrmExpiry();

        /**
        * This method unregisters for expiry of drm content
        * @since 3.1
        * @return System wide Error value   
        */
        TInt UnregisterForDrmExpiry();

        /**
        * This method reads and parses the central repository key 
        * for drm expiry
        * @since 3.1
        * @return System wide Error value
        */
        TInt ReadDrmNotification( TDes8& aString );

        /**
        * Called when there is a drm expiry notification
        * @since 3.1
        */
        void ProcessDrmNotificationL();

        /**
        * This method pops the settings dialog
        * @since 3.1
        */
        void PopSettingsDialogL();

        /**
        * This method checks whether the set file exists currently
        * if not, it updates the filename string
        * This also checks if the rights are valid if the content is drm 
        * if not, it updates the filename with the empty file name
        * returns True, if the Filename is updated
        *         False, otherwise
        * @since 3.1
        */
        TBool UpdateFileName();

        /**
        * Called when HandleScreenSaverEventL is called with EDisplayChanged
        * Used to set the parent control for the animation plugins
        * returns KErrGeneral when SetWindow does not go through
        * @since 3.1
        */
        TInt SetWindow( CCoeControl* aParent );

        /**
        * Called to set the filename for the animation plugins
        * @since 3.1
        */
        void AsFile();

        /**
        * Called when there is a central repository settings change
        * @since 3.1
        */
        void HandleSettingsChange( TAny* aPtr );

        /**
        * Called by the repository watcher when there is a central 
        * repository settings change
        * @since 3.1
        */
        static TInt HandleRepositoryCallBack( TAny* aPtr );

        /**
        * Called by the repository watcher when there is a 
        * drm expiry notification
        * @since 3.1
        */
        static TInt HandleDrmNotification( TAny* aPtr );

        /**
        * Sends an event to the plugins to check for the file's validity 
        * repository settings change
        * returns KErrNone if the file is valid
        * @since 3.1
        */
        TInt CheckFileValidityL( const TDesC& aFileName );

        /**
        * Parses the mime description and checks whether the given mime type
        * is present in the mime description
        * @since 3.1
        * @param aMIMEDescription mime Description which has mimetype, 
        *                extension and description
        * @param aDataType mimetype to be searched
        * @return TBool ETrue if aDataType is present in aMIMEDescription
        *               EFalse otherwise
        */
        static TBool ParseMimeStringL( const TDesC& aMIMEDescription,
                                const TDesC& aDataType );

        /**
        * Given the mimetype searches and returns the browser plugin which 
        * handles the given mimetype
        * @since 3.1
        * @param aDataType 
        * @return TUid uid of the plugin which handles the mimetype
        */
        TUid FindAnimPluginL( const TDesC& aDataType );


    public: // From MPluginAdapter
        
        /**
        * Gets the pointer to the minor version number of the plug-in version 
        * number of the Browser Plug-in API. 
        * @since 3.1
        * @return Series 60 returns 1. Series 80 and 
        * the Nokia 7710 smartphone return 101.
        */
        virtual TUint16 GetVersion();

        /**
        * Called when the plug-in has completed its creation.
        * This function is called from the constructL function of the plug-in.
        * @since 3.1
        * @param aPluginControl A pointer to the plug-in control window
        */
        virtual void PluginConstructedL( CCoeControl* aPluginControl );

        /**
        * Called after the plug-in has been deleted.
        * This function is called from the destructor of the plug-in.
        * @since 3.1        
        */
        virtual void PluginFinishedL();

#ifndef __SERIES60_30__

        /**
        * 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.
        * @since 3.1
        * @param aUrl Name of the URL to open
        */
        virtual void OpenUrlL( const TDesC& aUrl );

        /**
        * Called by the plug-in to open a URL in a named window or frame.
        * This function is not implemented in Series 60. 
        * It is supported in Series 80 and in the Nokia 7710 smartphone.
        * @since 3.1
        * @param aUrl Name of the URL to open
        * @param aNewTargetWindowName The name of the target window or frame   
        */
        virtual void OpenUrlInTargetWindowL( const TDesC& aUrl, 
                                           const TDesC& aNewTargetWindowName );

        /**
        * Specifies whether or not the frame has a previous navigation 
        * history item.
        * This function is not implemented in Series 60. 
        * It is supported in Series 80 and in the Nokia 7710 smartphone.
        * @since 3.1
        * @return true if the frame has a previous navigation 
        * history item false otherwise
        */
        virtual TBool HasNavigationHistoryPrevious() const;

        /**
        * Informs the browser to load the next navigation history URL 
        * in its parent frame.
        * This function is not implemented in Series 60. 
        * It is supported in Series 80 and in the Nokia 7710 smartphone.
        * @since 3.1
        */
        virtual void LoadNavigationHistoryPreviousL();

        /**
        * Returns whether the frame has a next navigation history item. 
        * This function is not implemented in Series 60.
        * It is supported in Series 80 and in the Nokia 7710 smartphone.
        * @since 3.1
        * @return Returns whether the frame has a next navigation history item. 
        */
        virtual TBool HasNavigationHistoryNext() const;

        /**
        * Informs the browser to load the next navigation history URL 
        * in its parent frame.
        * This function is not implemented in Series 60. It is supported in
        * Series 80 and in the Nokia 7710 smartphone.
        * @since 3.1        
        */
        virtual void LoadNavigationHistoryNextL();

#endif
        /**
        * Returns the window system level control object for the plug-in.
        * @since 3.1
        * @return A pointer to the parent control window.
        */
        virtual CCoeControl* GetParentControl();

        /**
        * Returns the observer for the plug-in control.
        * @since 3.1
        * @return Observer that the plug-in can use to send events 
        * to the browser.
        */
        virtual MCoeControlObserver* GetParentControlObserver();

        /**
        * Sets the plug-in notifier allowing the plug-in to control 
        * portions of the browser.
        * @since 3.1
        * @param aNotifier Pointer to an interface that the browser can 
        * use to send events to the plug-in.        
        */
        virtual void SetPluginNotifier( MPluginNotifier *aNotifier );

        /**
        * Tells the plugin adapter if plugin content can accept user interaction.  This function
        * is called from the plugin.
        * @since Series 60 3nd Edition
        * @param None
        * @return None
        */
        virtual void SetContentInteractive( TBool /*aInteractive*/ );

    public: //MCoeControlObserver
        /** 
        * 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.     
        * @param aControl The control that sent the event.
        * @param aEventType The event type. 
        */
        virtual void HandleControlEventL( CCoeControl* aControl,
                          TCoeEvent aEventType );

    private: // New functions
        
        /**
        * Finds the mime type of the file, searches the corresponding 
        * browser plugin which handles the mime type and starts the same.
        * @since 3.1                
        */
        void FindAndStartPluginL( const TDesC& aFileName, 
                                  TBool aCheckFileMode = EFalse );

        /**
        * Makes use of ecom api to find out whether an implementation with uid
        * aImpUid is present which implements the interface aInterfaceUid.
        * @since 3.1
        */
        TBool CheckIfPluginPresentL( TUid aInterfaceUid, 
                                    TUid aImpUid );

        /**
        * Finds the mime type of the file, searches the corresponding 
        * browser plugin which handles the mime type
        * @since 3.1
        */
        void FindPluginL( const TDesC& aFileName );
        
        /**
        * Creates the format specific plugin
        * @since 3.1
        */
        void CreatePluginL( TBool aCheckFileMode = EFalse );

        /**
        * Deletes the browser plugin.
        * @since 3.1
        */
        void DeletePlugin();  

        /**
        * Deletes and Sets the browser plugin members to NULL
        * @since 3.1
        */
        void SetPluginDeleted();

        /**
        * Connects the central repository session
        * @since 3.1
        */
        void InitializeCenRepL();

        /**
        * Registers for central repository key changes
        * @since 3.1
        */
        void NotifyCenrepChangeL();

        /**
        * Cancels registration for central repository key changes
        * @since 3.1
        */
        void NotifyCenrepChangeCancel();

        /**
        * Disconnects the central repository session
        * @since 3.1
        */
        void UnInitializeCenRep();

        /**
        * Sends an animation end event to the plugins
        * @since 3.1
        */
        TInt SendEndEvent();

        /**
        * Checks whether the given content id matches the content id of the
        * file name given
        * @return ETrue if the content id matches
        * EFalse if not
        * @since 3.1
        */
        TBool CheckContentIdL( const TDesC& aFileName, TDesC8& aContentUri );

    private:

        /**
        * Default Constructor
        * @since 3.1
        */  
        CScreenSaverAnimPlugin();

        /**
        * 2nd phase constructor
        * @since 3.1
        */
        void ConstructL();

    public: 

        // Pointer to the screen saver host
        MScreensaverPluginHost* iScreenSaverHost;

    private:

        // Resource file offset
        TInt iResourceOffset;

        // Handle to the central repository session
        CRepository* iAnimPluginSession;

         // Handle to the central repository session
        CRepository* iDrmSession;

        // Environment pointer
        CEikonEnv* iEikEnv;

        // Format specific Netscape plugin UID
        TUid iPluginUID;

        // Netscape plugin functions.
        NPPluginFuncs* iPluginFuncs;

        // Netscape ECOM plugin interface.
        CEcomBrowserPluginInterface* iPluginInterface;

        // Netscape plugin instance.
        NPP iNPPinstance;

        // Plugin Type
        HBufC8* iPluginType;

        // Parent control given by the screen saver application
        CCoeControl* iParentControl;

        // Pointer to the Settings object
        CScreenSaverAnimSettingObject* iSettingObject;

        // Pointer to Drm Helper
        CDRMHelper* iDrmHelper;

        // Cenrep Watcher for settings change
        CScreensaverRepositoryWatcher* iScreensaverRepositoryWatcher;

        // Cenrep Watcher for drm expiry
        CScreensaverRepositoryWatcher* iDrmExpiryWatcher;

        // To save the error encountered by the plugin
        TInt iPluginError;

        // Screensaver plugin name
        HBufC* iScreensaverName;
    };


#endif // C_SCREENSAVERANIMPLUGIN_H
// End Of file
