emailservices/emailframework/src/CFSMailBrandManagerImpl.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
child 18 578830873419
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailframework/src/CFSMailBrandManagerImpl.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,639 @@
+/*
+* Copyright (c) 2007-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:  ES Protocol Framework branding manager interface definition
+*
+*/
+
+
+#include "emailtrace.h"
+#include <fsmailbrandmanager.rsg>
+#include <barsread.h>
+#include <bautils.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h> // CleanupResetAndDestroy
+// <gmail_brand_issue>
+#include <etelmm.h>
+#include <mmtsy_names.h>
+#include <startupdomainpskeys.h>
+#include <tzlocalizer.h> // CTzLocalizer
+#include <centralrepository.h>
+// </gmail_brand_issue>
+//<cmail>
+#include "CFSMailClient.h"
+//</cmail>
+
+#include "CFSMailBrandManagerImpl.h"
+#include "CFSMailBrand.h"
+
+
+const TInt KBrandArrayGranularity = 5;
+_LIT( KResourceFilePath,"\\resource\\fsmailbrandmanager.rsc" );
+
+// The following are needed to convert "Gmail" brand name to "Google Mail"
+// in certain countries.
+// <gmail_brand_issue>
+
+_LIT( KBrandNameGmail, "Gmail" );
+_LIT( KBrandNameGoogleMail, "Google Mail" );
+
+_LIT( KMCCGermany, "262" );
+_LIT( KMCCUK1, "234" );
+_LIT( KMCCUK2, "235" );
+
+const TUint8 KGermanyTzId = 36;
+const TUint8 KUKTzId = 104;
+
+const TInt KMCCValueMaxLength = 3;
+
+#ifdef __WINS__
+LOCAL_C void RetrieveNextToken( TDes8& aContent, TDes& aToken )	
+	{
+	_LIT8( KComma, "," );
+	TInt pos = aContent.Find( KComma );
+	if ( pos != KErrNotFound ) 
+		{
+		aToken.Copy( aContent.MidTPtr( 0, pos ) );
+		aContent.Copy(
+		    aContent.RightTPtr( aContent.Length() - pos - 1 ) );
+		}
+	}
+#endif // __WINS__
+// </gmail_brand_issue>
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::CFSMailBrandManagerImpl
+// -----------------------------------------------------------------------------
+CFSMailBrandManagerImpl::CFSMailBrandManagerImpl(
+    CFSMailClient& aMailClient ) :
+    iMailClient( aMailClient )
+	{
+    FUNC_LOG;
+
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::ConstructL
+// -----------------------------------------------------------------------------
+void CFSMailBrandManagerImpl::ConstructL()
+    {
+    FUNC_LOG;
+
+    // Read resource file, get the drive letter according to the DLL drive
+    TFileName dllFileName;
+    Dll::FileName( dllFileName );
+    
+ 	TParse parse;
+    User::LeaveIfError( parse.Set( KResourceFilePath, &dllFileName, NULL ) );
+    TFileName resourceFileName( parse.FullName() );
+
+    if ( !iFsSession.Handle() )
+        {
+        User::LeaveIfError( iFsSession.Connect() );
+        }
+
+    BaflUtils::NearestLanguageFile( iFsSession, resourceFileName );
+    
+    iResourceFile.OpenL( iFsSession, resourceFileName );
+        
+    iResourceFile.ConfirmSignatureL();
+
+    HBufC8* resourceBuffer = iResourceFile.AllocReadLC( R_BRANDING_DATA );
+
+    TResourceReader reader;
+    reader.SetBuffer( resourceBuffer );
+
+	ConstructFromResourceL( reader );
+
+    CleanupStack::PopAndDestroy( resourceBuffer );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::~CFSMailBrandManagerImpl
+// -----------------------------------------------------------------------------
+CFSMailBrandManagerImpl::~CFSMailBrandManagerImpl()
+	{
+    FUNC_LOG;
+	
+	iResourceFile.Close();
+    iFsSession.Close();
+	
+	if ( iBrands )
+		{
+		iBrands->ResetAndDestroy();
+		}
+	delete iBrands;
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::NewL
+// -----------------------------------------------------------------------------
+CFSMailBrandManagerImpl* CFSMailBrandManagerImpl::NewL(
+    CFSMailClient& aMailClient )
+    {
+    FUNC_LOG;
+    CFSMailBrandManagerImpl* self =
+        CFSMailBrandManagerImpl::NewLC( aMailClient );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::NewLC
+// -----------------------------------------------------------------------------
+CFSMailBrandManagerImpl* CFSMailBrandManagerImpl::NewLC(
+    CFSMailClient& aMailClient )
+    {
+    FUNC_LOG;
+    CFSMailBrandManagerImpl* self =
+        new( ELeave ) CFSMailBrandManagerImpl( aMailClient );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::UpdateMailboxNamesL
+// -----------------------------------------------------------------------------
+void CFSMailBrandManagerImpl::UpdateMailboxNamesL( const TFSMailMsgId aMailBoxId )
+    {
+    FUNC_LOG;
+    
+    // list all mailboxes
+    RPointerArray<CFSMailBox> mailBoxes;
+    CleanupResetAndDestroyPushL( mailBoxes );
+    iMailClient.ListMailBoxes( TFSMailMsgId(), mailBoxes );
+    // Check is there need to change the name of the mailbox
+    TPtrC name = GetTextL( EFSMailboxName, aMailBoxId);
+    // <gmail_brand_issue>
+    VerifyMailAccountName( name );
+    // </gmail_brand_issue>
+    if( name.Length() )
+        {
+        // check duplicates
+        TInt orderNumber(2);
+        TBool duplicate(ETrue);
+        HBufC* newName = HBufC::NewL(name.Length()+6);
+        TPtrC brandedName = name;
+        while(duplicate != EFalse)
+            {
+            duplicate = EFalse;
+            for(TInt i = 0; i < mailBoxes.Count( );i++)
+                {
+                if(brandedName == mailBoxes[i]->GetName() && 
+                   aMailBoxId != mailBoxes[i]->GetId( ))
+                    {
+                    duplicate = ETrue;
+                    newName->Des().Copy(name);
+                    newName->Des().Append(' ');
+                    newName->Des().Append('(');
+                    newName->Des().AppendNum(orderNumber++);
+                    newName->Des().Append(')');
+                    brandedName.Set(newName->Des());
+                    break;
+                    }
+                }
+            }
+        iMailClient.SetMailboxName(aMailBoxId,brandedName);
+        delete newName;
+        }
+    CleanupStack::PopAndDestroy( &mailBoxes );
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetGraphicL
+// -----------------------------------------------------------------------------
+CGulIcon* CFSMailBrandManagerImpl::GetGraphicL(
+    TFSBrandElement aElement, 
+	const TFSMailMsgId& aMailboxId )
+	{
+    FUNC_LOG;
+	CFSMailBox* mailBox( NULL );
+	TRAPD( mailboxError,
+	       mailBox = iMailClient.GetMailBoxByUidL( aMailboxId ) );
+	if ( mailboxError != KErrNone )
+	    {
+	    User::Leave( mailboxError );
+	    }	
+	User::LeaveIfNull( mailBox );
+	
+    CleanupStack::PushL( mailBox );    
+    TDesC& brandId = mailBox->GetBrandingIdL();
+
+	CFSMailBrand* brand = FindMatchingBrandL( brandId );
+	CleanupStack::PopAndDestroy( mailBox );
+	if ( brand == NULL )
+	    {
+	    return NULL;    
+	    }
+	
+	return brand->GetGraphicL( aElement );
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetGraphicL
+// -----------------------------------------------------------------------------
+CGulIcon* CFSMailBrandManagerImpl::GetGraphicL(
+    TFSBrandElement aElement, 
+    const TDesC& aBrandId )
+    {
+    FUNC_LOG;
+    CFSMailBrand* brand = FindMatchingBrandL( aBrandId );
+    if ( brand == NULL )
+        {
+        return NULL;    
+        }    
+    return brand->GetGraphicL( aElement );
+    }
+    
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetGraphicIdsL
+// -----------------------------------------------------------------------------
+TInt CFSMailBrandManagerImpl::GetGraphicIdsL(
+    TFSBrandElement aElement, 
+	const TFSMailMsgId& aMailboxId,
+    TDes& aIconIds  )
+	{
+    FUNC_LOG;
+	CFSMailBox* mailBox( NULL );
+	TRAPD( mailboxError,
+	       mailBox = iMailClient.GetMailBoxByUidL( aMailboxId ) );
+	if ( mailboxError != KErrNone )
+	    {
+	    User::Leave( mailboxError );
+	    }	
+	User::LeaveIfNull( mailBox );
+	
+    CleanupStack::PushL( mailBox );    
+    TDesC& brandId = mailBox->GetBrandingIdL();
+
+	CFSMailBrand* brand = FindMatchingBrandL( brandId );
+	CleanupStack::PopAndDestroy( mailBox );
+
+	if ( brand == NULL )
+	    {
+	    return KErrNotFound;
+	    }
+    return brand->GetGraphicIdsL( aElement, aIconIds );
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetTextL
+// -----------------------------------------------------------------------------
+TPtrC CFSMailBrandManagerImpl::GetTextL(
+    TFSBrandElement aElement,
+    const TFSMailMsgId& aMailboxId )
+	{
+    FUNC_LOG;
+	CFSMailBox* mailBox( NULL );
+	TRAPD( mailboxError,
+	       mailBox = iMailClient.GetMailBoxByUidL( aMailboxId ) );
+	if ( mailboxError != KErrNone )
+	    {
+	    User::Leave( mailboxError );
+	    }
+	    
+	User::LeaveIfNull( mailBox );
+    CleanupStack::PushL( mailBox );
+    TDesC& brandId = mailBox->GetBrandingIdL();
+	
+	CFSMailBrand* brand = FindMatchingBrandL( brandId );
+	CleanupStack::PopAndDestroy( mailBox );
+	if ( brand == NULL )
+	    {
+	    return KNullDesC();    
+	    }	
+	
+	return brand->GetText( aElement );
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetTextL
+// -----------------------------------------------------------------------------
+TPtrC CFSMailBrandManagerImpl::GetTextL(
+	TFSBrandElement aElement,
+	const TDesC& aBrandId )
+	{
+    FUNC_LOG;
+
+	CFSMailBrand* brand = FindMatchingBrandL( aBrandId );
+	if ( brand == NULL )
+	    {
+	    return KNullDesC();    
+	    }	
+
+	return brand->GetText( aElement );
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetColorL
+// -----------------------------------------------------------------------------
+TInt CFSMailBrandManagerImpl::GetColorL(
+    TFSBrandElement aElement,
+    const TFSMailMsgId& aMailboxId,
+    TRgb& aColor )
+	{
+    FUNC_LOG;
+	CFSMailBox* mailBox = iMailClient.GetMailBoxByUidL( aMailboxId );
+	User::LeaveIfNull( mailBox );
+    CleanupStack::PushL( mailBox );    
+    TDesC& brandId = mailBox->GetBrandingIdL();
+	
+	CFSMailBrand* brand = FindMatchingBrandL( brandId );
+	CleanupStack::PopAndDestroy( mailBox );
+	if ( brand == NULL )
+	    {
+	    return KErrNotFound;  
+	    }
+	    
+    return brand->GetColor( aElement, aColor );
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::ConstructFromResourceL
+// -----------------------------------------------------------------------------
+void CFSMailBrandManagerImpl::ConstructFromResourceL( TResourceReader& aReader )
+	{
+    FUNC_LOG;
+	iBrands = new ( ELeave )
+				CArrayPtrSeg< CFSMailBrand >( KBrandArrayGranularity );
+						
+	// Read White Label Brand from Cenrep
+	CFSMailBrand* newBrand = CFSMailBrand::NewLC( aReader, true );
+	iBrands->AppendL( newBrand );
+	CleanupStack::Pop( newBrand );
+	
+	
+	// Read general brands from resource file
+	TInt brandCount = aReader.ReadInt16();
+
+	for ( TInt i = 0; i < brandCount; i++ )
+		{
+		CFSMailBrand* newBrand = CFSMailBrand::NewLC( aReader, false );
+		iBrands->AppendL( newBrand );
+		CleanupStack::Pop( newBrand );
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::FindMatchingBrandL
+// -----------------------------------------------------------------------------
+CFSMailBrand* CFSMailBrandManagerImpl::FindMatchingBrandL( const TDesC& aBrandId )
+    {
+    FUNC_LOG;
+    if( aBrandId.Length() )
+        {
+        TInt brandCount( iBrands->Count() );
+        for ( TInt i( 0 ); i < brandCount; i++ )
+            {
+            if ( (*iBrands)[ i ]->IsMatching( aBrandId ) )
+                return (*iBrands)[ i ];
+            }
+        }
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::MailboxMatchingBrandIdL
+// -----------------------------------------------------------------------------
+CFSMailBox* CFSMailBrandManagerImpl::MailboxMatchingBrandIdL(
+    const TDesC& aBrandId ) const
+    {    
+    RPointerArray<CFSMailBox> mailboxes;
+
+    CleanupResetAndDestroyPushL( mailboxes );
+
+    iMailClient.ListMailBoxes( TFSMailMsgId(), mailboxes );
+
+    TInt mailboxCount( mailboxes.Count() );
+    TInt mailboxIndexer( 0 );
+    while ( mailboxIndexer < mailboxCount )
+        {
+        TDesC* brandId( NULL );
+        TRAPD( brandGetError,
+               brandId = &mailboxes[mailboxIndexer]->GetBrandingIdL() )
+        if ( brandGetError != KErrNone )
+            {
+            mailboxes.ResetAndDestroy();
+            User::Leave( brandGetError );
+            }
+            
+        if ( *brandId == aBrandId )
+            {
+            CFSMailBox* matchingMailbox = mailboxes[mailboxIndexer];
+            mailboxes.Remove( mailboxIndexer );
+            mailboxes.ResetAndDestroy();
+            return matchingMailbox;
+            }
+        
+        ++mailboxIndexer;
+        }
+        
+    CleanupStack::PopAndDestroy( &mailboxes );
+    User::Leave( KErrNotFound );
+    return NULL; // To prevent warning
+    }
+
+// <gmail_brand_issue>
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetMCCValueL
+// -----------------------------------------------------------------------------
+void CFSMailBrandManagerImpl::GetMCCValueL( TDes& aMcc ) const
+    {
+    aMcc.Zero();
+    
+    TInt err = KErrNone;
+
+#ifndef __WINS__
+
+    TBool isSimPresent = EFalse;
+    
+    TInt simStatus( 0 );
+
+	err = RProperty::Get( KPSUidStartup, KPSSimStatus, simStatus );
+
+	if ( err == KErrNone &&
+	        simStatus != ESimNotPresent &&
+	        simStatus != ESimNotSupported )
+	    {
+	    isSimPresent = ETrue;
+	    }
+
+    if ( isSimPresent )
+        {
+        // We cannot let the method leave here
+        TRAP( err, GetMCCValueFromSIML( aMcc ) );
+
+        // If reading from SIM fails one time try again after 0.5 secs
+        if ( err != KErrNone )
+            {
+            const TInt KHalfSecond = 500000;
+
+            User::After( KHalfSecond );
+            
+            err = KErrNone;
+
+            // We cannot let the method leave here
+            TRAP( err, GetMCCValueFromSIML( aMcc ) );
+            }
+        }
+
+#else // __WINS__
+
+    _LIT( KSIMInfo, "C:\\data\\Settings\\SIMInfo.txt" );
+
+    RFs fs;
+
+    User::LeaveIfError( fs.Connect() );
+
+    RFile simFile;
+
+    err = simFile.Open( fs, KSIMInfo(), EFileShareReadersOnly |
+                                        EFileStream |
+                                        EFileRead );
+    if ( err == KErrNone )
+        {
+        TBuf8<100> content;
+        TBuf<100> dummy;
+
+        simFile.Read( content );
+
+    	simFile.Close();
+
+    	fs.Close();
+
+        if ( content.Length() > 0 )
+        	{
+            RetrieveNextToken( content, dummy );
+            RetrieveNextToken( content, dummy );
+            RetrieveNextToken( content, dummy );
+            RetrieveNextToken( content, dummy );
+
+            RMobilePhone::TMobilePhoneSubscriberId subscriberId;
+
+            RetrieveNextToken( content, subscriberId );
+
+            if ( subscriberId.Length() >= KMCCValueMaxLength )
+                {
+                aMcc = subscriberId.Left( KMCCValueMaxLength );
+                }
+        	}
+        }
+
+#endif // __WINS__
+
+    }
+
+// ----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetMCCValueFromSIML
+// ----------------------------------------------------------------------------
+// 
+void CFSMailBrandManagerImpl::GetMCCValueFromSIML( TDes& aMcc ) const
+    {
+    RTelServer telServer;
+
+    CleanupClosePushL( telServer );
+
+    User::LeaveIfError( telServer.Connect() );
+
+    User::LeaveIfError( telServer.LoadPhoneModule( KMmTsyModuleName ) );
+    
+    RMobilePhone mobilePhone;
+
+    CleanupClosePushL( mobilePhone );
+
+    User::LeaveIfError( mobilePhone.Open( telServer, KMmTsyPhoneName ) );
+    
+    TRequestStatus status;
+
+    RMobilePhone::TMobilePhoneSubscriberId subscriberId;       
+
+    mobilePhone.GetSubscriberId( status, subscriberId );
+    
+    User::WaitForRequest( status );
+
+    User::LeaveIfError( status.Int() );
+    
+    CleanupStack::PopAndDestroy( &mobilePhone );
+
+    CleanupStack::PopAndDestroy( &telServer );
+
+    if ( subscriberId.Length() >= KMCCValueMaxLength )
+        {
+        aMcc = subscriberId.Left( KMCCValueMaxLength );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::GetCurrentCountryL
+// ----------------------------------------------------------------------------
+// 
+TUint8 CFSMailBrandManagerImpl::GetCurrentCountryL() const
+    {
+    CTzLocalizer* localizer = CTzLocalizer::NewLC();
+
+    CTzLocalizedCity* city = localizer->GetFrequentlyUsedZoneCityL(
+        CTzLocalizedTimeZone::ECurrentZone );
+        
+    CleanupStack::PushL( city );
+
+    CTzLocalizedCityGroup* cityGroup = 
+        localizer->GetCityGroupL( city->GroupId() );
+
+    TUint8 countryId = cityGroup->Id();
+    
+    delete cityGroup;
+    cityGroup = NULL;
+    
+    CleanupStack::PopAndDestroy( 2, localizer );
+    
+    return countryId;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailBrandManagerImpl::VerifyMailAccountName
+// -----------------------------------------------------------------------------
+void CFSMailBrandManagerImpl::VerifyMailAccountName(
+        TPtrC& aBrandedName ) const
+    {
+    // Due to legal reasons we don't show brand name "Gmail" in Germany and UK
+    if ( !aBrandedName.CompareF( KBrandNameGmail ) )
+        {
+        // First check timezone id
+        TUint8 timeZone = 0;
+        
+        TRAPD( err, timeZone = GetCurrentCountryL() );
+        
+        if ( err == KErrNone && ( timeZone == KGermanyTzId ||
+                                  timeZone == KUKTzId ) )
+            {
+            aBrandedName.Set( KBrandNameGoogleMail );
+            }
+        // Then if necessary check MCC
+        else
+            {
+            TBuf<KMCCValueMaxLength> mcc;
+
+            TRAPD( err2, GetMCCValueL( mcc ) );
+            
+            if ( err2 == KErrNone && ( mcc == KMCCGermany ||
+                                       mcc == KMCCUK1 ||
+                                       mcc == KMCCUK2 ) )
+                {
+                aBrandedName.Set( KBrandNameGoogleMail );
+                }
+            }
+
+        }
+    }
+// </gmail_brand_issue>