bluetoothengine/btnotif/btnotifsrv/src/btnotificationmanager.cpp
author hgs
Mon, 03 May 2010 14:36:07 +0300
changeset 29 48ae3789ce00
child 31 a0ea99b6fa53
permissions -rw-r--r--
201017_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     1
/*
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     2
* ============================================================================
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     3
*  Name        : btnotificationmanager.cpp
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     4
*  Part of     : bluetoothengine / btnotif
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     5
*  Description : Class for managing user notification and query objects, and for serializing access to the notification server.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     6
*
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     7
*  Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies).
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     8
*  All rights reserved.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     9
*  This component and the accompanying materials are made available
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    10
*  under the terms of "Eclipse Public License v1.0"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    11
*  which accompanies this distribution, and is available
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    12
*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    13
*
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    14
*  Initial Contributors:
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    15
*  Nokia Corporation - initial contribution.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    16
*
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    17
*  Contributors:
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    18
*  Nokia Corporation
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    19
* ============================================================================
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    20
* Template version: 4.1
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    21
*/
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    22
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    23
#include "btnotificationmanager.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    24
#include "btnotifserver.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    25
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    26
#include "bluetoothnotification.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    27
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    28
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    29
// ======== MEMBER FUNCTIONS ========
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    30
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    32
// C++ default constructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    33
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    34
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    35
CBTNotificationManager::CBTNotificationManager( const CBTNotifServer* aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    36
:   iServer( aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    37
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    38
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    39
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    40
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    41
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    42
// Symbian 2nd-phase constructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    44
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    45
void CBTNotificationManager::ConstructL()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    46
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    47
    iAsyncCb = new( ELeave ) CAsyncCallBack( iServer->Priority() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    48
    TCallBack cb( AsyncCallback, this );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    49
    iAsyncCb->Set( cb );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    50
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    51
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    52
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    53
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    54
// NewL.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    56
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    57
CBTNotificationManager* CBTNotificationManager::NewL( const CBTNotifServer* aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    58
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    59
    CBTNotificationManager* self = new( ELeave ) CBTNotificationManager( aServer );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    60
    CleanupStack::PushL( self );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    61
    self->ConstructL();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    62
    CleanupStack::Pop( self );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    63
    return self;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    64
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    65
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    66
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    68
// Destructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    70
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    71
CBTNotificationManager::~CBTNotificationManager()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    72
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    73
    iNotificationQ.ResetAndDestroy();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    74
    iNotificationQ.Close();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    75
    iUnusedQ.ResetAndDestroy();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    76
    iUnusedQ.Close();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    77
    delete iAsyncCb;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    78
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    79
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    80
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    81
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    82
// Get a new notification
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    83
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    84
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    85
CBluetoothNotification* CBTNotificationManager::GetNotification()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    86
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    87
    CBluetoothNotification* notification = NULL;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    88
    if( iUnusedQ.Count() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    89
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    90
        // Re-use the first idle notification.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    91
        notification = iUnusedQ[0];
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    92
        iUnusedQ.Remove( 0 );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    93
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    94
    else
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    95
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    96
        TRAP_IGNORE( notification = CBluetoothNotification::NewL( this ) );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    97
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    98
    if( notification )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    99
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   100
        if( iNotificationQ.Append( notification ) )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   101
            {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   102
            // In case the appending fails, we just delete the notification.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   103
            // Otherwise we cannot keep track of it anymore.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   104
            delete notification;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   105
            notification = NULL;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   106
            }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   107
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   108
    return notification;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   109
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   110
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   111
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   113
// Release the notification
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   114
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   115
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   116
void CBTNotificationManager::ReleaseNotification( CBluetoothNotification* aNotification )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   117
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   118
    __ASSERT_ALWAYS( aNotification, PanicServer( EBTNotifPanicBadArgument ) );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   119
    TInt pos = iNotificationQ.Find( aNotification );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   120
    __ASSERT_ALWAYS( pos > KErrNotFound, PanicServer( EBTNotifPanicMissing ) );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   121
    // ToDo: Cancel outstanding notification!
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   122
    iNotificationQ.Remove( pos );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   123
    TInt err = iUnusedQ.Append( aNotification );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   124
    aNotification->Reset();  // Clean up notification's resources
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   125
    if( err )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   126
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   127
        // Just delete the notification.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   128
        delete aNotification;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   129
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   130
    if( !iAsyncCb->IsActive() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   131
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   132
        if( !iNotificationQ.Count() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   133
            {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   134
            // Set the priority so that this is the last scheduled active object to execute.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   135
            iAsyncCb->SetPriority( CActive::EPriorityIdle );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   136
            }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   137
        iAsyncCb->CallBack();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   138
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   139
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   140
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   141
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   142
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   143
// Queue the notification with given priority
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   144
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   145
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   146
TInt CBTNotificationManager::QueueNotification( CBluetoothNotification* aNotification,
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   147
    TNotificationPriority aPriority )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   148
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   149
    TInt pos = iNotificationQ.Find( aNotification );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   150
    __ASSERT_ALWAYS( pos > KErrNotFound, PanicServer( EBTNotifPanicMissing ) );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   151
    if( aPriority == EPriorityHigh && pos != 0 )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   152
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   153
        // ToDo:  Move the note to the front of the queue
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   154
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   155
    if( !iAsyncCb->IsActive() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   156
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   157
		if( iAsyncCb->Priority() != iServer->Priority() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   158
			{
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   159
			// Reset priority back to original value
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   160
			// We first check the current priority, otherwise CActive will do an
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   161
			// unnecessary removal and adding of the callback from the active scheduler. 
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   162
			iAsyncCb->SetPriority( iServer->Priority() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   163
			}
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   164
        iAsyncCb->CallBack();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   165
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   166
    return KErrNone;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   167
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   168
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   169
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   170
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   171
// Process the notification queue and launch the next notification.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   172
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   173
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   174
void CBTNotificationManager::ProcessNotificationQueueL()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   175
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   176
    if( iNotificationQ.Count() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   177
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   178
        TInt err = iNotificationQ[0]->Show();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   179
        // If the note is already showing, it will return KErrAlreadyExists
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   180
        (void) err; // ToDo: add error handling!!
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   181
        NOTIF_NOTHANDLED( !err || err == KErrAlreadyExists || err == KErrNotFound )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   182
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   183
    else
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   184
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   185
        // No outstanding notifications, and unused notifications.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   186
        // Clean up the unused notifications.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   187
        iUnusedQ.ResetAndDestroy();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   188
        iNotificationQ.Reset(); // the queue is empty, reset it.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   189
        // Also clean up any resources.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   190
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   191
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   192
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   193
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   195
// Callback for asynchronous processing of queued notification requests.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   197
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   198
TInt CBTNotificationManager::AsyncCallback( TAny* aPtr )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   199
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   200
    TRAPD( err, ( (CBTNotificationManager*) aPtr )->ProcessNotificationQueueL() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   201
    return err;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   202
    }