ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/crsbtdevice.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:  Contains the CRsBtDevice class definition.
 *
*/


#include "crsbtdevice.h"
#include "clog.h"
#include "imageprint.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRsBtDevice::CRsBtDevice()
	{
	}

CRsBtDevice::~CRsBtDevice()
	{
	LOG("CRsBtDevice::~CRsBtDevice begin");
	delete iPrinterModel;
	delete iDevice;

	iCapabilities.Close();
	LOG("CRsBtDevice::~CRsBtDevice end");
	}

CRsBtDevice* CRsBtDevice::NewL(const TNameRecord &aName)
	{
	CRsBtDevice* self = CRsBtDevice::NewLC(aName);
	CleanupStack::Pop(self);
	return self;
	}

CRsBtDevice* CRsBtDevice::NewL()
	{
	CRsBtDevice* self = CRsBtDevice::NewLC();
	CleanupStack::Pop(self);
	return self;
	}

CRsBtDevice* CRsBtDevice::NewLC(const TNameRecord &aName)
	{
	CRsBtDevice* self = new (ELeave) CRsBtDevice();
	CleanupStack::PushL(self);
	self->ConstructL(aName);
	return self;
	}

CRsBtDevice* CRsBtDevice::NewLC()
	{
	CRsBtDevice* self = new (ELeave) CRsBtDevice();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CRsBtDevice* CRsBtDevice::NewLC(const CRsBtDevice &a)
	{
	CRsBtDevice* self = new (ELeave) CRsBtDevice();
	CleanupStack::PushL(self);
	self->ConstructL(a);
	return self;
	}

CRsBtDevice* CRsBtDevice::NewL(const CRsBtDevice &a)
	{
	CRsBtDevice* self = CRsBtDevice::NewLC(a);
	CleanupStack::Pop(self);
	return self;
	}

void CRsBtDevice::ConstructL(const TNameRecord &aName)
	{
	LOG1("CRsBtDevice::ConstructL aName.iName: %S", &(aName.iName));
	TInquirySockAddr sockAddr = (TInquirySockAddr)aName.iAddr;

	TBTDeviceClass devClass(sockAddr.MajorServiceClass(),
			sockAddr.MajorClassOfDevice(),
			sockAddr.MinorClassOfDevice());

	iDevice = CBTDevice::NewL(sockAddr.BTAddr());

	iDevice->SetDeviceClass(devClass);
	iDevice->SetFriendlyNameL(aName.iName);

	Init();

	LOG("CRsBtDevice::ConstructL end");
	}

void CRsBtDevice::ConstructL()
	{
	iDevice = CBTDevice::NewL();
	Init();
	}

void CRsBtDevice::ConstructL(const CRsBtDevice &a)
	{
	iDevice = CBTDevice::NewL();
	if(a.iDevice)
		iDevice->UpdateL(*(a.iDevice));

	iBPPPort = a.iBPPPort;
	iSTSPort = a.iSTSPort;
	iOPPPort = a.iOPPPort;
	iSupportedProtocols = a.iSupportedProtocols;
	iVendor = a.iVendor;
	iJustFound = a.iJustFound;
	iTimeDiscovered = a.iTimeDiscovered;
	iTimeLastUsed = a.iTimeLastUsed;

	iUsed = a.iUsed;

	iPrinterModel = NULL;
	if(a.iPrinterModel)
		iPrinterModel = a.iPrinterModel->AllocL();

	iInternalDeviceId = a.iInternalDeviceId;
	iDisappeared = a.iDisappeared;
	iUsedProtocol = a.iUsedProtocol;

	iCapabilities.Reset();
	for(TInt i = 0; i < a.iCapabilities.Count(); ++i)
		{

		TPrintCapability capab;
		capab.iCapabilityID = a.iCapabilities[i].iCapabilityID;
		capab.iType = a.iCapabilities[i].iType;
		capab.iLow = a.iCapabilities[i].iLow;
		capab.iHigh = a.iCapabilities[i].iHigh;
		capab.iDefaultValue = a.iCapabilities[i].iDefaultValue;
		capab.iEnumCount = a.iCapabilities[i].iEnumCount;

		for(TInt j = 0; j < a.iCapabilities[i].iEnumCount; ++j)
			{
			capab.iEnumCodes[j] = a.iCapabilities[i].iEnumCodes[j];
			}

		AddCapability(capab);
		}
	}

void CRsBtDevice::Init()
	{
	iBPPPort = 0;
	iSTSPort = 0;
	iOPPPort = 0;
	iSupportedProtocols = 0;
	iVendor = TPrinter::EVendorNone;
	iJustFound = EFalse;
	iTimeDiscovered.UniversalTime();
	iTimeLastUsed.UniversalTime();
	iPrinterModel = NULL;

	iInternalDeviceId = KErrNotFound;
	iDisappeared = ETrue;
	iUsedProtocol = 0;

	iCapabilities.Reset();
	iUsed = EFalse;
	}

/**
 * Standard method to allow object to be streamed out to a file.
 * @param aStream Stream that object will be written to, should have already been opened.
 */
void CRsBtDevice::ExternalizeL(RWriteStream& aStream) const
	{
	LOG("[CRsBtDevice::ExternalizeL]\t Begin");
	
	aStream.WriteInt32L(iInternalDeviceId);
	aStream.WriteUint32L(iBPPPort);
	aStream.WriteUint32L(iSTSPort);
	aStream.WriteUint32L(iOPPPort);
	aStream.WriteInt32L(iSupportedProtocols);
	aStream.WriteUint32L(Vendor());
	
	TUint32 temp = iTimeLastUsed.Int64();
	aStream.WriteUint32L( temp );
	temp = iTimeLastUsed.Int64() >> 32;
	aStream.WriteUint32L( temp );
	temp = iTimeDiscovered.Int64();
	aStream.WriteUint32L( temp );
	temp = iTimeDiscovered.Int64() >> 32;
	aStream.WriteUint32L( temp );
	
	
	aStream.WriteInt32L(iPrinterModel->Des().MaxLength());
	aStream << *iPrinterModel;
	
	ExternalizeCapabilitiesL(aStream);
	
	aStream << *iDevice;
	
	LOG("[CRsBtDevice::ExternalizeL]\t end");
	}

void CRsBtDevice::ExternalizeCapabilitiesL(RWriteStream& aStream) const
	{
	LOG("CRsBtDevice::ExternalizeCapabilitiesL begin");
	
	aStream.WriteInt32L(iCapabilities.Count());
	for(TInt i = 0; i < iCapabilities.Count(); ++i)
		{
		aStream.WriteInt32L(iCapabilities[i].iCapabilityID);
		aStream.WriteInt32L(iCapabilities[i].iType);
		aStream.WriteInt32L(iCapabilities[i].iDefaultValue);
		aStream.WriteInt32L(iCapabilities[i].iLow);
		aStream.WriteInt32L(iCapabilities[i].iHigh);
		aStream.WriteInt32L(iCapabilities[i].iEnumCount);
		for(TInt j = 0; j < KMaxEnumAmount; ++j)
			{
			aStream.WriteInt32L(iCapabilities[i].iEnumCodes[j]);
			}
		}
	}


/**
 * Standard method to allow object to be streamed in from a file.
 * @param aStream Stream that object will be read from, should have already been opened.
 */
void CRsBtDevice::InternalizeL(RReadStream& aStream)
	{
	LOG("[CRsBtDevice::InternalizeL]\t Begin");

	TUint timeLastHigh, timeLastLow, timeDiscHigh, timeDiscLow;
	TInt maxlen;

	iInternalDeviceId = aStream.ReadInt32L();
	iBPPPort = aStream.ReadUint32L();
	iSTSPort = aStream.ReadUint32L();
	iOPPPort = aStream.ReadUint32L();

	iSupportedProtocols = aStream.ReadInt32L();
	SetVendor(static_cast<TPrinter::TPrinterVendor>( aStream.ReadUint32L() ));

	timeLastLow = aStream.ReadUint32L();
	timeLastHigh = aStream.ReadUint32L();
	timeDiscLow = aStream.ReadUint32L();
	timeDiscHigh = aStream.ReadUint32L();

	TInt64 temp;
	temp = timeLastHigh;
	temp = temp << 32;
	iTimeLastUsed = temp | timeLastLow;
	temp = timeDiscHigh;
	temp = temp << 32;
	iTimeDiscovered = temp | timeDiscLow;

	delete iPrinterModel;
	iPrinterModel = NULL;
	maxlen = aStream.ReadInt32L();
	iPrinterModel = HBufC::NewL(aStream,maxlen);

	InternalizeCapabilitiesL(aStream);

	iDevice->InternalizeL(aStream);
	iUsed = ETrue;

	LOG1("[CRsBtDevice::InternalizeL]\t End for: %S", &FriendlyName());
	}

void CRsBtDevice::InternalizeCapabilitiesL(RReadStream& aStream)
	{
	LOG("[CRsBtDevice::InternalizeCapabilitiesL]\t begin");

	iCapabilities.Reset();

	TInt count = aStream.ReadInt32L();
	for(TInt i = 0; i < count; ++i)
		{
		TPrintCapability capability;
		capability.iCapabilityID = aStream.ReadInt32L();
		capability.iType = (TPrintCapability::ECapType)aStream.ReadInt32L();
		capability.iDefaultValue = aStream.ReadInt32L();
		capability.iLow = aStream.ReadInt32L();
		capability.iHigh = aStream.ReadInt32L();
		capability.iEnumCount = aStream.ReadInt32L();
		for(TInt j = 0; j < KMaxEnumAmount; ++j)
			{
			capability.iEnumCodes[j] = aStream.ReadInt32L();
			}
		iCapabilities.Append(capability);
		}
	}


/**
 * Create a copy of the current object.
 * \returns A pointer to the new object, the caller takes ownership of the object.
 */
CRsBtDevice* CRsBtDevice::CopyL()
	{
	CRsBtDevice* newDevice = NewLC();
	newDevice->UpdateAllL(*this);
	CleanupStack::Pop(); // newDevice
	return newDevice;
	}

/**
 * Create a copy of the current object.
 * \returns A pointer to the new object, the caller takes ownership of the object.
 */
CRsBtDevice* CRsBtDevice::CopyL(CRsBtDevice& aSource)
	{
	CRsBtDevice* newDevice = NewLC();
	newDevice->UpdateAllL(aSource);
	CleanupStack::Pop(); // newDevice
	return newDevice;
	}

/**
 * \returns Address of descriptor containing the Bluetooth friendly name of the device.
 */
const TDesC& CRsBtDevice::FriendlyName() const
	{
	return iDevice->FriendlyName();
	}

/**
 * Stores the BPP port (channel).
 * @param aPort BPP port (channel) as unsigned integer. If CRsBtDevice::SetBPPPort is not called, initialized as 0.
 */
void CRsBtDevice::SetBPPPort(TUint aPort)
	{
	iBPPPort = aPort;
	}

/**
 * Stores the status port (channel).
 * @param aPort Status port (channel) as unsigned integer. If CRsBtDevice::SetSTSPort is not called, initialized as 0.
 */
void CRsBtDevice::SetSTSPort(TUint aPort)
	{
	iSTSPort = aPort;
	}

/**
 * Stores the OPP port (channel).
 * @param aPort OPP port (channel) as unsigned integer. If CRsBtDevice::SetOPPPort is not called, initialized as 0.
 */
void CRsBtDevice::SetOPPPort(TUint aPort)
	{
	iOPPPort = aPort;
	}


/**
 * Stores the protocols that this device support.
 * @param aSupportedProtocols The Supported Protocols by this device
 */
void CRsBtDevice::SetSupportedProtocols(TUint aSupportedProtocols)
	{
	iSupportedProtocols = aSupportedProtocols;
	}

/**
 * Obtain the supported protocols by this device
 * \returns The supported protocols by this device TUint @sa KImagePrint_PrinterProtocol_BPP @sa KImagePrint_PrinterProtocol_OPP_Printer @sa KImagePrint_PrinterProtocol_OPP_PC
 */
TUint CRsBtDevice::SupportedProtocols() const
	{
	return iSupportedProtocols;
	}

/**
 * Compares the Bluetooth device address of this Bluetooth device to the address of the passed in device.
 * @param aDevice Bluetooth device to compare this object to.
 * \returns True, Bluetooth device addresses are identical, False, Bluetooth device addresses as not identical.
 */
TBool CRsBtDevice::Equals( const CRsBtDevice &aDevice ) const
	{
	return (aDevice.iDevice->BDAddr() == iDevice->BDAddr());
	}

/**
 * \returns Bluetooth device address.
 */
const TBTDevAddr& CRsBtDevice::BDAddr() const
	{
	return iDevice->BDAddr();
	}

/**
 * \returns BPP port (channel) as an unsigned integer. If CRsBtDevice::SetBPPPort is not called, initialized as 0.
 */
TUint CRsBtDevice::BPPPort() const
	{
	return iBPPPort;
	}

/**
 * \returns status port (channel) as an unsigned integer. If CRsBtDevice::SetSTSPort is not called, initialized as 0.
 */
TUint CRsBtDevice::STSPort() const
	{
	return iSTSPort;
	}

/**
 * \returns OPP port (channel) as an unsigned integer. If CRsBtDevice::SetOPPPort is not called, initialized as 0.
 */
TUint CRsBtDevice::OPPPort() const
	{
	return iOPPPort;
	}

void CRsBtDevice::SetDisappeared(TBool aDisappeared)
	{
	iDisappeared = aDisappeared;
	}

TBool CRsBtDevice::IsDisappeared() const
	{
	return iDisappeared;
	}

/**
 * First calls CRsBtDevice::UpdateDeviceAndBPP, then updates any remaining data from the current device,
 * includes whether device is saved in the device cache, the number of prints, and time stamps of
 * discovery and when last used.
 * @param aDevice Device whose data will be used to update current device.
 * \returns True, data of the current device was updated, False, nothing changed.
 */
TBool CRsBtDevice::UpdateAllL(CRsBtDevice &aDevice)
	{
	TBool modified = EFalse;

	modified = UpdateDeviceAndBPPL(aDevice);

	if (iTimeDiscovered != aDevice.iTimeDiscovered)
		{
		iTimeDiscovered = aDevice.iTimeDiscovered;
		modified = ETrue;
		}

	if (iTimeLastUsed != aDevice.iTimeLastUsed)
		{
		iTimeLastUsed = aDevice.iTimeLastUsed;
		modified = ETrue;
		}

	return modified;
	}

/**
 * First calls CRsBtDevice::UpdateDevice, then updates the current devices BPP/OPP data,
 * includes BPP/OPP supported information and BPP/OPP port.
 * @param aDevice Device whose data will be used to update current device.
 * \returns True, data of the current device was updated, False, nothing changed.
 */
TBool CRsBtDevice::UpdateDeviceAndBPPL(CRsBtDevice &aDevice)
	{
	TBool modified = EFalse;

	modified = UpdateDeviceL(aDevice);

	if ((iSupportedProtocols & aDevice.SupportedProtocols()) != iSupportedProtocols)
		{
		iSupportedProtocols = aDevice.SupportedProtocols();
		modified = ETrue;
		}

	if (iBPPPort != aDevice.BPPPort())
		{
		iBPPPort = aDevice.BPPPort();
		modified = ETrue;
		}

	if (iSTSPort != aDevice.STSPort())
		{
		iSTSPort = aDevice.STSPort();
		modified = ETrue;
		}

	if (iOPPPort != aDevice.OPPPort())
		{
		iOPPPort = aDevice.OPPPort();
		modified = ETrue;
		}

	return modified;
	}

/**
 * Update the current devices Bluetooth device data, includes device address, friendly name and device class.
 * @param aDevice Device whose data will be used to update current device.
 * \returns True, data of the current device was updated, False, nothing changed.
 */
TBool CRsBtDevice::UpdateDeviceL(CRsBtDevice &aDevice)
	{
	TBool modified = EFalse;

	if( iDevice->BDAddr() != aDevice.iDevice->BDAddr() ||
			iDevice->FriendlyName() != aDevice.iDevice->FriendlyName() ||
			! (DeviceClass() == aDevice.DeviceClass()) )
		{
		iDevice->UpdateL(*(aDevice.iDevice));
		modified = ETrue;
		}

	if( iPrinterModel )
		{
		delete iPrinterModel;
		iPrinterModel = NULL;
		modified = ETrue;
		}
	if( aDevice.iPrinterModel )
		{
		iPrinterModel = aDevice.iPrinterModel->AllocL();
		modified = ETrue;
		}
	if( Vendor() != aDevice.Vendor() )
		{
		SetVendor(aDevice.Vendor());
		modified = ETrue;
		}

	return modified;
	}

/**
 * First calls CRsBtDevice::UpdateDeviceAndBPP, then updates any remaining data from the current device,
 * includes whether device is saved in the device cache, the number of prints, and time stamps of
 * discovery and when last used.
 * @param aDevice Device whose data will be used to update current device.
 * \returns True, data of the current device was updated, False, nothing changed.
 */
TBool CRsBtDevice::UpdateUsedL(CRsBtDevice &aDevice)
	{
	TBool modified = EFalse;

	modified = UpdateDeviceAndBPPL(aDevice);

	if (iTimeDiscovered != aDevice.TimeDiscovered())
		{
		iTimeDiscovered = aDevice.TimeDiscovered();
		modified = ETrue;
		}

	if (iTimeLastUsed != aDevice.TimeLastUsed())
		{
		iTimeLastUsed = aDevice.TimeLastUsed();
		modified = ETrue;
		}

	if ( !iDisappeared )
		{
		iDisappeared = ETrue;
		modified = ETrue;
		}

	if (iUsedProtocol != (iUsedProtocol & aDevice.SupportedProtocols()) )
		{
		iUsedProtocol = aDevice.UsedProtocol();
		modified = ETrue;
		}

	return modified;
	}


/**
 * \returns The time stamp of when the device was last used.
 */
TTime CRsBtDevice::TimeLastUsed() const
	{
	return iTimeLastUsed;
	}

void CRsBtDevice::SetTimeLastUsed(TTime aTime)
	{
	iTimeLastUsed = aTime;
	}

/**
 * \returns The time stamp of when the device was first discovered.
 */
TTime CRsBtDevice::TimeDiscovered() const
	{
	return iTimeDiscovered;
	}

void CRsBtDevice::SetTimeDiscovered(TTime aTime)
	{
	iTimeDiscovered = aTime;
	}

/**
 * \returns The Bluetooth device class.
 */
TBTDeviceClass CRsBtDevice::DeviceClass() const
{
return iDevice->DeviceClass();
}

void CRsBtDevice::SetPrinterModelL(const TDesC& aModelName)
	{
	LOG1("CRsBtDevice::SetPrinterModelL aModelName: %S", &aModelName);
	HBufC* temp = aModelName.AllocL();
	TPtr ptr = temp->Des();
	ptr.UpperCase();
	delete iPrinterModel;
	iPrinterModel = temp;
	LOG("CRsBtDevice::SetPrinterModelL end");
	}

const TDesC& CRsBtDevice::GetPrinterModel() const
	{
	return *iPrinterModel;
	}

// This is not stored in the cache!
void CRsBtDevice::SetJustFound(TBool aJustFound)
	{
	iJustFound = aJustFound;
	}

// This is not stored in the cache!
TBool CRsBtDevice::IsJustFound() const
	{
	return iJustFound;
	}

TInt CRsBtDevice::DeviceId() const
	{
	return iInternalDeviceId;
	}

void CRsBtDevice::SetDeviceId(TInt aNewId)
	{
	iInternalDeviceId = aNewId;
	}

void CRsBtDevice::SetVendor( TPrinter::TPrinterVendor aVendor )
	{
	LOG1("CRsBtDevice::SetVendor aVendor: %d", aVendor);
	iVendor = aVendor;

	LOG("CRsBtDevice::SetVendor end");
	}

TPrinter::TPrinterVendor CRsBtDevice::Vendor() const
	{
	return iVendor;
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::Used
// -----------------------------------------------------------------------------
TBool CRsBtDevice::IsUsed() const
	{
	return iUsed;
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::SetUsed
// -----------------------------------------------------------------------------
void CRsBtDevice::SetUsed(TBool aUsed)
	{
	iUsed = aUsed;
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::GetUsedProtocol
// -----------------------------------------------------------------------------
//
TInt CRsBtDevice::UsedProtocol() const
	{
	return iUsedProtocol;
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::SetUsedProtocol
// -----------------------------------------------------------------------------
//
TInt CRsBtDevice::ComposeUsedProtocol(TInt aRequestedProtocols)
	{
	LOG2("CRsBtDevice::ComposeUsedProtocol]\t iRequestedProtocols: %d, supported: %d",
			aRequestedProtocols, SupportedProtocols());

	if ((aRequestedProtocols & KImagePrint_PrinterProtocol_BPP) && (SupportedProtocols() & KImagePrint_PrinterProtocol_BPP))
		{
		SetUsedProtocol(KImagePrint_PrinterProtocol_BPP);
		}
	else if ((aRequestedProtocols & KImagePrint_PrinterProtocol_OPP_Printer) && (SupportedProtocols() & KImagePrint_PrinterProtocol_OPP_Printer))
		{
		SetUsedProtocol(KImagePrint_PrinterProtocol_OPP_Printer);
		}
	else if ((aRequestedProtocols & KImagePrint_PrinterProtocol_OPP_PC) && (SupportedProtocols() & KImagePrint_PrinterProtocol_OPP_PC))
		{
		SetUsedProtocol(KImagePrint_PrinterProtocol_OPP_PC);
		}
	else
		{
		// This shouldn't happen at all, we have an error in the code
		LOG("[CRsBtDevice::ComposeUsedProtocol]\t ERROR! Protocol Mismatch.");
		SetUsedProtocol(0);
		}
	return UsedProtocol();
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::SetUsedProtocol
// -----------------------------------------------------------------------------
//
void CRsBtDevice::SetUsedProtocol(TInt aUsedProtocol)
	{
	iUsedProtocol = aUsedProtocol;
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::GetCapabilityIDs
// -----------------------------------------------------------------------------
//
void CRsBtDevice::GetCapabilityIDs(RArray<TInt>& aCapabilityIDs )
	{
	LOG1("[CBtPrintingDevice::GetCapabilityIDs]\t iCapabilities.Count(): %d", iCapabilities.Count());
	for (TInt i=0; i < iCapabilities.Count(); i++)
		{
		aCapabilityIDs.Append(iCapabilities[i].iCapabilityID);
		LOG2("[CBtPrintingDevice::GetCapabilityIDs]\t iCapabilities[%d]: %d", i, iCapabilities[i].iCapabilityID);
		}
	}

// -----------------------------------------------------------------------------
// CRsBtDevice::GetCapability
// -----------------------------------------------------------------------------
//
TInt CRsBtDevice::GetCapability(const TInt aCapabilityID, TPrintCapability& aCapability)
	{
	for (TInt i=0; i < iCapabilities.Count(); i++)
		{
		if (aCapabilityID == iCapabilities[i].iCapabilityID)
			{
			// copy capability to ouput param
			aCapability.iCapabilityID 	= aCapabilityID;
			aCapability.iDefaultValue 	= iCapabilities[i].iDefaultValue;
			aCapability.iType 			= iCapabilities[i].iType;
			aCapability.iEnumCount 		= 0;


			for (TInt j=0; j < iCapabilities[i].iEnumCount; j++)
				{
				aCapability.iEnumCodes[j] = iCapabilities[i].iEnumCodes[j];
				aCapability.iEnumCount++;
				}

			return KErrNone;
			}
		}

	return KErrNotSupported;
	}

//--------------------------------------------------------------------------------------------
// CRsBtDevice::SetDefaultCapability
//--------------------------------------------------------------------------------------------
TInt CRsBtDevice::SetDefaultCapability(TInt aCapabilityID, TInt aValue)
	{
	LOG2("[CBtPrintingDevice::SetDefaultCapability]\t capab: %d, value: %d", aCapabilityID, aValue);

	// Check Validity against the target capability ranges
	for (TInt c=0; c<iCapabilities.Count(); ++c)
		{
		if (iCapabilities[c].iCapabilityID == aCapabilityID)
			{
			if ((iCapabilities[c].iType == TPrintCapability::Int) ||
					(iCapabilities[c].iType == TPrintCapability::Float))
				{
				if (((aValue < iCapabilities[c].iLow) && (iCapabilities[c].iLow != -1)) ||
						((aValue > iCapabilities[c].iHigh) && (iCapabilities[c].iHigh != -1)))
					{
					LOG1("[CBtPrintingDevice::SetJobSettingL]\t capability ranges error; return %d", KErrInvalidData);
					return KErrInvalidData;
					}
				else
					{
					iCapabilities[c].iDefaultValue = aValue;
					LOG1("[CBtPrintingDevice::SetDefaultCapability]\t %d matches", iCapabilities[c].iType);
					return KErrNone;
					}

				}
			else // enum
				{
				for (TInt e = 0; e < iCapabilities[c].iEnumCount; ++e)
					{
					if (aValue == iCapabilities[c].iEnumCodes[e])
						{
						iCapabilities[c].iDefaultValue = aValue;
						LOG("[CBtPrintingDevice::SetDefaultCapability]\t enum matches");
						return KErrNone;
						}
					}
				}
			}
		}
	LOG("[CBtPrintingDevice::SetDefaultCapability]\t capab/value doesn't match");
	return KErrInvalidData;
	}

//--------------------------------------------------------------------------------------------
// CRsBtDevice::AddCapability
//--------------------------------------------------------------------------------------------
void CRsBtDevice::AddCapability(TPrintCapability& aCapability)
	{
	LOG1("[CBtPrintingDevice::AddCapability]\t %d", aCapability.iCapabilityID);

	for (TInt i=0; i < iCapabilities.Count(); i++)
		{
		if (aCapability.iCapabilityID == iCapabilities[i].iCapabilityID)
			{
			iCapabilities[i] = aCapability;
			return;
			}
		}

	iCapabilities.Append(aCapability);
	}

//--------------------------------------------------------------------------------------------
// CRsBtDevice::CapabilityIDCount
//--------------------------------------------------------------------------------------------
TInt CRsBtDevice::CapabilityCount() const
	{
	return iCapabilities.Count();
	}

//--------------------------------------------------------------------------------------------
// CRsBtDevice::GetPrinter
//--------------------------------------------------------------------------------------------
TPrinter CRsBtDevice::ToTPrinter()
	{
	LOG("[CRsBtDevice::GetTPrinter]\t");

	TPrinter printer;
	printer.iDisplayName = FriendlyName();
	if(0 == printer.iDisplayName.Length())
		{
		TBuf<20> tmpName;
		tmpName.AppendNum(DeviceId());
		printer.iDisplayName = tmpName;
		}
	printer.iPrinterID = DeviceId();
	printer.iProtocol = UsedProtocol();
	printer.iVendor = Vendor();


	// Set properties
	printer.iProperties = 0;
	if(IsUsed())
		{
		printer.iProperties |= TPrinter::Cached;
		}
	if(KImagePrint_PrinterProtocol_BPP == printer.iProtocol)
		{
		printer.iProperties |= TPrinter::SupportsPreview;
		}

	return printer;
	}

//  End of File