コード例 #1
0
gboolean
set_fingerprint_label (GtkWidget *label1,
                       GtkWidget *label2)
{
        GDBusProxy *device;
        GVariant *result;
        GVariantIter *fingers;
        GError *error = NULL;

        if (manager == NULL) {
                create_manager ();
                if (manager == NULL) {
                        return FALSE;
                }
        }

        device = get_first_device ();
        if (device == NULL)
                return FALSE;

        result = g_dbus_proxy_call_sync (device, "ListEnrolledFingers", g_variant_new ("(s)", ""), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
        if (!result) {
                if (!g_dbus_error_is_remote_error (error) ||
                    strcmp (g_dbus_error_get_remote_error(error), "net.reactivated.Fprint.Error.NoEnrolledPrints") != 0) {
                        g_object_unref (device);
                        return FALSE;
                }
        }

        if (result && g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)")))
                g_variant_get (result, "(as)", &fingers);
        else
                fingers = NULL;

        if (fingers == NULL || g_variant_iter_n_children (fingers) == 0) {
                is_disable = FALSE;
                gtk_label_set_text (GTK_LABEL (label1), _("Disabled"));
                gtk_label_set_text (GTK_LABEL (label2), _("Disabled"));
        } else {
                is_disable = TRUE;
                gtk_label_set_text (GTK_LABEL (label1), _("Enabled"));
                gtk_label_set_text (GTK_LABEL (label2), _("Enabled"));
        }

        if (result != NULL)
                g_variant_unref (result);
        if (fingers != NULL)
                g_variant_iter_free (fingers);
        g_object_unref (device);

        return TRUE;
}
コード例 #2
0
static void
dispatcher_results_process (guint request_id, DispatcherAction action, GVariantIter *results)
{
	const char *script, *err;
	guint32 result;
	const Monitor *monitor = _get_monitor_by_action (action);

	g_return_if_fail (results != NULL);

	if (g_variant_iter_n_children (results) == 0) {
		_LOGD ("(%u) succeeded but no scripts invoked", request_id);
		return;
	}

	while (g_variant_iter_next (results, "(&su&s)", &script, &result, &err)) {
		const char *script_validation_msg = "";

		if (!*script) {
			script_validation_msg = " (path is NULL)";
			script = "(unknown)";
		} else if (!strncmp (script, monitor->dir, monitor->dir_len)            /* check: prefixed by script directory */
		    && script[monitor->dir_len] == '/' && script[monitor->dir_len+1]    /* check: with additional "/?" */
		    && !strchr (&script[monitor->dir_len+1], '/')) {                    /* check: and no further '/' */
			/* we expect the script to lie inside monitor->dir. If it does,
			 * strip the directory name. Otherwise show the full path and a warning. */
			script += monitor->dir_len + 1;
		} else
			script_validation_msg = " (unexpected path)";

		if (result == DISPATCH_RESULT_SUCCESS) {
			_LOGD ("(%u) %s succeeded%s",
			       request_id,
			       script, script_validation_msg);
		} else {
			_LOGW ("(%u) %s failed (%s): %s%s",
			       request_id,
			       script,
			       dispatch_result_to_string (result),
			       err,
			       script_validation_msg);
		}
	}
}
コード例 #3
0
CCSSettingValueList
readListValue (GVariant *gsettingsValue, CCSSetting *setting, CCSObjectAllocationInterface *ai)
{
    CCSSettingType      listType = ccsSettingGetInfo (setting)->forList.listType;
    gboolean		hasVariantType;
    unsigned int        nItems;
    CCSSettingValueList list = NULL;
    GVariantIter	iter;

    hasVariantType = compizconfigTypeHasVariantType (listType);

    if (!hasVariantType)
	return NULL;

    g_variant_iter_init (&iter, gsettingsValue);
    nItems = g_variant_iter_n_children (&iter);

    switch (listType)
    {
    case TypeBool:
	list = readBoolListValue (&iter, nItems, setting, ai);
	break;
    case TypeInt:
	list = readIntListValue (&iter, nItems, setting, ai);
	break;
    case TypeFloat:
	list = readFloatListValue (&iter, nItems, setting, ai);
	break;
    case TypeString:
    case TypeMatch:
	list = readStringListValue (&iter, nItems, setting, ai);
	break;
    case TypeColor:
	list = readColorListValue (&iter, nItems, setting, ai);
	break;
    default:
	break;
    }

    return list;
}
コード例 #4
0
ファイル: ol_lyric_source.c プロジェクト: PedroHLC/osdlyrics
static void
ol_lyric_source_download_complete_cb (OlLyricSource *source,
                                      GVariant *parameters)
{
  OlLyricSourceTask *task;
  int taskid;
  int status;
  GVariantIter *iter;
  gchar *content = NULL;
  gsize len = 0;
  g_variant_get (parameters, "(iiay)", &taskid, &status, &iter);
  task = ol_lyric_source_get_download_task (source, taskid);
  if (task == NULL)
  {
    ol_errorf ("Download task %d not exist\n", taskid);
  }
  else if (status < 0 || status > OL_LYRIC_SOURCE_STATUS_FALIURE)
  {
    ol_errorf ("Invalid download status %d\n", status);
  }
  else
  {
    len = g_variant_iter_n_children (iter);
    content = g_new (gchar, len + 1);
    gsize i = 0;
    while (g_variant_iter_loop (iter, "y", &content[i]))
      i++;
    content[len] = '\0';
    g_signal_emit (G_OBJECT (task),
                   _download_signals[DOWNLOAD_SIGNAL_COMPLETE],
                   0,
                   status,
                   content,
                   (guint) len);
    g_free (content);
  }
  g_variant_iter_free (iter);
  ol_lyric_source_remove_download_task (source, taskid);
}
コード例 #5
0
Bool
appendToPluginsWithSetKeysList (const gchar *plugin,
				GVariant    *writtenPlugins,
				char	       ***newWrittenPlugins,
				gsize	       *newWrittenPluginsSize)
{
    gsize writtenPluginsLen = 0;
    Bool            found = FALSE;
    char	    *plug;
    GVariantIter    iter;

    g_variant_iter_init (&iter, writtenPlugins);
    *newWrittenPluginsSize = g_variant_iter_n_children (&iter);

    while (g_variant_iter_loop (&iter, "s", &plug))
    {
	if (!found)
	    found = (g_strcmp0 (plug, plugin) == 0);
    }

    if (!found)
	++(*newWrittenPluginsSize);

    *newWrittenPlugins = g_variant_dup_strv (writtenPlugins, &writtenPluginsLen);

    if (*newWrittenPluginsSize > writtenPluginsLen)
    {
	*newWrittenPlugins = g_realloc (*newWrittenPlugins, (*newWrittenPluginsSize + 1) * sizeof (gchar *));

	/* Next item becomes plugin */
	(*newWrittenPlugins)[writtenPluginsLen]  = g_strdup (plugin);

	/* Last item becomes NULL */
	(*newWrittenPlugins)[*newWrittenPluginsSize] = NULL;
    }

    return !found;
}
コード例 #6
0
ファイル: yelp-document.c プロジェクト: fatman2021/gnome-apps
static const gchar *
document_read_contents (YelpDocument *document,
                        const gchar  *page_id)
{
    gchar *real, *str, **colors;

    g_mutex_lock (&document->priv->mutex);

    if (page_id != NULL && g_str_has_prefix (page_id, "search=")) {
        gchar *tmp, *tmp2, *txt;
        GVariant *value;
        GVariantIter *iter;
        gchar *url, *title, *desc, *icon; /* do not free */
        gchar *index_title;
        GString *ret = g_string_new ("<html><head><style type='text/css'>");

        colors = yelp_settings_get_colors (yelp_settings_get_default ());
        g_string_append_printf (ret,
                                "html { height: 100%%; } "
                                "body { margin: 0; padding: 0;"
                                " background-color: %s; color: %s;"
                                " direction: %s; } "
                                "div.header { margin-bottom: 1em; } "
                                "div.trails { "
                                " margin: 0; padding: 0.2em 12px 0 12px;"
                                " background-color: %s;"
                                " border-bottom: solid 1px %s; } "
                                "div.trail { text-indent: -1em;"
                                " margin: 0 1em 0.2em 1em; padding: 0; color: %s; } "
                                "div.body { margin: 0 12px 0 12px; padding: 0 0 12px 0; max-width: 60em; } "
                                "div, p { margin: 1em 0 0 0; padding: 0; } "
                                "div:first-child, p:first-child { margin-top: 0; } "
                                "h1 { margin: 0; padding: 0; color: %s; font-size: 1.44em; } "
                                "a { color: %s; text-decoration: none; } "
                                "a.linkdiv { display: block; } "
                                "div.linkdiv { margin: 0; padding: 0.5em; }"
                                "a:hover div.linkdiv {"
                                " outline: solid 1px %s;"
                                " background: -webkit-gradient(linear, left top, left 80, from(%s), to(%s)); } "
                                "div.title { margin-bottom: 0.2em; font-weight: bold; } "
                                "div.desc { margin: 0; color: %s; } "
                                "</style></head><body><div class='header'>",
                                colors[YELP_SETTINGS_COLOR_BASE],
                                colors[YELP_SETTINGS_COLOR_TEXT],
                                (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL ? "rtl" : "ltr"),
                                colors[YELP_SETTINGS_COLOR_GRAY_BASE],
                                colors[YELP_SETTINGS_COLOR_GRAY_BORDER],
                                colors[YELP_SETTINGS_COLOR_TEXT_LIGHT],
                                colors[YELP_SETTINGS_COLOR_TEXT_LIGHT],
                                colors[YELP_SETTINGS_COLOR_LINK],
                                colors[YELP_SETTINGS_COLOR_BLUE_BASE],
                                colors[YELP_SETTINGS_COLOR_BLUE_BASE],
                                colors[YELP_SETTINGS_COLOR_BASE],
                                colors[YELP_SETTINGS_COLOR_TEXT_LIGHT]
                               );

        index_title = yelp_storage_get_root_title (yelp_storage_get_default (),
                      document->priv->doc_uri);
        if (index_title != NULL) {
            tmp = g_markup_printf_escaped ("<div class='trails'><div class='trail'>"
                                           "<a href='xref:'>%s</a>&#x00A0;%s "
                                           "</div></div>",
                                           index_title,
                                           (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL ? "«" : "»")
                                          );
            g_string_append (ret, tmp);
            g_free (tmp);
        }

        g_string_append (ret, "</div><div class='body'>");
        g_strfreev (colors);

        str = hash_lookup (document->priv->contents, real);
        if (str) {
            str_ref (str);
            g_mutex_unlock (&document->priv->mutex);
            return (const gchar *) str;
        }

        txt = g_uri_unescape_string (page_id + 7, NULL);
        tmp2 = g_strdup_printf (_("Search results for “%s”"), txt);
        tmp = g_markup_printf_escaped ("<h1>%s</h1>", tmp2);
        g_string_append (ret, tmp);
        g_free (tmp2);
        g_free (tmp);

        value = yelp_storage_search (yelp_storage_get_default (),
                                     document->priv->doc_uri,
                                     txt);
        iter = g_variant_iter_new (value);
        if (g_variant_iter_n_children (iter) == 0) {
            if (index_title != NULL) {
                gchar *t = g_strdup_printf (_("No matching help pages found in “%s”."), index_title);
                tmp = g_markup_printf_escaped ("<p>%s</p>", t);
                g_free (t);
            }
            else {
                tmp = g_markup_printf_escaped ("<p>%s</p>",
                                               _("No matching help pages found."));
            }
            g_string_append (ret, tmp);
            g_free (tmp);
        }
        else {
            while (g_variant_iter_loop (iter, "(&s&s&s&s)", &url, &title, &desc, &icon)) {
                tmp = g_markup_printf_escaped ("<div><a class='linkdiv' href='%s'><div class='linkdiv'>"
                                               "<div class='title'>%s</div>"
                                               "<div class='desc'>%s</div>"
                                               "</div></a></div>",
                                               url, title, desc);
                g_string_append (ret, tmp);
                g_free (tmp);
            }
        }
        g_variant_iter_free (iter);
        g_variant_unref (value);

        if (index_title != NULL)
            g_free (index_title);
        g_free (txt);
        g_string_append (ret, "</div></body></html>");

        hash_replace (document->priv->contents, page_id, g_string_free (ret, FALSE));
        str = hash_lookup (document->priv->contents, page_id);
        str_ref (str);
        g_mutex_unlock (&document->priv->mutex);
        return (const gchar *) str;
    }

    real = hash_lookup (document->priv->page_ids, page_id);
    str = hash_lookup (document->priv->contents, real);
    if (str)
        str_ref (str);

    g_mutex_unlock (&document->priv->mutex);

    return (const gchar *) str;
}
コード例 #7
0
gboolean
flatpak_builtin_document_info (int argc, char **argv,
                               GCancellable *cancellable,
                               GError **error)
{
  g_autoptr(GOptionContext) context = NULL;
  g_autoptr(GDBusConnection) session_bus = NULL;
  const char *file;
  XdpDbusDocuments *documents;
  g_autofree char *mountpoint = NULL;
  g_autofree char *basename = NULL;
  g_autofree char *doc_id = NULL;
  g_autofree char *doc_path = NULL;
  g_autofree char *origin = NULL;
  const char *app_id;
  const char **perms;
  g_autoptr(GVariant) apps = NULL;
  g_autoptr(GVariantIter) iter = NULL;

  context = g_option_context_new (_("FILE - Get information about an exported file"));
  g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);

  if (!flatpak_option_context_parse (context, options, &argc, &argv,
                                     FLATPAK_BUILTIN_FLAG_NO_DIR,
                                     NULL, cancellable, error))
    return FALSE;

  if (argc < 2)
    return usage_error (context, _("FILE must be specified"), error);

  file = argv[1];
  basename = g_path_get_basename (file);

  session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
  if (session_bus == NULL)
    return FALSE;

  documents = xdp_dbus_documents_proxy_new_sync (session_bus, 0,
                                                 "org.freedesktop.portal.Documents",
                                                 "/org/freedesktop/portal/documents",
                                                 NULL, error);
  if (documents == NULL)
    return FALSE;

  if (!xdp_dbus_documents_call_get_mount_point_sync (documents, &mountpoint,
                                                     NULL, error))
    return FALSE;

  if (!xdp_dbus_documents_call_lookup_sync (documents, file, &doc_id, NULL, error))
    return FALSE;

  if (strcmp (doc_id, "") == 0)
    {
      g_print (_("Not exported\n"));
      return TRUE;
    }

  doc_path = g_build_filename (mountpoint, doc_id, basename, NULL);

  if (!xdp_dbus_documents_call_info_sync (documents, doc_id, &origin, &apps,
                                          NULL, error))
    return FALSE;

  iter = g_variant_iter_new (apps);

  g_print ("id: %s\n", doc_id);
  g_print ("path: %s\n", doc_path);
  g_print ("origin: %s\n", origin);
  if (g_variant_iter_n_children (iter) > 0)
    g_print ("permissions:\n");
  while (g_variant_iter_next (iter, "{&s^a&s}", &app_id, &perms))
    {
      int i;
      g_print ("\t%s\t", app_id);
      for (i = 0; perms[i]; i++)
        {
          if (i > 0)
            g_print (", ");
          g_print ("%s", perms[i]);
        }
      g_print ("\n");
    }

  return TRUE;
}
コード例 #8
0
ファイル: capi-app-mgr.c プロジェクト: godvmxi/plugin_tools
int CtSgwUCIReadSection(const char *pkg_name, const char *section_type, const char *section_name, CtSgwUCIOpt_t **opts, uint32_t *optsize)
{
	char *vendor = NULL;
	int version = 0, ret = 0, n = 0;
	int i = 0, cnt = 0;
	char name[128] = {0}, path[128] = {0}, intf[128] = {0};
	GVariant *value = NULL;
	GVariant *vv = NULL;
	GVariantIter *iter;
	CtSgwUCIOpt_t *opt = NULL;
	gchar *key = NULL, *val = NULL;

	if (!pkg_name || (!section_name && !section_type))
		return -1;

	_CtSgwGetAppVendorVersion(pkg_name, &vendor, &version);
	g_assert_nonnull(vendor);
	sprintf(name, "com.%s.%s%d", vendor, pkg_name, version);

	if (section_name) {
		sprintf(path, "/com/%s/%s%d/Config/%s/%s", vendor, pkg_name, version, section_name, section_name);
		sprintf(intf, "%s.Config.%s", name, section_name);

		ret = CtSgwDBusGetAllProperty(name, path, intf, &value);

		if (value) {
			g_variant_get(value, "(a{sv})", &iter);

			n = g_variant_iter_n_children(iter);
			*optsize = n;

			opt = (CtSgwUCIOpt_t *)malloc(sizeof(CtSgwUCIOpt_t) * n);
			*opts = opt;
			
			while (g_variant_iter_loop(iter,"{sv}", &key, &vv))
			{
				g_strlcpy(opt->name, key, MAX_UCI_OPT_NAME_LEN);
				g_variant_get(vv, "&s", &val);
				if (val)
					g_strlcpy(opt->value, val, MAX_UCI_OPT_VAL_LEN);
				opt++;
			}

			g_variant_iter_free(iter);
			g_variant_unref(value);
		}
	}
	else if (section_type) {
		
		sprintf(path, "/com/%s/%s%d/Config/%s", vendor, pkg_name, version, section_type);
		sprintf(intf, "%s.Config.%s", name, section_type);

		cnt = _CtSgwGetNumOfNodes(name, path);
		
		sprintf(path, "/com/%s/%s%d/Config/%s/1", vendor, pkg_name, version, section_type);
		
		ret = CtSgwDBusGetAllProperty(name, path, intf, &value);

		if (value) {
			g_variant_get(value, "(a{sv})", &iter);
			
			n = g_variant_iter_n_children(iter);
			
			//each section have same number of properties
			*optsize = n * cnt;

			opt = (CtSgwUCIOpt_t *)malloc(sizeof(CtSgwUCIOpt_t) * n * cnt);
			*opts = opt;

			//fill properties of 1st section
			while (g_variant_iter_loop(iter,"{sv}", &key, &vv))
			{
				g_variant_get(vv, "&s", &val);
				g_strlcpy(opt->name, key, MAX_UCI_OPT_NAME_LEN);
				if (val)
					g_strlcpy(opt->value, val, MAX_UCI_OPT_VAL_LEN);
				opt++;
			}
			g_variant_iter_free (iter);
			g_variant_unref(value);

			//fill other sections
			for (i = 1; i < cnt; i++) {
				sprintf(path, "/com/%s/%s%d/Config/%s/%d", vendor, pkg_name, version, section_type, i + 1);

				ret = CtSgwDBusGetAllProperty(name, path, intf, &value);
				g_assert_nonnull(value);
				g_variant_get(value, "(a{sv})", &iter);
				
				while (g_variant_iter_loop(iter,"{sv}", &key, &vv))
				{
					g_variant_get(vv, "&s", &val);
					g_strlcpy(opt->name, key, MAX_UCI_OPT_NAME_LEN);
					if (val)
						g_strlcpy(opt->value, val, MAX_UCI_OPT_VAL_LEN);
					opt++;
				}			
				g_variant_iter_free (iter);
				g_variant_unref(value);
			}
		}
	}
	
	return ret;	

#if APPMGR_UCI_SUPPORT
	GDBusConnection *connection;
	GDBusProxy *proxy;
	GError *error = NULL;
	GVariant *result;
	GVariantIter *iter;
	CtSgwUCIOpt_t *opt = NULL;
	gchar *key, *value;
	gint n = 0;

	if (!pkg_name || (!section_name && !section_type))
		return -1;

	connection = g_bus_get_sync (DBUS_TYPE, NULL, &error);
	g_assert_no_error(error);

	proxy = g_dbus_proxy_new_sync(connection,
								  G_DBUS_PROXY_FLAGS_NONE,
								  NULL,					  /* GDBusInterfaceInfo */
								  "com.ctc.appframework1", /* name */
								  "/com/ctc/appframework1", /* object path */
								  "com.ctc.appframework1.UCI",		  /* interface */
								  NULL, /* GCancellable */
								  &error);
	g_assert_no_error(error);

	if (section_name)
		result = g_dbus_proxy_call_sync(proxy,
								"ReadSectionByName",
								g_variant_new("(ss)", pkg_name, section_name),
								G_DBUS_CALL_FLAGS_NONE,
								-1,
								NULL,
								&error);
	else
		result = g_dbus_proxy_call_sync(proxy,
								"ReadSectionByType",
								g_variant_new("(ss)", pkg_name, section_type),
								G_DBUS_CALL_FLAGS_NONE,
								-1,
								NULL,
								&error);
	g_assert(result != NULL);
	g_variant_get(result, "(a{ss})", &iter);

	n = g_variant_iter_n_children(iter);
	*optsize = n;

	opt = (CtSgwUCIOpt_t *)malloc(sizeof(CtSgwUCIOpt_t) * n);
	*opts = opt;
	
	while (g_variant_iter_loop(iter,"{ss}", &key, &value))
	{
		g_strlcpy(opt->name, key, MAX_UCI_OPT_NAME_LEN);
		g_strlcpy(opt->value, value, MAX_UCI_OPT_VAL_LEN);
		opt++;
	}
	g_variant_unref(result);
	g_object_unref(proxy);
	g_object_unref (connection);
#endif
	return 0;
}
コード例 #9
0
static int _icd_state_list_from_gvariant(GVariant *var,
		struct icd_state_list_s *value_list, int depth)
{
	int ret;
	GVariantIter iter;
	const GVariantType *type;
	union icd_state_value_u *value;

