williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file williamr@2: @internalComponent williamr@2: */ williamr@2: williamr@2: #ifndef __EIKNFYSV_H__ williamr@2: #define __EIKNFYSV_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: // williamr@2: // class CEikServNotifyServer williamr@2: // williamr@2: williamr@2: class CEikSrvNotifierManager; williamr@2: class CEikServNotifyAlert; williamr@2: class MEikSrvNotifierBase2; williamr@2: class CChannelMonitor; williamr@2: class CActivityMonitor; williamr@2: class CEikNotifierQueue; williamr@2: class CEikServNotifySession; williamr@2: class TNotifierSecureInfo; williamr@2: williamr@2: class MEikInfoMsgWin; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(TNotifierMessageInfo) williamr@2: { williamr@2: public: williamr@2: TNotifierMessageInfo(const RMessage2& aMessage, CEikServNotifySession& aEikServNotifySession); williamr@2: private: williamr@2: TNotifierMessageInfo(); williamr@2: public: williamr@2: RMessage2 iMessage; williamr@2: CEikServNotifySession& iEikServNotifySession; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(TNotifierSecureInfo) williamr@2: { williamr@2: public: williamr@2: TNotifierSecureInfo(const TUid aNotifierUid, const TSecureId aSecureId); williamr@2: public: williamr@2: TUid iNotifierUid; williamr@2: TSecureId iSecureId; williamr@2: }; williamr@2: williamr@2: /** @internalComponent */ williamr@2: typedef RArray RNotifierMessageInfoQueue; williamr@2: /** @internalComponent */ williamr@2: typedef RArray RNotifierSecureInfoQueue; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikServNotifyServer) : public CPolicyServer williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CEikServNotifyServer* NewL(MEikServNotifyAlert* aAlert); williamr@2: IMPORT_C ~CEikServNotifyServer(); williamr@2: IMPORT_C void StartL(); williamr@2: public: williamr@2: IMPORT_C void DisplayNotifier(const TDesC& aTitle, const TDesC& aLabel, const TDesC& aBut1, const TDesC& aBut2, MEikNotifyAlertCompletionObserver* aObserver); williamr@2: IMPORT_C void DisplayInfoPrint(const TDesC& aDes); williamr@2: inline CEikSrvNotifierManager* Manager() const; williamr@2: inline RNotifierMessageInfoQueue& AsyncMessageQueue() { return iAsyncMessageQueue; } williamr@2: inline RNotifierSecureInfoQueue& AsyncSecureInfoQueue() { return iAsyncSecureInfoQueue; } williamr@2: public: williamr@2: void SetIsExiting(); williamr@2: TBool IsExiting() const; williamr@2: private: williamr@2: CEikServNotifyServer(TInt aPriority, MEikServNotifyAlert* aAlert); williamr@2: void ConstructL(); williamr@2: TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing); williamr@2: private: // from CServer2 williamr@2: CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const; williamr@2: private: williamr@2: MEikServNotifyAlert* iAlert; williamr@2: MEikInfoMsgWin* iInfoMsg; williamr@2: RWindowGroup iInfoMsgGroupWin; williamr@2: CEikSrvNotifierManager* iManager; williamr@2: TBool iExiting; williamr@2: RNotifierMessageInfoQueue iAsyncMessageQueue; williamr@2: RNotifierSecureInfoQueue iAsyncSecureInfoQueue; williamr@2: }; williamr@2: williamr@2: // williamr@2: // class CEikServNotifySession williamr@2: // williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikServNotifySession) : public CSession2, public MEikNotifyAlertCompletionObserver williamr@2: { williamr@2: public: williamr@2: static CEikServNotifySession* NewL(); williamr@2: ~CEikServNotifySession(); williamr@2: public: // from CSession williamr@2: void HandleAlertCompletion(const TInt aButtonVal); williamr@2: public: // from CSession2 williamr@2: void ServiceL(const RMessage2 &aMessage); williamr@2: private: williamr@2: CEikServNotifySession(); williamr@2: void ConstructL(); williamr@2: void DisplayAlert(const RMessage2& aMessage); williamr@2: void PrepareDisplayAlert(); williamr@2: void DisplayNextPendingAlert(); williamr@2: void DisplayInfoMsg(const RMessage2& aMessage); williamr@2: void StartNotifierL(const RMessage2& aMessage); williamr@2: void UpdateNotifierL(const RMessage2& aMessage); williamr@2: void StartNotifierAndGetResponseL(const RMessage2& aMessage,TBool& aCleanupComplete); williamr@2: CEikServNotifyServer& Server() const {return *static_cast( const_cast(CSession2::Server()) );} williamr@2: static HBufC8* GetRemoteInputBufferLC(const RMessage2& aMessage, TInt aSlot); williamr@2: void UpdateNotifierAndGetResponseL(const RMessage2& aMessage); williamr@2: TInt NotifierCancel(const RMessage2 &aMessage); williamr@2: private: williamr@2: const CEikServNotifyServer* iServer; williamr@2: TInt iClientId; williamr@2: TInt iLengthOfFirstLineOfMessage; williamr@2: TInt iLengthOfSecondLineOfMessage; williamr@2: TInt iLengthOfFirstButtonOfMessage; williamr@2: TInt iLengthOfSecondButtonOfMessage; williamr@2: TInt iLengthOfCombinedBuffer; williamr@2: HBufC* iBuffer; williamr@2: private: williamr@2: NONSHARABLE_CLASS(CEikSrvPendingAlert) : public CActive williamr@2: { williamr@2: public: williamr@2: CEikSrvPendingAlert(CEikServNotifySession& aEikServNotifySession); williamr@2: ~CEikSrvPendingAlert(); williamr@2: public: williamr@2: void TriggerNext(); williamr@2: private: // from CActive williamr@2: void RunL(); williamr@2: void DoCancel(); williamr@2: private: williamr@2: CEikServNotifySession& iEikServNotifySession; williamr@2: }; williamr@2: private: williamr@2: CEikSrvPendingAlert* iEikSrvPendingAlert; williamr@2: public: williamr@2: friend class CEikSrvPendingAlert; williamr@2: }; williamr@2: williamr@2: williamr@2: // williamr@2: // class CEikSrvNotifierWrapper williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikSrvNotifierWrapper) : public CBase williamr@2: { williamr@2: public: williamr@2: CEikSrvNotifierWrapper(MEikSrvNotifierBase2* aNotifier); williamr@2: ~CEikSrvNotifierWrapper(); williamr@2: void RegisterNotifierL(); williamr@2: public: williamr@2: MEikSrvNotifierBase2* iNotifier; williamr@2: MEikSrvNotifierBase2::TNotifierInfo iInfo; williamr@2: TUid iDestructorKey; williamr@2: TUid iPlugInDllUid; williamr@2: TBool iIsReadyForRemoval; williamr@2: }; williamr@2: williamr@2: // williamr@2: // class CEikSrvNotifierRemover williamr@2: // williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikSrvNotifierRemover) : public CActive williamr@2: { williamr@2: public: williamr@2: static CEikSrvNotifierRemover* NewL(); williamr@2: void Start(CEikSrvNotifierManager* aManager, CArrayPtr* aObservedList); williamr@2: ~CEikSrvNotifierRemover(); williamr@2: private: williamr@2: CEikSrvNotifierRemover(); williamr@2: private: williamr@2: // from CActive williamr@2: void RunL(); williamr@2: void DoCancel(); williamr@2: public: williamr@2: CEikSrvNotifierManager* iManager; williamr@2: CArrayPtr* iObservedList; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikNotifierQueue) : public CBase williamr@2: { williamr@2: public: williamr@2: class CQueueItem; williamr@2: public: williamr@2: static CEikNotifierQueue* NewL(); williamr@2: inline void QueueItemL(CEikNotifierQueue::CQueueItem* aItem); williamr@2: CQueueItem* FetchItem(TUid aChannel); williamr@2: TBool IsAlreadyQueued(TUid aNotifier,TUid aChannel) const; williamr@2: void RemoveClient(TInt aClientId); williamr@2: TInt GetHighestQueuePriority(TUid aChannel); williamr@2: inline TInt Count() const; williamr@2: const CQueueItem& At(TInt aIndex) const; williamr@2: void RemoveNotifier(TUid aNotifierUid); williamr@2: public: williamr@2: NONSHARABLE_CLASS(CQueueItem) : public CBase williamr@2: { williamr@2: public: williamr@2: static CQueueItem* NewLC(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId, const TDesC8& aBuffer, const RMessage2& aMessage, TInt aReplySlot); williamr@2: ~CQueueItem(); williamr@2: inline const TDesC8& Buffer() const {return *iBuffer;} williamr@2: private: williamr@2: CQueueItem(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId, const RMessage2& aMessage, TInt aReplySlot); williamr@2: void ConstructL(const TDesC8& aBuffer); williamr@2: public: williamr@2: const MEikSrvNotifierBase2::TNotifierInfo iInfo; williamr@2: const TInt iClientId; williamr@2: const RMessage2 iMessage; williamr@2: TInt iReplySlot; williamr@2: private: williamr@2: HBufC8* iBuffer; williamr@2: }; williamr@2: private: williamr@2: inline CEikNotifierQueue(); williamr@2: private: williamr@2: CArrayPtrFlat iQueue; williamr@2: }; williamr@2: williamr@2: class MNotifierStarter; williamr@2: class MNotifierUpdater; williamr@2: class CDiscoverNewImplementation; williamr@2: class CPluginTrack; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CEikSrvNotifierManager) : public CBase, public MEikSrvNotifierManager williamr@2: { williamr@2: public: williamr@2: static CEikSrvNotifierManager* NewL(); williamr@2: ~CEikSrvNotifierManager(); williamr@2: void NotifierStartL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8* aResponse,TInt aClientId); williamr@2: TInt NotifierUpdateL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8* aResponse,TInt aClientId); williamr@2: TInt NotifierCancel(TUid aNotifierUid); williamr@2: void NotifierStartAndGetResponseL(TUid aNotifierUid,const TDesC8& aBuffer,TInt aReplySlot, williamr@2: const RMessage2& aMessage,TInt aClientId,TBool& aCleanupComplete); williamr@2: void HandleClientExit(TInt aClientId); williamr@2: void NotifierStartAndGetResponseL(TUid aNotifierUid,TUid aChannelUid,const TDesC8& aBuffer,TInt aReplySlot, williamr@2: const RMessage2& aMessage,TInt aClientId,TBool& aCleanupComplete); williamr@2: void HandleScreenDeviceChangedL(); williamr@2: void RegisterSingleNotifierFromTransientPlugInL(TUid aPlugInUid, TUid aNotifierUid); williamr@2: void NotifierUpdateAndGetResponseL(TUid aNotifierUid,const TDesC8& aBuffer,TInt aReplySlot, williamr@2: const RMessage2& aMessage,TInt aClientId); williamr@2: public: williamr@2: void RegisterL(); williamr@2: void CheckForEcomPluginInstallUninstall(); williamr@2: public: // from MEikSrvNotifierManager williamr@2: void StartNotifierL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); williamr@2: void CancelNotifier(TUid aNotifierUid); williamr@2: void UpdateNotifierL(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); williamr@2: private: williamr@2: void DoAddPlugInL(const TDesC& aPath,const TDesC& aFileName,const TUidType& aUidType); williamr@2: void TryAddNotifiersFromNotifierArrayL(CArrayPtr* aNotifierArray, TInt& aRollBackChannels); williamr@2: CEikSrvNotifierManager(); williamr@2: void ConstructL(); williamr@2: void StartNextFromQueue(TUid aChannel); williamr@2: void DoStartQueuedItemLD(CEikNotifierQueue::CQueueItem* aItem); williamr@2: TBool NotifierHandlesScreenMode(MEikSrvNotifierBase2* aNotifier); williamr@2: CArrayPtr* TryLoadPlugInL(TUid aPlugInUid); williamr@2: TBool TryLoadPlugInFromSpecifiedDriveL(RFs& aFs, TUid aPlugInUid, TInt aDriveIndex, CArrayPtr*& aNotifierArray); williamr@2: CArrayPtr* LoadPlugInAndPopulateNotifierArrayL(const TDesC& aPath, const TDesC& aFileName, const TUidType& aUidType); williamr@2: TInt QueueNotifierForPossibleRemoval(TUid aNotifierUid); williamr@2: CArrayPtr* CreateNotifierArrayFromPlugInArrayL(CArrayPtr* aPlugInArray, const TUidType& aUidType); williamr@2: void UpdateHighestPriorityNotifiersOnThisChannelOfTheirPausingOrResuming(TUid aChannelUid, TUid aHighestPriorityNotifierOnThisChannelUid, const TDesC8& aBuffer); williamr@2: void TryFindAndRegisterNotifierFromPlugInDllL(TUid aNotifierUid); williamr@2: void LookForNotifierInObservedListL(TUid aNotifierUid, TUid aChannelUid, RArray& aNotifierPositions); williamr@2: void DoNotifierStartL(MNotifierStarter& aNotifierStarter, TBool& aCleanupComplete, TUid aNotifierUid, TUid aChannelUid, const TDesC8& aBuffer, TDes8* aResponse, TInt aClientId); williamr@2: TInt DoNotifierUpdateL(MNotifierUpdater& aNotifierStarter, TUid aNotifierUid, const TDesC8& aBuffer, TDes8* aResponse, TInt aClientId); williamr@2: private: williamr@2: void DoAddPlugInL(TUid aUid); williamr@2: CArrayPtr* LoadPlugInAndPopulateNotifierArrayL(TUid aUid); williamr@2: void UnloadEComPlugInImplementation(TInt aIndex); williamr@2: TBool IsImplementationRemoved(TUid aImplementationUid, RImplInfoPtrArray& aPlugInArray); williamr@2: TBool IsImplementationAdded(TUid aImplementationUid); williamr@2: private: williamr@2: CArrayPtr* iObservedList; williamr@2: CChannelMonitor* iChannelMonitor; williamr@2: CActivityMonitor* iActivityMonitor; williamr@2: CEikNotifierQueue* iQueue; williamr@2: CEikSrvNotifierRemover* iNotifierRemover; williamr@2: CDiscoverNewImplementation* iDiscoverNewImplementation; williamr@2: RPointerArray iPluginUidList; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CChannelMonitor) : public CBase williamr@2: { williamr@2: public: williamr@2: static CChannelMonitor* NewL(); williamr@2: inline void AddNewChannelL(TUid aChannel); williamr@2: void DeleteChannel(TInt aIndex); williamr@2: TInt NumberOfChannels() const; williamr@2: TBool AlreadyHasChannel(TUid aChannel) const; williamr@2: TInt ActivityLevel(TUid aChannel) const; williamr@2: void UpdateChannel(TUid aChannel, TInt aLevel); williamr@2: private: williamr@2: CChannelMonitor(); williamr@2: private: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(TChannelActivity) williamr@2: { williamr@2: public: williamr@2: inline TChannelActivity(TUid aChannel, TInt aHighestPriorityRunning); williamr@2: public: williamr@2: TUid iChannel; williamr@2: TInt iHighestPriorityRunning; williamr@2: }; williamr@2: private: williamr@2: CArrayFixFlat iMonitor; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CActivityMonitor) : public CBase williamr@2: { williamr@2: public: williamr@2: static CActivityMonitor* NewL(); williamr@2: ~CActivityMonitor(); williamr@2: void AddL(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId); williamr@2: void Remove(TUid aNotifierUid, TInt aClientId); williamr@2: void RemoveNotifier(TUid aNotifierUid, TUid aChannel); williamr@2: void RemoveClient(TInt aClientId); williamr@2: TBool IsNotifierActive(TUid aNotifierUid,TUid aChannel) const; williamr@2: TBool IsChannelActive(TUid aChannel, TUid& aNotifier,MEikSrvNotifierBase2::TNotifierPriority& aHighestPriority) const; williamr@2: TBool IsClientPresent(TUid aNotifierUid, TUid aChannel, TInt aClientId) const; williamr@2: TBool NotifierForClient(TUid& aNotifier, TInt aClientId) const; williamr@2: private: williamr@2: CActivityMonitor(); williamr@2: TInt Find(TUid aNotifierUid) const; williamr@2: TInt Find(TUid aNotifierUid, TUid aChannel) const; williamr@2: private: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: NONSHARABLE_CLASS(CNotifierActivity) : public CBase williamr@2: { williamr@2: public: williamr@2: static CNotifierActivity* NewLC(const MEikSrvNotifierBase2::TNotifierInfo& aInfo, TInt aClientId); williamr@2: ~CNotifierActivity(); williamr@2: TInt Find(TInt aClientId) const; williamr@2: private: williamr@2: CNotifierActivity(const MEikSrvNotifierBase2::TNotifierInfo& aInfo); williamr@2: void ConstructL(TInt aClientId); williamr@2: public: williamr@2: const MEikSrvNotifierBase2::TNotifierInfo iInfo; williamr@2: CArrayFixFlat iClientArray; williamr@2: }; williamr@2: private: williamr@2: CArrayPtrFlat iMonitor; williamr@2: }; williamr@2: williamr@2: williamr@2: inline CChannelMonitor::TChannelActivity::TChannelActivity(TUid aChannel, TInt aHighestPriorityRunning) williamr@2: :iChannel(aChannel), iHighestPriorityRunning(aHighestPriorityRunning) williamr@2: {} williamr@2: williamr@2: inline void CChannelMonitor::AddNewChannelL(TUid aChannel) williamr@2: {iMonitor.AppendL(TChannelActivity(aChannel,0));} williamr@2: williamr@2: inline CEikSrvNotifierManager* CEikServNotifyServer::Manager() const williamr@2: {return iManager;} williamr@2: williamr@2: inline void CEikNotifierQueue::QueueItemL(CEikNotifierQueue::CQueueItem* aItem) williamr@2: {iQueue.AppendL(aItem);} williamr@2: williamr@2: inline TInt CEikNotifierQueue::Count() const williamr@2: {return iQueue.Count();} williamr@2: williamr@2: inline CEikNotifierQueue::CEikNotifierQueue() williamr@2: :iQueue(3) williamr@2: {} williamr@2: williamr@2: williamr@2: #endif // __EIKNFYSV_H__