--- /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