diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/ServerCore/Inc/alfsrvscreenbuffermanager.h --- /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 +#include +#include + +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 iScreenBufferObservers; + + }; + +#endif // C_ALFSRVSCREENBUFFERMANAGER_H