applayerprotocols/ftpengine/inc/PROTOCOL.H
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/ftpengine/inc/PROTOCOL.H	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,224 @@
+/**
+* Copyright (c) 1998-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:
+* FTP Protocol header file
+* Author:	Philippe Gabriel
+* 
+*
+*/
+
+
+
+/**
+ @file protocol.h
+ @internalComponent
+*/
+
+#if !defined(__PROTOCOL_H__)
+#define __PROTOCOL_H__
+
+#include <e32base.h>
+#include <es_sock.h>
+#include <ftpprot.h>
+#include "FTPDEF.H"
+#include "DEBUG.H"
+#include "PICHNL.H"
+#include "DTPCHNL.H"
+#include "RESOLVER.H"
+#include "SETERROR.H"
+
+
+
+class TFTPServerAnswerParser;
+class TFtpPASVAnswerParser;
+
+NONSHARABLE_CLASS(CFtpProtocolDerived) : public CFtpProtocol,public MPIChannelNotifier,MDTPChannelNotifier,MFTPResolverNotifier,MSetErrorNotifier
+/**
+FtpEngine
+@internalComponent
+*/
+	{
+friend class CDTPChannel;
+friend class CPIChannel;
+public:
+	/** Establish a connection: IP address */
+	void Connect(TSockAddr& aNetAddr);	
+	/** URL name */
+	void Connect(const THostName& aServerName);  
+	/** URL name + port */
+	void Connect(const THostName& aServerName, const TUint aPort); 
+
+	/** FTP commands, presented in the same order as RFC959: */
+	void User(const TDesC8& aParam);
+	void Pass(const TDesC8& aParam);
+	void Acct(const TDesC8& aParam);
+	void Cwd(const TDesC8& aParam);
+	void Cdup(void);
+	void Smnt(const TDesC8& aParam);
+	void Quit(void);
+	void Rein(void);
+	/** Sets the DTP port to one allocated by ESOCK */
+	void Port(void);	
+	/** Sets the DTP port to a specific one */
+	void Port(TUint aPort);	
+	void Pasv(void);
+	void Type(const TDesC8& aParam);
+	void Type(const TDesC8& aParam1, const TDesC8& aParam2);
+	void Stru(const TDesC8& aParam);
+	void Mode(const TDesC8& aParam);
+	void Retr(const TDesC8& aFileName);
+	void Stor(const TDesC8& aFileName);
+	void Stou(void);
+	void Appe(const TDesC8& aFileName);
+	void Allo(const TDesC8& aParam);
+	void Allo(const TDesC8& aParam1, const TDesC8& aParam2);
+	void Rest(const TDesC8& aParam);
+	void Rnfr(const TDesC8& aFileName);
+	void Rnto(const TDesC8& aFileName);
+	void Abor(void);
+	void Dele(const TDesC8& aFileName);
+	void Rmd(const TDesC8& aParam);
+	void Mkd(const TDesC8& aParam);
+	void Pwd(void);
+	void List(void);
+	void List(const TDesC8& aParam);
+	void Nlst(void);
+	void Nlst(const TDesC8& aParam);
+	void Site(const TDesC8& aParam);
+	void Syst(void);
+	void Stat(const TDesC8& aParam);
+	void Stat(void);
+	void Help(const TDesC8& aParam);
+	void Help(void);
+	void Noop(void);
+	/** 
+	Buffer management for transfer
+	Following functions pass a pointer to a buffer
+	to transfer data to/from the Dtp channel
+	Before an operation which cause data to transit on the 
+	DTP channel to occur (Nlst, List, Retr, Stor)
+	a Buffer must be provided with the following api
+	Also when the client is notified of a MoreData event
+	It must reissue the following operation to get the rest of
+	the data
+	*/
+	void SendBuffer(TDes8* aBuffer);
+	void RecvBuffer(TDes8* aBuffer);
+	/** Finishes the transfer initiated by a stor command */
+	void SendEOF(void); 
+	/** PI Channel Minterface */
+	void PIChannelOperationCompletion(const TPiOperationCompletion);
+	/** Notify of error performing an operation */
+	void PIChannelOperationError(const TPiOperationError);
+	/** Notify of reception */
+	void PIChannelRcvNotification(void);
+	/** Notify server has unexpectidly dropped the connection */
+	void PIChannelReset(void);
+	/** DTP Channel Minterface */
+	/** Notify of normal completion of an operation */
+	void DTPChannelOperationCompletion(const TDtpOperationCompletion);
+	/** Notify of error performing an operation */
+	void DTPChannelOperationError(const TDtpOperationError);
+	/** Notify of reception */
+	void DTPChannelXferNotification(const TDtpOperationCompletion);
+	/** FTP DNS resolver Minterface */
+	void FTPResolverNotifier(const TFTPResolverNotificationCode);
+	/** Copies the 3 digits answer received from the FTP server */
+	void FTPServerAnswer(TDes& aServerAnswer){aServerAnswer.Copy(iAnswer);}
+	/** Define the CFTPSetError callback notifier */
+	void SetErrorNotifier(const TInt);
+
+	void UserCancel(void);
+	~CFtpProtocolDerived();
+	static CFtpProtocolDerived *NewL(MFtpProtocolNotifier*);
+
+protected:
+	CFtpProtocolDerived(MFtpProtocolNotifier* aNotifier);
+
+    void ConstructL(void);
+	/** Address of the remote FTP server */
+	TInetAddr iRemoteAddress; 
+	/** A Buffer to receive server answers */
+	TBuf8<512> iServerAnswerBuffer; 
+private:
+	enum TState 
+		{
+	EIdle,
+	ELookingUp,
+	EConnecting,
+	EPerformingUser,EPerformingPass,EPerformingAcct,EPerformingCwd,EPerformingCdup,
+	EPerformingSmnt,EPerformingQuit,EPerformingRein,EPerformingPort,
+	EPerformingPasv,EPerformingType,EPerformingStru,EPerformingMode,EPerformingRetr,
+	EPerformingStor,EPerformingStou,EPerformingAppe,EPerformingAllo,EPerformingRest,
+	EPerformingRnfr,EPerformingRnto,EPerformingDele,EPerformingRmd,
+	EPerformingMkd,EPerformingPwd,EPerformingList,EPerformingNlst,EPerformingSite,
+	EPerformingSyst,EPerformingStat,EPerformingHelp,EPerformingNoop,
+	EPerformingAbor
+		};
+	enum TInternalEvents
+		{
+		EFtpCodeReply,
+		EDtpChannelConnected,
+		EDtpChannelClosed,
+		EPiChannelConnectComplete,
+		EPiChannelSendComplete,
+		EPacketReceived,
+		/** Error events
+		*/
+		EPiReset,
+		EDtpReset,
+		};
+	enum TPanic 
+		{
+		EPIPanicParserFailure = -1,
+		EPIPanicMegaOI = -2,
+		EAddressFamily = -3
+		};
+	void InitCommL(void);
+	//void FTPReply(void);
+	void UpdateState(const TInternalEvents aEvent);
+	TInt	iState;
+	MFtpProtocolNotifier*	iNotifier;
+	TFTPServerAnswerParser*	iFTPServerAnswerParser;
+	TFtpPASVAnswerParser*	iFtpPASVAnswerParser;
+	CPIChannel* iPiChannel;
+	CDTPChannel* iDtpChannel;
+	CFTPResolver* iResolver;
+	/** A pointer to the CFTPSetError object */
+	CFTPSetError*	iCFTPSetError;
+	/** A socket server to be used for */
+	RSocketServ iSockServ;	
+	/** all socket operations */
+	/** my local address (to advertise to the server) */
+	TInetAddr iLocalAddress; 
+	/** FTP Connection can be passive (server connects on one of my ports) */
+	TBool iPASVMode;
+	/** Port number for the DTP Channel (to advertise to the server)
+		or active, FTP server gives me an address to connect to */
+	TUint	iPort; 
+	/** Address of the FTP channel (note: RFC says this 
+	    IP address can be different than the PI Channel IP address */
+	TInetAddr iFTPDTPAddress; 
+	/** Placeholder for the answer I got from the FTP server */
+	TBuf8<3> iAnswer;	
+	/** A Buffer to construct FTP commands */
+	TBuf8<256> iFTPCmdBuffer; 
+	/** A Buffer to construct FTP commands */
+	TDes8* iIOBuffer; 
+	/** helper to Port() */
+	void BuildPORTCommand(); 
+	/** helper to Port() */
+	void BuildEPRTCommand(); 
+	};
+#endif //__PROTOCOL_H__