telephonyserverplugins/ctsydispatchlayer/src/utility/cphonebookentry.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/ctsydispatchlayer/src/utility/cphonebookentry.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,613 @@
+// Copyright (c) 2008-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 <ctsy/ltsy/cphonebookentry.h>
+
+/**
+ * Factory function
+ * 
+ * @return Pointer to a new CPhoneBookEntry object
+ */
+EXPORT_C CPhoneBookEntry* CPhoneBookEntry::NewLC()
+	{
+	CPhoneBookEntry* self = new (ELeave) CPhoneBookEntry();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/**
+ * Factory function
+ * 
+ * @return Pointer to a new CPhoneBookEntry object left on the cleanup stack
+ */
+EXPORT_C CPhoneBookEntry* CPhoneBookEntry::NewL()
+	{
+	CPhoneBookEntry* self = CPhoneBookEntry::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+ * Second phase construction
+ */
+void CPhoneBookEntry::ConstructL()
+	{
+	}
+
+/**
+ * First phase construction
+ */
+CPhoneBookEntry::CPhoneBookEntry() : 
+	iIndex(0),
+	iIndexSet(EFalse)
+	{
+	}
+
+/**
+ * Destruction
+ */
+
+CPhoneBookEntry::~CPhoneBookEntry()
+	{
+	Reset();
+	}
+
+/**
+ * Resets the object to its initial state.
+ */
+EXPORT_C void CPhoneBookEntry::Reset()
+	{
+	iIndex = 0;
+	iIndexSet = EFalse;
+	iFirstName.Close();
+	iDiallingNumber.Close();
+
+	TInt i = 0;
+	
+	const TInt KEmailAddressCount = iEmailAddresss.Count();
+	for(i = 0; i < KEmailAddressCount; ++i)
+		{
+		iEmailAddresss[i].Close();
+		}
+	iEmailAddresss.Close();
+	
+	const TInt KSecondNamesCount = iSecondNames.Count();
+	for(i = 0; i < KSecondNamesCount; ++i)
+		{
+		iSecondNames[i].Close();
+		}
+	iSecondNames.Close();
+	
+	const TInt KAdditionalNumbersCount = iAdditionalNumbers.Count();
+	for(i = 0; i < KAdditionalNumbersCount; ++i)
+		{
+		iAdditionalNumbers[i].Close();
+		}
+	iAdditionalNumbers.Close();
+	}
+
+/**
+ * @return The Entry Index.
+ */
+EXPORT_C TInt CPhoneBookEntry::GetIndex() const
+	{
+	return iIndex;
+	}
+
+/**
+ * @return The entries firstname.
+ */
+EXPORT_C const TDesC& CPhoneBookEntry::GetFirstName() const
+	{
+	return iFirstName;
+	}
+
+/**
+ * @return The entries dialling number.
+ */
+EXPORT_C const TDesC& CPhoneBookEntry::GetDiallingNumber() const
+	{
+	return iDiallingNumber;
+	}
+
+/**
+ * @return An array of Email address's in the entry.
+ */
+
+EXPORT_C const RArray<RBuf>& CPhoneBookEntry::GetEmailAddresss() const
+	{
+	return iEmailAddresss;
+	}
+
+/**
+ * @return An array of second names in the entry.
+ */
+EXPORT_C const RArray<RBuf>& CPhoneBookEntry::GetSecondNames() const
+	{
+	return iSecondNames;
+	}
+
+/**
+ * @return An array of additional numbers.
+ */
+EXPORT_C const RArray<RBuf>& CPhoneBookEntry::GetAdditionalNumbers() const
+	{
+	return iAdditionalNumbers;
+	}
+
+/**
+ * @param aIndex The index to set.
+ */
+EXPORT_C void CPhoneBookEntry::SetIndex(TInt aIndex)
+	{
+	iIndex = aIndex;
+	iIndexSet = ETrue;
+	}
+
+/**
+ * @param aFirstName The firstname to be set.
+ * @return System wide error code.
+ */
+EXPORT_C TInt CPhoneBookEntry::SetFirstName(const TDesC& aFirstName)
+	{
+	TInt error = iFirstName.ReAlloc(aFirstName.Length());
+	
+	if(error == KErrNone)
+		{
+		iFirstName.Copy(aFirstName);
+		}
+	
+	return error;
+	}
+
+/**
+ * @param aFirstName The dialling number to be set.
+ * @return System wide error code.
+ * 
+ */
+EXPORT_C TInt CPhoneBookEntry::SetDiallingNumber(const TDesC& aDiallingNumber)
+	{
+	TInt error = iDiallingNumber.ReAlloc(aDiallingNumber.Length());
+	
+	if(error == KErrNone)
+		{
+		iDiallingNumber.Copy(aDiallingNumber);
+		}
+	
+	return error;
+	}
+
+/**
+ * @param aEmailAddress An email address to be added to the entries list.
+ * @return System wide error code.
+ */
+EXPORT_C TInt CPhoneBookEntry::AddEmailAddress(const TDesC& aEmailAddress)
+	{
+	RBuf emailAddress;
+	TInt error = emailAddress.Create(aEmailAddress);
+	
+	if(error == KErrNone)
+		{
+		error = iEmailAddresss.Append(emailAddress);
+		}
+	
+	return error;
+	}
+
+/**
+ * @param aSecondName An secondname to be added to the entries list.
+ * @return System wide error code.
+ * 
+ */
+EXPORT_C TInt CPhoneBookEntry::AddSecondName(const TDesC& aSecondName)
+	{
+	RBuf secondName;
+	TInt error = secondName.Create(aSecondName);
+	
+	if(error == KErrNone)
+		{
+		error = iSecondNames.Append(secondName);
+		}
+	
+	return error;
+	}
+
+/**
+ * @param aAdditionalNumber An additional number to be added to the entries list.
+ * @return System wide error code.
+ */
+EXPORT_C TInt CPhoneBookEntry::AddAdditionalNumber(const TDesC& aAdditionalNumber)
+	{
+	RBuf additionalNumber;
+	TInt error = additionalNumber.Create(aAdditionalNumber);
+	
+	if(error == KErrNone)
+		{
+		error = iAdditionalNumbers.Append(additionalNumber);
+		}
+	
+	return error;
+	}
+
+/**
+ * @return If the two entries are equal, equivalence is defined is all entries are equal and in
+ * the same order.
+ */
+EXPORT_C TBool CPhoneBookEntry::operator== (const CPhoneBookEntry& aPhoneBookEntry) const
+	{
+	TBool ret =	(iIndex == aPhoneBookEntry.GetIndex()) &&
+				(iFirstName == aPhoneBookEntry.GetFirstName()) &&
+				(iDiallingNumber == aPhoneBookEntry.GetDiallingNumber()) &&
+				(iEmailAddresss.Count() == aPhoneBookEntry.GetEmailAddresss().Count()) &&
+				(iSecondNames.Count() == aPhoneBookEntry.GetSecondNames().Count()) &&
+				(iAdditionalNumbers.Count() == aPhoneBookEntry.GetAdditionalNumbers().Count());
+	
+	TInt i = 0;
+	for(i = 0; i < iEmailAddresss.Count() && ret; ++i)
+		{
+		ret = iEmailAddresss[i] == aPhoneBookEntry.GetEmailAddresss()[i];
+		}
+
+	for(i = 0; i < iSecondNames.Count() && ret; ++i)
+		{
+		ret = iSecondNames[i] == aPhoneBookEntry.GetSecondNames()[i];
+		}
+	
+	for(i = 0; i < iAdditionalNumbers.Count() && ret; ++i)
+		{
+		ret = iAdditionalNumbers[i] == aPhoneBookEntry.GetAdditionalNumbers()[i];
+		}
+	
+	return ret;
+	}
+
+/**
+ * Writes the entry to a CPhoneBookBuffer in the TLV format.
+ * 
+ * @param aPhoneBookBuffer The buffer to write the entry to.
+ * @return System wide error code.
+ */
+EXPORT_C TInt CPhoneBookEntry::ExternalizeToTlvEntry(CPhoneBookBuffer& aPhoneBookBuffer) const
+	{
+	TInt error = KErrNone;
+	
+	if(error == KErrNone)
+		{
+		error = aPhoneBookBuffer.AddNewEntryTag();
+		}
+
+	if(iIndexSet && (error == KErrNone))
+		{
+		error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBAdnIndex, static_cast<TUint16>(iIndex));
+		}
+		
+	if(iFirstName.Length() > 0 && (error == KErrNone))
+		{
+		error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBText,iFirstName);
+		}
+		
+	if(iDiallingNumber.Length() > 0 && (error == KErrNone))
+		{
+		error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber,iDiallingNumber);
+		}
+		
+	TInt i = 0;
+
+	for(i = 0; i < iEmailAddresss.Count() && (error == KErrNone); ++i)
+		{
+		if(iEmailAddresss[i].Length() > 0)
+			{
+			error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBEmailAddress,iEmailAddresss[i]);
+			}
+		}
+	
+	for(i = 0; i < iSecondNames.Count() && (error == KErrNone); ++i)
+		{
+		if(iSecondNames[i].Length() > 0)
+			{
+			error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBSecondName,iSecondNames[i]);
+			}
+		}
+		
+	for(i = 0; i < iAdditionalNumbers.Count() && (error == KErrNone); ++i)
+		{
+		if(iAdditionalNumbers[i].Length() > 0)
+			{
+			error = aPhoneBookBuffer.AddNewNumberTag();
+			if(error == KErrNone)
+				{
+				error = aPhoneBookBuffer.PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber,iAdditionalNumbers[i]);
+				}
+			}
+		}
+	
+	return error;
+	}
+
+/**
+ * Reads an entry from a CPhoneBookBuffer, this does not reset the object first.
+ * 
+ * @param aPhoneBookBuffer The buffer to read from.
+ * @param aNewEntryTagRead If the TLV being read has a new entry tag or not.
+ * 
+ * @return System wide error code.
+ * 
+ */
+EXPORT_C TInt CPhoneBookEntry::InternalizeFromTlvEntry(CPhoneBookBuffer& aPhoneBookBuffer, TBool aNewEntryTagRead)
+	{
+    TUint8 tag = 0;
+    CPhoneBookBuffer::TPhBkTagType tagType = CPhoneBookBuffer::EPhBkTypeNoData;
+	TInt error = KErrNone;
+	TInt newEntryCount = aNewEntryTagRead ? 1 : 0;
+	TBool gettingAdditionalNumber = EFalse;
+	
+	while(error == KErrNone && aPhoneBookBuffer.RemainingReadLength() > 0 && newEntryCount < 2)
+		{
+		error = aPhoneBookBuffer.GetTagAndType(tag,tagType);
+
+		if(gettingAdditionalNumber)
+			{
+			if(tag != RMobilePhoneBookStore::ETagPBNumber)
+				{
+				error = KErrArgument;
+				}
+			}
+		
+		if(error == KErrNone)
+			{
+			switch(tag)
+				{
+				case RMobilePhoneBookStore::ETagPBNewEntry:
+					{
+					newEntryCount += 1;
+					break; //RMobilePhoneBookStore::ETagPBNewEntry
+					}
+
+				case RMobilePhoneBookStore::ETagPBAdnIndex:
+					{
+					iIndexSet = ETrue;
+					
+					switch(tagType)
+						{
+						case CPhoneBookBuffer::EPhBkTypeInt8:
+							{
+							TUint8 value = 0;
+							error = aPhoneBookBuffer.GetValue(value);
+							iIndex = (error == KErrNone ? value : 0);
+							break;
+							}
+						case CPhoneBookBuffer::EPhBkTypeInt16:
+							{
+							TUint16 value = 0;
+							error = aPhoneBookBuffer.GetValue(value);
+							iIndex = (error == KErrNone ? value : 0);
+							break;
+							}
+						case CPhoneBookBuffer::EPhBkTypeInt32:
+							{
+							TUint32 value = 0;
+							error = aPhoneBookBuffer.GetValue(value);
+							iIndex = (error == KErrNone ? value : 0);
+							break;
+							}
+						default:
+							{
+							error = KErrArgument;
+							break;
+							}
+						}
+					break; //RMobilePhoneBookStore::ETagPBAdnIndex
+					}
+
+				case RMobilePhoneBookStore::ETagPBText:
+					{
+					TPtrC16 text;
+					error = GetText(text,tagType,aPhoneBookBuffer);
+					if((error == KErrNone) && text.Length() > 0)
+						{
+						error = SetFirstName(text);
+						}
+					break; //RMobilePhoneBookStore::ETagPBText
+					}
+					
+				case RMobilePhoneBookStore::ETagPBNumber:
+					{
+					TPtrC16 number;
+					error = GetText(number,tagType,aPhoneBookBuffer);
+					if((error == KErrNone) && number.Length() > 0)
+						{
+						if(gettingAdditionalNumber)
+							{
+							error = AddAdditionalNumber(number);
+							gettingAdditionalNumber = EFalse;
+							}
+						else
+							{
+							error = SetDiallingNumber(number);
+							}
+						}
+					break; //RMobilePhoneBookStore::ETagPBNumber
+					}
+				
+				case RMobilePhoneBookStore::ETagPBEmailAddress:
+					{
+					TPtrC16 emailAddress;
+					error = GetText(emailAddress,tagType,aPhoneBookBuffer);
+					if((error == KErrNone) && emailAddress.Length() > 0)
+						{
+						error = AddEmailAddress(emailAddress);
+						}
+					break; //RMobilePhoneBookStore::ETagPBEmailAddress
+					}
+					
+				case RMobilePhoneBookStore::ETagPBSecondName:
+					{
+					TPtrC16 secondName;
+					error = GetText(secondName,tagType,aPhoneBookBuffer);
+					if((error == KErrNone) && secondName.Length() > 0)
+						{
+						error = AddSecondName(secondName);
+						}
+					break; //RMobilePhoneBookStore::ETagPBNumber
+					}
+					
+				case RMobilePhoneBookStore::ETagPBAnrStart:
+					{
+					gettingAdditionalNumber = ETrue;
+					break; //RMobilePhoneBookStore::ETagPBNumber
+					}
+					
+				default:
+					{
+					aPhoneBookBuffer.SkipValue(tagType);
+					break;
+					}
+				} //switch(tag)
+			}
+		} //while loop
+	
+	if((error == KErrNone) && (newEntryCount == 0))
+		{
+		//no error but no new entry found
+		error = KErrArgument;
+		}
+	
+	if(error != KErrNone)
+		{
+		//convert all error codes to KErrArgument
+		error = KErrArgument;
+		}
+	
+	return error;
+	}
+
+/**
+ * Helper function
+ * 
+ * Gets a the next TPtrC16
+ * @param aText A TPtrC to the next text entry
+ * @param aPhoneBookBuffer The phonebook buffer to read from
+ * 
+ * @return System wide error code.
+ */
+TInt CPhoneBookEntry::GetText(TPtrC16& aText, CPhoneBookBuffer::TPhBkTagType aTagType, CPhoneBookBuffer& aPhoneBookBuffer) const
+	{
+
+	TInt error = KErrNone;
+	
+	switch(aTagType)
+		{
+		case CPhoneBookBuffer::EPhBkTypeDes16:
+			{
+			error = aPhoneBookBuffer.GetValue(aText);
+			break;
+			}
+			
+		default:
+			{
+			error = KErrArgument;
+			break;
+			}
+		}
+	
+	return error;
+
+	}
+
+/**
+ * Helper function
+ * 
+ * @param aSize The size to be updated.
+ * @param aDes The descriptor being added.
+ */
+void CPhoneBookEntry::DesSize(TInt& aSize, const TDesC& aDes) const
+	{
+	switch(aSize % 4)
+		{
+		case 0:
+			aSize += 1;
+			break;
+		case 1:
+			break;
+		case 2:
+			aSize += 3;
+			break;
+		case 3:
+			aSize += 2;
+			break;
+		default:
+			break;
+		}
+	aSize += 1 /*the tag*/ + 2 /*the length*/ +  aDes.Size();
+	}
+
+/**
+ * @return The TLV length required for the CPhoneBookEntry's current state .
+ */
+EXPORT_C TInt CPhoneBookEntry::TlvLength() const
+	{
+	TInt size = 0;
+		
+	size += 1; //new entry tag
+		
+	size += 1; //index tag
+	//tag TUint16
+	size += 2;
+	
+	if(iFirstName.Length() > 0)
+		{
+		DesSize(size,iFirstName);
+		}
+
+	if(iDiallingNumber.Length() > 0)
+		{
+		DesSize(size,iDiallingNumber);
+		}
+	
+	TInt i = 0;
+	for(i = 0; i < iEmailAddresss.Count(); ++i)
+		{
+		if(iEmailAddresss[i].Length() > 0)
+			{
+			DesSize(size,iEmailAddresss[i]);
+			}
+		}
+	
+	for(i = 0; i < iSecondNames.Count(); ++i)
+		{
+		if(iSecondNames[i].Length() > 0)
+			{
+			DesSize(size,iSecondNames[i]);
+			}
+		}
+	
+	for(i = 0; i < iAdditionalNumbers.Count(); ++i)
+		{
+		if(iAdditionalNumbers[i].Length() > 0)
+			{
+			size += 1; //new number tag
+			DesSize(size,iAdditionalNumbers[i]);
+			}
+		}
+	
+	size += 3; 
+	//add this as CPhoneBookBuffer::PutTagAndValue must allow for the worst case padding
+	//i.e. 3 "Also allow for the 1-byte tag and up to 3 zero padding bytes"
+		
+	return size;
+	}
+