DirectPrint/DirectPrintApp/src/directprintbearermgr.cpp
author Steven Cao <steven.1.cao@nokia.com>
Tue, 11 May 2010 14:10:02 +0800
changeset 19 2275db202402
parent 11 613a5ff70823
permissions -rw-r--r--
Pickup K3's code

/*
* Copyright (c) 2010 Kanrikogaku Kenkyusho, Ltd.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:
* Kanrikogaku Kenkyusho, Ltd. - Initial contribution
*
* Contributors:
*
* Description:
* {Description of the file}
*
*/

// User includes
#include "clog.h"
#include "DirectPrintApp.pan"
#include "DirectPrintBearerMgr.h"
#include "DirectPrintModel.h"
#include "directprintbearerdata.h"
#include "directprintprinterdata.h"

#include "directprintprintsettings.h"
#include "directprinttintcapability.h"
#include "directprintlistcapability.h"
#include "directprintfloatcapability.h"
#include "directprinttextcapability.h"
#include "directprintsettingsconverter.h"
#include "directprintcapability.h"

const TInt PROTOCOL_ID_BIT_COUNT = 6;

CDirectPrintBearerMgr::CDirectPrintBearerMgr(MDirectPrintBearerMngObserver* aObserver,
											 CDirectPrintModel& aModel)
	: CActive( CActive::EPriorityHigh )
	, iObserver(aObserver)
	, iModel(aModel)
	{
	LOG("CDirectPrintBearerMgr::CDirectPrintBearerMgr()");
	CActiveScheduler::Add(this);
	}

CDirectPrintBearerMgr::~CDirectPrintBearerMgr()
	{
	LOG("CDirectPrintBearerMgr::~CDirectPrintBearerMgr()");
	if (IsActive())
		{
		Cancel();
		}
	iBearer.Close();
	delete iPrintSettings;
	}

CDirectPrintBearerMgr* CDirectPrintBearerMgr::NewL(MDirectPrintBearerMngObserver* aObserver,
										CDirectPrintModel& aModel)
	{
	CDirectPrintBearerMgr* self = CDirectPrintBearerMgr::NewLC(aObserver, aModel);
	CleanupStack::Pop(self);
	return self;
	}

