locale.cpp

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

CPP
516
字号
// LOCALE.CPP
//
// Copyright (c) 1997-2002 Symbian Ltd. All rights reserved.

#include <apadef.h>
#include "locale.h"
#include <BARSREAD.H>
#include <APGTASK.H>
#include <apgwgnam.h>
#include <T32WLD.H>

COpxLocale::COpxLocale()
	{
	}

COpxLocale::~COpxLocale()
	{
	}

void COpxLocale::TInt16LocaleFunction(OplAPI& aOplAPI,const TInt aProcNum) const
	{
	TLocale loc;
	TInt16 res=0;
	switch (aProcNum)
		{
	case ECurrencyNegativeInBrackets:
		res=(TInt16)(loc.CurrencyNegativeInBrackets());
		break;
	case ECurrencySpaceBetween:
		res=(TInt16)(loc.CurrencySpaceBetween());
		break;
	case ECurrencyTriadsAllowed:
		res=(TInt16)(loc.CurrencyTriadsAllowed());
		break;
	case EAmPmSpaceBetween:
		res=(TInt16)(loc.AmPmSpaceBetween());
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	aOplAPI.Push(res);
	}

void COpxLocale::SetTInt16LocaleFunction(OplAPI& aOplAPI,const TInt aProcNum) const
	{
	TLocale loc;
	TInt16 set=aOplAPI.PopInt16();
	switch (aProcNum)
		{
	case ECurrencySetNegativeInBrackets:
		loc.SetCurrencyNegativeInBrackets(set);
		break;
	case ECurrencySetSpaceBetween:
		loc.SetCurrencySpaceBetween(set);
		break;
	case ECurrencySetTriadsAllowed:
		loc.SetCurrencyTriadsAllowed(set);
		break;
	case EAmPmSetSpaceBetween:
		loc.SetAmPmSpaceBetween(set);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::TInt32LocaleFunction(OplAPI& aOplAPI,const TInt aProcNum) const
	{
	TLocale loc;
	TInt32 res=0;
	switch (aProcNum)
		{
	case ELanguage:
		res=(TInt32)(User::Language());
		break;
	case ECountryCode:
		res=(TInt32)(loc.CountryCode());
		break;
	case ECurrencySymbolPosition:
		res=(TInt32)(loc.CurrencySymbolPosition());
		break;
	case ECurrencyDecimalPlaces:
		res=(TInt32)(loc.CurrencyDecimalPlaces());
		break;
	case EUTCOffset:
		res=(TInt32)(loc.UniversalTimeOffset().Int());
		break;
	case EDateFormat:
		res=(TInt32)(loc.DateFormat());
		break;
	case ETimeFormat:
		res=(TInt32)(loc.TimeFormat());
		break;
	case EAmPmSymbolPosition:
		res=(TInt32)(loc.AmPmSymbolPosition());
		break;
	case EClockFormat:
		res=(TInt32)(loc.ClockFormat());
		break;
	case EStartOfWeek:
		res=(TInt32)(loc.StartOfWeek()+1);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	aOplAPI.Push(res);
	}

void COpxLocale::SetTInt32LocaleFunction(OplAPI& aOplAPI,const TInt aProcNum) const
	{
	TLocale loc;
	TInt32 set=aOplAPI.PopInt32();
	switch (aProcNum)
		{
	case ECurrencySetDecimalPlaces:
		loc.SetCurrencyDecimalPlaces(set);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	loc.Set();	
	aOplAPI.Push(0.0);
	}

void COpxLocale::SetLocalePositionFunction(OplAPI& aOplAPI, const TInt aProcNum) const
	{
	TLocalePos pos=(TLocalePos)(aOplAPI.PopInt32());
	if (pos!=ELocaleBefore && pos!=ELocaleAfter)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	switch (aProcNum)
		{
	case ECurrencySetSymbolPosition:
		loc.SetCurrencySymbolPosition(pos);
		break;
	case EAmPmSetSymbolPosition:
		loc.SetAmPmSymbolPosition(pos);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::SeparatorCharacter(OplAPI& aOplAPI, const TInt aProcNum) const
	{
	TLocale loc;
	TChar c=0; // prevents strict compiler warning about it not being initialised
	switch (aProcNum)
		{
	case EDecimalSeparator: 
		c=loc.DecimalSeparator();
		break;
	case EThousandsSeparator: 
		c=loc.ThousandsSeparator();
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	TBuf<1> des;
	des.Append(c);
	aOplAPI.PushL(des);
	}

void COpxLocale::SetSeparatorCharacter(OplAPI& aOplAPI, const TInt aProcNum) const
	{
	TPtrC string=aOplAPI.PopString();
	if (string.Length()!=1)
		User::Leave(KOplErrInvalidArgs);
	TChar c=string[0];
	TLocale loc;
	switch (aProcNum)
		{
	case EDecimalSeparator: 
		loc.SetDecimalSeparator(c);
		break;
	case EThousandsSeparator: 
		loc.SetThousandsSeparator(c);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::NearestLanguageFile(OplAPI& aOplAPI) const
	{
	TFileName ret(aOplAPI.PopString());
	BaflUtils::NearestLanguageFile(aOplAPI.EikonEnv().FsSession(),ret);
	aOplAPI.PushL(ret);
	}

void COpxLocale::HomeCountry(OplAPI& aOplAPI) const
	{
	RWorldServer worldServer;
	TWorldId worldId;
	TCountryData country;
	User::LeaveIfError(worldServer.Connect());
	CleanupClosePushL(worldServer);
	User::LeaveIfError(worldServer.Home(worldId));
	User::LeaveIfError(worldServer.CountryData(country, worldId));
	CleanupStack::PopAndDestroy(); //worldServer
	aOplAPI.PushL(country.iCountry);
	}

void COpxLocale::CurrencySymbol(OplAPI& aOplAPI) const
	{
	TCurrencySymbol symbol;
	symbol.Set();
	aOplAPI.PushL(symbol);
	}

void COpxLocale::CurrencySymbolSet(OplAPI& aOplAPI) const
	{
	User::SetCurrencySymbol(aOplAPI.PopString());
	aOplAPI.Push(0.0);
	}

void COpxLocale::Units(OplAPI& aOplAPI) const
	{
	TLocale loc;
	TAny *pLongDist = aOplAPI.PopPtrInt32();
	TAny *pShortDist = aOplAPI.PopPtrInt32();
	TAny *pGeneral = aOplAPI.PopPtrInt32();
	aOplAPI.PutLong(pGeneral, TInt(loc.UnitsGeneral()));
	aOplAPI.PutLong(pShortDist, TInt(loc.UnitsDistanceShort()));
	aOplAPI.PutLong(pLongDist, TInt(loc.UnitsDistanceLong()));
	aOplAPI.Push(0.0);
	}

void COpxLocale::SetUnits(OplAPI& aOplAPI) const
	{
	TUnitsFormat longDist	= (TUnitsFormat)(aOplAPI.PopInt32());
	TUnitsFormat shortDist	= (TUnitsFormat)(aOplAPI.PopInt32());
	TUnitsFormat general	= (TUnitsFormat)(aOplAPI.PopInt32());
	if ((general!=EUnitsImperial && general!=EUnitsMetric) || 
		(shortDist!=EUnitsImperial && shortDist!=EUnitsMetric) ||
			(longDist!=EUnitsImperial && longDist!=EUnitsMetric))
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	loc.SetUnitsGeneral(general);
	loc.SetUnitsDistanceShort(shortDist);
	loc.SetUnitsDistanceLong(longDist);
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::DaylightSaving(OplAPI& aOplAPI) const
	{
	TInt where = aOplAPI.PopInt32();
	TLocale loc;
	TInt32 homeDst = loc.QueryHomeHasDaylightSavingOn();
	TInt32 allDst = loc.DaylightSaving();
	if (!where)
		aOplAPI.Push(homeDst ? TInt16(-1) : TInt16(0));
	else
		aOplAPI.Push((allDst & where) ? TInt16(-1) : TInt16(0));
	}

void COpxLocale::SetDateFormat(OplAPI& aOplAPI) const
	{
	TDateFormat format = (TDateFormat)(aOplAPI.PopInt32());
	if (format!=EDateAmerican && format!=EDateEuropean && format!=EDateJapanese)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	loc.SetDateFormat(format);
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::DateSeparator(OplAPI& aOplAPI) const 
	{
	TInt index=aOplAPI.PopInt32();
	if (index<0 || index > KMaxDateSeparators)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	TChar c=loc.DateSeparator(index);
	TBuf<1> des;
	des.Append(c);
	aOplAPI.PushL(des);
	}

void COpxLocale::SetTimeFormat(OplAPI& aOplAPI) const
	{
	TTimeFormat format = (TTimeFormat)(aOplAPI.PopInt32());
	if (format!=ETime12 && format!=ETime24)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	loc.SetTimeFormat(format);
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::TimeSeparator(OplAPI& aOplAPI) const
	{
	TInt index=aOplAPI.PopInt32();
	if (index<0 || index > KMaxTimeSeparators)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	TChar c=loc.TimeSeparator(index);
	TBuf<1> des;
	des.Append(c);
	aOplAPI.PushL(des);
	}

void COpxLocale::SetClockFormat(OplAPI& aOplAPI) const
	{
	TClockFormat format=(TClockFormat)(aOplAPI.PopInt32());
	if (format!=EClockAnalog && format!=EClockDigital)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	loc.SetClockFormat(format);
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::DayNameFull(OplAPI& aOplAPI) const
	{
	TInt day=aOplAPI.PopInt32()-1;
	if (day<0 || day>6)
		User::Leave(KOplErrInvalidArgs);
	aOplAPI.PushL(TDayName(TDay(day)));
	}

void COpxLocale::MonthNameFull(OplAPI& aOplAPI) const
	{
	TInt month=aOplAPI.PopInt32()-1;
	if (month<0 || month>11)
		User::Leave(KOplErrInvalidArgs);
	aOplAPI.PushL(TMonthName(TMonth(month)));
	}

void COpxLocale::SetStartOfWeek(OplAPI& aOplAPI) const
	{
	TInt day=aOplAPI.PopInt32()-1;
	if (day<0 || day>6)
		User::Leave(KOplErrInvalidArgs);
	TLocale loc;
	loc.SetStartOfWeek(TDay(day));
	loc.Set();
	aOplAPI.Push(0.0);
	}

void COpxLocale::Workday(OplAPI& aOplAPI) const
	{
	TLocale loc;
	TInt dayNo = aOplAPI.PopInt32();
	if (dayNo<0 || dayNo>6)
		User::Leave(KOplErrInvalidArgs);
	TInt workdays = loc.WorkDays();
	TInt flag = workdays & (1 << dayNo);
	aOplAPI.Push(TInt16(flag ? -1 : 0));
	}

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

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

void CTlsDataOpxLocale::ConstructL()
	{
	iLocaleHandle=new(ELeave) COpxLocale;
	}

CTlsDataOpxLocale::~CTlsDataOpxLocale()
	{
	delete iLocaleHandle;
	Dll::FreeTls();
	}

void CTlsDataOpxLocale::RunL(TInt aProcNum)
	// Run a language extension procedure
	{
	switch (aProcNum)
		{
	case ECurrencyNegativeInBrackets:
	case ECurrencySpaceBetween:
	case ECurrencyTriadsAllowed:
	case EAmPmSpaceBetween:
		iLocaleHandle->TInt16LocaleFunction(iOplAPI,aProcNum);
		break;
	case ECurrencySetNegativeInBrackets:
	case ECurrencySetSpaceBetween:
	case ECurrencySetTriadsAllowed:
	case EAmPmSetSpaceBetween:
		iLocaleHandle->SetTInt16LocaleFunction(iOplAPI,aProcNum);
		break;
	case ELanguage:
	case ECountryCode:
	case ECurrencySymbolPosition:
	case ECurrencyDecimalPlaces:
	case EUTCOffset:
	case EDateFormat:
	case ETimeFormat:
	case EClockFormat:
	case EAmPmSymbolPosition:
	case EStartOfWeek:
		iLocaleHandle->TInt32LocaleFunction(iOplAPI,aProcNum);
		break;
	case ECurrencySetDecimalPlaces:
		iLocaleHandle->SetTInt32LocaleFunction(iOplAPI,aProcNum);
		break;
	case ECurrencySetSymbolPosition:
	case EAmPmSetSymbolPosition:
		iLocaleHandle->SetLocalePositionFunction(iOplAPI,aProcNum);
		break;
	case EDecimalSeparator:
	case EThousandsSeparator:
		iLocaleHandle->SeparatorCharacter(iOplAPI,aProcNum);
		break;
	case EDecimalSeparatorSet:
	case EThousandsSeparatorSet:
		iLocaleHandle->SetSeparatorCharacter(iOplAPI,aProcNum);
		break;
	case ENearestLanguageFile:
		iLocaleHandle->NearestLanguageFile(iOplAPI);
		break;
	case EHomeCountry:
		iLocaleHandle->HomeCountry(iOplAPI);
		break;
	case ECurrencySymbol:
		iLocaleHandle->CurrencySymbol(iOplAPI);
		break;
	case ECurrencySetSymbol:
		iLocaleHandle->CurrencySymbolSet(iOplAPI);
		break;
	case EUnits:
		iLocaleHandle->Units(iOplAPI);
		break;
	case EUnitsSet:
		iLocaleHandle->SetUnits(iOplAPI);
		break;
	case EDaylightSaving:
		iLocaleHandle->DaylightSaving(iOplAPI);
		break;
	case EDateFormatSet:
		iLocaleHandle->SetDateFormat(iOplAPI);
		break;
	case EDateSeparator:
		iLocaleHandle->DateSeparator(iOplAPI);
		break;
	case ETimeFormatSet:
		iLocaleHandle->SetTimeFormat(iOplAPI);
		break;
	case ETimeSeparator:
		iLocaleHandle->TimeSeparator(iOplAPI);
		break;
	case ESetClockFormat:
		iLocaleHandle->SetClockFormat(iOplAPI);
		break;
	case EDayNameFull:
		iLocaleHandle->DayNameFull(iOplAPI);
		break;
	case EMonthNameFull:
		iLocaleHandle->MonthNameFull(iOplAPI);
		break;
	case EStartOfWeekSet:
		iLocaleHandle->SetStartOfWeek(iOplAPI);
		break;
	case EWorkday:
		iLocaleHandle->Workday(iOplAPI);
		break;
	default:
		User::Leave(KOplErrOpxProcNotFound);
		}
	}

//
// OPX loading interface
//
TBool CTlsDataOpxLocale::CheckVersion(TInt aVersion)
	{
	if ((aVersion & 0xFF00) > (KOpxVersion & 0xFF00))
		return EFalse;
	else
		return ETrue;
	}

EXPORT_C COpxBase* NewOpxL(OplAPI& aOplAPI)
	// Creates a COpxBase instance as required by the OPL runtime
	// This object is to be stored in the OPX's TLS as shown below
	{
	CTlsDataOpxLocale* tls=((CTlsDataOpxLocale*)Dll::Tls());
	if (tls==NULL)
		{
		tls=CTlsDataOpxLocale::NewL(aOplAPI);
		Dll::SetTls(tls);
		}
	return (COpxBase *)tls;
	}

EXPORT_C TUint Version()
	{
	return KOpxVersion;
	}

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

⌨️ 快捷键说明

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