diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/AknCapServer/clientsrc/AknCapServerClient.cpp --- /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 +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include +#endif +#include "AknCapServerClient.h" +#include "AknCapServerDefs.h" +#include +#include +#include +#include +#include + +// For global note. +#include +#include + +#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 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 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 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 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 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 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 buf(aKeyEvent); + TPckg pckg(aCode); + + return SendReceive(EAknGetAliasKeyCode, TIpcArgs(&pckg, &buf, aType)); + } + +EXPORT_C TInt RAknUiServer::GetPhoneIdleViewId( TVwsViewId& aViewId ) + { + TPckg 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 pkg( + *( static_cast( aData ) ) ); + SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ), *aStatus ); + break; + } + // Launch global popup from resources + case ( TAknDiscreetPopupData::EAknPopupTypeResource ): + { + TPckg pkg( + *( static_cast( aData ) ) ); + SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ), *aStatus ); + break; + } + // All request cancellation + case ( TAknDiscreetPopupData::EAknPopupTypeCancelRequest ): + { + TPckg pkg( + *( static_cast( aData ) ) ); + SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) ); + break; + } + // Id request + case ( TAknDiscreetPopupData::EAknPopupTypeUndefined ): + { + TPckg pkg( + *( static_cast( aData ) ) ); + SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) ); + break; + } + // Query the rect of global discreet popup in use + case ( TAknDiscreetPopupData::EAknPopupTypeQueryInUseRect ): + { + TPckg pkg( + *( static_cast( aData ) ) ); + SendReceive( EAknSDiscreetPopupAction, TIpcArgs( &pkg ) ); + break; + } + default: + { + break; + } + } + } + +// --------------------------------------------------------------------------- +// RAknUiServer::GetInUseGlobalDiscreetPopupRect +// --------------------------------------------------------------------------- +// +EXPORT_C const TRect RAknUiServer::GetInUseGlobalDiscreetPopupRect() + { + TAknDiscreetPopupRectData rectData(TRect::EUninitialized); + DoDiscreetPopupAction( static_cast(&rectData),NULL); + return rectData.Rect(); + } + +// End of file