diff -r 000000000000 -r 4e1aa6a622a0 accessoryservices/accessoryserver/src/Server/AccSrvSubConnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessoryservices/accessoryserver/src/Server/AccSrvSubConnection.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,335 @@ +/* +* Copyright (c) 2002-2006 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: Server-side sub-session of Accessory Connection +* +*/ + + + +// INCLUDE FILES +#include "AccSrvSubConnection.h" +#include "AccSrvMainSession.h" +#include "AccClientServerMessages.h" +#include "AccSrvServerModel.h" +#include "acc_debug.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::CAccSrvSubConnection +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CAccSrvSubConnection::CAccSrvSubConnection( + CASYProxyAPI* aProxy, + CAccSrvConnectionController* aConnectionController, + CAccSrvServerModel* aServerModel ) + : CAccSrvSubConnectionBase ( aProxy, aConnectionController, aServerModel ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CAccSrvSubConnection()" ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CAccSrvSubConnection - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::ConstructL() + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::ConstructL" ); + + CAccSrvSubConnectionBase::ConstructL(); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::ConstructL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CAccSrvSubConnection* CAccSrvSubConnection::NewL( + CASYProxyAPI* aProxy, + CAccSrvConnectionController* aConnectionController, + CAccSrvServerModel* aServerModel ) + { + if ( !aProxy ) + { + User::Leave( KErrArgument ); + } + + CAccSrvSubConnection* self = new (ELeave) CAccSrvSubConnection( aProxy, + aConnectionController, + aServerModel ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// Destructor +CAccSrvSubConnection::~CAccSrvSubConnection() + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::~CAccSrvSubConnection()" ); + + RMessage2 dummy; + + CAccSrvSubConnection::CancelNotifyAccessoryConnectionStatusChanged( dummy );//For iNotifyAccessoryConnectionStatusChanged + CAccSrvSubConnection::CancelGetAccessoryConnectionStatus( dummy );//For iGetAccessoryConnectionStatus + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::~CAccSrvSubConnection - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::GetAccessoryConnectionStatusL +// +// Accessory connection status is valid when +// ASY(s) initialization is done (ECmdProcessCommandInit) +// i.e. ASY(s) informs AccessorySerever about possible connected accessory(/ies). +// Initialization is done during boot. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::GetAccessoryConnectionStatusL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::GetAccessoryConnectionStatusL()" ); + + if ( iServerModel->ASYsLoadCompleted() ) + { + TAccPolGenericIDArray sourceGIDArray; + iServerModel->CurrentConnectionStatusL( sourceGIDArray ); + TAccSrvGenericIDArrayPckg genericIdArrayPckg( sourceGIDArray ); + aMessage.WriteL( KAccServParamPosFirst, genericIdArrayPckg ); + } + else + { + User::Leave( KErrNotReady ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::GetAccessoryConnectionStatusL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::GetAccessoryConnectionStatusAsyncL +// +// Asynchronous getter for Accessory connection status. If ASY(s) initialization +// is done, this request can be completed immediatelly. +// See CAccSrvSubConnection::GetAccessoryConnectionStatusL (synchronous). +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::GetAccessoryConnectionStatusAsyncL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::GetAccessoryConnectionStatusAsyncL()" ); + + if ( iServerModel->ASYsLoadCompleted() ) + { + TAccPolGenericIDArray sourceGIDArray; + iServerModel->CurrentConnectionStatusL( sourceGIDArray ); + TAccSrvGenericIDArrayPckg genericIdArrayPckg( sourceGIDArray ); + aMessage.WriteL( KAccServParamPosFirst, genericIdArrayPckg ); + Write( aMessage, KAccSrvGetAccessoryConnectionStatusBit ); + aMessage.Complete( KErrNone ); + } + else + { + iGetAccessoryConnectionStatus = aMessage;//Store RMessage2 for future completion + iConnectionController->NotificationQueue().RegisterControlMessage( + EAccessoryConnectionStatusAsyncChanged, + this ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::GetAccessoryConnectionStatusAsyncL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::NotifyAccessoryConnectionStatusChanged +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::NotifyAccessoryConnectionStatusChanged( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::NotifyAccessoryConnectionStatusChanged()" ); + + iConnectionController->NotificationQueue().RegisterControlMessage( + EAccessoryConnectionStatusChanged, + this ); + iNotifyAccessoryConnectionStatusChanged = aMessage;//Store RMessage2 for future completion + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::NotifyAccessoryConnectionStatusChanged - return void" ); + } + +// ----------------------------------------------------------------------------- +// CancelNotifyAccessoryConnectionStatusChanged +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::CancelNotifyAccessoryConnectionStatusChanged( + const RMessage2& /*aMessage*/ ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CancelNotifyAccessoryConnectionStatusChanged()" ); + + // If request is Null, there is nothing to cancel + if ( !iNotifyAccessoryConnectionStatusChanged.IsNull() ) + { + iConnectionController->NotificationQueue().CancelControlMessage( + EAccessoryConnectionStatusChanged, + this ); + Write( iNotifyAccessoryConnectionStatusChanged, KAccSrvNotifyAccConnStatusChangedBit ); + iNotifyAccessoryConnectionStatusChanged.Complete( KErrCancel ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CancelNotifyAccessoryConnectionStatusChanged - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::CancelGetAccessoryConnectionStatus +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::CancelGetAccessoryConnectionStatus( + const RMessage2& /*aMessage*/ ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CancelGetAccessoryConnectionStatus()" ); + + // If request is Null, there is nothing to cancel + if ( !iGetAccessoryConnectionStatus.IsNull() ) + { + iConnectionController->NotificationQueue().CancelControlMessage( + EAccessoryConnectionStatusAsyncChanged, + this ); + Write( iGetAccessoryConnectionStatus, KAccSrvGetAccessoryConnectionStatusBit ); + iGetAccessoryConnectionStatus.Complete( KErrCancel ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CancelGetAccessoryConnectionStatus - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::DispatchMessageL +// Handles client request. If request is not handled here, it is passed to +// parent class for handling +// ----------------------------------------------------------------------------- +// +void CAccSrvSubConnection::DispatchMessageL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::DispatchMessageL()" ); + + TInt function = aMessage.Function(); + + switch ( function ) + { + case EAccSrvGetAccessoryConnectionStatus: + { + GetAccessoryConnectionStatusL( aMessage ); + break; + } + case EAccSrvGetAccessoryConnectionStatusAsync: + { + GetAccessoryConnectionStatusAsyncL( aMessage ); + break; + } + case EAccSrvNotifyAccessoryConnectionStatusChanged: + { + NotifyAccessoryConnectionStatusChanged( aMessage ); + break; + } + case EAccSrvCancelNotifyAccessoryConnectionStatusChanged: + { + CancelNotifyAccessoryConnectionStatusChanged( aMessage ); + break; + } + case EAccSrvCancelGetAccessoryConnectionStatus: + { + CancelGetAccessoryConnectionStatus( aMessage ); + break; + } + default: + { + // Not handled here, pass to base class + CAccSrvSubConnectionBase::DispatchMessageL( aMessage ); + break; + } + } // switch( function ) + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::DispatchMessageL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubConnection::CompleteMessageL +// ----------------------------------------------------------------------------- +// +TBool CAccSrvSubConnection::CompleteMessageL( TMsgID aMsgID, + TInt aErrorCode, + TInt /*aUniqueID*/ ) + { + COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubConnection::CompleteMessageL(%d)", aMsgID ); + + if ( EAccessoryConnectionStatusChanged == aMsgID ) + { + //Write new generic ID array and + //complete outstanding AccessoryConnectionStatusChanged notification + //CAccSrvSubBaseConnection::WriteL( iMessageArray[0], aGenericIDArray ) + TAccPolGenericIDArray genericIDArray; + iServerModel->CurrentConnectionStatusL( genericIDArray ); + TPckg genericIDArrayPckg( genericIDArray ); + + iNotifyAccessoryConnectionStatusChanged.WriteL( KAccServParamPosFirst, genericIDArrayPckg ); + Write( iNotifyAccessoryConnectionStatusChanged, KAccSrvNotifyAccConnStatusChangedBit ); + iNotifyAccessoryConnectionStatusChanged.Complete( aErrorCode ); + } + else if ( EAccessoryConnectionStatusAsyncChanged == aMsgID ) + { + //Write new generic ID array and + //complete outstanding GetAccessoryConnectionStatus ( Async ) + TAccPolGenericIDArray genericIDArray; + iServerModel->CurrentConnectionStatusL( genericIDArray ); + TAccSrvGenericIDArrayPckg genericIDArrayPckg( genericIDArray ); + + iGetAccessoryConnectionStatus.WriteL( KAccServParamPosFirst, genericIDArrayPckg ); + Write( iGetAccessoryConnectionStatus, KAccSrvGetAccessoryConnectionStatusBit ); + iGetAccessoryConnectionStatus.Complete( aErrorCode ); + } + else + { + TRACE_ASSERT_ALWAYS; + User::Leave( KErrGeneral ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubConnection::CompleteMessageL - return" ); + + return ETrue; // if it gets here, return ETrue + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File