usbclasses/usbmscpersonality/inc/CUsbActiveMscHandlerMdrv.h
author Pat Downey <patd@symbian.org>
Thu, 24 Jun 2010 14:30:02 +0100
changeset 41 05c4136f4a79
parent 25 8c311f9acc5e
child 63 ef2686f7597e
permissions -rw-r--r--
Merge fix for bug 2169.

/*
* Copyright (c) 2006-2010 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:  Header file for class CUsbActiveMscHandler
*
*/


#ifndef C_CUSBACTIVEMSCHANDLER_H
#define C_CUSBACTIVEMSCHANDLER_H

#include <usbmsshared.h>        // for P&S used in following MMC states
#include <f32file.h> // for file system dismounting and mounting
#include <usb.h>
#include <e32property.h>
#include <usbuinotif.h>
#include <cusbpersonalitynotifier.h>
#include <cusbpersonalityplugin.h>

// FORWARD DECLARATIONS
class CUsbActivePowerManager;
class CUsbMscPersonalityTimer;
class CRepository;
class CDevEncSessionBase;

/**
* Define system state categories used internally by Msc personality plugin
*/
enum TUsbGlobalSystemState
    {
    EUsbGSStateUnknown = -1,
    EUsbGSStateCategoryNormal, //rfOn, rfOff, BTSAP
    EUsbGSStateCharging
    };

/**
* The file system mounted to the drive. 
*/
enum TUsbFileSystem
    {
    EFsyNone = 0, //no file system mounted
    EFsyMassStorage,
    EFsyFat
    };

