33 | 33 |
#include <glib/gi18n.h>
|
34 | 34 |
#include <libxml/uri.h>
|
35 | 35 |
|
36 | |
struct _VirtViewerSessionVncPrivate {
|
|
36 |
struct _VirtViewerSessionVnc {
|
|
37 |
VirtViewerSession parent;
|
37 | 38 |
GtkWindow *main_window;
|
38 | 39 |
/* XXX we should really just have a VncConnection */
|
39 | 40 |
VncDisplay *vnc;
|
40 | 41 |
gboolean auth_dialog_cancelled;
|
41 | 42 |
};
|
42 | 43 |
|
43 | |
G_DEFINE_TYPE_WITH_PRIVATE(VirtViewerSessionVnc, virt_viewer_session_vnc, VIRT_VIEWER_TYPE_SESSION)
|
|
44 |
G_DEFINE_TYPE(VirtViewerSessionVnc, virt_viewer_session_vnc, VIRT_VIEWER_TYPE_SESSION)
|
44 | 45 |
|
45 | 46 |
static void virt_viewer_session_vnc_close(VirtViewerSession* session);
|
46 | 47 |
static gboolean virt_viewer_session_vnc_open_fd(VirtViewerSession* session, int fd);
|
|
53 | 54 |
static void
|
54 | 55 |
virt_viewer_session_vnc_finalize(GObject *obj)
|
55 | 56 |
{
|
56 | |
VirtViewerSessionVnc *vnc = VIRT_VIEWER_SESSION_VNC(obj);
|
57 | |
|
58 | |
if (vnc->priv->vnc) {
|
59 | |
vnc_display_close(vnc->priv->vnc);
|
60 | |
g_object_unref(vnc->priv->vnc);
|
61 | |
}
|
62 | |
if (vnc->priv->main_window)
|
63 | |
g_object_unref(vnc->priv->main_window);
|
|
57 |
VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(obj);
|
|
58 |
|
|
59 |
if (self->vnc) {
|
|
60 |
vnc_display_close(self->vnc);
|
|
61 |
g_object_unref(self->vnc);
|
|
62 |
}
|
|
63 |
if (self->main_window)
|
|
64 |
g_object_unref(self->main_window);
|
64 | 65 |
|
65 | 66 |
G_OBJECT_CLASS(virt_viewer_session_vnc_parent_class)->finalize(obj);
|
66 | 67 |
}
|
|
90 | 91 |
static void
|
91 | 92 |
virt_viewer_session_vnc_init(VirtViewerSessionVnc *self G_GNUC_UNUSED)
|
92 | 93 |
{
|
93 | |
self->priv = virt_viewer_session_vnc_get_instance_private(self);
|
94 | 94 |
}
|
95 | 95 |
|
96 | 96 |
static void
|
97 | 97 |
virt_viewer_session_vnc_connected(VncDisplay *vnc G_GNUC_UNUSED,
|
98 | |
VirtViewerSessionVnc *session)
|
99 | |
{
|
100 | |
GtkWidget *display = virt_viewer_display_vnc_new(session, session->priv->vnc);
|
101 | |
VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(session));
|
102 | |
|
103 | |
session->priv->auth_dialog_cancelled = FALSE;
|
|
98 |
VirtViewerSessionVnc *self)
|
|
99 |
{
|
|
100 |
GtkWidget *display = virt_viewer_display_vnc_new(self, self->vnc);
|
|
101 |
VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self));
|
|
102 |
|
|
103 |
self->auth_dialog_cancelled = FALSE;
|
104 | 104 |
|
105 | 105 |
virt_viewer_window_set_display(virt_viewer_app_get_main_window(app),
|
106 | 106 |
VIRT_VIEWER_DISPLAY(display));
|
107 | 107 |
|
108 | |
g_signal_emit_by_name(session, "session-connected");
|
109 | |
virt_viewer_session_add_display(VIRT_VIEWER_SESSION(session),
|
|
108 |
g_signal_emit_by_name(self, "session-connected");
|
|
109 |
virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self),
|
110 | 110 |
VIRT_VIEWER_DISPLAY(display));
|
111 | 111 |
}
|
112 | 112 |
|
113 | 113 |
static void
|
114 | 114 |
virt_viewer_session_vnc_disconnected(VncDisplay *vnc G_GNUC_UNUSED,
|
115 | |
VirtViewerSessionVnc *session)
|
|
115 |
VirtViewerSessionVnc *self)
|
116 | 116 |
{
|
117 | 117 |
GtkWidget *display;
|
118 | |
if (session->priv->auth_dialog_cancelled)
|
|
118 |
if (self->auth_dialog_cancelled)
|
119 | 119 |
return;
|
120 | 120 |
|
121 | |
virt_viewer_session_clear_displays(VIRT_VIEWER_SESSION(session));
|
122 | |
display = virt_viewer_display_vnc_new(session, session->priv->vnc);
|
|
121 |
virt_viewer_session_clear_displays(VIRT_VIEWER_SESSION(self));
|
|
122 |
display = virt_viewer_display_vnc_new(self, self->vnc);
|
123 | 123 |
g_debug("Disconnected");
|
124 | |
g_signal_emit_by_name(session, "session-disconnected", NULL);
|
|
124 |
g_signal_emit_by_name(self, "session-disconnected", NULL);
|
125 | 125 |
virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), FALSE);
|
126 | 126 |
virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display),
|
127 | 127 |
VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, FALSE);
|
|
187 | 187 |
VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(session);
|
188 | 188 |
|
189 | 189 |
g_return_val_if_fail(self != NULL, FALSE);
|
190 | |
g_return_val_if_fail(self->priv->vnc != NULL, FALSE);
|
191 | |
|
192 | |
return vnc_display_open_fd(self->priv->vnc, fd);
|
|
190 |
g_return_val_if_fail(self->vnc != NULL, FALSE);
|
|
191 |
|
|
192 |
return vnc_display_open_fd(self->vnc, fd);
|
193 | 193 |
}
|
194 | 194 |
|
195 | 195 |
static gboolean
|
|
210 | 210 |
VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(session);
|
211 | 211 |
|
212 | 212 |
g_return_val_if_fail(self != NULL, FALSE);
|
213 | |
g_return_val_if_fail(self->priv->vnc != NULL, FALSE);
|
214 | |
|
215 | |
return vnc_display_open_host(self->priv->vnc, host, port);
|
|
213 |
g_return_val_if_fail(self->vnc != NULL, FALSE);
|
|
214 |
|
|
215 |
return vnc_display_open_host(self->vnc, host, port);
|
216 | 216 |
}
|
217 | 217 |
|
218 | 218 |
static gboolean
|
|
228 | 228 |
gboolean ret;
|
229 | 229 |
|
230 | 230 |
g_return_val_if_fail(self != NULL, FALSE);
|
231 | |
g_return_val_if_fail(self->priv->vnc != NULL, FALSE);
|
|
231 |
g_return_val_if_fail(self->vnc != NULL, FALSE);
|
232 | 232 |
|
233 | 233 |
if (file) {
|
234 | 234 |
g_return_val_if_fail(virt_viewer_file_is_set(file, "port"), FALSE);
|
|
260 | 260 |
xmlFreeURI(uri);
|
261 | 261 |
}
|
262 | 262 |
|
263 | |
ret = vnc_display_open_host(self->priv->vnc,
|
|
263 |
ret = vnc_display_open_host(self->vnc,
|
264 | 264 |
hoststr,
|
265 | 265 |
portstr);
|
266 | 266 |
g_free(portstr);
|
|
295 | 295 |
break;
|
296 | 296 |
default:
|
297 | 297 |
g_debug("Unsupported credential type %d", g_value_get_enum(cred));
|
298 | |
vnc_display_close(self->priv->vnc);
|
|
298 |
vnc_display_close(self->vnc);
|
299 | 299 |
goto cleanup;
|
300 | 300 |
}
|
301 | 301 |
}
|
|
317 | 317 |
}
|
318 | 318 |
|
319 | 319 |
if (wantUsername || wantPassword) {
|
320 | |
gboolean ret = virt_viewer_auth_collect_credentials(self->priv->main_window,
|
|
320 |
gboolean ret = virt_viewer_auth_collect_credentials(self->main_window,
|
321 | 321 |
"VNC", NULL,
|
322 | 322 |
wantUsername ? &username : NULL,
|
323 | 323 |
wantPassword ? &password : NULL);
|
324 | 324 |
|
325 | 325 |
if (!ret) {
|
326 | |
vnc_display_close(self->priv->vnc);
|
327 | |
self->priv->auth_dialog_cancelled = TRUE;
|
|
326 |
vnc_display_close(self->vnc);
|
|
327 |
self->auth_dialog_cancelled = TRUE;
|
328 | 328 |
g_signal_emit_by_name(self, "session-cancelled");
|
329 | 329 |
goto cleanup;
|
330 | 330 |
}
|
|
335 | 335 |
switch (g_value_get_enum(cred)) {
|
336 | 336 |
case VNC_DISPLAY_CREDENTIAL_USERNAME:
|
337 | 337 |
if (!username ||
|
338 | |
vnc_display_set_credential(self->priv->vnc,
|
|
338 |
vnc_display_set_credential(self->vnc,
|
339 | 339 |
g_value_get_enum(cred),
|
340 | 340 |
username)) {
|
341 | 341 |
g_debug("Failed to set credential type %d", g_value_get_enum(cred));
|
342 | |
vnc_display_close(self->priv->vnc);
|
|
342 |
vnc_display_close(self->vnc);
|
343 | 343 |
}
|
344 | 344 |
break;
|
345 | 345 |
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
|
346 | 346 |
if (!password ||
|
347 | |
vnc_display_set_credential(self->priv->vnc,
|
|
347 |
vnc_display_set_credential(self->vnc,
|
348 | 348 |
g_value_get_enum(cred),
|
349 | 349 |
password)) {
|
350 | 350 |
g_debug("Failed to set credential type %d", g_value_get_enum(cred));
|
351 | |
vnc_display_close(self->priv->vnc);
|
|
351 |
vnc_display_close(self->vnc);
|
352 | 352 |
}
|
353 | 353 |
break;
|
354 | 354 |
case VNC_DISPLAY_CREDENTIAL_CLIENTNAME:
|
355 | |
if (vnc_display_set_credential(self->priv->vnc,
|
|
355 |
if (vnc_display_set_credential(self->vnc,
|
356 | 356 |
g_value_get_enum(cred),
|
357 | 357 |
"libvirt")) {
|
358 | 358 |
g_debug("Failed to set credential type %d", g_value_get_enum(cred));
|
359 | |
vnc_display_close(self->priv->vnc);
|
|
359 |
vnc_display_close(self->vnc);
|
360 | 360 |
}
|
361 | 361 |
break;
|
362 | 362 |
default:
|
363 | 363 |
g_debug("Unsupported credential type %d", g_value_get_enum(cred));
|
364 | |
vnc_display_close(self->priv->vnc);
|
|
364 |
vnc_display_close(self->vnc);
|
365 | 365 |
}
|
366 | 366 |
}
|
367 | 367 |
|
|
378 | 378 |
|
379 | 379 |
g_return_if_fail(self != NULL);
|
380 | 380 |
|
381 | |
g_debug("close vnc=%p", self->priv->vnc);
|
382 | |
if (self->priv->vnc != NULL) {
|
|
381 |
g_debug("close vnc=%p", self->vnc);
|
|
382 |
if (self->vnc != NULL) {
|
383 | 383 |
virt_viewer_session_clear_displays(session);
|
384 | |
vnc_display_close(self->priv->vnc);
|
385 | |
g_object_unref(self->priv->vnc);
|
386 | |
}
|
387 | |
|
388 | |
self->priv->vnc = VNC_DISPLAY(vnc_display_new());
|
389 | |
g_object_ref_sink(self->priv->vnc);
|
390 | |
|
391 | |
g_signal_connect(self->priv->vnc, "vnc-connected",
|
|
384 |
vnc_display_close(self->vnc);
|
|
385 |
g_object_unref(self->vnc);
|
|
386 |
}
|
|
387 |
|
|
388 |
self->vnc = VNC_DISPLAY(vnc_display_new());
|
|
389 |
g_object_ref_sink(self->vnc);
|
|
390 |
|
|
391 |
g_signal_connect(self->vnc, "vnc-connected",
|
392 | 392 |
G_CALLBACK(virt_viewer_session_vnc_connected), session);
|
393 | |
g_signal_connect(self->priv->vnc, "vnc-initialized",
|
|
393 |
g_signal_connect(self->vnc, "vnc-initialized",
|
394 | 394 |
G_CALLBACK(virt_viewer_session_vnc_initialized), session);
|
395 | |
g_signal_connect(self->priv->vnc, "vnc-disconnected",
|
|
395 |
g_signal_connect(self->vnc, "vnc-disconnected",
|
396 | 396 |
G_CALLBACK(virt_viewer_session_vnc_disconnected), session);
|
397 | |
g_signal_connect(self->priv->vnc, "vnc-error",
|
|
397 |
g_signal_connect(self->vnc, "vnc-error",
|
398 | 398 |
G_CALLBACK(virt_viewer_session_vnc_error), session);
|
399 | 399 |
|
400 | |
g_signal_connect(self->priv->vnc, "vnc-bell",
|
|
400 |
g_signal_connect(self->vnc, "vnc-bell",
|
401 | 401 |
G_CALLBACK(virt_viewer_session_vnc_bell), session);
|
402 | |
g_signal_connect(self->priv->vnc, "vnc-auth-failure",
|
|
402 |
g_signal_connect(self->vnc, "vnc-auth-failure",
|
403 | 403 |
G_CALLBACK(virt_viewer_session_vnc_auth_failure), session);
|
404 | |
g_signal_connect(self->priv->vnc, "vnc-auth-unsupported",
|
|
404 |
g_signal_connect(self->vnc, "vnc-auth-unsupported",
|
405 | 405 |
G_CALLBACK(virt_viewer_session_vnc_auth_unsupported), session);
|
406 | |
g_signal_connect(self->priv->vnc, "vnc-server-cut-text",
|
|
406 |
g_signal_connect(self->vnc, "vnc-server-cut-text",
|
407 | 407 |
G_CALLBACK(virt_viewer_session_vnc_cut_text), session);
|
408 | 408 |
|
409 | |
g_signal_connect(self->priv->vnc, "vnc-auth-credential",
|
|
409 |
g_signal_connect(self->vnc, "vnc-auth-credential",
|
410 | 410 |
G_CALLBACK(virt_viewer_session_vnc_auth_credential), session);
|
411 | 411 |
|
412 | 412 |
}
|
|
414 | 414 |
VirtViewerSession *
|
415 | 415 |
virt_viewer_session_vnc_new(VirtViewerApp *app, GtkWindow *main_window)
|
416 | 416 |
{
|
417 | |
VirtViewerSessionVnc *session;
|
418 | |
|
419 | |
session = g_object_new(VIRT_VIEWER_TYPE_SESSION_VNC, "app", app, NULL);
|
420 | |
|
421 | |
session->priv->vnc = VNC_DISPLAY(vnc_display_new());
|
422 | |
g_object_ref_sink(session->priv->vnc);
|
423 | |
session->priv->main_window = g_object_ref(main_window);
|
424 | |
|
425 | |
vnc_display_set_shared_flag(session->priv->vnc,
|
|
417 |
VirtViewerSessionVnc *self;
|
|
418 |
|
|
419 |
self = g_object_new(VIRT_VIEWER_TYPE_SESSION_VNC, "app", app, NULL);
|
|
420 |
|
|
421 |
self->vnc = VNC_DISPLAY(vnc_display_new());
|
|
422 |
g_object_ref_sink(self->vnc);
|
|
423 |
self->main_window = g_object_ref(main_window);
|
|
424 |
|
|
425 |
vnc_display_set_shared_flag(self->vnc,
|
426 | 426 |
virt_viewer_app_get_shared(app));
|
427 | 427 |
|
428 | |
g_signal_connect(session->priv->vnc, "vnc-connected",
|
429 | |
G_CALLBACK(virt_viewer_session_vnc_connected), session);
|
430 | |
g_signal_connect(session->priv->vnc, "vnc-initialized",
|
431 | |
G_CALLBACK(virt_viewer_session_vnc_initialized), session);
|
432 | |
g_signal_connect(session->priv->vnc, "vnc-disconnected",
|
433 | |
G_CALLBACK(virt_viewer_session_vnc_disconnected), session);
|
434 | |
g_signal_connect(session->priv->vnc, "vnc-error",
|
435 | |
G_CALLBACK(virt_viewer_session_vnc_error), session);
|
436 | |
|
437 | |
g_signal_connect(session->priv->vnc, "vnc-bell",
|
438 | |
G_CALLBACK(virt_viewer_session_vnc_bell), session);
|
439 | |
g_signal_connect(session->priv->vnc, "vnc-auth-failure",
|
440 | |
G_CALLBACK(virt_viewer_session_vnc_auth_failure), session);
|
441 | |
g_signal_connect(session->priv->vnc, "vnc-auth-unsupported",
|
442 | |
G_CALLBACK(virt_viewer_session_vnc_auth_unsupported), session);
|
443 | |
g_signal_connect(session->priv->vnc, "vnc-server-cut-text",
|
444 | |
G_CALLBACK(virt_viewer_session_vnc_cut_text), session);
|
445 | |
|
446 | |
g_signal_connect(session->priv->vnc, "vnc-auth-credential",
|
447 | |
G_CALLBACK(virt_viewer_session_vnc_auth_credential), session);
|
448 | |
|
449 | |
return VIRT_VIEWER_SESSION(session);
|
|
428 |
g_signal_connect(self->vnc, "vnc-connected",
|
|
429 |
G_CALLBACK(virt_viewer_session_vnc_connected), self);
|
|
430 |
g_signal_connect(self->vnc, "vnc-initialized",
|
|
431 |
G_CALLBACK(virt_viewer_session_vnc_initialized), self);
|
|
432 |
g_signal_connect(self->vnc, "vnc-disconnected",
|
|
433 |
G_CALLBACK(virt_viewer_session_vnc_disconnected), self);
|
|
434 |
g_signal_connect(self->vnc, "vnc-error",
|
|
435 |
G_CALLBACK(virt_viewer_session_vnc_error), self);
|
|
436 |
|
|
437 |
g_signal_connect(self->vnc, "vnc-bell",
|
|
438 |
G_CALLBACK(virt_viewer_session_vnc_bell), self);
|
|
439 |
g_signal_connect(self->vnc, "vnc-auth-failure",
|
|
440 |
G_CALLBACK(virt_viewer_session_vnc_auth_failure), self);
|
|
441 |
g_signal_connect(self->vnc, "vnc-auth-unsupported",
|
|
442 |
G_CALLBACK(virt_viewer_session_vnc_auth_unsupported), self);
|
|
443 |
g_signal_connect(self->vnc, "vnc-server-cut-text",
|
|
444 |
G_CALLBACK(virt_viewer_session_vnc_cut_text), self);
|
|
445 |
|
|
446 |
g_signal_connect(self->vnc, "vnc-auth-credential",
|
|
447 |
G_CALLBACK(virt_viewer_session_vnc_auth_credential), self);
|
|
448 |
|
|
449 |
return VIRT_VIEWER_SESSION(self);
|
450 | 450 |
}
|
451 | 451 |
|
452 | 452 |
/*
|