convert.cpp

来自「在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己」· C++ 代码 · 共 267 行

CPP
267
字号
// Convert.cpp
//
// Copyright (c) 1999-2000 Symbian Ltd. All rights reserved.

#include "convert.h"
#include <APGTASK.H>
#include <ES_SOCK.H>
#include <eikenv.h>

COpxCharConvWrapper::~COpxCharConvWrapper()
	{
	delete iConverter;
	delete iArrayOfCharacterSetsAvailable;
	}

void COpxCharConvWrapper::CharSetsL(OplAPI& aOplAPI)
	{
	// OPL call: characterSets=CVNumberOfCharacterSets&:
	EnsureArrayOfCharacterSetsAvailableExistsL(aOplAPI);
	aOplAPI.Push(TInt32(iArrayOfCharacterSetsAvailable->Count()));
	}

void COpxCharConvWrapper::CharSetNameL(OplAPI& aOplAPI)
	{
	// OPL call: characterSetName$ = CVCharacterSetName$:(aIndex&)
	TInt iIndexFromZero=aOplAPI.PopInt32()-1;
	EnsureArrayOfCharacterSetsAvailableExistsL(aOplAPI);
	if (iArrayOfCharacterSetsAvailable->At(iIndexFromZero).NameIsFileName())
		{
		TParsePtrC parser(iArrayOfCharacterSetsAvailable->At(iIndexFromZero).Name());
		aOplAPI.PushL(parser.Name());
		}
	else
		{
		aOplAPI.PushL(iArrayOfCharacterSetsAvailable->At(iIndexFromZero).Name());	
		}
	}

void COpxCharConvWrapper::CharSetUidL(OplAPI& aOplAPI)
	{
	// OPL call: characterSetUid& = CVCharacterSetUid&:(aIndex&)
	TUint32 iIndexFromZero=aOplAPI.PopInt32()-1;
	EnsureArrayOfCharacterSetsAvailableExistsL(aOplAPI);
	aOplAPI.Push(TInt32(iArrayOfCharacterSetsAvailable->At(iIndexFromZero).Identifier()));	
	}

