--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/unieditor/mmsplugin/src/UniMmsPlugin.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,615 @@
+/*
+* Copyright (c) 2005-2008 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 UniEditor Mms Plugin methods.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <f32file.h>
+#include <implementationproxy.h>
+#include <ecom.h>
+
+#include <msvapi.h>
+#include <mtclreg.h>
+#include <cmsvrecipientlist.h>
+
+#include <commdb.h>
+#include <mmsapselect.h>
+
+#include <mmsconst.h>
+#include <mmsclient.h>
+#include <mmsheaders.h>
+#include <mmssettings.h>
+#include <mmsmsventry.h>
+#include <AknQueryDialog.h>
+#include <UniMmsPluginD.rsg>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+// Possible values for mms validity period in seconds
+const TInt32 KUniMmsValidityPeriod1h = 3600;
+const TInt32 KUniMmsValidityPeriod6h = 21600;
+const TInt32 KUniMmsValidityPeriod24h = 86400;
+const TInt32 KUniMmsValidityPeriod3Days = 259200;
+const TInt32 KUniMmsValidityPeriodWeek = 604800;
+const TInt32 KUniMmsValidityPeriodMax = 0;
+
+#include <SenduiMtmUids.h>
+
+#include <MuiuOperationWait.h>
+
+#include "UniMsvEntry.h"
+#include "UniMmsPlugin.h"
+#include "UniSendingSettings.h"
+#include "UniClientMtm.h"
+#include "UniEditorUids.hrh"
+
+//DEBUG LOGGING
+#include "UniEditorLogging.h"
+
+// CONSTANTS
+const TImplementationProxy KImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( KUidUniEditorMmsPlugin, CUniMmsPlugin::NewL)
+ };
+
+const TInt KMaxDetailsLength = 64; // Copy max this many chars to TMsvEntry::iDetails
+_LIT( KAddressSeparator, ";" );
+
+_LIT( KUniMmsPluginResourceFile, "UniMmsPluginD.rsc" );
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUniMmsPlugin* CUniMmsPlugin::NewL( TAny* aConstructionParameters )
+ {
+ UNILOGGER_ENTERFN("CUniMmsPlugin::NewL");
+ TUniPluginParams* params = reinterpret_cast<TUniPluginParams*>( aConstructionParameters );
+ CUniMmsPlugin* self = new ( ELeave ) CUniMmsPlugin( params->iSession, params->iUniMtm );
+ UNILOGGER_LEAVEFN("CUniSmsPlugin::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CUniMmsPlugin::~CUniMmsPlugin()
+ {
+ //In case there is no settings at all leave occurs and resource not freed
+ if( iResourceOffset )
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iResourceOffset );
+ }
+ delete iCommsDb;
+ delete iMmsSettings;
+ delete iMmsHeader;
+ delete iMmsMtm;
+ delete iMtmRegistry;
+ }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CUniMmsPlugin::CUniMmsPlugin( CMsvSession& aSession, CUniClientMtm& aUniMtm )
+ : iSession( aSession ),
+ iUniMtm( aUniMtm ),
+ iResourceOffset ( 0 )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// LoadHeadersL
+// -----------------------------------------------------------------------------
+//
+void CUniMmsPlugin::LoadHeadersL( CMsvStore* aStore )
+ {
+ UNILOGGER_ENTERFN("CUniMmsPlugin::LoadHeadersL");
+ delete iMmsHeader;
+ iMmsHeader = NULL;
+ iMmsHeader = CMmsHeaders::NewL();
+ if ( aStore && aStore->IsPresentL( KUidMmsHeaderStream ) )
+ {
+ iMmsHeader->RestoreL( *aStore );
+ }
+ else
+ {
+ CMmsSettings* settings = CMmsSettings::NewL();
+ CleanupStack::PushL( settings );
+ settings->LoadSettingsL();
+ iMmsHeader->SetSettings( settings );
+ CleanupStack::PopAndDestroy( settings );
+ }
+ UNILOGGER_LEAVEFN("CUniSmsPlugin::LoadHeadersL");
+ }
+
+// -----------------------------------------------------------------------------
+// SaveHeadersL
+// -----------------------------------------------------------------------------
+//
+void CUniMmsPlugin::SaveHeadersL( CMsvStore& aStore )
+ {
+ if ( iMmsHeader )
+ {
+ iMmsHeader->StoreL( aStore );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// ConvertFromL
+// -----------------------------------------------------------------------------
+//
+TMsvId CUniMmsPlugin::ConvertFromL( TMsvId aId )
+ {
+ UNILOGGER_ENTERFN("CUniMmsPlugin::ConvertFromL");
+ MmsMtmL()->SwitchCurrentEntryL( aId );
+ MmsMtmL()->LoadMessageL();
+ iUniMtm.SwitchCurrentEntryL( aId );
+ iUniMtm.LoadMessageL();
+
+ // Copy MMS stuff.
+ const CMsvRecipientList& mmsRecipients = MmsMtmL()->AddresseeList();
+ while ( mmsRecipients.Count() )
+ {
+ iUniMtm.AddAddresseeL(
+ mmsRecipients.Type( 0 ),
+ TMmsGenUtils::PureAddress( mmsRecipients[ 0 ] ),
+ TMmsGenUtils::Alias( mmsRecipients[ 0 ] ) );
+ MmsMtmL()->RemoveAddressee( 0 );
+ }
+
+ iUniMtm.SetSubjectL( MmsMtmL()->SubjectL() );
+ MmsMtmL()->SetSubjectL( KNullDesC );
+
+
+ //Get MMS Client MTM Message root and set it to UniMTM
+ iUniMtm.SetMessageRoot( MmsMtmL()->MessageRootAttachment() );
+
+ MmsMtmL()->SaveMessageL();
+ iUniMtm.SaveMessageL();
+
+ TMmsMsvEntry mmsEntry = static_cast<TMmsMsvEntry>( MmsMtmL( )->Entry( ).Entry( ) );
+
+ TMsvEntry uniEntry = iUniMtm.Entry().Entry();
+ uniEntry.iMtm.iUid = KUidUniMtm;
+
+ // Lets convert the bits to Uni mode
+ TUniMsvEntry::SetForwardedMessage( uniEntry, mmsEntry.IsForwardedMessage( ));
+ TUniMsvEntry::SetMmsUpload( uniEntry, mmsEntry.iBioType == KUidMsgSubTypeMmsUpload.iUid );
+ TUniMsvEntry::SetEditorOriented( uniEntry, mmsEntry.EditorOriented( ) );
+
+ iUniMtm.Entry().ChangeL( uniEntry );
+ UNILOGGER_LEAVEFN("CUniSmsPlugin::ConvertFromL");
+ return aId;
+ }
+
+// -----------------------------------------------------------------------------
+// ConvertToL
+// -----------------------------------------------------------------------------
+//
+TMsvId CUniMmsPlugin::ConvertToL( TMsvId aId )
+ {
+ UNILOGGER_ENTERFN("CUniMmsPlugin::ConvertToL");
+ MmsMtmL()->SwitchCurrentEntryL( aId );
+ MmsMtmL()->LoadMessageL();
+ iUniMtm.SwitchCurrentEntryL( aId );
+ iUniMtm.LoadMessageL();
+
+ // Copy MMS stuff.
+ const CMsvRecipientList& uniRecipients = iUniMtm.AddresseeList();
+ while ( uniRecipients.Count() )
+ {
+ MmsMtmL()->AddAddresseeL(
+ uniRecipients.Type( 0 ),
+ TMmsGenUtils::PureAddress( uniRecipients[ 0 ] ),
+ TMmsGenUtils::Alias( uniRecipients[ 0 ] ) );
+ iUniMtm.RemoveAddressee( 0 );
+ }
+
+ MmsMtmL()->SetSubjectL( iUniMtm.SubjectL() );
+ iUniMtm.SetSubjectL( KNullDesC );
+
+ //Let's set the message root to point to smil
+ MmsMtmL()->SetMessageRootL ( iUniMtm.MessageRoot() );
+
+ iUniMtm.SaveMessageL();
+ MmsMtmL()->SaveMessageL();
+
+ TMsvEntry uniEntry = iUniMtm.Entry( ).Entry( );
+ TMsvEntry tEntry = MmsMtmL()->Entry().Entry();
+
+ TBuf<KMaxDetailsLength> detailsBuf;
+ MakeDetailsL( detailsBuf );
+ tEntry.iDetails.Set( detailsBuf );
+
+ tEntry.iMtm.iUid = KSenduiMtmMmsUidValue;
+
+ // Lets convert the bits to mms mode
+ TMmsMsvEntry mmsEntry = static_cast<TMmsMsvEntry>( tEntry );
+ mmsEntry.SetForwardedMessage( TUniMsvEntry::IsForwardedMessage( uniEntry ) );
+ mmsEntry.SetEditorOriented( TUniMsvEntry::IsEditorOriented( uniEntry ) );
+ if( TUniMsvEntry::IsMmsUpload( uniEntry ) )
+ {
+ mmsEntry.iBioType = KUidMsgSubTypeMmsUpload.iUid;
+ }
+
+ MmsMtmL()->Entry().ChangeL( mmsEntry );
+ UNILOGGER_LEAVEFN("CUniSmsPlugin::ConvertToL");
+ return aId;
+ }
+
+// -----------------------------------------------------------------------------
+// CreateReplyL
+// -----------------------------------------------------------------------------
+//
+TMsvId CUniMmsPlugin::CreateReplyL( TMsvId aSrc, TMsvId aDest, TMsvPartList aParts )
+ {
+ return DoCreateReplyOrForwardL( ETrue, aSrc, aDest, aParts );
+ }
+
+// -----------------------------------------------------------------------------
+// CreateForwardL
+// -----------------------------------------------------------------------------
+//
+TMsvId CUniMmsPlugin::CreateForwardL( TMsvId aSrc, TMsvId aDest, TMsvPartList aParts )
+ {
+ return DoCreateReplyOrForwardL( EFalse, aSrc, aDest, aParts );
+ }
+
+// -----------------------------------------------------------------------------
+// SendL
+// -----------------------------------------------------------------------------
+//
+void CUniMmsPlugin::SendL( TMsvId aId )
+ {
+ MmsMtmL()->SwitchCurrentEntryL( aId );
+ MmsMtmL()->LoadMessageL();
+ CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+ CMsvOperation* oper = MmsMtmL()->SendL( wait->iStatus );
+ CleanupStack::PushL( oper );
+ wait->Start();
+ CleanupStack::PopAndDestroy( oper );
+ CleanupStack::PopAndDestroy( wait );
+ }
+
+// -----------------------------------------------------------------------------
+// ValidateServiceL
+// -----------------------------------------------------------------------------
+//
+TBool CUniMmsPlugin::ValidateServiceL( TBool /*aEmailOverSms*/ )
+ {
+ TMsvId service = MmsMtmL()->DefaultServiceL();
+ TBool valid( MmsMtmL()->ValidateService( service ) == KErrNone );
+ if ( !valid )
+ {
+ iFileParse.Set( KUniMmsPluginResourceFile, &KDC_RESOURCE_FILES_DIR, NULL );
+
+ iFileName = iFileParse.FullName();
+
+ CEikonEnv* env = CEikonEnv::Static( );
+
+ BaflUtils::NearestLanguageFile( env->FsSession(), iFileName );
+
+ iResourceOffset = env->AddResourceFileL( iFileName );
+ //First, a confirmation query must be shown
+ CAknQueryDialog* settingsNotOkQuery = CAknQueryDialog::NewL();
+ if ( settingsNotOkQuery->ExecuteLD( R_UNIEDITOR_QUERY_AP_ERROR ) )
+ {
+ EditAccessPointL();
+ valid = ( MmsMtmL()->ValidateService( service ) == KErrNone );
+ }
+ env->DeleteResourceFile( iResourceOffset );
+ iResourceOffset = 0;
+ }
+ return valid;
+ }
+
+
+// ---------------------------------------------------------
+// EditAccessPointL
+// ---------------------------------------------------------
+//
+void CUniMmsPlugin::EditAccessPointL()
+ {
+ if ( !iMmsSettings )
+ {
+ iMmsSettings = CMmsSettings::NewL();
+ }
+ MmsMtmL()->RestoreSettingsL();
+ iMmsSettings->CopyL( MmsMtmL()->MmsSettings() );
+
+ if ( !iCommsDb )
+ {
+ iCommsDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ }
+
+ TUint32 currentAp = iMmsSettings->AccessPointCount()
+ ? iMmsSettings->AccessPoint( 0 )
+ : KMaxTUint32; // Invalid value
+ TUint32 selectedAp( KMaxTUint32 );
+
+ // Ignore return value...
+ MmsApSelect::SelectMmsAccessPointL(
+ *iCommsDb,
+ currentAp,
+ selectedAp,
+ EApBearerTypeGPRS );
+
+ if ( selectedAp != KMaxTUint32 &&
+ selectedAp != currentAp )
+ {
+ // Ap was changed.
+ while ( iMmsSettings->AccessPointCount() )
+ {
+ iMmsSettings->DeleteAccessPointL( 0 );
+ }
+ if ( selectedAp != 0 )
+ {
+ // Something else than "None" selected.
+ iMmsSettings->AddAccessPointL( selectedAp, 0 );
+ }
+ MmsMtmL()->SetSettingsL( *iMmsSettings );
+ MmsMtmL()->StoreSettingsL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// GetSendingSettingsL
+// -----------------------------------------------------------------------------
+//
+void CUniMmsPlugin::GetSendingSettingsL( TUniSendingSettings& aSettings )
+ {
+ // Modify only the settings this mtm plugin supports
+ switch ( iMmsHeader->MessagePriority() )
+ {
+ case EMmsPriorityLow:
+ aSettings.iPriority = TUniSendingSettings::EUniPriorityLow;
+ break;
+ case EMmsPriorityHigh:
+ aSettings.iPriority = TUniSendingSettings::EUniPriorityHigh;
+ break;
+ case EMmsPriorityNormal:
+ default:
+ aSettings.iPriority = TUniSendingSettings::EUniPriorityNormal;
+ break;
+ }
+
+ aSettings.iDeliveryReport = iMmsHeader->DeliveryReport();
+
+ switch ( iMmsHeader->ExpiryInterval() )
+ {
+ case KUniMmsValidityPeriod1h:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriod1h;
+ break;
+ case KUniMmsValidityPeriod6h:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriod6h;
+ break;
+ case KUniMmsValidityPeriod3Days:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriod3Days;
+ break;
+ case KUniMmsValidityPeriodWeek:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriodWeek;
+ break;
+ case KUniMmsValidityPeriodMax:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriodMax;
+ break;
+ default: // default to 24h
+ case KUniMmsValidityPeriod24h:
+ aSettings.iValidityPeriod = TUniSendingSettings::EUniValidityPeriod24h;
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// SetSendingSettingsL
+// -----------------------------------------------------------------------------
+//
+void CUniMmsPlugin::SetSendingSettingsL( TUniSendingSettings& aSettings )
+ {
+ switch ( aSettings.iPriority )
+ {
+ case TUniSendingSettings::EUniPriorityLow:
+ iMmsHeader->SetMessagePriority( EMmsPriorityLow );
+ break;
+ case TUniSendingSettings::EUniPriorityHigh:
+ iMmsHeader->SetMessagePriority( EMmsPriorityHigh );
+ break;
+ case TUniSendingSettings::EUniPriorityNormal:
+ default:
+ iMmsHeader->SetMessagePriority( EMmsPriorityNormal );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// IsServiceValidL
+// -----------------------------------------------------------------------------
+//
+TBool CUniMmsPlugin::IsServiceValidL()
+ {
+ return MmsMtmL()->ValidateService( MmsMtmL()->DefaultServiceL() ) == KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// MmsMtmL
+// -----------------------------------------------------------------------------
+//
+CMmsClientMtm* CUniMmsPlugin::MmsMtmL()
+ {
+ if ( !iMmsMtm )
+ {
+ if ( !iMtmRegistry )
+ {
+ iMtmRegistry = CClientMtmRegistry::NewL( iSession );
+ }
+ iMmsMtm = static_cast<CMmsClientMtm*>( iMtmRegistry->NewMtmL( KSenduiMtmMmsUid ) );
+ }
+ return iMmsMtm;
+ }
+
+// -----------------------------------------------------------------------------
+// DoCreateReplyOrForwardL
+// -----------------------------------------------------------------------------
+//
+TMsvId CUniMmsPlugin::DoCreateReplyOrForwardL( TBool aReply,
+ TMsvId aSrc,
+ TMsvId aDest,
+ TMsvPartList aParts )
+ {
+ MmsMtmL()->SwitchCurrentEntryL( aSrc );
+
+ CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+
+ CMsvOperation* oper = aReply
+ ? MmsMtmL()->ReplyL( aDest, aParts, wait->iStatus )
+ : MmsMtmL()->ForwardL( aDest, aParts, wait->iStatus );
+
+ CleanupStack::PushL( oper );
+ wait->Start();
+
+ TMsvId newId;
+ TPckgC<TMsvId> paramPack( newId );
+ const TDesC8& progress = oper->FinalProgress();
+ paramPack.Set( progress );
+ newId = paramPack();
+ CleanupStack::PopAndDestroy( oper );
+ CleanupStack::PopAndDestroy( wait );
+ return ConvertFromL( newId );
+ }
+
+// ---------------------------------------------------------
+// MakeDetails
+// ---------------------------------------------------------
+//
+void CUniMmsPlugin::MakeDetailsL( TDes& aDetails )
+ {
+ // This very same code can be found in CUniAddressHandler.
+ // They should be put in common location some day...
+ const CMsvRecipientList& addresses = MmsMtmL()->AddresseeList();
+ TInt addrCnt = addresses.Count();
+
+ TPtrC stringToAdd;
+ for ( TInt i = 0; i < addrCnt; i++)
+ {
+ // Only address is converted to western.
+ // There may numbers in contact name - they must not be converted
+ TPtrC alias = TMmsGenUtils::Alias( addresses[i] );
+ HBufC* addressBuf = NULL;
+
+ if ( alias.Length() != 0 )
+ {
+ stringToAdd.Set( alias );
+ }
+ else
+ {
+ TPtrC address = TMmsGenUtils::PureAddress( addresses[i] );
+ addressBuf = HBufC::NewLC( address.Length() );
+ TPtr addressPtr = addressBuf->Des();
+ addressPtr.Copy( address );
+ stringToAdd.Set( addressPtr );
+
+ // Internal data structures always holds the address data in western format.
+ // UI is responsible of doing language specific conversions.
+ AknTextUtils::ConvertDigitsTo( addressPtr, EDigitTypeWestern );
+ }
+
+ if ( ( aDetails.Length() != 0 ) && // Not a first address
+ ( aDetails.Length() + KAddressSeparator().Length() < KMaxDetailsLength ) )
+ {
+ // Add separator
+ aDetails.Append( KAddressSeparator() );
+ }
+
+ if ( aDetails.Length() + stringToAdd.Length() < KMaxDetailsLength )
+ {
+ // whole string fits. Add it.
+ aDetails.Append( stringToAdd );
+ if ( addressBuf )
+ {
+ CleanupStack::PopAndDestroy( addressBuf );
+ }
+ }
+ else
+ {
+ // Only part of the string fits
+ TInt charsToAdd = KMaxDetailsLength - aDetails.Length();
+
+ if ( charsToAdd <= 0 )
+ {
+ // Cannot add any more chars
+ break;
+ }
+
+ if ( charsToAdd >= stringToAdd.Length() )
+ {
+ // Guarantee that charsToAdd is not larger that stringToAdd lenght
+ charsToAdd = stringToAdd.Length();
+ }
+
+ aDetails.Append( stringToAdd.Left( charsToAdd ) );
+ if ( addressBuf )
+ {
+ CleanupStack::PopAndDestroy( addressBuf );
+ }
+ break;
+ }
+ }
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// ImplementationProxy
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ aTableCount = sizeof( KImplementationTable ) / sizeof( TImplementationProxy );
+ return KImplementationTable;
+ }
+
+//------------------------------------------------------------------------------
+// CUniMmsPlugin::SetEncodingSetings
+// Turkish SMS-PREQ2265 Specific
+// To Set encoding settings like encoding type, character support
+// and alternative encoding if any
+//------------------------------------------------------------------------------
+void CUniMmsPlugin::SetEncodingSettings(TBool aUnicodeMode, TSmsEncoding aAlternativeEncodingType, TInt aCharSupportType)
+ {
+ //Do nothing for MMS.
+ }
+
+//------------------------------------------------------------------------------
+// CUniMmsPlugin::GetNumPDUs
+// Turkish SMS-PREQ2265 Specific
+// To get PDU Info: extracts details of number of PDUs, number of remaining chars in last PDU
+// and encoding types used.
+//------------------------------------------------------------------------------
+void CUniMmsPlugin::GetNumPDUsL (
+ TDesC& aBuf,
+ TInt& aNumOfRemainingChars,
+ TInt& aNumOfPDUs,
+ TBool& aUnicodeMode,
+ TSmsEncoding& aAlternativeEncodingType)
+ {
+ //Do nothing for MMS
+ }
+
+// End of File