Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// f32\etshell\ts_std.h
//
//
#include <e32debug.h>
#include <e32svr.h>
#include <f32file.h>
#include <f32ver.h>
#include <f32dbg.h>
#include <e32cons.h>
#include <e32twin.h>
#include <e32des16.h>
#include "f32image.h"
const TUint KShellMajorVersionNumber=0;
const TUint KShellMinorVersionNumber=1;
const TUint KShellBuildVersionNumber=KF32BuildVersionNumber;
const TInt KShellMaxCommandLine=0x100;
const TInt KDefaultHistorySize=20;
enum TShellPanic
{
EShellBadFileCopy,
EShellBadDrivePath,
EShellBadRelativePath,
EShellFilePathTooBig
};
enum TLineEditAction
{
ENoAction,
ECommandCompletion,
EShellCommand
};
class CLineEdit : public CBase
{
public:
enum TCursorType {ECursorNone=0,ECursorNormal=20,ECursorInsert=100};
enum TEditMode {EEditOverWrite,EEditInsert};
public:
static CLineEdit* NewL(CConsoleBase* aConsole,TInt aMaxHistory);
~CLineEdit();
TLineEditAction Edit(const TDesC& aPrompt, TDes* aBuf, TBool aNewLine);
TInt Pos() { return iPos; }
void SetPos(TInt aPos) { iPos = aPos; }
protected:
CLineEdit();
TPoint Where();
TInt Lines();
TInt WordLeft();
TInt WordRight();
void ClearLine();
void ClearLast(TInt aCnt);
void Recall();
void Cursor();
void Refresh();
inline TDes& Buf() {return *iBuf;}
void NewLine();
void StoreBufferHistory();
private:
CArrayFixFlat<HBufC*>* iHistory;
CConsoleBase* iConsole; // Not owned
TInt iMaxHistory;
TInt iWidth;
TInt iHeight;
TInt iPos;
TInt iLine;
TInt iOrigin;
TInt iRecall;
TEditMode iMode;
TDes* iBuf;
TSize iFrameSizeChar;
TInt iTabCount;
};
class TShellCommand
{
public:
enum {EASwitch=0x1,EBSwitch=0x2,ECSwitch=0x4,EDSwitch=0x8,EESwitch=0x10,
EFSwitch=0x20,EGSwitch=0x40,EHSwitch=0x80,EISwitch=0x100,EJSwitch=0x200,
EKSwitch=0x400,ELSwitch=0x800,EMSwitch=0x1000,ENSwitch=0x2000,EOSwitch=0x4000,
EPSwitch=0x8000,EQSwitch=0x10000,ERSwitch=0x20000,ESSwitch=0x40000,ETSwitch=0x80000,
EUSwitch=0x100000,EVSwitch=0x200000,EWSwitch=0x400000,EXSwitch=0x800000,EYSwitch=0x1000000,
EZSwitch=0x2000000};
const TPtrC iName;
const TPtrC iHelp;
const TPtrC iHelpDetail;
const TUint iSwitchesSupported;
TInt (* const iFunction)(TDes& aPath,TUint aSwitches);
public:
TShellCommand(const TDesC& aName,const TDesC& aHelp,const TDesC& aHelpDetail,TUint aSwitches,TInt (*aFunction)(TDes&,TUint));
private:
TShellCommand& operator=(TShellCommand);
};
class TWord
{
// User types COMMAND aDes
// TWord is initialised with aDes
// NextWord takes aDes and locates any spaces
// If aDes is a single word, NextWord returns the start position of the word
// Otherwise, NextWord returns the start position of the next word
public:
TWord (const TDesC& aDes);
void Init(const TDesC& aDes);
TInt FindNextWord(TDes& aWord);
private:
TInt iSpace; // Position of the first space
TInt iNextSpace; // Position of the following space
TPtrC iDes; // The given command line text
public:
TBuf<KShellMaxCommandLine> iRightString; // The residual string after a space
TBuf<KShellMaxCommandLine> iNextWord; // Text between a space and the end of the string or another space
};
class CCliCompleter;
class CShell : public CBase
{
public:
static CShell* NewL();
~CShell();
void RunL();
void SetCurrentPath(const TDesC& aDes);
TDes& CurrentPath();
void SetDrivePath(const TDesC& aDes);
static void NewLine();
static TKeyCode OutputStringToConsole(TBool aPageSwitch,TRefByValue<const TDesC> aFmt,...);
static TKeyCode OutputStringToConsole(TBool aPageSwitch, const TDesC& aBuf);
static TKeyCode OutputStringToConsole(const TDesC& aNotification,TBool aPageSwitch,TRefByValue<const TDesC> aFmt,...);
public:
static CConsoleBase* TheConsole;
static CFileMan* TheFileMan;
static CCliCompleter* TheCliCompleter;
private:
/** Total numbr of built-in shell commands */
enum {ENoShellCommands=33};
private:
static void DoBanner();
static void DoCommand(TDes& aCommand);
static void PrintError(TInt aError);
static void PrintHelp();
static void PrintHelp(const TShellCommand* aCommand);
static void ChangeDrive(TChar aDrive);
static TInt RunBatch(TDes& aCommand);
static TInt RunExecutable(TDes& aCommand,TBool aWaitForCompletion);
static TKeyCode PageSwitchDisplay(const TDesC& aBuf);
private:
static TBuf<KMaxFileName> currentPath;
static TBuf<KMaxFileName> drivePaths[KMaxDrives];
static const TShellCommand iCommand[ENoShellCommands];
static RFs TheFs;
static CLineEdit* TheEditor;
friend class ShellFunction;
friend class CDllChecker;
};
class CDllChecker : public CBase
//
// A class for checking dependencies of executables and Dlls
//
{
private:
enum TResultCheck {EAlreadyOpen,ECouldNotOpenFile,ENotFound,EUidNotSupported,ENoImportData,EUidDifference,EFileFoundAndUidSupported};
struct SDllInfo
{
TBuf8<KMaxFileName> iDllName;
TUid iUid;
TResultCheck iResult;
};
CArrayFixFlat<SDllInfo>* iDllArray; // Array of Imports already checked
TInt iCalls; // Number of recursive calls of GetImportDataL()
RFile iFile;//file object for reading data from phisical file
TUint32 iConversionOffset;
private:
void GetFileNameAndUid(SDllInfo &aDllInfo, const TDesC8 &aExportName);
TInt FindDll(TDes& aDllName,TFileName& aFileName, TPath& aPath);
void DllAppendL(const SDllInfo& aDllInfo);
TUint8* NextBlock(TUint8* aBlock);
void LoadFileInflateL(E32ImageHeaderComp* aHeader,TUint8* aRestOfFileData,TUint32 aRestOfFileSize);
void LoadFileNoCompressL(E32ImageHeaderComp* aHeader,TUint8* aRestOfFileData,TUint32 aRestOfFileSize);
TInt CheckUid3(TInt32 aUid3,TUid aUid);
TInt LoadFile(TUint32 aCompression,E32ImageHeaderComp* aHeader,TUint8* aRestOfFileData,TUint32 iRestOfFileSize);
void GetDllTableL(TUint8* aImportData,TInt aDllRefTableCount,TUint aFlags);
public:
CDllChecker();
~CDllChecker();
void ConstructL();
void GetImportDataL(const TDesC& aFileName, TUid* aPointer);
void ListArray();
};
class ShellFunction
{
public:
static CShell* TheShell;
public:
static TInt Attrib(TDes& aPath,TUint aSwitches);
static TInt Cd(TDes& aPath,TUint aSwitches);
static TInt ChkDeps(TDes& aPath,TUint aSwitches);
static TInt ChkDsk(TDes& aPath,TUint aSwitches);
static TInt Copy(TDes& aPath,TUint aSwitches);
#ifndef __DATA_CAGING__
static TInt DefaultPath(TDes& aPath,TUint aSwitches);
#endif
static TInt VolumeLabel(TDes& aPath,TUint aSwitches);
static TInt Del(TDes& aPath,TUint aSwitches);
static TInt Dir(TDes& aPath,TUint aSwitches);
static TInt Edit(TDes& aPath,TUint aSwitches);
static TInt Format(TDes& aPath,TUint aSwitches);
static TInt Gobble(TDes& aPath,TUint aSwitches);
static TInt Hexdump(TDes& aPath,TUint aSwitches);
static TInt Md(TDes& aPath,TUint aSwitches);
static TInt Move(TDes& aPath,TUint aSwitches);
static TInt Ps(TDes& aPath,TUint aSwitches);
static TInt Rename(TDes& aPath,TUint aSwitches);
static TInt Rd(TDes& aPath,TUint aSwitches);
static TInt Start(TDes& aProgram,TUint aSwitches);
static TInt Time(TDes&,TUint aSwitches);
static TInt Trace(TDes& aState,TUint aSwitches);
static TInt Tree(TDes& aPath,TUint aSwitches);
static TInt Type(TDes& aPath,TUint aSwitches);
static TInt ValidName(TDes& aPath,TUint aSwitches);
static TInt XCopy(TDes& aPath,TUint aSwitches);
static TInt Lock(TDes& aPath, TUint aSwitches);
static TInt Unlock(TDes& aPath, TUint aSwitches);
static TInt Clear(TDes& aPath, TUint aSwitches);
static TInt SetSize(TDes& aPath,TUint aSwitches);
static TInt DebugPort(TDes& aArgs, TUint aSwitches);
static TInt Plugin(TDes& aArgs, TUint aSwitches);
static TInt DrvInfo(TDes& aArgs, TUint aSwitches);
static TInt SysInfo(TDes& aArgs, TUint aSwitches);
static TInt MountFileSystem(TDes& aArgs, TUint aSwitches);
static TInt ConsoleEcho(TDes& aArgs, TUint aSwitches);
static TInt RunExec(TDes& aProgram, TUint aSwitches);
static void ParsePath(TDes& aPath);
static TInt GetFullPath(TDes& aPath,TParse& aParse);
static void AlignTextIntoColumns(RPointerArray<HBufC>& aText);
static void StripQuotes(TDes& aVal);
private:
static TInt ShowDirectoryTree(TDes& aPath,TUint aSwitches,TDes& aTreeGraph);
static TBool Certain();
static void OutputContentsToConsole(RPointerArray<HBufC>& aText,TUint aSwitches);
static void OutputDirContentL(CDir* aDirList,RPointerArray<HBufC>& aText,TUint aSwitches);
};
GLREF_D TVersion TheShellVersion;
GLREF_C void Panic(TShellPanic anErrorCode);
GLREF_C TInt AddRelativePath(TParse& aParse,const TDesC& aRelativePath);
GLREF_C TInt GetFullPath(TParse& aParse,const TDesC& aPath,const TDesC& aCurrentPath);
GLREF_C void Get16BitDllName(TDes8& aDllName,TDes& aFileName);
NONSHARABLE_CLASS(SimpleOverflowTruncate): public TDes16Overflow
{
public:
virtual void Overflow(TDes16&)
{
return;
}
};