commonuisupport/uikon/srvinc/EIKNFYSV.H
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuisupport/uikon/srvinc/EIKNFYSV.H	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,422 @@
+// Copyright (c) 1997-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:
+//
+
+/**
+ @file 
+ @internalComponent 
+*/
+
+#ifndef __EIKNFYSV_H__
+#define __EIKNFYSV_H__
+
+#include <e32base.h>
+#include <w32std.h>
+#include <eiknotapi.h>
+#include <uikon/eiksvfty.h>
+#include <uikon/eiknotifyalert.h>
+
+#include <ecom/ecom.h>
+
+//
+// class CEikServNotifyServer
+//
+
+class CEikSrvNotifierManager;
+class CEikServNotifyAlert;
+class MEikSrvNotifierBase2;
+class CChannelMonitor;
+class CActivityMonitor;
+class CEikNotifierQueue;
+class CEikServNotifySession;
+class TNotifierSecureInfo;
+
+class MEikInfoMsgWin;
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(TNotifierMessageInfo)
+	{
+public:
+	TNotifierMessageInfo(const RMessage2& aMessage, CEikServNotifySession& aEikServNotifySession);
+private:
+	TNotifierMessageInfo();
+public:
+	RMessage2 iMessage;
+	CEikServNotifySession& iEikServNotifySession;
+	};
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(TNotifierSecureInfo)
+	{
+public:
+	TNotifierSecureInfo(const TUid aNotifierUid, const TSecureId aSecureId);
+public:
+	TUid iNotifierUid;
+	TSecureId iSecureId;
+	};
+
+/** @internalComponent */
+typedef RArray<const TNotifierMessageInfo> RNotifierMessageInfoQueue;
+/** @internalComponent */
+typedef RArray<const TNotifierSecureInfo> RNotifierSecureInfoQueue;
+
+/** 
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CEikServNotifyServer) : public CPolicyServer
+	{
+public:
+	IMPORT_C static CEikServNotifyServer* NewL(MEikServNotifyAlert* aAlert);
+	IMPORT_C ~CEikServNotifyServer();
+	IMPORT_C void StartL();
+public:
+	IMPORT_C void DisplayNotifier(const TDesC& aTitle, const TDesC& aLabel, const TDesC& aBut1, const TDesC& aBut2, MEikNotifyAlertCompletionObserver* aObserver);
+	IMPORT_C void DisplayInfoPrint(const TDesC& aDes);
+	inline CEikSrvNotifierManager* Manager() const;
+	inline RNotifierMessageInfoQueue& AsyncMessageQueue() { return iAsyncMessageQueue; }
+	inline RNotifierSecureInfoQueue& AsyncSecureInfoQueue() { return iAsyncSecureInfoQueue; }
+public:
+	void SetIsExiting();
+	TBool IsExiting() const;
+private:
+	CEikServNotifyServer(TInt aPriority, MEikServNotifyAlert* aAlert);
+	void ConstructL();
+	TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing);
+private: // from CServer2
+	CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const;
+private:
+	MEikServNotifyAlert* iAlert;
+	MEikInfoMsgWin* iInfoMsg;
+	RWindowGroup iInfoMsgGroupWin;
+	CEikSrvNotifierManager* iManager;
+	TBool iExiting;
+	RNotifierMessageInfoQueue iAsyncMessageQueue;
+	RNotifierSecureInfoQueue iAsyncSecureInfoQueue;
+	};
+
+//
+// class CEikServNotifySession
+//
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CEikServNotifySession) : public CSession2, public MEikNotifyAlertCompletionObserver
+	{
+public:
+	static CEikServNotifySession* NewL();
+	~CEikServNotifySession();
+public: // from CSession
+	void HandleAlertCompletion(const TInt aButtonVal);
+public: // from CSession2
+	void ServiceL(const RMessage2 &aMessage);
+private:
+	CEikServNotifySession();
+	void ConstructL();
+	void DisplayAlert(const RMessage2& aMessage);
+	void PrepareDisplayAlert();
+	void DisplayNextPendingAlert();
+	void DisplayInfoMsg(const RMessage2& aMessage);
+	void StartNotifierL(const RMessage2& aMessage);
+	void UpdateNotifierL(const RMessage2& aMessage);
+	void StartNotifierAndGetResponseL(const RMessage2& aMessage,TBool& aCleanupComplete);
+	CEikServNotifyServer& Server() const {return *static_cast<CEikServNotifyServer*>( const_cast<CServer2*>(CSession2::Server()) );}
+	static HBufC8* GetRemoteInputBufferLC(const RMessage2& aMessage, TInt aSlot);
+	void UpdateNotifierAndGetResponseL(const RMessage2& aMessage);
+	TInt NotifierCancel(const RMessage2 &aMessage);
+private:
+	const CEikServNotifyServer* iServer;
+	TInt iClientId;
+	TInt iLengthOfFirstLineOfMessage;
+	TInt iLengthOfSecondLineOfMessage;
+	TInt iLengthOfFirstButtonOfMessage;
+	TInt iLengthOfSecondButtonOfMessage;
+	TInt iLengthOfCombinedBuffer;
+	HBufC* iBuffer;
+private:
+	NONSHARABLE_CLASS(CEikSrvPendingAlert) : public CActive
+		{
+	public:
+		CEikSrvPendingAlert(CEikServNotifySession& aEikServNotifySession);
+		~CEikSrvPendingAlert();
+	public:
+		void TriggerNext();
+	private: // from CActive
+		void RunL();
+		void DoCancel();
+	private:
+		CEikServNotifySession& iEikServNotifySession;
+		};
+private:
+	CEikSrvPendingAlert* iEikSrvPendingAlert;
+public: 
+	friend class CEikSrvPendingAlert;
+	};
+
+
+//
+// class CEikSrvNotifierWrapper
+//
+
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CEikSrvNotifierWrapper) : public CBase
+	{
+public:
+	CEikSrvNotifierWrapper(MEikSrvNotifierBase2* aNotifier);
+	~CEikSrvNotifierWrapper();
+	void RegisterNotifierL();
+public:
+	MEikSrvNotifierBase2* iNotifier;
+	MEikSrvNotifierBase2::TNotifierInfo iInfo;
+	TUid iDestructorKey;
+	TUid iPlugInDllUid;
+	TBool iIsReadyForRemoval;
+	};
+
+//
+// class CEikSrvNotifierRemover
+//
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CEikSrvNotifierRemover) : public CActive
+	{
+public:
+	static CEikSrvNotifierRemover* NewL();
+	void Start(CEikSrvNotifierManager* aManager, CArrayPtr<CEikSrvNotifierWrapper>* aObservedList);
+	~CEikSrvNotifierRemover();
+private:
+	CEikSrvNotifierRemover();
+private:
+	// from CActive
+	void RunL();
+	void DoCancel();
+public:
+	CEikSrvNotifierManager* iManager;
+	CArrayPtr<CEikSrvNotifierWrapper>* iObservedList;
+	};
+
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CEikNotifierQueue) : public CBase
+	{
+public:
+	class CQueueItem;
+public:
+	static CEikNotifierQueue* NewL();
+	inline void QueueItemL(CEikNotifierQueue::CQueueItem* aItem);
+	CQueueItem* FetchItem(TUid aChannel);
+	TBool IsAlreadyQueued(TUid aNotifier,TUid aChannel) const;
+	void RemoveClient(TInt aClientId);
+	TInt GetHighestQueuePriority(TUid aChannel);
+	inline TInt Count() const;
+	const CQueueItem& At(TInt aIndex) const;
+	void RemoveNotifier(TUid aNotifierUid);
+public:
+	NONSHARABLE_CLASS(CQueueItem) : public CBase
+		{
+	public:
+		static CQueueItem* NewLC(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId, const TDesC8& aBuffer, const RMessage2& aMessage, TInt aReplySlot);
+		~CQueueItem();
+		inline const TDesC8& Buffer() const {return *iBuffer;}
+	private:
+		CQueueItem(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId, const RMessage2& aMessage, TInt aReplySlot);
+		void ConstructL(const TDesC8& aBuffer);
+	public:
+		const MEikSrvNotifierBase2::TNotifierInfo iInfo;
+		const TInt iClientId;
+		const RMessage2 iMessage;
+		TInt iReplySlot;
+	private:
+		HBufC8* iBuffer;
+		};
+private:
+	inline CEikNotifierQueue();
+private:
+	CArrayPtrFlat<CQueueItem> iQueue;
+	};
+
+class MNotifierStarter;
+class MNotifierUpdater;
+class CDiscoverNewImplementation;
+class CPluginTrack;
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CEikSrvNotifierManager) : public CBase, public MEikSrvNotifierManager
+	{
+public:
+	static CEikSrvNotifierManager* NewL();
+	~CEikSrvNotifierManager();
+	void NotifierStartL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8* aResponse,TInt aClientId);
+	TInt NotifierUpdateL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8* aResponse,TInt aClientId);
+	TInt NotifierCancel(TUid aNotifierUid);
+	void NotifierStartAndGetResponseL(TUid aNotifierUid,const TDesC8& aBuffer,TInt aReplySlot,
+										const RMessage2& aMessage,TInt aClientId,TBool& aCleanupComplete);
+	void HandleClientExit(TInt aClientId);
+	void NotifierStartAndGetResponseL(TUid aNotifierUid,TUid aChannelUid,const TDesC8& aBuffer,TInt aReplySlot,
+										const RMessage2& aMessage,TInt aClientId,TBool& aCleanupComplete);
+	void HandleScreenDeviceChangedL();
+	void RegisterSingleNotifierFromTransientPlugInL(TUid aPlugInUid, TUid aNotifierUid);
+	void NotifierUpdateAndGetResponseL(TUid aNotifierUid,const TDesC8& aBuffer,TInt aReplySlot,
+										const RMessage2& aMessage,TInt aClientId);
+public:
+	void RegisterL();
+	void CheckForEcomPluginInstallUninstall();
+public: // from MEikSrvNotifierManager 
+	void StartNotifierL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+	void CancelNotifier(TUid aNotifierUid);
+	void UpdateNotifierL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
+private:
+	void DoAddPlugInL(const TDesC& aPath,const TDesC& aFileName,const TUidType& aUidType);
+	void TryAddNotifiersFromNotifierArrayL(CArrayPtr<CEikSrvNotifierWrapper>* aNotifierArray, TInt& aRollBackChannels);
+	CEikSrvNotifierManager();
+	void ConstructL();
+	void StartNextFromQueue(TUid aChannel);
+	void DoStartQueuedItemLD(CEikNotifierQueue::CQueueItem* aItem);
+	TBool NotifierHandlesScreenMode(MEikSrvNotifierBase2* aNotifier);
+	CArrayPtr<CEikSrvNotifierWrapper>* TryLoadPlugInL(TUid aPlugInUid);
+	TBool TryLoadPlugInFromSpecifiedDriveL(RFs& aFs, TUid aPlugInUid, TInt aDriveIndex, CArrayPtr<CEikSrvNotifierWrapper>*& aNotifierArray);
+	CArrayPtr<CEikSrvNotifierWrapper>* LoadPlugInAndPopulateNotifierArrayL(const TDesC& aPath, const TDesC& aFileName, const TUidType& aUidType);
+	TInt QueueNotifierForPossibleRemoval(TUid aNotifierUid);
+	CArrayPtr<CEikSrvNotifierWrapper>* CreateNotifierArrayFromPlugInArrayL(CArrayPtr<MEikSrvNotifierBase2>* aPlugInArray, const TUidType& aUidType);
+	void UpdateHighestPriorityNotifiersOnThisChannelOfTheirPausingOrResuming(TUid aChannelUid, TUid aHighestPriorityNotifierOnThisChannelUid, const TDesC8& aBuffer);
+	void TryFindAndRegisterNotifierFromPlugInDllL(TUid aNotifierUid);
+	void LookForNotifierInObservedListL(TUid aNotifierUid, TUid aChannelUid, RArray<TInt>& aNotifierPositions);
+	void DoNotifierStartL(MNotifierStarter& aNotifierStarter, TBool& aCleanupComplete, TUid aNotifierUid, TUid aChannelUid, const TDesC8& aBuffer, TDes8* aResponse, TInt aClientId);
+	TInt DoNotifierUpdateL(MNotifierUpdater& aNotifierStarter, TUid aNotifierUid, const TDesC8& aBuffer, TDes8* aResponse, TInt aClientId);
+private:
+	void DoAddPlugInL(TUid aUid);
+	CArrayPtr<CEikSrvNotifierWrapper>* LoadPlugInAndPopulateNotifierArrayL(TUid aUid);
+	void UnloadEComPlugInImplementation(TInt aIndex);
+	TBool IsImplementationRemoved(TUid aImplementationUid, RImplInfoPtrArray& aPlugInArray);
+	TBool IsImplementationAdded(TUid aImplementationUid);
+private:
+	CArrayPtr<CEikSrvNotifierWrapper>* iObservedList;
+	CChannelMonitor* iChannelMonitor;
+	CActivityMonitor* iActivityMonitor;
+	CEikNotifierQueue* iQueue;
+	CEikSrvNotifierRemover* iNotifierRemover;
+	CDiscoverNewImplementation* iDiscoverNewImplementation;
+	RPointerArray <CPluginTrack> iPluginUidList;
+	};
+
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CChannelMonitor) : public CBase
+	{
+public:
+	static CChannelMonitor* NewL();
+	inline void AddNewChannelL(TUid aChannel);
+	void DeleteChannel(TInt aIndex);
+	TInt NumberOfChannels() const;
+	TBool AlreadyHasChannel(TUid aChannel) const;
+	TInt ActivityLevel(TUid aChannel) const;
+	void UpdateChannel(TUid aChannel, TInt aLevel);
+private:
+	CChannelMonitor();
+private:
+	/**
+	@internalComponent
+	*/
+	NONSHARABLE_CLASS(TChannelActivity)
+		{
+	public:
+		inline TChannelActivity(TUid aChannel, TInt aHighestPriorityRunning);
+	public:
+		TUid iChannel;
+		TInt iHighestPriorityRunning;
+		};	
+private:
+	CArrayFixFlat<TChannelActivity> iMonitor;
+	};
+
+
+/**
+@internalComponent 
+*/
+NONSHARABLE_CLASS(CActivityMonitor) : public CBase
+	{
+public:
+	static CActivityMonitor* NewL();
+	~CActivityMonitor();
+	void AddL(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId);
+	void Remove(TUid aNotifierUid, TInt aClientId);
+	void RemoveNotifier(TUid aNotifierUid, TUid aChannel);
+	void RemoveClient(TInt aClientId);
+	TBool IsNotifierActive(TUid aNotifierUid,TUid aChannel) const;
+	TBool IsChannelActive(TUid aChannel, TUid& aNotifier,MEikSrvNotifierBase2::TNotifierPriority& aHighestPriority) const;
+	TBool IsClientPresent(TUid aNotifierUid, TUid aChannel, TInt aClientId) const;
+	TBool NotifierForClient(TUid& aNotifier, TInt aClientId) const;
+private:
+	CActivityMonitor();
+	TInt Find(TUid aNotifierUid) const;
+	TInt Find(TUid aNotifierUid, TUid aChannel) const;
+private:
+	/**
+	@internalComponent 
+	*/
+	NONSHARABLE_CLASS(CNotifierActivity) : public CBase
+		{
+	public:
+		static CNotifierActivity* NewLC(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId);
+		~CNotifierActivity();
+		TInt Find(TInt aClientId) const;
+	private:
+		CNotifierActivity(const MEikSrvNotifierBase2::TNotifierInfo& aInfo);
+		void ConstructL(TInt aClientId);
+	public:
+		const MEikSrvNotifierBase2::TNotifierInfo iInfo;
+		CArrayFixFlat<TInt> iClientArray;
+		};	
+private:
+	CArrayPtrFlat<CNotifierActivity> iMonitor;
+	};
+	
+
+inline CChannelMonitor::TChannelActivity::TChannelActivity(TUid aChannel, TInt aHighestPriorityRunning)
+	:iChannel(aChannel), iHighestPriorityRunning(aHighestPriorityRunning)
+	{}
+
+inline void CChannelMonitor::AddNewChannelL(TUid aChannel)
+	{iMonitor.AppendL(TChannelActivity(aChannel,0));}
+
+inline CEikSrvNotifierManager* CEikServNotifyServer::Manager() const
+	{return iManager;}
+
+inline void CEikNotifierQueue::QueueItemL(CEikNotifierQueue::CQueueItem* aItem)
+	{iQueue.AppendL(aItem);}
+	
+inline TInt CEikNotifierQueue::Count() const
+	{return iQueue.Count();}
+	
+inline CEikNotifierQueue::CEikNotifierQueue()
+	:iQueue(3)
+	{}
+
+
+#endif	// __EIKNFYSV_H__