ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:38 +0100
branchRCL_3
changeset 21 d59c248c9d36
parent 0 d11fb78c4374
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* 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