--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgappfw/plugins/msgplugin/src/ccsmsgpluginutility.cpp Fri Jun 25 15:47:40 2010 +0530
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 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: CS Msg Plugin Utility class
+ *
+*/
+
+
+// USER INCLUDES
+#include "ccsmsgpluginutility.h"
+#include "ccsdebug.h"
+
+//SYSTEM INCLUDES
+#include <csmsemailfields.h>
+#include <e32cmn.h>
+#include <SendUiConsts.h>
+#include <pushentry.h>
+#include <msvids.h>
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::NewL
+// Two Phase Construction
+// ----------------------------------------------------------------------------
+CCsMsgPluginUtility* CCsMsgPluginUtility::NewL( )
+ {
+ CCsMsgPluginUtility* self = new ( ELeave ) CCsMsgPluginUtility();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::~CCsMsgPluginUtility
+// Destructor
+// ----------------------------------------------------------------------------
+CCsMsgPluginUtility::~CCsMsgPluginUtility()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+CCsMsgPluginUtility::CCsMsgPluginUtility()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::CreateConversationEntryL
+// Creates CCsConversationEntry
+// ----------------------------------------------------------------------------
+//
+CCsConversationEntry* CCsMsgPluginUtility::CreateConversationEntryL(
+ const HBufC* aContact,
+ TMsvId aEnryId,
+ TInt64 aTimeStamp,
+ TMsvId aDir,
+ const HBufC* aDescription,
+ TCsSendState aSendState,
+ TCsAttribute aMsgAttribs,
+ TCsType aCsType) const
+ {
+ // create CCsConversationEntry
+ CCsConversationEntry *conversationEntry = CCsConversationEntry::NewL();
+ CleanupStack::PushL(conversationEntry);
+
+ //set the values
+ if(aContact)
+ conversationEntry->SetContactL( *aContact );
+ conversationEntry->SetEntryId( aEnryId );
+ conversationEntry->SetTimeStampL( aTimeStamp );
+ if (aDescription) {
+ conversationEntry->SetDescriptionL( *aDescription );
+ }
+ conversationEntry->SetConversationDir( MapDirection( aDir ) );
+ conversationEntry->SetSendState( aSendState );
+ conversationEntry->ChangeAttributes( aMsgAttribs, ECsAttributeNone );
+ conversationEntry->SetType(aCsType);
+
+ //pop and return
+ CleanupStack::Pop(conversationEntry);
+ return conversationEntry;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::MapDirection
+// Map the msg direction to TCsDirection
+// ----------------------------------------------------------------------------
+//
+TCsDirection CCsMsgPluginUtility::MapDirection( TMsvId aDir ) const
+ {
+ TCsDirection direction = ECsDirectionUnknown;
+ switch(aDir)
+ {
+ case KMsvSentEntryIdValue:
+ case KMsvGlobalOutBoxIndexEntryIdValue: // Fall-through
+ case KMsvDraftEntryIdValue:
+ {
+ direction = ECsDirectionOutgoing;
+ break;
+ }
+ case KMsvGlobalInBoxIndexEntryIdValue:
+ {
+ direction = ECsDirectionIncoming;
+ break;
+ }
+ }
+ return direction;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::GetMsgAttributes
+// Returns the message attributes as a bitmask of TCsAttribute values.
+// ----------------------------------------------------------------------------
+//
+TUint16 CCsMsgPluginUtility::GetMsgAttributes( const TMsvEntry& aEntry )
+ {
+ TUint16 msgAttributes = ECsAttributeNone;
+ TMsvId parent = aEntry.Parent();
+
+ // New
+ if( aEntry.New() )
+ {
+ msgAttributes |= ECsAttributeNew;
+ }
+
+ // Drafts
+ if( KMsvDraftEntryIdValue == parent )
+ {
+ msgAttributes |= ECsAttributeDraft;
+ }
+
+ // Attachments
+ if( aEntry.Attachment() )
+ {
+ msgAttributes |= ECsAttributeAttachment;
+ }
+
+ // Priority
+ TMsvPriority priority = aEntry.Priority();
+ if( EMsvHighPriority == priority )
+ {
+ msgAttributes |= ECsAttributeHighPriority;
+ }
+ else if( EMsvLowPriority == priority )
+ {
+ msgAttributes |= ECsAttributeLowPriority;
+ }
+
+ // Read/Unread
+ if( KMsvGlobalInBoxIndexEntryIdValue == parent )
+ {
+ if( EFalse == aEntry.Unread() )
+ {
+ // Read
+ msgAttributes &= ~ECsAttributeUnread;
+ }
+ else
+ {
+ // Unread
+ msgAttributes |= ECsAttributeUnread;
+ }
+ }
+
+ // Sent
+ if( KMsvSentEntryIdValue == parent )
+ {
+ msgAttributes |= ECsAttributeSent;
+ }
+
+ return msgAttributes;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::GetSendState
+// Returns the send status.
+// ----------------------------------------------------------------------------
+//
+TCsSendState CCsMsgPluginUtility::GetSendState( const TMsvEntry& aContext )
+ {
+ TUint sendingState = aContext.SendingState();
+ TCsSendState convSendState = ECsSendStateUnknown;
+
+ switch( sendingState )
+ {
+ case KMsvSendStateUponRequest:
+ {
+ convSendState = ECsSendStateUponRequest;
+ break;
+ }
+ case KMsvSendStateWaiting:
+ {
+ convSendState = ECsSendStateWaiting;
+ break;
+ }
+ case KMsvSendStateSending:
+ {
+ convSendState = ECsSendStateSending;
+ break;
+ }
+ case KMsvSendStateScheduled:
+ {
+ convSendState = ECsSendStateScheduled;
+ break;
+ }
+ case KMsvSendStateResend:
+ {
+ convSendState = ECsSendStateResend;
+ break;
+ }
+ case KMsvSendStateSuspended:
+ {
+ convSendState = ECsSendStateSuspended;
+ break;
+ }
+ case KMsvSendStateFailed:
+ {
+ convSendState = ECsSendStateFailed;
+ break;
+ }
+ case KMsvSendStateSent:
+ {
+ convSendState = ECsSendStateSent;
+ break;
+ }
+ case KMsvSendStateNotApplicable:
+ {
+ convSendState = ECsSendStateNotApplicable;
+ break;
+ }
+ }
+ return convSendState;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::GetContact
+// Get the Contact (From/To) of the message
+// ----------------------------------------------------------------------------
+//
+void CCsMsgPluginUtility::CreateContactL(CMsvSession* aSession,
+ const TMsvEntry& aEntry,
+ RPointerArray<HBufC>& addressList)
+ {
+ if ( aEntry.iMtm.iUid == KSenduiMtmSmsUidValue )
+ {
+ CPlainText* nullString = CPlainText::NewL();
+ CleanupStack::PushL( nullString );
+
+ CSmsHeader* smsHeader = NULL;
+ if ( aEntry.Parent() == KMsvGlobalInBoxIndexEntryIdValue )
+ {
+ smsHeader = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, *nullString );
+ }
+ else if ( aEntry.Parent() == KMsvSentEntryIdValue ||
+ aEntry.Parent() == KMsvGlobalOutBoxIndexEntryIdValue )
+ {
+ smsHeader = CSmsHeader::NewL( CSmsPDU::ESmsSubmit, *nullString );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(nullString);
+ return;
+ }
+ CleanupStack::PushL( smsHeader );
+
+ CMsvEntry *cEntry = CMsvEntry::NewL(*aSession,aEntry.Id(),
+ TMsvSelectionOrdering() );
+ CleanupStack::PushL( cEntry );
+
+ CMsvStore* store = cEntry->ReadStoreL();
+ CleanupStack::PushL(store);
+
+ TRAPD(err, smsHeader->RestoreL( *store ));
+ if ( err == KErrNone )
+ {
+ if ( aEntry.Parent() == KMsvGlobalOutBoxIndexEntryIdValue ||
+ aEntry.Parent() == KMsvSentEntryIdValue )
+ {
+ const CArrayPtrFlat<CSmsNumber>& rcpts = smsHeader->Recipients();
+ const CSmsNumber& rcpt = *rcpts.At(0);
+
+ HBufC* fromAddress = (rcpt.Address()).AllocL();
+ addressList.Append(fromAddress);
+ }
+ else
+ {
+ // Check and add if any email addresses
+ const CSmsEmailFields& emailFields = smsHeader->EmailFields();
+ if( emailFields.HasAddress() )
+ {
+ TPtrC name;
+ TPtrC address;
+
+ const MDesCArray& emailRecipients = emailFields.Addresses();
+ for( TInt id = 0; id < emailRecipients.MdcaCount(); id++ )
+ {
+ NameAndAddress( emailRecipients.MdcaPoint( id ), name, address);
+
+ // Add address to list
+ HBufC* addressBuf = HBufC::NewL( address.Length() );
+ TPtr addressPtr( 0, 0 );
+ addressPtr.Set( addressBuf->Des() );
+ addressPtr.Copy( address );
+ addressList.Append(addressBuf);
+ }
+ }
+ else
+ {
+ HBufC* fromAddress = (smsHeader->FromAddress()).AllocL();
+
+ // Try iDetails if empty
+ if ( fromAddress->Length() == 0 )
+ fromAddress = aEntry.iDetails.AllocL();
+
+ addressList.Append(fromAddress);
+ }
+ }
+ }
+
+ // Cleanup
+ CleanupStack::PopAndDestroy(store);
+ CleanupStack::PopAndDestroy(cEntry);
+ CleanupStack::PopAndDestroy(smsHeader);
+ CleanupStack::PopAndDestroy(nullString);
+ }
+ else if ( aEntry.iMtm.iUid == KSenduiMtmBtUidValue ||
+ aEntry.iMtm.iUid == KSenduiMtmBioUidValue ||
+ aEntry.iMtm == KUidMtmWapPush )
+ {
+ HBufC* fromAddress = aEntry.iDetails.AllocL();
+ addressList.Append(fromAddress);
+ }
+ }
+
+// ---------------------------------------------------------
+// CCsMsgPluginUtility::CompareEntry
+//
+// ---------------------------------------------------------
+TBool CCsMsgPluginUtility::CompareEntry( const TMsvEntry& aOldContext,
+ const TMsvEntry& aNewContext, TMsvId aDir ) const
+ {
+ if( (aOldContext.Id() == aNewContext.Id())
+ && (aOldContext.Parent() == aNewContext.Parent())
+ && (0 == aOldContext.iDescription.Compare(aNewContext.iDescription)) )
+ {
+ // incase of outbox, check sending state also
+ if(aDir == KMsvGlobalOutBoxIndexEntryIdValue)
+ {
+ if(aOldContext.SendingState() == aNewContext.SendingState())
+ return ETrue;
+ else
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CCsMsgPluginUtility::NameAndAddress
+// Extracts name and address from the aMsvAddress
+// which is of the form name<address>
+// ----------------------------------------------------------------------------
+void CCsMsgPluginUtility::NameAndAddress( const TPtrC& aMsvAddress,
+ TPtrC& aName,
+ TPtrC& aAddress )
+ {
+ // For address information separation (start)
+ const TUint KMsgSmsAddressStartChar ('<');
+
+ // For address information separation (end)
+ const TUint KMsgSmsAddressEndChar ('>');
+
+ TInt addressStart = aMsvAddress.LocateReverse( KMsgSmsAddressStartChar );
+ TInt addressEnd = aMsvAddress.LocateReverse( KMsgSmsAddressEndChar );
+
+ if ( addressStart != KErrNotFound && addressEnd != KErrNotFound
+ && addressEnd > addressStart )
+ {
+ // verified address, will be used as selected from contacts manager
+ aName.Set( aMsvAddress.Ptr(), addressStart );
+ aAddress.Set(
+ aMsvAddress.Mid( addressStart + 1 ).Ptr(),
+ ( addressEnd - addressStart ) -1 );
+ if ( !aAddress.Length())
+ {
+ aAddress.Set( aName );
+ aName.Set( KNullDesC ); // empty string
+ }
+ }
+ else
+ {
+ // unverified string, will be used as entered in the header field
+ aName.Set( KNullDesC ); // empty string
+ aAddress.Set( aMsvAddress.Ptr(), aMsvAddress.Length() ); // a whole string to address
+ }
+
+ if ( aName.CompareF( aAddress ) == 0 )
+ {
+ aName.Set( KNullDesC ); // empty string
+ }
+ }
+
+// ---------------------------------------------------------
+// CCsMsgPluginUtility::PureAddress
+// Extract the phone number for MMS
+// ---------------------------------------------------------
+//
+TPtrC CCsMsgPluginUtility::PureAddress( const TDesC& aAddress )
+ {
+ _LIT( KOpen, "<" );
+ _LIT( KClose, ">" );
+
+ // syntax is :
+ // <alias><separator1><pure_address><separator2> |
+ // <pure_address>
+ TInt firstPos = 0;
+ TInt lastPos = 0;
+ TInt length = aAddress.Length();
+ TInt sepaLen1 = KOpen().Length();
+ TInt sepaLen2 = KClose().Length();
+ TInt firstSeparatorPosition = 0;
+
+ while( firstSeparatorPosition >= 0 )
+ {
+ firstSeparatorPosition = aAddress.Mid( firstPos ).Find( KOpen );
+ if ( firstSeparatorPosition >= 0 )
+ {
+ firstPos += firstSeparatorPosition + sepaLen1;
+ }
+ }
+ if ( firstPos <= 0 )
+ {
+ // No alias
+ return aAddress;
+ }
+
+ // Check if the second separator ends the address
+ TPtrC last = aAddress.Right( sepaLen2 );
+ lastPos = length - sepaLen2;
+
+ if ( !last.Compare( KClose ) )
+ {
+ // Alias part found
+ if ( lastPos > firstPos )
+ {
+ return aAddress.Mid( firstPos, lastPos - firstPos );
+ }
+ }
+ // No alias defined - return the original string as pure address
+ // If syntax is weird, namely
+ // alias <>
+ // with nothing between the separators, we return the original string as is
+ return aAddress;
+ }
+
+//End of File