00001
00002
00003
00004
00005
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
00037
00038
00039
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
00053
00054
00055
00056 CDeviceDiscoverer::~CDeviceDiscoverer()
00057 {
00058
00059 Cancel();
00060 iResolver.Close();
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070 void CDeviceDiscoverer::DiscoverDevicesL(TDeviceDataList* aDevDataList)
00071 {
00072 if (!IsActive())
00073 {
00074
00075
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
00083 iDevDataList=aDevDataList;
00084 iDevDataList->Reset();
00085
00086
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
00109 if ( iStatus!=KErrNone )
00110 {
00111
00112 if (iDevDataList->Count()>0)
00113 {
00114 iObserver.HandleDeviceDiscoveryComplete(KErrNone);
00115 }
00116 else
00117 {
00118 iObserver.HandleDeviceDiscoveryComplete(KErrNotFound);
00119 }
00120 }
00121 else
00122 {
00123
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
00130 iDevDataList->Append(devData);
00131
00132 iObserver.DeviceDiscovered(*devData);
00133
00134
00135 iResolver.Next(iEntry, iStatus);
00136
00137 SetActive();
00138 }
00139 }
00140
00141 void CDeviceDiscoverer::DoCancel()
00142 {
00143 iResolver.Cancel();
00144 }
00145
00146
00147
00148
00149
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
00167
00168 #ifdef ENABLE_LIAC
00169 void CDeviceDiscoverer::SetLIAC( TBool aState )
00170 {
00171 iLIAC = aState;
00172 }
00173 #endif
00174
00175
00176
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 }