/**
*  Class to handle Mass Storage personality (= MSDC).
*
*  @lib euser.lib c32.lib efsrv.lib
*  @since Series 60 3.0
*/
class CUsbActiveMscHandler : public CUsbPersonalityPlugin
    {
public:  // Constructors and destructor
        
    /**
     * Two-phased constructor.
     *
     * @param aPersonalityParams Reference to container class
     * @return Pointer to created object.
     */
     static CUsbActiveMscHandler* NewL(TUsbPersonalityParams& aPersonalityParams);
        
     /**
      * Destructor.
      */
    virtual ~CUsbActiveMscHandler();

public: // From base classes CActive

    /**
     * From CActive.
     * Implements state machine for this class.
     *
     * @since Series 60 3.0
     */
    void RunL();

    /**
     * From CActive.
     * Never called in this implementation.
     *
     * @since Series 60 3.0
     * @param aError the error returned
     * @return error
     */
    TInt RunError( TInt /*aError*/ );

    /**
     * From CActive.
     * Cancel outstanding request.
     *
     * @since Series 60 3.0
     */
    void DoCancel();

public: // From base class CUsbPersonality

    /**
     * From CUsbPersonality
     * Confirm unload in case of personality change 
     * if msc state is active.
     *
     * @since S60 3.0
     * @param aStatus Status of the ended operation.
     */
    virtual void ConfirmPersonalityUnload(TRequestStatus& aStatus);

    /**
     * From CUsbPersonality
     * Called by personality handler when personality start needs to be
     * prepared.
     *
     * @since Series 60 3.0
     * @param aStatus Status of the ended operation.
     */
    virtual void PreparePersonalityStart(TRequestStatus& aStatus);

    /**
     * From CUsbPersonality
     * Called by personality handler when personality start needs to be
     * finished. Calls DoFinishPersonalityStartL() and provides error
     * handling for it.
     *
     * @since Series 60 3.0
     * @param aStatus Status of the ended operation.
     */
    virtual void FinishPersonalityStart(TRequestStatus& aStatus);

    /**
     * From CUsbPersonality
     * Called by personality handler when personality stop needs to be 
     * prepared. For this personality: Remounts FAT File System and 
     * dismounts Mass Storage File System, Switch back from offline mode.
     *
     * @since Series 60 3.0
     * @param aStatus Status of the ended operation.
     */
    virtual void PreparePersonalityStop(TRequestStatus& aStatus);

    /**
     * From CUsbPersonality
     * Called by personality handler when personality stop needs to be 
     * finished. Calls DoFinishPersonalityStopL() and provides error
     * handling for it.
     *
     * @since Series 60 3.0
     * @param aStatus Status of the ended operation.
     */
     virtual void FinishPersonalityStop(TRequestStatus& aStatus);
        
    /**
     * From CUsbPersonality
     * State change notify
     *
     * @since Series 60 3.0
     * @param aState state of the device
     */
    virtual void StateChangeNotify( TUsbDeviceState aState );
        
public:

    /**
     * If dismount timer expires, this callback is called.
     *
     * @since Series 60 3.2
     * @param aPtr Pointer to this class
     * @return KErrNone is always returned
     */
    static TInt DismountFatCallBack(TAny* aPtr);
                            
private:

    /**
     * Does the forced dismount.
     *
     * @since Series 60 3.2
     */
    void ForciblyDismountFat();

    /**
     * Complete owner class request if any.
     *
     * @since Series 60 3.2
     */
    void CompleteRequest(TInt aError);
                
    /**
     * Start dismounting FAT from the drives
     * Also mounts mass storage file system, when all FATs dismounted.
     *
     * @since Series 60 5.0
     */
    void StartDismountFat();

    /**
     * Add mass storage file system.
     *
     * @return KErrNone if successful or already added
     * @since Series 60 3.2
     */
    TInt AddMassStorageFileSystem();
                        
    /**
     * Remove mass storage file system.
     *
     * @since Series 60 5.0
     */
    void RemoveMassStorageFileSystem();
                        
    /**
     * Mount mass storage to all the drives
     * The mass storage is mounted to all the drives in normal global
     * system state. If device is not locked, the drives are mounted also in 
     * charging global system state. 
     */
    void MountMassStorage();
                        
    /**
     * Returns drives with available MMC card.
     * @param aDrivesWithMmcInserted Array to which result should be written
     */
    TInt GetDrives();

    /**
     * Dismounts FAT File System from the drive.
     * @param aDrive Drive from which dismounting should be done
     */
    void DismountFat( TInt aDrive );

    /**
     * Mounts Mass Storage File System into the drive.
     * @param aDrive Drive to which mounting should be done
     * @return error
     */
    TInt TryMountMassStorage( TInt aDrive );

    /**
     * Dismounts Mass Storage File System from the drive.
     * @param aDrive The drive for the dismount
     * @return error
     */
    TInt TryDismountMassStorage( TInt aDrive );

    /**
     * Mounts FAT File System to the drive.
     * @param aDrive The drive for the mount
     * @return error
     */
    TInt TryMountFat( TInt aDrive );

    /**
     * C++ constructor
     */
    CUsbActiveMscHandler(TUsbPersonalityParams& aPersonalityParams);

    /**
     * By default Symbian 2nd phase constructor is private.
     */
    void ConstructL();
        
    /**
     * Get global system state
     * @return state
     */     
    TUsbGlobalSystemState GlobalSystemState();
    
    /**
     * Check if device is (scheduled to be) locked or not
     * @return ETrue/EFalse
     */     
    TBool DeviceLocked();
    
    /**
     * Get Lock Time setting
     * @return time
     */     
    TInt AutoLockTime();
    
    /**
     * Get lock status setting
     * @return status
     */     
    TInt AutoLockStatus();

    /**
     * Unmount Mass storage
     * This is the reverse of StartMountMassStorage.
     *
     * @since Series 60 5.0
     */
    void UnmountMassStorage();

    /**
     * Get the file system mounted to the drive
     *
     * @param aDrive The drive which file system is required.
     * @return The file system. 
     * @since Series 60 5.0
     */
    TUsbFileSystem GetDriveFileSystem( TInt aDrive );

    /**
     * Tells whether device encryption is supported on device or not.
     *
     * @param None
     * @return TBool 
     * @since TimeBox 9.2
     */
    TBool IsDeviceEncryptionSupportedL();
    
	/**
     * Tells whether device encryption is supported on device or not.
     *
     * @param  aDriveLetter pass in the drive that need to be checked
     * @return TBool
     * @since TimeBox 9.2
     */
	TBool IsEncProtectionRequired(const TInt& aDriveLetter);
	
	/**
     * Dynamic load devenccommonutils.dll.
     *
     * @param  None
     * @since TimeBox9.2
     */
	void LoadDevEncSessionL();
	
	/**
     * Unload devenccommonutils.dll.
     *
     * @param  None
     * @since TimeBox9.2
     */
	void UnloadDevEncSession();

	 
private: // Data
    /**
     * define the states of Mass Storage personality
     */
    enum TUsbMscState
        {
        EUsbMscStateIdle,
        EUsbMscStateStarting,
        EUsbMscStateMounting,
        EUsbMscStateFileTransfer,
        EUsbMscStateStopping,
        EUsbMscStateForciblyDismounting
        };

    /**
     * state of Mass Storage Class
     */
    TUsbMscState iMscState;

    /**
     * File server session handle
     */
    RFs iFs;
    
    /** 
     * Indicates whether MSFS has already been added to file server
     */
    TBool iMsfsAdded;

    /**
     * Request to complete later
     */
    TRequestStatus* iRequestStatus;

    /**
     * removable drives in the system
     */
    RArray<TInt> iDrives;
    
    /**
     * Needed for multiple drive support
     */
    TInt iDriveIndex;
    
    /**
     * Dismount timer: If expired forced dismount used.
     */
    CUsbMscPersonalityTimer* iDismountFatTimer;
    
    /**
     * Packages for queries
     */
    TUSBQueriesNotifierParamsPckg iQueryParams;
    
    /**
     * Dummy stores for queries and notes
     */
    TBuf8<1> iDummy;
    
    /**
     * Used to get device lock settings
     */
    CRepository* iRepository;
    
    /**
     * FAT has been unmounted or MSC mounted.
     */
    TBool iMountChanged;

    /**
     * If query note shown by us
     */
    TBool iIsQueryNoteShown;
    
    /**
     * Used to load devenccommonutils.dll and check the device encryption status
     */
    RLibrary iLibrary;
    CDevEncSessionBase* iDevEncSession;
    };

#endif   // USBACTIVEMSCHANDLER_H

// End of File