diff -r 000000000000 -r 29b1cd4cb562 bluetoothcommsprofiles/btpan/panhelpersvr/panhelperdevicediscoverer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothcommsprofiles/btpan/panhelpersvr/panhelperdevicediscoverer.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,141 @@ +// Copyright (c) 2004-2009 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: +// + +#include "panhelperdevicediscoverer.h" +using namespace PanHelper; + +CPanHelperDeviceDiscoverer* CPanHelperDeviceDiscoverer::NewL() +/** +Return a newly constructed device discoverer +*/ + { + CPanHelperDeviceDiscoverer* self = new (ELeave) CPanHelperDeviceDiscoverer; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CPanHelperDeviceDiscoverer::~CPanHelperDeviceDiscoverer() +/** +Clean up +*/ + { + iDeviceAddresses.Close(); + iHostResolver.Close(); + iSockServ.Close(); + } + +void CPanHelperDeviceDiscoverer::RunL() +/** +Found a new device +*/ + { + if(iStatus==KErrNone) + { + TBTDevAddr newDevAddr(static_cast(iNameEntry().iAddr).BTAddr()); + TInt index = iDeviceAddresses.Find(newDevAddr); + if(index != KErrNotFound) + { + TPckg devAddrBuf(iDeviceAddresses[index]); + iRemDevAddrBuf->Copy(devAddrBuf); + User::RequestComplete(iClientStatus, KErrNone); + Cancel(); + } + else + { + iHostResolver.Next(iNameEntry, iStatus); + SetActive(); + } + } + else + { + User::RequestComplete(iClientStatus, iStatus.Int()); + Cancel(); + } + } + +void CPanHelperDeviceDiscoverer::DoCancel() +/** +Cancel HostResolver +*/ + { + iHostResolver.Cancel(); + } + +void CPanHelperDeviceDiscoverer::FindDevice(TDesC& aDeviceAddrList, TDes8& aDeviceAddr, TRequestStatus& aStatus) +/** +Start a generic inquiry +*/ + { + iRemDevAddrBuf = (TPckgBuf*) &aDeviceAddr; + iClientStatus = &aStatus; + ConvertListToArray(aDeviceAddrList); + iHostResolver.GetByAddress(iInquiryAddr, iNameEntry, iStatus); + SetActive(); + } + +void CPanHelperDeviceDiscoverer::CancelFindDevice() +/** +Cancel +*/ + { + Cancel(); + User::RequestComplete(iClientStatus, KErrCancel); + } + +CPanHelperDeviceDiscoverer::CPanHelperDeviceDiscoverer() : + CActive(EPriorityStandard) +/** +Constructor +*/ + { + CActiveScheduler::Add(this); + iInquiryAddr.SetIAC(KGIAC); + iInquiryAddr.SetAction(KHostResInquiry); // don't need device names here + } + +void CPanHelperDeviceDiscoverer::ConstructL() +/** +Initialise +*/ + { + User::LeaveIfError(iSockServ.Connect()); + User::LeaveIfError(iHostResolver.Open(iSockServ, KBTAddrFamily, KBTLinkManager)); + } + +void CPanHelperDeviceDiscoverer::ConvertListToArray(TDesC& aDeviceAddrList) +/** +Put the comma-separated list of readable BT device addresses into an array +*/ + { + TBTDevAddr devAddr; + TLex lex(aDeviceAddrList); + + TChar charComma(KCharComma); // this weird construct is needed to prevent us needing static data + while(lex.Peek()!=charComma && !lex.Eos()) + { + lex.Mark(); + while((lex.Get()!=charComma) && !lex.Eos()) + { + + } + devAddr.SetReadable(lex.MarkedToken()); + + // This is a best efforst service. If we can't add the address + // to our search list we'll just continue with the ones we could. + (void)iDeviceAddresses.Append(devAddr); + } + }