/*
* Copyright © 2018 Red Hat, Inc
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* Authors:
* Matthias Clasen
*/
#include "config.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "trash.h"
#include "request.h"
#include "documents.h"
#include "xdp-dbus.h"
#include "xdp-impl-dbus.h"
#include "xdp-utils.h"
typedef struct _Trash Trash;
typedef struct _TrashClass TrashClass;
struct _Trash
{
XdpDbusTrashSkeleton parent_instance;
};
struct _TrashClass
{
XdpDbusTrashSkeletonClass parent_class;
};
static Trash *trash;
GType trash_get_type (void) G_GNUC_CONST;
static void trash_iface_init (XdpDbusTrashIface *iface);
G_DEFINE_TYPE_WITH_CODE (Trash, trash, XDP_DBUS_TYPE_TRASH_SKELETON,
G_IMPLEMENT_INTERFACE (XDP_DBUS_TYPE_TRASH,
trash_iface_init));
static guint
trash_file (XdpAppInfo *app_info,
const char *sender,
int fd)
{
g_autofree char *path = NULL;
gboolean writable;
g_autoptr(GFile) file = NULL;
g_autoptr(GError) local_error = NULL;
path = xdp_app_info_get_path_for_fd (app_info, fd, 0, NULL, &writable, &local_error);
if (path == NULL)
{
g_debug ("Cannot trash file with invalid fd: %s", local_error->message);
return 0;
}
if (!writable)
{
g_debug ("Cannot trash file \"%s\": not opened for writing", path);
return 0;
}
file = g_file_new_for_path (path);
if (!g_file_trash (file, NULL, &local_error))
{
g_debug ("Cannot trash file \"%s\": %s", path, local_error->message);
return 0;
}
return 1;
}
static gboolean
handle_trash_file (XdpDbusTrash *object,
GDBusMethodInvocation *invocation,
GUnixFDList *fd_list,
GVariant *arg_fd)
{
Request *request = request_from_invocation (invocation);
int idx, fd;
guint result;
g_debug ("Handling TrashFile");
REQUEST_AUTOLOCK (request);
g_variant_get (arg_fd, "h", &idx);
fd = g_unix_fd_list_get (fd_list, idx, NULL);
result = trash_file (request->app_info, request->sender, fd);
xdp_dbus_trash_complete_trash_file (object, invocation, NULL, result);
return G_DBUS_METHOD_INVOCATION_HANDLED;
}
static void
trash_iface_init (XdpDbusTrashIface *iface)
{
iface->handle_trash_file = handle_trash_file;
}
static void
trash_init (Trash *trash)
{
xdp_dbus_trash_set_version (XDP_DBUS_TRASH (trash), 1);
}
static void
trash_class_init (TrashClass *klass)
{
}
GDBusInterfaceSkeleton *
trash_create (GDBusConnection *connection)
{
trash = g_object_new (trash_get_type (), NULL);
return G_DBUS_INTERFACE_SKELETON (trash);
}