applayerprotocols/ftpengine/consui/FTPUI.CPP
changeset 0 b16258d2340f
child 49 b91bcc4b38e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/ftpengine/consui/FTPUI.CPP	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,590 @@
+// 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:
+// Author: Philippe Gabriel
+// 
+//
+
+/**
+ @file FTPUI.CPP
+ @internalComponent
+*/
+
+#include "FTPUI.H"
+#include "FTPSESS.H"
+#include <e32base.h>
+
+void CFtpUI::ServerMessage(const TDesC8& aMessage)
+/**
+Implementation of the FTPSession Call back Minterface
+*/
+{
+// Display Message from server
+iUBuffer.Copy(aMessage);
+iConsole->Write(iUBuffer);
+}
+
+void CFtpUI::Complete(void)
+{
+switch (iCurCmd)
+	{
+	// Connection commands
+	case EConnectDNS:
+	case EConnectIP:
+		iConsole->Write(_L("Connection Completed OK\n"));
+		break;
+	case EClose:
+		iConsole->Write(_L("Connection Closed OK\n"));
+		break;
+	case EActive:
+		break;
+	case Epasv:
+		break;
+	// Xfer cmds
+	case EPut:
+	case EGet:
+	case EBin:
+	case EAsc:
+	case ERest:
+	case EOver:
+	// File cmds
+	case EDel:
+	case ERen:
+	// Dir cmds
+	case EMkdir:
+	case ERmdir:
+	case ECd:
+	case EPwd:
+		break;
+	case EList:
+		iUBuffer.Copy(iFileBuffer);
+		iConsole->Write(iUBuffer);
+		break;
+	// Exit
+	case EQuit:
+	case ECancel:
+	default:
+		break;
+	}
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+TText CFtpUI::getProgressChar() 
+{
+ if(iProgress) 
+ {
+ iProgressIdx=(iProgressIdx+1) & 0x3;
+ }
+ switch(iProgressIdx) 
+ {
+ case 0: return TText('|');
+ case 1: return TText('/');
+ case 2: return TText('-');
+ case 3: return TText('\\');
+ }
+ return TText('O');
+ }
+
+void CFtpUI::TransferProgress(TUint aProgress)
+{
+iTransferProgress += aProgress;
+if(aProgress) 
+ iProgress = ETrue;
+TTime now; 
+now.HomeTime();
+TTimeIntervalSeconds elapsedSec;
+TInt res=now.SecondsFrom(iLastTime,elapsedSec);
+if(res!=KErrNone || elapsedSec.Int()>=10) 
+ {
+ iConsole->SetPos(0,iConsole->WhereY()-1);
+ iConsole->Printf(_L("\n%c TransferProgress : %u kB        "),getProgressChar(),(TUint)( iTransferProgress>>10));
+ iLastTime.HomeTime();
+ iProgress=EFalse;
+ }
+}
+
+void CFtpUI::Cancel(void)
+{
+iConsole->Printf(_L("\n---Cancel Completed---\n"));
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::ConnReset(void)
+{
+iConsole->Printf(_L("\n---Conn RESET---\n"));
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::ConnectionError(TOpComp aTConnectionError)
+{
+iConsole->Printf(_L("\nConnection ERROR : "));
+switch(aTConnectionError)
+	{
+	case EHostNotExist:	// Connect address invalid
+		iConsole->Printf(_L("Host does not exist\n"));
+		break;
+	case ESocketError:	// Problem with socket operation
+		iConsole->Printf(_L("Socket error\n"));
+		break;
+	case EConnectionFailed:	// Can't connect to FTP port
+		iConsole->Printf(_L("Connection failed\n"));
+		break;
+	case EPasswordNeeded:
+		iConsole->Printf(_L("Password needed\n"));
+		break;
+	case EAccountNeeded:	// i.e. anonymous login disallowed
+		iConsole->Printf(_L("Account needed\n"));
+		break;
+	case ELoginFailed:	// UserName,Password combination invalid
+		iConsole->Printf(_L("Login failed\n"));
+		break;
+	case ENotConnected:	// Not connected to a server
+		iConsole->Printf(_L("Not connected anywhere\n"));
+		break;
+	case EAlreadyConnected:	// Already connected to a server
+		iConsole->Printf(_L("Already connected\n"));
+		break;
+	case ETimedOut:	// Inactive for too long
+		iConsole->Printf(_L("Timed Out\n"));
+		break;
+	default:
+		iConsole->Printf(_L("Internal Error: 0x56af087bb:0234\nThis is very very bad news\n"));
+		break;
+	}
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::OperationNotSupported(void)
+{}
+
+void CFtpUI::LocalFileSystemError(TOpComp /*aTLocalFileSystemError*/)
+{
+iConsole->Printf(_L("\nLocalFileSystemError\n"));
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::RemoteFileSystemError(TOpComp /*aTRemoteFileSystemError*/)
+{
+//CActiveScheduler::Stop();
+iConsole->Printf(_L("\nRemoteFileSystemError\n"));
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::EUnknownError(void)
+{
+iConsole->Printf(_L("\nUnknownError\n"));
+// Reset the console to fetch next command
+iCmdConsole->Reset();
+}
+
+void CFtpUI::MoreData(void)	
+{
+	iUBuffer.Copy(iFileBuffer);
+	iConsole->Write(iUBuffer);
+	
+	iFileBuffer.FillZ(iFileBuffer.MaxLength());
+	iFileBuffer.Zero();
+    iFTPSession->ListDirectory(_L8(""),iFileBuffer);
+	return;
+}
+
+void CFtpUI::Escape(void)
+/**
+Implement a console callback Minterface notifier
+*/
+{
+	iCurCmd = ECancel;
+	iConsole->Write(_L("\nCaNceling lAsT coMmaNd\n"));
+	iFTPSession->Cancel();
+}
+void CFtpUI::CmdReady(void)
+{
+
+/*__FTPDebugConsole->Write(_L("\nNotif recved\n"));
+__FTPDebugConsole->Write(_L("Buffer :"));
+__FTPDebugConsole->Write(myCmdConsole->FetchCmd());
+__FTPDebugConsole->Write(_L("\n"));*/
+switch(Parse(iCmdConsole->FetchCmd()))
+	{
+	case CFtpUI::EError:
+		// Just reset the thing
+		iCmdConsole->Reset();
+		break;
+	case CFtpUI::EContinue:
+		// Loop again to fetch more params
+		iCmdConsole->Reset();
+		break;
+	case CFtpUI::ESuccess:
+		// Execute the command
+		Execute();	
+		break;
+	}
+}
+
+CFtpUI::CFtpUI(void)
+{
+iCurCmd = EInvalid ;
+iConnMode = CFTPSession::EActive;
+iOpenMode = CFTPSession::EOverwrite;
+iType = CFTPSession::EBinary;
+iState = EInputCmd;
+iFs.Connect(KFileServerDefaultMessageSlots);
+}
+
+CFtpUI::~CFtpUI(void)
+{
+iFs.Close();
+}
+
+void CFtpUI::SetConsole(CConsoleBase* aConsole)
+	{iConsole = aConsole;}
+
+void CFtpUI::SetCmdConsole(CmdConsole* aCmdConsole)
+	{iCmdConsole = aCmdConsole;}
+
+void CFtpUI::SetFTPSession(CFTPSession* aFTPSession)
+	{iFTPSession = aFTPSession;}
+
+CFtpUI::TParseResult CFtpUI::Parse(TDesC& iCommand)
+/**
+Parse a command - Fill in iCmdBuffer - iParamBuffer1 - iParamBuffer2
+*/
+	{
+	TLex input(iCommand);
+	// Extract Tokens
+	switch(iState)
+		{
+		case EInputLogin:
+			iParamBuffer2.FillZ(iParamBuffer2.MaxLength());
+			iParamBuffer2.Copy(input.NextToken());
+			iState = EInputPass;
+			iConsole->Write(_L("Password: "));
+			return EContinue;
+		case EInputPass:
+			iParamBuffer3.FillZ(iParamBuffer2.MaxLength());
+			iParamBuffer3.Copy(input.NextToken());
+			iState = EInputCmd;
+			return ESuccess;
+		default:
+			break;
+		}
+	// Default case, Fetch command + params
+	// Reset buffers
+	iCmdBuffer.FillZ(iCmdBuffer.MaxLength());
+	iParamBuffer1.FillZ(iParamBuffer1.MaxLength());
+	iParamBuffer2.FillZ(iParamBuffer2.MaxLength());
+	iCmdBuffer.Copy(input.NextToken());
+	iCmdBuffer.LowerCase();
+	iParamBuffer1.Copy(input.NextToken());
+	iParamBuffer2.Copy(input.NextToken());
+	// Drop a trace
+/*	FTPPROTDEBUG(0xffff,_L("\nCmd:"));
+	FTPPROTDEBUG(0xffff,iCmdBuffer);
+	FTPPROTDEBUG(0xffff,_L("\n"));
+	FTPPROTDEBUG(0xffff,_L("Param1:"));
+	FTPPROTDEBUG(0xffff,iParamBuffer1);
+	FTPPROTDEBUG(0xffff,_L("\n"));
+	FTPPROTDEBUG(0xffff,_L("Param2:"));
+	FTPPROTDEBUG(0xffff,iParamBuffer2);
+	FTPPROTDEBUG(0xffff,_L("\n"));*/
+	// Fetch a command
+	// Very very crude parser - programmers in a hurry Limited
+	
+		if (KErrNotFound != iCmdBuffer.Match(_L("connect")))
+			{
+			iCurCmd = EConnectDNS;
+			iState = EInputLogin;
+			iConsole->Write(_L("Login: "));
+			return EContinue;
+			}
+		else if (KErrNotFound != iCmdBuffer.Match(_L("close")))
+			iCurCmd = EClose;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("active")))
+			iCurCmd = EActive;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("pasv")))
+			iCurCmd = Epasv;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("put")))
+			iCurCmd = EPut;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("get")))
+			iCurCmd = EGet;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("bin")))
+			iCurCmd = EBin;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("asc")))
+			iCurCmd = EAsc;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("rest")))
+			iCurCmd = ERest;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("over")))
+			iCurCmd = EOver;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("expand")))
+			iCurCmd = EExpand;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("del")))
+			iCurCmd = EDel;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("ren")))
+			iCurCmd = ERen;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("mkdir")))
+			iCurCmd = EMkdir;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("rmdir")))
+			iCurCmd = ERmdir;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("cd")))
+			iCurCmd = ECd;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("pwd")))
+			iCurCmd = EPwd;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("lcd")))
+			iCurCmd = ELcd;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("list")))
+			iCurCmd = EList;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("ls")))
+			iCurCmd = EList;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("quit")))
+			iCurCmd = EQuit;
+		else if (KErrNotFound != iCmdBuffer.Match(_L("ver")))
+			iCurCmd = EVer;
+		else if (
+			(KErrNotFound != iCmdBuffer.Match(_L("help")))
+			||(KErrNotFound != iCmdBuffer.Match(_L("?"))))
+			iCurCmd = EHelp;
+		else if (iCmdBuffer.Length() == 0)
+			{
+			iCurCmd = EInvalid;
+			return EContinue;
+			}
+		else
+			{
+			iConsole->Write(_L("Enter a valid command please\n"));
+			iCurCmd = EInvalid;
+			return EError;
+			}
+	return ESuccess;
+	}
+
+TBool CFtpUI::Execute(void)
+/**
+Execute a previously parsed command
+*/
+	{
+	TUint	tempValue;
+	iUParam.Copy(iParamBuffer1);
+	TLex input(iUParam); // Needed to convert rest parameter
+	// Reset server message
+	switch (iCurCmd)
+		{
+		
+		case EInvalid:
+			iConsole->Write(_L("Enter a valid command first please\n"));
+			return EFalse;
+		// Connection commands
+		case EConnectDNS:
+			iFTPSession->Connect(iUParam,iParamBuffer2,iParamBuffer3,iConnMode);
+			break;
+		case EConnectIP:
+		case EClose:
+			iFTPSession->Close();
+			break;
+		case EActive:
+			iConnMode = CFTPSession::EActive;
+			iConsole->Write(_L("Now connecting in active mode -Dude!\n"));
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case Epasv:
+			iConnMode = CFTPSession::Epassive;
+			iConsole->Write(_L("Now connecting in passive mode -Dude!\n"));
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		// Xfer cmds
+		case EPut:
+			iTransferProgress = 0;
+			iProgress=EFalse;
+            iProgressIdx=0;
+			iFTPSession->Store(iUParam,
+							iParamBuffer1,
+							FALSE,
+							iType,
+							CFTPSession::EStream);
+							iLastTime.HomeTime();          
+			break;
+		case EGet:
+			iTransferProgress = 0;
+			iLastTime.HomeTime();
+           iProgress=EFalse;
+           iProgressIdx=0;
+			iFTPSession->Retrieve(iParamBuffer1,
+							iUParam,
+							iOpenMode,
+							iType,
+							CFTPSession::EStream);
+
+			break;
+		case EBin:
+			iType = CFTPSession::EBinary;
+			iConsole->Write(_L("Representation type is now binary\n"));
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case EAsc:
+			iType = CFTPSession::EASCII;
+			iConsole->Write(_L("Representation type is now ASCII\n"));
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case EVer:
+			iConsole->Printf(_L("Version is:%x\n"),iFTPSession->GetVersion());
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case ERest:
+			input.Val(tempValue,EDecimal);
+			iConsole->Write(_L("Restarting next file transfer at: "));
+			iConsole->Printf(_L("%u\n"),tempValue);
+			iFTPSession->Restart(tempValue);
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case EExpand:
+			iConsole->Write(_L("Now openning local files in Expand mode\n"));
+			iOpenMode = CFTPSession::EExpand;
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		case EOver:
+			if(iOpenMode == CFTPSession::EOverwrite)
+				{
+				iConsole->Write(_L("Now openning local files in Non Overwriting mode\n"));
+				iOpenMode = CFTPSession::ENoOverwrite;
+				}
+			else
+				{
+				iConsole->Write(_L("Now openning local files in Overwriting mode\n"));
+				iOpenMode = CFTPSession::EOverwrite;
+				}
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		// Local Filesystem cmds
+		case ELcd:
+			{/* PG 13/08/1999 This code needs beefed up to implement a clever parser
+			//Fetch the current session path
+			iFs.SessionPath(iDirPath);
+			//Unicodify
+			iUParam.Copy(iParamBuffer1);
+			p.Set(iUParam,NULL,&iDirPath);
+			
+			iConsole->Printf(_L("current session path:>%S<\n"),&iDirPath);
+			iConsole->Printf(_L("Parse.FullName:>%S<\n"),&p.FullName());
+			iConsole->Printf(_L("Parse.DriveAndPath:>%S<\n"),&p.DriveAndPath());
+			switch(iUParam.Length())
+			{
+				case 0:
+				//if no argument is given to lcd
+				// just print the current default path
+					iConsole->Printf(_L("local directory is: %S\n"),&p.FullName());
+					break;
+				default:
+					//Check if root 
+					if (p.IsRoot())
+						{}
+					else
+						{
+						// Check this path
+						if (KErrNone != iFs.Entry(p.FullName(),anEntry))
+							{
+							iConsole->Printf(_L("%S directory not found\n"),&p.FullName());
+							break;
+							}
+						if (!anEntry.IsDir())
+							{
+							iConsole->Printf(_L("%S is not a directory\n"),&p.FullName());
+							break;
+							}
+						if (KErrNone != iFs.SetSessionPath(p.FullName()))
+							{
+							iConsole->Printf(_L("could not set session directory to %S to \n"),&p.FullName());
+							break;
+							}
+						}
+				iConsole->Printf(_L("Local directory now: %S"),&p.FullName());
+				}
+			*/
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+			}
+		// Remote Filesystem cmds
+		case EDel:
+			iFTPSession->DeleteFile(iParamBuffer1);
+			break;
+		case ERen:
+			iFTPSession->RenameFile(iParamBuffer1,iParamBuffer2);
+			break;
+		// Remote Dir cmds
+		case EMkdir:
+			iFTPSession->CreateDirectory(iParamBuffer1);
+			break;
+		case ERmdir:
+			iFTPSession->DeleteDirectory(iParamBuffer1);
+			break;
+		case ECd:
+			iFTPSession->ChangeDirectory(iParamBuffer1);
+			break;
+		case EPwd:
+			iFTPSession->GetCurrentDirectory();
+			break;
+		case EList:
+			iFileBuffer.FillZ(iFileBuffer.MaxLength());
+			iFileBuffer.Zero();
+			iFTPSession->ListDirectory(_L8("."),
+									iFileBuffer);
+			break;
+		// Help
+		case EHelp:
+			Help();
+			// Synchronous cmd Get next cmd
+			iCmdConsole->Reset();
+			break;
+		// Exit
+		case EQuit:
+			CActiveScheduler::Stop();
+		default:
+			break;
+		}
+	return ETrue;
+	}
+
+void CFtpUI::Help(void)
+	{
+	iConsole->Write(_L("Enter an FTP Command - commands are:\n"));
+	iConsole->Write(_L("active	: Connect in active mode   - pasv	: Connection in passive mode\n"));
+	iConsole->Write(_L("connect <hostname|IP address>      - close  : Close connection\n"));
+	iConsole->Write(_L("cd <dirName>    : Change directory - pwd 	: Print current directory\n"));
+	iConsole->Write(_L("mkdir <dirName> : Create directory - rmdir <dirName> : Remove directory\n"));
+	iConsole->Write(_L("list  [dirName] : List directory\n"));
+	iConsole->Write(_L("del   <filename>: Delete file\n"));
+	iConsole->Write(_L("ren   <Oldname> <NewName>	: Rename file\n"));
+	iConsole->Write(_L("bin   : Xfer file in binary mode - asc : Xfer file in Ascii mode\n"));
+	iConsole->Write(_L("over  : Toggle overwriting of existing Xfered file\n"));
+	iConsole->Write(_L("expand: Expand existing Xfered file\n"));
+	iConsole->Write(_L("rest <offset>  : Restart next file Xfer at offset\n"));
+	iConsole->Write(_L("put <Filename> : Store a file onto a server\n"));
+	iConsole->Write(_L("get <filename> : Get a file from server\n"));
+	iConsole->Write(_L("ver : returns the dlls version numbers\n"));
+	iConsole->Write(_L("Hit the Escape key to cancel the current operation\n"));
+	}
+
+