calendarui/settings/settingsui/src/calensetting.cpp
changeset 0 f979ecb2b13e
child 25 bf573002ff72
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/settings/settingsui/src/calensetting.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,762 @@
+/*
+* 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:   CCalenSetting has Calendar setting data.
+ *
+*/
+
+
+//debug
+#include "calendarui_debug.h"
+
+//  INCLUDE FILES
+#include "calensetting.h"
+#include "CalendarVariant.hrh"
+#include "calencustomisationmanager.h"
+
+
+#include <AknUtils.h>
+
+
+#include <centralrepository.h>
+#include "CalendarPrivateCRKeys.h"  // includes CalendarInternalCRKeys.h
+
+const TInt KDefaultSnoozeTime( 5 ); // minutes
+const TInt KComma( ',' );
+const TInt KBoolCharTrue( '1' ); // character representing true in string.
+const TInt KBoolCharFalse( '0' ); // character representing false in string.
+
+const TInt KBufferStartingSize( 64 ); // initial size of buffer read from repository.
+const TInt KBufferSizeIncrement( 32 ); // buffer increases by this amount until we successfully read
+const TInt KCharsPerPlugin( 10 + 1 + 1 + 1 ); // [int - plugin uid] [comma] [1 or 0, plugin enabled] [comma]
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CCalenController::InstanceL
+// Returns a pointer to the single instance of the settings object.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CCalenSetting* CCalenSetting::InstanceL()
+    {
+    TRACE_ENTRY_POINT;
+
+    CCalenSetting* self = NULL;
+    TAny* tlsPtr = Dll::Tls();
+
+    // Check Thread local storage
+    if ( !tlsPtr )
+        {
+        // TLS is NULL, so no CCalenController has been created yet.
+        self = new( ELeave ) CCalenSetting();
+        CleanupStack::PushL( self );
+        // Store a self pointer in TLS
+        User::LeaveIfError( Dll::SetTls( static_cast<TAny*>( self ) ) );
+        // Increment ref count right away. If we don't do it here, and someone
+        // calls CCalenSetting::InstanceL in LoadL and then LoadL
+        // leaves, we will double delete the settings.
+        ++self->iRefCount;
+        self->LoadL();
+        CleanupStack::Pop( self );
+        }
+    else
+        {
+        self = static_cast<CCalenSetting*>( tlsPtr );
+        ++self->iRefCount;
+        }
+
+    TRACE_EXIT_POINT;
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::CCalenSetting
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+//
+CCalenSetting::CCalenSetting()
+    : iWeekFormat( EMonday ),
+      iWeekTitle( EWeekTitleNumber ),
+      iSnoozeTime( KDefaultSnoozeTime ),
+      iToolbar(1)
+
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::Release
+// Decrement the reference count of this singleton.
+// When the reference count is 0, the controller will self delete and free
+// all resources
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::Release()
+    {
+    TRACE_ENTRY_POINT;
+
+    --iRefCount;
+    if ( iRefCount == 0 )
+        {
+        delete this;
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::~CCalenSetting
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CCalenSetting::~CCalenSetting()
+    {
+    TRACE_ENTRY_POINT;
+
+    Dll::SetTls( NULL );
+    iPluginAvailability.Reset();
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::PluginAvailabilityL
+// Returns array of plugins known to be enabled or disabled.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CCalenCustomisationManager::CCalenPluginStatusArray&
+                                      CCalenSetting::PluginAvailability()
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    return iPluginAvailability;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::DefaultView
+// Return default view
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TUid CCalenSetting::DefaultView() const
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    return iDefaultView;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::WeekFormat
+// Return setting type of week format
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TDay CCalenSetting::WeekFormat() const
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    return iWeekFormat;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::WeekTitle
+// Return setting type of week title
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TCalenWeekTitle CCalenSetting::WeekTitle() const
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    return iWeekTitle;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SnoozeTime
+// Return the snooze time setting.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CCalenSetting::SnoozeTime() const
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    return iSnoozeTime;
+    }
+
+
+// ---------------------------------------------------------
+// CCalenSetting::Toolbar
+// Return the snooze time setting.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CCalenSetting::Toolbar()
+    {
+    TRACE_ENTRY_POINT;
+
+    if(AknLayoutUtils::PenEnabled())
+        {
+      
+        TRACE_EXIT_POINT;
+        return iToolbar;
+        }
+    else
+        {
+        TRACE_EXIT_POINT;
+        return 0;
+        }
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::RemovePluginsNoLongerInstalled
+// Checks the list of enabled/disabled plugins (iPluginAvailability), and if
+// any are no longer installed, remove them from the list.
+// Returns ETrue if action taken, EFalse otherwise.
+// ----------------------------------------------------------------------------
+//
+TBool CCalenSetting::RemovePluginsNoLongerInstalled( const RImplInfoPtrArray& aAvailablePlugins )
+    {
+    TRACE_ENTRY_POINT;
+
+    TBool actionTaken( EFalse );
+    TBool found;
+
+    for ( TInt i( iPluginAvailability.Count()-1 ); i>=0; --i )
+        {
+        found = EFalse;
+        for ( TInt j( 0 ); j<aAvailablePlugins.Count(); ++j )
+            {
+            if ( aAvailablePlugins[j]->ImplementationUid() == iPluginAvailability[i].iUid )
+                {
+                found = ETrue;
+                break;
+                }
+            }
+
+        if ( !found )
+            {
+            // The settings list contains a plugin not in the implementation list. Remove it.
+            iPluginAvailability.Remove( i );
+            actionTaken = ETrue;
+            }
+        }
+
+    TRACE_EXIT_POINT;
+    return actionTaken;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::AddPluginsNewlyInstalledL
+// Checks the list of enabled/disabled plugins (iPluginAvailability) against
+// the given array of available plugins, and if any plugins are not in the
+// availability list, add them.
+// Returns ETrue if action taken, EFalse otherwise.
+// ----------------------------------------------------------------------------
+//
+TBool CCalenSetting::AddPluginsNewlyInstalledL( const RImplInfoPtrArray& aAvailablePlugins,
+                                                        CCalenCustomisationManager& aCustomisationManager)
+    {
+    TRACE_ENTRY_POINT;
+
+    TBool actionTaken( EFalse );
+    TBool found;
+
+    for ( TInt i( 0 ); i<aAvailablePlugins.Count(); ++i )
+        {
+        found = EFalse;
+
+        for ( TInt j( 0 ); j<iPluginAvailability.Count(); ++j )
+            {
+            if ( aAvailablePlugins[i]->ImplementationUid() == iPluginAvailability[j].iUid )
+                {
+                found = ETrue;
+                break;
+                }
+            }
+
+        if ( !found )
+            {
+            // The plugin implementation isn't in the settings list. Add it.
+            CCalenCustomisationManager::TCalenPluginAvailability newPlugin;
+            newPlugin.iUid = aAvailablePlugins[i]->ImplementationUid();
+            newPlugin.iEnabled = ETrue;
+            
+            if(aCustomisationManager.CanBeEnabledDisabledL(newPlugin.iUid))
+                {
+                iPluginAvailability.AppendL( newPlugin );
+                actionTaken = ETrue;
+                }
+           }
+        }
+
+    TRACE_EXIT_POINT;
+    return actionTaken;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::UpdatePluginListL
+// Updates the stored list of enabled/disabled plugins. This should be called
+// when calendar starts and when any plugins are installed or uninstalled.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::UpdatePluginListL( CCalenCustomisationManager& aCustomisationManager )
+    {
+    TRACE_ENTRY_POINT;
+
+    // Get the list of plugins which exist.
+    const RImplInfoPtrArray& availablePlugins = aCustomisationManager.PluginInfoArray();
+
+    // Update the enabled/disabled plugin list. We might have had plugins
+    // added or removed...
+
+    // ...a plugin which was around but then got uninstalled should be removed
+    // from our enabled/disabled list (otherwise the list could grow to be huge).
+    const TBool anyRemoved = RemovePluginsNoLongerInstalled( availablePlugins );
+
+    // ...a new plugin should be enabled by default.
+    const TBool anyAdded = AddPluginsNewlyInstalledL( availablePlugins,aCustomisationManager );
+
+    // Update the cenrep when necessary.
+    if ( anyRemoved || anyAdded )
+        {
+        CRepository *rep = CRepository::NewL( KCRUidCalendar );
+        CleanupStack::PushL( rep );
+        SavePluginListL( *rep );
+        CleanupStack::PopAndDestroy( rep );
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::SetPluginStatusL
+// Sets a plugin on or off.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetPluginStatusL( TUid aPluginUid, TBool aEnabled )
+    {
+    TRACE_ENTRY_POINT;
+
+#ifdef _DEBUG
+    TBool found = EFalse;
+#endif // _DEBUG
+
+    for ( TInt i( 0 ); i<iPluginAvailability.Count(); ++i )
+        {
+        if ( iPluginAvailability[i].iUid == aPluginUid )
+            {
+            iPluginAvailability[i].iEnabled = aEnabled;
+#ifdef _DEBUG
+            found = ETrue;
+#endif // _DEBUG
+            break;
+            }
+        }
+
+    // Plugin list should always be up to date. If this fails,
+    // UpdatePluginListL wasn't called when plugins were installed/uninstalled.
+    ASSERT( found );
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::SavePluginListL
+// Saves the list of enabled/disabled plugins.
+// ----------------------------------------------------------------------------
+//
+void CCalenSetting::SavePluginListL( CRepository& aRepository ) const
+    {
+    TRACE_ENTRY_POINT;
+
+    RBuf buf;
+    CleanupClosePushL( buf );
+    buf.CreateL( KCharsPerPlugin * iPluginAvailability.Count() );
+    PopulateBufferFromPluginAvailabilityL( buf );
+
+    User::LeaveIfError( aRepository.Set( KCalendarPluginAvailability, buf ) );
+
+    CleanupStack::PopAndDestroy( &buf );
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::BoolFromStringL
+// Converts a character to a bool.
+// ----------------------------------------------------------------------------
+//
+static TBool BoolFromCharL( const TChar& aChar )
+    {
+    TRACE_ENTRY_POINT;
+
+    TBool ret;
+    if ( aChar == KBoolCharTrue )
+        {
+        ret = ETrue;
+        }
+    else
+        {
+        ASSERT( aChar == KBoolCharFalse );
+        ret = EFalse;
+        }
+
+    TRACE_EXIT_POINT;
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::UidFromStringL
+// Converts a string to a uid.
+// ----------------------------------------------------------------------------
+//
+static TUid UidFromStringL( const TDesC& aString )
+    {
+    TRACE_ENTRY_POINT;
+
+    // Convert the string to an int first.
+    TLex lex( aString );
+    TInt val;
+    User::LeaveIfError( lex.Val( val ) );
+    TUid uid = TUid::Uid( val );
+
+    TRACE_EXIT_POINT;
+    return uid;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::PopulatePluginAvailabilityFromBufferL
+// Converts from a text string into a plugin availability array.
+// ----------------------------------------------------------------------------
+//
+void CCalenSetting::PopulatePluginAvailabilityFromBufferL( const TDesC& aBuf )
+    {
+    TRACE_ENTRY_POINT;
+
+    // Calling Reset would give us an invalid array.
+    iPluginAvailability.Reset();
+
+    TPtrC marker = aBuf;
+    TInt uidOffset;
+
+    // aBuf should be of the format "uid,enabled,uid,enabled[etc]"
+    // e.g. "12345,1,67890,0" would be uid 12345 enabled, uid 67890 disabled.
+    while( ( uidOffset = marker.Locate( TChar( KComma ) ) ) != KErrNotFound )
+        {
+        TUid uid = UidFromStringL( marker.Left( uidOffset ) );
+        // Set marker to one char after the comma.
+        marker.Set( marker.Mid( uidOffset+1 ) );
+
+        TInt enabledOffset = marker.Locate( TChar( KComma ) );
+        // If this assert fails, a uid was added but no bool followed it.
+        ASSERT( enabledOffset != KErrNotFound );
+        TBool enabled = BoolFromCharL( marker[0] );
+        // One after the enabled value.
+        marker.Set( marker.Mid( enabledOffset+1 ) );
+
+        CCalenCustomisationManager::TCalenPluginAvailability availability;
+        availability.iUid = uid;
+        availability.iEnabled = enabled;
+        iPluginAvailability.AppendL( availability );
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenSetting::PopulateBufferFromPluginAvailabilityL
+// Converts from a plugin availability array into a text string.
+// ----------------------------------------------------------------------------
+//
+void CCalenSetting::PopulateBufferFromPluginAvailabilityL( RBuf& aBuf ) const
+    {
+    TRACE_ENTRY_POINT;
+
+    // At the end of this function, aBuf should be of the format
+    // "uid,enabled,uid,enabled[etc]" e.g. "12345,1,67890,0" would be
+    // uid 12345 enabled, uid 67890 disabled.
+    for ( TInt i( 0 ); i<iPluginAvailability.Count(); ++i )
+        {
+        aBuf.AppendNum( iPluginAvailability[i].iUid.iUid );
+        aBuf.Append( KComma );
+        TChar enabled = iPluginAvailability[i].iEnabled ?
+                    KBoolCharTrue : KBoolCharFalse;
+        aBuf.Append( enabled );
+        aBuf.Append( KComma );
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetDefaultView
+// Set default view
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetDefaultView( TUid aDefView )
+    {
+    TRACE_ENTRY_POINT;
+
+    iDefaultView = aDefView;
+
+    TRACE_EXIT_POINT;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetWeekFormat
+// Set startday of week
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetWeekFormat( TDay aDay )
+    {
+    TRACE_ENTRY_POINT;
+
+    iWeekFormat = aDay;
+
+    TRACE_EXIT_POINT;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetWeekTitle
+// Set week title
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetWeekTitle( TCalenWeekTitle aTitle )
+    {
+    TRACE_ENTRY_POINT;
+
+    iWeekTitle = aTitle;
+
+    TRACE_EXIT_POINT;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetSnoozeTime
+// Return the snooze time setting.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetSnoozeTime( TInt aSnoozeTime )
+    {
+    TRACE_ENTRY_POINT
+
+    iSnoozeTime = aSnoozeTime;
+
+    TRACE_EXIT_POINT
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetToolbar
+// Return the snooze time setting.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetToolbar( TInt aShown )
+    {
+    TRACE_ENTRY_POINT;
+
+    iToolbar = aShown;
+  
+    TRACE_EXIT_POINT;
+    }
+
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::LoadL()
+    {
+    TRACE_ENTRY_POINT;
+
+    // 'Calendar alarm tone' is loaded and saved in CalenFileListSettingItem
+
+    // 'First day of week' is read from TLocale
+    TLocale locale;
+    iWeekFormat = locale.StartOfWeek();
+
+    // other settings are stored in central repository
+    CRepository* repository = CRepository::NewL( KCRUidCalendar );
+    CleanupStack::PushL( repository );
+
+    // There's no real way of telling how big this buffer needs to be. If we
+    // get an overflow we'll just try again with a bigger buffer.
+    TInt bufSize( KBufferStartingSize );
+    TBool wasRead( EFalse );
+
+    do
+        {
+        RBuf buf;
+        CleanupClosePushL( buf );
+        buf.CreateL( bufSize );
+
+        TInt err = repository->Get( KCalendarPluginAvailability, buf );
+
+        if ( err == KErrNone )
+            {
+            wasRead = ETrue;
+            PopulatePluginAvailabilityFromBufferL( buf );
+            }
+        else if ( err == KErrOverflow )
+            {
+            bufSize += KBufferSizeIncrement;
+            }
+        else
+            {
+            // If err is KErrNotFound (-1) then your repository files probably
+            // aren't set up correctly. (If on the emulator, be sure
+            // \epoc32\winscw\c\private\10202be9\persists\101f874b.cre
+            // is up to date.)
+            User::Leave( err );
+            }
+
+        CleanupStack::PopAndDestroy( &buf );
+        } while ( !wasRead );
+
+    TInt tmp;
+    // TViewType maps
+    // [ENotSet, EMonthView, EWeekView, EDayView, EToDoView to [0..4]
+    // Central Repository data differs:
+    // [EMonthView, EWeekView, EDayView, EToDoView] to [0..3]
+    User::LeaveIfError( repository->Get( KCalendarDefaultStartView, tmp ) );
+    iDefaultView.iUid = tmp;
+
+    // TCalenWeekTitle maps [EWeekTitleNumber,EWeekTitleDuration] to [0,1]
+    // Central Repository data matches.
+    User::LeaveIfError( repository->Get( KCalendarWeekViewTitle, tmp ) );
+    iWeekTitle = static_cast<TCalenWeekTitle>( tmp );
+
+    User::LeaveIfError( repository->Get( KCalendarSnoozeTime, tmp ) );
+    iSnoozeTime = tmp;
+
+    CleanupStack::PopAndDestroy( repository );
+
+    TRACE_EXIT_POINT
+    }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SaveL() const
+    {
+    TRACE_ENTRY_POINT;
+
+    // 'Calendar alarm tone' is loaded and saved in CalenFileListSettingItem
+
+    TLocale locale;
+
+    // 'First day of week' is saved in TLocale
+    if ( locale.StartOfWeek() != iWeekFormat )
+        {
+        locale.SetStartOfWeek( iWeekFormat );
+        locale.Set();
+        }
+
+    // other settings are stored in central repository
+    CRepository* repository = CRepository::NewL( KCRUidCalendar );
+    CleanupStack::PushL( repository );
+
+    SavePluginListL( *repository );
+
+    // TViewType maps
+    // [ENotSet, EMonthView, EWeekView, EDayView, EToDoView to [0..4]
+    // Central Repository data differs:
+    // [EMonthView, EWeekView, EDayView, EToDoView] to [0..3]
+    //ASSERT( iDefaultView > 0 );
+    TInt tmp( static_cast<TInt>( iDefaultView.iUid ) );
+    User::LeaveIfError( repository->Set( KCalendarDefaultStartView, tmp ) );
+
+    // TCalenWeekTitle maps [EWeekTitleNumber,EWeekTitleDuration] to [0,1]
+    // Central Repository data matches.
+    tmp = static_cast<TCalenWeekTitle>( iWeekTitle );
+    User::LeaveIfError( repository->Set( KCalendarWeekViewTitle, tmp ) );
+
+    tmp = iSnoozeTime;
+    User::LeaveIfError( repository->Set( KCalendarSnoozeTime, tmp ) );
+
+    CleanupStack::PopAndDestroy( repository );
+    TRACE_EXIT_POINT;
+	}
+
+
+#ifdef RD_CALEN_EXTERNAL_CAL
+// ---------------------------------------------------------
+// CCalenSetting::ExtCalendar
+// Return cenrep value of external calendar availability
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CCalenSetting::ExtCalendar() const
+    {
+    TRACE_ENTRY_POINT;
+
+    TInt enabled( 0 );
+    CRepository* repository = NULL;
+
+    PIM_TRAPD_HANDLE( (repository = CRepository::NewL( KCRUidCalenUIExtensions )) );
+
+    if( repository )
+        {
+        repository->Get( KCalenExternalCalendarEnabled, enabled );
+        delete repository;
+        }
+
+    // If value is other than 0/1 for some reason then it is possible to
+    // add limitation to here. Should not be needed ever.
+    TRACE_EXIT_POINT;
+    return enabled;
+    }
+
+// ---------------------------------------------------------
+// CCalenSetting::SetExtCalendar
+// Return 1 if external calendar is available. This value
+// is used as a index for enumeration items.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CCalenSetting::SetExtCalendar(TInt aEnabled)
+    {
+    TRACE_ENTRY_POINT;
+
+    CRepository* repository = NULL;
+
+    PIM_TRAPD_HANDLE( (repository = CRepository::NewL( KCRUidCalenUIExtensions )) );
+
+    if( repository )
+        {
+        repository->Set( KCalenExternalCalendarEnabled, aEnabled );
+        delete repository;
+        }
+
+    TRACE_EXIT_POINT;
+    }
+#endif //RD_CALEN_EXTERNAL_CAL
+
+// End of File