commonuis/CommonUi/inc/DocDefaultHandler.h
changeset 0 2f259fa3e83a
child 18 fcdfafb36fe7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuis/CommonUi/inc/DocDefaultHandler.h	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,769 @@
+/*
+* Copyright (c) 2002-2007 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:  Concrete implementation of the default (Epoc way) document handling.
+*                Called and constructed by CDocumentHandler.
+*
+*/
+
+
+#if !defined DEFAULTHANDLER_H
+#define DEFAULTHANDLER_H
+
+// INCLUDE FILES
+
+#include <apgcli.h>             // RApaLsSession
+#include <s32mem.h>             // For TStreamId
+
+#include "DocumentHandler.h"    // Common Constants etc.
+#include "DocHandlerBase.h"     // Base class
+#include "DocConstants.h"       // Constants of DocumentHandler
+
+#include <AiwGenericParam.hrh>	// Generic parameters
+#include <AknServerApp.h>       // MAknServerAppExitObserver
+#include <AknOpenFileService.h> // CAknOpenFileService
+
+#include "AiwCommon.h"          // CAiwGenericParamList
+
+
+// CONSTANTS
+
+// FORWARD DECLARATIONS
+class CDirectFileStore;
+class CEikDocument;
+class CIdle;
+
+//  CLASS DECLARATION
+/**
+* Default (Epoc-style) implementation of CHandlerBase class.
+* Constructed and called from CDocumentHandler.
+*/
+NONSHARABLE_CLASS(CDocDefaultHandler) :
+            public CDocHandlerBase,       
+            public MAknServerAppExitObserver
+    {
+
+    public:           // Constructors and destructor
+
+        /**
+        * Two-phased constructor. Leaves the contructed instance in to the
+        * clean up stack.
+        *
+        * @param aDataType      Data type
+        * @param aUid           UID of the handler app
+        * @param aDocDispatcher Pointer to DocumentHandler instance
+        * @param aServiceMode   Are we able to Save, Open or do both
+        *
+        * @return Constructed CDefaultHandler
+        */
+        static CDocDefaultHandler* NewLC(
+            const TDataType& aDataType,
+            const TUid& aUid,
+            CDocumentHandler* aDocDispatcher,
+            TDocServiceMode aServiceMode );
+
+        /**
+        * Two-phased constructor.
+        *
+        * @param aDataType      Data type
+        * @param aUid           UID of the handler app
+        * @param aDocDispatcher Pointer to DocumentHandler instance
+        * @param aServiceMode   Are we able to Save, Open or do both
+        *
+        * @return Constructed CDefaultHandler
+        */
+        static CDocDefaultHandler* NewL(
+            const TDataType& aDataType,
+            const TUid& aUid,
+            CDocumentHandler* aDocDispatcher,
+            TDocServiceMode aServiceMode );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CDocDefaultHandler();
+
+    protected:
+
+        /**
+        * C++ constructor.
+        *
+        * @param aDataType      A mime type for the content
+        * @param aUid           UID of the handler app
+        * @param aDocDispatcher Pointer to DocumentHandler instance
+        * @param aServiceMode   Are we able to Save, Open or do both
+        */
+        CDocDefaultHandler(
+            const TDataType& aDataType,
+            const TUid& aUid,
+            CDocumentHandler* aDocDispatcher,
+            TDocServiceMode aServiceMode );
+
+        /**
+        * EPOC constructor. (Base construction for subclasses.)
+        */
+        void BaseConstructL();
+
+    private:
+
+        /**
+        * C++ copy constructor
+        */
+        CDocDefaultHandler( const CDocDefaultHandler& );
+
+    public:           // Functions from CHandlerBase
+
+        /**
+        * Get Status code
+        *
+        * @return       A Status code for the latest operation.
+        */
+        TInt Status() const;
+
+        /*
+        * Get a path where the content was saved.
+        *
+        * @param aPath  Return full file name with a path. If the content
+        *               was not saved into a file, returns some string
+        *               representing the object.
+        *
+        */
+        void GetPath( TDes& aPath ) const;
+
+        /**
+        * Get the Uid of handler application. 
+        *
+        * @param aUid Uid of the handler application. In case of 
+        *             media files this is MediaGallery's Uid.
+        */
+        void HandlerAppUid( TUid& aUid ) const;
+
+        /**
+        * By default the saving is possible with the default handler.
+        *
+        * @return       Always ETrue
+        */
+        TBool CanSave() const;
+
+        /**
+        * By default the launching is possible with the default handler.
+        *
+        * @return       Always ETrue
+        */
+        TBool CanOpen() const;
+
+        /**
+        * Copy/Move a file to the correct directory. Correct operation
+        * is decided based on DocOperation(). Possible operations are
+        * EDocCopy, EDocMove and EDocSilentMove.
+        *
+        * @param        aAttr File attributes.
+        *
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        virtual TInt CopyOrMoveL( const TUint aAttr );
+        
+        /**
+        * Copy a file to the correct directory. 
+        *
+        * @param        aAttr File attributes.
+        * @param        aSourceFile File handle to copied
+        *
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        virtual TInt CopyHandleL( const RFile& aSourceFile, const TUint aAttr );
+
+        /**
+        * Save aContent to the correct directory.
+        *
+        * @param aContent A content buffer
+        * @param aAttr    File attributes defined in
+        *                 \epoc32\include\f32file.h
+        * @param aFileName Filename of saved file
+        *
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        TInt SaveTempFileL( 
+            const TDesC8& aContent, 
+            const TUint aAttr,
+            TDes& aFileName );
+
+        /**
+        * Open a file standalone
+        *
+        * @param aFileHandle File to open 
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        virtual TInt OpenFileL(RFile& aFileHandle);
+
+        /**
+        * Open a file embedded
+        *
+        * @param aFileHandle File to open  
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        virtual TInt OpenFileEmbeddedL(RFile& aFileHandle);
+
+        /**
+        * Set source file name.
+        *
+        * @param aFileName A source file name with full path
+        *
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        TInt SetSrcFileName( const TDesC& aFileName );
+
+        /**
+        * Set destination file name.
+        *
+        * @param aFileName A destination file name without path
+        *
+        * @return       KErrNone if success. If fail, a fail reason
+        *               constant declared in CDocumentHandler.h
+        */
+        TInt SetDestName( const TDesC& aFileName );
+
+        /**
+        * Set the root path of the memory where the file should be moved.
+        * This method is used only in case of SilentMoveL. 
+        *
+        * @param aRootPath Root path of memory
+        *
+        * @return           KErrNone if success. If fail, a fail reason 
+        *                   constant declared in CDocumentHandler.h
+        */
+        TInt SetRootPath( const TDesC& aRootPath );
+
+        /**
+        * Creates parameter store for given parameter list.
+        * These parameters will be passed to embedded application.
+        *
+        * @param aParams a parameter list to be passed.
+        */
+        virtual void AddToParamListL(const CAiwGenericParamList& aParams);
+
+        /**
+        * Returns list of output parameters.
+        *
+        * @param aParams a parameter list to be passed.
+        */
+        const CAiwGenericParamList* OutputParamsL();
+        
+        /**
+        * Utility method for deleting temporary file
+        * CDocumentHandler will use this method for deleting temporary file
+        *
+        * @param aFileName a file to be deleted
+        */
+        void DeleteFile(const TDesC& aFileName);
+        
+        /**
+        * Append a correct file name extension for some content. 
+        * This is needed, because we want quarantee that file extension
+        * is correct with mime-type. Some content types cannot be recognized
+        * based on the data it self. (No header information etc.)
+        *
+        * See related contents and extensions from documenthandlerui.rss:
+        * r_extension_guaranteed_mime_types and r_extension_guaranteed_extensions
+        *
+        * @param aFileName  Append extension to this filename.
+        * @param aDataType  The content type of the file.
+        */
+        void CheckFileNameExtensionL(
+            TDes& aFileName,
+            const TDataType& aDatatype );
+
+
+    protected:        // New functions
+
+        /**
+        * Set the data type of the content. 
+        *
+        * @param aDataType A data type.
+        */
+        void SetDataType( const TDataType& aDataType );
+
+        /**
+        * Get the data directory. Leaves on errors.
+        *
+        * @param aDataType A data type
+        * @param aUid      An application uid
+        * @param aPath     A path to the data directory. Either main doc dir or
+        *                  a mime type specific directory.
+        * @param aDataSize Size of data
+        * @return          Error code
+        */
+        virtual TInt GetDataDirL(
+            const TDataType& aDataType,
+            const TUid& aUid,
+            TDes& aPath,
+            TInt aDataSize);
+
+        /**
+        * Check disk space for file, generate filename and
+        * and show save as query to user before copying the file.
+        * CopyOrMoveL and CopyHandleL uses this function.
+        *
+        * @param aDataSize Size of data in bytes
+        * @return          Error code
+        */
+        virtual TInt CopyChecksAndQueriesL(TInt aDataSize);
+
+        /**
+        * Check disk space for file and generate filename.
+        * SaveTempFileL uses this function.
+        *
+        * @param aContent  Data to save
+        *
+        * @return          Error code
+        */
+        virtual TInt SaveChecksL(const TDesC8& aContent);
+
+        /**
+        * Query user to overwrite or rename an existing file.
+        *
+        * @param aPath     A absolute path to the file. Will be
+        *                  modified to an unique name.
+        *                  E.g. from data.dat to data(01).dat etc.
+        * @return          EDocFileCancelWrite - User canceled
+        *                  EDocFileOverWrite   - Overwrite
+        *                  EDocFileRenameNew   - New name for content
+        */
+        TDocSaveAsResult SaveAsQueryL( TFileName& aPath );
+
+        /**
+        * Launch a CAknQueryDialog dialog.
+        *
+        * @param aDialogTypeResID   Resource ID for the dialog.
+        * @param aStringResId       String resource ID for the prompt.
+        * @param aFileName          The resource file name.
+        *
+        * @return                   Error value
+        */
+        TInt RunQueryDialogL(
+            TInt aDialogTypeResID,
+            TInt aStringResID,
+            const TDesC& aFileName );
+
+        /**
+        * Generate a file name for a nameless buffer. First try to load
+        * default document file name from handler application's resources.
+        * If that fail read a general name from the docHadler's resources.
+        *
+        * @param aUid       An UID for handler application.
+        * @param aFileName  The generated file name will be in here
+        * @param aDataType  A data type
+        * @param aDataSize  Size of data
+        * @return           Error code
+        */
+        virtual TInt GenerateFileNameL(
+            const TUid& aUid,
+            TDes& aFileName,
+            const TDataType& aDataType,
+            TInt aDataSize);
+
+        /**
+        * Leave if the flash disk space would be under critical level.
+        *
+        * @param bytes      Number of bytes to be writen.
+        */
+        void CheckDiskspaceL( TInt bytes );
+
+        /**
+        * Check if the file is in use.
+        *
+        * @param aFileName  File name
+        *
+        * @return           ETrue if the file is locked or in use, else EFalse.
+        */
+        TBool IsFileInUse( const TDesC& aFileName );
+
+        /**
+        * Check if the file is writable.
+        *
+        * @param aFileName  File name
+        *
+        * @return           ETrue if the file is writable
+        *                   and not in use, else EFalse.
+        */
+        TBool IsFileWritableL( const TDesC& aFileName );
+
+        /**
+        * Run query dialog for asking user if
+        * he wants to rename the file.
+        *
+        * @param aName      File name
+        *
+        * @return           ETrue if yes, else EFalse.
+        */
+        TBool QueryRenameL( const TDesC& aName );
+
+        /**
+        * Run query dialog for asking user if
+        * he wants to overwrite the old file.
+        *
+        * @param aName      File name
+        *
+        * @return           ETrue if yes, else EFalse.
+        */
+        TBool QueryOverWriteL( const TDesC& aName );
+
+        /**
+        * Run query dialog for asking the new name for a file
+        *
+        * @param aName      Old file name
+        * @param aMaxLen    Max name length
+        *
+        * @return           ETrue if user pressed ok, EFalse if cancel
+        */
+        TBool QueryNewNameL( TFileName& aName, const TInt aMaxLen );
+
+        /**
+        * Creates a new name (based on existing name) without asking 
+        * anything from user.
+        */
+        void GenerateTempFileNameL( TFileName& aName, const TInt aMaxLen );
+
+        /**
+        * Get the operation
+        */
+        TDocOperation DocOperation() const;
+
+        /**
+        * Set and return a SetAndReturnStatus code for the latest operation.
+        *
+        * @param aErrorCode Any error code defined in global Epoc headers of
+        *        DocumentHandler specific error code.
+        * @return The same error code
+        */
+        TInt SetAndReturnStatus( const TInt aErrorCode );
+
+        /**
+        * Construct a correct application information data. I.e. Construct
+        * iAppInfo member variable. Special handlers should override this
+        * function if the handler application is not the same as the viewer
+        * application. E.g. Mediagallery vs. ImageViewer.
+        * This function is called from BaseConstructL().
+        */
+        virtual void PopulateAppInfo();
+
+        /**
+        * Construct a correct application information data defined by aUid.
+        * @param
+        */
+        void PopulateAppInfo( const TUid& aUid );
+
+        /**
+        * Maximum length for the file name and extension.
+        *
+        * @return Length
+        */
+        virtual TInt MaxNameLen();
+
+        /**
+        * Is the operation for viewing. 
+        *
+        * @param aOperation One of the API operations.
+        *
+        * @return ETrue if yes, otherwise EFalse.
+        */
+        virtual TBool IsViewerOperation( TDocOperation aOperation );
+
+        /**
+        * Is the confirmation note allowed.
+        *
+        * @return ETrue if yes, otherwise EFalse.
+        */
+        virtual TBool IsConfNoteAllowed();
+
+        /**
+        * Should the naming dialog hide the file name extension.
+        *
+        * @return Allways EFalse
+        */
+        virtual TBool HideFileExtension();
+
+        /**
+        * Replace the filename extension with aExt. If there
+        * is no previous extension just append aExt.
+        *
+        * @param aName The file name in descriptor.
+        * @param aExt  The extension
+        */
+        void ReplaceExtension( TDes& aName, const TDesC& aExt );
+
+        /**
+        * Add the Document Handler's resources to resource pool.
+        * @see RemoveResources
+        */
+        void AddResourcesL();
+
+        /**
+        * Remove the Document Handler's resources from resource pool.
+        * @see AddResourcesL
+        */
+        void RemoveResources();
+
+        /**
+        * Queries if given parameter type is already in input param list.
+        *
+        * @return ETrue if given parameter type is already in list.
+        */
+        TBool IsParameterAlreadyInList(TGenericParamId aId);
+        
+        /**
+        * Finds out wheter this data type can be stored
+        * to MMC. This information can be found from
+        * resource file by Uid value.
+        */
+        TBool CanBeSavedToMmcL();
+
+        /**
+        * Internal helper function needed for parsing filenames from urls.
+        */
+        void ReverseSlashes(TDes& aString);
+
+        /**
+        * Get folder for given datatype. Default folder for default datatypes
+        * are defined at documenthandlerui.rss.
+        */
+        TBool GetDefaultFolderForDataTypeL(const TDataType& aDataType, TDes& result);
+
+        /**
+        * Notifies mediagallery that its content may have been changed.
+        */
+        void UpdateMediaGalleryIfNeededL();
+        
+        /**
+        * Notifies DCF Repository about new file
+        */
+        void UpdateDCFRepositoryL();
+        
+        /**
+        * Forwards server application exit to registered listeners.
+        */   
+        void HandleServerAppExit(TInt aReason);
+
+        /**
+        * Returns ETrue if data is for installer.
+        */
+        TBool IsInstallerData() const;
+        
+        /**
+        * Initialize aReader with aResourceID. Does not need access to CCoeEnv.
+        */
+        void CreateDocResourceReaderLC(TResourceReader& aReader, TInt aResourceID);
+
+    private:
+
+        /**
+        * Prohibit the assignment operator
+        */
+        CDocDefaultHandler operator=( const CDocDefaultHandler& );
+
+        /**
+        * Set temporary path to aPath.
+        */
+        TInt SetTemporaryPathL(TInt aDataSize, TDes& aPath, TBool aPrivate);
+        
+        /**
+        * Check if it is allowed to save content to MMC. Save result
+        * to iMMCSaveAllowed member variable.
+        */
+        void IsMMCSaveAllowedL(const TDesC& aSourceFile);
+        
+        /**
+        * Check if MMC card is locked        
+        */
+        TBool IsMMCLocked();
+        
+        /**
+        * Mount MMC drive.        
+        */
+        TInt TryMountMMC();
+        
+        /**
+        * Check if it is allowed to save content to MMC. Save result
+        * to iMMCSaveAllowed member variable.
+        */
+        void IsMMCSaveAllowedL(const RFile& aSourceFile);
+        
+        /**
+        * Used for notifying server app exit with CIdle when
+        * OpenFileEmbedded operation has actually opened stand-alone.
+        */
+        static TInt IdleNotifyServerAppExit( TAny* aParam );
+        
+        /**
+        * Finds correct text for Save confirmation note.
+        *
+        * @param aText result of the query will be stored here.
+        */
+        void ConfirmationNoteTextL( TPtr& aText );
+        
+        /**
+        * Finds correct text for Save wait note.
+        *
+        * @param aText result of the query will be stored here.
+        */        
+        void WaitNoteTextL( TPtr& aText );
+        
+        /**
+        * Resolve correct caption text for notes.
+        *
+        * @param aCaption result will be stored here.
+        */  
+        void ResolveCaptionName( TApaAppCaption& aCaption );
+#ifdef RD_MULTIPLE_DRIVE 
+         /**
+         * check to see if the content can only be saved to Phone memory
+         *
+         * @param 
+         */        
+        TBool CanOnlyBeSavedToPhoneMemoryL();  
+        /**
+         * gets the number of system drives available in phone including phone memory
+         * This should not be called when RD_MULTIPLE_DRIVE flag is diabled
+         * @param 
+         */       
+        TInt GetAvailableDrivesCountL();
+        /**
+         * check drive availability ie is it available for user read/write operations
+         * This should not be called when RD_MULTIPLE_DRIVE flag is diabled
+         * @param 
+         */  
+        TBool IsDriveAvailableL(const TInt & aDriveNumber);
+#endif
+    protected:
+
+        /*
+        * Application list server session client
+        */
+        RApaLsSession* iApaLs;
+
+        /**
+        * Data type of the content
+        */
+        TDataType iDataType;
+
+        /**
+        * Destination filename
+        */
+        TFileName iDestFile;
+
+        /**
+        * DocumentHandler (Dispatcher object)
+        */
+        CDocumentHandler* iDocDispatcher;
+
+        /**
+        * FileManager
+        */
+        CFileMan* iFileManager;
+
+        /**
+        * FileServer
+        */
+        RFs iFs;
+
+        /**
+        * Is the content saved to temp dir. Remember to delete temp files!
+        */
+        TBool iSavedAsTemp;
+
+        /**
+        * Flag for service mode.
+        */
+        TDocServiceMode iServiceMode;
+
+        /**
+        * Source filename
+        */
+        TFileName iSourceFile;
+
+        /**
+        * Request status for the latest operation.
+        */
+        TInt iStatus;
+
+        /**
+        * Handler applications UID
+        */
+        TUid iUid;
+
+        /**
+        * Application information
+        */
+        TApaAppInfo iAppInfo;
+
+        /**
+        * Is the exit already notified.
+        */
+        TBool iExitNotified;
+
+        /**
+        * Generic param list for parameter passing
+        */
+        CAiwGenericParamList* iAiwParams;
+
+        /**
+        * Generic param list for parameter passing
+        */
+        CAiwGenericParamList* iOutAiwParams;
+
+        /**
+        * Handle to open file service framework.
+        */
+        CAknOpenFileService* iOpenService; 
+
+        /**
+        * List of mime types whose extension will be overriden when saved.
+        */
+        CDesCArrayFlat* iMimeExtensions;
+
+        /**
+        * List of extensions mapping to iMimeExtensions list.
+        */
+        CDesCArrayFlat* iExtensions;
+
+        /**
+        * Is data media gallery data.
+        */
+        TBool iMediaGalleryData;
+
+        /**
+        * Root path of memory. This variable is used only in case of SilentMoveL.
+        */
+        TBuf<32> iRootPath;
+        
+        /**
+        * Is save to MMC allowed for DRM encrypted content.
+        */
+        TBool iMMCSaveAllowed;
+
+        /**
+        * Used for notifying server app exit with CIdle when
+        * OpenFileEmbedded operation has actually opened stand-alone.
+        */
+        CIdle* iIdle;        
+    };
+
+#endif // !defined DEFAULTHANDLER_
+
+// End of File