diff -r 6295dc2169f3 -r 8486d82aef45 adaptationlayer/bcaiscadapter/bcatoisc_dll/src/bcatoisc.cpp --- a/adaptationlayer/bcaiscadapter/bcatoisc_dll/src/bcatoisc.cpp Wed Apr 21 14:29:55 2010 +0300 +++ b/adaptationlayer/bcaiscadapter/bcatoisc_dll/src/bcatoisc.cpp Tue Oct 19 13:16:20 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -22,27 +22,59 @@ #include "iscdefinitions.h" #include +#include +#include +#include +#include +#include "pep_bca_types.h" + + +const TUint8 KDataLength = 7; +const TUint8 KStatusIndex = 0; +const TUint8 KDevIdIndex = 5; +const TUint8 KObjIdIndex = 6; +const TUint8 KPadding = 0; +const TUint KDefaultReceiveBufferSize = 2048; + using namespace BasebandChannelAdaptation; +/** +* Utility function to complete a pending request and NULL request pointer. +*/ + +static void CompleteRequest(TRequestStatus* &aReqStatus, const TInt aError) + { + if(( aReqStatus ) && + ( *aReqStatus == KRequestPending )) + { + // Only realy need to trace if we actually complete the request. + C_TRACE( (_T("CompleteRequest completing client request with aError %d ->"), aError ) ); + + //Complete clients request + User::RequestComplete( aReqStatus, aError ); + + aReqStatus = NULL; + } + } + /** * Default constructor to create a CNotifyFlowControlMonitor instance. */ CNotifyFlowControlMonitor::CNotifyFlowControlMonitor(RIscApi& aIscApi) - :CActive(EPriorityStandard), - iIscApi(aIscApi) + :CActive(EPriorityHigh), + iIscApi(aIscApi), + iWriteStatus(NULL) { - C_TRACE( (_T("CNotifyFlowControlMonitor::CNotifyFlowControlMonitor RIscAapi 0x%x ->"), &aIscApi ) ); - + C_TRACE( (_T("CNotifyFlowControlMonitor::CNotifyFlowControlMonitor RIscApi 0x%x ->"), &aIscApi ) ); CActiveScheduler::Add(this); - C_TRACE( (_T("CNotifyFlowControlMonitor::CNotifyFlowControlMonitor <-") ) ); } void CNotifyFlowControlMonitor::NotifyFlowControlStatus() { C_TRACE( (_T("CNotifyFlowControlMonitor::NotifyFlowControlStatus() ->") ) ); - + ASSERT(!IsActive()); iFlowControlValue = iIscApi.FlowControlStatus(); @@ -58,47 +90,54 @@ void CNotifyFlowControlMonitor::RequestFlowcontrolChange( TRequestStatus& aStatus ) { C_TRACE( (_T("CNotifyFlowControlMonitor::RequestFlowcontrolChange ->") ) ); - iWriteStatus = &aStatus; *iWriteStatus = KRequestPending; - - C_TRACE( (_T("CNotifyFlowControlMonitor::RequestFlowcontrolChange <-") ) ); } +void CNotifyFlowControlMonitor::CompleteFlowcontrolChangeWithCancel() + { + C_TRACE( (_T("CNotifyFlowControlMonitor::CompleteFlowcontrolChangeWithCancel() ->") ) ); + // If pending request, complete as cancelled + CompleteRequest(iWriteStatus, KErrCancel); + C_TRACE( (_T("CNotifyFlowControlMonitor::CompleteFlowcontrolChangeWithCancel() <-") ) ); + } + void CNotifyFlowControlMonitor::RunL() { C_TRACE( (_T("CNotifyFlowControlMonitor::RunL() iStatus %d ->"), iStatus.Int() ) ); - iFlowControlValue = iIscApi.FlowControlStatus(); + ASSERT( iStatus.Int() == KErrNone); - + iFlowControlValue = iIscApi.FlowControlStatus(); + C_TRACE( (_T("CNotifyFlowControlMonitor::RunL flow control Value has changed and is now: (%d)"), iFlowControlValue ) ); - if( *iWriteStatus == KRequestPending ) - { - User::RequestComplete(iWriteStatus, KErrNone); - } - - if( iStatus == KErrNone ) + if( iFlowControlValue == EIscFlowControlOff) { - //Check for further flow control status changes - iIscApi.NotifyFlowControl(iStatus, iFlowControlValue); - SetActive(); + // If pending request, complete it as flow control is now OFF + CompleteRequest(iWriteStatus,KErrNone); } - + + //Check for further flow control status changes + iIscApi.NotifyFlowControl(iStatus, iFlowControlValue); + SetActive(); C_TRACE( (_T("CNotifyFlowControlMonitor::RunL() <-") ) ); } TInt CNotifyFlowControlMonitor::GetFlowControlState() { + C_TRACE( (_T("CNotifyFlowControlMonitor::GetFlowControlState() flowcontrol value %d <->"), iFlowControlValue ) ); return iFlowControlValue; } void CNotifyFlowControlMonitor::DoCancel() { C_TRACE( (_T("CNotifyFlowControlMonitor::DoCancel() ->") ) ); - + // If pending request, complete it as cancelled + CompleteRequest(iWriteStatus, KErrCancel); + C_TRACE( (_T("CNotifyFlowControlMonitor::DoCancel() req is completed") ) ); + iIscApi.NotifyFlowControlCancel(); C_TRACE( (_T("CNotifyFlowControlMonitor::DoCancel() <-") ) ); @@ -109,18 +148,17 @@ C_TRACE( (_T("CNotifyFlowControlMonitor::~CNotifyFlowControlMonitor() ->") ) ); Cancel(); - + C_TRACE( (_T("CNotifyFlowControlMonitor::~CNotifyFlowControlMonitor() <-") ) ); } CNotifyWriteStatusMonitor::CNotifyWriteStatusMonitor( CBcaToIsc& aUser, RIscApi& aIscApi ) - :CActive(EPriorityHigh), + :CActive(EPriorityStandard), iUser(aUser), iIscApi(aIscApi) { C_TRACE( (_T("CNotifyWriteStatusMonitor::CNotifyWriteStatusMonitor ->") ) ); - // iBuf = new TPtr8( NULL, 0, 0 ); CActiveScheduler::Add(this); C_TRACE( (_T("CNotifyWriteStatusMonitor::CNotifyWriteStatusMonitor <-") ) ); } @@ -128,44 +166,48 @@ void CNotifyWriteStatusMonitor::Write( TRequestStatus& aStatus, const TDesC8& aBuf ) { - + C_TRACE( (_T("CNotifyWriteStatusMonitor::Write ->") ) ); iBuf = &aBuf; iClientStatus = &aStatus; *iClientStatus = KRequestPending; if( iUser.iFlowControlMonitor->GetFlowControlState() == EIscFlowControlOff ) { - //iIscApi.DataSend( aStatus, aBuf ); - SendAndComplete(); + SendAndComplete(KErrNone); } else //flow control on { - - //iBuf = &aBuf; - // iBuf->Set( const_cast(aBuf.Ptr()), aBuf.Length(), aBuf.Length() ); - // iClientStatus = &aStatus; - // *iClientStatus = KRequestPending; iUser.iFlowControlMonitor->RequestFlowcontrolChange( iStatus ); SetActive(); } - + C_TRACE( (_T("CNotifyWriteStatusMonitor::Write <-") ) ); } + void CNotifyWriteStatusMonitor::RunL() - { - C_TRACE( (_T("CNotifyWriteStatusMonitor::RunL() iStatus %d ->"), iStatus.Int() ) ); - - SendAndComplete(); - //iIscApi.DataSend( *iClientStatus, *iBuf ); + { + C_TRACE( (_T("CNotifyWriteStatusMonitor::RunL() iStatus %d ->"), iStatus.Int() ) ); +// KARI ei kutsu IASC apin data sendiä jos erksa OK? + SendAndComplete(iStatus.Int()); C_TRACE( (_T("CNotifyWriteStatusMonitor::RunL() <-") ) ); } -void CNotifyWriteStatusMonitor::SendAndComplete() +void CNotifyWriteStatusMonitor::SendAndComplete(TInt aError) { - TInt error = KErrGeneral; + C_TRACE( (_T("CNotifyWriteStatusMonitor::SendAndComplete() ->"))); - error = iIscApi.DataSend( *iBuf ); - User::RequestComplete(iClientStatus, error); + // We may have had the request cancelled, in which case do not send the write data + if (aError == KErrNone) + { + C_TRACE( (_T("CNotifyWriteStatusMonitor::SendAndComplete() iIscApi.DataSend "))); + aError = iIscApi.DataSend( *iBuf ); + } + + // If pending request, complete it as specified by the error status + // This could be OK or canncelled + CompleteRequest(iClientStatus, aError); + + C_TRACE( (_T("CNotifyWriteStatusMonitor::SendAndComplete() <-") ) ); } @@ -173,12 +215,10 @@ { C_TRACE( (_T("CNotifyWriteStatusMonitor::DoCancel() ->") ) ); - if( *iClientStatus == KRequestPending ) - { - C_TRACE( (_T("CNotifyWriteStatusMonitor::DoCancel completing client request with KErrCancel ->") ) ); - //Complete clients request - User::RequestComplete( iClientStatus, KErrCancel ); - } + iUser.iFlowControlMonitor->CompleteFlowcontrolChangeWithCancel(); + + // If pending request, complete it as cancelled + CompleteRequest(iClientStatus, KErrCancel); C_TRACE( (_T("CNotifyWriteStatusMonitor::DoCancel() <-") ) ); } @@ -198,7 +238,11 @@ /** * Default constructor to create a CBcaToIsc instance. */ -CBcaToIsc::CBcaToIsc() : iReadLength(0), iChannelNumber( 0xffff ) +CBcaToIsc::CBcaToIsc() : + CActive( EPriorityStandard ), + iMessageBufferPtr( 0,0 ), + iReadLength(0), + iChannelNumber( 0xffff ) { C_TRACE( (_T("CBcaToIsc::CBcaToIsc() ->") ) ); @@ -216,6 +260,14 @@ __ASSERT_DEBUG(!iWriteStatusMonitor, User::Panic(_L("BcaToIsc.dll"), EMonitorAlreadyExists)); iFlowControlMonitor = new (ELeave)CNotifyFlowControlMonitor(iIscApi); iWriteStatusMonitor = new (ELeave)CNotifyWriteStatusMonitor(*this, iIscApi); + iReceivedMessageBuffer = HBufC8::NewL(KDefaultReceiveBufferSize); + iMessageBufferPtr.Set( iReceivedMessageBuffer->Des() ); + iMessageBufferPtr.FillZ(); + iChannelList.Append( EIscNokiaNifPep5 ); + iChannelList.Append( EIscNokiaNifPep6 ); + iChannelList.Append( EIscNokiaNifPep7 ); + iChannelList.Append( EIscNokiaNifPep8 ); + CActiveScheduler::Add( this ); C_TRACE( (_T("CBcaToIsc::ConstructL() this 0x%x <-"), this ) ); } @@ -236,11 +288,18 @@ { delete iWriteStatusMonitor; } + + if( iReceivedMessageBuffer ) + { + delete iReceivedMessageBuffer; + } + iClientShutdownStatus = NULL; + iClientOpenStatus = NULL; C_TRACE( (_T("CBcaToIsc::~CBcaToIsc() <-") ) ); } - +// remove loan / returnloan deadcode from lower layers /** This method deletes the BCA itself.*/ void CBcaToIsc::Release() { @@ -257,11 +316,14 @@ * @param aStatus complete status, KErrNone if successful, error code otherwise. * @param aChannelId comm port name. -*/ +*/ void CBcaToIsc::Open(TRequestStatus& aStatus, const TDesC& aChannelId) { C_TRACE( (_T("CBcaToIsc::Open aStatus %d aChannelId descriptor %S ->"), aStatus.Int(), &aChannelId ) ); + iClientOpenStatus = &aStatus; + *iClientOpenStatus = KRequestPending; + // Expected form either Int_ (i.e. 100Int_3) or Int!!! TUint16 channelid( 0xffff ); TInt error( KErrGeneral ); @@ -282,16 +344,56 @@ error = channelParser.Val(channelid, EDecimal); } ASSERT( KErrNone == error ); + C_TRACE( (_T("CBcaToIsc::Open parsed channel id: 0x%x"), channelid ) ); if( error == KErrNone ) { - error = iIscApi.Loan( channelid ); - iChannelNumber = error == KErrNone ? channelid : iChannelNumber; + TInt index( 0 ); + TBool channelOpened( EFalse ); + TRequestStatus status( KRequestPending ); + for( index = 0; index < iChannelList.Length(); index++ ) + { + status = KRequestPending; + iIscApi.Open( iChannelList[index], status, EOwnerThread ); + User::WaitForRequest( status ); + if( KErrNone == status.Int() ) + { + C_TRACE( (_T("CBcaToIsc::Open channel 0x%x opened"), iChannelList[index] ) ); + channelOpened = ETrue; + break; + } + } + + if( !channelOpened ) + { + C_TRACE( (_T("CBcaToIsc::Open channel opening failed") ) ); + User::RequestComplete( iClientOpenStatus, KErrGeneral ); + iClientOpenStatus = NULL; + } + else if( KErrNone == SendNameAddReq( iChannelList[index], channelid ) ) + { + iFlowControlMonitor->NotifyFlowControlStatus(); + iChannelNumber = status.Int() == KErrNone ? iChannelList[index] : iChannelNumber; + + iMessageBufferPtr.SetLength( 0 ); + iStatus = KRequestPending; + iIscApi.Receive( iStatus, iMessageBufferPtr, iReadLength ); + SetActive(); + } + else + { + C_TRACE( (_T("CBcaToIsc::Open sending of PNS_NAME_ADD_REQ failed") ) ); + iIscApi.Close(); + User::RequestComplete( iClientOpenStatus, KErrGeneral ); + iClientOpenStatus = NULL; + } } - ASSERT( KErrNone == error ); - TRequestStatus* request = &aStatus; - User::RequestComplete( request, error ); + else + { + User::RequestComplete( iClientOpenStatus, error ); + iClientOpenStatus = NULL; + } + C_TRACE( (_T("CBcaToIsc::Open <-") ) ); - } /** @@ -309,10 +411,23 @@ iWriteStatusMonitor->Cancel(); iFlowControlMonitor->Cancel(); iIscApi.DataReceiveCancel(); - iIscApi.ReturnLoan( iChannelNumber ); - User::RequestComplete(iClientShutdownStatus, KErrNone); + + if( KErrNone == SendNameRemoveReq() ) + { + iMessageBufferPtr.SetLength( 0 ); + iStatus = KRequestPending; + iIscApi.Receive( iStatus, iMessageBufferPtr, iReadLength ); + SetActive(); + } + else + { + C_TRACE( (_T("CBcaToIsc::Shutdown sending of PNS_NAME_REMOVE_REQ failed") ) ); + iIscApi.Close(); + User::RequestComplete(iClientShutdownStatus, KErrGeneral); + iClientShutdownStatus = NULL; + } + C_TRACE( (_T("CBcaToIsc::Shutdown <-") ) ); - } /** @@ -337,7 +452,8 @@ C_TRACE( (_T("CBcaToIsc::Close() iChannelNumber=0x%x 4"), iChannelNumber ) ); iIscApi.DataSendCancel(); C_TRACE( (_T("CBcaToIsc::Close() iChannelNumber=0x%x 5"), iChannelNumber ) ); - iIscApi.ReturnLoan( iChannelNumber ); + + iIscApi.Close(); C_TRACE( (_T("CBcaToIsc::Close() <-") ) ); @@ -369,10 +485,9 @@ void CBcaToIsc::Write( TRequestStatus& aStatus, const TDesC8& aBuf ) { C_TRACE( (_T("CBcaToIsc::Write aStatus %d aBuf %S ->"), aStatus.Int(), &aBuf ) ); - //write requesti pitää jäädä odottamaan jos flow controlli päälä. - - iWriteStatusMonitor->Write(aStatus, aBuf); - + + iWriteStatusMonitor->Write(aStatus, aBuf); + C_TRACE( (_T("CBcaToIsc::Write <-") ) ); } @@ -433,3 +548,407 @@ } +/** +* Sends PNS_NAME_ADD_REQ + +* @param aObjId object id for the name to be added +* @return KErrNone if message sent succesfully, otherwise error code +*/ +TInt CBcaToIsc::SendNameAddReq( TUint16& aObjId, TUint16& aClientObjId ) + { + C_TRACE( (_T("CBcaToIsc::SendNameAddReq() ->") ) ); + + HBufC8* message = HBufC8::New( ISI_HEADER_SIZE + SIZE_PNS_NAME_ADD_REQ ); + TInt err( KErrGeneral ); + + if( message ) + { + TPtr8 messageptr = message->Des(); + messageptr.FillZ(); + + // Add 32bit name (Big-endian) + iName.Append( aClientObjId ); + iName.Append( PN_PEP_SUB_TYPE_SYMBIAN_INTERNAL ); + iName.Append( PN_PEP_TYPE_COMMON ); + iName.Append( PN_PIPE ); + TUint8 nameOffset( ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY ); + + TIsiSend isimessage( messageptr, ISI_HEADER_SIZE + SIZE_PNS_NAME_ADD_REQ ); + isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_NAMESERVICE ); + isimessage.Set8bit( ISI_HEADER_OFFSET_TRANSID, 0 ); + isimessage.Set8bit( ISI_HEADER_OFFSET_MESSAGEID, PNS_NAME_ADD_REQ ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_RESERVED1, KPadding ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_RESERVED2, KPadding ); + isimessage.Set8bit( nameOffset, iName[0] ); + isimessage.Set8bit( nameOffset + 1, iName[1] ); + isimessage.Set8bit( nameOffset + 2, iName[2] ); + isimessage.Set8bit( nameOffset + 3, iName[3] ); + isimessage.Set8bit( nameOffset + PN_NAME_SRV_ITEM_STR_OFFSET_DEV, THIS_DEVICE ); + isimessage.Set8bit( nameOffset + PN_NAME_SRV_ITEM_STR_OFFSET_OBJ, aObjId ); + isimessage.Set8bit( nameOffset + PN_NAME_SRV_ITEM_STR_OFFSET_FLAGS, PN_NAME_UNDEF ); + isimessage.Set8bit( nameOffset + PN_NAME_SRV_ITEM_STR_OFFSET_RESERVED, KPadding ); + isimessage.Complete(); + + err = iIscApi.Send( messageptr ); + C_TRACE( (_T("CBcaToIsc::SendNameAddReq() success: 0x%x"), err ) ); + delete message; + } + else + { + C_TRACE( (_T("CBcaToIsc::SendNameAddReq() memory allocation failed") ) ); + ASSERT(0); + } + + C_TRACE( (_T("CBcaToIsc::SendNameAddReq() <-") ) ); + return err; + } + +/** +* Sends PNS_NAME_REMOVE_REQ + +* @return KErrNone if message sent succesfully, otherwise error code +*/ +TInt CBcaToIsc::SendNameRemoveReq() + { + C_TRACE( (_T("CBcaToIsc::SendNameRemoveReq() ->") ) ); + + HBufC8* message = HBufC8::New( ISI_HEADER_SIZE + SIZE_PNS_NAME_REMOVE_REQ ); + TInt err( KErrGeneral ); + if( message ) + { + TPtr8 messageptr = message->Des(); + messageptr.FillZ(); + TUint8 nameOffset( ISI_HEADER_SIZE + PNS_NAME_REMOVE_REQ_OFFSET_NAME ); + + TIsiSend isimessage( messageptr, ISI_HEADER_SIZE + SIZE_PNS_NAME_REMOVE_REQ ); + isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_NAMESERVICE ); + isimessage.Set8bit( ISI_HEADER_OFFSET_TRANSID , 0 ); + isimessage.Set8bit( ISI_HEADER_OFFSET_MESSAGEID, PNS_NAME_REMOVE_REQ ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_NAME_REMOVE_REQ_OFFSET_RESERVED1, KPadding ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_NAME_REMOVE_REQ_OFFSET_RESERVED2, KPadding ); + isimessage.Set8bit( nameOffset, iName[0] ); + isimessage.Set8bit( nameOffset + 1, iName[1] ); + isimessage.Set8bit( nameOffset + 2, iName[2] ); + isimessage.Set8bit( nameOffset + 3, iName[3] ); + isimessage.Complete(); + err = iIscApi.Send( messageptr ); + C_TRACE( (_T("CBcaToIsc::SendNameRemoveReq() success: 0x%x"), err ) ); + delete message; + } + else + { + C_TRACE( (_T("CBcaToIsc::SendNameRemoveReq() memory allocation failed") ) ); + ASSERT(0); + } + + C_TRACE( (_T("CBcaToIsc::SendNameRemoveReq() <-") ) ); + return err; + } + +/** +* Sends PNS_PEP_CTRL_RESP + +* @return KErrNone if message sent succesfully, otherwise error code +*/ +TInt CBcaToIsc::SendPepCtrlResp( + TUint8 aTrId, + TUint8 aReceiverDev, + TUint8 aReceiverObj, + TUint8 aPipeHandle, + TUint8 aPepCtrlId, + TUint8 aPepType, + TUint8 aResult ) + { + C_TRACE( (_T("CBcaToIsc::SendPepCtrlResp() ->") ) ); + + HBufC8* message = HBufC8::New( ISI_HEADER_SIZE + SIZE_PNS_PEP_CTRL_RESP ); + TInt err( KErrGeneral ); + + if( message ) + { + TPtr8 messageptr = message->Des(); + messageptr.FillZ(); + + TIsiSend isimessage( messageptr, ISI_HEADER_SIZE + SIZE_PNS_PEP_CTRL_RESP ); + isimessage.Set8bit( ISI_HEADER_OFFSET_RECEIVERDEVICE, aReceiverDev); + isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_PIPE); + isimessage.Set8bit( ISI_HEADER_OFFSET_RECEIVEROBJECT, aReceiverObj); + isimessage.Set8bit( ISI_HEADER_OFFSET_TRANSID , aTrId); + isimessage.Set8bit( ISI_HEADER_OFFSET_MESSAGEID, PNS_PEP_CTRL_RESP ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_PEP_CTRL_RESP_OFFSET_PIPEHANDLE, aPipeHandle ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_PEP_CTRL_RESP_OFFSET_PEPCTRLID, aPepCtrlId ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_PEP_CTRL_RESP_OFFSET_PEPTYPE, aPepType ); + isimessage.Set8bit( ISI_HEADER_SIZE + PNS_PEP_CTRL_RESP_OFFSET_ERRORCODE, aResult ); + isimessage.Complete(); + err = iIscApi.Send( messageptr ); + C_TRACE( (_T("CBcaToIsc::SendPepCtrlResp() success: 0x%x"), err ) ); + delete message; + } + else + { + C_TRACE( (_T("CBcaToIsc::SendPepCtrlResp() memory allocation failed") ) ); + ASSERT(0); + } + + C_TRACE( (_T("CBcaToIsc::SendPepCtrlResp() <-") ) ); + return err; + } + +/** +* Handles received messages + +* @param aObjId object id for the name to be added +* @return KErrNone if message sent succesfully, otherwise error code +*/ +void CBcaToIsc::RunL() + { + C_TRACE( (_T("CBcaToIsc::RunL() ->") ) ); + + if ( KErrNone == iStatus.Int() ) + { + HandleReceivedMsg( TIsiReceiveC( iMessageBufferPtr ) ); + } + else + { + C_TRACE( (_T("CBcaToIsc::RunL() error occured: 0x%x"), iStatus.Int() ) ); + ASSERT(0); + } + + C_TRACE( (_T("CBcaToIsc::RunL() <-") ) ); + } + +/** +* Handles cancel operation for this active object + +*/ +void CBcaToIsc::DoCancel() + { + C_TRACE( (_T("CBcaToIsc::DoCancel() ->") ) ); + iIscApi.ReceiveCancel(); + C_TRACE( (_T("CBcaToIsc::DoCancel() <-") ) ); + } + +/** +* Handles received message + +*/ +void CBcaToIsc::HandleReceivedMsg( const TIsiReceiveC& aIsiMsg ) + { + C_TRACE( (_T("CBcaToIsc::HandleReceivedMsg() ->") ) ); + + TInt resource( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) ); + + switch( resource ) + { + case PN_NAMESERVICE: + { + HandleNameServiceMsg( aIsiMsg ); + break; + } + case PN_PIPE: + { + HandlePipeMsg( aIsiMsg ); + break; + } + default: + { + C_TRACE( (_T("CBcaToIsc::HandleReceivedMsg() unknown resource 0x%x"), resource ) ); + ASSERT(0); + break; + } + } + + C_TRACE( (_T("CBcaToIsc::HandleReceivedMsg() <-") ) ); + } + +/** +* Handles received messages from resource PN_NAME + +*/ +void CBcaToIsc::HandleNameServiceMsg( const TIsiReceiveC& aIsiMsg ) + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() ->") ) ); + + TInt msgId( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) ); + switch( msgId ) + { + case PNS_NAME_ADD_RESP: + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() PNS_NAME_ADD_RESP") ) ); + TUint8 reason( aIsiMsg.Get8bit( + ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ) ); + if( PN_NAME_OK != reason ) + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() Name adding failed: 0x%x"), reason ) ); + if( iClientOpenStatus ) + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() completing open") ) ); + User::RequestComplete( iClientOpenStatus, KErrGeneral ); + iClientOpenStatus = NULL; + iIscApi.Close(); + } + // no else + } + else + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() Name added succesfully") ) ); + iMessageBufferPtr.SetLength( 0 ); + iStatus = KRequestPending; + iIscApi.Receive( iStatus, iMessageBufferPtr, iReadLength ); + SetActive(); + } + break; + } + case PNS_NAME_REMOVE_RESP: + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() PNS_NAME_REMOVE_RESP") ) ); + TUint8 reason( aIsiMsg.Get8bit( + ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ) ); + if( PN_NAME_OK != reason ) + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() Name removing failed: 0x%x"), reason ) ); + ASSERT(0); + if( iClientShutdownStatus ) + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() completing shutdown") ) ); + User::RequestComplete(iClientShutdownStatus, KErrGeneral ); + iClientShutdownStatus = NULL; + } + } + else + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() Name removed succesfully") ) ); + iName.Zero(); + iMessageBufferPtr.SetLength( 0 ); + iStatus = KRequestPending; + iIscApi.Receive( iStatus, iMessageBufferPtr, iReadLength ); + SetActive(); + } + break; + } + default: + { + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() unknown msg 0x%x"), msgId ) ); + break; + } + } + + C_TRACE( (_T("CBcaToIsc::HandleNameServiceMsg() <-") ) ); + } + +/** +* Handles received messages from resource PN_PIPE + +*/ +void CBcaToIsc::HandlePipeMsg( const TIsiReceiveC& aIsiMsg ) + { + C_TRACE( (_T("CBcaToIsc::HandlePipeMsg() ->") ) ); + + TInt msgId( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) ); + switch( msgId ) + { + case PNS_PEP_CTRL_REQ: + { + C_TRACE( (_T("CBcaToIsc::HandlePipeMsg() PNS_PEP_CTRL_REQ") ) ); + HandlePepCtrlReq( aIsiMsg ); + break; + } + default: + { + C_TRACE( (_T("CBcaToIsc::HandlePipeMsg() unknown msg 0x%x"), msgId ) ); + ASSERT(0); + break; + } + } + + C_TRACE( (_T("CBcaToIsc::HandlePipeMsg() <-") ) ); + } + +/** +* Handles PNS_PEP_CTRL_REQ + +*/ +void CBcaToIsc::HandlePepCtrlReq( const TIsiReceiveC& aIsiMsg ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() ->") ) ); + + TUint8 pipeHandle( aIsiMsg.Get8bit( + ISI_HEADER_SIZE + PNS_PEP_CTRL_REQ_OFFSET_PIPEHANDLE ) ); + TUint8 pepCtrlId( aIsiMsg.Get8bit( + ISI_HEADER_SIZE + PNS_PEP_CTRL_REQ_OFFSET_PEPCTRLID ) ); + TUint8 pepType( aIsiMsg.Get8bit( + ISI_HEADER_SIZE + PNS_PEP_CTRL_REQ_OFFSET_PEPTYPE ) ); + TUint8 result( PN_PIPE_ERR_NOT_SUPPORTED ); + + TUint8 trId( aIsiMsg.Get8bit( + ISI_HEADER_OFFSET_TRANSID ) ); + // Get sender device + TUint8 senderDevice( aIsiMsg.Get8bit( + ISI_HEADER_OFFSET_SENDERDEVICE ) ); + // Get sender object + TUint8 senderObject( aIsiMsg.Get8bit( + ISI_HEADER_OFFSET_SENDEROBJECT ) ); + + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() pipe handle: 0x%x"), pipeHandle ) ); + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() pep ctrl id: 0x%x"), pepCtrlId ) ); + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() pep type: 0x%x"), pepType ) ); + + TBuf8 data( aIsiMsg.GetData( + ISI_HEADER_SIZE + PNS_PEP_CTRL_REQ_OFFSET_PEPCTRLDATA, + KDataLength ) ); + + TUint8 devId( data[KDevIdIndex] ); + TUint8 objId( data[KObjIdIndex] ); + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() dev id: 0x%x"), devId ) ); + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() obj id: 0x%x"), objId ) ); + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() iChannelNumber: 0x%x"), iChannelNumber ) ); + + if( PN_PEP_TYPE_BCA == pepType && + THIS_DEVICE == devId && + iChannelNumber == objId ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() PNS_PEP_CTRL_REQ for this PEP") ) ); + result = PN_PIPE_NO_ERROR; + TInt ret( KErrNone ); + + if( PEP_BCA_OK != data[KStatusIndex] ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() PNS_PEP_CTRL_REQ with error 0x%x"), data[KStatusIndex] ) ); + ret = KErrGeneral; + } + + if( PEP_CTRL_ID_LOAN == pepCtrlId ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() ctrl id PEP_CTRL_ID_LOAN") ) ); + if( iClientOpenStatus ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() completing open") ) ); + User::RequestComplete( iClientOpenStatus, ret ); + iClientOpenStatus = NULL; + } + } + else if( PEP_CTRL_ID_RETURNLOAN == pepCtrlId ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() ctrl id PEP_CTRL_ID_RETURNLOAN") ) ); + if( iClientShutdownStatus ) + { + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() completing shutdown") ) ); + User::RequestComplete(iClientShutdownStatus, ret); + iClientShutdownStatus = NULL; + } + } + } + + SendPepCtrlResp( + trId, + senderDevice, + senderObject, + pipeHandle, + pepCtrlId, + pepType, + result ); + + C_TRACE( (_T("CBcaToIsc::HandlePepCtrlReq() <-") ) ); + } + +