diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiServicePlugins/HtiFtpServicePlugin/inc/HtiFtpServicePlugin.h --- /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 +#include +#include + +// 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