--- /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"));
+ }
+
+