diff -r 159fc2f68139 -r d59c248c9d36 ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp Wed Sep 01 12:30:38 2010 +0100 @@ -0,0 +1,574 @@ +/* +* 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 CBtPrinterController class. +* +*/ + + +#include + +#include "crsbtdevice.h" +#include "cbtprintercontroller.h" +#include "cbtsoapcodec.h" +#include "clog.h" +#include "tbtmapper.h" +#include "cbtdiscover.h" +#include "printmessagecodes.h" +#include "cbtstatuschannel.h" +#include "cbtjobchannel.h" +#include "rsutils.h" +#include "btnotifierapi.h" + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::NewL +// +//-------------------------------------------------------------------------------------------- +CBtPrinterController* CBtPrinterController::NewL(MBtPCObserver& aObs) +{ + CBtPrinterController *self = NewLC(aObs); + CleanupStack::Pop(); // self + + return self; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::NewLC +// +//-------------------------------------------------------------------------------------------- +CBtPrinterController* CBtPrinterController::NewLC(MBtPCObserver& aObs) +{ + CBtPrinterController *self = new (ELeave) CBtPrinterController(aObs); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::CBtPrinterController +// +//-------------------------------------------------------------------------------------------- +CBtPrinterController::CBtPrinterController(MBtPCObserver& aObs): + iObs( aObs ), + iJobChannel(NULL), + iObjectChannel(NULL) +{ + LOG("[CBtPrinterController::CBtPrinterController]\t"); +} + + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::~CBtPrinterController +// +//-------------------------------------------------------------------------------------------- +CBtPrinterController::~CBtPrinterController() +{ + LOG("[CBtPrinterController::~CBtPrinterController]\t"); + + ClearConnections(); + + if(iBtDiscoverEngine) + { + delete iBtDiscoverEngine; + iBtDiscoverEngine = NULL; + } + + if(iObjectChannel) + { + delete iObjectChannel; + iObjectChannel = NULL; + } + + if(iJobChannel) + { + delete iJobChannel; + iJobChannel = NULL; + } + + delete iQuery; + + iImageList.Reset(); + iImageList.Close(); + +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::ConstructL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::ConstructL() +{ + LOG("[CBtPrinterController::ConstructL]\t begin"); + iJobId = KErrNotFound; + + iBtDiscoverEngine = CRsBtDiscoverEngine::NewL(*this); + + LOG("[CBtPrinterController::ConstructL]\t channels"); + iObjectChannel = NULL; + iJobChannel = CBtJobChannel::NewL(iObs); + + iQuery = NULL; + iProtocol = 0; + + InitJobVariables(); +} + + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::ConstructL +// +//-------------------------------------------------------------------------------------------- +TInt CBtPrinterController::GetPercentSent() +{ + LOG("[CBtPrinterController::GetPercentSent]\t"); + + return iPercents; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::Stop +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::Stop() +{ + LOG("[CBtPrinterController::Stop]\t"); + + iJobChannel->Cancel(); + + ClearConnections(); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::IsConnected +// +//-------------------------------------------------------------------------------------------- +TBool CBtPrinterController::IsConnected() +{ + LOG("[CBtPrinterController::IsConnected]\t"); + TBool connected = EFalse; + + if(iJobChannel && iJobChannel->IsConnected()) + { + connected = ETrue; + LOG1("[CBtPrinterController::IsConnected]\t iJobChannel->IsConnected() %d", connected); + } + + if(iObjectChannel && iObjectChannel->IsConnected()) + { + connected = ETrue; + LOG1("[CBtPrinterController::IsConnected]\t iObjectChannel->IsConnected() %d", connected); + } + + LOG1("[CBtPrinterController::IsConnected]\t return %d",connected); + return connected; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::FinishPrinting +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::FinishPrinting() +{ + LOG("[CBtPrinterController::FinishPrintingL]\t begin"); + + // Already finishing + if(iFinish) + { + LOG("[CBtPrinterController::FinishPrintingL]\t already finishing"); + return; + } + + iFinish = ETrue; + + Stop(); + + LOG("[CBtPrinterController::FinishPrintingL]\t end"); + return; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::StartDiscoveryL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::StartDiscoveryL( TUint aProtocol) +{ + LOG1("[CBtPrinterController::StartDiscoveryL]\t aProtocol: %d", aProtocol); + + iProtocol = aProtocol; + iQuery = CBtOnQuery::NewL( *this ); + iQuery->IsBluetoothOn(); + + LOG("CBtPrinterController::StartDiscoveryL end"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::CancelDiscoveryL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::CancelDiscovery() +{ + LOG("[CBtPrinterController::CancelDiscovery]\t begin"); + iBtDiscoverEngine->Stop(); + + LOG1( "[CBtPrinterController::CancelDiscovery]\t iBtDiscoverEngine->IsActive() = %d", iBtDiscoverEngine->IsActive() ); + + Stop(); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::GetCapabilitiesL +// +// Fully independent and synchronous method. Does not require any existing +// connections and all connections will be deleted after execution. +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::GetCapabilitiesL(CRsBtDevice& aDevice) +{ + LOG("[CBtPrinterController::GetCapabilitiesL]\t"); + iJobChannel->Cancel(); + iJobChannel->GetCapabilitiesL(aDevice); + LOG("[CBtPrinterController::GetCapabilitiesL]\t out"); +} + + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::CreateJobL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::CreateJobL(CRsBtDevice& aDevice, CPrintJob& aJob) +{ + LOG("[CBtPrinterController::CreateJobL]\t begin"); + + iJobChannel->Cancel(); + + iImageList.Reset(); + aJob.Images(iImageList); + iImageCount = iImageList.Count(); + LOG1("[CBtPrinterController::CreateJobL]\t iImageList.Count(): %d", iImageList.Count()); + if(0 == iImageCount) + User::Leave(KErrInvalidData); + + iJobId = KErrNotFound; + + iJobChannel->StartL(aDevice); + + iJobChannel->CreateJobL(aJob); + LOG("[CBtPrinterController::CreateJobL]\t CreateJobL done"); + + LOG1("[CBtPrinterController::CreateJobL]\t aDevice.UsedProtocol() %d", aDevice.UsedProtocol()); + if(KImagePrint_PrinterProtocol_BPP == aDevice.UsedProtocol()) + { + LOG("[CBtPrinterController::CreateJobL]\t before establishing"); + EstablishObjectChannelL( aDevice ); + } + else + { + iJobId = 1; + } + + LOG("[CBtPrinterController::CreateJobL]\t out"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::GetPrinterStateL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::GetPrinterStateL(CRsBtDevice& aDevice) +{ + LOG("[CBtPrinterController::GetPrinterStateL]\t begin"); + iJobChannel->Cancel(); + + if(!iJobChannel->IsConnected()) + { + iJobChannel->StartL(aDevice); + } + + iJobChannel->GetPrinterStateL(); + + LOG("[CBtPrinterController::GetPrinterStateL]\t OUT"); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::GetJobAttributesL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::GetJobAttributesL(CRsBtDevice& aDevice, TInt aJobId) +{ + LOG("[CBtPrinterController::GetJobAttributesL]\t begin"); + + if(!iJobChannel || !iJobChannel->IsConnected()) + { + LOG("[CBtPrinterController::GetJobAttributesL]\t User::Leave(KErrInvalidSequence);"); + User::Leave(KErrInvalidSequence); + } + + LOG("[CBtPrinterController::GetJobAttributesL]\t iJobId = aJobId;"); + iJobId = aJobId; + + LOG("[CBtPrinterController::GetJobAttributesL]\t iJobChannel->GetJobAttributesL(aJobId);"); + iJobChannel->GetJobAttributesL(aJobId); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::CancelJobL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::CancelJobL(CRsBtDevice& aDevice, TInt aJobId) +{ + LOG("[CBtPrinterController::CancelJob(TInt)]\t begin"); + + if(!iJobChannel || !iJobChannel->IsConnected()) + User::Leave(KErrInvalidSequence); + + iJobChannel->Cancel(); + + iJobId = aJobId; + + iJobChannel->CancelJobL(iJobId); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::GetEventL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::GetEventL(TInt aJobId) +{ + LOG("[CBtPrinterController::GetEvent]\t begin"); + iJobId = aJobId; + + if(!iJobChannel || !iJobChannel->IsConnected()) + User::Leave(KErrInvalidSequence); + + iJobChannel->GetEventL(aJobId); +} + +//---------------------------------- + +/////////////////////////////// +// Private +/////////////////////////////// +// From MRsBtDiscoverEngineObserver. +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::HandleDiscoveryEvent +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::HandleDiscoveryEvent(TInt aEvent, TInt aErrorCode) +{ + LOG2("[CBtPrinterController::HandleDiscoveryEvent]\t aEvent: %d, aErrorCode: %d", aEvent, aErrorCode); + + switch ( aEvent ) + { + case MBtDiscoveryObserver::EFoundBtPrinter: + LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EFoundBtPrinter"); + iObs.DeviceDiscovered(iBtDiscoverEngine->GetDevice()); + break; + case MBtDiscoveryObserver::ERemoveBtPrinter: + LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t ERemoveBtPrinter"); + iObs.DeviceDisappeared(iBtDiscoverEngine->GetDevice()); + break; + case MBtDiscoveryObserver::EDoneFindingPrinters: + LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EDoneFindingPrinters"); + iObs.DiscoveryError(KErrNone); + break; + case MBtDiscoveryObserver::EErrorDuringDiscover: + LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EErrorDuringDiscover"); + iObs.DiscoveryError(aErrorCode); + break; + default: + break; + } +} + +// From MBtObjectServerObserver +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::HandleObjectServerEvent +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::HandleObjectServerEvent(TInt aStatus, TInt aInfo) +{ + LOG2("[CBtPrinterController::OperationStatus]\t aStatus: %d, aInfo: %d", aStatus, aInfo); + + switch( aStatus ) + { + case KObjectServerStopped: + LOG("[CBtPrinterController::OperationStatus]\t iObjectChannel stopped"); + iServerError = KErrNone; + break; + case KObjectServerStarted: + LOG("[CBtPrinterController::OperationStatus]\t KObjectServerStarted"); + iServerError = KErrNone; + iPercents = 0; + iSentImages = 0; + break; + case KObjectServerAllFilesSent: // not used! + iServerError = KErrNone; + break; + case KObjectServerPackageSent: + iServerError = KErrNone; + iPercents = 100 * ((iSentImages * 100) + aInfo) / (iImageCount * 100); + LOG2("[CBtPrinterController::OperationStatus]\t iPercents %d, aInfo %d", iPercents, aInfo); + iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone); + break; + case KObjectServerFileSent: + LOG("[CBtPrinterController::OperationStatus]\t KObjectServerOneFileSent"); + iServerError = KErrNone; + + iPercents = 100 * ((iSentImages * 100) + aInfo) / (iImageCount * 100); + + ++iSentImages; + LOG2("[CBtPrinterController::OperationStatus]\t sent images: %d/%d", iSentImages, iImageCount); + if(iSentImages == iImageCount) + { + iObs.GetEventResponse(iJobId, EBtStatePrinting, EBtStatePrinting, ENoMessage, KErrNone); + } + else + { + iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone); + } + break; + case KErrNone: + break; + case KObjectServerBTDeviceMismatch: + LOG("[CBtPrinterController::OperationStatus]\t KObjectServerBTDeviceMismatch"); + break; + case KObjectServerTransportUp: + LOG("[CBtPrinterController::OperationStatus]\t KObjectServerTransportUp"); + iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone); + case KObjectServerConnected: + iServerError = KErrNone; + break; + case KObjectServerError: + LOG1("[CBtPrinterController::OperationStatus]\t KObjectServerError: %d", aInfo); + iServerError = aInfo; + //break here: other messages takes care of correct actions + break; + case KObjectServerDisconnected: + LOG1("[CBtPrinterController::OperationStatus]\t disconnected, iServerError %d", iServerError); + case KObjectServerTransportDown: + LOG1("[CBtPrinterController::OperationStatus]\t transport down. iServerError %d", iServerError); + if(KErrNone != iServerError) + iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, iServerError, KErrDisconnected); + iServerError = KErrNone; + break; + default: + LOG("[CBtPrinterController::OperationStatus]\t default..."); + break; + } +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::InitSyncVariables +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::InitJobVariables() +{ + iPercents = 0; + iImageCount = 0; + iServerError = KErrNone; + iFinish = EFalse; +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::ClearConnections +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::ClearConnections() +{ + LOG("[CBtPrinterController::ClearConnections]\t "); + + if(iBtDiscoverEngine) + iBtDiscoverEngine->Cancel(); + + if(iObjectChannel) + { + iObjectChannel->Stop(); + LOG("[CBtPrinterController::ClearConnections]\t **** iObjectChannel stop"); + } + + if(iJobChannel) + { + LOG("[CBtPrinterController::ClearConnections]\t **** iJobChannel stop"); + iJobChannel->Disconnect(); + } + + InitJobVariables(); +} + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::EstablishObjectChannelL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::EstablishObjectChannelL( CRsBtDevice& aDevice ) +{ + if( 0 == iImageList.Count()) + User::Leave(KErrInvalidSequence); + + LOG("[CBtPrinterController::EstablishObjectChannelL]\t create iObjectChannel"); + if(iObjectChannel) + { + delete iObjectChannel; + iObjectChannel = NULL; + } + iObjectChannel = CBtObjectServer::NewL( aDevice.BDAddr(), iImageList, *this ); + iObjectChannel->StartL(); + + iImageList.Reset(); + +} + + +//-------------------------------------------------------------------------------------------- +// +// CBtPrinterController::BTOnCompleteL +// +//-------------------------------------------------------------------------------------------- +void CBtPrinterController::BTOnCompleteL( TBool aResult ) + { + LOG("[CBtPrinterController::BTOnComplete] begin \t "); + + if( !aResult ) + { + LOG("[CBtPrinterController::BTOnComplete]\t cancelling discovery, bt is not activated \t "); + CancelDiscovery(); + iObs.DiscoveryError( ENoConnection ); + } + + + iBtDiscoverEngine->Start( iProtocol ); + + LOG("[CBtPrinterController::BTOnComplete] end \t "); + } + +// End of File