messagingappbase/sendui/mmsindirectupload/src/CMmsIndirectUpload.cpp
changeset 0 72b543305e3a
child 24 e00582ce7ecd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/sendui/mmsindirectupload/src/CMmsIndirectUpload.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,407 @@
+/*
+* Copyright (c) 2002-2004 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 MMS indirect upload service.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+
+#include    <CSendingServiceInfo.h>
+#include    <SendUiConsts.h>
+#include    <CMessageData.h>
+#include    <senduisingleton.h>
+#include    <MmsConst.h>
+#include    <bautils.h>                     // BaflUtils
+#include    <barsc.h>                       // RResourceFile
+#include    <f32file.h>                     // TParse
+#include    <TSendingCapabilities.h>
+#include    <SenduiMtmUids.h>
+
+#include    "CMmsIndirectUpload.h"
+#include    "SendUiOperationWait.h"
+#include    "SendUiFileRightsEngine.h"
+#include    "CSendUiAttachment.h"
+
+#include    <data_caging_path_literals.hrh>
+
+// CONSTANTS
+const TInt KMaxMmsUploadServiceCount    = 4;
+const TInt KMmsIndirectUploadService    = 2;
+const TInt KMaxServiceAddressLength     = 512;
+const TInt KMaxServiceNameLength        = 128;
+const TInt KMaxServiceMenuNameLength    = 128;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::CMmsIndirectUpload
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMmsIndirectUpload::CMmsIndirectUpload( CCoeEnv& aCoeEnv, CSendUiSingleton& aSingleton )
+    : CSendingService( aCoeEnv, aSingleton )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMmsIndirectUpload::ConstructL()
+    {
+    ReadServiceDataL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMmsIndirectUpload* CMmsIndirectUpload::NewL( TSendingServiceParams* aParams )
+    {
+    CMmsIndirectUpload* self = new(ELeave) CMmsIndirectUpload( aParams->iCoeEnv, aParams->iSingleton ); 
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// Destructor
+CMmsIndirectUpload::~CMmsIndirectUpload()
+    {
+    iServiceArray.ResetAndDestroy();
+    iServiceArray.Close();
+    }
+
+
+// ---------------------------------------------------------
+// CMmsIndirectUpload::ServiceProviderId
+// Returns the id of the service provider.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TUid CMmsIndirectUpload::ServiceProviderId() const
+    {
+    return KMmsIndirectUpload;
+    }
+
+TUid CMmsIndirectUpload::TechnologyTypeId( ) const
+{
+    return TUid::Uid( KSenduiTechnologyMmsUidValue );
+}
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::CreateAndSendMessageL
+// Creates message to be sent and opens MMS editor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmsIndirectUpload::CreateAndSendMessageL(
+    TUid                    aServiceUid,
+    const CMessageData*     aMessageData,
+    TBool /*aLaunchEditorEmbedded */)
+    {
+    TInt i = 0;
+
+    RSendAs sendAsSession;
+    User::LeaveIfError( sendAsSession.Connect() );
+    TInt cleanupItems(0);
+    CleanupClosePushL( sendAsSession );
+    cleanupItems++;
+    if ( !CheckMmsServiceAvailabilityL( sendAsSession ) )
+        {
+        CleanupStack::PopAndDestroy( &sendAsSession ); // sendAsSession
+        return;
+        }
+
+    RSendAsMessage sendAsMessage;
+    CleanupClosePushL( sendAsMessage );
+    cleanupItems++;
+    sendAsMessage.CreateL( sendAsSession, KSenduiMtmUniMessageUid );
+    // BIO type identifies MMS message as upload message.
+    sendAsMessage.SetBioTypeL( KUidMsgSubTypeMmsUpload );
+
+    // Set service address
+    for ( i=0; i < iServiceArray.Count(); i++)
+        {
+        if ( (*iServiceArray[i]).ServiceId() == aServiceUid)
+            {
+            TPtrC address = (*iServiceArray[i]).ServiceAddress();
+
+            if ( address != KNullDesC )
+                {
+                sendAsMessage.AddRecipientL(
+                    address,
+                    (*iServiceArray[i]).ServiceName(),
+                    RSendAsMessage::ESendAsRecipientTo );
+                }
+            else
+                {
+                User::Leave( KErrNotFound );
+                }
+            break;
+            }
+        }
+
+    CArrayPtrFlat<CSendUiAttachment>* attachments(NULL);
+
+    // Get attachments
+    if ( aMessageData )
+        {
+        attachments = CSendUiAttachment::InitAttachmentArrayLCC( 
+            aMessageData->AttachmentArray(), 
+            aMessageData->AttachmentHandleArray(),
+            iCoeEnv.FsSession() );
+        cleanupItems += 2;
+        }
+    if ( aMessageData )
+        {
+        if ( !ValidateAttachmentsL( attachments ) )
+            {
+            // attachments, sendAsMessage, sendAsSession
+            CleanupStack::PopAndDestroy( cleanupItems, &sendAsSession ); 
+            return;
+            }
+
+        const CRichText* bodyText = aMessageData->BodyText();
+        if ( bodyText->DocumentLength() > 0 )
+            {
+            CSendUiAttachment* atta = CSendUiAttachment::NewLC( *bodyText, iCoeEnv.FsSession() );
+            attachments->AppendL( atta );
+            CleanupStack::Pop( atta );
+            }
+        
+        for ( i = 0; i < attachments->Count(); i++ )
+            {
+            CSendUiOperationWait* waiter = CSendUiOperationWait::NewLC();
+            CSendUiAttachment& attachmentPacket = *(attachments->At(i));
+
+            if ( attachmentPacket.Type() == CSendUiAttachment::EAttachmentPath )
+            	{
+                sendAsMessage.AddAttachment(
+                    *(attachmentPacket.Path()), 
+                    attachmentPacket.MimeType(),
+                    waiter->iStatus );
+				}
+			else
+				{
+				RFile attachment;
+	            attachment.Duplicate( *(attachmentPacket.Handle()) );
+	            sendAsMessage.AddAttachment( 
+	                attachment, 
+	                attachmentPacket.MimeType(),
+	                waiter->iStatus );
+				}	
+            
+            waiter->Start( (CActive*)NULL );
+            CleanupStack::PopAndDestroy( waiter );
+            }
+
+        }
+    TInt attachmentCount( 0 );
+    if ( attachments )
+        {
+        attachmentCount = attachments->Count();    
+        CleanupStack::PopAndDestroy( 2, attachments );
+        cleanupItems -= 2;
+        }
+        
+    if (  attachmentCount > 0 )
+        {
+        sendAsMessage.LaunchEditorAndCloseL(); // sendAsMessage is closed
+        CleanupStack::Pop( &sendAsMessage );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( &sendAsMessage); // sendAsMessage
+        }
+    cleanupItems--;
+    CleanupStack::PopAndDestroy( cleanupItems, &sendAsSession );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::ValidateAttachmentsL
+// Validates attachments for sending. DRM protection and MMS validity are
+// checked. DRM query and error note is shown if needed. Return value of
+// attachment arrays contains valid attachments.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CMmsIndirectUpload::ValidateAttachmentsL( CArrayPtrFlat<CSendUiAttachment>* aAttachments )
+    {
+    TBool continueSending( ETrue );
+  
+  
+    // Validate attachments and show query and error note if needed.
+    if ( aAttachments->Count() > 0 )
+        {
+        CSendUiFileRightsEngine* fileRightsEngine =
+            CSendUiFileRightsEngine::NewLC( iCoeEnv.FsSession() );
+
+        fileRightsEngine->ConfirmDrmFileRightsL( aAttachments );
+        fileRightsEngine->ConfirmMmsValidityL( aAttachments );
+        
+        continueSending = fileRightsEngine->ShowDrmAndMmsInfoL( KMmsIndirectUpload );
+
+        CleanupStack::PopAndDestroy( fileRightsEngine );
+        }
+    return continueSending;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::PopulateServicesListL
+// Populates given list with the services provided by this plugin.
+// The ownership of the pointed objects remains.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmsIndirectUpload::PopulateServicesListL(
+    RPointerArray<CSendingServiceInfo>& aList )
+    {
+    for ( TInt cc = 0; cc < iServiceArray.Count(); cc++ )
+        {
+        User::LeaveIfError( aList.Append( iServiceArray[cc] ) );         
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::ReadServiceDataL
+// Reads service names from resource file and addresses from shared data or
+// central repository.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmsIndirectUpload::ReadServiceDataL()
+    {
+    // Read the maximum MMS message size (bytes).
+    TInt maxMsgSize = 0;
+    CRepository* mmsRepository = CRepository::NewL( KCRUidMmsEngine );
+    mmsRepository->Get( KMmsEngineMaximumSendSize, maxMsgSize );
+    delete mmsRepository;
+
+    CRepository* senduiRepository = CRepository::NewLC( KCRUidSendUi );
+    TInt i = 0;
+    // Go through services and get settings for indirect upload services.
+    // There can be 0-4 indirect upload services configured.
+    for ( i = 0; i < KMaxMmsUploadServiceCount; i++)
+        {
+        TInt serviceType = 0;
+        TInt err = senduiRepository->Get( KSUMmsUploadType1 + i , serviceType );
+        
+        // Get settings and store those to service array.
+        if ( !err && serviceType == KMmsIndirectUploadService )
+            {
+            CSendingServiceInfo* serviceInfo = CSendingServiceInfo::NewL();
+            CleanupStack::PushL( serviceInfo );
+
+            HBufC* serviceAddress = HBufC::NewLC( KMaxServiceAddressLength );
+            TPtr serviceAddressPtr = serviceAddress->Des();
+            User::LeaveIfError( senduiRepository->Get( KSUMmsUploadAddress1 + i , serviceAddressPtr ) );
+            serviceInfo->SetServiceAddressL( serviceAddressPtr );
+            CleanupStack::PopAndDestroy( serviceAddress );
+
+            HBufC* serviceName = HBufC::NewLC( KMaxServiceNameLength );
+            TPtr serviceNamePtr = serviceName->Des();
+            User::LeaveIfError( senduiRepository->Get( KSUMmsUploadServiceName1 + i , serviceNamePtr ) );
+            serviceInfo->SetServiceNameL( serviceNamePtr );
+            CleanupStack::PopAndDestroy( serviceName );
+            
+            HBufC* serviceMenuName = HBufC::NewLC( KMaxServiceMenuNameLength );
+            TPtr serviceMenuNamePtr = serviceMenuName->Des();
+            User::LeaveIfError( senduiRepository->Get( KSUMmsUploadServiceMenuName1 + i , serviceMenuNamePtr ) );
+            serviceInfo->SetServiceMenuNameL( serviceMenuNamePtr );
+            CleanupStack::PopAndDestroy( serviceMenuName );
+
+            // Set service type.
+            serviceInfo->SetServiceProviderId( KMmsIndirectUpload );
+
+            // Set sending capabilities.
+            TSendingCapabilities capabilities = 
+                TSendingCapabilities( 0, KMaxTInt,
+                    TSendingCapabilities::ESupportsAttachments );
+
+            serviceInfo->SetServiceCapabilities( capabilities );
+
+            TUid serviceId = KNullUid;
+            switch ( i )
+                {
+                case 0:
+                    {
+                    serviceId = KMmsUploadService1Id;
+                    break;
+                    }
+                case 1:
+                    {
+                    serviceId = KMmsUploadService2Id;
+                    break;
+                    }
+                case 2:
+                    {
+                    serviceId = KMmsUploadService3Id;
+                    break;
+                    }
+                case 3:
+                    {
+                    serviceId = KMmsUploadService4Id;
+                    break;
+                    }
+                default:
+                    break;
+                }
+            serviceInfo->SetServiceId( serviceId );
+
+            iServiceArray.Append( serviceInfo );
+            CleanupStack::Pop( serviceInfo );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( senduiRepository );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmsIndirectUpload::CheckMmsServiceAvailabilityL
+// Checks MMS service availability.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CMmsIndirectUpload::CheckMmsServiceAvailabilityL(
+    RSendAs& aSendAsSession )
+    {
+    TInt i = 0;
+    
+    CSendAsMessageTypes* msgTypes = CSendAsMessageTypes::NewL();
+    CleanupStack::PushL( msgTypes );
+
+    aSendAsSession.FilteredMessageTypesL( *msgTypes );
+
+    for ( i = 0; i < msgTypes->Count(); i++ )
+        {
+        if (  msgTypes->MessageTypeUid( i ) == KSenduiMtmMmsUid )
+            {
+            CleanupStack::PopAndDestroy( msgTypes );
+            return ETrue;
+            }
+        }
+
+    return EFalse;
+    }
+
+//  End of File