diff -r d8a3531bc6b8 -r 433cbbb6a04b uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp --- a/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp Mon Feb 22 17:57:49 2010 +0200 +++ b/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp Fri Mar 12 15:47:04 2010 +0200 @@ -61,6 +61,102 @@ NONSHARABLE_CLASS(CAppFwProxy): public CBase { public: + class CAlfGuardedSynchCall: public CActive + { + public: + CAlfGuardedSynchCall(const TAlfCommandParams& aParams):CActive(CActive::EPriorityStandard), iPckg(aParams), iPtr(0,0) + { + CActiveScheduler::Add(this); + iStatus = KErrNotFound; + } + + static void DoGuardedOpL(const TAlfCommandParams& aInParams, + TDes8& aOutParams, + RNotifier& aNotifier, + const TDesC8* aInParams2 = 0 // ugly extension, really + ) + { + CAlfGuardedSynchCall* me = new (ELeave) CAlfGuardedSynchCall(aInParams); + + CleanupStack::PushL(me); + User::LeaveIfError(me->iTimer.CreateLocal()); + me->iRetBuf = aOutParams.AllocL(); + me->iPtr.Set((TUint8*)me->iRetBuf->Ptr(),0,aOutParams.MaxSize()); + if (aInParams2) + { + me->iAltInBuf = aInParams2->AllocL(); + } + CleanupStack::Pop(); // me + + if (aInParams2) + { + aNotifier.StartNotifierAndGetResponse(me->iStatus, + TUid::Uid(KAlfAppFwProxyUid), + *me->iAltInBuf, me->iPtr); + } + else + { + aNotifier.StartNotifierAndGetResponse(me->iStatus, + TUid::Uid(KAlfAppFwProxyUid), + me->iPckg, me->iPtr); + } + + me->iTimer.After(me->iTimerStatus, 100000); // 100ms + User::WaitForRequest(me->iStatus, me->iTimerStatus); + TBool timedOut = (me->iStatus == KRequestPending); + + me->iTimer.Cancel(); // Cancel timer anyway + + if (!timedOut) + { + TInt err = me->iStatus.Int(); + User::WaitForRequest(me->iTimerStatus); + aOutParams.Copy(*me->iRetBuf); + delete me; + User::LeaveIfError(err); + } + else + { + me->SetActive(); + User::Leave( KErrTimedOut ); + } + } + + static TInt DoGuardedOp(const TAlfCommandParams& aInParams, + TDes8& aOutParams, + RNotifier& aNotifier) + { + TInt ret = KErrNone; + TRAP(ret, DoGuardedOpL(aInParams, aOutParams, aNotifier);) + return ret; + } + + ~CAlfGuardedSynchCall() + { + Cancel(); + delete iRetBuf; + delete iAltInBuf; + iTimer.Close(); + } + + void RunL() + { + delete this; + } + + void DoCancel() + { + // Cancel will call User::WaitForRequest for iStatus (if this ao is active) + } + + TPckgC iPckg; + HBufC8* iRetBuf; + HBufC8* iAltInBuf; + TPtr8 iPtr; + RTimer iTimer; + TRequestStatus iTimerStatus; + }; + class CAlfLayoutListener: public CActive { public: @@ -82,7 +178,8 @@ TAlfCommandParams params={EAlfIsMirrorred,0,0,0}; TPckgC pkg(params); TBuf8<1> awkwardApiDummy; - iNotif.iNotif.StartNotifierAndGetResponse(iStatus,TUid::Uid(KAlfAppFwProxyUid), pkg, awkwardApiDummy); } + iNotif.iNotif.StartNotifierAndGetResponse(iStatus,TUid::Uid(KAlfAppFwProxyUid), pkg, awkwardApiDummy); + } void DoCancel() { @@ -111,6 +208,7 @@ if (!iConnected) { // perhaps should check also whether eikon server / notifier server exists.. + // This is currently unsafe (synch) call to a process that may be blocked by window server, keep fingers crossed iConnected = (iNotif.Connect() == KErrNone); } return iConnected; @@ -121,11 +219,10 @@ if ( Connect() && iLayoutMirrored == KErrNotFound) { TRequestStatus status; - TAlfCommandParams params={EAlfIsMirrorred,0,0,0}; - TPckgC pkg(params); - TBuf8<1> awkwardApiDummy; - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, awkwardApiDummy); - User::WaitForRequest(status); + TAlfCommandParams inParams={EAlfIsMirrorred,0,0,0}; + TBuf8<1> outParams; + TInt ret = CAlfGuardedSynchCall::DoGuardedOp( inParams, outParams , iNotif ); + // order updates iLayoutUpdateAo = new CAlfLayoutListener(*this); if (iLayoutUpdateAo) @@ -133,7 +230,7 @@ TRAP_IGNORE(iLayoutUpdateAo->RunL()); } - iLayoutMirrored = (status.Int() > 0); + iLayoutMirrored = ret > 0; } return iLayoutMirrored==KErrNotFound?EFalse:iLayoutMirrored; @@ -144,13 +241,9 @@ TInt ret = 0; if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams params={EAlfCbaLocation,0,0,0}; - TPckgC pkg(params); - TBuf8<1> awkwardApiDummy; - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, awkwardApiDummy); - User::WaitForRequest(status); - ret = status.Int(); + TAlfCommandParams inParams={EAlfCbaLocation,0,0,0}; + TBuf8<1> outParams; + ret = CAlfGuardedSynchCall::DoGuardedOp( inParams, outParams , iNotif ); } return ret; @@ -161,13 +254,9 @@ TRect ret=TRect(0,0,0,0); if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams params={EAlfLayoutMetricsRect,aType,0,0}; - TPckgC pkg(params); - TPckg retpkg(ret); - - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, retpkg); - User::WaitForRequest(status); + TAlfCommandParams inParams={EAlfLayoutMetricsRect,aType,0,0}; + TPckg outParams(ret); + CAlfGuardedSynchCall::DoGuardedOp( inParams, outParams , iNotif ); } return ret; @@ -178,14 +267,9 @@ { if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams params={EAlfGetCachedColor,aID.iMajor,aID.iMinor,aIndex}; - TPckgC pkg(params); - TPckg retpkg(aRgb); - - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, retpkg); - User::WaitForRequest(status); - return status.Int(); + TAlfCommandParams inParams={EAlfGetCachedColor,aID.iMajor,aID.iMinor,aIndex}; + TPckg outParams(aRgb); + return CAlfGuardedSynchCall::DoGuardedOp( inParams, outParams , iNotif); } return KErrCouldNotConnect; @@ -196,15 +280,12 @@ { if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams2 params={EAlfGetSkinBitmap,aID.iMajor,aID.iMinor,aBitmapId,aMaskId,aFileName, aSize, aScaleMode}; - TPckgC pkg(params); + TAlfCommandParams fakeParams={0,0,0,0}; + TAlfCommandParams2 inParams={EAlfGetSkinBitmap,aID.iMajor,aID.iMinor,aBitmapId,aMaskId,aFileName, aSize, aScaleMode}; + TPckgC inBuf(inParams); TInt2 handles = {0,0}; - TPckg retpkg(handles); - - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, retpkg); - User::WaitForRequest(status); - User::LeaveIfError(status.Int()); + TPckg outParams(handles); + CAlfGuardedSynchCall::DoGuardedOpL( fakeParams, outParams , iNotif, &inBuf ); if (!handles.iInt1) { User::Leave(KErrNotFound); @@ -221,15 +302,10 @@ { if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams params={EAlfGetSkinBackgroundBitmap,aID.iMajor,aID.iMinor,0}; - TPckgC pkg(params); + TAlfCommandParams inParams={EAlfGetSkinBackgroundBitmap,aID.iMajor,aID.iMinor,0}; TInt handle = 0; - TPckg retpkg(handle); - - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, retpkg); - User::WaitForRequest(status); - User::LeaveIfError(status.Int()); + TPckg outParams(handle); + CAlfGuardedSynchCall::DoGuardedOpL( inParams, outParams , iNotif ); User::LeaveIfError(aBitmap->Duplicate(handle)); } } @@ -238,26 +314,12 @@ { if ( Connect() ) { - TRequestStatus status; - TAlfCommandParams params={EGetCachedSkinItemData,aID.iMajor,aID.iMinor,aType}; - TPckgC pkg(params); - TPckg retpkg(aArray); - - iNotif.StartNotifierAndGetResponse(status,TUid::Uid(KAlfAppFwProxyUid), pkg, retpkg); - User::WaitForRequest(status); - User::LeaveIfError(status.Int()); + TAlfCommandParams inParams={EGetCachedSkinItemData,aID.iMajor,aID.iMinor,aType}; + TPckg outParams(aArray); + CAlfGuardedSynchCall::DoGuardedOpL( inParams, outParams , iNotif ); } } - void GetListOfWindowGroupsL(TRequestStatus& aStatus, TPtr8& aPtr) - { - if ( Connect() ) - { - TAlfCommandParams params={EGetListOfWindowGroups,0,0,0}; - TPckgC pkg(params); - iNotif.StartNotifierAndGetResponse(aStatus,TUid::Uid(KAlfAppFwProxyUid), pkg, aPtr); - } - } public: TBool iLayoutMirrored; RNotifier iNotif;