uifw/AknGlobalUI/AknCapServer/clientsrc/AknCapServerClient.cpp
changeset 0 2f259fa3e83a
child 33 b3425bf29f82
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/AknCapServer/clientsrc/AknCapServerClient.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,699 @@
+/*
+* Copyright (c) 2002-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:  
+*
+*/
+
+#include <eiknotapi.h>
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon.hrh>
+#else
+#include <uikon.hrh>
+#include <uiklaf/private/pluginuid.hrh>
+#endif
+#include "AknCapServerClient.h"
+#include "AknCapServerDefs.h"
+#include <eiksrvs.h>
+#include <apgcli.h>
+#include <apasvst.h>
+#include <aknconsts.h>
+#include <AknNotifierControllerUtilities.h>
+
+// For global note.
+#include <AknGlobalNote.h>
+#include <avkon.rsg>
+
+#include "akndiscreetpopupdata.h"
+
+_LIT(KAknCapServerExecutable, "z:\\sys\\bin\\akncapserver.exe");
+_LIT(KAknNfySrvThreadName, "aknnfysrv");
+
+TInt RAknUiServer::ConnectAknServer()
+    {
+#ifdef _DEBUG
+    RThread me;
+    TName name = me.Name();
+    RDebug::Print( _L( "RAknUiServer::ConnectAknServer(), handle %d, %S" ), Handle(), &name );    
+#endif
+    TInt err = KErrNone;
+    if (Handle() == NULL)
+        {
+        _LIT(KServerNameFormat, "%08x_%08x_AppServer");
+        TFullName serverName;
+        
+        serverName.Format(
+            KServerNameFormat, 
+            KUikonUidPluginInterfaceNotifiers, 
+            KAknCapServerUid.iUid);
+            
+        TRAP(err, ConnectExistingByNameL(serverName));
+        if (err == KErrNotFound) // This should be never true when starter is in use!
+            {
+            TRAP_IGNORE(StartAknCapserverL());
+            User::After(500000); // No problem to wait synchronously as pure RnD support.
+            TRAP(err,ConnectExistingByNameL(serverName));
+            }
+        }
+#ifdef _DEBUG
+    RDebug::Print(_L("RAknUiServer::ConnectAknServer() end"));    
+#endif
+    return err;
+    }
+    
+// This method must be able to connest eikon server always, used by notifiers running inside
+// eikon server.
+EXPORT_C TInt RAknUiServer::ConnectAndSendAppsKeySuppress(TBool aSuppress)
+    {
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        TInt param = aSuppress ? EAknAppsKeyBlockAddCount : EAknAppsKeyBlockDecreaseCount;
+        ret = SendReceive(EAknSSuppressAppsKey, TIpcArgs( param ));
+        }
+    return ret;
+    }
+
+EXPORT_C TInt RAknUiServer::HideApplicationFromFsw(TBool aHide, TInt aMyUid)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;
+        }
+
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        ret = SendReceive(EAknSHideApplicationFromFWS, TIpcArgs( aMyUid, aHide ));
+        }
+    return ret;
+    }
+
+EXPORT_C void RAknUiServer::UnlockMedia(TInt aDrive, TBool aStore, TRequestStatus& aStatus)
+    {
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        SendReceive(EAknSUnlockMedia, TIpcArgs( EFalse, aDrive, aStore ), aStatus);
+        }
+    else
+        {
+        TRequestStatus* ptr = &aStatus;  
+        User::RequestComplete(ptr, ret);        
+        }       
+    }
+    
+EXPORT_C void RAknUiServer::CancelUnlockMedia()
+    {
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        ret = SendReceive(EAknSUnlockMedia, TIpcArgs( ETrue ));
+        }
+    }
+    
+EXPORT_C TInt RAknUiServer::EnableTaskList(TBool aEnable)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;
+        }
+
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        ret = SendReceive(EAknSEnableTaskList, TIpcArgs( aEnable ));
+        }
+    return ret;
+    }
+    
+EXPORT_C TInt RAknUiServer::MakeTaskListVisible(TBool aShow)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        ret = SendReceive(EAknsLaunchTaskList, TIpcArgs( aShow));
+        }
+    return ret;
+    }
+    
+EXPORT_C TInt RAknUiServer::UpdateTaskList()
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;
+        }
+
+    TInt ret = ConnectAknServer();
+    if (ret == KErrNone)
+        {
+        Send(EAknSRefreshTaskList);
+        }
+    return ret; 
+    }
+
+EXPORT_C TInt RAknUiServer::SetSgcParams(TInt aWgId, TBitFlags aAppFlags, TInt aSpLayout, 
+    TInt aSpFlags)
+    {
+    return SetSgcParams(aWgId, aAppFlags, aSpLayout, aSpFlags, KAknScreenModeUnset);
+    }
+
+EXPORT_C TInt RAknUiServer::SetSgcParams(TInt aWgId, TBitFlags aAppFlags, TInt aSpLayout, 
+    TInt aSpFlags, TInt aAppScreenMode)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    SAknCapServerSetSgcParams params;
+    params.iWgId = aWgId;
+    params.iAppFlags = aAppFlags;
+    params.iSpLayout = aSpLayout;
+    params.iSpFlags = aSpFlags;
+    params.iAppScreenMode = aAppScreenMode;
+    TPckg<SAknCapServerSetSgcParams> pack(params);
+
+    TIpcArgs args(&pack);
+    return SendReceive(EAknEikAppUiSetSgcParams, args);
+    }
+
+EXPORT_C TInt RAknUiServer::BlockServerStatusPaneRedraws()
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    return SendReceive(EAknEikAppUiBlockServerStatusPaneRedraws,TIpcArgs());
+    }
+
+EXPORT_C TInt RAknUiServer::RedrawServerStatusPane()
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    return SendReceive(EAknEikAppUiRedrawServerStatusPane,TIpcArgs());
+    }
+
+EXPORT_C TInt RAknUiServer::PrepareForAppExit(TInt aWgId)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    TIpcArgs args( aWgId );
+    return SendReceive(EAknEikAppUiPrepareForAppExit, args);
+    }
+
+EXPORT_C TInt RAknUiServer::SetSystemFaded(TBool aFade)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    TIpcArgs args( aFade );
+    return SendReceive(EAknEikAppUiSetSystemFaded, args);
+    }
+
+EXPORT_C TInt RAknUiServer::IsSystemFaded(TBool& aFade) const
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    TPckg<TBool> pckg(aFade);
+    TIpcArgs args( &pckg );
+    return SendReceive(EAknEikAppUiIsSystemFaded, args);
+    }
+
+EXPORT_C TInt RAknUiServer::Connect()
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+
+    return ConnectAknServer();
+    }
+
+EXPORT_C TInt RAknUiServer::RelinquishPriorityToForegroundApp()
+    {
+    if (!Handle())
+        {
+        return KErrNone;        
+        }
+    
+    return SendReceive(EAknEikAppUiRelinquishPriorityToForegroundApp);
+    }
+    
+EXPORT_C TInt RAknUiServer::SetStatusPaneFlags(TInt aFlags) const
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSSetStatusPaneFlags,TIpcArgs(aFlags));
+    }
+
+EXPORT_C TInt RAknUiServer::SetStatusPaneLayout(TInt aLayoutResId) const
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSSetStatusPaneLayout,TIpcArgs(aLayoutResId));
+    }
+
+EXPORT_C TInt RAknUiServer::BlankScreen() const
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    if ( thread.Name() == KAknNfySrvThreadName )
+    //Notifier Server should not blank the screen, if not, flickers show
+        {
+        return KErrNone;
+        }
+        
+    return SendReceive(EAknSBlankScreen,TIpcArgs());
+    }
+
+EXPORT_C TInt RAknUiServer::UnblankScreen() const
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    
+    if ( thread.Name() == KAknNfySrvThreadName )
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSUnblankScreen,TIpcArgs());
+    }
+
+EXPORT_C TUid RAknUiServer::ServiceUid() const 
+    {
+    return KAknCapServiceUid;
+    }   
+
+EXPORT_C TInt RAknUiServer::SetKeyboardRepeatRate(TAknDefaultKeyboardRepeatRate aRate)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSSetKeyboardRepeatRate,TIpcArgs(aRate));
+    }
+
+EXPORT_C TInt RAknUiServer::SetKeyblockMode(TAknKeySoundOpcode aMode)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSUpdateKeyBlockMode,TIpcArgs(aMode));
+    }
+
+EXPORT_C TInt RAknUiServer::DoEikonServerConnect()
+    {
+    return ConnectAknServer();
+    }
+
+EXPORT_C TInt RAknUiServer::ShowKeysLockedNote(TBool& aIsKeyPadLocked)
+    {
+    TInt ret = SendReceive(EAknSShowLockedNote);
+    if (ret >= 0) // no error 
+        {
+        aIsKeyPadLocked = ret;    
+        ret = KErrNone;
+        } 
+    return ret;
+    }
+
+EXPORT_C void RAknUiServer::ShutdownApps(const TUid aRequesterUID, 
+    const TInt aTimeoutInMicroseconds, TRequestStatus& aStatus) const
+    {
+    TIpcArgs args( aRequesterUID.iUid, aTimeoutInMicroseconds );
+    SendReceive(EAknSShutdownApps, args, aStatus);
+    }
+    
+EXPORT_C void RAknUiServer::CancelShutdownApps()
+    {
+    SendReceive(EAknSCancelShutdownApps);
+    }
+
+EXPORT_C TInt RAknUiServer::ShowGlobalNoteL(const TDesC& aNoteText, TInt aGlobalNoteType)
+    {
+    if (!Handle())
+        {
+        return KErrNotReady;
+        }
+
+    CBufFlat* buffer = CBufFlat::NewL(128);
+    CleanupStack::PushL(buffer);
+    
+    CAknGlobalNote::DoGlobaNoteBufferL(
+        aGlobalNoteType,
+        0,
+        R_AVKON_SOFTKEYS_OK_EMPTY,
+        -1,
+        -1,
+        -1,
+        -1,
+        EFalse,
+        ETrue,
+        aNoteText,
+        buffer
+        );
+        
+    TPtrC8 bufferPtr;
+    bufferPtr.Set(buffer->Ptr(0));
+    TPckgBuf<SAknGlobalNoteReturnParams> retPckg;
+    TInt ret = SendReceive(EStartNotifier, TIpcArgs(KAknGlobalNoteUid.iUid, &bufferPtr, &retPckg));
+    CleanupStack::PopAndDestroy(); // buffer
+    return ret;
+    }
+    
+EXPORT_C TInt RAknUiServer::StatusPaneResourceId()
+    { 
+    if (!Handle()) // either eikon server has not yet connected to aknserver or we are in aknserver   
+        {
+        return 0; // zero is invalid resource id -> indicates problem accessing sp
+        }
+
+    TInt ret = 0;
+    TPckg<TInt> pckg(ret);
+    TInt err = SendReceive(EAknSStatusPaneResourceId, TIpcArgs(&pckg));
+    return ((err == KErrNone)?ret:0);   
+    }
+
+EXPORT_C TInt RAknUiServer::CreateActivateViewEventL(const TVwsViewId& aViewId, 
+    TUid aCustomMessageId, const TDesC8& aCustomMessage)
+    {
+    return SendReceive(EAknSLaunchView, TIpcArgs(
+        aViewId.iAppUid.iUid,
+        aViewId.iViewUid.iUid,
+        aCustomMessageId.iUid,
+        &aCustomMessage));
+    }
+
+EXPORT_C HBufC8* RAknUiServer::GetPackedConfigL() const
+    {
+    TInt size = 0;
+    TPckg<TInt> pckg(size);
+    User::LeaveIfError(SendReceive(EAknEikAppUiLayoutConfigSize, TIpcArgs(&pckg)));
+    
+    HBufC8* buf = HBufC8::NewMaxLC(size);
+    TPtr8 ptr = buf->Des();
+    User::LeaveIfError(SendReceive(EAknEikAppUiGetLayoutConfig, TIpcArgs(&ptr)));
+    
+    CleanupStack::Pop(buf);
+    return buf;
+    }
+
+EXPORT_C TInt RAknUiServer::CurrentAppStatuspaneResource()
+    {
+    if (!Handle()) // either eikon server has not yet connected to aknserver or we are in aknserver   
+        {
+        return 0; // zero is invalid resource id -> indicates problem accessing sp
+        }
+
+    TInt ret = 0;
+    TPckg<TInt> pckg(ret);
+    TInt err = SendReceive(EAknSStatusPaneAppResourceId, TIpcArgs(&pckg));
+    return ((err == KErrNone)?ret:0);   
+    }
+    
+EXPORT_C TInt RAknUiServer::SetCurrentAppStatuspaneResource(TInt aResourceId)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+        
+    return SendReceive(EAknSSetStatusPaneAppResourceId,TIpcArgs(aResourceId));      
+    }
+
+EXPORT_C TInt RAknUiServer::RotateScreen()
+    {
+    return SendReceive(EAknSRotateScreen, TIpcArgs());
+    }
+
+EXPORT_C TBool RAknUiServer::TaskSwitchingSupressed()
+    {
+    if (ConnectAknServer() == KErrNone)
+        {
+        // Mimics also boolean EFalse, in any error or posivite value we assume that appswitch is 
+        // forbidden.
+        return !(SendReceive(EAknSAppsKeyBlocked) == KErrNone); 
+        }                                                      
+    else 
+        {
+        return ETrue; // Capserver not available -> no app switching allowed either    
+        }
+    }
+
+EXPORT_C TInt RAknUiServer::ShowLongTapAnimation( const TPointerEvent& aEvent)
+    {
+    if ( !Handle() )
+        {
+        return KErrCouldNotConnect;
+        }
+    
+    return SendReceive(
+        EAknSShowLongTapAnimation, 
+        TIpcArgs(aEvent.iParentPosition.iX, aEvent.iParentPosition.iY));
+    }
+    
+EXPORT_C TInt RAknUiServer::HideLongTapAnimation()
+    {
+    if ( !Handle() )
+        {
+        return KErrCouldNotConnect;
+        }
+
+    return SendReceive(EAknSHideLongTapAnimation, TIpcArgs());
+    }
+
+EXPORT_C TInt RAknUiServer::GetAliasKeyCode(TUint& aCode, const TKeyEvent& aKeyEvent, 
+    TEventCode aType)
+    {
+    TPckgC<TKeyEvent> buf(aKeyEvent);
+    TPckg<TUint> pckg(aCode);
+
+    return SendReceive(EAknGetAliasKeyCode, TIpcArgs(&pckg, &buf, aType));
+    }
+
+EXPORT_C TInt RAknUiServer::GetPhoneIdleViewId( TVwsViewId& aViewId )
+    {
+    TPckg<TVwsViewId> pckg(aViewId);
+    return SendReceive(EAknSGetPhoneIdleViewId, TIpcArgs(&pckg));
+    }
+
+EXPORT_C void RAknUiServer::StartAknCapserverL()
+    {
+    AknStartupApaServerProcess();
+    
+    RApaLsSession apa;
+    User::LeaveIfError(apa.Connect());
+    CleanupClosePushL(apa);
+
+    CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+    cmdLine->SetExecutableNameL( KAknCapServerExecutable );
+    cmdLine->SetServerRequiredL(KUikonUidPluginInterfaceNotifiers);
+    cmdLine->SetCommandL(EApaCommandBackground);
+    TThreadId dummy;
+    
+    TRequestStatus requestStatusForRendezvous;
+    User::LeaveIfError(apa.StartApp(*cmdLine, dummy, &requestStatusForRendezvous));
+    User::WaitForRequest(requestStatusForRendezvous);
+    User::LeaveIfError(requestStatusForRendezvous.Int());
+    CleanupStack::PopAndDestroy(2, &apa);   // cmdLine and apa    
+    }
+
+
+/* Copied from \common\generic\app-framework\apparc\apgrfx\apscli.cpp
+ * so that a command line can be passed to apparc.
+ */ 
+EXPORT_C TInt AknStartupApaServerProcess()
+    {
+    _LIT(KNameApaImage,"APSEXE");
+    const TUid KServerUid3 = { 0x10003A3F };
+    const TUidType uidType(KNullUid, KNullUid, KServerUid3);
+    
+    _LIT(KApaCommandLine, "-IDLE_TIMEOUT_PERIODIC_DELAY_5000");
+    RProcess server;
+    TInt r = server.Create(KNameApaImage, KApaCommandLine, uidType);
+    
+    if (r != KErrNone)
+        {
+        return r;   
+        }
+    TRequestStatus stat;
+    server.Rendezvous(stat);
+    if (stat != KRequestPending)
+        {
+        server.Kill(0);     // abort startup
+        }
+    else
+        {
+        server.Resume();    // logon OK - start the server
+        }
+    User::WaitForRequest(stat); // wait for start or death
+    server.Close();
+    return stat.Int();
+    }
+
+EXPORT_C TInt RAknUiServer::DoNotifierControllerCommand(TInt aNotifierControllerCommand)
+    {
+    return Send(KDoNotifierControllerCommand, TIpcArgs(aNotifierControllerCommand));
+    }
+
+EXPORT_C TInt RAknUiServer::SetFgSpDataSubscriberId(TInt aId)
+    {
+    RThread thread;
+    if (!Handle() && thread.Name() == EIKAPPUI_SERVER_THREAD_NAME)
+        {
+        return KErrNone;        
+        }
+    return SendReceive(EAknSetFgSpDataSubscriberId, TIpcArgs(aId));      
+    }
+
+EXPORT_C TInt RAknUiServer::PreAllocateDynamicSoftNoteEvent(TInt aNoteId)
+    {
+    return SendReceive(EAknSPreAllocateDynamicSoftNoteEvent, TIpcArgs(aNoteId));
+    }
+    
+EXPORT_C void RAknUiServer::NotifyDynamicSoftNoteEvent(TRequestStatus& aStatus, TDes8& aActionId)
+    {
+    TIpcArgs args(&aActionId);
+    SendReceive(EAknSNotifyDynamicSoftNoteEvent, args, aStatus);
+    }
+    
+EXPORT_C void RAknUiServer::CancelDynamicSoftNoteEventNotification()
+    {
+    SendReceive(EAknSCancelDynamicSoftNoteEventNotification, TIpcArgs());
+    }
+    
+EXPORT_C TInt RAknUiServer::MoveAppInZOrder(TInt aAppWindowGroupId, TBool aBackgroundOrForeground)
+	{
+    return Send(EAknEikAppUiMoveAppInZOrder, TIpcArgs(aAppWindowGroupId, aBackgroundOrForeground));
+	}
+    
+
+EXPORT_C void RAknUiServer::DoDiscreetPopupAction( 
+        TAknDiscreetPopupData* aData, TRequestStatus* aStatus )
+    {
+    if ( !aData || !Handle() )
+        {
+        return;
+        }
+
+    switch ( aData->Type() )
+        {
+        // Launch global popup with params
+        case ( TAknDiscreetPopupData::EAknPopupTypeParam ):
+            {
+            TPckg<TAknDiscreetPopupParamData> pkg( 
+                    *( static_cast<TAknDiscreetPopupParamData*>( aData ) ) );
+            SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ), *aStatus );
+            break;
+            }
+        // Launch global popup from resources
+        case ( TAknDiscreetPopupData::EAknPopupTypeResource ):
+            {
+            TPckg<TAknDiscreetPopupResourceData> pkg( 
+                    *( static_cast<TAknDiscreetPopupResourceData*>( aData ) ) );
+            SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ), *aStatus );
+            break;
+            }
+        // All request cancellation
+        case ( TAknDiscreetPopupData::EAknPopupTypeCancelRequest ):
+            {
+            TPckg<TAknDiscreetPopupCancelRequestData> pkg( 
+                    *( static_cast<TAknDiscreetPopupCancelRequestData*>( aData ) ) );
+            SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) );
+            break;
+            }
+         // Id request
+        case ( TAknDiscreetPopupData::EAknPopupTypeUndefined ):
+            {
+            TPckg<TAknDiscreetPopupData> pkg( 
+                    *( static_cast<TAknDiscreetPopupData*>( aData ) ) );
+            SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) );
+            break;    
+            }
+        // Query the rect of global discreet popup in use
+        case ( TAknDiscreetPopupData::EAknPopupTypeQueryInUseRect ):
+            {
+            TPckg<TAknDiscreetPopupRectData> pkg(
+                    *( static_cast<TAknDiscreetPopupRectData*>( aData ) ) );
+            SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) );
+            break;
+            }        
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// RAknUiServer::GetInUseGlobalDiscreetPopupRect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TRect RAknUiServer::GetInUseGlobalDiscreetPopupRect()
+    {
+    TAknDiscreetPopupRectData rectData(TRect::EUninitialized);
+    DoDiscreetPopupAction( static_cast<TAknDiscreetPopupData*>(&rectData),NULL);
+    return rectData.Rect();            
+    }
+
+// End of file