	type = g_variant_get_type(var);

	g_variant_iter_init(&iter, var);

	value_list->dimensions[depth] = g_variant_iter_n_children(&iter);
	DBG("[%d]list dim : %d", depth, value_list->dimensions[depth]);

	if (g_variant_type_equal(G_VARIANT_TYPE("ab"), type)) {
		bool b;
		value_list->type = OCREP_PROP_BOOL;
		while (g_variant_iter_loop(&iter, "b", &b)) {
			value = calloc(1, sizeof(union icd_state_value_u));
			if (NULL == value) {
				ERR("calloc() Fail(%d)", errno);
				return IOTCON_ERROR_OUT_OF_MEMORY;
			}
			value->b = b;
			value_list->list = g_list_append(value_list->list, value);
		}
	} else if (g_variant_type_equal(G_VARIANT_TYPE("ai"), type)) {
		int i;
		value_list->type = OCREP_PROP_INT;
		while (g_variant_iter_loop(&iter, "i", &i)) {
			value = calloc(1, sizeof(union icd_state_value_u));
			if (NULL == value) {
				ERR("calloc() Fail(%d)", errno);
				return IOTCON_ERROR_OUT_OF_MEMORY;
			}
			value->i = i;
			value_list->list = g_list_append(value_list->list, value);
		}
	} else if (g_variant_type_equal(G_VARIANT_TYPE("ad"), type)) {
		double d;
		value_list->type = OCREP_PROP_DOUBLE;
		while (g_variant_iter_loop(&iter, "d", &d)) {
			value = calloc(1, sizeof(union icd_state_value_u));
			if (NULL == value) {
				ERR("calloc() Fail(%d)", errno);
				return IOTCON_ERROR_OUT_OF_MEMORY;
			}
			value->d = d;
			value_list->list = g_list_append(value_list->list, value);
		}
	} else if (g_variant_type_equal(G_VARIANT_TYPE("as"), type)) {
		char *s;
		value_list->type = OCREP_PROP_STRING;
		while (g_variant_iter_next(&iter, "s", &s))
			value_list->list = g_list_append(value_list->list, s);
	} else if (g_variant_type_equal(G_VARIANT_TYPE("av"), type)) {
		GVariant *value;
		if (g_variant_iter_loop(&iter, "v", &value)) {
			if (g_variant_is_of_type(value, G_VARIANT_TYPE("a{sv}"))) {
				OCRepPayload *repr;
				GVariantIter state_iter;
				value_list->type = OCREP_PROP_OBJECT;
				do {
					repr = OCRepPayloadCreate();
					g_variant_iter_init(&state_iter, value);
					ret = _icd_state_value_from_gvariant(repr, &state_iter);
					if (IOTCON_ERROR_NONE != ret) {
						ERR("_icd_state_value_from_gvariant() Fail(%d)", ret);
						OCRepPayloadDestroy(repr);
						return ret;
					}
					value_list->list = g_list_append(value_list->list, repr);
				} while (g_variant_iter_loop(&iter, "v", &value));

			} else if (g_variant_is_of_type(value, G_VARIANT_TYPE("ay"))) {
				OCByteString *byte_str;
				value_list->type = OCREP_PROP_BYTE_STRING;
				do {
					byte_str = calloc(1, sizeof(OCByteString));
					if (NULL == byte_str) {
						ERR("calloc() Fail(%d)", errno);
						return IOTCON_ERROR_OUT_OF_MEMORY;
					}

					byte_str->len = g_variant_get_size(value);
					byte_str->bytes = calloc(byte_str->len, sizeof(uint8_t));
					if (NULL == byte_str->bytes) {
						ERR("calloc() Fail(%d)", errno);
						free(byte_str);
						return IOTCON_ERROR_OUT_OF_MEMORY;
					}
					memcpy(byte_str->bytes, g_variant_get_data(value), byte_str->len);

					value_list->list = g_list_append(value_list->list, byte_str);
				} while (g_variant_iter_loop(&iter, "v", &value));

			} else if (g_variant_is_of_type(value, G_VARIANT_TYPE_ARRAY)) {
				do {
					ret = _icd_state_list_from_gvariant(value, value_list, depth + 1);
					if (IOTCON_ERROR_NONE != ret) {
						ERR("_icd_state_list_from_gvariant() Fail(%d)", ret);
						return ret;
					}
				} while (g_variant_iter_loop(&iter, "v", &value));
			}
		}
	}

