ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp
changeset 0 d11fb78c4374
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp	Thu Dec 17 08:45:53 2009 +0200
@@ -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 <obex.h>
+
+#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