diff -r 000000000000 -r 2e3d3ce01487 tzservices/tzserver/Client/Source/tzid.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tzservices/tzserver/Client/Source/tzid.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,346 @@ +// Copyright (c) 1997-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: +// + + +#include +#include +#include "tzidinternal.h" +#include + + +/** +The maximum number of digits for a user-defined time zone (when it is 0x20000 - +1). + +@internalComponent +*/ +const TInt KMaxTzIdDigits = 6; + + +CTzId::CTzId() + { + } + + +CTzId::CTzId(TUint aNumericId) : + iReferenceId(aNumericId) + { + } + + +/** +Time zone ID data externaliser. + +@param aStream A stream that will contain the serialised time zone ID. + +@internalComponent +*/ +EXPORT_C void CTzId::ExternalizeL(RWriteStream& aStream) const + { + aStream << iReferenceId; + TInt32 size = 0; + if (iZoneId) + { + size = iZoneId->Length(); + aStream << size; + if (size) + { + aStream.WriteL(iZoneId->Des(), size); + } + } + else + { + aStream << size; + } + } + + +/** +Serialised CTzId data internaliser. + +@param aStream a stream containing the serialised time zone Id + +@internalComponent +*/ +EXPORT_C void CTzId::InternalizeL(RReadStream& aStream) + { + + aStream >> iReferenceId; + + delete iZoneId; + iZoneId = NULL; + + TInt32 size; + aStream >> size; + + const TInt KMaxSize = KMaxTInt / 2; + if (size < 0 || size >= KMaxSize) + { + User::Leave( KErrArgument ); + } + + // Don't create the tz id if the size is 0 - it hasn't been set. + if (size) + { + iZoneId = HBufC8::NewL(size); + TPtr8 bufferPtr(iZoneId->Des() ); + aStream.ReadL(bufferPtr, size); + } + } + + +/** +Destructor. +*/ +EXPORT_C CTzId::~CTzId() + { + delete iZoneId; + } + + +/** +Time zone ID factory method. + +@param aStream a stream containing the serialised time zone Id + +@leave KErrNoMemory or some other system error code + +@return Pointer to CTzId; clients own the object. + +@internalComponent +*/ +EXPORT_C CTzId* CTzId::NewL(RReadStream& aStream) + { + CTzId* self = new(ELeave) CTzId(); + CleanupStack::PushL(self); + + self->InternalizeL(aStream); + + CleanupStack::Pop(self); + return self; + } + + +/** +Time zone ID factory method. + +@param aNameIdentity A name recognised by the time zone database. + +@return A pointer to the time zone ID. Clients take ownership. +*/ +EXPORT_C CTzId* CTzId::NewL(const TDesC8& aNameIdentity) + { + CTzId* self = new(ELeave) CTzId(); + CleanupStack::PushL(self); + + self->iZoneId = aNameIdentity.AllocL(); + + CleanupStack::Pop(self); + return self; + } + + +/** +Time zone ID factory method. + +@param aNumericId A numeric reference ID, generated by the time zone compiler. + +@return A pointer to the time zone ID. Clients take ownership. + +@panic TzServer 8 aNumericId must not be zero. +*/ +EXPORT_C CTzId* CTzId::NewL(TUint aNumericId) + { + const TUint KUnacceptableTzId = 0; + + // aNumericId must not be zero + __ASSERT_ALWAYS((aNumericId != KUnacceptableTzId), RTz::Panic(RTz::EPanicUnsupportedTimeZoneNoId)); + CTzId* self = new(ELeave) CTzId(aNumericId); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +void CTzId::ConstructL() + { + if (IsUserTzId()) + { + TBuf8 name; + name.Num(iReferenceId); + SetIdL(name); + } + } + + +/** +Replicates a CTzId. + +@return A pointer to CTzId; clients own the object. + +@leave KErrNoMemory or some other system error code. + +@internalComponent +*/ +EXPORT_C CTzId* CTzId::CloneL() const + { + CTzId* clone = NULL; + if (iZoneId) + { + clone = NewL(*iZoneId); + clone->iReferenceId = iReferenceId; + } + else + { + clone = new(ELeave) CTzId(iReferenceId); + } + return clone; + } + + +/** +Retrieves the time zone's name. + +This can be used after calling RTz::GetTimeZoneIdL(). + +@return The time zone's name, if one has been set. A NULL descriptor if not. +*/ +EXPORT_C const TDesC8& CTzId::TimeZoneNameID() const + { + if (NULL == iZoneId) + { + return KNullDesC8(); + } + + return *iZoneId; + } + + +/** +Retrieves the time zone's numeric ID. + +This can be used after calling RTz::GetTimeZoneIdL(). + +@return The time zone's numeric ID, generated by the time zone compiler. +*/ +EXPORT_C TUint CTzId::TimeZoneNumericID() const + { + return iReferenceId; + } + + +/** +Sets the numeric time zone ID. + +@param aNumericId The new numeric ID, generated by the time zone compiler. + +@internalComponent +*/ +EXPORT_C void CTzId::SetId(TUint aNumericId) + { + iReferenceId = aNumericId; + } + + +/** +Sets the the time zone's name. + +@param aNameIdentity string TZID as used in the Olson's TZ Database + +@internalComponent +*/ +EXPORT_C void CTzId::SetIdL(const TDesC8& aNameIdentity) + { + delete iZoneId; + iZoneId = NULL; + + iZoneId = aNameIdentity.AllocL(); + } + + +/** +Equality operator. + +@param aTZId The ID of another time zone. + +@return ETrue if the specified time zone ID is the same as this one, otherwise +EFalse. +*/ +EXPORT_C TBool CTzId::operator==(const CTzId& aTZId) const + { + if ((aTZId.iReferenceId != 0) && (iReferenceId != 0)) + { + return (aTZId.iReferenceId == iReferenceId); + } + else + { + if (iZoneId == NULL) + { + return EFalse; + } + + if (aTZId.iZoneId == NULL) + { + return EFalse; + } + + return (iZoneId->Compare(*(aTZId.iZoneId)) == 0); + } + } + + +/** +Determines if this time zone identifier has a numeric identifier value that +belongs to the range of values used to identify user-defined time zones. + +@return Returns ETrue if this time zone identifier has a numeric identifier +value that belongs to the range of values used to identify user-defined time +zones and EFalse otherwise. +*/ +EXPORT_C TBool CTzId::IsUserTzId() const + { + // Check if just the string identifier has been set. If so, we will need + // to attempt to extract a number from the string identifier and use this + // as the numeric identifier. + if (iReferenceId == 0 && iZoneId && *iZoneId != KNullDesC8) + { + TUint intId; + TLex8 lex(*iZoneId ); + if(lex.Val(intId) == KErrNone) + { + CTzId* self = const_cast(this); + self->SetId(intId); + } + } + + return IsUserTzId(iReferenceId); + } + + +/** +Determines if the given numeric time zone identifier value belongs to the range +of values used to identify user-defined time zones. + +@param aTzId Numeric time zone identifier value. + +@return Returns ETrue if the given numeric time zone identifier value belongs to +the range of values used to identify user-defined time zones and EFalse +otherwise. +*/ +EXPORT_C TBool CTzId::IsUserTzId(TUint aTzId) + { + return (aTzId >= KUserTzIdMin && aTzId <= KUserTzIdMax); + }