	return IOTCON_ERROR_NONE;
}
コード例 #10
0
static void
tracker_dbus_signal_cb (GDBusConnection *connection,
                        const gchar     *sender_name,
                        const gchar     *object_path,
                        const gchar     *interface_name,
                        const gchar     *signal_name,
                        GVariant        *parameters,
                        gpointer         user_data)

{
  gchar *class_name;
  gint graph = 0, subject = 0, predicate = 0, object = 0;
  GVariantIter *iter1, *iter2;
  tracker_evt_update_t *evt = tracker_evt_update_new ();

  g_variant_get (parameters, "(&sa(iiii)a(iiii))", &class_name, &iter1, &iter2);

  GRL_DEBUG ("Tracker update event for class=%s ins=%lu del=%lu evt=%p",
             class_name,
             (unsigned long) g_variant_iter_n_children (iter1),
             (unsigned long) g_variant_iter_n_children (iter2),
	     evt);

  /* Process deleted items */
  while (g_variant_iter_loop (iter1, "(iiii)", &graph,
                              &subject, &predicate, &object)) {
    gpointer psubject = GSIZE_TO_POINTER (subject);
    GrlTrackerSource *source =
      grl_tracker_source_cache_get_source (grl_tracker_item_cache, subject);

    /* GRL_DEBUG ("\tdelete=> subject=%i", subject); */

    if (source) {
      g_hash_table_insert (evt->deleted_items, psubject,
                           g_object_ref (source));
    } else {
        g_hash_table_insert (evt->orphan_items, psubject,
                             GSIZE_TO_POINTER (GRL_CONTENT_REMOVED));
    }
  }

  while (g_variant_iter_loop (iter2, "(iiii)", &graph,
                              &subject, &predicate, &object)) {
    gpointer psubject = GSIZE_TO_POINTER (subject);
    GrlTrackerSource *source =
      grl_tracker_source_cache_get_source (grl_tracker_item_cache, subject);

    /* GRL_DEBUG ("\tinsert=> subject=%i", subject); */

    if (source) {
      /* Removed & inserted items are probably just renamed items... */
      if (g_hash_table_lookup (evt->deleted_items, psubject)) {
        g_hash_table_remove (evt->deleted_items, psubject);
        g_hash_table_insert (evt->updated_items, psubject,
                             g_object_ref (source));
      } else if (!g_hash_table_lookup (evt->updated_items, psubject)) {
        g_hash_table_insert (evt->inserted_items, psubject,
                             g_object_ref (source));
      }
    } else {
      gpointer state;

      if (g_hash_table_lookup_extended (evt->orphan_items, psubject,
                                        NULL, &state) &&
            (GPOINTER_TO_INT (state) == GRL_CONTENT_REMOVED)) {
        g_hash_table_insert (evt->orphan_items, psubject,
                             GSIZE_TO_POINTER (GRL_CONTENT_CHANGED));
      } else {
        g_hash_table_insert (evt->orphan_items, psubject,
                             GSIZE_TO_POINTER (GRL_CONTENT_ADDED));
      }
    }
  }

  g_variant_iter_free (iter1);
  g_variant_iter_free (iter2);

  GRL_DEBUG ("\tinserted=%i deleted=%i updated=%i orphan=%i",
             g_hash_table_size (evt->inserted_items),
             g_hash_table_size (evt->deleted_items),
             g_hash_table_size (evt->updated_items),
	     g_hash_table_size (evt->orphan_items));

  if (grl_tracker_per_device_source) {
    tracker_evt_preupdate_sources (evt);
  } else {
    tracker_evt_update_items (evt);
    tracker_evt_update_orphans (evt);
  }
}