diff options
author | Irfan Sheriff <isheriff@google.com> | 2012-04-18 15:46:00 -0700 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2012-04-18 17:40:49 -0700 |
commit | 3b8be87f89e2f98345980954994bdde82b7ee9ad (patch) | |
tree | e79e2180829bad170454b53dfff30552f4440e52 /wifi/java/android/net/wifi/p2p | |
parent | c5cbcb51baaf2e9e61f3bdbd5ef97a05aac25010 (diff) | |
download | frameworks_base-3b8be87f89e2f98345980954994bdde82b7ee9ad.zip frameworks_base-3b8be87f89e2f98345980954994bdde82b7ee9ad.tar.gz frameworks_base-3b8be87f89e2f98345980954994bdde82b7ee9ad.tar.bz2 |
Fix service discovery bugs
- Application does not have transaction id information. go through
list and remove
- Avoid removing client info while enumerating it
Change-Id: Ie293876756418ed4cd6dc3a903689ee7003bd12d
Signed-off-by: yoshihiko.ikenaga@jp.sony.com
Diffstat (limited to 'wifi/java/android/net/wifi/p2p')
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pService.java | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 314e33e..6168f0e 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -1500,8 +1500,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { int key; WifiP2pServiceRequest req; for (int i=0; i < c.mReqList.size(); i++) { - key = c.mReqList.keyAt(i); - req = c.mReqList.get(key); + req = c.mReqList.valueAt(i); if (req != null) { sb.append(req.getSupplicantQuery()); } @@ -1539,7 +1538,10 @@ public class WifiP2pService extends IWifiP2pManager.Stub { return false; } - req.setTransactionId(++mServiceTransactionId); + ++mServiceTransactionId; + //The Wi-Fi p2p spec says transaction id should be non-zero + if (mServiceTransactionId == 0) ++mServiceTransactionId; + req.setTransactionId(mServiceTransactionId); clientInfo.mReqList.put(mServiceTransactionId, req); if (mServiceDiscReqId == null) { @@ -1550,13 +1552,23 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } private void removeServiceRequest(Messenger m, WifiP2pServiceRequest req) { - ClientInfo clientInfo = getClientInfo(m, false); if (clientInfo == null) { return; } - clientInfo.mReqList.remove(req.getTransactionId()); + //Application does not have transaction id information + //go through stored requests to remove + boolean removed = false; + for (int i=0; i < clientInfo.mReqList.size(); i++) { + if (req.equals(clientInfo.mReqList.valueAt(i))) { + removed = true; + clientInfo.mReqList.removeAt(i); + break; + } + } + + if (!removed) return; if (clientInfo.mReqList.size() == 0 && clientInfo.mServList.size() == 0) { if (DBG) logd("remove client information from framework"); @@ -1670,6 +1682,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } catch (RemoteException e) { if (DBG) logd("detect dead channel"); clearClientInfo(c.mMessenger); + return; } } } @@ -1683,6 +1696,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { * TODO: This can be done better with full async channels. */ private void clearClientDeadChannels() { + ArrayList<Messenger> deadClients = new ArrayList<Messenger>(); + for (ClientInfo c : mClientInfoList.values()) { Message msg = Message.obtain(); msg.what = WifiP2pManager.PING; @@ -1693,9 +1708,13 @@ public class WifiP2pService extends IWifiP2pManager.Stub { c.mMessenger.send(msg); } catch (RemoteException e) { if (DBG) logd("detect dead channel"); - clearClientInfo(c.mMessenger); + deadClients.add(c.mMessenger); } } + + for (Messenger m : deadClients) { + clearClientInfo(m); + } } /** |