diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-06-15 21:25:30 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-06-15 21:25:30 +0000 |
commit | 0e4098b0204d3611ff09b3101c9bd134c8716dcf (patch) | |
tree | 99eb0621d65d5c5594d277072f7e8efa7fa96369 /hcid/dbus-sdp.c | |
parent | f40b3df073bebd2dcfc7d0087be5f7da8eae6a05 (diff) |
GetRemoteServiceIdentifiers: Ignore repeated service identifiers
Diffstat (limited to 'hcid/dbus-sdp.c')
-rw-r--r-- | hcid/dbus-sdp.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index 1fe7b0fd..f812dd9c 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -743,8 +743,9 @@ static void remote_svc_identifiers_completed_cb(uint8_t type, uint16_t err, struct transaction_context *ctxt = udata; const char *src, *dst; DBusMessage *reply; + GSList *l = NULL; DBusMessageIter iter, array_iter; - int scanned, extracted = 0, len = 0; + int scanned, extracted = 0, len = 0, recsize = 0; uint8_t dtd = 0; if (!ctxt) @@ -823,35 +824,45 @@ done: DBUS_TYPE_STRING_AS_STRING, &array_iter); rsp += scanned; - while (extracted < len) { + for (; extracted < len; rsp += recsize, extracted += recsize) { sdp_record_t *rec; + const char *puuid; sdp_data_t *d; - int recsize; recsize = 0; rec = sdp_extract_pdu(rsp, &recsize); if (!rec) break; + sdp_store_record(src, dst, rec->handle, rsp, recsize); + d = sdp_data_get(rec, SDP_ATTR_SVCLASS_ID_LIST); - if (d) { - const char *puuid; - puuid = extract_service_class(d); - if (puuid) - dbus_message_iter_append_basic(&array_iter, - DBUS_TYPE_STRING, &puuid); + if (!d) { + sdp_record_free(rec); + continue; } - sdp_store_record(src, dst, rec->handle, rsp, recsize); + puuid = extract_service_class(d); sdp_record_free(rec); + if (!puuid) + continue; - rsp += recsize; - extracted += recsize; + l = g_slist_find_custom(l, puuid, (GCompareFunc) strcmp); + if (l) + continue; + + dbus_message_iter_append_basic(&array_iter, + DBUS_TYPE_STRING, &puuid); + l = g_slist_append(l, g_strdup(puuid)); } dbus_message_iter_close_container(&iter, &array_iter); send_message_and_unref(ctxt->conn, reply); + if (l) { + g_slist_foreach(l, (GFunc) g_free, NULL); + g_slist_free(l); + } failed: transaction_context_free(ctxt, TRUE); } |