--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/sendui/drmlinksender/Src/DrmLinkSender.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,424 @@
+/*
+* Copyright (c) 2002-2006 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 DRM link sender service.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <eikenv.h>
+#include <CSendingServiceInfo.h>
+#include <SendUiConsts.h>
+#include <CMessageData.h>
+#include <senduisingleton.h>
+#include <smsclnt.h>
+#include <mtclreg.h> // CClientMtmRegistry
+#include <msvids.h>
+#include <StringLoader.h>
+#include <coemain.h>
+#include <mtmuidef.hrh>
+#include <mtuireg.h> // MTM UI registery
+#include <DrmLinkSenderUi.rsg>
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <s32mem.h>
+#include <f32file.h>
+#include <data_caging_path_literals.hrh>
+#include <caf/caf.h>
+#include <unieditorconsts.h>
+#include <unimsventry.h>
+
+#include "DrmLinkSender.h"
+#include <TSendingCapabilities.h>
+#include "SendUiOperationWait.h"
+
+// CONSTANTS
+_LIT( KDrmLinkSenderUiResource, "DrmLinkSenderUi.rsc");
+//const TInt KDLSRichTextStoreGranularity = 512; // Removal of Warning: #177-D
+// The string is defined in another .cpp too -> should be moved to a .h file
+const TInt KSendUiProgressStringSize = 256;
+const TInt KSenduiUrlMaxLen = 1024;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::CDrmLinkSender
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+
+CDrmLinkSender::CDrmLinkSender( CCoeEnv& aCoeEnv, CSendUiSingleton& aSingleton ) :
+ CSendingService( aCoeEnv, aSingleton )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::ConstructL( )
+ {
+ iResourceLoader = new(ELeave)RConeResourceLoader( iCoeEnv );
+
+ InitializeServiceL();
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDrmLinkSender* CDrmLinkSender::NewL( TSendingServiceParams* aParams )
+ {
+ CDrmLinkSender* self = new(ELeave) CDrmLinkSender( aParams->iCoeEnv, aParams->iSingleton );
+
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ return self;
+ }
+
+// Destructor
+CDrmLinkSender::~CDrmLinkSender()
+ {
+ // Unload UI resource file.
+ if ( iResourceLoader )
+ {
+ iResourceLoader->Close();
+ delete iResourceLoader;
+ }
+ iServiceArray.ResetAndDestroy();
+ iServiceArray.Close();
+ delete iClientMtm;
+ delete iMtmUi;
+ }
+
+
+// ---------------------------------------------------------
+// CDrmLinkSender::ServiceProviderId
+// Returns the id of the service provider.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TUid CDrmLinkSender::ServiceProviderId() const
+ {
+ return KDrmLinkSender;
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::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 CDrmLinkSender::PopulateServicesListL(
+ RPointerArray<CSendingServiceInfo>& aList )
+ {
+ for ( TInt cc = 0; cc < iServiceArray.Count(); cc++ )
+ {
+ User::LeaveIfError( aList.Append( iServiceArray[cc] ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::CreateAndSendMessageL
+// Creates to outbox as many MMS messages as there are files to be send.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::CreateAndSendMessageL(
+ TUid aServiceUid,
+ const CMessageData* aMessageData,
+ TBool /*aLaunchEditorEmbedded */)
+ {
+ HBufC8* contentUrl = NULL;
+
+ if ( !aMessageData ||
+ aServiceUid != KDrmLinkSender ||
+ iServiceArray.Count() == 0 )
+ {
+ return;
+ }
+
+ const CDesCArray& attachmentPaths = aMessageData->AttachmentArray();
+ const RArray<RFile>& attachments = aMessageData->AttachmentHandleArray();
+
+ if ( attachmentPaths.MdcaCount() == 1 )
+ {
+ contentUrl = DrmContentUrlLC( attachmentPaths.MdcaPoint(0), iCoeEnv.FsSession() );
+ }
+ else if ( attachments.Count() == 1 )
+ {
+ contentUrl = DrmContentUrlLC( attachments[0] );
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ return;
+ }
+
+ CreateMessageAndLaunchEditorL( *contentUrl );
+ CleanupStack::PopAndDestroy( contentUrl );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::DrmContentUrlLC
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CDrmLinkSender::DrmContentUrlLC( const TDesC& aFilePath, RFs& aFs )
+ {
+ RFile file;
+ CleanupClosePushL( file );
+
+ TInt err = file.Open( aFs, aFilePath, EFileShareReadersOnly );
+ if ( err )
+ {
+ User::LeaveIfError( file.Open( aFs, aFilePath, EFileShareAny ) );
+ }
+
+ HBufC8* contentUrl = DrmContentUrlLC( file );
+ CleanupStack::Pop( contentUrl );
+ CleanupStack::PopAndDestroy( &file );
+ CleanupStack::PushL( contentUrl );
+ return contentUrl;
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::DrmContentUrlLC
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CDrmLinkSender::DrmContentUrlLC( const RFile& aFile )
+ {
+ HBufC8* contentUrl = NULL;
+ TBuf<KSenduiUrlMaxLen> temp;
+
+ ContentAccess::CData* content = ContentAccess::CData::NewLC(
+ const_cast<RFile&> (aFile),
+ ContentAccess::KDefaultContentObject,
+ ContentAccess::EPeek );
+ User::LeaveIfError( content->GetStringAttribute( ContentAccess::EContentURI, temp ) );
+ CleanupStack::PopAndDestroy( content );
+
+ if ( temp.Length() > 0 )
+ {
+ contentUrl = HBufC8::NewLC( temp.Length() );
+ contentUrl->Des().Copy( temp );
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ return contentUrl;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::InitializeServiceL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::InitializeServiceL()
+ {
+ // Load UI resource file.
+ TFileName resourceFile;
+ TParse* fp = new(ELeave) TParse();
+ fp->Set( KDrmLinkSenderUiResource, &KDC_RESOURCE_FILES_DIR, NULL );
+ resourceFile = fp->FullName();
+ delete fp;
+ fp = NULL;
+
+ iResourceLoader->OpenL( resourceFile );
+
+ CSendingServiceInfo* serviceInfo = CSendingServiceInfo::NewLC();
+
+ // Set service type.
+ serviceInfo->SetServiceProviderId( KDrmLinkSender );
+ serviceInfo->SetServiceId( KDrmLinkSender );
+
+ // Read service name from resource
+ HBufC* serviceName = StringLoader::LoadLC( R_DRM_LINK_SENDER_MENU_NAME );
+ serviceInfo->SetServiceMenuNameL( *serviceName );
+
+ CleanupStack::PopAndDestroy( serviceName );
+
+ // Sending capabilities doesn't need to set.
+ // Content URL is used for filtering instead of TSendingCapabilities.
+
+ iServiceArray.Append( serviceInfo );
+ CleanupStack::Pop( serviceInfo );
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::CreateMessageAndLaunchEditorL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::CreateMessageAndLaunchEditorL( HBufC8& aContentUrl )
+ {
+ if (!iClientMtm )
+ {
+ // Uni client side MTM
+ iClientMtm = iSingleton.ClientMtmRegistryL().NewMtmL( KSenduiMtmUniMessageUid );
+ }
+
+ // Get Uni MTM UI and set its context
+ iMtmUi = iSingleton.MtmUiRegistryL().NewMtmUiL( *iClientMtm );
+
+ // Create draft entry for the message
+ CMsvEntry* draftEntry = iSingleton.MsvSessionL().GetEntryL( KMsvDraftEntryId );
+ CleanupStack::PushL( draftEntry );
+ iClientMtm->SetCurrentEntryL( draftEntry ); //iClientMtm takes ownership
+ CleanupStack::Pop( draftEntry );
+
+ // Create the new message
+ TMsvId serviceId = MsvUiServiceUtilitiesInternal::DefaultServiceForMTML(
+ iSingleton.MsvSessionL(), KSenduiMtmUniMessageUid, ETrue);
+ iClientMtm->CreateMessageL( serviceId );
+
+ // Set message entry data
+ TMsvEntry entry = iClientMtm->Entry().Entry();
+
+ TUniMsvEntry::SetCurrentMessageType(
+ entry, EUniMessageCurrentTypeSms );
+ TUniMsvEntry::SetMessageTypeLocked( entry, ETrue );
+ iClientMtm->Entry().ChangeL( entry );
+
+ entry.iDate.UniversalTime();
+ entry.SetVisible( EFalse );
+ entry.SetAttachment( EFalse );
+ entry.SetInPreparation( ETrue );
+ iClientMtm->Entry().ChangeL( entry );
+
+ // Add DRM content link to body text
+ AddAttachmentsL(aContentUrl);
+
+ // Save message.
+ iClientMtm->SaveMessageL();
+ entry = iClientMtm->Entry().Entry();
+ iClientMtm->SwitchCurrentEntryL( entry.Id() );
+
+ // Launch editor embedded
+ TUint preferences = iMtmUi->Preferences();
+ preferences |= EMtmUiFlagEditorPreferEmbedded;
+ iMtmUi->SetPreferences( preferences );
+
+ // Edit the message.
+ CSendUiOperationWait* waiter = CSendUiOperationWait::NewLC();
+ CMsvOperation* op = iMtmUi->EditL( waiter->iStatus );
+ CleanupStack::PushL( op );
+
+ waiter->Start( op );
+
+ TBuf8<KSendUiProgressStringSize> progressBuf = op->ProgressL();
+ iMtmUi->DisplayProgressSummary( progressBuf );
+
+ CleanupStack::PopAndDestroy( 2 ); // waiter, op
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::AddAttachmentsL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::AddAttachmentsL( HBufC8& aContentUrl )
+ {
+ TInt cleanupItems(0);
+ CMessageData* msgData = CMessageData::NewLC();
+ cleanupItems++;
+
+ TPtr8 string(aContentUrl.Des());
+ CRichText* text = CRichText::NewL(
+ static_cast<CEikonEnv&>( iCoeEnv ).SystemParaFormatLayerL(),
+ static_cast<CEikonEnv&>( iCoeEnv ).SystemCharFormatLayerL() );
+ CleanupStack::PushL( text );
+ cleanupItems++;
+ text->Reset();
+
+ HBufC16* bufConv = HBufC16::NewLC(string.Length());
+ cleanupItems++;
+ TPtr16 string16(bufConv->Des());
+ string16.Copy(string);
+ text->InsertL( 0, string16 );
+
+ // Set body text
+ msgData->SetBodyTextL( text );
+
+ CArrayPtrFlat<CSendUiAttachment>* attachments = NULL;
+ // Get attachments
+ if ( msgData )
+ {
+ attachments = CSendUiAttachment::InitAttachmentArrayLCC(
+ msgData->AttachmentArray(),
+ msgData->AttachmentHandleArray(),
+ iCoeEnv.FsSession() );
+ cleanupItems += 2;
+ }
+ CSendUiAttachment* atta = CSendUiAttachment::NewLC( *text, iCoeEnv.FsSession() );
+ attachments->AppendL( atta );
+ CleanupStack::Pop( atta );
+
+ TInt attachmentCount = attachments->Count();
+ TInt i;
+ for ( i = 0; i < attachmentCount ; i++ )
+ {
+ CSendUiAttachment& attachment = *(attachments->At(i ));
+ AddAttachmentL( &attachment );
+ }
+ CleanupStack::PopAndDestroy( cleanupItems ); // msgData, text, bufConv, attachments
+ }
+
+// -----------------------------------------------------------------------------
+// CDrmLinkSender::AddAttachmentL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CDrmLinkSender::AddAttachmentL( CSendUiAttachment* aAttachment)
+ {
+ CSendUiOperationWait* waiter = CSendUiOperationWait::NewLC();
+
+ iClientMtm->AddLinkedAttachmentL(
+ *(aAttachment->Path() ),
+ aAttachment->MimeType(),
+ 0,
+ waiter->iStatus );
+ TBool success = waiter->Start( iClientMtm );
+ CleanupStack::PopAndDestroy( waiter );
+}
+
+// -----------------------------------------------------------------------------
+// TechnologyType
+// -----------------------------------------------------------------------------
+//
+TUid CDrmLinkSender::TechnologyTypeId( ) const
+ {
+ return KNullUid;
+ }
+
+// End of File