uiacceltk/hitchcock/ServerCore/Inc/alfsrvscreenbuffermanager.h
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfsrvscreenbuffermanager.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2006 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:   Server side screen buffer manager
+*
+*/
+
+
+
+#ifndef C_ALFSRVSCREENBUFFERMANAGER_H
+#define C_ALFSRVSCREENBUFFERMANAGER_H
+
+#include <e32base.h>
+#include <alf/alfconstants.h> 
+#include <uiacceltk/HuiDisplay.h> 
+
+class CAlfAppSrvSessionBase;
+class CAlfAppServer;
+
+/**
+ *  Server side screen buffer manager
+ *
+ *  The class handles off-screen buffer events and observers.
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS(CAlfSrvScreenBufferManager) : public CBase, public MHuiScreenBufferObserver
+    {   
+    
+public:
+
+    /**
+     * Two-phased constructor.
+     *
+     * @param aAppServer Alf application server instance
+     * @return new instance of CAlfSrvScreenBufferManager.
+     */
+    static CAlfSrvScreenBufferManager* NewL(CAlfAppServer& aAppServer);
+
+    /**
+     * Destructor.
+     */
+    virtual ~CAlfSrvScreenBufferManager();
+    
+    /**
+     * Add a new observer.
+     *
+     * @param aSession Client session.
+     * @param aMessage Client message.
+     */
+	void AddScreenBufferObserver(CAlfAppSrvSessionBase* aSession, const RMessage2& aMessage);
+	
+    /**
+     * Remove an observer.
+     *
+     * @param aSession Client session.
+     * @param aMessage Client message.
+     */
+	void RemoveScreenBufferObserver(CAlfAppSrvSessionBase* aSession, const RMessage2& aMessage);
+	
+    /**
+     * Request a next frame and buffer from Hui display. Unlocks the display.
+     *
+     * @param aSession Client session.
+     * @param aMessage Client message.
+     */
+	void RequestNextBuffer(CAlfAppSrvSessionBase* aSession, const RMessage2& aMessage);
+	
+    /**
+     * Draw an off-screen buffer to the internal window.
+     *
+     * @param aSession Client session.
+     * @param aMessage Client message.
+     */
+	void RequestBufferDraw(CAlfAppSrvSessionBase* aSession, const RMessage2& aMessage);
+	
+    /**
+     * Request a general screen buffer event.
+     *
+     * @param aSession Client session.
+     * @param aMessage Client message.
+     */
+	void RequestScreenBufferEvent(CAlfAppSrvSessionBase* aSession, const RMessage2& aMessage);
+	
+    /**
+     * Remove all observer items related to this client session.
+     *
+     * @param aClientId Client session.
+     */
+	void RemoveScreenBufferObservers(CAlfAppSrvSessionBase* aClientId);
+	
+    /**
+     * Trigger a screen buffer event.
+     *
+     * @param aEvent Event to be triggered.
+     * @return Return true if there is a handler for the event.
+     */
+	TBool TriggerScreenBufferEvent(TAlfScreenBufferEvent& aEvent);
+	
+private: // internals
+
+    CAlfSrvScreenBufferManager(CAlfAppServer& aAppServer);    
+
+    void ConstructL();
+
+	TInt InitScreenBufferDisplay(TAlfScreenBufferBitmaps& aEvent, CHuiDisplay*& aFoundDisplay);
+
+	struct TScreenBufferObserverItem;	
+	
+	TBool TriggerScreenBufferCompleteEvent(TAlfScreenBufferEvent& aEvent);
+		
+	void FindScreenBufferDisplay(TUid aBufferUid, CHuiDisplay** aDisplay);
+
+	TInt RemoveAndReturnScreenBufferObserver(TScreenBufferObserverItem& aItem);
+
+	TBool ScreenBufferObserverExists(const TUid& aScreenBufferUid);
+	
+	TInt FindFromScreenBufferArray(
+	        const CAlfSrvScreenBufferManager::TScreenBufferObserverItem& aItem, 
+	        TInt& aIndex) const;
+
+	static TInt InsertFunc(
+	        const CAlfSrvScreenBufferManager::TScreenBufferObserverItem& aFirst, 
+	        const CAlfSrvScreenBufferManager::TScreenBufferObserverItem& aSecond );
+
+private: // From MHuiScreenBufferObserver
+	
+    TBool ScreenBufferComplete(TUid aUid, TRect& aDisplayRect, TRect& aDirtyRect);
+
+    void HandleScreenBufferEvent(TUid aUid, TInt aEvent);
+
+private:
+
+	/** The array item struct for screen buffer observers */
+   	struct TScreenBufferObserverItem
+        {
+        TScreenBufferObserverItem():
+        	iBufferUid(KNullUid), 
+        	iPriority(0), 
+        	iFlags(0), 
+        	iHuiDisplay(NULL), 
+        	iSession(NULL),  
+        	iNextEventId(0) {};
+        	
+        TScreenBufferObserverItem(TUid aBufferUid, TInt aPriority, TInt aFlags, CHuiDisplay* aHuiDisplay, CAlfAppSrvSessionBase* aSession, TInt aNextEventId):
+        	iBufferUid(aBufferUid), 
+        	iPriority(aPriority), 
+        	iFlags(aFlags), 
+        	iSession(aSession), 
+        	iHuiDisplay(aHuiDisplay), 
+        	iNextEventId(aNextEventId) {};
+        
+        /** Screen buffer uid */
+        TUid iBufferUid; 
+        /** Screen buffer priority */
+        TInt iPriority; 
+        /** Flags */
+        TInt iFlags; 
+        /** Pointer to the hui display */
+        CHuiDisplay* iHuiDisplay; 
+        /** Session */
+        CAlfAppSrvSessionBase* iSession;
+        /** Message */
+        RMessagePtr2 iMessage;
+        /** Id of the next event, if any */
+        TInt iNextEventId;
+       };
+    
+    /** Alf application server object */
+    CAlfAppServer& iAlfAppServer;
+    
+	/** Array of screen buffer observers for all sessions and buffers */
+	RArray<CAlfSrvScreenBufferManager::TScreenBufferObserverItem> iScreenBufferObservers;    
+	
+    };
+
+#endif // C_ALFSRVSCREENBUFFERMANAGER_H