static bool CALESetUpDBus(CALEContext * context)
{
    assert(context != NULL);

    bool success = false;

    GError * error = NULL;

    /*
      Set up connection to the D-Bus system bus, where the BlueZ
      daemon is found.
    */
    GDBusConnection * const connection =
        g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);

    if (connection == NULL)
    {
        OIC_LOG_V(ERROR,
                  TAG,
                  "Connection to D-Bus system bus failed: %s.",
                  error->message);

        g_error_free(error);

        return success;
    }

    // Create a proxy to the BlueZ D-Bus ObjectManager.
    static char const object_manager_path[] = "/";

    GDBusObjectManager * const object_manager =
        g_dbus_object_manager_client_new_sync(
            connection,
            G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
            BLUEZ_NAME,
            object_manager_path,
            NULL,   // get_proxy_type_func
            NULL,   // get_proxy_type_user_data
            NULL,   // get_proxy_type_destroy_notify
            NULL,   // cancellable
            &error);

    if (object_manager == NULL)
    {
        OIC_LOG_V(ERROR,
                  TAG,
                  "Unable to create D-Bus ObjectManager client: %s",
                  error->message);

        g_error_free(error);

        g_object_unref(connection);

        return success;
    }

    CALESubscribeToSignals(context, connection, object_manager);

    ca_mutex_lock(context->lock);
    context->connection     = connection;
    context->object_manager = object_manager;
    ca_mutex_unlock(context->lock);

    success = CALESetUpBlueZObjects(context);

    return success;
}
Esempio n. 2
0
static int enable_func(void *data)
{
	struct gt_gadget_enable_data *dt;

	dt = (struct gt_gadget_enable_data *)data;

	/* TODO add support for enabling well known UDC */
	GVariant *gret;
	GError *error = NULL;
	GDBusObjectManager *manager;
	GList *objects;
	GList *l;
	const gchar *obj_path = NULL;
	_cleanup_g_free_ gchar *g_path = NULL;
	const gchar *msg = NULL;
	gboolean out_gadget_enabled = 0;

	gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn,
					   "org.usb.gadgetd",
					   "/org/usb/Gadget",
					   "org.usb.device.GadgetManager",
					   "FindGadgetByName",
					   g_variant_new("(s)",
							 dt->gadget),
					   NULL,
					   G_DBUS_CALL_FLAGS_NONE,
					   -1,
					   NULL,
					   &error);

	if (error) {
		fprintf(stderr, "Failed to get gadget, %s\n", error->message);
		return -1;
	}

	g_variant_get(gret, "(o)", &g_path);
	g_variant_unref(gret);

	manager = g_dbus_object_manager_client_new_sync(backend_ctx.gadgetd_conn,
					       G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
					       "org.usb.gadgetd",
					       "/org/usb/Gadget",
					       NULL,
					       NULL,
					       NULL,
					       NULL,
					       &error);

	if (error) {
		fprintf(stderr, "Failed to get dbus object manager, %s\n", error->message);
		return -1;
	}

	/* get first "free" udc and enable gadget */
	objects = g_dbus_object_manager_get_objects(manager);
	for (l = objects; l != NULL; l = l->next)
	{
		GDBusObject *object = G_DBUS_OBJECT(l->data);
		obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));

		if (g_str_has_prefix(obj_path, "/org/usb/Gadget/UDC")) {
			obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));

			gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn,
							   "org.usb.gadgetd",
							   obj_path,
							   "org.usb.device.UDC",
							   "EnableGadget",
							   g_variant_new("(o)",
									 g_path),
							   NULL,
							   G_DBUS_CALL_FLAGS_NONE,
							   -1,
							   NULL,
							   &error);
			if (error) {
				msg = error->message;
				goto out;
			}
			g_variant_get(gret, "(b)", &out_gadget_enabled);
			if (out_gadget_enabled) {
				g_variant_unref(gret);
				goto out;
			}
		}
	}

	if (l == NULL) {
		fprintf(stderr, "Failed to enable gadget, no UDC found\n");
		return -1;
	}

out:
	g_list_foreach(objects, (GFunc)g_object_unref, NULL);
	g_list_free(objects);
	g_object_unref(manager);

	if (msg != NULL) {
		fprintf(stderr, "Failed to enable gadget, %s\n", msg);
		return -1;
	}

	return 0;
}