⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filekey.cpp

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 CPP
字号:
// FILEKEY.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
#include <coeutils.h>
#include <oplr.h>
#include <opcodes.h>
#include <f32file.h>
#include "oplutil.h"

#define NUM_PARSE_ELEMS 6

class TOplParseOffset
	{
public:
	TInt16 iFilSysOff;
	TInt16 iDeviceOff;
	TInt16 iPathOff;
	TInt16 iNameOff;
	TInt16 iExtOff;
	TInt16 iWildCardFlags;
	};

enum TOplDirOpFlags
	{
	EOplDirMake,
	EOplDirRemove
	};

GLREF_C void ut_parse(COplRuntime& aRuntime,TPtrC aBase,TPtrC aRel,TDes& aParsedName,TOplParseOffset& aOffset);	
 
LOCAL_C void popAndParseFileNameL(CStack& aStack, COplRuntime& aRuntime,TParse& aParse)
	{
	RFs& fsClient=aRuntime.ConEnv()->FsSession();
	User::LeaveIfError(fsClient.Parse(aStack.PopString(),aParse));
	}

void FuncOpCode::ParseStr(CStack& aStack, COplRuntime& aRuntime, CFrame* /*  */)
/*
Parse filename
In:	stack0	address of array (*not* left-side ref)
	stack1  related$
	stack2	baseFile$
	Out:	parsed$
*/
	{
	TOplParseOffset* pOffset=(TOplParseOffset*)OplUtil::PopOffsetAsAddrL(
            aStack,aRuntime.Heap64(),sizeof(TInt16) * NUM_PARSE_ELEMS);
	const TPtrC related=aStack.PopString();
	const TPtrC baseFile=aStack.PopString();
 	TFileName parsedName;
	ut_parse(aRuntime,baseFile,related,parsedName,*pOffset);
	aStack.Push(parsedName);
    }

void FuncOpCode::DirStr(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	TPtrC name=aStack.PopString();
	TInt err=KErrNone;
	if (name.Length()!=0)
		{
		if (aRuntime.StateFlags() & EDirOutstanding)
			{
			aRuntime.Dir().Close();
			aRuntime.ClearStateFlags(EDirOutstanding);
			}
		RFs&	fs=aRuntime.ConEnv()->FsSession();
		TParse parser;
		fs.Parse(name,parser);
		if ((err=aRuntime.Dir().Open(fs,parser.FullName(),KEntryAttMatchMask))==KErrNone)
			{
			aRuntime.SetStateFlags(EDirOutstanding);
			aRuntime.SetDirPath(parser.DriveAndPath());
			}
		}
	else if (!(aRuntime.StateFlags() & EDirOutstanding))
		{
		aStack.Push(KNullDesC);	// As in Opl1993 DIR$("") returns "" when no DIR$() outstanding
		return;
		}
	TEntry* entry=new(ELeave) TEntry;
	CleanupStack::PushL(entry);
	TFileName* fileName=new(ELeave) TFileName;
	CleanupStack::PushL(fileName);
	if (err==KErrNone)
		{
		if (aRuntime.Dir().Read(*entry)==KErrNone)
			{
			fileName->Copy(aRuntime.DirPath());
			fileName->Append(entry->iName);
			}
		else
			{
			aRuntime.Dir().Close();
			aRuntime.ClearStateFlags(EDirOutstanding);
			}
		}
	else if (err!=KErrNotFound)
		User::Leave(err);
	aStack.Push(*fileName);
	CleanupStack::PopAndDestroy(2); // entry and fileName
    }

void OpCode::Copy(CStack& aStack, COplRuntime& aRuntime, CFrame*)
	{
	RFs& fsClient=aRuntime.ConEnv()->FsSession();
	TPtrC des=aStack.PopString();
	CFileMan *fm=CFileMan::NewL(fsClient);
	TInt err=fm->Copy(aStack.PopString(),des);
	delete fm;
	User::LeaveIfError(err);
	aRuntime.ClearTrap();
	}

void OpCode::Delete(CStack& aStack, COplRuntime& aRuntime, CFrame*)
	{
	RFs fsClient=aRuntime.ConEnv()->FsSession();
	TParse parser;
	TPtrC desFile=aStack.PopString();
	if (desFile.Length()==0)
		User::Leave(KOplErrName);
	User::LeaveIfError(fsClient.Parse(desFile,parser));
	CFileMan *fm=CFileMan::NewL(fsClient);
	TInt err=fm->Delete(parser.FullName());
	delete fm;
	User::LeaveIfError(err);
	aRuntime.ClearTrap();
	}

void OpCode::Rename(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	TParse desFile,srcFile;
	popAndParseFileNameL(aStack,aRuntime,desFile);
	popAndParseFileNameL(aStack,aRuntime,srcFile);
	User::LeaveIfError(aRuntime.ConEnv()->FsSession().Rename(srcFile.FullName(),desFile.FullName()));
	aRuntime.ClearTrap();
	}
	
void doDirL(CStack& aStack, COplRuntime& aRuntime, TOplDirOpFlags aFlag)
	{
	TParse parser;
	RFs& fsClient=aRuntime.ConEnv()->FsSession();
	User::LeaveIfError(fsClient.Parse(aStack.PopString(),parser));
	if (parser.NameOrExtPresent()>0)
		User::LeaveIfError(parser.AddDir(parser.NameAndExt()));
	if (aFlag==EOplDirMake)
		User::LeaveIfError(fsClient.MkDirAll(parser.DriveAndPath()));
	else	/*aFlag==EOplDirRemove */
		User::LeaveIfError(fsClient.RmDir(parser.DriveAndPath()));
	aRuntime.ClearTrap();
	}

void OpCode::MkDir(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	doDirL(aStack,aRuntime,EOplDirMake);
	}
	
void OpCode::RmDir(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	doDirL(aStack,aRuntime,EOplDirRemove);
	}
	
void OpCode::SetPath(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	TParse parser;
	RFs fsClient=aRuntime.ConEnv()->FsSession();
	User::LeaveIfError(fsClient.Parse(aStack.PopString(),parser));
	User::LeaveIfError(fsClient.SetSessionPath(parser.DriveAndPath()));
	}

void FuncOpCode::Exist(CStack& aStack, COplRuntime& aRuntime, CFrame* /*aFramePtr*/)
	{
	RFs fsClient=aRuntime.ConEnv()->FsSession();
	// As in Opl1993, directories with no extension can be tested for by using
	// terminating "."
	TParse parser;
	fsClient.Parse(aStack.PopString(),parser);
	if (ConeUtils::FileExists(parser.FullName()))
		aStack.Push((TInt16)KOplTrue); 
	else
		aStack.Push((TInt16)KOplFalse);
	}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -