profilesservices/ProfileEngine/EngSrc/CProfileImpl.cpp
changeset 0 8c5d936e5675
child 8 f62c3a3d66b8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/profilesservices/ProfileEngine/EngSrc/CProfileImpl.cpp	Thu Dec 17 08:52:52 2009 +0200
@@ -0,0 +1,601 @@
+/*
+* 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:  Implementation of the CProfileImpl.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CProfileImpl.h"
+#include <e32svr.h>
+#include <cntitem.h>
+#include <CPbkContactEngine.h>
+#include <cntdb.h>
+#include <cntdef.h>
+#include <TProfileToneSettings.h>
+#include <MProfilePttSettings.h>
+#include <featmgr.h>
+#include <bldvariant.hrh>
+#include <RSSSettings.h>
+#include <pathinfo.h>
+#include "CProfileNameImpl.h"
+#include "CProfileTonesImpl.h"
+#include "CProfileExtraTonesImpl.h"
+#include "CProfileExtraSettingsImpl.h"
+#include "CProfilePresenceImpl.h"
+#include "MProfilesLocalFeatures.h"
+#include "MProfileUtilitySingleton.h"
+#include "ProfilesVariant.hrh"
+#include "ProfileEngUtils.h"
+#include "ProfileEnginePrivateCRKeys.h"
+#include <ProfileEngineDomainConstants.h>
+
+// CONSTANTS
+// Max. number of Alert for groups:
+const TInt KProfilesMaxAlertForGroups = 512;
+const TInt KProfilesMaxFlagsLength = 4;
+
+// FORWARD DECLARATIONS
+class CRepository;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::CProfileImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CProfileImpl::CProfileImpl( RFs& aFs )
+    : iFs( aFs )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::ConstructL()
+    {
+    CommonConstructL();
+    iProfileName = CProfileNameImpl::NewL();
+    iProfileTones = CProfileTonesImpl::NewL();
+    iProfileExtraTones = CProfileExtraTonesImpl::NewL();
+    iProfilePresence = CProfilePresenceImpl::NewL();
+    // ProfileUtility must be released in destructor:
+    iFeatures = &( ProfileUtilityInstanceL().ProfilesLocalFeatures() );
+    iProfileExtraSettings = CProfileExtraSettingsImpl::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::ConstructL(
+    const MProfileExtended& aProfile,
+    TInt aId )
+    {
+    iProfileName = CProfileNameImpl::NewLC( aId, KNullDesC );
+    CleanupStack::Pop();    // iProfileName
+    CommonConstructL();
+    iProfileTones = CProfileTonesImpl::NewL( aProfile.ProfileTones() );
+    iProfileExtraTones = CProfileExtraTonesImpl::NewL(
+        aProfile.ProfileExtraTones() );
+
+    iFeatures = &( ProfileUtilityInstanceL().ProfilesLocalFeatures() );
+
+    iProfileExtraSettings = CProfileExtraSettingsImpl::NewL();
+    iProfilePresence = CProfilePresenceImpl::NewL(
+        aProfile.ProfilePresence() );
+    iVisibleFlags = aProfile.VisibleFlags();
+    iModifiableFlags = aProfile.ModifiableFlags();
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CProfileImpl* CProfileImpl::NewL(
+    RFs& aFs )
+    {
+    CProfileImpl* self = NewLC( aFs );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CProfileImpl* CProfileImpl::NewLC(
+    RFs& aFs )
+    {
+    CProfileImpl* self = new( ELeave ) CProfileImpl( aFs );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CProfileImpl* CProfileImpl::NewLC(
+    RFs& aFs,
+    const MProfileExtended& aProfile,
+    TInt aId )
+    {
+    CProfileImpl* self = new( ELeave ) CProfileImpl( aFs );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aProfile, aId );
+
+    return self;
+    }
+
+// Destructor
+CProfileImpl::~CProfileImpl()
+    {
+    delete iSilentTone;
+    iAlertFor.Close();
+
+    delete iProfileExtraSettings;
+    
+    if ( iFeatures )
+        {
+        ReleaseProfileUtility();  
+        }
+        
+    delete iProfileName;
+    delete iProfileTones;
+    delete iProfileExtraTones;
+    delete iProfilePresence;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::IsProfileNameChanged
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CProfileImpl::IsProfileNameChanged() const
+    {
+    return iProfileName->IsProfileNameChanged();
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::SetLocalizedProfileNameL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::SetLocalizedProfileNameL(
+    const MProfilesNamesArray& aNameArray )
+    {
+    iProfileName->SetLocalizedProfileNameL( aNameArray );
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::SetLocalizedProfileNameL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::SetLocalizedProfileNameL( const CProfileNameImpl& aNameImpl,
+                                             const TDesC& aUniquePart )
+    {
+    iProfileName->SetLocalizedProfileNameL( aNameImpl, aUniquePart );
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::AlertForL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TArray<TContactItemId> CProfileImpl::AlertForL()
+    {
+    TInt contactIdListCount( iAlertFor.Count() );
+    if( contactIdListCount > 0 )
+        {
+        // create CPbkContactEngine
+        CPbkContactEngine* contactEngine = CPbkContactEngine::NewL( &iFs );
+        CleanupStack::PushL( contactEngine );
+        CContactIdArray* groupIds = contactEngine->Database().GetGroupIdListL();
+
+        if( !groupIds )
+            { // There are no groups in Contacts db -> clear the alert for IDs:
+            iAlertFor.Reset();
+            }
+        else
+            {
+            CleanupStack::PushL( groupIds );
+            TInt err;
+            for( TInt i( 0 ) ; i < contactIdListCount ; ++i )
+                {
+                err = groupIds->Find( iAlertFor[i] );
+
+                if( err == KErrNotFound )
+                    {
+                    // remove this
+                    iAlertFor.Remove( i );
+                    --contactIdListCount;
+                    --i;
+                    err = KErrNone;
+                    }
+                User::LeaveIfError( err );
+                }
+            CleanupStack::PopAndDestroy();  // groupIds
+            }
+        CleanupStack::PopAndDestroy();  // contactEngine
+        }
+
+    return iAlertFor.Array();
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::IsSilent
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CProfileImpl::IsSilent() const
+    {
+    TProfileRingingType ringType( iProfileTones->ToneSettings().iRingingType );
+    if ( ringType == EProfileRingingTypeSilent )
+        {
+        // If ringing type is silent, the whole profile is considered as silent:
+        return ETrue;
+        }
+
+    if ( ringType == EProfileRingingTypeBeepOnce )
+        {
+        // If ringing type is beep once, the profile can not be silent:
+        return EFalse;
+        }
+
+    TBool isSilent( EFalse );
+    TInt als( ESSSettingsAlsNotSupported );
+    ProfileEngUtils::GetAlternateLineService( als );
+
+    switch( als )
+        {
+        case ESSSettingsAlsAlternate:
+            {
+            const TDesC& ringingTone2 = iProfileTones->RingingTone2();
+            isSilent = ( ( ringingTone2.CompareF( KNullDesC ) == 0 ) ||
+                         ( ringingTone2.CompareF( *iSilentTone ) == 0 ) );
+                         
+            break;
+            }
+        case ESSSettingsAlsPrimary:  // Fall through
+        default: // = ESSSettingsAlsNotSupported
+            {
+            const TDesC& ringingTone1 = iProfileTones->RingingTone1();
+            isSilent = ( ( ringingTone1.CompareF( KNullDesC ) == 0 ) ||
+                         ( ringingTone1.CompareF( *iSilentTone ) == 0 ) );
+                         
+            break;
+            }
+        }
+
+    isSilent &= ( iProfileTones->MessageAlertTone().CompareF
+                        ( *iSilentTone ) == 0 );
+
+    if( iAlwaysOnLineEmail )
+        {
+        // Email is supported
+        const TDesC& emailTone = iProfileExtraTones->EmailAlertTone();
+        isSilent &= ( ( emailTone.CompareF( KNullDesC ) == 0 ) ||
+                      ( emailTone.CompareF( *iSilentTone ) == 0 ) );
+        }
+    if( iFeatures->IsFeatureSupported( KProEngFeatureIdVTRingingTone ) )
+        {
+        // VT ringing tone is supported
+        const TDesC& vtTone = iProfileExtraTones->VideoCallRingingTone();
+        isSilent &= ( ( vtTone.CompareF( KNullDesC ) == 0 ) ||
+                     ( vtTone.CompareF( *iSilentTone ) == 0 ) );
+        }
+    if( iOmaPoc )
+        {
+        // POC ringing tone is supported
+        const TDesC& pocTone = iProfileExtraSettings->ProfilePttSettings()
+            .PttRingingTone();
+        isSilent &= ( ( pocTone.CompareF( KNullDesC ) == 0 ) ||
+                     ( pocTone.CompareF( *iSilentTone ) == 0 ) );
+        }
+    return isSilent;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileSetName
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MProfileSetName& CProfileImpl::ProfileSetName() const
+    {
+    return *iProfileName;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileSetTones
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MProfileSetTones& CProfileImpl::ProfileSetTones() const
+    {
+    return *iProfileTones;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfilePresence
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const MProfilePresence& CProfileImpl::ProfilePresence() const
+    {
+    return *iProfilePresence;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileSetPresence
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MProfileSetPresence& CProfileImpl::ProfileSetPresence() const
+    {
+    return *iProfilePresence;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileSetExtraTones
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MProfileSetExtraTones& CProfileImpl::ProfileSetExtraTones() const
+    {
+    return *iProfileExtraTones;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileSetExtraSettings
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MProfileSetExtraSettings& CProfileImpl::ProfileSetExtraSettings() const
+    {
+    return *iProfileExtraSettings;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileName
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const MProfileName& CProfileImpl::ProfileName() const
+    {
+    return *iProfileName;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileTones
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const MProfileTones& CProfileImpl::ProfileTones() const
+    {
+    return *iProfileTones;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileExtraTones
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const MProfileExtraTones& CProfileImpl::ProfileExtraTones() const
+    {
+    return *iProfileExtraTones;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ProfileExtraSettings
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const MProfileExtraSettings& CProfileImpl::ProfileExtraSettings() const
+    {
+    return *iProfileExtraSettings;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::Release
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::Release()
+    {
+    delete this;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::ModifiableFlags
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CProfileImpl::ModifiableFlags() const
+    {
+    return iModifiableFlags;
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::VisibleFlags
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CProfileImpl::VisibleFlags() const
+    {
+    return iVisibleFlags;
+    }
+
+void CProfileImpl::InternalizeL( CRepository& aCenRep, TInt aProfileId )
+    {
+    TBuf8< KProfilesMaxFlagsLength > flags;
+    // Flags
+    User::LeaveIfError(
+            aCenRep.Get( ProfileEngUtils::ResolveKey( KProEngModifiableFlags,
+            aProfileId ), flags ) );
+    ProfileEngUtils::GetUint32Presentation( iModifiableFlags, flags, 0 );
+
+    flags.Zero();
+    User::LeaveIfError(
+            aCenRep.Get( ProfileEngUtils::ResolveKey(
+            KProEngVisibleFlags, aProfileId ), flags ) );
+    ProfileEngUtils::GetUint32Presentation( iVisibleFlags, flags, 0 );
+
+    // Profile name and id
+    iProfileName->InternalizeL( aCenRep, aProfileId );
+
+    // Alert for
+    ProfileEngUtils::GetBinarySettingL( aCenRep, ProfileEngUtils::ResolveKey(
+            KProEngAlertForGroups, aProfileId ), iAlertForBuf );
+            
+    TInt count( iAlertForBuf.Length() );
+    const TInt KProEngContactIdLength( 4 );
+    const TInt KProEngThreeByteShift( 24 );
+    const TInt KProEngTwoByteShift( 16 );
+    const TInt KProEngOneByteShift( 8 );
+
+    for( TInt i( 0 ); i < count ; i+=KProEngContactIdLength )
+        {
+        TUint32 id( ( iAlertForBuf[i] << KProEngThreeByteShift ) |
+                    ( iAlertForBuf[i+1] << KProEngTwoByteShift ) |
+                    ( iAlertForBuf[i+2] << KProEngOneByteShift ) |
+                    ( iAlertForBuf[i+3] ) );
+        User::LeaveIfError( iAlertFor.Append( TContactItemId( id ) ) );
+        }
+    iAlertFor.Compress();
+    iAlertForBuf.Zero();
+
+    // Profile tones and presence
+    iProfileTones->InternalizeL( aCenRep, aProfileId );
+    iProfileExtraTones->InternalizeL( aCenRep, aProfileId );
+
+    iProfilePresence->InternalizeL( aCenRep, aProfileId );
+    iProfileExtraSettings->InternalizeL( aCenRep, aProfileId );
+    }
+
+void CProfileImpl::ExternalizeL( CRepository& aCenRep )
+    {
+    TInt profileId = iProfileName->Id();
+
+    // Flags aren't externalized because they should not be modified in runtime
+
+    // Profile name and id
+    iProfileName->ExternalizeL( aCenRep );
+
+    // Alert for
+    iAlertForBuf.Zero();
+    TInt count( iAlertFor.Count() );
+    for( TInt i( 0 ) ; i < count ; ++i )
+        {
+        TContactItemId id( iAlertFor[i] );
+        TUint8 pieceOfId( ( iAlertFor[i] >> 24 ) & 0x000000FF );
+        iAlertForBuf.Append( pieceOfId );
+        pieceOfId = ( iAlertFor[i] >> 16 & 0x000000FF );
+        iAlertForBuf.Append( pieceOfId );
+        pieceOfId = ( iAlertFor[i] >> 8 & 0x000000FF );
+        iAlertForBuf.Append( pieceOfId );
+        pieceOfId = ( iAlertFor[i] & 0x000000FF );
+        iAlertForBuf.Append( pieceOfId );
+        }
+    User::LeaveIfError(
+            aCenRep.Set( ProfileEngUtils::ResolveKey( KProEngAlertForGroups,
+            profileId ), iAlertForBuf ) );
+    iAlertForBuf.Zero();
+
+    // Tones and presence
+    iProfileTones->ExternalizeL( aCenRep, profileId );
+    iProfileExtraTones->ExternalizeL( aCenRep, profileId );
+    iProfilePresence->ExternalizeL( aCenRep, profileId );
+    iProfileExtraSettings->ExternalizeL( aCenRep, profileId );
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::SetAlertForL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::SetAlertForL( const TArray<TContactItemId>& aAlertFor )
+    {
+    TInt count( aAlertFor.Count() );
+    if( count > KProfilesMaxAlertForGroups )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    iAlertFor.Reset();
+
+    for( TInt i( 0 ) ; i < count ; ++i )
+        {
+        User::LeaveIfError( iAlertFor.Append( aAlertFor[i] ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CProfileImpl::CommonConstructL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CProfileImpl::CommonConstructL()
+    {
+    RBuf toneBuf;
+    toneBuf.CreateL( KMaxFileName );
+    CleanupClosePushL( toneBuf );
+    toneBuf.Copy( TParsePtrC( PathInfo::RomRootPath() ).Drive() );
+    toneBuf.Append( KProfileNoSoundPath );
+
+    iSilentTone = toneBuf.AllocL();
+    CleanupStack::PopAndDestroy(); // toneBuf
+
+    FeatureManager::InitializeLibL();
+    iAlwaysOnLineEmail = FeatureManager::FeatureSupported( KFeatureIdAlwaysOnLineEmail );
+    iOmaPoc = FeatureManager::FeatureSupported( KFeatureIdOmaPoc );
+    FeatureManager::UnInitializeLib();
+    }
+
+//  End of File