ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdiscover.cpp
branchGCC_SURGE
changeset 25 59ea2209bb67
parent 23 08cc4cc059d4
parent 15 a92d00fca574
--- a/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdiscover.cpp	Fri Jun 11 16:24:10 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,895 +0,0 @@
-/*
-* 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 CBtDiscover class definition. Bluetooth device discovery and SDP.
-*
-*/
-
-
-#include "cbtdiscover.h"
-#include "clog.h"
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-/**
- * @brief Instantiate new CBtDiscover object.
- */
-CBtDiscover* CBtDiscover::NewL()
-	{
-	CBtDiscover* self = new (ELeave) CBtDiscover();
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(); // self
-	return self;
-	}
-
-
-/**
- * @brief Two phase construction.
- */
-void CBtDiscover::ConstructL()
-	{
-	iSdpSearchPattern = CSdpSearchPattern::NewL();
-	iMatchList = CSdpAttrIdMatchList::NewL();
-	}
-
-/**
- * @brief Constructor.
- */
-CBtDiscover::CBtDiscover() :
-	iCurrentSDPAttrID(0),
-	iCurrentServiceUUID(0),
-	iFoundSTS(EFalse),
-	iWantedService(ETrue),
-	iDoingSDP(EFalse),
-	iFindingDevices(EFalse),
-	iAgent(NULL),
-	iRequestStatus(NULL),
-	iSdpSearchPattern(NULL),
-	iMatchList(NULL),
-	iContentTypes(NULL),
-	iPrinterModel(NULL),
-	iBPPPort(0),
-	iSTSPort(0),
-	iOPPPort(0)
-	{
-	}
-
-/**
- * @brief Destructor.
- */
-CBtDiscover::~CBtDiscover()
-	{
-	LOG("CBtDiscover::~CBtDiscover begin");
-	Stop();
-	if(iSdpSearchPattern)
-		delete iSdpSearchPattern;
-	if(iMatchList)
-		delete iMatchList;
-	if(iContentTypes)
-		delete iContentTypes;
-	if(iPrinterModel)
-		delete iPrinterModel;
-	if(iAgent)
-		delete iAgent;
-	LOG("CBtDiscover::~CBtDiscover end");
-	}
-
-/**
- * @brief Destructor.
- */
-void CBtDiscover::Reset()
-	{
-	LOG("CBtDiscover::Reset begin");
-
-	StopSDP(); // resets also public member variables and iDoingSDP flag
-
-	iBPPPort = 0;
-	iSTSPort = 0;
-	iOPPPort = 0;
-
-	if(iPrinterModel)
-		delete iPrinterModel;
-	iPrinterModel = NULL;
-
-	if(iSdpSearchPattern)
-		iSdpSearchPattern->Reset();
-	
-	// No can do if remove fails -> ignore leave
-	if(iMatchList)
-		TRAP_IGNORE( iMatchList->RemoveL(TAttrRange(0x0000, 0xFFFF)) );
-	
-	if(iContentTypes)
-		delete iContentTypes;
-	iContentTypes = NULL;
-	
-
-	if( iRequestStatus )
-	{
-		if(KRequestPending == iRequestStatus->Int())
-			User::RequestComplete(iRequestStatus, KErrNone);
-	}
-	iRequestStatus = NULL;
-
-	LOG("CBtDiscover::Reset end");
-	}
-
-/**
-  * @brief Starts the asynchronous search for Bluetooth devices.
-  *
-  * Starts the asynchronous search for Bluetooth devices. The Active Object containing
-  * this object, CRsBtDiscoverEngine, is notified after the first device is found.
-  * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
-  */
-void CBtDiscover::Start(TRequestStatus &aStatus)
-	{
-	LOG("[CBtDiscover::Start]\t begin");
-	aStatus = KErrNotSupported;
-
-	TInt err = iSocketServ.Connect();
-	LOG1("[CBtDiscover::Start]\t iSocketServ.Connect() err: %d", err);
-	if( KErrNone == err )
-	{
-		err = iHostResolver.Open( iSocketServ, KBTAddrFamily, KBTLinkManager );
-		LOG1("[CBtDiscover::Start]\t iHostResolver.Open() err: %d", err);
-	}
-
-	if( KErrNone == err )
-	{
-		iFindingDevices = ETrue;
-		iSockAddr.SetIAC( KGIAC );
-		iSockAddr.SetAction( KHostResInquiry | KHostResName | KHostResIgnoreCache );
-		iHostResolver.GetByAddress( iSockAddr, iNameEntry, aStatus );
-	}
-	else
-	{
-		iFindingDevices = EFalse;
-		iSocketServ.Close();
-		iHostResolver.Close();
-	}
-
-	LOG("[CBtDiscover::Start]\t end");
-	}
-
-/**
-  * @brief Continues the asynchronous search for Bluetooth devices.
-  *
-  * Continues the asynchronous search for Bluetooth devices. The Active Object containing
-  * this object, CRsBtDiscoverEngine, is notified after the next device is found.
-  * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
-  */
-void CBtDiscover::GetNextDevice(TRequestStatus &aStatus)
-	{
-	LOG("[CBtDiscover::GetNextDevice]\t");
-	iHostResolver.Next(iNameEntry, aStatus);
-	}
-
-/**
-  * @brief Stop the asynchronous search for Bluetooth devices.
-  */
-void CBtDiscover::Stop()
-	{
-	LOG1("[CBtDiscover::Stop]\t begin with iFindingDevices: %d", iFindingDevices);
-
-	if(iFindingDevices)
-		iHostResolver.Cancel();
-	iFindingDevices = EFalse;
-
-	Reset();
-
-	iHostResolver.Close();
-	iSocketServ.Close();
-
-	LOG("[CBtDiscover::Stop]\t end");
-	}
-
-/**
-  * @brief Is an asynchronous search for Bluetooth devices in progress?
-  * @return True, a search is in progress, or False, no search is in progress
-  */
-TBool CBtDiscover::IsFindingDevices() const
-	{
-	return iFindingDevices;
-	}
-
-/**
-  * @brief Get the last Bluetooth device found by the search.
-  * @return The last Bluetooth device found by the search.
-  */
-TNameRecord CBtDiscover::GetNameRecord() const
-	{
-	return iNameEntry();
-	}
-
-/**
-  * @brief Store Bluetooth device information, in preparation for doing an SDP query.
-  */
-void CBtDiscover::SetNameRecord(TNameRecord aNameRecord)
-	{
-	TNameEntry nameEntry(aNameRecord);
-	iNameEntry = nameEntry;
-	}
-
-/**
-  * @brief Starts the asynchronous request for the SDP record.
-  *
-  * Starts the asynchronous request for the SDP record from a Bluetooth device.
-  * Specifically the device is tested for the BPP and OPP services.
-  * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
-  * @param aServiceMask Bitmask to require (only) certain services. All marked by default.
-  */
-void CBtDiscover::GetSupportedServicesL(TRequestStatus &aStatus, TUint32 aServiceMask)
-	{
-	LOG("[CBtDiscover::GetSupportedServicesL]\t begin");
-
-	Reset();
-	iRequestStatus = &aStatus;
-	*iRequestStatus = KRequestPending;	
-
-	iMatchList->RemoveL(TAttrRange(0x0000, 0xFFFF));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdServiceClassIDList));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdProtocolDescriptorList));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdAdditionalProtocolDescriptorLists));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdDocFormatsSupported));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdModelID));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdMaxWidth));
-	iMatchList->AddL(TAttrRange(KSdpAttrIdMaxLen));
-
-	iSdpSearchPattern->Reset();
-
-	if(KBtMaskObjectPush & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPOBEXObjectPush); // 0x1105
-	if(KBtMaskDirectPrinting & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPDirectPrinting); // 0x1118
-	if(KBtMaskPrintingStatus & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPPrintingStatus); // 0x1123
-	if(KBtMaskL2CAP & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPL2CAP);
-	if(KBtMaskRFCOMM & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPRFCOMM);
-	if(KBtMaskObex & aServiceMask)
-		iSdpSearchPattern->AddL(KBTSDPObex);
-
-	StartSDPL();
-
-	LOG("[CBtDiscover::GetSupportedServicesL]\t end");
-	}
-
-/**
-  * @brief Initiate the SDP request started in VerifyServiceSupportL.
-  */
-void CBtDiscover::StartSDPL()
-	{
-	StopSDP();
-	TBTDevAddr btAddr = ((TInquirySockAddr)iNameEntry().iAddr).BTAddr();
-	iAgent = CSdpAgent::NewL(*this, btAddr);
-	iAgent->SetRecordFilterL(*iSdpSearchPattern);
-	iAgent->SetAttributePredictorListL(*iMatchList);
-	iAgent->NextRecordRequestL();
-	iDoingSDP = ETrue;
-	}
-
-/**
-  * @brief Stop the asynchronous request for the SDP record from a Bluetooth device.
-  */
-void CBtDiscover::StopSDP()
-	{
-	LOG1("[CBtDiscover::StopSDP] begin with iAgent address: %d", TInt(iAgent));
-	iDoingSDP = EFalse;
-
-	iCurrentSDPAttrID = 0;
-    iCurrentServiceUUID = 0;
-	iFoundSTS = EFalse;
-	iWantedService = ETrue;
-
-	if( iAgent )
-		{
-		iAgent->Cancel();
-		delete iAgent;
-		iAgent = NULL;
-		}
-	LOG("[CBtDiscover::StopSDP] end");
-	}
-
-/**
-  * @brief Is an asynchronous request for the SDP record in progress?.
-  *
-  * Is an asynchronous request for the SDP record from a Bluetooth device in progress?
-  * @return True, a request is in progress, or False, no request is in progress
-  */
-TBool CBtDiscover::IsDoingSDP() const
-	{
-	return iDoingSDP;
-	}
-
-/**
-  * The CSdpAgent object calls this to notify that the attributes from an SDP record are ready for parsing.
-  * @param aAttrValue Structured attribute(s) of SDP record, parsed with TBTAttribValVisitor
-  */
-void CBtDiscover::AttributeRequestResult(TSdpServRecordHandle /*aHandle*/, TSdpAttributeID aAttrID, CSdpAttrValue *aAttrValue)
-	{
-	TRAPD( err, AttributeRequestResultL( aAttrID, aAttrValue ) );
-	if(KErrNone != err)
-		LOG1("[CBtDiscover::AttributeRequestResult]\t AttributeRequestResultL leaves with: %d", err);
-	}
-
-void CBtDiscover::AttributeRequestResultL( TSdpAttributeID aAttrID, CSdpAttrValue* aValue )
-	{
-	LOG1("[CBtDiscover::AttributeRequestResultL]\t *** Device: %S: ", &GetDeviceName() );
-	LOG2("CBtDiscover::AttributeRequestResultL aAttrID: %d, aValue->Type(): %d", aAttrID, aValue->Type());
-
-	iCurrentSDPAttrID = aAttrID;
-	CBTAttribValVisitor* valVisitor = NULL;
-
-	switch( aAttrID )
-		{
-		case KSdpAttrIdServiceClassIDList:
-			iCurrentServiceUUID = 0; // reset
-		case KSdpAttrIdProtocolDescriptorList:
-		case KSdpAttrIdAdditionalProtocolDescriptorLists:
-		case KSdpAttrIdDocFormatsSupported:
-		case KSdpAttrIdModelID:
-		case KSdpAttrIdMaxWidth:
-		case KSdpAttrIdMaxLen:
-			valVisitor = CBTAttribValVisitor::NewLC( *this );
-			aValue->AcceptVisitorL( *valVisitor ); // goes in CBTAttribValVisitor::VisitAttributeValueL 
-			CleanupStack::PopAndDestroy( valVisitor );
-			break;
-		default:
-			break;
-		}
-
-	delete aValue;
-
-	LOG("CBtDiscover::AttributeRequestResultL end");
-	}
-
-
-/**
-  * The CSdpAgent object calls this to notify that the SDP record request has been completed.
-  */
-void CBtDiscover::NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount)
-	{
-	LOG1("CBtDiscover::NextRecordRequestComplete aError: %d", aError);
-	LOG1("CBtDiscover::NextRecordRequestComplete aHandle: %d", aHandle);
-	LOG1("CBtDiscover::NextRecordRequestComplete aTotalRecordsCount: %d", aTotalRecordsCount);
-	TInt err( aError );
-
-	if( KErrNone == aError  && aTotalRecordsCount > 0)
-	{
-		TRAP( err, iAgent->AttributeRequestL( aHandle, KSdpAttrIdServiceClassIDList ) );
-		LOG1("CBtDiscover::NextRecordRequestComplete err: %d", err);
-	}
-
-	if( KErrNone != err || !aTotalRecordsCount )
-	{
-		if( KErrEof == err || !aTotalRecordsCount )
-		{
-			err = KErrNone;
-		}
-		StopSDP();
-		LOG("CBtDiscover::NextRecordRequestComplete User::RequestComplete");
-		User::RequestComplete( iRequestStatus, err );	
-	}
-
-	// reset
-	iCurrentServiceUUID = 0; 
-	iWantedService = ETrue;
-	iCurrentSDPAttrID = 0;
-	LOG("CBtDiscover::NextRecordRequestComplete end");
-	}
-
-/**
-  * The CSdpAgent object calls this to notify that the current SDP record has no more attributes.
-  * @param aError Standard Symbian error code, KErrNone indicates success.
-  */
-void CBtDiscover::AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError)
-{
-	LOG("[CBtDiscover::AttributeRequestComplete]\t Begin.");
-	if( KErrNone != aError || !iWantedService || 0 == iCurrentSDPAttrID)
-	{
-		LOG1("[CBtDiscover::AttributeRequestComplete]\t err: %d", aError);
-		iCurrentSDPAttrID = 0;
-		LOG("[CBtDiscover::AttributeRequestComplete]\t Not wanted service. Get next record.");
-		TRAPD( err, iAgent->NextRecordRequestL() );
-		if(KErrNone != err)
-		{
-			NextRecordRequestComplete(err, aHandle, 0);
-		}
-	}
-	else
-	{
-		LOG("[CBtDiscover::AttributeRequestComplete]\t Wanted service. Get next attribute.");
-		TRAPD( err, GetNextAttributeL(aHandle) );
-		if( KErrNone != err )
-			LOG1("[CBtDiscover::AttributeRequestComplete]\t err: %d", err);
-	}
-	iCurrentSDPAttrID = 0;
-	LOG("[CBtDiscover::AttributeRequestComplete]\t End.");
-}
-
-/**
-  * @brief Get BPP port.
-  * @return Port (i.e. Bluetooth channel) of the BPP service on the printer. Returns -1 if port is unknown.
-  */
-TInt CBtDiscover::GetBPPPort() const
-	{
-	return iBPPPort;
-	}
-
-/**
-  * @brief Get Status port.
-  * @return Port (i.e. Bluetooth channel) of the status service on the printer. Returns -1 if port is unknown.
-  */
-TInt CBtDiscover::GetSTSPort() const
-	{
-	return iSTSPort;
-	}
-
-/**
-  * @brief Get OPP port.
-  * @return Port (i.e. Bluetooth channel) of the OPP service on the printer. Returns -1 if port is unknown.
-  */
-TInt CBtDiscover::GetOPPPort() const
-	{
-	return iOPPPort;
-	}
-
-/**
-  * @brief Set the BPP Port.
-  *
-  * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
-  * Also used to indicate that the BPP service was successfully detected in the SDP response.
-  */
-void CBtDiscover::SetBPPPort(TInt aPort)
-	{
-	LOG1("CBtDiscover::SetBPPPort aPort: %d", aPort);
-	iBPPPort = aPort;
-	}
-
-/**
-  * @brief Set the Status Port.
-  *
-  * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
-  * Also used to indicate that the Status service was successfully detected in the SDP response.
-  */
-void CBtDiscover::SetSTSPort(TInt aPort)
-	{
-	LOG1("CBtDiscover::SetSTSPort aPort: %d", aPort);
-	iSTSPort = aPort;
-	}
-/**
-  * @brief Set the OPP Port.
-  *
-  * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
-  * Also used to indicate that the OPP service was successfully detected in the SDP response.
-  */
-void CBtDiscover::SetOPPPort(TInt aPort)
-	{
-	LOG1("CBtDiscover::SetOPPPort aPort: %d", aPort);
-	iOPPPort = aPort;
-	}
-
-/**
-  * @brief Bluetooth device supports BPP?.
-  *
-  * Does the SDP response for the current Bluetooth device indicate that BPP is supported?
-  * Checks to make sure that a Port (i.e. Bluetooth channel) for the BPP service was determined,
-  * AND that the device supports the Mime/Multiplex document type.
-  * @return True, BPP is supported, or False, BPP is not supported
-  */
-TBool CBtDiscover::IsBPPSupported() const
-	{
-	_LIT(KMimeXhtmlType, "application/vnd.pwg-xhtml-print+xml");
-	_LIT(KMimeMultiplexType, "application/vnd.pwg-multiplexed");
-	LOG1("CBtDiscover::IsBPPSupported iBPPPort: %d", iBPPPort);
-	return ( iBPPPort && (SupportsContentType( KMimeMultiplexType ) || SupportsContentType( KMimeXhtmlType )) );
-	}
-
-/**
-  * @brief Bluetooth device supports OPP?.
-  *
-  * Does the SDP response for the current Bluetooth device indicate that OPP is supported?
-  * @return True if OPP is supported. False if OPP is not supported.
-  */
-TBool CBtDiscover::IsOPPSupported() const
-	{
-	LOG1("CBtDiscover::IsOPPSupported iOPPPort: %d", iOPPPort);
-	if(iOPPPort)
-		return ETrue;
-	else
-		return iOPPPort;
-	}
-
-/**
-  * @brief Obtain Bluetooth device class.
-  *
-  * @return Bluetooth device class. Used by CRsBtDiscoverEngine to do the first check
-  * whether the current Bluetooth device is likely to support BPP or OPP.
-  * @sa KBTMinDevClassPrinter
-  */
-TBTDeviceClass CBtDiscover::GetDeviceClass() const
-	{
-	TInquirySockAddr sockAddr = (TInquirySockAddr)iNameEntry().iAddr;
-	TBTDeviceClass devClass(sockAddr.MajorServiceClass(),
-		sockAddr.MajorClassOfDevice(),
-		sockAddr.MinorClassOfDevice());
-
-	return devClass;
-	}
-
-/**
-  * @brief Obtain Bluetooth device name.
-  *
-  * @return Friendly name of current Bluetooth device.
-  */
-const TDesC& CBtDiscover::GetDeviceName() const
-	{
-	return iNameEntry().iName;
-	}
-
-/**
-  * @brief Sets supported content types.
-  *
-  * Called from TBTAttribValVisitor to set the supported content types.
-  * @param aString String of comma separated mime-types.
-  */
-void CBtDiscover::SetContentTypesL(const TPtrC8 &aString)
-	{
-#ifdef _DEBUG
-
-	LOG1("CBtDiscover::SetContentTypesL %d", aString.Length());
-	
-	TInt start = 0;
-	TInt end = aString.Locate(',');
-	TPtrC8 ptr;
-	while(end > 0 && start <= aString.Length())
-	{
-		ptr.Set(aString.Mid(start, end));
-		LOG81("[CBtDiscover::SetContentTypesL]\t ptr: \"%S\"", &ptr);
-		++end;
-		start += end;
-		if(start > aString.Length())
-			break;
-		
-		TPtrC8 left = aString.Mid(start);
-		end = left.Locate(',');
-		if(KErrNotFound == end)
-			end = aString.Length() - start;
-	}
-
-#endif
-	delete iContentTypes;
-	iContentTypes = NULL;
-	iContentTypes = HBufC::NewL(aString.Length());
-	TPtr bufPtr(iContentTypes->Des());
-	bufPtr.Copy(aString);
-	}
-
-/**
-  * @brief Ask if device supports a content type.
-  *
-  * Searches the string of supported content types found in the SDP record of the current Bluetooth device.
-  *
-  * @param aContType Mime-type to search for.
-  *
-  * @return True, if the passed in content type was found, False, if it was not found
-  */
-TBool CBtDiscover::SupportsContentType(const TDesC &aContType) const
-	{
-	LOG1("CBtDiscover::SupportsContentType aContType: %S", &aContType);
-	TPtr bufPtr(iContentTypes->Des());
-
-	if( bufPtr.Length() == 0 )
-		{
-		LOG("CBtDiscover::SupportsContentType length == 0");
-		return EFalse;
-		}
-
-	if( bufPtr.Find(aContType) == KErrNotFound )
-		{
-		LOG("CBtDiscover::SupportsContentType Find == KErrNotFound");
-		return EFalse;
-		}
-	else
-		{
-		LOG("CBtDiscover::SupportsContentType Found");
-		return ETrue;
-		}
-	}
-
-/**
-  * @brief Called from TBTAttribValVisitor to set the printer model.
-  * @param aString String of semi-colon separated printer details.
-  */
-void CBtDiscover::SetPrinterModelL(const TPtrC8 &aString)
-	{
-	LOG81("CBtDiscover::SetPrinterModelL aString: %S", &aString);
-
-	if(iPrinterModel)
-		delete iPrinterModel;
-	iPrinterModel = NULL;
-	
-	_LIT8(KModelString, ";MDL:");
-	TInt pos = aString.Find( KModelString );
-	LOG1("[CBtDiscover::SetPrinterModelL]\t pos: %d", pos);
-	if( pos != KErrNotFound )
-		{
-		TPtrC8 tmpStr = aString.Right(aString.Length() - pos - 5);
-		pos = tmpStr.Locate(';');
-		if( pos != KErrNotFound )
-			{
-			iPrinterModel = HBufC::NewL(pos);
-			iPrinterModel->Des().Copy(tmpStr.Left(pos));
-			}
-		}
-
-	LOG("CBtDiscover::SetPrinterModelL end");
-	}
-
-/**
- * @brief Obtain Printer Model.
- *
- * Gets a TDesC& to the printer model previously set with SetPrinterModelL(),
- * or KNullDesC if no printer model has been set.
- *
- * @return String with the printer model.
- */
-const TDesC& CBtDiscover::GetPrinterModel() const
-	{
-	if (iPrinterModel)
-		return *iPrinterModel;
-	else
-		return KNullDesC;
-	}
-
-void CBtDiscover::SetVendor( TPrinter::TPrinterVendor aVendor )
-	{
-	LOG1("CBtDiscover::SetVendor aVendor: %d", aVendor);
-	iVendor = aVendor;
-	}
-
-TPrinter::TPrinterVendor CBtDiscover::GetVendor() const
-	{
-	LOG1("CBtDiscover::GetVendor return: %d", iVendor);
-	return iVendor;
-	}
-
-void CBtDiscover::GetNextAttributeL(TSdpServRecordHandle aHandle)
-	{
-	LOG1("[CBtDiscover::GetNextAttributeL]\t iCurrentSDPAttrID: 0x%X", iCurrentSDPAttrID);
-
-	TSdpAttributeID nextId;
-
-	switch( iCurrentSDPAttrID )
-	{
-		case KSdpAttrIdServiceClassIDList:
-			nextId = KSdpAttrIdProtocolDescriptorList;
-			break;
-		case KSdpAttrIdProtocolDescriptorList:
-			nextId = KSdpAttrIdAdditionalProtocolDescriptorLists;
-			break;
-		case KSdpAttrIdAdditionalProtocolDescriptorLists:
-			nextId = KSdpAttrIdDocFormatsSupported;
-			break;
-		case KSdpAttrIdDocFormatsSupported:
-			nextId = KSdpAttrIdModelID;
-			break;
-		case KSdpAttrIdModelID:
-			nextId = KSdpAttrIdMaxWidth;
-			break;
-		case KSdpAttrIdMaxWidth:
-			nextId = KSdpAttrIdMaxLen;
-			break;
-		default:
-			// all interested attributes received, at tleast asked
-			//Request 0xFFFFFF to indicate all done
-			nextId = KSdpAttrIdAllDone;
-			break;
-	}
-
-	iAgent->AttributeRequestL( aHandle, nextId );
-
-	LOG1("[CBtDiscover::GetNextAttributeL]\t end. nextId: 0x%X", nextId);
-	}
-
-
-
-/************************************************************************/
-/* visitor */
-/************************************************************************/
-
-CBTAttribValVisitor* CBTAttribValVisitor::NewLC( CBtDiscover& aDiscover )
-	{
-	CBTAttribValVisitor* obj = new (ELeave) CBTAttribValVisitor( aDiscover );
-	CleanupStack::PushL( obj );
-	return obj;
-	}
-
-/**
-  * @param aDiscover Stores a pointer to the CBtDiscover object, in order to call
-  * CBtDiscover::SetPort and CBtDiscover::SetContentTypes once those attributes have been
-  * found.
-  */
-CBTAttribValVisitor::CBTAttribValVisitor(CBtDiscover& aDiscover) : iDiscover(aDiscover)
-	{
-	}
-
-/**
-  * @brief Called for each of the individual attributes in the SDP record being parsed.
-  * @param aValue Value of the attribute.
-  * @param aType Type of the attribute.
-  */
-void CBTAttribValVisitor::VisitAttributeValueL(CSdpAttrValue& aValue, TSdpElementType aType)
-	{
-	LOG1("[CBTAttribValVisitor::VisitAttributeValueL]\t Begin. aType: %d", aType);
-
-	switch ( aType )
-		{
-		case ETypeUUID:
-			CheckUuid(aValue.UUID());
-			break;
-		case ETypeUint:
-			CheckUint(aValue.Uint());
-			break;
-		case ETypeString:
-			switch (iDiscover.iCurrentSDPAttrID)
-				{
-				case KSdpAttrIdDocFormatsSupported:
-					iDiscover.SetContentTypesL(aValue.Des());
-					break;
-				case KSdpAttrIdModelID:
-					CheckVendor( aValue.Des() );
-					iDiscover.SetPrinterModelL(aValue.Des());
-					break;
-				default:
-					break;
-				}
-			break;
-		default:
-			break;
-		}
-	}
-
-/**
-  * @brief Indicates the beginning of an attribute list in the SDP record.
-  */
-void CBTAttribValVisitor::StartListL(CSdpAttrValueList& /*aList*/)
-	{
-	LOG("CBTAttribValVisitor::StartListL");
-	}
-
-/**
-  * @brief Indicates the end of an attribute list in the SDP record.
-  */
-void CBTAttribValVisitor::EndListL()
-	{
-	LOG("CBTAttribValVisitor::EndListL");
-	}
-
-CBTAttribValVisitor::~CBTAttribValVisitor()
-	{
-	}
-
-//--------------------------------------------------------------------------------------------
-//
-// CBtPrinterController::CheckUuid
-//
-//--------------------------------------------------------------------------------------------
-void CBTAttribValVisitor::CheckUuid( const TUUID& aUuid )
-{
-	LOG("[CBTAttribValVisitor::CheckUuid]\t begin");
-
-	// We're interested only about UUIDs received at KSdpAttrIdServiceClassIDList
-	if (KSdpAttrIdServiceClassIDList != iDiscover.iCurrentSDPAttrID)
-	{
-		LOG1("[CBTAttribValVisitor::CheckUuid]\t Wrong attribute ID: 0x%X",iDiscover.iCurrentSDPAttrID);
-		return;
-	}
-
-#ifdef _DEBUG
-	TBuf<20> uidstr;
-	_LIT(KUidForm, "0x%02X%02X%02X%02X");
-	uidstr.Format(KUidForm, aUuid[0], aUuid[1], aUuid[2], aUuid[3]);
-	LOG1("[CBTAttribValVisitor::CheckUuid]\t ETypeUUID: %S", &uidstr);
-#endif
-
-	TUUID uidOpp(KBTSDPOBEXObjectPush);
-	TUUID uidBpp(KBTSDPDirectPrinting);
-	TUUID uidSts(KBTSDPPrintingStatus);
-	
-	if(aUuid == uidOpp)
-		iDiscover.iCurrentServiceUUID = KBTSDPOBEXObjectPush;
-	if(aUuid == uidBpp)
-		iDiscover.iCurrentServiceUUID = KBTSDPDirectPrinting;
-	if(aUuid == uidSts)
-		iDiscover.iFoundSTS = ETrue;
-
-	LOG("[CBTAttribValVisitor::CheckUuid]\t end");
-}
-
-//--------------------------------------------------------------------------------------------
-//
-// CBtPrinterController::CheckUint
-//
-//--------------------------------------------------------------------------------------------
-void CBTAttribValVisitor::CheckUint( const TUint& aValue )
-{
-	LOG("[CBTAttribValVisitor::CheckUint]\t begin");
-	
-	switch(iDiscover.iCurrentSDPAttrID)
-	{
-		case KSdpAttrIdProtocolDescriptorList:
-			if (KBTSDPDirectPrinting == iDiscover.iCurrentServiceUUID)
-			{
-				LOG1("[CBTAttribValVisitor::CheckUint]\t  iDiscover->SetBPPPort(%d)", aValue);
-				iDiscover.SetBPPPort(aValue);
-			}
-			if (KBTSDPOBEXObjectPush == iDiscover.iCurrentServiceUUID)
-			{
-				LOG1("[CBTAttribValVisitor::CheckUint]\t  iDiscover->SetOPPPort(%d)", aValue);
-				iDiscover.SetOPPPort(aValue);
-			}
-			break;
-		case KSdpAttrIdAdditionalProtocolDescriptorLists:
-			if(iDiscover.iFoundSTS )
-			{
-				LOG1("[CBTAttribValVisitor::CheckUint]\t iDiscover->SetSTSPort(%d)", aValue);
-				iDiscover.SetSTSPort(aValue);
-				iDiscover.iFoundSTS = EFalse;
-			}
-			break;
-		case KSdpAttrIdMaxWidth:
-			LOG1("[CBTAttribValVisitor::CheckUint]\t KSdpAttrIdMaxWidth: %d", aValue);
-			break;
-		case KSdpAttrIdMaxLen:
-			LOG1("[CBTAttribValVisitor::CheckUint]\t KSdpAttrIdMaxLen: %d", aValue);
-			break;
-		default:
-			break;
-	}
-
-	LOG("[CBTAttribValVisitor::CheckUint]\t end");
-}
-
-//--------------------------------------------------------------------------------------------
-//
-// CBtPrinterController::CheckVendor
-//
-//--------------------------------------------------------------------------------------------
-void CBTAttribValVisitor::CheckVendor( const TDesC8&  aVendor  )
-	{
-	LOG("[CBTAttribValVisitor::CheckVendor]\t Begin");
-	iDiscover.SetVendor( TPrinter::EVendorNone );
-	// At the moment this functionality is not used, but no Vendor is set.
-	HBufC8* vendorName = aVendor.Alloc();
-	if( vendorName )
-	{
-		LOG81("[CBTAttribValVisitor::CheckVendor]\t vendorName: %S", vendorName);
-		TPtr8 ptr = vendorName->Des();
-		ptr.LowerCase();
-		_LIT8( KHp, "mfg:hp;" );
-
-		TInt res = vendorName->Find( KHp );
-		LOG1("[CBTAttribValVisitor::CheckVendor]\t res: %d", res);
-		
-		if( res != KErrNotFound ) 
-			iDiscover.SetVendor( TPrinter::EVendorHp );
-	}
-	delete vendorName;
-	LOG("[CBTAttribValVisitor::CheckVendor]\t End");
-	}
-
-//  End of File