diff -r 159fc2f68139 -r d59c248c9d36 ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtchannelbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtchannelbase.cpp Wed Sep 01 12:30:38 2010 +0100 @@ -0,0 +1,543 @@ +/* +* Copyright (c) 2004-2007 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: Defines the CBtChannelBase class. +* +*/ + + +#include + +#include "crsbtdevice.h" +#include "cbtchannelbase.h" +#include "cbtsoapcodec.h" +#include "clog.h" +#include "tbtmapper.h" +#include "cbtdiscover.h" +#include "printmessagecodes.h" +#include "rsutils.h" + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::CBtChannelBase +// +//-------------------------------------------------------------------------------------------- +CBtChannelBase::CBtChannelBase(MBtPCObserver& aObs): + CActive(CActive::EPriorityStandard), + iObs( aObs ), + iState( EStateNone ), + iJobId( KErrNotFound ), + iChannel( NULL ), + iSoapCodec( NULL ), + iObexBufObject( NULL ), + iObexNullObject( NULL ), + iObexBody( NULL ), + iDevice( NULL ), + iWait( NULL ), + iResponseError(KErrNone), + iStop(EFalse) +{ + LOG("[CBtChannelBase::CBtChannelBase]\t"); + CActiveScheduler::Add(this); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::~CBtChannelBase +// +//-------------------------------------------------------------------------------------------- +CBtChannelBase::~CBtChannelBase() +{ + LOG("[CBtChannelBase::~CBtChannelBase]\t"); + + if(iWait) + { + StopWaiting(); + delete iWait; + } + + ClearConnection(); + + if(iSoapCodec) + delete iSoapCodec; + + if(iObexNullObject) + delete iObexNullObject; + + if(iObexBufObject) + delete iObexBufObject; + + if(iObexBody) + delete iObexBody; + + if(iChannel) + { + delete iChannel; + iChannel = NULL; + } + if (iPasswordQuery) + { + delete iPasswordQuery; + iPasswordQuery = NULL; + } +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::ConstructL +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::ConstructL() +{ + LOG("[CBtChannelBase::ConstructL]\t begin"); + + iWait = new (ELeave) CActiveSchedulerWait; + + LOG("[CBtChannelBase::ConstructL]\t iSoapCodec"); + iSoapCodec = CBtSoapCodec::NewL(); + + // Create obex objects here: do not NEVER delete them but in destructor + iObexBody = CBufFlat::NewL(8); + iObexBufObject = CObexBufObject::NewL(iObexBody); + iObexNullObject = CObexNullObject::NewL(); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::SetDevice +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::SetJobId( TInt aId ) +{ + iJobId = aId; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::Device +// +//-------------------------------------------------------------------------------------------- +TInt CBtChannelBase::JobId() const +{ + return iJobId; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::SetDevice +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::SetDevice( CRsBtDevice& aDevice ) +{ + iDevice = &aDevice; + LOG1("[CBtChannelBase::SetDevice]\t iDevice %d", iDevice); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::Device +// +//-------------------------------------------------------------------------------------------- +const CRsBtDevice& CBtChannelBase::Device() const +{ + return *iDevice; +} + + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::StartL +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::StartL( CRsBtDevice& aDevice ) +{ + LOG1("[CBtChannelBase::StartL]\t state %d", iState); + + User::LeaveIfNull(&aDevice); + + Stop(); + + iStop = EFalse; + + TBool btOn = RsUtils::IsBluetoothOn(); + LOG1("[CBtChannelBase::StartL]\t btOn: %d", btOn); + if( !btOn ) + User::Leave( EObexConnectError ); + + SetDevice( aDevice ); + iState = EStateNone; + ConnectL(); + WaitL(); + + LOG("[CBtChannelBase::StartL]\t out"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::Stop +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::Stop() +{ + LOG("[CBtChannelBase::Stop]\t"); + + iStop = ETrue; + + if( IsActive() ) + { + Cancel(); + } + else + StopWaiting(); + + ClearConnection(); + LOG("[CBtChannelBase::Stop]\t out"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::DoCancel +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::DoCancel() +{ + LOG("[CBtChannelBase::DoCancel]\t"); + + StopWaiting(); + + LOG1("[CBtChannelBase::DoCancel]\t iChannel %d", iChannel); + if(iChannel) + { + LOG1("[CBtChannelBase::DoCancel]\t iStatus.Int(): 0x%X", iStatus.Int()); + if(KRequestPending == iStatus.Int()) + { + DeleteChannel(); + } + } + + LOG1("[CBtChannelBase::DoCancel]\t out iStatus 0x%X", iStatus.Int()); +} + +//------------------------------ +// InCalls +//------------------------------ + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::IsConnected +// +//-------------------------------------------------------------------------------------------- +TBool CBtChannelBase::IsConnected() +{ + TBool connected = EFalse; + + if(iChannel && iChannel->IsConnected()) + { + connected = ETrue; + } + + LOG2("[CBtChannelBase::IsConnected]\t iChannel: %d, connected: %d", iChannel, connected); + + return connected; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::Disconnect +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::Disconnect() +{ + TBool conn = IsConnected(); + LOG1("[CBtChannelBase::Disconnect]\t IsConnected(): %d", conn); + + if( conn ) + { + if(IsActive()) + { + LOG("[CBtChannelBase::Disconnect]\t iChannel abort"); + iChannel->Abort(); + } + else + { + LOG("[CBtChannelBase::Disconnect]\t iChannel disconnect"); + iState = EStateDisconnecting; + iChannel->Disconnect(iStatus); + Activate(); + } + iStop = ETrue; + } + else + { + DeleteChannel(); + iState = EStateNone; + } + + LOG1("[CBtChannelBase::Disconnect]\t out. iState: %d", iState); + return; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::FinishPrinting +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::FinishPrinting() +{ + LOG("[CBtChannelBase::FinishPrintingL]\t begin"); + + // Already finishing + if(EStateFinish == iState) + { + LOG("[CBtChannelBase::FinishPrintingL]\t already finishing"); + return; + } + + iState = EStateDisconnecting; + + LOG1("[CBtChannelBase::FinishPrintingL]\t IsActive() %d", IsActive()); + if(IsActive()) + { + //return: the iState causes disconnection printing when RunL called. + return; + } + + IsConnected(); + Disconnect(); + + LOG("[CBtChannelBase::FinishPrintingL]\t end"); + return; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::SendSoapRequestL +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::SendSoapRequestL(const TInt aRequest, const TInt aJobId) +{ + SendSoapRequestL(aRequest, iStatus, aJobId); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::SendSoapRequestL +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::SendSoapRequestL(const TInt aRequest, + TRequestStatus& aStatus, + const TInt aJobId) +{ + LOG1("[CBtChannelBase::SendSoapRequestL]\t begin for %d", aRequest); + User::LeaveIfNull(iChannel); + User::LeaveIfNull(iObexBufObject); // panics if iObexBody == NULL + + /* Create soap from file */ + if(!iSoapCodec) + { + iSoapCodec = CBtSoapCodec::NewL(); + } + TPtrC8 soap = iSoapCodec->CreateSoapL(aRequest, aJobId); + + LOG2("[CBtChannelBase::SendSoapRequestL]\t Soap created for %d. len: %d",aRequest, soap.Length()); + + iObexBufObject->Reset(); + + iObexBody->InsertL(0, soap); + LOG1("[CBtChannelBase::SendSoapRequestL]\t data size %d", iObexBody->Size()); + + iObexBufObject->SetTypeL(KBtMimeTypeSoap()); + + LOG("[CBtChannelBase::SendSoapRequestL]\t Issuing get."); + iChannel->Get(*iObexBufObject, aStatus); + + Activate(); + LOG("[CBtChannelBase::SendSoapRequestL]\t end"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::GetSoapResponseL +// +//-------------------------------------------------------------------------------------------- +TInt CBtChannelBase::GetSoapResponseL() +{ + LOG("[CBtChannelBase::GetSoapResponseL]\t"); + + if( 0 >= iObexBody->Size() ) + User::Leave(KErrInvalidData); + + LOG("[CBtChannelBase::GetSoapResponseL]\t Data in obex body."); + LOG1("[CBtChannelBase::GetSoapResponseL]\t iDevice: %d", iDevice); + TInt action = EBtUnknownAction; + + //give obexbody to parser + if(!iSoapCodec) + { + iSoapCodec = CBtSoapCodec::NewL(); + } + + //read + iSoapCodec->ReadSoapL(action, *iObexBody); + LOG1("[CBtChannelBase::GetSoapResponseL]\t soap read. Action %d", action); + + // Reset object: data is stored in iSoapCodec. + // NOTE: reset resets also iObexBody + iObexBufObject->Reset(); + + LOG("[CBtChannelBase::GetSoapResponseL]\t done"); + return action; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::Activate +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::Activate() +{ + // If already active do not activate again + LOG2("[CBtChannelBase::Activate]\t for %d, IsActive %d",iState, IsActive()); + if( IsActive() ) + return; + + SetActive(); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::CompleteRequest +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::CompleteRequest(TControlState aStateCompleted, TInt aError) +{ + LOG2("[CBtChannelBase::CompleteRequest]\t aStateCompleted %d, aError %d",aStateCompleted, aError); + iState = aStateCompleted; + + LOG2("[CBtChannelBase::CompleteRequest]\t IsActive() %d, iStatus %d", IsActive(), iStatus.Int()); + if(IsActive() && KRequestPending == iStatus.Int()) + { + TRequestStatus* statusPtr = &iStatus; + User::RequestComplete(statusPtr, aError); + } + if(EStateNone != aStateCompleted) + { + Activate(); + } +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::StartWaiting +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::WaitL() +{ + if( !(iWait->IsStarted()) && KRequestPending == iStatus.Int()) + { + LOG("[CBtChannelBase::WaitL]\t"); + iWait->Start(); + + LOG2("[CBtChannelBase::WaitL]\t Continue, iStatus: %d at iState: %d", iStatus.Int(), iState); + LOG1("[CBtChannelBase::WaitL]\t iStop: %d",iStop); + if(KErrNone != iStatus.Int() && KRequestPending != iStatus.Int() && !iStop) + User::Leave(iStatus.Int()); + LOG("[CBtChannelBase::WaitL]\t out"); + } +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::StopWaiting +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::StopWaiting() +{ + if( (iWait->IsStarted()) ) + { + LOG("[CBtChannelBase::StopWaiting]\t"); + iWait->AsyncStop(); + } +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::ClearConnection +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::ClearConnection() +{ + LOG1("[CBtChannelBase::ClearConnection]\t iState %d", iState); + + Cancel(); + + iObexBufObject->Reset(); + iObexNullObject->Reset(); + iDevice = NULL; + + if(iChannel) + { + LOG("[CBtChannelBase::ClearConnection]\t iChannel clear"); + //Sends the abort operation to receiver and completes request with KErrAbort + Disconnect(); + } + LOG("[CBtChannelBase::ClearConnection]\t out"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::DeleteChannel +// +//-------------------------------------------------------------------------------------------- +void CBtChannelBase::DeleteChannel() +{ + LOG1("[CBtChannelBase::DeleteChannel]\t iChannel %d delete", iChannel); + if(iChannel) + { + delete iChannel; + iChannel = NULL; + } + iStop = EFalse; + + LOG1("[CBtChannelBase::DeleteChannel]\t iChannel %d out", iChannel); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtChannelBase::GetUserPasswordL +// +//-------------------------------------------------------------------------------------------- + +void CBtChannelBase::GetUserPasswordL( const TDesC &aRealm ) +{ + LOG("[CBtChannelBase::GetUserPasswordL begin]\t"); + + iPasswordQuery = CBtPasswordQuery::NewL( *this ); + + iPasswordQuery->StartActiveObjectL(); + + LOG("[CBtChannelBase::GetUserPasswordL end]\t"); +} + +void CBtChannelBase::PasswordQueryCompleteL ( TObexPasskeyBuf aResultPckg ) + { + iPckg = aResultPckg(); + + TBuf<256> data; + data.Copy(iPckg); + + // Send user password + iChannel->UserPasswordL(data); + } + +// End of File