--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/src/MceUtils.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,540 @@
+/*
+* 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:
+* Mixed class to offer different account functions.
+* Implemented by CMceUi.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <msvids.h>
+#include <msvapi.h>
+#include <AknUtils.h> // AknTextUtils
+#include "MceUtils.h"
+#include "MceIds.h"
+#include "MceListItem.h"
+#include <featmgr.h>
+
+#include <messagingvariant.hrh>
+#include <centralrepository.h>
+#include <MessagingDomainCRKeys.h>
+#include <centralrepository.h>
+#include <messaginginternalcrkeys.h>
+
+#include <NumberGroupingCRKeys.h>
+
+#include <mmsvattachmentmanager.h>
+#include <cmsvattachment.h>
+
+#include <SenduiMtmUids.h> // mtm uids
+#include <mmsconst.h>
+#include <mmsgenutils.h>
+#include <mmsclient.h>
+#include <mtclreg.h>
+#include <mtudreg.h> // CMtmUiDataRegistry
+#include <miutset.h>
+#include <commonphoneparser.h>
+#include <smuthdr.h>
+
+#include <ImumInternalApi.h>
+#include <ImumInHealthServices.h>
+
+// CONSTANTS
+
+const TInt KMceReplaceCharacterCount = 3;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// MceUtils::IsEntryFixed
+// This is static function
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool MceUtils::IsEntryFixed(TMsvId aId)
+ {
+ return (aId == KMsvGlobalInBoxIndexEntryId
+ || aId == KMsvGlobalOutBoxIndexEntryId
+ || aId == KMsvDraftEntryId
+ || aId == KMsvSentEntryId
+ || aId == KMsvLocalServiceIndexEntryId
+ || aId == KMceDocumentsEntryId
+ || aId == KMceTemplatesEntryId
+ );
+ }
+
+// ---------------------------------------------------------
+// MceUtils::ReplaceCharacters
+// This is static function
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void MceUtils::ReplaceCharacters( TDes& aText )
+ {
+ TBuf<KMceReplaceCharacterCount> replaceChars;
+ replaceChars.Zero();
+ replaceChars.Append( CEditableText::EParagraphDelimiter );
+ replaceChars.Append( CEditableText::ETabCharacter );
+ replaceChars.Append( CEditableText::EByteOrderMark );
+ AknTextUtils::ReplaceCharacters(
+ aText,
+ replaceChars,
+ CEditableText::ESpace );
+ }
+
+// ---------------------------------------------------------
+// MceUtils::GetIrFilePathL
+// This is static function
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void MceUtils::GetIrFilePathL( CMsvSession& aSession, TMsvId aEntryId, TFileName& aFileName, RFile& aFileHandle, TInt& aSize )
+ {
+ aFileName.Zero();
+
+ // Get attachment manager from the entry's store
+
+ CMsvEntry* message = aSession.GetEntryL( aEntryId );
+ CleanupStack::PushL( message ); // message
+
+ // In case of incomplete message which has no attachment
+ if ( message->Count() )
+ {
+ CMsvEntry* entry = aSession.GetEntryL( ((*message)[0]).Id() );
+ CleanupStack::PushL( entry ); // entry, message
+ CMsvStore* store = entry->ReadStoreL();
+ CleanupStack::PushL( store ); // store, entry, message
+
+ MMsvAttachmentManager& attachMan = store->AttachmentManagerL();
+
+ if ( attachMan.AttachmentCount() != 1 )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // Get the path
+ CMsvAttachment *attachment = attachMan.GetAttachmentInfoL(0);
+ CleanupStack::PushL( attachment ); // attachment, store, entry, message
+ const TDesC& filePath = attachment->FilePath();
+ // Save
+ aFileName.Copy( filePath );
+
+ aFileHandle = attachMan.GetAttachmentFileL( 0 );
+
+ // Get the size
+ aSize = attachment->Size();
+
+ CleanupStack::PopAndDestroy( 4 ); // attachment, store, entry, message
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(); // message
+ User::Leave( KErrNotFound );
+ }
+ }
+
+// ---------------------------------------------------------
+// MceUtils::MemoryInUseOptionL
+// This is static function
+// Returns ETrue if 'Memory in use' option is enabled in
+// mce/settings
+// ---------------------------------------------------------
+//
+TBool MceUtils::MemoryInUseOptionL( )
+ {
+ TBool memoryInUse = ETrue;
+ if ( FeatureManager::FeatureSupported( KFeatureIdMmc ) )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdMmcHotswap) )
+ {
+ // if not hotswap phone, then Memory in use is enabled
+ // if hotswap phone, check from shared data, if
+ // Memory in use is enabled
+
+ CRepository* repository = NULL;
+ TRAPD( ret, repository = CRepository::NewL(KCRUidMuiuVariation) );
+ CleanupStack::PushL( repository );
+
+ TInt featureBitmask = 0;
+
+ if ( ret == KErrNone )
+ {
+ if ( repository->Get(KMuiuMceFeatures,featureBitmask) != KErrNone )
+ {
+ memoryInUse = ETrue;
+ }
+ else
+ {
+ if ( !(featureBitmask & KMceFeatureIdHotswap) )
+ {
+ memoryInUse = EFalse;
+ }
+ }
+ }
+
+ CleanupStack::Pop( repository );
+ delete repository;
+
+ }
+
+ }
+ else
+ {
+ //no mmc support
+ memoryInUse = EFalse;
+ }
+ return memoryInUse;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::GetHealthyMailboxList
+// This is static function
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt MceUtils::GetHealthyMailboxListL(
+ const MImumInHealthServices& aHealthServices,
+ MImumInHealthServices::RMailboxIdArray& aMailboxIdArray,
+ TBool aGetImap4,
+ TBool aGetPop3,
+ TBool aGetSyncML,
+ TBool aGetOther )
+ {
+ TInt64 mailboxFlags = MImumInHealthServices::EFlagGetHealthy;
+
+ TInt mtmPluginID = 0;
+ if ( FeatureManager::FeatureSupported( KFeatureIdEmailMceIntegration ) )
+ {
+ // Check if there is other than platform email application registered
+ // to handle S60 mailboxes
+ CRepository* repository = NULL;
+ TRAPD( ret, repository = CRepository::NewL(
+ KCRUidSelectableDefaultEmailSettings ) );
+
+ if ( ret == KErrNone )
+ {
+ TInt err = repository->Get( KIntegratedEmailAppMtmPluginId,
+ mtmPluginID );
+ if ( err != KErrNone )
+ {
+ mtmPluginID = 0;
+ }
+ }
+ delete repository;
+ }
+ if ( mtmPluginID == 0 )
+ {
+ if ( aGetImap4 )
+ {
+ mailboxFlags |= MImumInHealthServices::EFlagIncludeImap4;
+ }
+ if ( aGetPop3 )
+ {
+ mailboxFlags |= MImumInHealthServices::EFlagIncludePop3;
+ }
+ }
+ if ( aGetSyncML )
+ {
+ mailboxFlags |= MImumInHealthServices::EFlagIncludeSyncMl;
+ }
+ if ( aGetOther )
+ {
+ mailboxFlags |= MImumInHealthServices::EFlagIncludeOther;
+ }
+
+ TInt error = aHealthServices.GetMailboxList(
+ aMailboxIdArray,
+ mailboxFlags );
+
+ return error;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::ValidPhoneNumberL
+// This is static function
+// Returns ETrue if phonenumber is valid
+// ---------------------------------------------------------
+//
+TBool MceUtils::ValidPhoneNumberL(
+ TMsvId aEntryId,
+ CMsvSession& aSession,
+ TPhCltTelephoneNumber& aPhoneNumber,
+ TDes* aEntryDetails )
+ {
+ TBool validNumber = EFalse;
+ TMsvEntry entry;
+ TMsvId service = KMsvLocalServiceIndexEntryId;
+ User::LeaveIfError( aSession.GetEntry( aEntryId, service, entry ) );
+ if ( aEntryDetails )
+ {
+ aEntryDetails->Copy( entry.iDetails.Left( KMceVisibleTextLength ) );
+ }
+ if ( entry.iMtm == KSenduiMtmSmsUid || entry.iMtm == KSenduiMtmBioUid )
+ {
+ MceUtils::GetSmsNumberL( aEntryId, aSession, aPhoneNumber );
+ validNumber = CommonPhoneParser::IsValidPhoneNumber(
+ aPhoneNumber, CommonPhoneParser::ESMSNumber );
+ }
+ else if ( entry.iMtm == KSenduiMtmMmsUid || entry.iMtm == KSenduiMMSNotificationUid )
+ {
+ MceUtils::GetMmsNumberL( entry, aSession, aPhoneNumber );
+ validNumber = CommonPhoneParser::IsValidPhoneNumber(
+ aPhoneNumber, CommonPhoneParser::ESMSNumber );
+ }
+ return validNumber;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::ValidPhoneNumberL
+// This is static function
+// Returns ETrue if phonenumber is valid
+// ---------------------------------------------------------
+//
+TBool MceUtils::ValidPhoneNumberL(
+ TMsvId aEntryId,
+ CMsvSession& aSession )
+ {
+ TPhCltTelephoneNumber number;
+
+
+ return MceUtils::ValidPhoneNumberL(
+ aEntryId,
+ aSession,
+ number,
+ NULL );
+ }
+
+// ----------------------------------------------------
+// MceUtils::GetSmsNumberL
+// Gets phone number from SMS entry
+// ----------------------------------------------------
+void MceUtils::GetSmsNumberL(
+ TMsvId aEntryId,
+ CMsvSession& aSession,
+ TPhCltTelephoneNumber& aNumber )
+ {
+ CMsvEntry* parentEntry = aSession.GetEntryL( aEntryId );
+ CleanupStack::PushL( parentEntry );
+ CPlainText* nullString = CPlainText::NewL();
+ CleanupStack::PushL( nullString );
+ CSmsHeader* header = CSmsHeader::NewL( CSmsPDU::ESmsDeliver, *nullString );
+ CleanupStack::PushL( header );
+ CMsvStore* store = parentEntry->ReadStoreL();
+ CleanupStack::PushL( store );
+ header->RestoreL( *store );
+ aNumber = header->FromAddress();
+ CleanupStack::PopAndDestroy( 4 ); // store, header, parentEntry, nullString
+ }
+
+// ----------------------------------------------------
+// MceUtils::GetMmsNumberL
+// Gets phone number from MMS entry
+// ----------------------------------------------------
+void MceUtils::GetMmsNumberL(
+ TMsvEntry& aEntry,
+ CMsvSession& aSession,
+ TPhCltTelephoneNumber& aNumber )
+ {
+ TMsvId id = aEntry.Id();
+ CClientMtmRegistry* mtmRegistry = CClientMtmRegistry::NewL( aSession );
+ CleanupStack::PushL( mtmRegistry );
+
+ CMmsClientMtm* mmsMtm = (CMmsClientMtm *) mtmRegistry->NewMtmL( aEntry.iMtm );
+ CleanupStack::PushL( mmsMtm );
+ mmsMtm->SwitchCurrentEntryL( aEntry.Id() );
+ mmsMtm->LoadMessageL();
+ TPtrC sender = mmsMtm->Sender();
+ aNumber = TMmsGenUtils::PureAddress( sender );
+ CleanupStack::PopAndDestroy( 2 ); // mtmRegistry, mmsMtm
+ }
+
+
+
+// ---------------------------------------------------------
+// MceUtils::StripAndAppendStringL
+// This is static function
+// ---------------------------------------------------------
+//
+void MceUtils::StripAndAppendStringL(
+ TDes& aTargetString,
+ const TDesC& aSourceString,
+ TInt aDescriptionLength )
+ {
+ TBool addThreeDots = EFalse;
+
+ if ( aDescriptionLength <= 0 )
+ {
+ aDescriptionLength = MceUtils::DescriptionLength();
+ }
+
+ TInt length = aSourceString.Left( aDescriptionLength ).Length();
+ if ( length == 0 )
+ {
+ // append space, needed by list box
+ aTargetString.Append( CEditableText::ESpace );
+ return;
+ }
+
+ if ( aSourceString.Length() > length )
+ {
+ length--;
+ addThreeDots = ETrue;
+ }
+
+ HBufC* tempString = aSourceString.Left( length ).AllocLC();
+ TPtr tempStringPtr = tempString->Des();
+ MceUtils::ReplaceCharacters( tempStringPtr );
+ aTargetString.Append( tempStringPtr );
+ CleanupStack::PopAndDestroy( tempString );
+ if ( addThreeDots )
+ {
+ aTargetString.Append( CEditableText::EEllipsis );
+ }
+ }
+
+
+// ---------------------------------------------------------
+// MceUtils::DescriptionLength
+// This is static function
+// ---------------------------------------------------------
+//
+TInt MceUtils::DescriptionLength()
+ {
+ TInt descriptionLength = KMceVisibleTextLength;
+ TRAPD( error, descriptionLength = MceUtils::DescriptionLengthL() );
+ if ( error != KErrNone )
+ {
+ descriptionLength = KMceVisibleTextLength;
+ }
+ return descriptionLength;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::DescriptionLengthL
+// This is static function
+// ---------------------------------------------------------
+//
+TInt MceUtils::DescriptionLengthL()
+ {
+ TInt descriptionLength = KMceVisibleTextLength;
+ CRepository* repository = CRepository::NewLC(KCRUidMuiuSettings);
+ if ( repository->Get(KMuiuDescriptionLength, descriptionLength) != KErrNone )
+ {
+ descriptionLength = KMceVisibleTextLength;
+ }
+ if ( descriptionLength < KMceVisibleTextLength )
+ {
+ descriptionLength = KMceVisibleTextLength;
+ }
+ // How to make sure it is sensible?
+ else if ( descriptionLength > 3*KMceVisibleTextLength )
+ {
+ descriptionLength = 3*KMceVisibleTextLength;
+ }
+ CleanupStack::PopAndDestroy( repository );
+ return descriptionLength;
+ }
+
+
+// ---------------------------------------------------------
+// MceUtils::IsMtmBuiltIn
+// This is static function
+// ---------------------------------------------------------
+//
+TBool MceUtils::IsMtmBuiltIn( TUid aMtmUid )
+ {
+ TBool mtmIsBuiltIn = EFalse;
+ switch ( aMtmUid.iUid )
+ {
+ case KSenduiMtmSmtpUidValue:
+ case KSenduiMtmImap4UidValue:
+ case KSenduiMtmPop3UidValue:
+ case KSenduiMtmSmsUidValue:
+ case KSenduiMtmMmsUidValue:
+ case KSenduiMtmIrUidValue:
+ case KSenduiMtmBtUidValue:
+ case KSenduiMtmPushMtmUidValue:
+ case KSenduiMtmSyncMLEmailUidValue:
+ case KSenduiMtmBioUidValue:
+ case KSenduiMtmRoUidValue:
+ case KSenduiMMSNotificationUidValue:
+ case KSenduiMtmPostcardUidValue:
+ case KSenduiMtmAudioMessageUidValue:
+ case KSenduiMtmUniMessageUidValue:
+ mtmIsBuiltIn = ETrue;
+ break;
+
+ default:
+ break;
+ }
+ return mtmIsBuiltIn;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::NumberGroupingEnabled
+// This is static function
+// ---------------------------------------------------------
+//
+TBool MceUtils::NumberGroupingEnabled()
+ {
+ TBool numberGroupingEnabled = EFalse;
+ TRAPD( error, numberGroupingEnabled = MceUtils::NumberGroupingEnabledL() );
+ if ( error != KErrNone )
+ {
+ numberGroupingEnabled = EFalse;
+ }
+ return numberGroupingEnabled;
+ }
+
+// ---------------------------------------------------------
+// MceUtils::NumberGroupingEnabledL
+// This is static function
+// ---------------------------------------------------------
+//
+TBool MceUtils::NumberGroupingEnabledL()
+ {
+ TInt numberGrouping = 0;
+ CRepository* repository = CRepository::NewL(KCRUidNumberGrouping);
+ // CleanupStack is not needed since no leavable functions below
+ if ( repository->Get(KNumberGrouping, numberGrouping) != KErrNone )
+ {
+ numberGrouping = 0;
+ }
+ delete repository;
+
+ // CenRep key KCRUidNumberGrouping / KNumberGrouping is used to check if
+ // number grouping is supported
+ return ( numberGrouping == 1 );
+// return FeatureManager::FeatureSupported( KFeatureIdPhoneNumberGrouping );
+ }
+
+
+
+// ---------------------------------------------------------
+// TMceFlags::TMceFlags
+// This is static function
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TMceFlags::TMceFlags()
+ :
+ iFlags( 0 )
+ {
+ }
+
+// End of File