--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_messaging/messagingservice/src/messagedetail.cpp Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,220 @@
+/*
+* 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 the License "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: Implementation of class CMessageDetail
+*
+*/
+
+
+
+#include <e32base.h>
+#include <badesca.h>
+#include <msvapi.h>
+
+#include <CMsvAttachment.h>
+#include <MMsvAttachmentManager.h>
+#include <txtrich.h>
+#include <MsvUids.h>
+#include <MTCLREG.H>
+#include <smsclnt.h>
+#include <smuthdr.h>
+#include <senduiconsts.h>
+#include <cmsvrecipientlist.h>
+#include <mmsclient.h>
+
+#include "messageheader.h"
+#include "messagedetail.h"
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMessageDetail* CMessageDetail::NewL( CMsvSession& aServerSession )
+ {
+ CMessageDetail* self = new (ELeave) CMessageDetail( aServerSession );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMessageDetail::~CMessageDetail()
+ {
+ delete iMessageDetail;
+ }
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CMessageDetail::CMessageDetail( CMsvSession& aServerSession ):
+ iServerSession( aServerSession )
+
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Gets the message details
+// ---------------------------------------------------------------------------
+//
+void CMessageDetail::GetMessageDetailL( TMsvId aMessageId,
+ CMessageDetailInfo*& aMessageDetail )
+ {
+ iMessageId = aMessageId;
+
+ ProcessRequestL(); // Client can get the results by calling the functions
+ aMessageDetail = iMessageDetail;
+ iMessageDetail = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// Extracts the message body and attachment information, if any.
+// ---------------------------------------------------------------------------
+//
+void CMessageDetail::ProcessRequestL()
+ {
+ CMsvEntry * messageEntry = iServerSession.GetEntryL( iMessageId );
+ CleanupStack::PushL(messageEntry);
+
+ if ( messageEntry->Entry().iMtm != KSenduiMtmSmsUid &&
+ messageEntry->Entry().iMtm != KSenduiMtmMmsUid )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ iMessageDetail = CMessageDetailInfo::NewL();
+ iMessageDetail->SetMessageId( iMessageId );
+
+ CMsvStore * messageStore = messageEntry->ReadStoreL();
+ CleanupStack::PushL( messageStore );
+
+
+ // Attachment ......
+ MMsvAttachmentManager& attachMgr = messageStore->AttachmentManagerL();
+
+ TInt count = attachMgr.AttachmentCount();
+
+ for ( TInt i=0;i<count;i++)
+ {
+ CMsvAttachment * attachment = attachMgr.GetAttachmentInfoL( i );
+ CleanupStack::PushL( attachment );
+
+ CMessageAttachInfo* element = CMessageAttachInfo::NewL();
+ CleanupStack::PushL( element );
+
+ element->SetFileHandle( attachMgr.GetAttachmentFileL( i ) );
+ element->SetNameL( attachment->AttachmentName() );
+ element->SetSize( attachment->Size() );
+
+ HBufC* tempMime = HBufC::NewLC( attachment->MimeType().Length() );
+ tempMime->Des().Copy( attachment->MimeType() );
+ element->SetMimeTypeL( *tempMime );
+ CleanupStack::PopAndDestroy( tempMime );
+
+ iMessageDetail->AddAttachmentInfoL( element );
+ CleanupStack::Pop( element );
+ CleanupStack::PopAndDestroy( attachment );
+ }
+
+ // Bodytext
+ if ( messageStore->HasBodyTextL() )
+ {
+ // build a CRichText object to read in message body
+ CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL();
+ CleanupStack::PushL( paraFormatLayer );
+ CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL();
+ CleanupStack::PushL( charFormatLayer );
+ CRichText* richText = CRichText::NewL( paraFormatLayer, charFormatLayer );
+ CleanupStack::PushL(richText);
+
+ // Get the body text.
+ messageStore->RestoreBodyTextL( *richText );
+ const TInt length = richText->DocumentLength();
+ iMessageDetail->SetBodyTextL( richText->Read( 0, length ) );
+
+ CleanupStack::PopAndDestroy( 3, paraFormatLayer );
+ }
+
+ // Sender / Reciever info
+ if ( messageEntry->Entry().iMtm == KSenduiMtmSmsUid )
+ {
+ GetSmsSenderRecipientL();
+ }
+ else if ( messageEntry->Entry().iMtm == KSenduiMtmMmsUid )
+ {
+ GetMmsSenderRecipientL();
+ }
+
+ CleanupStack::PopAndDestroy( 2, messageEntry );
+ }
+
+// ---------------------------------------------------------------------------
+// Gets the Sender Recipient info for SMS
+// ---------------------------------------------------------------------------
+//
+void CMessageDetail::GetSmsSenderRecipientL()
+ {
+ CClientMtmRegistry* clientMtmReg = NULL;
+ clientMtmReg = CClientMtmRegistry::NewL( iServerSession );
+ CleanupStack::PushL( clientMtmReg );
+
+ CSmsClientMtm* smsMtm = NULL;
+ smsMtm = static_cast<CSmsClientMtm*>( clientMtmReg->NewMtmL( KSenduiMtmSmsUid ) );
+ CleanupStack::PushL( smsMtm );
+ smsMtm->SwitchCurrentEntryL( iMessageId );
+ smsMtm->LoadMessageL();
+ const CMsvRecipientList &recipientList = smsMtm->AddresseeList();
+
+ TInt count = recipientList.Count();
+ for ( int pos = 0; pos < count; pos++ )
+ {
+ iMessageDetail->AddRecipientL( recipientList[pos], recipientList.Type(pos) );
+ }
+
+ const CSmsHeader& smsHeader = smsMtm->SmsHeader();
+ iMessageDetail->SetFromL( smsMtm->Entry().Entry().iDetails );
+
+ CleanupStack::PopAndDestroy( smsMtm );
+ CleanupStack::PopAndDestroy( clientMtmReg );
+ }
+
+// ---------------------------------------------------------------------------
+// Gets the Sender Recipient info for MMS
+// ---------------------------------------------------------------------------
+//
+void CMessageDetail::GetMmsSenderRecipientL()
+ {
+ CClientMtmRegistry* clientMtmReg = NULL;
+ clientMtmReg = CClientMtmRegistry::NewL( iServerSession );
+ CleanupStack::PushL( clientMtmReg );
+
+ CMmsClientMtm* mmsMtm = NULL;
+ mmsMtm = static_cast<CMmsClientMtm*>( clientMtmReg->NewMtmL( KUidMsgTypeMultimedia ) );
+ CleanupStack::PushL( mmsMtm );
+ mmsMtm->SwitchCurrentEntryL( iMessageId );
+ mmsMtm->LoadMessageL();
+ const CMsvRecipientList &recipientList = mmsMtm->AddresseeList();
+
+ TInt count = recipientList.Count();
+ for ( int pos = 0; pos < count; pos++ )
+ {
+ iMessageDetail->AddRecipientL( recipientList[pos], recipientList.Type(pos) );
+ }
+
+ iMessageDetail->SetFromL( mmsMtm->Sender() );
+
+ CleanupStack::PopAndDestroy( mmsMtm );
+ CleanupStack::PopAndDestroy( clientMtmReg );
+ }
+