uifw/AvKon/notifsrc/AknSoftNotifier.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/notifsrc/AknSoftNotifier.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,372 @@
+/*
+* Copyright (c) 2002-2007 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: 
+*
+*/
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <vwsdefpartner.h>
+#endif
+#include "AknSoftNotifier.h"
+#include <s32mem.h>
+#include <AknSoftNotificationParameters.h>
+#include <AknNotifySignature.h>
+#include <aknSDData.h>
+#include "AknSoftNoteConsts.h"
+
+const TInt KBufferGranularity = 128;
+const TInt KGlobalNoteTextLength = 256;
+
+
+#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
+#include <akntranseffect.h>
+#include <akntransitionutils.h>
+#include <gfxtranseffect/gfxtranseffect.h>
+
+
+class CWait;
+const TInt KNoteDelayToIdleState = 450000; // 0,45s.
+
+/*
+* AknSoftNotifier's extension class
+*/
+NONSHARABLE_CLASS(CAknSoftNotifierExt): public CBase
+    {
+    public:
+        static CAknSoftNotifierExt* NewL();
+        ~CAknSoftNotifierExt();
+        void ShowNotifsDelayed( TBool aShow );
+        void SetNotifier( CAknSoftNotifier* aNotifier );
+        void CancelNotifDelay();
+            
+    private: // Methods
+        CAknSoftNotifierExt();
+        void ConstructL();
+        TInt DoShowNotifs();
+        
+    private: // Data
+        CAknSoftNotifier* iNotifier;
+        CWait* iWait;
+        TBool iNotifsShowState;
+        
+    public:
+    friend class CWait;
+    
+    
+    };
+
+/*
+* Class used from CAknSoftNotifierExt to create 
+* small delay when entering idle state
+* Delay is needed for soft notification transition to be shown
+*/
+NONSHARABLE_CLASS(CWait) : public CTimer
+	{
+	public:
+	    static CWait* NewL();
+		void Wait( CAknSoftNotifierExt* aExt, TInt aTimeToWait );
+	private:
+		CWait();
+		void ConstructL();
+		void RunL();
+	private:
+		CAknSoftNotifierExt* iExt;
+	};	
+
+
+CWait* CWait::NewL()
+    {
+    CWait * self = new(ELeave) CWait;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+    
+void CWait::Wait( CAknSoftNotifierExt* aExt, TInt aTimeToWait )
+	{
+	iExt = aExt;
+	After(aTimeToWait);
+	}
+
+CWait::CWait() : CTimer(CActive::EPriorityIdle) 
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CWait::ConstructL()
+    {
+    CTimer::ConstructL();
+    }
+    
+void CWait::RunL()
+	{
+	TInt error = iExt->DoShowNotifs();
+	User::LeaveIfError( error );
+	}
+
+    
+CAknSoftNotifierExt* CAknSoftNotifierExt::NewL()
+    {
+    CAknSoftNotifierExt * self = new(ELeave) CAknSoftNotifierExt;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    } 
+    
+CAknSoftNotifierExt::~CAknSoftNotifierExt()
+    {
+    delete iWait;
+    iWait = NULL;
+    }
+    
+void CAknSoftNotifierExt::ShowNotifsDelayed( TBool aShow )
+    {
+    iNotifsShowState = aShow;
+    iWait->Cancel();
+    
+    if( aShow && iWait )
+        {
+        iWait->Wait( this, KNoteDelayToIdleState );
+        }
+    else
+        {
+        // no delay when exiting idle state
+        iWait->Wait( this, 0 );
+        }
+    }
+    
+void CAknSoftNotifierExt::SetNotifier( CAknSoftNotifier* aNotifier )
+    {
+    iNotifier = aNotifier;
+    }
+    
+void CAknSoftNotifierExt::CancelNotifDelay()
+    {
+    iWait->Cancel();
+    }
+    
+CAknSoftNotifierExt::CAknSoftNotifierExt()
+    {
+    }
+
+void CAknSoftNotifierExt::ConstructL()
+    {
+    iWait = CWait::NewL();
+    }
+    
+    
+TInt CAknSoftNotifierExt::DoShowNotifs()
+    {
+    TRAPD( error,iNotifier->PrepareBufferL(ESetIdleState, iNotifsShowState, NULL, EFalse, ETrue));
+    return error;
+    }
+         
+    
+#endif // RD_UI_TRANSITION_EFFECTS_POPUPS
+    
+   
+    
+    
+
+EXPORT_C CAknSoftNotifier* CAknSoftNotifier::NewL()
+    {
+    CAknSoftNotifier* self = NewLC();
+    CleanupStack::Pop();
+    return self;
+    }
+
+EXPORT_C CAknSoftNotifier* CAknSoftNotifier::NewLC()
+    {
+    CAknSoftNotifier * self = new(ELeave) CAknSoftNotifier;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CAknSoftNotifier::~CAknSoftNotifier()
+    {
+    delete iBuffer;
+    
+#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
+    delete iExt;
+#endif
+    }
+
+void CAknSoftNotifier::ConstructL()
+    {
+    CAknNotifyBase::ConstructL();
+#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
+    iExt = CAknSoftNotifierExt::NewL();
+    iExt->SetNotifier( this );
+#endif
+    }
+
+EXPORT_C void CAknSoftNotifier::AddNotificationL(TAknSoftNotificationType aType, TPtrC* aText)
+    {
+    PrepareBufferL(aType, 1, aText, EFalse, ETrue);
+    }
+
+EXPORT_C void CAknSoftNotifier::AddNotificationL(TAknSoftNotificationType aType,TInt aCount)
+    {
+    PrepareBufferL(aType, aCount, NULL, EFalse, ETrue);
+    }
+
+EXPORT_C void CAknSoftNotifier::SetNotificationCountL(TAknSoftNotificationType aType, TInt aCount, 
+    TPtrC* aText)
+    {
+    PrepareBufferL(aType, aCount, aText, EFalse, EFalse);
+    }
+
+EXPORT_C void CAknSoftNotifier::CancelSoftNotificationL(TAknSoftNotificationType aType)
+    {
+    PrepareBufferL(aType, 0, NULL, ETrue, EFalse);
+    }
+
+CAknSoftNotifier::CAknSoftNotifier() : CAknNotifyBase(KAknSoftNotificationUid)
+    {
+    }
+
+EXPORT_C void CAknSoftNotifier::SetIdleStateL(TBool aIdleState)
+    {
+#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
+    iExt->CancelNotifDelay();
+
+    if( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) &&
+        aIdleState )
+        {
+        // Shows notes in idle with small delay when going to idle, if popup transitions
+        // are enabled. This is to secure that note appear transition can be seen.
+        iExt->ShowNotifsDelayed( aIdleState );    
+        }
+    else
+        {
+        PrepareBufferL(ESetIdleState, aIdleState, NULL, EFalse, ETrue);    
+        }
+#else
+    PrepareBufferL(ESetIdleState, aIdleState, NULL, EFalse, ETrue);
+#endif
+    }
+
+void CAknSoftNotifier::PrepareBufferL(TAknSoftNotificationType aType, TInt aCount, TPtrC* aText, 
+    TBool aCancel, TBool aAddCount, CAknSoftNotificationParameters* aParams)
+    {
+    delete iBuffer;
+    iBuffer = NULL;
+
+    if ( aText && aText->Length() > KGlobalNoteTextLength )
+        {
+        User::Leave( KErrTooBig );
+        }
+
+    iBuffer = CBufFlat::NewL(KBufferGranularity);
+
+    RBufWriteStream bufStream;
+    bufStream.Open(*iBuffer);
+
+    CleanupClosePushL(bufStream);
+
+    bufStream.WriteInt32L(KAKNNOTIFIERSIGNATURE);
+
+    bufStream.WriteUint8L(aType);
+    bufStream.WriteInt16L(aCount);  // count
+    bufStream.WriteUint8L(aCancel); // iscancel
+    bufStream.WriteUint8L(aAddCount);   // add
+
+    if (aText)
+        {
+        bufStream << (*aText);
+        }
+    else
+        {
+        bufStream << KNullDesC();
+        }
+
+    if (aParams)
+        {
+        bufStream.WriteInt32L( aParams->iNoteResourceId); // Works as unique ID
+        bufStream.WriteInt16L( KAknSoftNotificationCustom ); // parameter type
+        
+        // If this sequence is changed, remeber also change the reading in notify plugin's side  
+        bufStream.WriteInt32L(aParams->iResourceFile->Length());
+        bufStream << (*aParams->iResourceFile);
+        bufStream.WriteInt32L(aParams->iNoteResourceId);
+        bufStream.WriteInt32L(aParams->iPriority);
+        bufStream.WriteInt32L(aParams->iSoftkeys);
+        bufStream.WriteInt32L(aParams->iTone);
+        bufStream.WriteUint32L(aParams->iViewId.iAppUid.iUid);
+        bufStream.WriteUint32L(aParams->iViewId.iViewUid.iUid);
+        bufStream.WriteUint32L(aParams->iCustomMessageId.iUid);
+        bufStream.WriteInt32L(aParams->iAcceptSoftKey);
+
+        bufStream.WriteUint32L(aParams->iPluralViewId.iAppUid.iUid);
+        bufStream.WriteUint32L(aParams->iPluralViewId.iViewUid.iUid);
+        bufStream.WriteUint32L(aParams->iGroupedTextResourceId);
+
+        if ( aParams->iViewId != KNullViewId )
+            {
+            bufStream.WriteInt32L(aParams->iViewActivationMsg->Length());
+            bufStream << (*aParams->iViewActivationMsg);
+            }
+        else
+            {
+            bufStream.WriteInt32L(KErrNotFound);
+            }
+
+        // only custrom notes may need to send data to cover ui
+        if (SecondaryDisplayData())
+            {
+            bufStream.WriteInt8L(ETrue);
+            bufStream << *(SecondaryDisplayData());
+            }
+        else
+            {
+            bufStream.WriteInt8L(EFalse);            
+            }
+        }
+
+    CleanupStack::PopAndDestroy();  // bufStream
+
+    iBufferPtr.Set(iBuffer->Ptr(0));
+
+    TBuf8<1> resp;
+    StartOrUpdateL(iBufferPtr,resp);
+    }
+
+EXPORT_C void CAknSoftNotifier::CAknNotifyBase_Reserved()
+    {
+    }
+
+EXPORT_C void CAknSoftNotifier::AddCustomNotificationL( 
+    CAknSoftNotificationParameters& aParams, 
+    TInt aCount )
+    {
+    PrepareBufferL(ECustomSoftNotification, aCount, NULL, EFalse, ETrue, &aParams );
+    }
+
+EXPORT_C void CAknSoftNotifier::SetCustomNotificationCountL( 
+    CAknSoftNotificationParameters& aParams, 
+    TInt aCount )
+    {
+    PrepareBufferL(ECustomSoftNotification, aCount, NULL, EFalse, EFalse, &aParams );
+    }
+
+EXPORT_C void CAknSoftNotifier::CancelCustomSoftNotificationL( 
+    CAknSoftNotificationParameters& aParams )
+    {
+    PrepareBufferL(ECustomSoftNotification, 0, NULL, ETrue, EFalse, &aParams );
+    }
+
+// End of File