phoneapp/phoneuivoipextension/src/cphoneextensionhandler.cpp
changeset 0 5f000ab63145
child 24 41a7f70b3818
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuivoipextension/src/cphoneextensionhandler.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2007 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 CPhoneExtensionHandler class.
+*
+*/
+
+// INCLUDES
+
+#include <eikmenup.h>
+#include <spsettings.h>
+#include <spentry.h>
+#include <spproperty.h>
+#include <phoneui.rsg>
+#include <avkon.rsg>
+#include <phoneuivoip.rsg>
+#include <StringLoader.h>
+
+#include "cphoneextensionhandler.h"
+#include "cphonemainresourceresolver.h"
+#include "cphonelogger.h"
+#include "phoneappvoipcommands.hrh"
+#include "phonerssvoip.h"
+#include "cphonemenuextensionwrapper.h"
+#include "tphonetouchpanewrapper.h" 
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CPhoneExtensionHandler::CPhoneExtensionHandler()
+    {
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::~CPhoneStateIdleVoIP()
+// Destructor
+// -----------------------------------------------------------
+//
+CPhoneExtensionHandler::~CPhoneExtensionHandler()
+    {    
+    iPlugins.ResetAndDestroy();
+    REComSession::FinalClose();
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::ConstructL()
+// Constructor
+// -----------------------------------------------------------
+//
+void CPhoneExtensionHandler::ConstructL()
+    {
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::NewL()
+// Constructor
+// -----------------------------------------------------------
+//
+CPhoneExtensionHandler* CPhoneExtensionHandler::NewL( )
+    {
+    CPhoneExtensionHandler* self = new (ELeave) CPhoneExtensionHandler();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::HandleCommandL
+// -----------------------------------------------------------
+//
+TBool CPhoneExtensionHandler::HandleCommandL( 
+        TUint aServiceId,
+        TInt aCommand )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::HandleCommandL" );
+    
+    CTelMenuExtension* interface = MenuExtensionL( aServiceId );
+    
+    return interface->HandleCommandL( aCommand );
+    }
+
+ 
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::CustomizeTouchPaneButtonsL
+// -----------------------------------------------------------
+//
+void CPhoneExtensionHandler::CustomizeTouchPaneButtonsL(
+        TUint aServiceId,
+        RArray<CTelMenuExtension::TCallInfo>& aArray,
+        MBubbleTouchPaneInterface& aTouchPane )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::CustomizeTouchPaneButtonsL" );
+    
+    CTelMenuExtension* interface = MenuExtensionL( aServiceId );
+    
+    TPhTouchPaneWrapper wrapper( aTouchPane );    
+    interface->ModifyExtensionsTouchPaneButtonsL(
+        aArray,
+        wrapper);
+    }
+
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::ModifyInCallMenuL
+// -----------------------------------------------------------
+//
+void CPhoneExtensionHandler::ModifyInCallMenuL(
+        TUint aServiceId,
+        RArray<CTelMenuExtension::TCallInfo>& aArray,
+        TInt aResourceId, 
+        CEikMenuPane& aMenuPane )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::ModifyInCallMenuL" );
+    
+    if ( aResourceId != R_AVKON_MENUPANE_FEP_DEFAULT &&
+        aResourceId != R_AVKON_MENUPANE_EDITTEXT_DEFAULT &&
+        aResourceId != R_AVKON_MENUPANE_LANGUAGE_DEFAULT &&
+        R_PHONEUI_NEW_CALL_MENU_VOIP != aResourceId )
+        {
+
+        // Load xSP ECOM plugin 
+        CTelMenuExtension* interface = MenuExtensionL( aServiceId );
+        
+        __PHONELOG( EBasic, PhoneUIVoIPExtension, 
+            "CPhoneExtensionHandler::ModifyInCallMenuL, plugin exists" );
+        // Add unattended transfer option to menu
+        AddUnattendedTransferMenuItemL( aMenuPane );
+        
+        // Let plugin modify menu pane
+        interface->ModifyExtensionsCallMenuL( aArray, aMenuPane );
+        }
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::ResolveImplementationUidL
+// -----------------------------------------------------------
+//
+TUid CPhoneExtensionHandler::ResolveImplementationUidL( 
+        TUint32 aServiceId, TServicePropertyName aPropertyName )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::ResolveImplementationUidL" );
+    
+    TUid implUid = { 0 };
+    CSPEntry* entry = CSPEntry::NewLC();
+
+    CSPSettings* spSettings = CSPSettings::NewLC(); 
+    
+    User::LeaveIfError(
+        spSettings->FindEntryL( aServiceId, *entry ) ); 
+
+    CleanupStack::PopAndDestroy( spSettings ); 
+
+    const CSPProperty* property = NULL;
+    User::LeaveIfError( entry->GetProperty( property, aPropertyName ) );
+    
+    if ( property ) 
+        {
+        TInt temp(0);
+        User::LeaveIfError( property->GetValue( temp ) );
+        implUid.iUid = temp;
+        }
+
+    CleanupStack::PopAndDestroy( entry );
+    return implUid;
+    }
+
+// -----------------------------------------------------------
+// CPhoneExtensionHandler::AddUnattendedTransferMenuItem
+// -----------------------------------------------------------
+//
+void CPhoneExtensionHandler::AddUnattendedTransferMenuItemL( 
+        CEikMenuPane& aMenuPane )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::AddUnattendedTransferMenuItemL" );
+    
+    HBufC* string = StringLoader::LoadLC( 
+        CPhoneMainResourceResolver::Instance()->
+        ResolveResourceID( EPhoneVoIPUnattendedTransferOption ) );
+    CEikMenuPaneItem::SData data;
+    data.iCascadeId=0;
+    data.iText = *string;
+    data.iFlags=0;
+    data.iCommandId = EPhoneInCallCmdUnattendedTransfer;
+ 
+    // Try to find index of EPhoneInCallCmdGoToIdle command
+    // unattended transfer item will be placed above it if found
+    TInt index = KErrNotFound;
+    TInt menuItemCount = aMenuPane.NumberOfItemsInPane();
+    for ( TInt i= 0 ; i < menuItemCount; i++ )
+        {
+        if ( aMenuPane.MenuItemCommandId( i ) == EPhoneInCallCmdGoToIdle )
+            {
+            index = i;
+            break;
+            }
+        }
+   
+    if ( KErrNotFound < index )
+        {
+        aMenuPane.InsertMenuItemL( data, index );  
+        }
+    else
+        {
+        aMenuPane.AddMenuItemL( data ); 
+        }
+   
+    CleanupStack::PopAndDestroy( string );   
+    }
+
+// ----------------------------------------------------------
+// CPhoneExtensionHandler::MenuExtensionL
+// (other items were commented in a header).
+// -----------------------------------------------------------
+//
+CTelMenuExtension* CPhoneExtensionHandler::MenuExtensionL( TUint aServiceId )
+    {
+    __LOGMETHODSTARTEND( PhoneUIVoIPExtension, 
+        "CPhoneExtensionHandler::MenuExtensionL" );
+    
+    TUid pluginUid = ResolveImplementationUidL( aServiceId, 
+        EPropertyCallMenuHandlerPluginId );
+    
+    CPhMenuExtensionWrapper* wrapper = NULL;
+    TInt pluginInd = 
+        iPlugins.Find( pluginUid, CPhMenuExtensionWrapper::MatchByUid );
+    if ( KErrNotFound == pluginInd )
+        {
+        wrapper = CPhMenuExtensionWrapper::NewLC( pluginUid );
+        iPlugins.AppendL( wrapper );
+        CleanupStack::Pop( wrapper );
+        }
+    else
+        {
+        wrapper = iPlugins[pluginInd];
+        }
+    
+    __ASSERT_ALWAYS( NULL != wrapper, User::Leave( KErrNotFound ) );
+    return wrapper;
+    }
+
+
+// End of File