messagingfw/sendas/client/src/csendasaccounts.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/sendas/client/src/csendasaccounts.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,291 @@
+// Copyright (c) 2004-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 <s32strm.h>
+#include <csendasaccounts.h>
+
+const TInt KMessageAccountArrayGranularity = 8;
+const TInt16 KStreamVersionSendAs2Account = 1;
+const TInt KMaxSendAs2AccountNameLength = 1024;
+
+/**
+Create a new CSendAsAccount.
+
+@return
+If the function succeeds, this is a pointer to a newly allocated and initialised
+object.
+*/
+EXPORT_C CSendAsAccounts* CSendAsAccounts::NewL()
+	{
+	CSendAsAccounts *self = new (ELeave) CSendAsAccounts;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+Destructor.
+*/	
+EXPORT_C CSendAsAccounts::~CSendAsAccounts()
+	{
+	delete iAccountNames;
+	iAccounts.Close();
+	}
+
+/**
+The UID of the message type.
+
+@return
+The UID of the message type.
+*/
+EXPORT_C TUid CSendAsAccounts::MessageType() const
+	{
+	return iMessageType;
+	}
+	
+/**
+The array of names of accounts for this message type.
+
+@return
+An array of name of accounts.
+*/
+EXPORT_C const MDesCArray& CSendAsAccounts::AccountNames() const
+	{
+	return (*iAccountNames);
+	}
+	
+/**
+The account specified by the index argument.
+
+@param	aIndex
+The index of the specified account.
+
+@return
+The account specified by the index argument.
+*/
+EXPORT_C TSendAsAccount CSendAsAccounts::Account(TInt aIndex) const
+	{
+	return iAccounts[aIndex];
+	}
+	
+/**
+The number of accounts for this message type.
+
+@return
+The number of accounts.
+*/
+EXPORT_C TInt CSendAsAccounts::Count() const
+	{
+	return iAccountNames->Count();
+	}
+
+/**
+Deletes all elements from the array.
+*/
+EXPORT_C void CSendAsAccounts::Reset()
+	{
+	iAccountNames->Reset();
+	iAccounts.Reset();
+	}
+	
+/**
+The name associated with the given account.
+
+@param aAccount
+The account whose associated name is to be returned.
+
+@return
+A descriptor holding the associated name.
+*/
+EXPORT_C TPtrC CSendAsAccounts::NameFromAccountL(const TSendAsAccount aAccount) const
+	{
+	TInt nameIndex = User::LeaveIfError(iAccounts.Find(aAccount));
+	return (*iAccountNames)[nameIndex];
+	}
+	
+/**
+The account associated with the given name.
+
+@param aName
+The associated name for the account to be returned.
+
+@return
+An account for the associated name.
+
+@leave  KErrNotFound
+An account with the given name cannot be found.
+*/
+EXPORT_C TSendAsAccount CSendAsAccounts::AccountFromNameL(const TDesC& aName) const
+	{
+	TInt acctIndex;
+	if (iAccountNames->Find(aName, acctIndex) != 0)
+		{
+		User::Leave(KErrNotFound);
+		}
+	return iAccounts[acctIndex];
+	}
+
+/**
+Internalizes the object from the specified stream.
+
+@see
+RMsvReadStream
+
+@param aReadStream
+The stream to read from.
+
+@internalComponent
+*/
+EXPORT_C void CSendAsAccounts::InternalizeL(RReadStream& aReadStream)
+	{
+	aReadStream.ReadInt16L(); // version - not used yet
+
+	aReadStream >> iMessageType;
+
+	TInt count = aReadStream.ReadInt32L();
+
+	Reset();
+
+	TSendAsAccount sendAsAccount;
+	for (TInt i = 0; i < count; ++i)
+		{
+		HBufC* buf = HBufC::NewLC(aReadStream, KMaxSendAs2AccountNameLength);
+		aReadStream >> sendAsAccount;
+		AppendAccountL(*buf, sendAsAccount);
+		
+		CleanupStack::PopAndDestroy(buf);
+		}
+	}
+
+
+/**
+Externalizes the object from the specified stream.
+
+@see
+RMsvWriteStream
+
+@param aWriteStream
+The stream to write out to.
+
+@internalComponent
+*/
+EXPORT_C void CSendAsAccounts::ExternalizeL(RWriteStream& aWriteStream) const
+	{
+	__ASSERT_ALWAYS((iAccountNames->Count() == iAccounts.Count()), User::Invariant());
+	
+	aWriteStream.WriteInt16L(KStreamVersionSendAs2Account); // Version number
+	aWriteStream << iMessageType; // Message type
+
+	TInt count = iAccountNames->Count();	
+	aWriteStream.WriteInt32L(count); // The count of name, uid object pairs to write out.
+
+	for (TInt i = 0; i < count; ++i)
+		{
+		if ((*iAccountNames)[i].Length() > KMaxSendAs2AccountNameLength)
+			{
+			// Limit the string length if necessary.
+			aWriteStream.WriteL((*iAccountNames)[i], KMaxSendAs2AccountNameLength);
+			}
+		else
+			{
+			aWriteStream << (*iAccountNames)[i];
+			}
+		aWriteStream << iAccounts[i];
+		}
+	}
+
+/**
+Sets UID of the message type.
+
+@param aMessageType
+The UID of the message type.
+*/
+EXPORT_C void CSendAsAccounts::SetMessageType(TUid aMessageType)
+	{
+	iMessageType = aMessageType;
+	}
+
+/**
+Appends a new account and associated name pair.
+
+@param aAccountName
+The human readable name with which to associate with the given account.
+
+@param aAccount
+The account to add.
+*/	
+EXPORT_C void CSendAsAccounts::AppendAccountL(const TDesC& aAccountName, TSendAsAccount aAccount)
+	{
+	iAccounts.AppendL(aAccount);
+	TRAPD(err, iAccountNames->AppendL(aAccountName));
+	if (err != KErrNone)
+		{
+		iAccounts.Remove(iAccounts.Count() - 1);
+		User::Leave(err);
+		}
+	}	
+
+/**
+Removes an existing account and associated name pair.
+
+@param aIndex
+The index of the entry to remove.
+*/
+EXPORT_C void CSendAsAccounts::RemoveAccount(TInt aIndex)
+	{
+	iAccountNames->Delete(aIndex);
+	iAccounts.Remove(aIndex);
+	}
+
+/**
+Gives the size of the accounts collection.
+
+@return
+The size of the accounts collection.
+*/
+EXPORT_C TInt CSendAsAccounts::Size() const
+	{
+	const TInt acctSize(sizeof(TSendAsAccount));
+	const TInt tIntSize(sizeof(TInt));
+	TInt totalSize = sizeof(TInt16) + sizeof(TUid); // The version and message type.
+	TInt count = iAccountNames->Count();
+
+	totalSize += tIntSize; // Size of the number of accounts
+
+	for (TInt i = 0; i < count; ++i)
+		{
+		// Each account consists of an integer which tells us the size of the
+		// account name, the account name, and the the TSendAsAccount data. We must
+		// add the size of each of these items to the total.
+		// Note that when externalizing an account, we don't explicitly write out an
+		// integer containing the size of the account name, but the externalize
+		// routine for the descriptor will write one out, so we must include it in
+		// our calculation here.
+		totalSize += tIntSize + (*iAccountNames)[i].Size() + acctSize;
+		}
+
+	return totalSize;
+	}
+	
+CSendAsAccounts::CSendAsAccounts()
+: iMessageType(KNullUid), iAccounts(KMessageAccountArrayGranularity)
+	{
+	}
+	
+void CSendAsAccounts::ConstructL()
+	{
+	iAccountNames = new (ELeave) CDesCArrayFlat(KMessageAccountArrayGranularity);
+	}