[gssdp] Ignore announcements from services with a lower version
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gssdp] Ignore announcements from services with a lower version
- Date: Thu, 3 May 2012 08:42:59 +0000 (UTC)
commit 612a8d91581aa78b9a5422b5d6d2185912ccb071
Author: Jens Georg <mail jensge org>
Date: Mon Apr 2 12:09:48 2012 +0200
Ignore announcements from services with a lower version
https://bugzilla.gnome.org/show_bug.cgi?id=673150
libgssdp/gssdp-resource-browser.c | 40 ++++++++++++++++++++++++++++++------
1 files changed, 33 insertions(+), 7 deletions(-)
---
diff --git a/libgssdp/gssdp-resource-browser.c b/libgssdp/gssdp-resource-browser.c
index 2a7f703..b0c5d20 100644
--- a/libgssdp/gssdp-resource-browser.c
+++ b/libgssdp/gssdp-resource-browser.c
@@ -34,6 +34,7 @@
#include <libsoup/soup.h>
#include <string.h>
#include <stdio.h>
+#include <stdlib.h>
#include "gssdp-resource-browser.h"
#include "gssdp-client-private.h"
@@ -63,6 +64,7 @@ struct _GSSDPResourceBrowserPrivate {
GSource *timeout_src;
guint num_discovery;
+ guint version;
};
enum {
@@ -453,7 +455,7 @@ gssdp_resource_browser_set_target (GSSDPResourceBrowser *resource_browser,
if (resource_browser->priv->target_regex)
g_regex_unref (resource_browser->priv->target_regex);
- version_pattern = "[0-9]+";
+ version_pattern = "([0-9]+)";
/* Make sure we have enough room for version pattern */
pattern = g_strndup (target,
strlen (target) + strlen (version_pattern));
@@ -466,6 +468,7 @@ gssdp_resource_browser_set_target (GSSDPResourceBrowser *resource_browser,
version + 1,
G_REGEX_MATCH_ANCHORED,
0)) {
+ resource_browser->priv->version = atoi (version + 1);
strcpy (version + 1, version_pattern);
}
@@ -795,12 +798,35 @@ static gboolean
check_target_compat (GSSDPResourceBrowser *resource_browser,
const char *st)
{
- return strcmp (resource_browser->priv->target,
- GSSDP_ALL_RESOURCES) == 0 ||
- g_regex_match (resource_browser->priv->target_regex,
- st,
- 0,
- NULL);
+ GMatchInfo *info;
+ int version;
+ char *tmp;
+
+ if (strcmp (resource_browser->priv->target,
+ GSSDP_ALL_RESOURCES) == 0)
+ return TRUE;
+
+ if (!g_regex_match (resource_browser->priv->target_regex,
+ st,
+ 0,
+ &info)) {
+ g_match_info_free (info);
+
+ return FALSE;
+ }
+
+ /* If there was no version to match, we're done */
+ if (resource_browser->priv->version == 0)
+ return TRUE;
+
+ if (g_match_info_get_match_count (info) != 2)
+ return FALSE;
+
+ version = atoi ((tmp = g_match_info_fetch (info, 1)));
+ g_free (tmp);
+ g_match_info_free (info);
+
+ return version >= resource_browser->priv->version;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]