diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/AknDynamicSoftNote/src/AknDynamicSoftNotifier.cpp --- /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 +#include +#include +#include +#include + +// 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 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