diff -r 000000000000 -r 2f259fa3e83a commonuis/CommonUi/inc/DocDefaultHandler.h --- /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 // RApaLsSession +#include // For TStreamId + +#include "DocumentHandler.h" // Common Constants etc. +#include "DocHandlerBase.h" // Base class +#include "DocConstants.h" // Constants of DocumentHandler + +#include // Generic parameters +#include // MAknServerAppExitObserver +#include // 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