--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/codeng/inc/CodEngBase.h Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,710 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Declaration of class CCodEngBase.
+*
+*
+*/
+
+
+#ifndef COD_ENG_BASE_H
+#define COD_ENG_BASE_H
+
+// INCLUDES
+
+#include <e32base.h>
+#include <f32file.h>
+#include <apmrec.h>
+#include <apparc.h>
+#include "CodSaver.h"
+#include <CodDownload.h>
+
+// FORWARD DECLARATION
+
+class CCodData;
+class CDocumentHandler;
+class CEikProcess;
+class MCodLoadObserver;
+class CConnection;
+class CHttpLoader;
+class CRoapData;
+class TCodProgress;
+class CBodyPart;
+class CAiwGenericParamList;
+
+class CHeaderField;
+class CDownloadDataClient;
+class CMediaDataClient;
+
+// CONSTANTS
+#ifdef RD_MULTIPLE_DRIVE
+const TInt KMaxDriveListStrLen = KMaxDrives << 1;
+#endif
+
+/// Estimated data transfer for notify. Needed for progress.
+LOCAL_D const TInt KCodNotifyTraffic = 1024;
+
+_LIT( KDownloadFolderFormat, "%S%x\\%S\\" ); // <DRIVE> <KCodDefaultTempDir> \\ <uid> \\ <KTempFilesCodDirName>
+
+_LIT( KCodDefaultTempDir, "\\system\\dmgr\\" );
+_LIT( KDmDefaultDir, "c:\\system\\dmgr\\" );
+_LIT( KInfoFilesCodDirName, "codinfo" );
+_LIT( KTempFilesCodDirName, "contents" );
+
+
+// CLASS DECLARATION
+
+/**
+* COD Handler Engine Base (processing COD, fetching content, posting status).
+*/
+NONSHARABLE_CLASS( CCodEngBase ): public CActive, public MCodSaverFactory
+ {
+
+ public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CCodEngBase();
+
+
+ public: // new methods
+
+ /**
+ * Process non-Unicode buffer and set data. Character set conversion is
+ * applied first. Character set is auto-detected if not supplied.
+ * Do this first before attempting anything else.
+ * @param aBuf Raw COD content buffer.
+ * @param aStatus Completes when done.
+ * @param aParams Parameters or NULL.
+ * @param aParts If descriptor is part of a multipart/related, body
+ * parts of the multipart/related content. NULL if not multipart.
+ */
+ IMPORT_C void SetL
+ (
+ const TDesC8& aBuf,
+ TRequestStatus* aStatus,
+ const CAiwGenericParamList* aParams,
+ const RPointerArray<CBodyPart>* aParts
+ );
+
+ /**
+ * Return current COD.
+ * @return Current COD data.
+ */
+ IMPORT_C const CCodData& Data() const;
+
+ /**
+ * Set or unset observer (pass NULL to unset).
+ * Panics if already set; unsetting more is allowed.
+ * @param aObserver Observer to set or NULL to unset.
+ */
+ IMPORT_C void SetObserver( MCodLoadObserver* aObserver );
+
+ /**
+ * Copy data from CCodData to CDownloadDataClient.
+ */
+ void ConvertCodDataToDownloadDataL( CDownloadDataClient*& aDlData );
+
+ /**
+ * Copy data from CCodData to CDownloadDataClient.
+ */
+ void ConvertMOToMediaDataL( CMediaDataClient*& aMOData, TInt aMOIndex );
+
+ /**
+ * Inform DownloadMgrClntSrv about updated CodData.
+ */
+ void UpdateMediaInfoL();
+
+ /**
+ * Inform DownloadMgrClntSrv about updated Media Object (Track).
+ */
+ void UpdateTrackInfoL();
+
+ /**
+ * Inform DownloadMgrClntSrv about change in Type of a content.
+ */
+ void ContentTypeChanged();
+
+ public: // command handling
+
+ /**
+ * Accept COD (download content, post status);
+ * @param aStatus Completes when done.
+ */
+ IMPORT_C void Accept( TRequestStatus* aStatus );
+
+ /**
+ * Reject COD (don't download content, post status);
+ * @param aStatus Completes when done.
+ */
+ IMPORT_C void Reject( TRequestStatus* aStatus );
+
+ /**
+ * Similar to Cancel, but further processing may be invoked (e.g.
+ * install-notify), so the request may not complete immediately.
+ * Please use this method (instead of Cancel) for user cancellation of
+ * downloads. Keep Cancel for error situations (final cleanup etc.)
+ */
+ IMPORT_C void Stop();
+
+ public: // checking results
+
+ /**
+ * Check if downloading to removable media.
+ * @return ETrue if downloading to removable media.
+ */
+ IMPORT_C TBool RemovableMedia() const;
+
+ /**
+ * Get path of saved content (or empty string).
+ * @return Path of saved content. Fits to KMaxFileName.
+ */
+ IMPORT_C TPtrC GetPath() const;
+
+ /**
+ * Get type of saved content.
+ * @return Type of saved content.
+ */
+ IMPORT_C const TDataType& GetType() const;
+
+ /**
+ * Get UID of handler for the saved content.
+ * @return Handler UID.
+ */
+ IMPORT_C TUid GetHandler() const;
+
+ /**
+ * TODO can this be removed form API?
+ * Get HTTP status code of last operation. Default value 900.
+ * @return HTTP status code.
+ */
+ IMPORT_C TInt GetStatusCode() const;
+
+ /**
+ * Get ROAP data (or NULL if no ROAP was involved).
+ * @return ROAP data. This is NULL if no ROAP was involved.
+ */
+ IMPORT_C const CRoapData* GetRoapData() const;
+
+ /**
+ * Set attach to download for the COD (set from the DlMgr client)
+ * If aValue equals to ETrue it means that file is playing progressively
+ */
+ IMPORT_C void SetCodDlAttached(const TBool aValue);
+
+ /**
+ * for Paused Download the info files are read
+ * Do this first before attempting anything else.
+ * @param aDownloadId the unique download ID
+ * @param aDlUid the application Uid
+ * @param aParams Parameters or NULL.
+ * @param aParts If descriptor is part of a multipart/related, body
+ */
+ IMPORT_C void SetL
+ (
+ const TInt aDownloadId,
+ const TUid aDlUid,
+ const RPointerArray<CBodyPart>* aParts
+ );
+
+ /**
+ * Start the paused download
+ * @param aParams, parameters from Download Manager server
+ * @param aStatus , active object status
+ */
+ IMPORT_C void Start( const CAiwGenericParamList* aParams, TRequestStatus* aStatus );
+
+ /**
+ * Return current COD.
+ * @return Current COD data.
+ */
+ IMPORT_C HBufC8* UpdatedDownloadDataL();
+
+ /**
+ * Return stream descriptor for single media object (track).
+ * @return Current COD data.
+ */
+ IMPORT_C HBufC8* UpdatedTrackDataL(TInt& aValue);
+
+ /**
+ * Get Destination file name
+ * @param aMOIndex media object index between 1 to 'n'
+ * @return NULL if index out of range
+ */
+ IMPORT_C TPtrC GetDestFilePath (TInt aMOIndex ) const;
+
+ /**
+ * Perform Pause for COD download.
+ */
+ IMPORT_C void Pause();
+
+ /**
+ * Returns a flag saying whether or not download is pausable
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ IMPORT_C TBool Pausable();
+
+ /**
+ *Returns the currently Active download
+ * @return Index of the currently active download
+ */
+ IMPORT_C TInt ActiveDownload( );
+
+ /**
+ * TODO can this be removed form API?
+ * Get HTTP status code of last operation. Default value EFailedPermanent.
+ * @return HTTP status code.
+ */
+ IMPORT_C TCodDownloadProgress::TState GetProductStatusCode() const;
+ /**
+ * Check if download has Preview-only rights
+ * @return ETrue if download is Preview-only
+ */
+ TBool IsDrmPreviewOnly() { return iDrmPreviewOnly; }
+
+ /**
+ * Set Download descriptor for OMA 2
+ */
+ void SetDd2Type(TBool aIsDd2){iIsDd2 = aIsDd2;}
+
+ /**
+ * Creates download info folder
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ void CODDownloadInfoFolder( TDes& aFolder ) const;
+
+ /**
+ * Returns the download ID
+ * @return DownloadID
+ * @Added in OMA pause-resume feature
+ */
+ TUint32 DownloadID();
+
+ /**
+ * Updates the download file path
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ void StoreFilePathsL(TPtr8& aBuf);
+
+ /**
+ * Reads the download file path from info file
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ void LoadFilePathsL(RFile& aInFile);
+
+
+ /**
+ * Updates the pausability of the download
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ void SetPausable(TBool aPausable);
+
+ /**
+ *
+ * To indicate the download is resumed and ready for PD
+ * @return void
+ * @Added in OMA pause-resume feature
+ */
+ void SetResumePDAvailable();
+
+ /**
+ * Returns download info file path
+ * @return file path
+ * @Added in OMA pause-resume feature
+ */
+ TFileName& CodDlInfoFile()
+ {
+ return iCodDlInfoPath;
+ }
+
+ /**
+ * Set iUrl in CCodData
+ */
+ void SetUrlL(const TDesC& aUrl);
+
+ /**
+ * Creates the info files when Cod Engine is started
+ */
+ void StoreInfoFilesL();
+
+ /**
+ * Creates info file for product (CCodData class)
+ */
+ void StoreMainInfoFileL();
+
+ /**
+ * Creates info file for specified media object
+ */
+ void StoreSubInfoFileL( const CArrayPtrFlat<CHeaderField>* aHeaders, TInt aMediaIndex );
+
+ /**
+ * Loads the CodData and MediaObjectData from info files
+ */
+ void LoadMainInfoFileL();
+
+ /**
+ * Loads the CodData from info files
+ */
+ void LoadInfoFilesL();
+
+ /**
+ * Updates the downloaded size in media object
+ */
+ void UpdateDownloadedSize( TInt aSize );
+ /**
+ * Loads the MediaObjectData from info files
+ */
+ void LoadSubInfoFileL( TInt aMediaIndex, CArrayPtrFlat<CHeaderField>* aHeaders );
+
+ protected: // Constructors and destructor
+
+ /**
+ * Constructor.
+ * @param aObserver Observer.
+ */
+ CCodEngBase( MCodLoadObserver* aObserver );
+
+ /**
+ * Second phase constructor. Leaves on failure.
+ * @param aProcess Host process.
+ */
+ void ConstructL( CEikProcess* aProcess );
+
+ protected: // from CActive
+
+ /**
+ * Cancel protocol implementation.
+ */
+ virtual void DoCancel();
+
+ /**
+ * Outstanding request completed.
+ */
+ virtual void RunL();
+
+ /**
+ * Handle error.
+ * @param aError Error code.
+ * @return KErrNone.
+ */
+ virtual TInt RunError( TInt aError );
+
+ protected: // NOT from MApaEmbeddedDocObserver
+
+ /**
+ * Embedded document viewing has ended.
+ * @param aMode Exit mode (actually unused).
+ */
+ void NotifyExit( MApaEmbeddedDocObserver::TExitMode aMode );
+
+ protected: // types
+
+ enum TState ///< State.
+ {
+ EInit, ///< Initial state (no valid data set).
+ ESet, ///< Setting data is requested.
+ EReady, ///< Initial state (valid data set).
+ EStartInstallRoap, ///< Installing Roap trigger from DD2
+ EInstallRoap, ///< RO recieved
+ EStartConnect, ///< Initiate connecting to network.
+ EConnect, ///< Connecting to network.
+ EStartFetch, ///< Fetching requested.
+ EFetch, ///< Fetching content (GET).
+ EStartInstall, ///< Installing content requested.
+ EInstall, ///< Installing content.
+ EStartNotify, ///< Notify requested.
+ ENotify, ///< Reporting status (POST).
+ EPause, ///< Pause state.
+ EMediaChange, ///<Media object change (Track Change)
+ EStartProductNotify, ///<Product Notify Requested
+ EProductNotify ///<Reporting Status (POST)
+ };
+
+ enum TNotificationStatus ///< Notification status.
+ {
+ ENull, ///< No notification.
+ ELoad, ///< Notified about loading.
+ ECancel, ///< Notified about cancelling.
+ EPaused ///< Notified about pause.
+ };
+
+ protected: // state machine parts
+
+ /**
+ * Process buffer and set data.
+ */
+ void SetL();
+
+ /**
+ * Initiate Roap installation.
+ */
+ void StartInstallRoapL();
+
+ /**
+ * Roap installation ended.
+ */
+ void EndInstallRoapL();
+
+ /**
+ * Initiate connecting to network.
+ */
+ void StartConnectL();
+
+ /**
+ * Connecting to network ended.
+ */
+ void EndConnectL();
+
+ /**
+ * Initiate fetching content.
+ */
+ void StartFetchL();
+
+ /**
+ * Fetch ended.
+ */
+ void EndFetchL();
+
+ /**
+ * Initiate installing received content (if any).
+ */
+ void StartInstallL();
+
+ /**
+ * Installing ended.
+ */
+ void EndInstallL();
+
+ /**
+ * Initiate notification.
+ */
+ void StartNotifyL();
+
+ /**
+ * Notification ended.
+ */
+ void EndNotifyL();
+
+ /**
+ *Change Media Object
+ */
+ void ChangeMediaObjectL();
+
+ /**
+ * Clean up and notify parent.
+ */
+ void Done();
+
+ /**
+ * Clean up and notify parent for case of dd2 with license tag.
+ */
+ void DoneDD2();
+
+ /**
+ * Invoke next state asynchronously (via RunL()).
+ * @param aNextState Next state.
+ */
+ void Continue( TState aNextState );
+
+ /**
+ * Complete own request status (if not already completed).
+ * @param aError Error code to complete with.
+ */
+ void SelfComplete( TInt aError );
+
+ /**
+ *Initiate Notification for Product
+ */
+ void StartProductNotifyL();
+
+ /**
+ *End Notification
+ */
+ void EndProductNotifyL();
+
+ protected: // validity checks
+
+ /**
+ * Check data (storage space, MIME type, mandatory attributes etc.)
+ * Leave on any errors.
+ */
+ virtual void CheckDataL() = 0;
+
+ /**
+ * Check device capabilities (MIME types, disk space) before download.
+ * Leaves with KMimeNotSupported, KErrCodInsufficientSpace
+ * (or system error codes).
+ */
+ void CapabilityCheckL();
+
+ protected: // error code / status code conversion.
+
+ /**
+ * Parse data buffer.
+ */
+ virtual void ParseDataL() = 0;
+
+ /**
+ * Get http status code from error code and state. This method contains
+ * the semantic interpretation of errors; e.g. failure to notify due
+ * to loss of service is regarded as success, etc.
+ * @param aError Error code.
+ * @param aState State.
+ * @return HTTP status code (to post).
+ */
+ virtual TInt StatusCode( TInt aError, TState aState ) const = 0;
+
+ /**
+ * Get textual representation of COD notify HTTP code. This text is
+ * sent back as notification.
+ * @param aCode HTTP code, values should only be the ones returned by
+ * StatusCode(). Other values panic.
+ * @return Textual form of HTTP code.
+ */
+ virtual const TDesC8& StatusText( TInt aCode ) const = 0;
+
+ protected: // from MCodSaverFactory
+
+ /**
+ * Create saver object.
+ * @param aType Data type.
+ * @return Saver object for this data type. Ownership not passed.
+ */
+ CCodSaver* CreateSaverL( const TDesC8& aType );
+
+ private: // implementation
+
+ /**
+ * Set root and temp paths.
+ */
+ void SetPathsL();
+
+ /**
+ * Reset paths.
+ */
+ void ResetPaths();
+
+ /**
+ * Set file name based on the temp path file name from the url (for dd2)
+ */
+ void SetFileNameL();
+
+ /**
+ * Append index to file name to avoid overwriting existing file
+ */
+ void SetUniqueFileNameL();
+
+#ifdef RD_MULTIPLE_DRIVE
+
+ /**
+ * Query the dynamic drive list.
+ */
+ HBufC8* QueryDynDriveListLC();
+
+ /**
+ * Query the drive list from the CentRep.
+ */
+ void QueryDriveListL();
+#endif
+
+ protected: // data
+
+ /// COD Data. Owned.
+ CCodData* iData;
+ /// COD buffer. Owned.
+ HBufC* iCodBuf;
+ /// Connection. Owned.
+ CConnection* iConn;
+ /// Http loader. Owned.
+ CHttpLoader* iLoader;
+ /// Current state.
+ TState iState;
+ /// Document handler. Owned.
+ CDocumentHandler* iDocHandler;
+ /// Observer or NULL. Not owned.
+ MCodLoadObserver* iObserver;
+ /// Saver object. Owned.
+ CCodSaver* iSaver;
+ /// Parent status.
+ TRequestStatus* iParentStatus;
+ /// ETrue when Stop is in progress.
+ TBool iStopInProgress;
+ /// Preferred IAP.
+ TUint32 iPreferredIap;
+ /// File Server session.
+ RFs iFs;
+ /// Keeping track of observer notifications.
+ TNotificationStatus iNotificationStatus;
+ /// Data type of saved content.
+ TDataType iType;
+ /// Handler app UID.
+ TUid iHandler;
+ /// Saving to FS.
+ TBool iFsUsed;
+ /// Download id
+ TUint32 iDownloadId;
+ /// App UId
+ TUid iAppUId;
+ /// COD info file path
+ TFileName iCodDlInfoPath;
+
+#ifdef RD_MULTIPLE_DRIVE
+ /// Available memory has enough space to save the content
+ TBool iSpaceAvailOk;
+ /// Drive number that has enough space to save the content
+ TInt iAvailDriveSpace;
+ /// storage precedence from Cenrep
+ TBuf<KMaxDriveListStrLen> iDriveLettersCenRep;
+#else
+ /// Saving to phone memory is OK.
+ TBool iPhoneMemoryOk;
+ /// Saving to MMC is OK.
+ TBool iMmcOk;
+#endif
+ /// Paths on removable media?
+ TBool iRemovableMedia;
+ /// ROAP Data. Owned.
+ CRoapData* iRoapData;
+ /// Progress or NULL. Owned.
+ TCodProgress* iProgress;
+ /// Multipart body parts or NULL. Not owned.
+ const RPointerArray<CBodyPart>* iParts;
+ /// Parameters or NULL. Not owned.
+ const CAiwGenericParamList* iParams;
+ /// download rights are Preview-only
+ TBool iDrmPreviewOnly;
+ /// ETrue if download descriptor is DD2 (OMA v2 download descriptor)
+ TBool iIsDd2;
+ /// ETrue if DD2 has license element
+ TBool iIsLicense;
+ /// ETrue if download is attached (playing progressively)
+ TBool iAttached;
+ /// HTTP code sent in install-notify.
+ TInt iStatusCode;
+ /// Resulting error code (overall result).
+ TInt iResult;
+ /// Confirms whether content type check is done
+ TBool iContentTypeCheck;
+ //True if the download is resumed after pause
+ TBool iResumedDownload;
+
+ };
+
+#endif /* def COD_ENG_BASE_H */