xref: /openbmc/qemu/ui/dbus.h (revision ad4ec2798fd7066bc9d879dcbdeae96073ad370f)
1  /*
2   * QEMU DBus display
3   *
4   * Copyright (c) 2021 Marc-AndrĂ© Lureau <marcandre.lureau@redhat.com>
5   *
6   * Permission is hereby granted, free of charge, to any person obtaining a copy
7   * of this software and associated documentation files (the "Software"), to deal
8   * in the Software without restriction, including without limitation the rights
9   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   * copies of the Software, and to permit persons to whom the Software is
11   * furnished to do so, subject to the following conditions:
12   *
13   * The above copyright notice and this permission notice shall be included in
14   * all copies or substantial portions of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   * THE SOFTWARE.
23   */
24  
25  #ifndef UI_DBUS_H
26  #define UI_DBUS_H
27  
28  #include "chardev/char-socket.h"
29  #include "qemu/dbus.h"
30  #include "qom/object.h"
31  #include "ui/console.h"
32  #include "ui/clipboard.h"
33  
34  #include "ui/dbus-display1.h"
35  
36  typedef struct DBusClipboardRequest {
37      GDBusMethodInvocation *invocation;
38      QemuClipboardType type;
39      guint timeout_id;
40  } DBusClipboardRequest;
41  
42  struct DBusDisplay {
43      Object parent;
44  
45      DisplayGLMode gl_mode;
46      bool p2p;
47      char *dbus_addr;
48      char *audiodev;
49      DisplayGLCtx glctx;
50  
51      GDBusConnection *bus;
52      GDBusObjectManagerServer *server;
53      QemuDBusDisplay1VM *iface;
54      GPtrArray *consoles;
55      GCancellable *add_client_cancellable;
56  
57      QemuClipboardPeer clipboard_peer;
58      QemuDBusDisplay1Clipboard *clipboard;
59      QemuDBusDisplay1Clipboard *clipboard_proxy;
60      DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT];
61  
62      Notifier notifier;
63  };
64  
65  #ifdef WIN32
66  bool
67  dbus_win32_import_socket(GDBusMethodInvocation *invocation,
68                           GVariant *arg_listener, int *socket);
69  #endif
70  
71  #define TYPE_DBUS_DISPLAY "dbus-display"
72  OBJECT_DECLARE_SIMPLE_TYPE(DBusDisplay, DBUS_DISPLAY)
73  
74  void dbus_display_notifier_add(Notifier *notifier);
75  
76  #define DBUS_DISPLAY_TYPE_CONSOLE dbus_display_console_get_type()
77  G_DECLARE_FINAL_TYPE(DBusDisplayConsole,
78                       dbus_display_console,
79                       DBUS_DISPLAY,
80                       CONSOLE,
81                       GDBusObjectSkeleton)
82  
83  DBusDisplayConsole *
84  dbus_display_console_new(DBusDisplay *display, QemuConsole *con);
85  
86  int
87  dbus_display_console_get_index(DBusDisplayConsole *ddc);
88  
89  
90  extern const DisplayChangeListenerOps dbus_console_dcl_ops;
91  
92  #define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type()
93  G_DECLARE_FINAL_TYPE(DBusDisplayListener,
94                       dbus_display_listener,
95                       DBUS_DISPLAY,
96                       LISTENER,
97                       GObject)
98  
99  DBusDisplayListener *
100  dbus_display_listener_new(const char *bus_name,
101                            GDBusConnection *conn,
102                            DBusDisplayConsole *console);
103  
104  DBusDisplayConsole *
105  dbus_display_listener_get_console(DBusDisplayListener *ddl);
106  
107  const char *
108  dbus_display_listener_get_bus_name(DBusDisplayListener *ddl);
109  
110  extern const DisplayChangeListenerOps dbus_gl_dcl_ops;
111  extern const DisplayChangeListenerOps dbus_dcl_ops;
112  
113  #define TYPE_CHARDEV_DBUS "chardev-dbus"
114  
115  typedef struct DBusChardevClass {
116      SocketChardevClass parent_class;
117  
118      void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event);
119  } DBusChardevClass;
120  
121  DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV,
122                         TYPE_CHARDEV_DBUS)
123  
124  typedef struct DBusChardev {
125      SocketChardev parent;
126  
127      bool exported;
128      QemuDBusDisplay1Chardev *iface;
129  } DBusChardev;
130  
131  DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)
132  
133  #define CHARDEV_IS_DBUS(chr) \
134      object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS)
135  
136  typedef enum {
137      DBUS_DISPLAY_CHARDEV_OPEN,
138      DBUS_DISPLAY_CHARDEV_CLOSE,
139  } DBusDisplayEventType;
140  
141  typedef struct DBusDisplayEvent {
142      DBusDisplayEventType type;
143      union {
144          DBusChardev *chardev;
145      };
146  } DBusDisplayEvent;
147  
148  void dbus_display_notify(DBusDisplayEvent *event);
149  
150  void dbus_chardev_init(DBusDisplay *dpy);
151  
152  void dbus_clipboard_init(DBusDisplay *dpy);
153  
154  #endif /* UI_DBUS_H */
155