DirectPrint/DirectPrintApp/src/directprintbearermgr.cpp
changeset 19 2275db202402
parent 11 613a5ff70823
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DirectPrint/DirectPrintApp/src/directprintbearermgr.cpp	Tue May 11 14:10:02 2010 +0800
@@ -0,0 +1,357 @@
+/*
+* 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