hti/HtiServicePlugins/HtiFtpServicePlugin/inc/HtiFtpServicePlugin.h
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/HtiServicePlugins/HtiFtpServicePlugin/inc/HtiFtpServicePlugin.h	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,488 @@
+/*
+* 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
+*               the FTP service.
+*
+*/
+
+
+#ifndef HTIFTPSERVICEPLUGIN_H__
+#define HTIFTPSERVICEPLUGIN_H__
+
+// INCLUDES
+#include <e32std.h>
+#include <f32file.h>
+#include <HtiServicePluginInterface.h>
+
+// CONSTANTS
+enum TFtpCommand
+    {
+    EFtpSTOR                = 0x02,
+    EFtpSTOR_u              = 0x03,
+    EFtpRETR                = 0x04,
+    EFtpRETR_u              = 0x05,
+    EFtpLIST                = 0x06,
+    EFtpLIST_u              = 0x07,
+    EFtpMKD                 = 0x08,
+    EFtpMKD_u               = 0x09,
+    EFtpRMD                 = 0x0A,
+    EFtpRMD_u               = 0x0B,
+    EFtpDELE                = 0x0C,
+    EFtpDELE_u              = 0x0D,
+    EFtpCANCEL              = 0x0E,
+    EFtpFILESIZE            = 0x0F,
+    EFtpLISTDIR             = 0x10,
+    EFtpLISTDIR_u           = 0x11,
+    EFtpLISTSIZES           = 0x12,
+    EFtpLISTSIZES_u         = 0x13,
+    EFtpLISTDRIVES          = 0x14,
+    EFtpLISTDRIVES_u        = 0x15,
+    EFtpRENAME              = 0x16,
+    EFtpRENAME_u            = 0x17,
+    EFtpCOPY                = 0x18,
+    EFtpCOPY_u              = 0x19,
+    EFtpMOVE                = 0x1A,
+    EFtpMOVE_u              = 0x1B,
+    EFtpSETFORCE            = 0x20,
+    EFtpCHECKSUM            = 0x30,
+    EFtpCHECKSUM_u          = 0x31,
+    EFtpListDetail          = 0x32,
+    EFtpListDetail_u        = 0x33,
+    EFtpListDirDetail       = 0x34,
+    EFtpListDirDetail_u     = 0x35,
+    EFtpFORMAT              = 0x40,
+    EFtpOK                  = 0xF0,
+    };
+
+enum TAlgorithm
+    {
+    EMD5 = 0x01,
+    };
+
+_LIT(KHtiFileHlp, "HtiFileHlp.exe");
+
+//temporary file used if file is uploaded to Tcb
+_LIT(KTmpFileName, "C:\\htitemp.bin");
+
+//tokens used for command line for HtiFileHlp.exe
+_LIT( KHtiFileHlpDeleteCmd, "d" );
+_LIT( KHtiFileHlpCopyCmd,   "c" );
+_LIT( KHtiFileHlpMkdCmd,    "m" );
+_LIT( KHtiFileHlpRmdCmd,    "r" );
+_LIT( KHtiFileHlpMoveCmd,   "mv" );
+_LIT( KHtiFileHlpRenameCmd, "re" );
+_LIT( KHtiFileHlpDelim,     "|" );
+
+//tokens used to id Tcb folders
+_LIT(KHtiTcbSys, "\\sys\\");
+_LIT(KHtiTcbResource, "\\resource\\");
+
+//offset where first folder's backslash starts in absolute filename
+                                   // 012
+const static TInt KPathOffset = 2; //"C:\"
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CHtiFtpBackupFakeBase;
+
+// CLASS DECLARATION
+/**
+* Callback interface for AO
+*/
+class MFtpObserverAO
+    {
+public:
+    virtual void FtpComplete( TInt anError) = 0;
+    };
+
+
+// CLASS DECLARATION
+/**
+* AO for async request to CFileMan and RFile
+*/
+class CFtpHandlerAO : public CActive, public MFileManObserver
+    {
+public:
+    CFtpHandlerAO(MFtpObserverAO* anObserver);
+    ~CFtpHandlerAO();
+
+    /** Set AO active */
+    void Start();
+
+public: //MFileManObserver
+    virtual MFileManObserver::TControl NotifyFileManStarted();
+    virtual MFileManObserver::TControl NotifyFileManOperation();
+    virtual MFileManObserver::TControl NotifyFileManEnded();
+
+protected: //from CActive
+    void RunL();
+    /**
+    * no direct cancel for RFile and CFileMan
+    */
+    void DoCancel();
+    //TInt RunError(TInt aError);
+
+protected:
+    MFtpObserverAO* iObserver;
+    /** set to ERtue if CFileMan operation should be canceled */
+    TBool iCancelFileMan;
+    };
+
+
+class CProcessLogonAO : public CActive
+    {
+public:
+    CProcessLogonAO(MFtpObserverAO* anObserver);
+    ~CProcessLogonAO();
+
+    /** Set AO active */
+    void Start(const TDesC& aCmdLine);
+
+protected: //from CActive
+    void RunL();
+    void DoCancel();
+
+protected:
+    MFtpObserverAO* iObserver;
+    RProcess iProcess;
+    };
+
+
+// CLASS DECLARATION
+/**
+* FTP plugin implementation
+*/
+class CHtiFtpServicePlugin : public CHTIServicePluginInterface,
+                             public MFtpObserverAO
+    {
+protected:
+    /**
+    * Major states of FPT plug-in
+    */
+    enum TFtpServiceState
+        {
+        EIdle,          /** waits for a new command                 */
+        EListBusy,      /** waits for memory to send LIST response  */
+        ERmdBusy,       /** outstanding request CFileMan::RmDir()   */
+        EDeleBusy,      /** outstanding request CFileMan::Delete()  */
+        EStorWait,      /** waits for data packages                 */
+        EStorBusy,      /** outstanding request to RFile::Write()   */
+        ERetrBusy,      /** outstanding request to RFile::Read()    */
+        ERetrWait,      /** waits for memory to send data package   */
+        EStorTcbBusy,   /** outstandig request to HtiFileHlp.exe    */
+        EDeleTcbBusy,   /** outstandig request to HtiFileHlp.exe    */
+        EMkdTcbBusy,    /** outstandig request to HtiFileHlp.exe    */
+        ERmdTcbBusy,    /** outstandig request to HtiFileHlp.exe    */
+        ERenameBusy,    /** outstanding request CFileMan::Rename()  */
+        ERenameTcbBusy, /** outstandig request to HtiFileHlp.exe   */
+        ECopyBusy,      /** outstanding request CFileMan::Copy()    */
+        ECopyTcbBusy,   /** outstandig request to HtiFileHlp.exe   */
+        EMoveBusy,      /** outstanding request CFileMan::Move()    */
+        EMoveTcbBusy    /** outstandig request to HtiFileHlp.exe   */
+        };
+public:
+
+    static CHtiFtpServicePlugin* NewL();
+
+    // Interface implementation
+
+    /**
+    * Calculates iBufferSize based on iDispatcher->FreeMemory() value
+    */
+    void InitL();
+
+    /**
+    * @return ETrue when in any EXXXBusy state
+    */
+    TBool IsBusy();
+
+    /**
+    * Process either control or data message depending on aPriority
+    *
+    * @param aMessage message with commands or data
+    * @param aPriority indicates type of aMessage
+    */
+    void ProcessMessageL( const TDesC8& aMessage,
+                         THtiMessagePriority aPriority );
+
+    void NotifyMemoryChange( TInt aAvailableMemory );
+
+public: // MFtpObserverAO
+    void FtpComplete( TInt anError );
+
+protected:
+    CHtiFtpServicePlugin();
+    void ConstructL();
+
+    virtual ~CHtiFtpServicePlugin();
+
+    /**
+    * Handle FTP control messages
+    *
+    * @param aMessage message with command
+    */
+    void HandleControlMessageL( const TDesC8& aMessage );
+
+    /**
+    * Handle expected CANCEL control message
+    * received in EStorWait or ERetrWait state
+    * If aMessage does not contain CANCEL command,
+    * BUSY message is sent, otherwise current operation is canceled
+    * and plugin goes to EIdle state and sends OK message.
+    *
+    * @param aMessage message with command
+    */
+    void HandleCancelL( const TDesC8& aMessage );
+
+    /**
+    * Accepts data messages for STOR command
+    *
+    * @param aMessage message with file data
+    */
+    void HandleDataMessageL( const TDesC8& aMessage );
+
+    //command handlers
+
+    /**
+    * Handle STOR command request
+    */
+    void HandleReceiveFileL();
+
+    /**
+    * Handle RETR command request
+    */
+    void HandleSendFileL();
+
+    /**
+    * Reads one portion of file data during RETR command handeling.
+    */
+    void ReadToBuffer();
+
+    /**
+    * Sends one portion of file data during RETR command handeling.
+    */
+    void SendBuffer();
+
+    /**
+    * Handle LIST command
+    *
+    * @param aUnicodText if ETrue then response in unicode
+    * @param aReadingAtt specifies what entries to read from a dir
+    * @param aSizes if ETrue filesizes are included in the response
+    */
+    void HandleListL( TBool aUnicodText, TUint aReadingAtt, TBool aSizes );
+    
+    /**
+    * Handle LIST FILES DETAIL command
+    *
+    * @param aUnicodText if ETrue then response in unicode
+    * @param aReadingAtt specifies what entries to read from a dir
+    */
+    void HandleListDetailL( TBool aUnicodText, TUint aReadingAtt);
+
+    /**
+    * Extracts and validate file name to iFileName
+    * If error sends err msg
+    * Return ETrue when filename is valid
+    * @param aFilename descriptor with filename
+    * @param aToUnicode flag indicates that data in aFilename
+    *                   should be treated as an unicode string
+    */
+    TBool GetFileNameL( const TDesC8& aFilename, TBool aToUnicode );
+
+    /**
+    * Extracts and validates path to iFileName
+    * If error sends err msg
+    * Return ETrue when directory is valid
+    * @param aDirname descriptor with directory name
+    * @param aToUnicode flag indicates that data in aFilename
+    *                   should be treated as an unicode string
+    */
+    TBool GetDirectoryL( const TDesC8& aDirname, TBool aToUnicode );
+
+    /**
+    * Helper to send short control messages
+    * (e.g. OK, BUSY, FILESIZE)
+    * @param aCmd command code
+    * @param aMsg additional command parameters
+    * @return KErrNone or Symbian error code
+    */
+    TInt SendControlMsg( TFtpCommand aCmd, const TDesC8& aMsg );
+
+    /**
+    * Helper to send error message
+    * @return KErrNone or some system-wide error code
+    */
+    inline TInt SendErrorMsg( TInt anError, const TDesC8& aMsg );
+
+    /**
+    * Handle delete command
+    * @param aFilename the file to delete
+    */
+    void HandleDeleteL( const TDesC& aFilename );
+
+    /**
+    * Handle rename command
+    * @param aMessage message that contains
+    * old and new file/directory names.
+    * @param aToUnicode flag indicates that data in aFilename
+    *  should be treated as an unicode string
+    */
+    void HandleRenameL( const TDesC8& aMessage, TBool aUnicode );
+
+    /**
+    * Handle copy command
+    * @param aMessage message that contains the file/directory to be copied
+    * and the location and name of the copy.
+    * @param aToUnicode flag indicates that data in aFilename
+    *  should be treated as an unicode string
+    */
+    void HandleCopyL( const TDesC8& aMessage, TBool aUnicode );
+
+    /**
+    * Handle move command
+    * @param aMessage message that contains the file/directory to be moved
+    * and the new location
+    * @param aToUnicode flag indicates that data in aFilename
+    *  should be treated as an unicode string
+    */
+    void HandleMoveL( const TDesC8& aMessage, TBool aUnicode );
+
+    /**
+    * Safe unicode copying from 8bit descr to 16bit buffer
+    * @param aTo destination descriptor
+    * @param aFrom source descriptor
+    */
+    void CopyUnicode( TDes& aTo, const TDesC8& aFrom );
+
+    /**
+    * Check either aFilename point in a TCB directories (sys, private, resource)
+    * @param aFilename the file to check
+    */
+    TBool IsFileTcb( const TDesC& aFilename );
+
+    /**
+    * Uses HtiFileHlp.exe to delete file from TCB directories
+    * @param aFilename the file to delete
+    */
+    void HandleTcbDeleteL( const TDesC& aFilename );
+
+    /**
+    * Uses HtiFileHlp.exe to copy files/folders to TCB directories
+    * @param aFromFilename the source path
+    * @param aToFilename the destination path
+    */
+    void HandleTcbCopyL( const TDesC& aFromFilename, const TDesC& aToFilename );
+
+    /**
+    * Uses HtiFileHlp.exe to makedir in TCB directories
+    * @param aDirname the directory to create
+    */
+    void HandleTcbMkdL( const TDesC& aDirname );
+
+    /**
+    * Uses HtiFileHlp.exe to delete dir in TCB directories
+    * @param aDirname the directory to delete
+    */
+    void HandleTcbRmdL( const TDesC& aDirname );
+
+    /**
+    * Uses HtiFileHlp.exe to do rename in TCB folders
+    * @param aTargetName the path to rename
+    * @param aDestName the new path name
+    */
+    void HandleTcbRenameL( const TDesC& aTargetName, const TDesC& aDestName );
+
+    /**
+    * Uses HtiFileHlp.exe to do move to TCB folders
+    * @param aTargetName the path to move
+    * @param aDestName the destination path
+    */
+    void HandleTcbMoveL( const TDesC& aTargetName, const TDesC& aDestName );
+
+    /**
+    * Sets the faking of backup/restore operation on/off.
+    * If aOn is ETrue sets backup/restore on, otherwise sets it off.
+    * @return KErrNone on success, otherwise system error code
+    */
+    TInt SetBURFakeState( TBool aOn );
+
+    /**
+    * Calculates a checksum for the given file with the given algorithm.
+    */
+    void HandleCheckSumCalcL( TAlgorithm aAlgorithm,
+                              const TDesC& aFilename );
+
+    /**
+    * Formats a drive.
+    */
+    void HandleFormat( const TUint8 aDrive, const TUint8 aMode );
+
+    /**
+    * Creates a list of drives.
+    */
+    void HandleListDrivesL( TBool aUnicode );
+
+private:
+    void RemoveEndBackslash( TFileName& aFileName );
+
+protected:
+    /** plugin state */
+    TFtpServiceState iState;
+    /** File server */
+    RFs iFs;
+    /** File manager used for RMD and DELE */
+    CFileMan* iFileMan;
+    /** current file for STOR and RETR*/
+    RFile iFile;
+    /** file name of iFile */
+    TFileName iFileName;
+
+    /** current offset in file during STOR or RETR */
+    TInt iCurrentOffset; //mean received bytes or sent bytes
+    /** the final size of iFile */
+    TInt iFileSize;
+
+    /** the size of iSendBuffer, calculated in InitL() */
+    TInt iBufferSize;
+    /** send buffer for RETR and LIST commands */
+    HBufC8* iSendBuffer;
+    /** des of iSendBuffer, used for RETR */
+    TPtr8 iSendBufferDes;
+
+    /** AO to handle current asyn request */
+    CFtpHandlerAO* iHandlerAO;
+
+    /** used for HtiFileHlp.exe */
+    CProcessLogonAO* iProcessLogonAO;
+
+    /**
+    * Class for activating/deactivating a backup session.
+    * This is used for forced operations to locked files. Activating backup
+    * should release locks on files that are in use by some other application.
+    */
+    CHtiFtpBackupFakeBase* iBackupFake;
+
+    /** Handle to the DLL for activating/deactivating backup */
+    RLibrary iBackupFakeLib;
+    };
+
+#endif
+
+// End of File