tzservices/tzserver/Client/Source/tzid.cpp
changeset 0 2e3d3ce01487
child 81 676b6116ca93
--- /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 <s32mem.h>
+#include <tzid.h>
+#include "tzidinternal.h"
+#include <tz.h>
+
+
+/**
+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<KMaxTzIdDigits> 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<CTzId*>(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);
+	}