/*
 * QEMU DBus display
 *
 * Copyright (c) 2021 Marc-André Lureau <marcandre.lureau@redhat.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#ifndef UI_DBUS_H_
#define UI_DBUS_H_

#include "chardev/char-socket.h"
#include "qemu/dbus.h"
#include "qom/object.h"
#include "ui/console.h"
#include "ui/clipboard.h"

#include "dbus-display1.h"

typedef struct DBusClipboardRequest {
    GDBusMethodInvocation *invocation;
    QemuClipboardType type;
    guint timeout_id;
} DBusClipboardRequest;

struct DBusDisplay {
    Object parent;

    DisplayGLMode gl_mode;
    bool p2p;
    char *dbus_addr;
    char *audiodev;
    DisplayGLCtx glctx;

    GDBusConnection *bus;
    GDBusObjectManagerServer *server;
    QemuDBusDisplay1VM *iface;
    GPtrArray *consoles;
    GCancellable *add_client_cancellable;

    QemuClipboardPeer clipboard_peer;
    QemuDBusDisplay1Clipboard *clipboard;
    QemuDBusDisplay1Clipboard *clipboard_proxy;
    DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT];

    Notifier notifier;
};

#define TYPE_DBUS_DISPLAY "dbus-display"
OBJECT_DECLARE_SIMPLE_TYPE(DBusDisplay, DBUS_DISPLAY)

void dbus_display_notifier_add(Notifier *notifier);

#define DBUS_DISPLAY_TYPE_CONSOLE dbus_display_console_get_type()
G_DECLARE_FINAL_TYPE(DBusDisplayConsole,
                     dbus_display_console,
                     DBUS_DISPLAY,
                     CONSOLE,
                     GDBusObjectSkeleton)

DBusDisplayConsole *
dbus_display_console_new(DBusDisplay *display, QemuConsole *con);

int
dbus_display_console_get_index(DBusDisplayConsole *ddc);

#define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type()
G_DECLARE_FINAL_TYPE(DBusDisplayListener,
                     dbus_display_listener,
                     DBUS_DISPLAY,
                     LISTENER,
                     GObject)

DBusDisplayListener *
dbus_display_listener_new(const char *bus_name,
                          GDBusConnection *conn,
                          DBusDisplayConsole *console);

DBusDisplayConsole *
dbus_display_listener_get_console(DBusDisplayListener *ddl);

const char *
dbus_display_listener_get_bus_name(DBusDisplayListener *ddl);

extern const DisplayChangeListenerOps dbus_gl_dcl_ops;
extern const DisplayChangeListenerOps dbus_dcl_ops;

#define TYPE_CHARDEV_DBUS "chardev-dbus"

typedef struct DBusChardevClass {
    SocketChardevClass parent_class;

    void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event);
} DBusChardevClass;

DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV,
                       TYPE_CHARDEV_DBUS)

typedef struct DBusChardev {
    SocketChardev parent;

    bool exported;
    QemuDBusDisplay1Chardev *iface;
} DBusChardev;

DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)

#define CHARDEV_IS_DBUS(chr) \
    object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS)

typedef enum {
    DBUS_DISPLAY_CHARDEV_OPEN,
    DBUS_DISPLAY_CHARDEV_CLOSE,
} DBusDisplayEventType;

typedef struct DBusDisplayEvent {
    DBusDisplayEventType type;
    union {
        DBusChardev *chardev;
    };
} DBusDisplayEvent;

void dbus_display_notify(DBusDisplayEvent *event);

void dbus_chardev_init(DBusDisplay *dpy);

void dbus_clipboard_init(DBusDisplay *dpy);

#endif /* UI_DBUS_H_ */