void COpxCharConvWrapper::SelectCharSetL(OplAPI& aOplAPI)
	{
	// OPL call: CVSelectCharacterSet:(aCharacterSetUid&)
	TUint32 requestedCharacterSet=aOplAPI.PopInt32();
	EnsureConverterExistsL(aOplAPI);
	EnsureArrayOfCharacterSetsAvailableExistsL(aOplAPI);
	if (iCurrentCharacterSet!=requestedCharacterSet)
		{
		TBool invalid=ETrue;
		for (TInt i=0;i<iArrayOfCharacterSetsAvailable->Count();i++)
			if (requestedCharacterSet==iArrayOfCharacterSetsAvailable->At(i).Identifier())
				invalid=EFalse;
		if (invalid)
			User::Leave(KOplErrInvalidArgs);
  		iConverter->PrepareToConvertToOrFromL(requestedCharacterSet, 
			*iArrayOfCharacterSetsAvailable, aOplAPI.EikonEnv().FsSession());
		iCurrentCharacterSet=requestedCharacterSet;
		}
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::ResetToDefaults(OplAPI& aOplAPI)
	{
	// OPL call: CVResetToDefaults:
	delete iConverter;
	iConverter=NULL;
	delete iArrayOfCharacterSetsAvailable;
	iArrayOfCharacterSetsAvailable=NULL;
	iCurrentCharacterSet=0;
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::FromUnicodeL(OplAPI& aOplAPI)
	{
	// OPL call: bytesInBuffer = CVFromUnicode:(aBuffer&,aBufferLength&,aSource$)
	TPtrC source=aOplAPI.PopString();
	TUint32 bufferLength=aOplAPI.PopInt32();
	TUint32 bufferStart=aOplAPI.PopInt32();
	TPtr8 buffer(aOplAPI.OffsetToAddrL(bufferStart, bufferLength),bufferLength);
	EnsureConverterExistsL(aOplAPI);
	TInt err=iConverter->ConvertFromUnicode(
		buffer,source,
		iNumberOfUnconvertibleCharacters,
		iIndexOfFirstUnconvertibleCharacter);
	if (err)
		User::Leave(KOplErrInvalidArgs);
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::UnicodeL(OplAPI& aOplAPI)
	{
	// OPL call: destination$ = CVToUnicode:(aBuffer&,aBufferLength&)
	TUint32 bufferLength=aOplAPI.PopInt32();
	TUint32 bufferStart=aOplAPI.PopInt32();
	TBuf<KOplMaxStringLength> destination;
	TPtrC8 buffer(aOplAPI.OffsetToAddrL(bufferStart,bufferLength),bufferLength);
	TInt state=CCnvCharacterSetConverter::KStateDefault;
	EnsureConverterExistsL(aOplAPI);
	TInt err=iConverter->ConvertToUnicode(
		destination,buffer,
		state,
		iNumberOfUnconvertibleCharacters,
		iIndexOfFirstUnconvertibleCharacter);
	if (err)
		User::Leave(KOplErrInvalidArgs);
	aOplAPI.PushL(destination);
	}

void COpxCharConvWrapper::BadCharCount(OplAPI& aOplAPI)
	{
	// OPL Call: CVNumberOfUnconvertibleCharacters&:
	aOplAPI.Push(TInt32(iNumberOfUnconvertibleCharacters));
	}

void COpxCharConvWrapper::FirstBadChar(OplAPI& aOplAPI)
	{
	// OPL call: CVIndexOfFirstUnconvertibleCharacter&:
	aOplAPI.Push(TInt32(iIndexOfFirstUnconvertibleCharacter+1));
	}

void COpxCharConvWrapper::SetReplaceChar(OplAPI& aOplAPI)
	{
	// OPL Call: CVSetReplacementForUnknownCharacters:(aReplacementCharacter$)
	EnsureConverterExistsL(aOplAPI);
	TBuf8<1> replacementForUnconvertibleUnicodeCharacters;
	replacementForUnconvertibleUnicodeCharacters.Append(STATIC_CAST(TUint8,aOplAPI.PopInt32()));
	iConverter->SetReplacementForUnconvertibleUnicodeCharactersL(replacementForUnconvertibleUnicodeCharacters);
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::SetLittleEndianL(OplAPI& aOplAPI)
	{
	EnsureConverterExistsL(aOplAPI);
	iConverter->SetDefaultEndiannessOfForeignCharacters(CCnvCharacterSetConverter::ELittleEndian);
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::SetBigEndianL(OplAPI& aOplAPI)
	{
	EnsureConverterExistsL(aOplAPI);
	iConverter->SetDefaultEndiannessOfForeignCharacters(CCnvCharacterSetConverter::EBigEndian);
	aOplAPI.Push(0.0);
	}

void COpxCharConvWrapper::EnsureConverterExistsL(OplAPI& aOplAPI)
	{
	if (!iConverter)
		{
		iConverter=CCnvCharacterSetConverter::NewL();
		iCurrentCharacterSet=KCharacterSetIdentifierAscii;
		iConverter->PrepareToConvertToOrFromL(iCurrentCharacterSet,aOplAPI.EikonEnv().FsSession());
		}
	}

void COpxCharConvWrapper::EnsureArrayOfCharacterSetsAvailableExistsL(OplAPI& aOplAPI)
	{
	if (!iArrayOfCharacterSetsAvailable)
		{
 		iArrayOfCharacterSetsAvailable=CCnvCharacterSetConverter::
			CreateArrayOfCharacterSetsAvailableL(aOplAPI.EikonEnv().FsSession());
		}
	}

COpxCharConv::COpxCharConv(OplAPI& aOplAPI) 
	: COpxBase(aOplAPI)
    {
    }

COpxCharConv* COpxCharConv::NewLC(OplAPI& aOplAPI)
    {
    COpxCharConv* This=new(ELeave) COpxCharConv(aOplAPI);
    CleanupStack::PushL(This);
    This->ConstructL();
    return This;
    }

void COpxCharConv::ConstructL()
    {
	iOpxCharConvWrapper=new(ELeave) COpxCharConvWrapper;
    } 

COpxCharConv::~COpxCharConv()
    {
	delete iOpxCharConvWrapper;
	Dll::FreeTls();
	}							  

void COpxCharConv::RunL(TInt aProcNum)
	{
	switch (aProcNum)
		{
	case ECharSets:
		iOpxCharConvWrapper->CharSetsL(iOplAPI);
		break;
	case ECharSetName:
		iOpxCharConvWrapper->CharSetNameL(iOplAPI);
		break;
	case ECharSetUid:
		iOpxCharConvWrapper->CharSetUidL(iOplAPI);
		break;
	case ESelectCharSet:
		iOpxCharConvWrapper->SelectCharSetL(iOplAPI);
		break;
	case EResetToDefaults:
		iOpxCharConvWrapper->ResetToDefaults(iOplAPI);
		break;
	case EFromUnicode:
		iOpxCharConvWrapper->FromUnicodeL(iOplAPI);
		break;
	case EUnicode:
		iOpxCharConvWrapper->UnicodeL(iOplAPI);
		break;
	case EBadCharCount:
		iOpxCharConvWrapper->BadCharCount(iOplAPI);
		break;
	case EFirstBadChar:
		iOpxCharConvWrapper->FirstBadChar(iOplAPI);
		break;
	case ESetReplaceChar:
		iOpxCharConvWrapper->SetReplaceChar(iOplAPI);
		break;
	case ESetLittleEndian:
		iOpxCharConvWrapper->SetLittleEndianL(iOplAPI);
		break;
	case ESetBigEndian:
		iOpxCharConvWrapper->SetBigEndianL(iOplAPI);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	}

TBool COpxCharConv::CheckVersion(TInt aVersion)
	{
	if ((aVersion & 0xFF00) > (KOpxVersion & 0xFF00))
		return EFalse;
	else
		return ETrue;
	}

EXPORT_C COpxBase* NewOpxL(OplAPI& aOplAPI)
	{
	COpxCharConv* tls=((COpxCharConv*)Dll::Tls());
	if (tls==NULL)    // tls is NULL on loading an OPX DLL (also after unloading it)
		{
        tls=COpxCharConv::NewLC(aOplAPI);
	    User::LeaveIfError(Dll::SetTls(tls));
		CleanupStack::Pop();    // tls
        }
    return (COpxBase *)tls;
	}

EXPORT_C TUint Version()
	{
	return KOpxVersion;
	}

GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
	{
	return(KErrNone);
	}

⌨️ 快捷键说明

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