uifw/AknGlobalUI/AknDynamicSoftNote/src/AknDynamicSoftNotifier.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/AknDynamicSoftNote/src/AknDynamicSoftNotifier.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2008 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:  Client API for Dynamic Avkon soft notifications.
+*
+*/
+
+#include "AknDynamicSoftNotifier.h"
+#include "AknDynamicSoftNoteObserver.h"
+#include "AknDynamicSoftNoteObserver.h"
+#include "AknDynamicNotifier.h"
+#include "aknsoftnoteconsts.h"
+#include <AknDynamicSoftNotificationParams.h>
+#include <AknNotifySignature.h>
+#include <aknSDData.h>
+#include <AknNotifyStd.h>
+#include <s32mem.h>
+
+// CONSTANTS
+
+/// IPC message buffer granularity
+const TInt KAknBufferGranularity       = 1024;
+/// Observer array granularity
+const TInt KAknObserverListGranularity = 4;
+/// Priority of cancel message. Value only needs to be in allowed range.
+const TInt KAknPriorityOfCancelMessage = 1000;
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::NewL
+//-----------------------------------------------------------------------------
+//
+EXPORT_C CAknDynamicSoftNotifier* CAknDynamicSoftNotifier::NewL()
+    {
+    CAknDynamicSoftNotifier* self = NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::NewLC
+//-----------------------------------------------------------------------------
+//
+EXPORT_C CAknDynamicSoftNotifier* CAknDynamicSoftNotifier::NewLC()
+    {
+    CAknDynamicSoftNotifier * self = new( ELeave ) CAknDynamicSoftNotifier;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::~CAknDynamicSoftNotifier
+//-----------------------------------------------------------------------------
+//
+EXPORT_C CAknDynamicSoftNotifier::~CAknDynamicSoftNotifier()
+    {
+    iObservers.ResetAndDestroy();
+    delete iNotifier;
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::ConstructL
+//-----------------------------------------------------------------------------
+//
+void CAknDynamicSoftNotifier::ConstructL()
+    {
+    iNotifier = new(ELeave) CAknDynamicNotifier( KAknSoftNotificationUid );
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::CAknDynamicSoftNotifier
+//-----------------------------------------------------------------------------
+//
+CAknDynamicSoftNotifier::CAknDynamicSoftNotifier() :
+    iObservers( KAknObserverListGranularity )
+    {
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::AddDynamicNotificationL
+//-----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknDynamicSoftNotifier::AddDynamicNotificationL(
+    TAknDynamicSoftNotificationParams& aParams,
+    TInt aNoteId, // = KErrUnknown
+    TInt aCount ) // = 1
+    {
+    return SendMessageL( aNoteId, aCount, EFalse, ETrue, aParams );
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::SetDynamicNotificationCountL
+//-----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknDynamicSoftNotifier::SetDynamicNotificationCountL(
+    TAknDynamicSoftNotificationParams& aParams,
+    TInt aNoteId,
+    TInt aCount )
+    {
+    return SendMessageL( aNoteId, aCount, EFalse, EFalse, aParams );
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::CancelDynamicSoftNotificationL
+//-----------------------------------------------------------------------------
+//
+EXPORT_C void CAknDynamicSoftNotifier::CancelDynamicNotificationL(
+    TInt aNoteId )
+    {
+    // parameters are unrelevant
+    TAknDynamicSoftNotificationParams params( KAknPriorityOfCancelMessage );
+    SendMessageL( aNoteId, 0, ETrue, EFalse, params );
+    StopObserving( aNoteId );
+    }
+    
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::StartObservingL
+//-----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknDynamicSoftNotifier::StartObservingL( TInt aNoteId, 
+    MAknDynamicSoftNoteObserver* aObserver )
+    {
+    // Only one observer for a note id allowed.
+    if( FindByNoteId( aNoteId ) != KErrNotFound )
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+    
+    CAknDynamicSoftNoteObserver* observer = 
+        CAknDynamicSoftNoteObserver::NewLC( *this, aObserver, aNoteId );
+        
+    iObservers.AppendL( observer );
+    CleanupStack::Pop( observer );
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::StopObserving
+//-----------------------------------------------------------------------------
+//
+EXPORT_C void CAknDynamicSoftNotifier::StopObserving( TInt aNoteId )
+    {
+    TInt pos = FindByNoteId( aNoteId );
+    if( pos != KErrNotFound )
+        {
+        delete iObservers[pos];
+        iObservers.Remove(pos);
+        }
+    }
+    
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::DeleteObserver
+//-----------------------------------------------------------------------------
+//
+void CAknDynamicSoftNotifier::DeleteObserver( 
+    CAknDynamicSoftNoteObserver* aObserver )
+    {
+    TInt pos = iObservers.Find( aObserver );
+    if( pos != KErrNotFound )
+        {
+        iObservers.Remove( pos );
+        }
+    delete aObserver;
+    }    
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::SetSecondaryDisplayData
+//-----------------------------------------------------------------------------
+//
+EXPORT_C void CAknDynamicSoftNotifier::SetSecondaryDisplayData( 
+    CAknSDData* aData )
+    {
+    delete iSecondaryDisplayData;
+    iSecondaryDisplayData = aData;
+    }
+   
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::SecondaryDisplayData
+//-----------------------------------------------------------------------------
+//
+CAknSDData* CAknDynamicSoftNotifier::SecondaryDisplayData()
+    {
+    return iSecondaryDisplayData;
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::SendMessageL
+//-----------------------------------------------------------------------------
+//
+TInt CAknDynamicSoftNotifier::SendMessageL(
+    TInt aNoteId,
+    TInt aCount,
+    TBool aCancel,
+    TBool aAddCount,
+    TAknDynamicSoftNotificationParams& aParams )
+    {
+    CBufFlat* buf = CBufFlat::NewL( KAknBufferGranularity );
+    CleanupStack::PushL( buf );
+
+    RBufWriteStream bufStream( *buf );
+    bufStream.PushL();
+    
+    // Common data for dynamic notification
+    bufStream.WriteInt32L( KAKNNOTIFIERSIGNATURE );
+    bufStream.WriteUint8L( ECustomSoftNotification );
+    bufStream.WriteInt16L( aCount );  // count
+    bufStream.WriteUint8L( aCancel ? ETrue : EFalse ); // convert TBool to 0 or 1
+    bufStream.WriteUint8L( aAddCount ? ETrue : EFalse ); // convert TBool to 0 or 1
+    // text prompt (not used in this type of notification). 
+    // It's put here to simplify changes in server side
+    bufStream << KNullDesC();   
+    bufStream.WriteInt32L( aNoteId ); // notification id
+    
+    // Type Specific data for this dynamic notification
+    // Keep this synchronized with AknDynamicNotificationData
+    //
+    bufStream.WriteInt16L( KAknSoftNotificationDynamic ); // parameter type id
+    bufStream.WriteInt32L( aNoteId ); // notification id
+    bufStream << aParams;
+
+    // Additional data
+    //
+    // Secondary display data not available
+    bufStream.WriteInt8L( EFalse );
+    
+    bufStream.CommitL();
+    CleanupStack::PopAndDestroy();  // bufStream
+
+    TPckgBuf<TInt> response;
+    User::LeaveIfError( iNotifier->StartOrUpdate( buf->Ptr( 0 ), response ) );
+    
+    CleanupStack::PopAndDestroy( buf );
+    return response();
+    }
+
+//-----------------------------------------------------------------------------
+// CAknDynamicSoftNotifier::FindByNoteId
+//-----------------------------------------------------------------------------
+//
+TInt CAknDynamicSoftNotifier::FindByNoteId( TInt aNoteId ) const
+    {
+    TInt result = KErrNotFound;
+    
+    const TInt count = iObservers.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( aNoteId == iObservers[i]->NoteId() )
+            {
+            result = i;
+            break;
+            }
+        }
+    
+    return result;
+    }
+
+// End of File