meetingrequest/mrbcplugin/src/cmrbcplugin.cpp
branchRCL_3
changeset 12 4ce476e64c59
child 16 b5fbb9b25d57
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrbcplugin/src/cmrbcplugin.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,544 @@
+/*
+* Copyright (c) 2009-2009 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:  Implements RECAL customisation api
+*
+*/
+
+// INCLUDES
+#include "cmrbcplugin.h"
+#include "cmrbcpluginentryloader.h"
+#include "cmrbcpluginresourcereader.h"
+#include "cmrbceventplugin.h"
+#include "esmrhelper.h"
+#include "esmrdef.h"
+#include "esmrinternaluid.h"
+
+#include <calendar.rsg>
+#include <calenservices.h>
+#include <eikmenup.h>
+#include <bautils.h>
+#include <ecom/ecom.h>
+#include <meetingrequestuids.hrh>
+#include <ct/rcpointerarray.h>
+#include <data_caging_path_literals.hrh>
+#include <caleninterimutils2.h>
+#include <calencommands.hrh>
+#include <featdiscovery.h>
+#include <bldvariant.hrh>
+
+#include "emailtrace.h"
+
+namespace { // codescanner::namespace
+
+#ifdef _DEBUG
+
+// Panic literal
+_LIT( KMRBCPlugin, "MRBCPlugin" );
+
+enum TMRBCPluginPanic
+    {
+    ENoBCPluginsFound // No MRUi MR Viewer Impl found
+    };
+
+void Panic( TMRBCPluginPanic aPanic )
+    {
+    User::Panic( KMRBCPlugin, aPanic );
+    }
+
+#endif // _DEBUG
+
+TBCPluginEventType EventTypeL(
+        MCalenServices& aServices,
+        CCalEntry& aEntry )
+    {
+    TBCPluginEventType eventType( EMRTypeNone );
+
+    CCalenInterimUtils2& utils = aServices.InterimUtilsL();
+    if ( utils.IsMeetingRequestL(aEntry) )
+        {
+        eventType = EMRTypeMeetingRequest;
+        }
+    else
+        {
+        switch( aEntry.EntryTypeL() )
+            {
+            case CCalEntry::EAppt:
+                eventType = EMRTypeMeeting;
+                break;
+
+            case CCalEntry::ETodo:
+                eventType = EMRTypeToDo;
+                break;
+
+            case CCalEntry::EEvent:
+                eventType = EMRTypeMemo;
+                break;
+
+            case CCalEntry::EAnniv:
+                eventType = EMRTypeAnniversary;
+                break;
+            }
+        }
+
+    return eventType;
+    }
+
+/**
+ * Checks if features for handling commands are enabled
+ * @param aCommand command to check
+ * @return ETrue if feature is enabled for handling the given command
+ */
+TBool IsCommandHandlerEnabledL( TInt aCommand )
+    {
+    FUNC_LOG;
+
+    TBool enabled( ETrue );
+
+    switch ( aCommand )
+        {
+        case ECalenNewMeetingRequest:
+            {
+            if ( !CFeatureDiscovery::IsFeatureSupportedL(
+                    TUid::Uid( KFeatureIdFfCalMeetingRequestUi ) ) )
+                {
+                // KFeatureIdFfCalMeetingRequestUi is not supported.
+                // Disable ECalenNewMeetingRequest command handling.
+                enabled = EFalse;
+                }
+            break;
+            }
+
+        case ECalenEventView:
+            {
+            break;
+            }
+
+        case ECalenNewMeeting:
+        case ECalenNewTodo:
+        case ECalenNewAnniv:
+        case ECalenNewDayNote:
+            {
+            if ( !CFeatureDiscovery::IsFeatureSupportedL(
+                    TUid::Uid( KFeatureIdFfEnhancedCalendarEventUi ) ) )
+                {
+                // KFeatureIdFfEnhancedCalendarEventUi is not supported.
+                // Disable enhanced event editors.
+                enabled = EFalse;
+                }
+            break;
+            }
+
+        case ECalenNewMeetingTimeSpan:
+            {
+            if ( !CFeatureDiscovery::IsFeatureSupportedL(
+                    TUid::Uid( KFeatureIdFfCalMeetingRequestUi ) )
+                 && !CFeatureDiscovery::IsFeatureSupportedL(
+                         TUid::Uid( KFeatureIdFfEnhancedCalendarEventUi ) ) )
+                {
+                enabled = EFalse;
+                }
+            break;
+            }
+            
+        default:
+            {
+            enabled = EFalse;
+            break;
+            }
+        }
+
+    return enabled;
+    }
+
+/**
+ * Checks is feature for handling a command is enabled
+ * @param aCommand the command to handle
+ * @param aType the event type
+ * @return ETrue if command handling is enabled
+ */
+TBool IsCommandSupportedForEntryTypeL(
+        TInt aCommand,
+        TBCPluginEventType aType )
+    {
+    FUNC_LOG;
+
+    TBool supported = ETrue;
+
+    if ( aCommand == ECalenEventView )
+        {
+        // Check that corresponding viewer feature is enabled
+        switch ( aType )
+            {
+            case EMRTypeMeetingRequest:
+                {
+                if ( !CFeatureDiscovery::IsFeatureSupportedL(
+                        TUid::Uid( KFeatureIdFfCalMeetingRequestUi ) ) )
+                    {
+                    // Meeting request viewer is not supported
+                    supported = EFalse;
+                    }
+                break;
+                }
+
+            case EMRTypeMeeting:
+            case EMRTypeMemo:
+            case EMRTypeAnniversary:
+            case EMRTypeToDo:
+                {
+                if ( !CFeatureDiscovery::IsFeatureSupportedL(
+                        TUid::Uid( KFeatureIdFfEnhancedCalendarEventUi ) ) )
+                    {
+                    // Enhanced event viewers are not supported
+                    supported = EFalse;
+                    }
+                break;
+                }
+            default:
+                {
+                supported = EFalse;
+                break;
+                }
+
+            }
+        }
+
+    return supported;
+    }
+
+} // namespace
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CMRBCPlugin
+// C++ constructor for this class
+// -----------------------------------------------------------------------------
+//
+CMRBCPlugin::CMRBCPlugin( MCalenServices* aServices )
+:   iServices( aServices )
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::~CMRBCPlugin
+// Destructor for this class
+// -----------------------------------------------------------------------------
+//
+CMRBCPlugin::~CMRBCPlugin()
+    {
+    FUNC_LOG;
+
+    if ( iServices )
+        {
+        iServices->Release();
+        }
+
+    iPluginResources.ResetAndDestroy();
+    delete iEntryLoader;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::NewL
+// Static constructor for this class
+// -----------------------------------------------------------------------------
+//
+CMRBCPlugin* CMRBCPlugin::NewL(
+        MCalenServices* aServices )
+    {
+    FUNC_LOG;
+
+    CMRBCPlugin* self = new ( ELeave ) CMRBCPlugin( aServices );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::ConstructL
+// 2nd phase constructor for this class.
+// -----------------------------------------------------------------------------
+//
+void CMRBCPlugin::ConstructL()
+    {
+    FUNC_LOG;
+
+    RCPointerArray<CImplementationInformation> bcPlugins;
+    CleanupClosePushL( bcPlugins );
+
+    REComSession::ListImplementationsL(
+            TUid::Uid(KMRBCEventPluginInterfaceUID),
+            bcPlugins );
+
+    TInt pluginCount(  bcPlugins.Count() );
+    __ASSERT_DEBUG( pluginCount , Panic( ENoBCPluginsFound) );
+
+    if ( !pluginCount )
+        {
+        ERROR( KErrNotFound, "No BC Plugins found" );
+        User::Leave( KErrNotFound );
+        }
+
+    for ( TInt i(0); i < pluginCount; ++i )
+        {
+        HBufC* resourceFileName =
+                    HBufC::NewLC( bcPlugins[i]->OpaqueData().Length() );
+        resourceFileName->Des().Copy( bcPlugins[i]->OpaqueData() );
+
+        CMRBCPluginResourceReader* pluginResource =
+                CMRBCPluginResourceReader::NewL( *iServices );
+        CleanupStack::PushL( pluginResource );
+
+        TFileName resource;
+        TInt err = ESMRHelper::LocateResourceFile(
+                        *resourceFileName,
+                        KDC_RESOURCE_FILES_DIR,
+                        resource,
+                        NULL );
+
+        User::LeaveIfError( err );
+
+        pluginResource->ReadFromResourceFileL(
+                bcPlugins[i]->ImplementationUid(),
+                resource );
+
+        User::LeaveIfError(
+                iPluginResources.Append( pluginResource ) );
+
+        CleanupStack::Pop( pluginResource );
+        CleanupStack::PopAndDestroy( resourceFileName );
+        }
+
+    // bcPlugins
+    CleanupStack::PopAndDestroy();  // codescanner::cleanup
+
+    iEntryLoader = CMRBCPluginEntryLoader::NewL( *iServices );
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::GetCustomViewsL
+// -----------------------------------------------------------------------------
+//
+void CMRBCPlugin::GetCustomViewsL(
+        RPointerArray<CCalenView>& /*aCustomViewArray*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::GetCustomSettingsL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+void CMRBCPlugin::GetCustomSettingsL( RPointerArray<CAknSettingItem>& /*aCustomSettingArray*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::InfobarL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CMRBCPlugin::InfobarL( const TRect& /*aRect*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::InfobarL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+const TDesC& CMRBCPlugin::InfobarL()
+    {
+    FUNC_LOG;
+
+    return KNullDesC;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CustomPreviewPaneL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+MCalenPreview* CMRBCPlugin::CustomPreviewPaneL( TRect& /*aRect*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::PreviewPaneL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CMRBCPlugin::PreviewPaneL( TRect& /*aRect*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CommandHandlerL
+// Decides what command handler is returned
+// -----------------------------------------------------------------------------
+//
+MCalenCommandHandler* CMRBCPlugin::CommandHandlerL(
+        TInt aCommand )
+    {
+    FUNC_LOG;
+
+    MCalenCommandHandler* cmdHandler = NULL;
+
+    if ( IsCommandHandlerEnabledL( aCommand ) )
+        {
+        cmdHandler = ResolveCommandHandlerL( aCommand );
+        }
+
+    return cmdHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::RemoveViewsFromCycle
+// -----------------------------------------------------------------------------
+//
+void CMRBCPlugin::RemoveViewsFromCycle( RArray<TInt>& /*aViews*/ )
+    {
+    FUNC_LOG;
+
+    // Do nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CustomiseMenuPaneL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+TBool CMRBCPlugin::CustomiseMenuPaneL( TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/ )
+    {
+    FUNC_LOG;
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CanBeEnabledDisabled
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+TBool CMRBCPlugin::CanBeEnabledDisabled()
+    {
+    FUNC_LOG;
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::CalenCustomisationExtensionL
+// No implementation needed
+// -----------------------------------------------------------------------------
+//
+TAny* CMRBCPlugin::CalenCustomisationExtensionL( TUid /*aExtensionUid*/ )
+    {
+    FUNC_LOG;
+
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::ResolveCommandHandlerL
+// -----------------------------------------------------------------------------
+//
+MCalenCommandHandler* CMRBCPlugin::ResolveCommandHandlerL( TInt aCommand )
+    {
+    MCalenCommandHandler* cmdHandler = NULL;
+
+    //Open meetingview instead of mr while can't resolve phone owner.
+    //This situation command ECalenOpenMeetingView will be received.
+    if( EMRLaunchMeetingViewer == aCommand )
+        {
+        CMRBCEventPlugin* eventPlugin = PluginByUidL(
+                TUid::Uid( KMRBCMREventPluginImplementationUID ) );
+        
+        if ( eventPlugin )
+            {
+            cmdHandler = eventPlugin->CommandHandler();
+            }
+        }
+    else
+        {
+        TInt pluginCount( iPluginResources.Count() );
+        for ( TInt i(0); i < pluginCount && !cmdHandler; ++i )
+            {
+            TMRBCPluginCommand pluginCommand;
+    
+            TInt err = iPluginResources[i]->Command( aCommand, pluginCommand );
+            if ( KErrNone == err )
+                {
+                // Command was found from the plugin
+                if ( pluginCommand.CheckEntryType() )
+                    {
+                    iEntryLoader->UpdateEntryFromDatabaseL();
+    
+                    TBCPluginEventType eventType(
+                            EventTypeL( *iServices, iEntryLoader->Entry() ) );
+    
+                    if ( iPluginResources[i]->SupportsType( eventType)
+                         && IsCommandSupportedForEntryTypeL( aCommand, eventType ) )
+                        {
+                        cmdHandler = iPluginResources[i]->PluginL().CommandHandler();
+                        }
+                    }
+                else
+                    {
+                    cmdHandler = iPluginResources[i]->PluginL().CommandHandler();
+                    }
+                }
+            }
+        }
+    return cmdHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRBCPlugin::PluginByUid
+// -----------------------------------------------------------------------------
+//
+CMRBCEventPlugin* CMRBCPlugin::PluginByUidL( TUid aUid )
+    {
+    CMRBCEventPlugin* plugin = NULL;
+    
+    for ( TInt i = 0; i < iPluginResources.Count() && !plugin; ++i )
+        {
+        if ( iPluginResources[ i ]->PluginImplUid() == aUid )
+            {
+            plugin = &( iPluginResources[ i ]->PluginL() );
+            }
+        }
+    
+    return plugin;
+    }
+
+// End of file