diff -r 000000000000 -r 72b543305e3a messagingappbase/sendui/mmsindirectupload/src/CMmsIndirectUpload.cpp --- /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 +#include +#include +#include +#include +#include // BaflUtils +#include // RResourceFile +#include // TParse +#include +#include + +#include "CMmsIndirectUpload.h" +#include "SendUiOperationWait.h" +#include "SendUiFileRightsEngine.h" +#include "CSendUiAttachment.h" + +#include + +// 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* 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* 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& 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