--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/unieditor/mtm/src/UniHeaders.cpp Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,377 @@
+/*
+* Copyright (c) 2005-2007 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: UniHeaders implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <msvstore.h>
+#include <badesca.h>
+#include <msvids.h>
+#include <mtmdef.h>
+#include <e32def.h>
+#include <e32math.h>
+#include <mmsvattachmentmanager.h>
+#include <cmsvmimeheaders.h>
+#include <mmsgenutils.h>
+#include "UniHeaders.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KArrayGranularity = 4;
+const TUid KUidUniHeaderStream={0x2000B00A};
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code that
+// might leave.
+//
+CUniHeaders::CUniHeaders()
+// in a class derived from CBase all member variables are set initially to 0
+ {
+ }
+
+// Symbian OS default constructor can leave.
+void CUniHeaders::ConstructL()
+ {
+ iToArray = new ( ELeave )CDesCArrayFlat( KArrayGranularity );
+ iCcArray = new ( ELeave )CDesCArrayFlat( KArrayGranularity );
+ iBccArray = new ( ELeave )CDesCArrayFlat( KArrayGranularity );
+ }
+
+// Two-phased constructor.
+CUniHeaders* CUniHeaders::NewL()
+ {
+ CUniHeaders* self = new ( ELeave ) CUniHeaders;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// Destructor
+CUniHeaders::~CUniHeaders()
+ {
+ delete iToArray;
+ delete iCcArray;
+ delete iBccArray;
+ delete iSubject;
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::RestoreL
+//
+// ---------------------------------------------------------
+//
+
+void CUniHeaders::RestoreL(
+ CMsvStore& aStore )
+ {
+
+ RMsvReadStream stream;
+ Reset(); // all old pointers are deleted here
+ if ( aStore.IsPresentL( KUidUniHeaderStream ) )
+ {
+ stream.OpenLC( aStore, KUidUniHeaderStream ); // pushes 'stream' to the stack
+ InternalizeL( stream );
+ CleanupStack::PopAndDestroy( &stream );
+ }
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::StoreL
+//
+// ---------------------------------------------------------
+//
+
+void CUniHeaders::StoreL(
+ CMsvStore& aStore )
+ {
+ // caller must commit the store
+ RMsvWriteStream stream;
+ stream.AssignLC( aStore, KUidUniHeaderStream ); // pushes 'stream' to the stack
+ ExternalizeL( stream );
+ stream.CommitL();
+ stream.Close();
+ CleanupStack::PopAndDestroy( &stream );
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::TypedAddresseeList
+//
+// ---------------------------------------------------------
+//
+const CDesCArray& CUniHeaders::TypedAddresseeList(
+ TMsvRecipientType aType )
+ {
+ if ( aType == EMsvRecipientTo )
+ {
+ return *iToArray;
+ }
+ else if ( aType == EMsvRecipientCc )
+ {
+ return *iCcArray;
+ }
+ else
+ {
+ return *iBccArray;
+ }
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::AddTypedAddresseeL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::AddTypedAddresseeL(
+ const TDesC& aRealAddress,
+ TMsvRecipientType aType )
+ {
+ if ( aType == EMsvRecipientTo )
+ {
+ iToArray->AppendL( aRealAddress );
+ }
+ if ( aType == EMsvRecipientCc )
+ {
+ iCcArray->AppendL( aRealAddress );
+ }
+ if ( aType == EMsvRecipientBcc )
+ {
+ iBccArray->AppendL( aRealAddress );
+ }
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::RemoveAddresseeL
+//
+// ---------------------------------------------------------
+//
+TBool CUniHeaders::RemoveAddressee( const TDesC& aRealAddress )
+ {
+
+ if ( RemoveAddressee( *iToArray, aRealAddress) )
+ {
+ return ETrue;
+ }
+ if ( RemoveAddressee( *iCcArray, aRealAddress) )
+ {
+ return ETrue;
+ }
+ if ( RemoveAddressee( *iBccArray, aRealAddress) )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::SetSubjectL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::SetSubjectL( const TDesC& aSubject )
+ {
+ HBufC* newAttrib = aSubject.AllocL();
+ delete iSubject;
+ iSubject = newAttrib;
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::Subject
+//
+// ---------------------------------------------------------
+//
+TPtrC CUniHeaders::Subject() const
+ {
+ return iSubject ? TPtrC( *iSubject ) : TPtrC();
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::InternalizeL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::InternalizeL( RMsvReadStream& aStream )
+ {
+
+ iSubject = HBufC::NewL( aStream, KMaxHeaderStringLength );
+ iMessageTypeSetting = aStream.ReadInt32L();
+ iMessageTypeLocking = aStream.ReadInt32L();
+ iMessageRoot = aStream.ReadInt32L();
+
+ // Internalize fields which may have multiple values.
+ InternalizeArrayL( *iToArray, aStream ); //lint !e64 !e1514
+ InternalizeArrayL( *iCcArray, aStream ); //lint !e64 !e1514
+ InternalizeArrayL( *iBccArray, aStream ); //lint !e64 !e1514
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::ExternalizeL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::ExternalizeL( RMsvWriteStream& aStream ) const
+ {
+
+ aStream << Subject(); //lint !e1023 !e1703 not ambiguous
+ aStream.WriteInt32L( iMessageTypeSetting );
+ aStream.WriteInt32L( iMessageTypeLocking );
+ aStream.WriteInt32L( iMessageRoot );
+
+ // Externalize fields which may have multiple values.
+ ExternalizeArrayL( *iToArray, aStream ); //lint !e64 !e1514
+ ExternalizeArrayL( *iCcArray, aStream ); //lint !e64 !e1514
+ ExternalizeArrayL( *iBccArray, aStream ); //lint !e64 !e1514
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::RemoveAddressee
+//
+// ---------------------------------------------------------
+//
+TBool CUniHeaders::RemoveAddressee(
+ CDesCArray& aList,
+ const TDesC& aAddress )
+ {
+
+ TInt pos = 0;
+
+ // Find the match index from a given addressee list
+ aList.Find( aAddress, pos );
+ if (pos < aList.Count())
+ {
+ // remove entry from the heap
+ aList.Delete( pos );
+ aList.Compress();
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::Reset
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::Reset()
+ {
+
+ iToArray->Reset();
+ iCcArray->Reset();
+ iBccArray->Reset();
+
+ delete iSubject;
+ iSubject = NULL;
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::Size
+//
+// ---------------------------------------------------------
+//
+TInt CUniHeaders::Size() const
+ {
+
+ TInt size = 0;
+
+ TInt i = 0;
+
+ TInt nbr = iToArray->MdcaCount();
+ for ( i=0; i < nbr; ++i )
+ {
+ size += iToArray->MdcaPoint(i).Size();
+ }
+
+ nbr = iCcArray->MdcaCount();
+ for ( i=0; i < nbr; ++i )
+ {
+ size+=iCcArray->MdcaPoint(i).Size();
+ }
+
+ nbr = iBccArray->MdcaCount();
+ for ( i=0; i < nbr; ++i )
+ {
+ size+=iBccArray->MdcaPoint(i).Size();
+ }
+
+ size+= Subject().Size();
+ size+= 2 * sizeof( TInt32 ); // iMessageTypeSetting, iMessageTypeLocking
+
+ return size;
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::ExternalizeArrayL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::ExternalizeArrayL(
+ CDesC16Array& anArray,
+ RWriteStream& aStream ) const
+ {
+
+ TInt count=anArray.Count();
+ aStream << TCardinality( count ); // compressed value
+ for ( TInt ii = 0; ii < count; ++ii )
+ {
+ aStream << anArray[ii].Left( Min( anArray[ii].Length(), KMaxHeaderStringLength ) ) ;
+ }
+ }
+
+// ---------------------------------------------------------
+// CUniHeaders::InternalizeArrayL
+//
+// ---------------------------------------------------------
+//
+void CUniHeaders::InternalizeArrayL(
+ CDesC16Array& anArray,
+ RReadStream& aStream )
+ {
+ TCardinality card;
+ aStream >> card;
+ TInt count=card;
+ anArray.Reset();
+ for ( TInt ii = 0; ii < count; ++ii )
+ {
+ HBufC16* buf=HBufC16::NewLC( aStream,KMaxHeaderStringLength );
+ anArray.CArrayFixBase::InsertL( ii,&buf );
+ CleanupStack::Pop( buf );
+ }
+ }
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+
+// End of File
+