--- /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