remotemgmt_plat/fota_engine_api/inc/FotaEngine.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:07:52 +0200
changeset 0 b497e44ab2fc
child 25 b183ec05bd8c
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2005-2006 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:  Fotaengine hdr
*
*/



#ifndef __FOTAENGINE_H__
#define __FOTAENGINE_H__

// INCLUDES
#include <e32std.h>
#include <e32def.h>
#include <badesca.h>
#include <AknServerApp.h>
#include <SyncMLDef.h>
#include <apacmdln.h>
#include <apgtask.h>
#include <coemain.h>
#include <s32file.h>
#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <uikon.hrh>
#else
#include <uikon.hrh>
#include <uiklaf/private/pluginuid.hrh>
#endif


#include "fotaengstream.h"
#include "fotaConst.h"

// CONSTANTS
/**  FOTA Server commands */
enum TFotaIPCCmds
	{
	EFotaFirstCommand = RApaAppServiceBase::KServiceCmdBase,
    EDeletePackage,
    EFotaDownload,
    EFotaDownloadAndUpdate,
    EGetResult,
    EGetState,
    EIsPackageStoreSizeAvailable,
    EFotaOpenUpdatePackageStore,
    // Command for getting the downloaded & full size of the update package 
    EFotaGetDownloadUpdatePackageSize,
    // Command to attempt resuming of the download session for downloading the remaining parts of the update package.
    // This service is restriced to DM UI and FMS Server.
    EFotaTryResumeDownload, 
    EFotaUpdate,
    EUpdatePackageDownloadComplete,
    EFotaSendChunk,
    EFotaReleaseChunkHandle,
    EGetUpdatePackageIds,
    EGetUpdateTimestamp,
    EGenericAlertSentForPackage,
    EScheduledUpdate
	};


enum TFotaUpdateStates
    {
    EFotaDefault,
    EFotaPendingGenAlert,
    EFotaDownloadInterrupted,
    EFotaUpdateInterrupted
    };

class TFotaScheduledUpdate;

// CLASS DECLARATION

