/*
* Copyright (c) 2009 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:  Implementation of ECOM plug-in service interface providing
*                process and application control service.
*
*/



#ifndef HTIAPPSERVICEPLUGIN_H__
#define HTIAPPSERVICEPLUGIN_H__

//  INCLUDES
#include <e32base.h>
#include <HTIServicePluginInterface.h>

// CONSTANTS

// MACROS

// DATA TYPES

// FUNCTION PROTOTYPES

// FORWARD DECLARATIONS
class CDesC8ArrayFlat;

// CLASS DECLARATION
/**
*  Implementation of ECOM plug-in service interface.
*  Provides the service to control processes and applications.
*
*/
class CHtiAppServicePlugin : public CHTIServicePluginInterface
    {
protected:
    //commands
    enum TAppCommand
        {
        //commands
        //process control
        EStartProcess       = 0x02,
        EStartProcess_u     = 0x03,
        EStatusProcess      = 0x04,
        EStatusProcess_u    = 0x05,
        EStatusProcess_id   = 0x06,
        EStopProcess        = 0x08,
        EStopProcess_u      = 0x09,
        EStopProcess_id     = 0x0A,
        EListProcesses      = 0x0C,
        EListProcesses_u    = 0x0D,
        EStartProcessRetVal = 0x0E,
        EStartProcessRetVal_u = 0x07,
        EGetProcessExitCode = 0x0B,

        EProcessLastCommand = 0x0F, //!!! used to sort process control from
                                    //!!! app control

        //app control
        EStartApp           = 0x10,
        EStartApp_u         = 0x11,
        EStartApp_uid       = 0x12,
        EStartApp_uid_u     = 0x13,
        EStartDoc           = 0x14,
        EStartDoc_u         = 0x15,
        EStatusApp          = 0x16,
        EStatusApp_u        = 0x17,
        EStatusDoc          = 0x18,
        EStatusDoc_u        = 0x19,
        EStatusApp_uid      = 0x1A,
        EStopApp            = 0x1C,
        EStopApp_u          = 0x1D,
        EStopDoc            = 0x1E,
        EStopDoc_u          = 0x1F,
        EStopApp_uid        = 0x20,
        EListApps           = 0x24,
        EListApps_u         = 0x25,

        EAppLastCommand     = 0x2F, //!!! used to sort process control from
                                    //!!! app control
        EInstall         = 0x30,
        EInstall_u       = 0x31,
        EUnInstall       = 0x32,
        EUnInstallName_u = 0x33,
        EUnInstallName   = 0x34,

        ESisLastCommand = 0x3F, //!!! used to sort sis control from
                                //!!! app control
        //responses
        EOk             = 0xF0,
        ENotFound       = 0xF1,
        EAlreadyRunning = 0xF2,
        EAlreadyStopped = 0xF3,
        ERunning        = 0xF4,
        EKilled         = 0xF5,
        EPanic          = 0xF6
        };

public:
    static CHtiAppServicePlugin* NewL();

    // Interface implementation
    void ProcessMessageL(const TDesC8& aMessage,
                         THtiMessagePriority aPriority);
    
    /**
	* Called by HTI-framework to initialize this plugin
	*/
    void InitL();

protected:
    CHtiAppServicePlugin();
    void ConstructL();

    virtual ~CHtiAppServicePlugin();

    void HandleProcessControlL(const TDesC8& aMessage);

    /**
    * Extracts string from incoming request and convert it to unicode
    * for non-unicode request
    * aResult should have enough maz length and it will contain
    * Function returns either offset for a next parameter in aRequest
    * or some symbian error code
    */
    TInt ParseString( const TDesC8& aRequest,
                      TInt anOffset,
                      TBool aUnicode,
                      TDes& aResult);

    //command handlers
    void HandleStartProcessL( const TDesC& aProgramName,
                              const TDesC& aCmdLine,
                              TBool aStoreProcessHandle );

    void HandleStopProcessL( RProcess& aProcess );
    void HandleStatusProcessL( RProcess& aProcess );

    void HandleListProcessesL( const TDesC& aMatch );

    //construct and send short message
    void SendMessageL(TAppCommand aResponseCode, const TDesC8& aMsg = KNullDesC8 );

    /**
    * Helper to send error message
    * @return KErrNone or some system-wide error code
    */
    inline TInt SendErrorMsg( TInt anError, const TDesC8& aMsg );

    /**
    *
    */
    TInt OpenProcessL( RProcess& aProcess, const TDesC& aMatch );
    TInt OpenProcessL( RProcess& aProcess, const TUint32 aProcessId );

    /**
    * Convert string to T 32bit int (e.g. TUint, TInt32)
    */
    template<class T> T Parse32( const TDesC8& a32int);
    
    

protected:

    // Container array for process handles for querying the process exit codes
    RArray<RProcess> iProcessHandleArray;
    
private:
	CHTIServicePluginInterface* iAppServiceUiPlugin;
	RLibrary iLibrary;


    };

#endif

// End of file