CDirectPrintBearerMgr* CDirectPrintBearerMgr::NewLC(MDirectPrintBearerMngObserver* aObserver,
										CDirectPrintModel& aModel)
	{
	CDirectPrintBearerMgr* self = new(ELeave) CDirectPrintBearerMgr(aObserver, aModel);
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

void CDirectPrintBearerMgr::ConstructL()
	{
	LOG("CDirectPrintBearerMgr::ConstructL BEGIN");
	__ASSERT_ALWAYS(iObserver, Panic(EDirectPrintNoObserver));
	iPrintSettings = new ( ELeave ) CDirectPrintPrintSettings;
	iBearer.ConnectL();
	SetBearerStatus(EBearerMngConnected);
	LOG("CDirectPrintBearerMgr::ConstructL END");
	}

void CDirectPrintBearerMgr::CreateJobL()
	{
	LOG("CDirectPrintBearerMgr::CreateJobL BEGIN");
	RPointerArray<TDesC> cmdline;
	CleanupClosePushL(cmdline);

	_LIT(KDPAppName, "DirectPrint");
	cmdline.AppendL(&(KDPAppName()));

	TDirectPrintBearerData bearerData;
	TDirectPrintPrinterData printerData;
	TInt indexBearer = iModel.CurrentBearer();
	TInt indexPrinter = iModel.CurrentPrinter();
	if (indexBearer >= 0 && indexPrinter >= 0)
		{
		iModel.GetBearerDataL(indexBearer, bearerData);
		iModel.GetPrinterDataL(indexPrinter, printerData);
		}
	else
		{
		LOG("CDirectPrintBearerMgr::CreateJobL LEAVE1 KErrNotFound");
		User::Leave(KErrNotFound);
		}

	HBufC* apname = HBufC::NewLC(50);
	TPtr apnamePtr(apname->Des());
	_LIT(KDPApName, "-S%S");
	apnamePtr.AppendFormat(KDPApName(), &(bearerData.iHostName));
	cmdline.AppendL(apname);

	HBufC* printername = HBufC::NewLC(50);
	TPtr printernamePtr(printername->Des());
	_LIT(KDPPrinterName, "-P000000439163");
	printernamePtr.Copy(KDPPrinterName());
	cmdline.AppendL(printername);

	HBufC* filename = HBufC::NewLC(50);
	TPtr filenamePtr(filename->Des());
#ifdef __WINSCW__
		_LIT(KDPFileName, "c:\\fpr.pcl");
#else
//		_LIT(KDPFileName, "e:\\fpr.pcl");
		_LIT(KDPFileName, "c:\\fpr.pcl");
#endif
	filenamePtr.Copy(KDPFileName());
	cmdline.AppendL(filename);

	SetBearerStatus(EBearerMngCreatingJob);

	// bearer ID
	TInt printerID = 128;
	TInt err = iBearer.CreateJob(printerID, iJobGuardData,
						cmdline, iStatus);
	if( !err )
		{
		LOG("Start create JOB");
		SetActive();
		}
	else
		{
		LOG1("CDirectPrintBearerMgr::CreateJobL LEAVE2[%d]", err);
		User::Leave(err);
		}

	CleanupStack::PopAndDestroy(filename);
	CleanupStack::PopAndDestroy(printername);
	CleanupStack::PopAndDestroy(apname);
	CleanupStack::PopAndDestroy(&cmdline);
	LOG("CDirectPrintBearerMgr::CreateJobL END");
	}

void CDirectPrintBearerMgr::RunL()
	{
	LOG1("CDirectPrintBearerMgr::RunL begin with iStatus.Int(): %d", iStatus.Int());
	if( iStatus == KErrNone && iObserver )
		{
		switch( iJobGuardData.iCb )
			{
			case TDirectPrintJobGuardData::EProgressEventCb:
				LOG("CJobGuard::RunL TDirectPrintJobGuardData::EProgressEventCb");
				LOG1("CJobGuard::RunL iJobGuardData.iStatus: %d", iJobGuardData.iStatus);
				LOG1("CJobGuard::RunL iJobGuardData.iPercentCompletion: %d", iJobGuardData.iPercentCompletion);
				LOG1("CJobGuard::RunL iJobGuardData.iJobStateCode: %d", iJobGuardData.iJobStateCode);
				iObserver->PrintJobProgressEvent( iJobGuardData.iStatus, iJobGuardData.iPercentCompletion, iJobGuardData.iJobStateCode );
				break;
			case TDirectPrintJobGuardData::EErrorEventCb:
				LOG("CJobGuard::RunL TDirectPrintJobGuardData::EErrorEventCb");
				LOG1("CJobGuard::RunL iJobGuardData.iError: %d", iJobGuardData.iError);
				LOG1("CJobGuard::RunL iJobGuardData.iErrorStringCode: %d", iJobGuardData.iErrorStringCode);
				iObserver->PrintJobErrorEvent( iJobGuardData.iError, iJobGuardData.iErrorStringCode );
				break;
			case TDirectPrintJobGuardData::EStatusEventCb:
				LOG("CJobGuard::RunL TDirectPrintJobGuardData::EStatusEventCb");
				LOG1("CJobGuard::RunL iJobGuardData.iError: %d", iJobGuardData.iError);
				LOG1("CJobGuard::RunL iJobGuardData.iErrorStringCode: %d", iJobGuardData.iErrorStringCode);
				iObserver->PrintJobErrorEvent( iJobGuardData.iError, iJobGuardData.iErrorStringCode );
				break;
			case TDirectPrintJobGuardData::EImageEventCb:
				LOG("CJobGuard::RunL TDirectPrintJobGuardData::EImageEventCb");
				LOG1("CJobGuard::RunL iJobGuardData.iFsBitmapHandle: %d", iJobGuardData.iFsBitmapHandle);
				iObserver->PreviewImageEvent( iJobGuardData.iFsBitmapHandle );
				break;
			default:
				break;
			}

		LOG1("CDirectPrintBearerMgr::RunL BearerStatus=[%d]", iBearerStatus);

		switch (iBearerStatus)
			{
			case EBearerMngNotConnected:
			case EBearerMngConnected:
			case EBearerMngCreatingJob:
			case EBearerMngPrinting:
				{
				LOG("CDirectPrintBearerMgr::RunL ContinueCreateJob");
				iBearer.ContinueCreateJob( iJobGuardData, iStatus );
				SetActive();
				}
				break;
			case EBearerMngClosing:
			case EBearerMngCanceling:
			default:
				break;
			}

		}
	LOG("CDirectPrintBearerMgr::RunL end");
	}

void CDirectPrintBearerMgr::SubmitPrintJobL()
	{
	LOG("CDirectPrintBearerMgr::SubmitPrintJobL BEGIN");
	SetBearerStatus(EBearerMngPrinting);
	// Submit print job
	TInt err = iBearer.SubmitPrintJob();
	if( err != KErrNone )
		{
		User::Leave(err);
		}
	LOG("CDirectPrintBearerMgr::SubmitPrintJobL END");
	}

void CDirectPrintBearerMgr::CloseSession()
	{
	LOG("CDirectPrintBearerMgr::CloseSession BEGIN");
	SetBearerStatus(EBearerMngClosing);
	Cancel();
//	iBearer.Close();
	SetBearerStatus(EBearerMngConnected);
	LOG("CDirectPrintBearerMgr::CloseSession END");
	}

void CDirectPrintBearerMgr::DoCancel()
	{
	LOG("CDirectPrintBearerMgr::DoCancel BEGIN");
	SetBearerStatus(EBearerMngCanceling);
	iBearer.CancelCreateJob();
	LOG("CDirectPrintBearerMgr::DoCancel END");
	}

void CDirectPrintBearerMgr::SetBearerStatus(TBearerMngStatus aStatus)
	{
	LOG1("CDirectPrintBearerMgr::SetBearerStatus [%d]", aStatus);
	iBearerStatus = aStatus;
	}

CDirectPrintBearerMgr::TBearerMngStatus CDirectPrintBearerMgr::BearerStatus()
	{
	return iBearerStatus;
	}

TInt CDirectPrintBearerMgr::SupportedProtocols()
	{
	return iBearer.SupportedProtocols();
	}

TInt CDirectPrintBearerMgr::GetProtocolNames(RSelectItemArray& aNames)
	{
	return iBearer.GetProtocolNames(aNames);
	}

void CDirectPrintBearerMgr::InitCapabilitiesL(TInt aIndex)
	{
	TInt printerUid = CreatePrinterUid(aIndex);

	RArray<TInt> capabIDs;
	CleanupClosePushL( capabIDs );

	iBearer.GetPrinterCapabilityIDs( printerUid, capabIDs );
	CDirectPrintPrintSettings* printSettings = new ( ELeave ) CDirectPrintPrintSettings;
	CleanupStack::PushL( printSettings );

	TInt i( 0 );
	TInt num( capabIDs.Count() );
	for ( i = 0; i < num; i++ )
		{
		TDirectPrintCapability capab;
		iBearer.GetPrinterCapability( printerUid, capabIDs[i], capab );
		//capab.iType = TDirectPrintCapability::Enum;

		CDirectPrintBaseCapability* capability = 0;

		// Create capability
		switch ( capab.iType )
			{
			case TDirectPrintCapability::Int:
				capability = DirectPrintSettingsConverter::AddTIntCapabilityLC( capab, i, capabIDs[i] );
				break;
			case TDirectPrintCapability::Enum:
				capability = DirectPrintSettingsConverter::AddListCapabilityLC( capab, i, capabIDs[i] );
				break;
			case TDirectPrintCapability::Float:
				capability = DirectPrintSettingsConverter::AddFloatCapabilityLC( capab, i, capabIDs[i] );
				break;
			case TDirectPrintCapability::Text:
				capability = DirectPrintSettingsConverter::AddTextCapabilityLC( capab, i, capabIDs[i] );
				break;
			default:
				User::Leave( KErrUnknown );
				break;
			}
		//iBearer.GetJobSetting( capabIDs[i], capability->iValue );

		// Add the capability to the list
		User::LeaveIfError( printSettings->iCapabilities.Append( capability ) );
		CleanupStack::Pop();    // capability
		}

	delete iPrintSettings;
	iPrintSettings = printSettings;

	CleanupStack::Pop();    // printSettings
	CleanupStack::PopAndDestroy();  // capabIDs
	}

TInt CDirectPrintBearerMgr::GetJobSetting(TInt aCapabilityID, TInt& aValue)
	{
	return iBearer.GetJobSetting(aCapabilityID, aValue);
	}

TInt CDirectPrintBearerMgr::SetJobSetting(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
	{
	return iBearer.SetJobSetting(aCapabilityID, aValue, aAffectedCapability);
	}

void CDirectPrintBearerMgr::SetJobSettings()
	{
	TInt i( 0 );
	TInt num( iPrintSettings->iCapabilities.Count() );
	for ( i = 0; i < num; i++ )
		{
		TInt getSettings;
		iBearer.SetJobSetting(iPrintSettings->iCapabilities[i]->iUid, iPrintSettings->iCapabilities[i]->iValue, getSettings);
		}
	}

CDirectPrintPrintSettings* CDirectPrintBearerMgr::PrinterSettingsL()
	{
	//return iPrintSettings->CloneL();
	return iPrintSettings;
	}

TInt CDirectPrintBearerMgr::CreatePrinterUid(TInt aIndex)
	{
	TInt printerUid = 0;
	TInt protocolIndex = aIndex;
	protocolIndex <<= sizeof(TInt)*8 - PROTOCOL_ID_BIT_COUNT;
	printerUid |= protocolIndex;
	return printerUid;
	}

// End of file