diff -r 000000000000 -r b16258d2340f applayerprotocols/ftpengine/consui/FTPUI.CPP --- /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 + +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 - close : Close connection\n")); + iConsole->Write(_L("cd : Change directory - pwd : Print current directory\n")); + iConsole->Write(_L("mkdir : Create directory - rmdir : Remove directory\n")); + iConsole->Write(_L("list [dirName] : List directory\n")); + iConsole->Write(_L("del : Delete file\n")); + iConsole->Write(_L("ren : 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 : Restart next file Xfer at offset\n")); + iConsole->Write(_L("put : Store a file onto a server\n")); + iConsole->Write(_L("get : 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")); + } + +