graphicscomposition/openwfsupport/src/contentupdateproxy.cpp
changeset 0 5d03bc08d59c
--- /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 <e32def.h>
+#include <graphics/suerror.h>
+#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<MCompositionSurfaceUpdate*>(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);
+    }
+