summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net/wifi/p2p
diff options
context:
space:
mode:
authorIrfan Sheriff <isheriff@google.com>2012-04-18 15:46:00 -0700
committerIrfan Sheriff <isheriff@google.com>2012-04-18 17:40:49 -0700
commit3b8be87f89e2f98345980954994bdde82b7ee9ad (patch)
treee79e2180829bad170454b53dfff30552f4440e52 /wifi/java/android/net/wifi/p2p
parentc5cbcb51baaf2e9e61f3bdbd5ef97a05aac25010 (diff)
downloadframeworks_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.java31
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);
+ }
}
/**