accessoryservices/accessoryserver/src/Server/AccSrvNotificationQueue.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/Server/AccSrvNotificationQueue.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,429 @@
+/*
+* Copyright (c) 2002-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:  Subsession handles are stored here for later handling
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "AccSrvNotificationQueue.h"
+#include "acc_debug.h"
+#include "AccSrvSubAudioControl.h" //for callbacks
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CAccSrvNotificationQueue
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccSrvNotificationQueue::CAccSrvNotificationQueue()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CAccSrvNotificationQueue()" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::ConstructL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::ConstructL()" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccSrvNotificationQueue* CAccSrvNotificationQueue::NewL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::NewL()" );
+    CAccSrvNotificationQueue* self = new( ELeave ) CAccSrvNotificationQueue;
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// Destructor
+CAccSrvNotificationQueue::~CAccSrvNotificationQueue()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::~CAccSrvNotificationQueue()" );
+
+    iConnectAccessory.Close();
+    iAccessoryAudioLinkOpenArray.Close();
+    iAccessoryAudioLinkOpenedArray.Close();
+    iAccessoryAudioLinkClosedArray.Close();
+    iAccessoryAudioLinkCloseArray.Close();
+    iBluetoothAudioLinkOpenReqArray.Close();
+    iBluetoothAudioLinkCloseReqArray.Close();
+    iBluetoothAudioLinkOpenRespArray.Close();
+    iBluetoothAudioLinkCloseRespArray.Close();
+    iNewAccessoryConnectedArray.Close();
+    iAccessoryConnectionStatusChangedArray.Close();
+    iGetAccessoryConnectionStatusAsyncArray.Close();
+    iAccessoryDisconnectedArray.Close();
+    iAccessoryModeChangedArray.Close();
+    iGetAccessoryModeAsyncArray.Close();
+    iNotifyProcessCommandArray.Close();
+    iNotifyAccessoryValueChangedTBoolArray.Close();
+    iNotifyAccessoryValueChangedTIntArray.Close();
+    iNotifyAccessoryValueChangedObjectArray.Close();
+    iSetValueArray.Close();
+    iGetValueArray.Close();
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::~CAccSrvNotificationQueue - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::ControlMessageArray(
+// -----------------------------------------------------------------------------
+//
+RArray<MQueueObserver*>* CAccSrvNotificationQueue::ControlMessageArray( TMsgID aMsgID )
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::ControlMessageArray(0x%x)", aMsgID );
+
+    switch ( aMsgID )
+        {
+        case EConnectAccessory:
+            {
+            return &iConnectAccessory;
+            }
+        case ENewAccessoryConnected:
+            {
+            return &iNewAccessoryConnectedArray;
+            }
+        case EAccessoryDisconnected:
+            {
+            return &iAccessoryDisconnectedArray;
+            }
+        case EAccessoryModeChanged:
+            {
+            return &iAccessoryModeChangedArray;
+            }
+        case EAccessoryConnectionStatusAsyncChanged:
+            {
+            return &iGetAccessoryConnectionStatusAsyncArray;
+            }
+        case EAccessoryModeAsyncChanged:
+            {
+            return &iGetAccessoryModeAsyncArray;
+            }
+        case EAccessoryConnectionStatusChanged:
+            {
+            return &iAccessoryConnectionStatusChangedArray;
+            }
+        case EAccessoryValueChangedTBool:
+            {
+            return &iNotifyAccessoryValueChangedTBoolArray;
+            }
+        case EAccessoryValueChangedTInt:
+            {
+            return &iNotifyAccessoryValueChangedTIntArray;
+            }
+        case EAccessoryValueChangedObject:
+            {
+            return &iNotifyAccessoryValueChangedObjectArray;
+            }
+        case EAccessoryAudioLinkOpen:
+            {
+            return &iAccessoryAudioLinkOpenArray;
+            }
+        case EAccessoryAudioLinkOpened:
+            {
+            return &iAccessoryAudioLinkOpenedArray;
+            }
+        case EAccessoryAudioLinkClosed:
+            {
+            return &iAccessoryAudioLinkClosedArray;
+            }
+        case EAccessoryAudioLinkClose:
+            {
+            return &iAccessoryAudioLinkCloseArray;
+            }
+        case EBluetoothAudioLinkOpenReq:
+            {
+            return &iBluetoothAudioLinkOpenReqArray;
+            }
+        case EBluetoothAudioLinkCloseReq:
+            {
+            return &iBluetoothAudioLinkCloseReqArray;
+            }
+        case EBluetoothAudioLinkOpenResp:
+            {
+            return &iBluetoothAudioLinkOpenRespArray;
+            }
+        case EBluetoothAudioLinkCloseResp:
+            {
+            return &iBluetoothAudioLinkCloseRespArray;
+            }
+        case ENotifyProcessCommand:
+            {
+            return &iNotifyProcessCommandArray;
+            }
+        case ESetValue:
+            {
+            return &iSetValueArray;
+            }
+        case EGetValue:
+            {
+            return &iGetValueArray;
+            }
+        default:
+            {
+            // Unknown notification type
+            PANIC_ALWAYS;
+            }
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::ControlMessageArray - return NULL" );
+
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::RegisterControlMessage
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::RegisterControlMessage( TMsgID aMsgID,
+                                                       MQueueObserver* aCallback )
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::RegisterControlMessage(%d)", aMsgID );
+
+    ControlMessageArray( aMsgID )->Append( aCallback );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::RegisterControlMessage - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CancelControlMessage
+//
+// Find the correct array and remove corresponding element (aCallback) from it.
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CancelControlMessage( TMsgID aMsgID,
+                                                     MQueueObserver* aCallback )
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::CancelNotificationRequest(%d)", aMsgID );
+
+    TInt index( ControlMessageArray( aMsgID )->Find( aCallback ) );
+
+    if ( KErrNotFound != index )
+        {
+        ControlMessageArray( aMsgID )->Remove( index );
+        }
+    
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::CancelNotificationRequest - %d return void", index );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteControlMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteControlMessageL( TMsgID aMsgID,
+                                                        TInt aErrorCode,
+                                                        TInt aUniqueID )
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteControlMessageL(%d)", aMsgID );
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        if ( ControlMessageArray( aMsgID )->operator[]( i )->CompleteMessageL( 
+                                                                aMsgID, 
+                                                                aErrorCode, 
+                                                                aUniqueID ) )
+            {
+            ControlMessageArray( aMsgID )->Remove( i );
+            }
+        else
+            {
+            // Message was not consumed by subsession in question,
+            // leave it to queue
+            }
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteControlMessageL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteASYCmdL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteASYCmdL( TMsgID aMsgID,
+                                                TProcessCmdId aCmdn,
+                                                TInt aTrId,
+                                                TASYCommandParamRecord& aASYCommandParamRecord,
+                                                TPtr8* aPtrBuf )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteASYCmdL()" );
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        if ( ControlMessageArray( aMsgID )->operator[]( i )->CompleteProcessCommandL( 
+                                                                aCmdn, 
+                                                                aTrId, 
+                                                                aASYCommandParamRecord,
+                                                                aPtrBuf ) )
+            {
+            ControlMessageArray( aMsgID )->Remove( i );
+            }
+        else
+            {
+            // Message was not consumed by subsession in question,
+            // leave it to queue
+            }
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteASYCmdL return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteValueMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteValueMessageL( TMsgID aMsgID,
+                                                      TAccValueTypeTBool aCmdResponse,
+                                                      TInt aErrorCode,
+                                                      TInt aTrId )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL() - TBool" );
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        ControlMessageArray( aMsgID )->operator[]( i )->HandleValueMessageL( 
+                                                            aMsgID, 
+                                                            aCmdResponse, 
+                                                            aErrorCode, 
+                                                            aTrId );
+        ControlMessageArray( aMsgID )->Remove( i );
+        }
+
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL - TBool - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteValueMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteValueMessageL( TMsgID aMsgID,
+                                                      TAccValueTypeTInt aCmdResponse,
+                                                      TInt aErrorCode,
+                                                      TInt aTrId )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL() - TInt" );
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        ControlMessageArray( aMsgID )->operator[]( i )->HandleValueMessageL( 
+                                                            aMsgID, 
+                                                            aCmdResponse,
+                                                            aErrorCode, 
+                                                            aTrId );
+        ControlMessageArray( aMsgID )->Remove( i );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL - TInt- return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteValueMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteValueMessageL( TMsgID aMsgID,
+                                                      TDesC8& aCmdResponse,
+                                                      TInt aErrorCode,
+                                                      TInt aTrId )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL() - TDesC8" );
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        ControlMessageArray( aMsgID )->operator[]( i )->HandleValueMessageL( 
+                                                            aMsgID, 
+                                                            aCmdResponse, 
+                                                            aErrorCode, 
+                                                            aTrId );
+        ControlMessageArray( aMsgID )->Remove( i );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL - TDesC8 - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::CompleteValueMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvNotificationQueue::CompleteValueMessageL( TMsgID aMsgID,
+                                                      TInt aTrId,
+                                                      TPtr8* aPtrBuf,
+                                                      TInt aErrorCode )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL() - Object" );    
+
+    for ( TInt i( ControlMessageArray( aMsgID )->Count()-1 ); i >= 0; --i )
+        {
+        ControlMessageArray( aMsgID )->operator[]( i )->HandleValueMessageL( 
+                                                            aMsgID, 
+                                                            aTrId,
+                                                            aPtrBuf, 
+                                                            aErrorCode );
+        ControlMessageArray( aMsgID )->Remove( i );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::CompleteValueMessageL - Object - return void" );
+    }
+    
+// -----------------------------------------------------------------------------
+// CAccSrvNotificationQueue::ControlMessagesWaiting
+// -----------------------------------------------------------------------------
+//
+TInt CAccSrvNotificationQueue::ControlMessagesWaiting( TMsgID aMsgID )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvNotificationQueue::ControlMessagesWaiting()" );
+    
+    TInt ret( ControlMessageArray( aMsgID )->Count() );
+    
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvNotificationQueue::ControlMessagesWaiting - return %d", ret );
+    
+    return ret;
+    }
+	
+//  End of File
+