examples/ForumNokia/BluetoothPMPExample/src/DeviceDiscoverer.cpp

00001 /*
00002  * Copyright © 2009 Nokia Corporation.
00003  */
00004 
00005 // INCLUDE FILES
00006 #include "DeviceDiscoverer.h"
00007 
00008 _LIT(KBTLinkManagerTxt,"BTLinkManager");
00009 
00010 CDeviceDiscoverer* CDeviceDiscoverer::NewL(RSocketServ& aSocketServ,
00011                                            MDeviceDiscoObserver& aObserver)
00012     {
00013     CDeviceDiscoverer* self = CDeviceDiscoverer::NewLC(aSocketServ, aObserver);
00014     CleanupStack::Pop(self);
00015     return self;
00016     }
00017 
00018 
00019 CDeviceDiscoverer* CDeviceDiscoverer::NewLC(RSocketServ& aSocketServ,
00020                                             MDeviceDiscoObserver& aObserver)
00021     {
00022     CDeviceDiscoverer* self = new (ELeave) CDeviceDiscoverer(aSocketServ,
00023         aObserver);
00024     CleanupStack::PushL(self);
00025     self->ConstructL();
00026     return self;
00027     }
00028 
00029 
00030 void CDeviceDiscoverer::ConstructL()
00031     {
00032     }
00033 
00034 
00035 // ----------------------------------------------------------------------------
00036 // CDeviceDiscoverer::CDeviceDiscoverer(RSocketServ *aSocketServ,
00037 //                                      MDeviceDiscoObserver *aObserver)
00038 //
00039 // constructor
00040 // ----------------------------------------------------------------------------
00041 CDeviceDiscoverer::CDeviceDiscoverer(RSocketServ& aSocketServ,
00042                                      MDeviceDiscoObserver& aObserver):
00043     CActive(CActive::EPriorityStandard),
00044     iSocketServ(aSocketServ),
00045     iObserver(aObserver)
00046     {
00047     CActiveScheduler::Add(this);
00048     }
00049 
00050 
00051 // ----------------------------------------------------------------------------
00052 // CDeviceDiscoverer::~CDeviceDiscoverer()
00053 //
00054 // destructor
00055 // ----------------------------------------------------------------------------
00056 CDeviceDiscoverer::~CDeviceDiscoverer()
00057     { 
00058     // cancel active object
00059     Cancel();
00060     iResolver.Close();
00061     }
00062 
00063 
00064 // ----------------------------------------------------------------------------
00065 // CDeviceDiscoverer::DiscoverDevicesL(TDeviceDataList *aDevDataList)
00066 //
00067 // discover remote devices.  RHostResolver will be used to do the discovery.
00068 // any found devices will be placed in aDevDataList.
00069 // ----------------------------------------------------------------------------
00070 void CDeviceDiscoverer::DiscoverDevicesL(TDeviceDataList* aDevDataList)
00071     {
00072     if (!IsActive())
00073         {
00074         // initialize host resolver
00075         // load protocol for discovery
00076         TProtocolDesc pdesc;
00077         User::LeaveIfError(iSocketServ.FindProtocol(KBTLinkManagerTxt(), pdesc));
00078 
00079         iResolver.Close();
00080         User::LeaveIfError(iResolver.Open(iSocketServ, pdesc.iAddrFamily, pdesc.iProtocol));
00081         
00082         // wipe existing device data list, start fresh
00083         iDevDataList=aDevDataList;
00084         iDevDataList->Reset();
00085 
00086         // start device discovery by invoking remote address lookup
00087     #ifdef ENABLE_LIAC
00088         TUint myIAC( iLIAC?KLIAC:KGIAC );
00089 
00090         iAddr.SetIAC( myIAC );
00091     #else
00092         iAddr.SetIAC( KGIAC );
00093     #endif
00094 
00095         iAddr.SetAction(KHostResInquiry|KHostResName|KHostResIgnoreCache);
00096         iResolver.GetByAddress(iAddr, iEntry, iStatus);
00097         SetActive();
00098         }
00099     else
00100         {
00101         User::Leave(KErrNotReady);
00102         }
00103     }
00104 
00105 
00106 void CDeviceDiscoverer::RunL()
00107     {
00108     // RHostResolver.GetByAddress(..) has completed, process results
00109     if ( iStatus!=KErrNone )
00110         {
00111         // all devices (if any) done, notify 
00112         if (iDevDataList->Count()>0)
00113             {
00114             iObserver.HandleDeviceDiscoveryComplete(KErrNone);
00115             }
00116         else
00117             {
00118             iObserver.HandleDeviceDiscoveryComplete(KErrNotFound);
00119             }
00120         }
00121     else 
00122         {
00123         // new device data entry
00124         TDeviceData *devData = new (ELeave) TDeviceData();
00125         devData->iDeviceName = iEntry().iName;
00126         devData->iDeviceAddr = 
00127             static_cast<TBTSockAddr>(iEntry().iAddr).BTAddr();
00128         devData->iDeviceServicePort = 0;
00129         // add device data entry
00130         iDevDataList->Append(devData);
00131         
00132         iObserver.DeviceDiscovered(*devData);
00133 
00134         // get next discovered device
00135         iResolver.Next(iEntry, iStatus);
00136         // wait for resolver to complete
00137         SetActive();
00138         }
00139     }
00140 
00141 void CDeviceDiscoverer::DoCancel()
00142     {
00143     iResolver.Cancel();
00144     }
00145 
00146 // ----------------------------------------------------------------------------
00147 // CDeviceDiscoverer::HasDevices()
00148 //
00149 // returns true if any devices were discovered
00150 // ----------------------------------------------------------------------------
00151 TBool CDeviceDiscoverer::HasDevices()
00152     {
00153     TBool exists = EFalse;
00154     
00155     if (iDevDataList)
00156         {
00157         if (iDevDataList->Count() > 0)
00158             {
00159             exists = ETrue;
00160             }
00161         }
00162     return exists;
00163     }
00164 
00165 // ----------------------------------------------------------------------------
00166 // CBluetoothPMPExampleEngine::SetLIAC
00167 // ----------------------------------------------------------------------------
00168 #ifdef ENABLE_LIAC
00169 void CDeviceDiscoverer::SetLIAC( TBool aState )
00170     {
00171     iLIAC = aState;
00172     }
00173 #endif
00174 
00175 // ----------------------------------------------------------------------------
00176 // CBluetoothPMPExampleEngine::StopDiscovery
00177 // ----------------------------------------------------------------------------
00178 void CDeviceDiscoverer::StopDiscovery()
00179     {
00180     Cancel();
00181 
00182     if (HasDevices())
00183         {
00184         iObserver.HandleDeviceDiscoveryComplete(KErrNone);
00185         }
00186     else
00187         {
00188         iObserver.HandleDeviceDiscoveryComplete(KErrNotFound);
00189         }
00190     }

Generated by  doxygen 1.6.2