/**
*	A client handle to a FOTA engine session.
*   @lib    fotaengine.lib
*   @since  Series 60 3.1
*/
class RFotaEngineSession : public RAknAppServiceBase
	{

    friend class    TDP2StreamBuf;  // TDP2StreamBuf will use iChunk

public: // enums

    /** 
    * An enumeration of the firmware update progress state codes as specified
    * in FUMO spec.
    */
    enum TState
	    {
	    /** No firmware update has been started */
	    EIdle                       = 10,
	    /** Client has sent a client initiated request */
	    EClientRequest              = 5,
	    /** There is no data available and download is about to start */
	    EStartingDownload           = 15,
	    /** Download failed and there is no data received */
	    EDownloadFailed             = 20,
  		/** Download is progressing with resume support. This is an internal state and is not a valid FUMO state.
	  	 * Only DM UI and Fota Server can get this state; others get state 30 instead.*/
  		EDownloadProgressingWithResume	= 25,
	    /** Download is progressing without resume support. */ 
	    EDownloadProgressing        = 30,
	    /** Have data and download has been completed successfully */
	    EDownloadComplete           = 40,
	    /** Have data and about to start update */
	    EStartingUpdate             = 50,
	    /** Denotes that the update is currently running, but has not yet 
        completed */
	    EUpdateProgressing          = 60,
	    /** Have data but update failed */
	    EUpdateFailed               = 70,
	    /** Update failed and data deleted or removed */
	    EUpdateFailedNoData         = 80,
	    /** Update complete and data still available */
	    EUpdateSuccessful           = 90,
	    /** Data deleted or removed after a successful update */
	    EUpdateSuccessfulNoData     = 100,	
	    };

	/** 
    * An enumeration of the firmware update result codes as specified
    * in the OMA Firmware Update Management Oobject specification. 
    */

    enum TResult
        {
        EResSuccessful                     = 200,
        EResUserCancelled                  = 401,
        EResCorruptedFWUPD                 = 402,
        EResPackageMismatch                = 403,
        EResFailedSignatureAuthentication  = 404,
        EResUndefinedError                  = 409,
        EResUpdateFailed                   = 410,
        EResMalformedOrBadURL              = 411,
        EResAlternateDLServerUnavailable   = 412,
        EResDLFailDueToDeviceOOM           = 501,
        EResDLFailDueToNWIssues            = 503
        };
		    
public: // Constructors 

	IMPORT_C RFotaEngineSession();
	
public: // new functions
	/**
	* Opens session to Fota Engine
    *         
    * @since  Series 60 3.1
    * @param      None
    * @return     None
	*/
	IMPORT_C void OpenL();
	
	/**
	* Closes session to Fota Engine
    * 
    * @since  Series 60 3.1
    * @param      None
    * @return     None
	*/
	IMPORT_C void Close();
	
		
	/**
	* Called when DM server calls execute command to
	* Firmware update object URI ./FUMO/<x>/Download
	* Initiates a firmware download for the specified update package.
    * 
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
    * 					Mapped to Mgmt URI ./FUMO/<x> in DM Framework
	* @param aPkgURL		Contains the URL where the firmware update package
    *                   or download 
	*					descriptor is located. This URL is used for 
    *                    alternative download
	*					mechanism such as Descriptor Based Download.
	*					Mgmt URI ./FUMO/<x>/Download/PkgURL
	* @param aProfileId	ProfileId of the DM server that send the execute 
    *                   command
	* @param aPkgName	Name associated with the firmware update package,
    *                   may be empty
	* 			        Mgmt URI ./FUMO/<x>/PkgName
	* @param aPkgVersion	Version information for the firmware update 
    *                       package,
    *                       may be empty.
	*					    Mgmt URI./FUMO/<x>/PkgVersion
	* @return			Immediate result of the command
    *                   KErrNotFound: url doesn't exist
	*/
	IMPORT_C TInt Download(
                 const TInt aPkgId
                ,const TDesC8& aPkgURL
                ,const TSmlProfileId aProfileId
                ,const TDesC8& aPkgName
                ,const TDesC8& aPkgVersion);
	
	
	/**
	* Called when DM server calls execute command to
	* Firmware update object URI ./FUMO/<x>/DownloadAndUpdate
	* Initiates a firmware download and an immediate update for the specified
    *                   update package.
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
	*				    Mapped to Mgmt URI ./FUMO/<x> in DM Framework
	* @param aPkgURL	Contains the URL where the firmware update package or
    *                   download descriptor is located. This URL is used for 
    *                   alternative download mechanism such as Descriptor 
    *                   Based Download.
    *                   Mgmt URI ./FUMO/<x>/DownloadAndUpdate/PkgURL
	* @param aProfileId	ProfileId of the DM server that send the execute 
    *                   command
	* @param aPkgName	Name associated with the firmware update package,
    *                   may be empty.
	*				    Mgmt URI ./FUMO/<x>/PkgName
	* @param aPkgVersion	Version information for the firmware update 
    *                       package, may be empty.
	*				        Mgmt URI./FUMO/<x>/PkgVersion
	* @return			Immediate result of the command
	*/
	IMPORT_C TInt DownloadAndUpdate(
                    const TInt aPkgId
                    ,const TDesC8& aPkgURL
                    ,const TSmlProfileId aProfileId
                    ,const TDesC8& aPkgName
                    ,const TDesC8& aPkgVersion);	
	

	/**
	* Called when DM server calls execute command to
	* Firmware update object URI ./FUMO/<x>/Update
	* Initiates a firmware update for the specified update package.
	* Firmware Update Package should be already downloaded to the device 
	* either using DM Large Object or OMA OTA download mechanisms.
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
	* @param aProfileId	ProfileId of the DM server that send the execute 
    *                   command
	* @param aPkgName	Name associated with the firmware update package, may
    *                   be empty.
	*				    Mgmt URI ./FUMO/<x>/PkgName
	* @param aPkgVersion	Version information for the firmware update
    *                       package, may be empty.
	*				        Mgmt URI./FUMO/<x>/PkgVersion
	* @return			Immediate result of the command
	*/
	IMPORT_C TInt Update(
                    const TInt aPkgId
                    ,const TSmlProfileId aProfileId
                    ,const TDesC8& aPkgName
                    ,const TDesC8& aPkgVersion);
	
	
	/**
	* Called when DM server is about to start sending
	* new firmware update package using DM Large Object download.
	* This function is used to enquire if there is enough space available
	* for the firmware update package. 
	* e.g when DM server is about to start sending new firmware update package using 
	* DM Large Object download.

    *
    * @since  Series 60 3.1
	* @param aSize		Size of the firmware update package. Since 
    *                   continuation of interrupted downloads is not supported
    *                   , this means new update package.
	* @return			ETrue if there is enough space available, EFalse 
    *                   otherwise
	*/
	IMPORT_C TBool IsPackageStoreSizeAvailable( const TInt aSize );

	
	/**
    * Opens stream to update package storage.
    * Call UpdatePackageDownloadComplete when package is completely written.
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package. Download mgr
    *                   may use value -1.
	* @param aPkgStore	On return, open stream in which file may be written 
    *                   to. 
	* @return			Immediate result of the command. KErrInUse   store is 
    *                   already opened
	*/
	IMPORT_C TInt OpenUpdatePackageStore( const TInt aPkgId
                        , RWriteStream*& aPkgStore );

	/**
    * Gets the downloaded and full size of the update package.
    * Called by Download Manager during resume operation to know the size of partially downloaded package.
    * @since  Series 60 3.2.2
	* @param aPkgId		Unique identifier of the update package. 
	* @param aDownloadedSize	On return, size of the downloaded package in bytes 
	* @param aTotalSize		On return, full size of the download package in bytes
	*
	* @return KErrNone when successful, else System wide errors
    *
	*/

	IMPORT_C TInt GetDownloadUpdatePackageSize( const TInt aPkgId, TInt& aDownloadedSize, TInt& aTotalSize );

	/**
	* Requests to resume the suspended download of the update package.   
    * Called by Fota Monitory Service. for ex, when network is available again.
    * @since  Series 60 3.2.2
	* @param			None
    *
	* @return			KErrNone when successful, else System wide errors
    *
	*/
	
	IMPORT_C TInt TryResumeDownload();

	
	/**
	* Call this when download of update package is completed. In case of 
    * software error or network interruption, this is not called and package 
    * store is left empty. When this is called, fotaengine closes the stream 
    * and associated storage.
    *
    * @since  Series 60 3.1
	* @param      aPkgId	Unique identifier of the update package. Download
    *                       mgr may use value -1.
    * @return     None
	*/
	IMPORT_C void UpdatePackageDownloadComplete( const TInt aPkgId );
	
	
	/**
	* Called when caller wants to enquire State of specified
	* firmware update. If the State is unknown to FOTA Engine, then it should
	* return EIdle.
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
	* @return			State reached by specified firmware update package 
	*/	
	IMPORT_C TState GetState( const TInt aPkgId );
	
		
	/**
	* Called when caller wants to enquire Final Result Code of specified
	* firmware update operation. If the update operation is not yet reached 
    * final stage, then -1 should be returned to the caller. Possible Final 
    * Result Codes are specified in OMA FUMO Specification. Note that Download
    * operation also ends to final result code e.g. 202 - Successful Download.
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
	* @return			Result code as specified in FUMO specification, -1 if 
    *                   not yet reached final result.
	*/
	IMPORT_C TInt GetResult( const TInt aPkgId );
	
	
	/**
	* Called when DM server deletes firmware update management object
	* from device's management tree. I.e. Delete to mgmt URI ./FUMO/<x>.
	* If FOTA Engine has not yet deleted specified update package, then it 
    * should do so.	
    *
    * @since  Series 60 3.1
	* @param aPkgId		Unique identifier of the update package.
	* @return			Result code
	*/
	IMPORT_C TInt DeleteUpdatePackage( const TInt aPkgId );
	

    /**
    * Retrieves the timestamp of last succesful update.
    *
    * @since  Series 60 3.1
    * @param aUpdate    On return, contains time of last succesfull update
	* @return			Error code. KErrUnknown if device has never been 
    *                   updated.
	*/
    IMPORT_C TInt LastUpdate( TTime& aUpdate );

	/**
    * Tells device FW version
    *
    * @since  Series 60 3.1
    * @param aSWVersion On return, contains FW version of device.
	* @return			Error code
	*/
    IMPORT_C TInt CurrentVersion( TDes& aSWVersion );

	/**
    * Gets IDs of the present update packages.
    *
    * @since  Series 60 3.1
    * @param aPackageIdList   On return, contains array of pkg ids
	* @return				  Error code
	*/
    IMPORT_C TInt GetUpdatePackageIds( TDes16& aPackageIdList );

    IMPORT_C TVersion Version() const;


	/**
    * Tells fotaserver that generic alert for package is sent. 
    * When fotaengine session is closed, cleanup for package
    * is done.
    *
    * @since  Series 60 3.1
	* @param    aPackageId    
	* @return   Error code
	*/
    IMPORT_C void GenericAlertSentL( const TInt aPackageID ) ;


	/**
	* Like Update, but called by scheduler mechanism. 
    * Needed package details (profile id etc are already known)
    *
    * @since  Series 60 3.2
	* @param  aSchedule		Schedule data
	* @return	Error code
	*/
	IMPORT_C TInt ScheduledUpdateL( TFotaScheduledUpdate aSchedule );


private: // From RApaAppServiceBase

	/** Returns the UID of the service that this session provides an 
    * interface for. Client side service implementations must implement this
    * function to return the UID for the service that they implement.
    *
    * @since  Series 60 3.1
    * @param  None    
	* @return The UID of the service implemented by the derived class.
    */
    TUid ServiceUid() const;        

    IMPORT_C virtual void ExtensionInterface( 
                        TUid aInterfaceId
                        ,TAny*& aImplementation );

private: // New methods

    /**
    * Signals the server to read chunk contents
    *
    * @since  Series 60 3.1
    * @param aP1      Pointer to beginning of content
	* @param aP2      Pointer to end of content
	* @return		
    **/
    void SendChunkL(const TUint8* aP1, const TUint8* aP2);


    /**
    * Signals the server to release chunk handle
    *
    * @since  Series 60 3.1
    * @param    None
	* @return		
    **/
    TInt ReleaseChunkHandle();

    /**
    * Starts fotaserver server application.
    *
    * @since  Series 60 3.1
	* @param aNameUid         Differentiator.
    * @param aAppServerUid    FotaServer app uid
	* @return	None
    **/
    void StartApplicationL( const TUid& aNameUid,const TUid& aAppServerUid );


    /**
    * Connects to running fotaserver instance
    *
    * @since  Series 60 3.1
	* @param aNameUid         Differentiator.
    * @param aAppServerUid    FotaServer app uid
	* @return		None
    **/    
    void ConnectToServerL( const TUid& aNameUid,const TUid& aAppServerUid );

private: // Data

    /**
     * Stream for writing swupd file to chunk
     */
    RFotaWriteStream*  iStream;

    /**
     * Chunk for sending swupd contents to fotaserver
     */
    RChunk          iChunk;

    
    /**
     * If not -1 , indicates that generic alert has been sent for this package
     */
    TInt iGenericAlertSentPkgID;

	};


#endif // __FOTAENGINE_H__