phonebookui/Phonebook/App/src/CPbkSendMultipleMessageCmd.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkSendMultipleMessageCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 2002 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: 
+*           Provides phonebook send message command object methods.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkSendMultipleMessageCmd.h"
+
+#include <CPbkContactEngine.h>
+#include <MPbkContactNameFormat.h>
+#include <MPbkCommandObserver.h>
+#include <CPbkContactItem.h>
+#include <CPbkSmsAddressSelect.h>
+#include <CPbkEmailOverSmsAddressSelect.h>
+#include <CPbkMmsAddressSelect.h>
+#include <CPbkEmailAddressSelect.h>
+#include "TSingleDesCArray.h"
+#include "CPbkAppGlobals.h"
+#include <Phonebook.hrh>
+#include <Phonebook.rsg>
+#include <FeatMgr.h>
+#include <CPbkAttachmentFile.h>
+
+#include <sendui.h>             // Send UI API
+#include <SendUiConsts.h>       // Send UI MTM uid's
+#include <CMessageData.h>
+#include <StringLoader.h>
+#include <aknenv.h>
+
+#include <pbkdebug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KMaxContactIdStringLength = 10;
+
+void WritePostcardAttachmentContentL(
+    const CPbkContactItem& aContact,
+    CPbkAttachmentFile& aAttachmentFile )
+    {
+    HBufC* contactId = HBufC::NewLC( KMaxContactIdStringLength );
+    contactId->Des().Num( aContact.Id() );
+    HBufC8* string8 = HBufC8::NewLC( KMaxContactIdStringLength );
+    string8->Des().Append( *contactId );
+    aAttachmentFile.File().Write( *string8 );
+    CleanupStack::PopAndDestroy( 2, contactId );
+    }
+
+
+// LOCAL DEBUG CODE
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EPanicUnknownMedia = 1,
+    };
+
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkSendMultipleMessageCmd");
+    User::Panic(KPanicText,aReason);
+    }
+#endif
+
+
+}  // namespace
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Default constructor
+CPbkSendMultipleMessageCmd::CPbkSendMultipleMessageCmd
+        (
+        CPbkContactEngine& aEngine,
+        TPbkSendingParams aParams,
+        const CContactIdArray& aContacts,
+        const TPbkContactItemField* aFocusedField,
+        TBool aUseDefaultDirectly) :
+        iEngine(aEngine),
+        iParams(aParams),
+        iContacts(aContacts),
+        iFocusedField(aFocusedField),
+        iUseDefaultDirectly(aUseDefaultDirectly)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkSendMultipleMessageCmd::CPbkSendMultipleMessageCmd(0x%x)"), this);
+    }
+
+// Second phase constructor
+void CPbkSendMultipleMessageCmd::ConstructL()
+    {
+    }
+
+// Static constructor
+CPbkSendMultipleMessageCmd* CPbkSendMultipleMessageCmd::NewL
+        (
+        CPbkContactEngine& aEngine,
+        TPbkSendingParams aParams,
+        const CContactIdArray& aContacts,
+        const TPbkContactItemField* aFocusedField,
+        TBool aUseDefaultDirectly)
+    {
+    CPbkSendMultipleMessageCmd* self = new(ELeave)
+        CPbkSendMultipleMessageCmd( aEngine, aParams, aContacts, aFocusedField,
+        aUseDefaultDirectly);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+// Destructor
+CPbkSendMultipleMessageCmd::~CPbkSendMultipleMessageCmd()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkSendMultipleMessageCmd::~CPbkSendMultipleMessageCmd(0x%x)"), this);
+   delete iAttachmentFile;
+   }
+
+void CPbkSendMultipleMessageCmd::ExecuteLD()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkSendMultipleMessageCmd::ExecuteLD(0x%x)"), this);
+
+    CleanupStack::PushL(this);
+
+    iMtmUid = ShowWriteQueryL();
+    if ( iMtmUid == KNullUid )
+        {
+        // User pressed cancel
+        CleanupStack::PopAndDestroy( this ); // this
+        return;
+        }
+    TUid techTypeUid =
+        CPbkAppGlobals::InstanceL()->SendUiL()->TechnologyType( iMtmUid );
+
+    const TInt contactCount( iContacts.Count() );
+    CMessageData* messageData = CMessageData::NewL();
+    CleanupStack::PushL( messageData );
+    TBool dismissed( EFalse );
+
+    for ( TInt i( 0 ); i < contactCount && !dismissed; ++i )
+        {
+        TPtrC address( KNullDesC );
+        CPbkContactItem* contact = iEngine.ReadContactLC( iContacts[i] );
+
+        // Check specific MTMs first
+        if ( iMtmUid ==  KSenduiMtmPostcardUid )
+            {
+            // Create attachment file object
+            delete iAttachmentFile;
+            iAttachmentFile = NULL;
+            HBufC* attFileName = StringLoader::LoadLC( R_PBK_POSTCARD_WRITE_ATTACHMENT_TAG );
+            iAttachmentFile = CPbkAttachmentFile::NewL
+                (*attFileName, iEngine.FsSession(), EFileWrite|EFileShareAny);
+            CleanupStack::PopAndDestroy( attFileName );
+            WritePostcardAttachmentContentL( *contact, *iAttachmentFile );
+            messageData->AppendAttachmentL( iAttachmentFile->FileName() );
+            iAttachmentFile->Release();
+            }
+        // Otherwise check by technology type to support 3rd party MTMs
+        else if ( iMtmUid == KSenduiMtmSmsUid ||
+                  techTypeUid == KSenduiTechnologySmsUid )
+            {
+            if (FeatureManager::FeatureSupported(KFeatureIdEmailOverSms))
+                {
+                CPbkEmailOverSmsAddressSelect::TParams params( *contact );
+                params.SetFocusedField(iFocusedField);
+                params.SetUseDefaultDirectly(iUseDefaultDirectly);
+                CPbkEmailOverSmsAddressSelect* selectDlg = new(ELeave) CPbkEmailOverSmsAddressSelect;
+                if (selectDlg->ExecuteLD(params))
+                    {
+                    address.Set(params.SelectedField()->Text());
+                    }
+                }
+            else
+                {
+                CPbkSmsAddressSelect::TParams params( *contact );
+                params.SetFocusedField(iFocusedField);
+                params.SetUseDefaultDirectly(iUseDefaultDirectly);
+                CPbkSmsAddressSelect* selectDlg = new(ELeave) CPbkSmsAddressSelect;
+                if (selectDlg->ExecuteLD(params))
+                    {
+                    address.Set(params.SelectedField()->Text());
+                    }
+                }
+            }
+        else if ( iMtmUid == KSenduiMtmMmsUid ||
+                  techTypeUid == KSenduiTechnologyMmsUid ||
+                  iMtmUid == KSenduiMtmAudioMessageUid )
+            {
+            CPbkMmsAddressSelect::TParams params( *contact );
+            params.SetFocusedField(iFocusedField);
+            params.SetUseDefaultDirectly(iUseDefaultDirectly);
+            CPbkMmsAddressSelect* selectDlg = new(ELeave) CPbkMmsAddressSelect;
+            if (selectDlg->ExecuteLD(params))
+                {
+                address.Set(params.SelectedField()->Text());
+                }
+            }
+        else if ( iMtmUid == KSenduiMtmSmtpUid ||
+                  techTypeUid == KSenduiTechnologyMailUid )
+            {
+            CPbkEmailAddressSelect::TParams params( *contact );
+            params.SetFocusedField(iFocusedField);
+            params.SetUseDefaultDirectly(iUseDefaultDirectly);
+            CPbkEmailAddressSelect* selectDlg = new(ELeave) CPbkEmailAddressSelect;
+            if (selectDlg->ExecuteLD(params))
+                {
+                address.Set(params.SelectedField()->Text());
+                }
+            }
+        else
+            {
+            if ( iMtmUid != KNullUid )
+                {
+                __ASSERT_DEBUG(EFalse, Panic(EPanicUnknownMedia));
+                }
+            }
+
+        if (address.Length() > 0)
+            {
+            MPbkContactNameFormat& nameFormatter = iEngine.ContactNameFormat();
+            HBufC* nameBuffer = nameFormatter.GetContactTitleOrNullL( *contact );
+            if ( nameBuffer )
+                {
+                CleanupStack::PushL(nameBuffer);
+                messageData->AppendToAddressL( address, *nameBuffer );
+                CleanupStack::PopAndDestroy( nameBuffer );
+                }
+            else
+                {
+                messageData->AppendToAddressL( address );
+                }
+            }
+
+        if (!dismissed)
+            {
+            // Abort the whole process if end key was pressed during address
+            // selection dialog and Phonebook application was terminated.
+            dismissed = (NULL != CAknEnv::AppWithShutterRunning());
+            }
+
+        CleanupStack::PopAndDestroy( contact );
+        }
+    if ( !dismissed )
+        {
+        // Empty message editor is not displayed if none of selected contacts
+        // has a valid address information
+        CPbkAppGlobals::InstanceL()->SendUiL()->CreateAndSendMessageL(
+            iMtmUid, messageData );
+        }
+
+    CleanupStack::PopAndDestroy( messageData );
+
+    if ( iAttachmentFile )
+        {
+        // no error checking, exiting phonebook would too much for this error
+        iEngine.FsSession().Delete( iAttachmentFile->FileName() );
+        }
+
+    if ( iObserver )
+        {
+        iObserver->CommandFinished( *this );
+        }
+    // Destroy itself as promised
+    CleanupStack::PopAndDestroy( this ); // this
+    }
+
+void CPbkSendMultipleMessageCmd::ProcessFinished(MPbkBackgroundProcess& /*aProcess*/)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkSendMultipleMessageCmd::ProcessFinished(0x%x)"), this);
+    }
+
+TUid CPbkSendMultipleMessageCmd::ShowWriteQueryL()
+    {
+    TUid uid = CPbkAppGlobals::InstanceL()->SendUiL()
+        ->ShowTypedQueryL( CSendUi::EWriteMenu, NULL, iParams.iCapabilities, iParams.iMtmFilter );
+    return uid;
+    }
+
+void CPbkSendMultipleMessageCmd::AddObserver( MPbkCommandObserver& aObserver )
+    {
+    iObserver = &aObserver;
+    }
+
+
+//  End of File