diff -r 000000000000 -r 5d03bc08d59c graphicscomposition/openwfsupport/src/contentupdateproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicscomposition/openwfsupport/src/contentupdateproxy.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,191 @@ +// Copyright (c) 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: +// contentupdateproxy.cpp +// Proxy object for receiving SUS surface content update notifications and rerouting them to nativestream +// + + +#include +#include +#include "streammap.h" +#include "surfacestream.h" +#include "contentupdateproxy.h" + +CExtensionContainer* CContentUpdateProxy::NewL(TInt aScreenNum, COpenWfcStreamMap* aSingleton,TInt aInternalVersion,TInt aPriority) + { + CContentUpdateProxy* pInstance = new(ELeave) CContentUpdateProxy(); + CleanupStack::PushL(pInstance); + pInstance->ConstructL(aScreenNum,aSingleton,aInternalVersion,aPriority); + CleanupStack::Pop(pInstance); + return pInstance; + } +void CContentUpdateProxy::ConstructL(TInt aScreenNum, COpenWfcStreamMap* aSingleton,TInt aInternalVersion,TInt aPriority) + { + iScreenNum=aScreenNum; + iSingleton=aSingleton; + iInternalVersion=aInternalVersion; + iPriority=aPriority; + } +CContentUpdateProxy::CContentUpdateProxy(): +iHeap(User::Heap()) + { + } +CContentUpdateProxy::~CContentUpdateProxy() + { + + } + +TInt CContentUpdateProxy::Extension_(TUint aExtensionId, TAny*& aRetPtr, TAny* a1) + { + switch (aExtensionId) + { + case MCompositionSurfaceUpdate::ETypeId: + { + aRetPtr=static_cast(this); + return KErrNone; + } + default: + { + return CExtensionContainer::Extension_(aExtensionId,aRetPtr,a1); + } + } + } + +TInt CContentUpdateProxy::ApiVersion() + { + return KContentUpdateProxyVersion; + } + +TVersion CContentUpdateProxy::InternalVersion() + { + return TVersion(iInternalVersion>>24,(iInternalVersion>>16)&0xff,iInternalVersion&0xffff); + } + +void CContentUpdateProxy::ContentUpdated + ( const TSurfaceId& aSurface, TInt aBuffer, + const TRegion* aRegion, + TRequestStatus* aStatusConsumed, + TRequestStatus* aStatusDisplayed, TUint32* aTimeStamp, + TRequestStatus* aStatusDispXTimes, TInt* aDisplayedXTimes) + { + NFLOG(("### CContentUpdateProxy srf(0x%x:0x%x:0x%x:0x%x)," + "\n\t\t buff(%d),\n\t\t rg(0x%x),\n\t\t rsConsumed(0x%x),\n\t\t rsDsp(0x%x),\n\t\t ts(0x%x)," + "\n\t\t rsDXT(0x%x),\n\t\t dXT(%d)", + aSurface.iInternal[0], aSurface.iInternal[1], aSurface.iInternal[2], aSurface.iInternal[3], + aBuffer, aRegion, aStatusConsumed, aStatusDisplayed, aTimeStamp, aStatusDispXTimes, aDisplayedXTimes ? *aDisplayedXTimes: 0)); + + COpenWfcStreamMap* stream = NULL; + TRAPD(err,stream = &COpenWfcStreamMap::InstanceL()); + if (err != KErrNone) + { + NFLOG(("### ERROR - EARLY EXIT * CContentUpdateProxy::ContentUpdated()")); + // cancel notifications + CompleteStatus( + aStatusConsumed, + aStatusDisplayed, + aStatusDispXTimes, + err); + return; + } + RHeap* oldHeap = NULL; + if (&iHeap != &(User::Heap())) + { + oldHeap = User::SwitchHeap(stream->GetMainHeap()); + } + CSurfaceStream* ns = NULL; + ns = stream->Find(aSurface); + + if (ns) + { + RegisterNotifications(*ns, + aBuffer, + aStatusDisplayed, aTimeStamp, + aStatusDispXTimes, aDisplayedXTimes, + aStatusConsumed, aRegion); + + ns->ReleaseReference(); + } + else + { + // cancel notifications + CompleteStatus(aStatusConsumed, + aStatusDisplayed, + aStatusDispXTimes, + KErrSurfaceNotRegistered); + } + if (oldHeap) + { + (void)User::SwitchHeap(oldHeap); + } + NFLOG(("### EXIT * CContentUpdateProxy::ContentUpdated()")); + } + +void CContentUpdateProxy::CompleteStatus( + TRequestStatus* aStatusConsumed, + TRequestStatus* aStatusDisplayed, + TRequestStatus* aStatusDispXTimes, + TInt aReason) + { + if (aStatusConsumed) + { + User::RequestComplete(aStatusConsumed, aReason); + } + if (aStatusDisplayed) + { + User::RequestComplete(aStatusDisplayed, aReason); + } + if (aStatusDispXTimes) + { + User::RequestComplete(aStatusDispXTimes, aReason); + } + } + +void CContentUpdateProxy::RegisterNotifications(CSurfaceStream& aNs, + TInt aBuffer, + TRequestStatus* aStatusDisplayed, TUint32* aTimeStamp, + TRequestStatus* aStatusDispXTimes, TInt* aDisplayedXTimes, + TRequestStatus* aStatusConsumed, const TRegion* aRegion) + { + if (KErrNone != aNs.CheckBufferNumber(aBuffer, aStatusDisplayed, aStatusDispXTimes, aStatusConsumed)) + { + return; + } + + TInt updateFlag = 0; + if (aStatusConsumed) + { + *aStatusConsumed = KRequestPending; + updateFlag |= ESOWF_EventAvailable; + } + if (aStatusDisplayed) + { + *aStatusDisplayed = KRequestPending; + updateFlag |= ESOWF_EventDisplayed; + } + if (aStatusDispXTimes) + { + *aStatusDispXTimes = KRequestPending; + updateFlag |= ESOWF_EventDisplayedX; + } + + aNs.SetNewNotifications(aBuffer, + aStatusDisplayed, + aTimeStamp, + aStatusDispXTimes, + aDisplayedXTimes, + aStatusConsumed, + aRegion, + iScreenNum); + } +