uiaccelerator_plat/alf_client_server_api/inc/alf/alfappserver.h
changeset 0 15bf7259bb7c
child 8 10534483575f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiaccelerator_plat/alf_client_server_api/inc/alf/alfappserver.h	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,420 @@
+/*
+* 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:   Application server
+*
+*/
+
+
+
+#ifndef C_ALFAPPSERVER_H
+#define C_ALFAPPSERVER_H
+
+#include <AknServerApp.h>
+#include <w32std.h>
+#include <alf/alfmetricsinterface.h>    
+#include <alf/alfappui.h>
+#include <alf/alfextensionfactory.h>   
+#include <alf/alfconstants.h> 
+#include <uiacceltk/HuiCommand.h>
+#include <uiacceltk/HuiEnv.h> 
+#include <uiacceltk/HuiDisplay.h> 
+
+class CApaAppServiceBase;
+class CAlfAppSrvSessionBase;
+class CAlfEcomUtil; 
+class MWindowVisibilityObserver;
+class CAlfSrvSubSessionBase;
+class CAlfSrvTransEffect;
+class CAlfAppSrvSession;
+class CAlfSrvTextureManager;
+class MTransitionServer2;
+class CAlfSrvScreenBufferManager;
+
+/**
+ *  Application server class.
+ *
+ *  The server class is responsible of managing the sessions/services.
+ *
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS(CAlfAppServer) : public CAknAppServer
+    {   
+    
+public:
+
+    // Window group position compared to the client wg (=parent)
+    enum TAlfWGPostion
+        {
+        EBehindOfParent,
+        EOnTopOfParent,
+        EAbsoluteBackground,
+        EAlfWindowSize
+        };
+
+
+    /**
+     * Static constructor.
+     */
+    IMPORT_C static CAlfAppServer* NewAppServerL();
+
+    /**
+     * Destructor.
+     */
+    ~CAlfAppServer();
+    
+    /**
+     * Client is about to exit, free all resources for the specific client
+     *
+     * @param aClientId Unique identifier of client, usually address of client's 
+     *                  instance pointer
+     */ //Todo: as this is called from base class inside library, no need to export ?
+    IMPORT_C void HandleClientExit(TInt aClientId);
+    
+    /**
+     * Moves the server window group relative to the clinet (parent) wg.
+     *
+     * @param aWindowGroup Server window group
+     * @param aParentIdentifier Client side window group
+     * @param aPosition Server's wg position compared to the client's wg.
+     */
+    IMPORT_C void AdjustWindowGroupPositionL(
+        RWindowGroup& aWindowGroup, 
+        TInt aParentIdentifier, 
+        TAlfWGPostion aPosition );
+        
+    /**
+     * Get server's window server session.
+     *
+     * @return Window server session reference.
+     */
+    IMPORT_C RWsSession& WsSession() const;
+
+    /**
+     * Get metrics interface
+     *
+     * @return Metrics API. NULL if not set. Ownership not transferred.
+     */
+    IMPORT_C MAlfMetricsInterface* MetricsInterface();
+    IMPORT_C const MAlfMetricsInterface* MetricsInterface() const;
+
+    /**
+     * Set metrics interface
+     *
+     * @param aMetricsInterface Metrics API. Ownership not transferred.
+     */
+    IMPORT_C void SetMetricsInterface(MAlfMetricsInterface* aMetricsInterface);
+
+    /**
+     * Sets AppUi pointer.
+     *
+     * @param aAppUi AppUi pointer. Ownership not transferred.
+     */
+    void SetAppUi(CAlfAppUi* aAppUi);
+    
+    /**
+     * Get AppUi pointer
+     *
+     * @return AppUi pointer. NULL if not set. Ownership not transferred.
+     */
+    IMPORT_C CAlfAppUi* AppUi();
+        
+    /**
+     * Called when the focused window group is changed
+     *
+     * @param aSession Pointer to focused session
+     * @param aWgId Window group identifier of new session, needed only when embedded apps transition takes place
+     */
+    void FocusedWindowGroupChangedL( CAlfAppSrvSessionBase* aSession, TInt aWgId = KErrNotFound );
+    
+    /**
+     * Called when window visibility changes.
+     *
+     * @param aVisibilityFlags Visibility flags - see TWsVisibilityChangedEvent
+     * @param aDestination Associated window-owning control.
+     */
+    void WindowVisiblityChangedL( TUint aVisibilityFlags, CCoeControl* aDestination );
+
+    /**
+     * Checks ECom plug-ins.
+     */
+    void CheckForEcomPluginInstallUninstallL();
+
+    /**
+     * For setting observers which will receive notify when window visibility changes.
+     *
+     * @param aObserver observer implementing MWindowVisibilityObserver interface
+     * @param aClientId Identifier of a session so observer can be removed on queue when the session is terminated
+     */
+    IMPORT_C void SetWindowChangeObserverL(MWindowVisibilityObserver* aObserver, TInt aClientId); 
+
+    /**
+     * Returns a new container for sub sessions.
+     *
+     * @return Container. Ownership not transferred.
+     */
+    CObjectCon* NewContainerL();
+    
+// from base class CAknAppServer
+
+    /**
+     * From CAknAppServer
+     * Creates session/service based on the given service type.
+     * This is called by the framework when a client opens session with the 
+     * server.
+     *
+     * @param aServiceType Service type, which identifies the service.
+     * @return New service/session instance. Ownership transferred.
+     */
+    CApaAppServiceBase* CreateServiceL( TUid aServiceType ) const;
+    
+    /**
+     * From CAknAppServer
+     * Called when all client have exited.
+     */
+    void HandleAllClientsClosed();
+        
+public: // internals
+
+    /**
+     * Used by callback for asynchronous ecom implementation removal
+     */   
+    void DoSynchEcomImplementations();
+
+    MAlfExtension* CreateExtensionL(TInt aImplementationUid, TInt aImplementationId, const RMessage2 & aMessage );
+    
+    void DestroyedObject(TInt aFactoryUid);
+
+    void CreateTransitionEffectsL();
+    
+    CAlfSrvTransEffect* TransitionEffects();
+    
+	TInt CreateTfxServerPlugin();
+ 
+ 	MTransitionServer2* TfxServer();
+    
+    /**
+     * Sends an event to all clients. This method can be used for general purpose server to client
+     * notifications e.g. when server receives resource changed event or ws-events or
+     * something else as long as the clientside knows how to handle the event.  
+     */
+    void TriggerSystemEvent(TInt aEvent);
+    
+    void StartBackgroundTimerL(TInt aClientWg);
+    
+    void CancelBackgroundTimer();
+    
+    /**
+     * Returns maximum length of common command batch buffer.
+     * @return maximum length of common command batch buffer.
+     */
+    TInt CommonCommandBatchBufferMaxLength() const;
+
+    /**
+     * Gets common command batch buffer (unless it is already in use).
+     * Client must call ReleaseCommonCommandBatchBuffer to release buffer for 
+     * global use.
+     * @param aBuffer pointer descriptor which will point to common buffer.
+     * @return ETrue if common command batch buffer was given to client, EFalse otherwise.
+     */
+    TBool AcquireCommonCommandBatchBuffer( TPtr8& aBuffer );
+
+    /**
+     * Releases common command batch buffer for global use.
+     */
+    void ReleaseCommonCommandBatchBuffer();
+   
+    /**
+     * Returns reference to texture manager.
+     * @return reference to texture manager.
+     */
+    CAlfSrvTextureManager& TextureManager();
+    
+    /**
+     * Returns reference to screen buffer manager.
+     * @return reference to screen buffer manager.
+     */
+    CAlfSrvScreenBufferManager& ScreenBufferManager();
+
+    /**
+     * Goes through all the sessions and checks if one of them has the keyboard focus
+     */
+    TBool AlfClientHasFocus();
+    
+    /**
+     * This is typically called by the session when it receives EAlfNotifyAppVisibility event that
+     * it's windowgroup is getting hidden.
+     * 
+     * The session can query if there is some other alf application's window group above it 
+     * and set that other session as a new activesession  
+     */
+    CAlfAppSrvSessionBase* UpMostClientAboveWg( TInt aWgId );
+
+public:
+    
+    CAlfAppSrvSessionBase* iOldSession;
+
+    /**
+     * Second phase constructor. Called by framework.
+     * @param aFixedServerName server name.
+     */
+    void ConstructL( const TDesC& aFixedServerName );
+    
+private:
+
+    // private default constructor
+    CAlfAppServer();    
+
+    /**
+     * Checks if implementation exists.
+     */
+    TBool ImplementationExists(TUid aServiceType) const;
+    
+    /**
+     * Loads extension.
+     */
+    CAlfAppSrvSessionBase* LoadServiceExtensionL(TUid aServiceType);
+    
+    /**
+     * Creates new session implementation.
+     */
+    CAlfAppSrvSessionBase* NewImplementationL(TUid aServiceType);
+        
+    /**
+     * Initiate callback for asynchronous ecom implementation removal
+     */
+    void SyncEcomImplementations(TInt aClientId); 
+    
+    /**
+     * Rnd: logs the window groups
+     */
+    void LogWindowGroupsL() const;
+    
+    /**
+    * Ecom factory has been removed, command sessions to close assosiated objects
+    */
+    void NotifySessionsAboutDestroyedImplementation(TInt aFactoryUid);
+
+private:
+
+    // just to allow accessing Cone's session without CCoeStatic
+    RWsSession* iWs; 
+    
+    // backdrop window group identifier, cahcing this value allows us find status pane window group much faster
+    // should be initialized in leaving constructor once that is implemented 
+    TInt iBackDropWgIdentifier; 
+
+    // Metrics API. Not owned.
+    MAlfMetricsInterface* iMetricsInterface;
+    
+    // AppUi pointer. Not owned.
+    CAlfAppUi* iAppUi;
+    
+    // Window group id of the client
+    // This is updated when the client becomes focused.
+    TInt iLastActiveClientWg;
+    
+    // ECom observer.
+    CAlfEcomUtil* iEcomWatcher;
+    
+    struct TWindowChangeObserver
+        {
+        TWindowChangeObserver(MWindowVisibilityObserver* aObserver, TInt aClientId):iId(aClientId), iPtr(aObserver){}
+        TInt iId;
+        MWindowVisibilityObserver* iPtr;
+        };
+    
+    // list of sessions which are interested about window visibility changes
+    RArray<TWindowChangeObserver> iWindowChangeObservers;
+    
+    struct TServiceExtension
+        {
+        TServiceExtension():iImpl(0){}
+        operator==(const TInt aId)
+            {
+            return TInt(iImpl)==aId;
+            }
+        TUid iDestructorUid;
+        TUid iServiceUid;
+        CAlfAppSrvSessionBase* iImpl;
+        };
+    
+    // list of ecom based sessions 
+    RArray<TServiceExtension> iCustomSessions;
+    
+    // list of ecom based sessions that have been already destructed, 
+    // but the ECom Fw has not been notified yet
+    RArray<TInt> iRemovedArray;
+    
+    // Async callback for ecom callbacks
+    CAsyncCallBack* iAsynchOneShot;
+    
+    // For sub session objects. Own.
+    CObjectConIx* iObjectConIx;
+
+    
+    struct TAlfElementFactory
+        {
+        TAlfElementFactory():iImpl(0), iAccessCount(0){}
+        operator==(const TInt aId)
+            {
+            return iUid.iUid==aId;
+            }
+
+        TUid iDestructorUid;
+        TUid iUid;
+        MAlfExtensionFactory* iImpl;
+        TInt iAccessCount;
+        };
+    
+    RArray<TAlfElementFactory> iFactories;
+        
+    TInt iTransitionEffect;
+
+    // Transition effects framework
+    CAlfSrvTransEffect* iTransitionEffects;
+
+	// Tfx Server API (ECom plugin)
+    MTransitionServer2* iTfxServer;
+
+	// Tfx Server API destructor uid
+    TUid iTfxServerEComDestructorUID;
+
+    CPeriodic* iBackgroundTimer;
+    
+    /**
+     * Command batch buffer. This buffer is shared between all sessions.
+     * Owned.
+     */
+    HBufC8* iCommonCommandBatchBuffer;
+
+    /**
+     * Boolean variable indicating if common command batch buffer is in use.
+     */
+    TBool iCommonCommandBatchBufferInUse;
+    
+    /**
+     * Server side texture manager.
+     * Owned.
+     */
+    CAlfSrvTextureManager* iTextureManager;
+    
+    /**
+     * Server side screen buffer manager.
+     * Owned.
+     */
+    CAlfSrvScreenBufferManager* iScreenBufferManager;
+    
+    };
+
+#endif // C_ALFAPPSERVER_H