diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrbcplugin/src/cmrbcplugin.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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& /*aCustomViewArray*/ ) + { + FUNC_LOG; + + // Do nothing + } + +// ----------------------------------------------------------------------------- +// CMRBCPlugin::GetCustomSettingsL +// No implementation needed +// ----------------------------------------------------------------------------- +// +void CMRBCPlugin::GetCustomSettingsL( RPointerArray& /*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& /*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