mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/virt-viewer
synced 2025-12-27 23:00:54 +00:00
Allow app_initial_connect() to raise an error
This commit is contained in:
parent
49c242f526
commit
13f493200c
@ -66,7 +66,7 @@ enum {
|
||||
|
||||
static gboolean remote_viewer_start(VirtViewerApp *self);
|
||||
#if HAVE_SPICE_GTK
|
||||
static int remote_viewer_activate(VirtViewerApp *self);
|
||||
static gboolean remote_viewer_activate(VirtViewerApp *self, GError **error);
|
||||
static void remote_viewer_window_added(VirtViewerApp *self, VirtViewerWindow *win);
|
||||
static void spice_foreign_menu_updated(RemoteViewer *self);
|
||||
#endif
|
||||
@ -236,8 +236,13 @@ static void
|
||||
spice_ctrl_do_connect(SpiceCtrlController *ctrl G_GNUC_UNUSED,
|
||||
VirtViewerApp *self)
|
||||
{
|
||||
if (virt_viewer_app_initial_connect(self) < 0) {
|
||||
virt_viewer_app_simple_message_dialog(self, _("Failed to initiate connection"));
|
||||
GError *error = NULL;
|
||||
|
||||
if (!virt_viewer_app_initial_connect(self, &error)) {
|
||||
const gchar *msg = error ? error->message :
|
||||
_("Failed to initiate connection");
|
||||
virt_viewer_app_simple_message_dialog(self, msg);
|
||||
g_clear_error(&error);
|
||||
}
|
||||
}
|
||||
|
||||
@ -558,19 +563,19 @@ spice_ctrl_listen_async_cb(GObject *object,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
remote_viewer_activate(VirtViewerApp *app)
|
||||
static gboolean
|
||||
remote_viewer_activate(VirtViewerApp *app, GError **error)
|
||||
{
|
||||
g_return_val_if_fail(REMOTE_VIEWER_IS(app), -1);
|
||||
g_return_val_if_fail(REMOTE_VIEWER_IS(app), FALSE);
|
||||
RemoteViewer *self = REMOTE_VIEWER(app);
|
||||
int ret = -1;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
if (self->priv->controller) {
|
||||
SpiceSession *session = remote_viewer_get_spice_session(self);
|
||||
ret = spice_session_connect(session);
|
||||
g_object_unref(session);
|
||||
} else {
|
||||
ret = VIRT_VIEWER_APP_CLASS(remote_viewer_parent_class)->activate(app);
|
||||
ret = VIRT_VIEWER_APP_CLASS(remote_viewer_parent_class)->activate(app, error);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -599,6 +604,7 @@ remote_viewer_start(VirtViewerApp *app)
|
||||
gboolean ret = FALSE;
|
||||
gchar *guri = NULL;
|
||||
gchar *type = NULL;
|
||||
GError *error = NULL;
|
||||
|
||||
#if HAVE_SPICE_GTK
|
||||
g_signal_connect(app, "notify", G_CALLBACK(app_notified), self);
|
||||
@ -631,7 +637,6 @@ remote_viewer_start(VirtViewerApp *app)
|
||||
|
||||
file = g_file_new_for_commandline_arg(guri);
|
||||
if (g_file_query_exists(file, NULL)) {
|
||||
GError *error = NULL;
|
||||
gchar *path = g_file_get_path(file);
|
||||
vvfile = virt_viewer_file_new(path, &error);
|
||||
g_free(path);
|
||||
@ -654,8 +659,12 @@ remote_viewer_start(VirtViewerApp *app)
|
||||
|
||||
virt_viewer_session_set_file(virt_viewer_app_get_session(app), vvfile);
|
||||
|
||||
if (virt_viewer_app_initial_connect(app) < 0) {
|
||||
virt_viewer_app_simple_message_dialog(app, _("Failed to initiate connection"));
|
||||
if (!virt_viewer_app_initial_connect(app, &error)) {
|
||||
const gchar *msg = error ? error->message :
|
||||
_("Failed to initiate connection");
|
||||
|
||||
virt_viewer_app_simple_message_dialog(app, msg);
|
||||
g_clear_error(&error);
|
||||
goto cleanup;
|
||||
}
|
||||
#if HAVE_SPICE_GTK
|
||||
|
||||
@ -860,14 +860,14 @@ virt_viewer_app_channel_open(VirtViewerSession *session G_GNUC_UNUSED,
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
virt_viewer_app_default_activate(VirtViewerApp *self)
|
||||
static gboolean
|
||||
virt_viewer_app_default_activate(VirtViewerApp *self, GError **error)
|
||||
{
|
||||
VirtViewerAppPrivate *priv = self->priv;
|
||||
int fd = -1;
|
||||
|
||||
if (!virt_viewer_app_open_connection(self, &fd))
|
||||
return -1;
|
||||
return FALSE;
|
||||
|
||||
DEBUG_LOG("After open connection callback fd=%d", fd);
|
||||
|
||||
@ -897,12 +897,12 @@ virt_viewer_app_default_activate(VirtViewerApp *self)
|
||||
if ((fd = virt_viewer_app_open_tunnel_ssh(priv->host, priv->port,
|
||||
priv->user, priv->ghost,
|
||||
priv->gport, priv->unixsock)) < 0)
|
||||
return -1;
|
||||
return FALSE;
|
||||
} else if (priv->unixsock && fd == -1) {
|
||||
virt_viewer_app_trace(self, "Opening direct UNIX connection to display at %s",
|
||||
priv->unixsock);
|
||||
if ((fd = virt_viewer_app_open_unix_sock(priv->unixsock)) < 0)
|
||||
return -1;
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -910,7 +910,7 @@ virt_viewer_app_default_activate(VirtViewerApp *self)
|
||||
return virt_viewer_session_open_fd(VIRT_VIEWER_SESSION(priv->session), fd);
|
||||
} else if (priv->guri) {
|
||||
virt_viewer_app_trace(self, "Opening connection to display at %s", priv->guri);
|
||||
return virt_viewer_session_open_uri(VIRT_VIEWER_SESSION(priv->session), priv->guri);
|
||||
return virt_viewer_session_open_uri(VIRT_VIEWER_SESSION(priv->session), priv->guri, error);
|
||||
} else {
|
||||
virt_viewer_app_trace(self, "Opening direct TCP connection to display at %s:%s:%s",
|
||||
priv->ghost, priv->gport, priv->gtlsport ? priv->gtlsport : "-1");
|
||||
@ -918,24 +918,24 @@ virt_viewer_app_default_activate(VirtViewerApp *self)
|
||||
priv->ghost, priv->gport, priv->gtlsport);
|
||||
}
|
||||
|
||||
return -1;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int
|
||||
virt_viewer_app_activate(VirtViewerApp *self)
|
||||
gboolean
|
||||
virt_viewer_app_activate(VirtViewerApp *self, GError **error)
|
||||
{
|
||||
VirtViewerAppPrivate *priv;
|
||||
int ret;
|
||||
gboolean ret;
|
||||
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), -1);
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
||||
|
||||
priv = self->priv;
|
||||
if (priv->active)
|
||||
return -1;
|
||||
return FALSE;
|
||||
|
||||
ret = VIRT_VIEWER_APP_GET_CLASS(self)->activate(self);
|
||||
ret = VIRT_VIEWER_APP_GET_CLASS(self)->activate(self, error);
|
||||
|
||||
if (ret == -1) {
|
||||
if (ret == FALSE) {
|
||||
priv->connected = FALSE;
|
||||
} else {
|
||||
virt_viewer_app_show_status(self, _("Connecting to graphic server"));
|
||||
@ -1004,21 +1004,21 @@ static void virt_viewer_app_bell(VirtViewerSession *session G_GNUC_UNUSED,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virt_viewer_app_default_initial_connect(VirtViewerApp *self)
|
||||
static gboolean
|
||||
virt_viewer_app_default_initial_connect(VirtViewerApp *self, GError **error)
|
||||
{
|
||||
return virt_viewer_app_activate(self);
|
||||
return virt_viewer_app_activate(self, error);
|
||||
}
|
||||
|
||||
int
|
||||
virt_viewer_app_initial_connect(VirtViewerApp *self)
|
||||
gboolean
|
||||
virt_viewer_app_initial_connect(VirtViewerApp *self, GError **error)
|
||||
{
|
||||
VirtViewerAppClass *klass;
|
||||
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), -1);
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
||||
klass = VIRT_VIEWER_APP_GET_CLASS(self);
|
||||
|
||||
return klass->initial_connect(self);
|
||||
return klass->initial_connect(self, error);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -1026,7 +1026,7 @@ virt_viewer_app_retryauth(gpointer opaque)
|
||||
{
|
||||
VirtViewerApp *self = opaque;
|
||||
|
||||
virt_viewer_app_initial_connect(self);
|
||||
virt_viewer_app_initial_connect(self, NULL);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -1040,7 +1040,7 @@ virt_viewer_app_connect_timer(void *opaque)
|
||||
DEBUG_LOG("Connect timer fired");
|
||||
|
||||
if (!priv->active &&
|
||||
virt_viewer_app_initial_connect(self) < 0)
|
||||
virt_viewer_app_initial_connect(self, NULL) < 0)
|
||||
gtk_main_quit();
|
||||
|
||||
if (priv->active) {
|
||||
|
||||
@ -52,8 +52,8 @@ typedef struct {
|
||||
|
||||
/*< private >*/
|
||||
gboolean (*start) (VirtViewerApp *self);
|
||||
int (*initial_connect) (VirtViewerApp *self);
|
||||
int (*activate) (VirtViewerApp *self);
|
||||
gboolean (*initial_connect) (VirtViewerApp *self, GError **error);
|
||||
gboolean (*activate) (VirtViewerApp *self, GError **error);
|
||||
void (*deactivated) (VirtViewerApp *self);
|
||||
gboolean (*open_connection)(VirtViewerApp *self, int *fd);
|
||||
} VirtViewerAppClass;
|
||||
@ -71,8 +71,8 @@ void virt_viewer_app_simple_message_dialog(VirtViewerApp *self, const char *fmt,
|
||||
gboolean virt_viewer_app_is_active(VirtViewerApp *app);
|
||||
void virt_viewer_app_free_connect_info(VirtViewerApp *self);
|
||||
int virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type);
|
||||
int virt_viewer_app_activate(VirtViewerApp *self);
|
||||
int virt_viewer_app_initial_connect(VirtViewerApp *self);
|
||||
gboolean virt_viewer_app_activate(VirtViewerApp *self, GError **error);
|
||||
gboolean virt_viewer_app_initial_connect(VirtViewerApp *self, GError **error);
|
||||
void virt_viewer_app_start_reconnect_poll(VirtViewerApp *self);
|
||||
void virt_viewer_app_set_zoom_level(VirtViewerApp *self, gint zoom_level);
|
||||
void virt_viewer_app_set_direct(VirtViewerApp *self, gboolean direct);
|
||||
|
||||
@ -64,7 +64,7 @@ enum {
|
||||
static void virt_viewer_session_spice_close(VirtViewerSession *session);
|
||||
static gboolean virt_viewer_session_spice_open_fd(VirtViewerSession *session, int fd);
|
||||
static gboolean virt_viewer_session_spice_open_host(VirtViewerSession *session, const gchar *host, const gchar *port, const gchar *tlsport);
|
||||
static gboolean virt_viewer_session_spice_open_uri(VirtViewerSession *session, const gchar *uri);
|
||||
static gboolean virt_viewer_session_spice_open_uri(VirtViewerSession *session, const gchar *uri, GError **error);
|
||||
static gboolean virt_viewer_session_spice_channel_open_fd(VirtViewerSession *session, VirtViewerSessionChannel *channel, int fd);
|
||||
static gboolean virt_viewer_session_spice_has_usb(VirtViewerSession *session);
|
||||
static void virt_viewer_session_spice_usb_device_selection(VirtViewerSession *session, GtkWindow *parent);
|
||||
@ -342,7 +342,7 @@ fill_session(VirtViewerFile *file, SpiceSession *session)
|
||||
|
||||
static gboolean
|
||||
virt_viewer_session_spice_open_uri(VirtViewerSession *session,
|
||||
const gchar *uri)
|
||||
const gchar *uri, GError **error)
|
||||
{
|
||||
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
|
||||
VirtViewerFile *file = virt_viewer_session_get_file(session);
|
||||
|
||||
@ -44,7 +44,7 @@ struct _VirtViewerSessionVncPrivate {
|
||||
static void virt_viewer_session_vnc_close(VirtViewerSession* session);
|
||||
static gboolean virt_viewer_session_vnc_open_fd(VirtViewerSession* session, int fd);
|
||||
static gboolean virt_viewer_session_vnc_open_host(VirtViewerSession* session, const gchar *host, const gchar *port, const gchar *tlsport);
|
||||
static gboolean virt_viewer_session_vnc_open_uri(VirtViewerSession* session, const gchar *uri);
|
||||
static gboolean virt_viewer_session_vnc_open_uri(VirtViewerSession* session, const gchar *uri, GError **error);
|
||||
static gboolean virt_viewer_session_vnc_channel_open_fd(VirtViewerSession* session,
|
||||
VirtViewerSessionChannel* channel, int fd);
|
||||
|
||||
@ -198,7 +198,8 @@ virt_viewer_session_vnc_open_host(VirtViewerSession* session,
|
||||
|
||||
static gboolean
|
||||
virt_viewer_session_vnc_open_uri(VirtViewerSession* session,
|
||||
const gchar *uristr)
|
||||
const gchar *uristr,
|
||||
GError **error)
|
||||
{
|
||||
VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(session);
|
||||
VirtViewerFile *file = virt_viewer_session_get_file(session);
|
||||
|
||||
@ -374,7 +374,7 @@ gboolean virt_viewer_session_open_host(VirtViewerSession *session, const gchar *
|
||||
return klass->open_host(session, host, port, tlsport);
|
||||
}
|
||||
|
||||
gboolean virt_viewer_session_open_uri(VirtViewerSession *session, const gchar *uri)
|
||||
gboolean virt_viewer_session_open_uri(VirtViewerSession *session, const gchar *uri, GError **error)
|
||||
{
|
||||
VirtViewerSessionClass *klass;
|
||||
|
||||
@ -385,7 +385,7 @@ gboolean virt_viewer_session_open_uri(VirtViewerSession *session, const gchar *u
|
||||
|
||||
session->priv->uri = g_strdup(uri);
|
||||
|
||||
return klass->open_uri(session, uri);
|
||||
return klass->open_uri(session, uri, error);
|
||||
}
|
||||
|
||||
const gchar* virt_viewer_session_mime_type(VirtViewerSession *self)
|
||||
|
||||
@ -68,7 +68,7 @@ struct _VirtViewerSessionClass {
|
||||
void (* close) (VirtViewerSession* session);
|
||||
gboolean (* open_fd) (VirtViewerSession* session, int fd);
|
||||
gboolean (* open_host) (VirtViewerSession* session, const gchar *host, const gchar *port, const gchar *tlsport);
|
||||
gboolean (* open_uri) (VirtViewerSession* session, const gchar *uri);
|
||||
gboolean (* open_uri) (VirtViewerSession* session, const gchar *uri, GError **error);
|
||||
gboolean (* channel_open_fd) (VirtViewerSession* session, VirtViewerSessionChannel *channel, int fd);
|
||||
gboolean (* has_usb) (VirtViewerSession* session);
|
||||
void (* usb_device_selection) (VirtViewerSession* session, GtkWindow *parent);
|
||||
@ -114,7 +114,7 @@ gboolean virt_viewer_session_open_host(VirtViewerSession* session, const gchar *
|
||||
GObject* virt_viewer_session_get(VirtViewerSession* session);
|
||||
gboolean virt_viewer_session_channel_open_fd(VirtViewerSession* session,
|
||||
VirtViewerSessionChannel* channel, int fd);
|
||||
gboolean virt_viewer_session_open_uri(VirtViewerSession *session, const gchar *uri);
|
||||
gboolean virt_viewer_session_open_uri(VirtViewerSession *session, const gchar *uri, GError **error);
|
||||
|
||||
void virt_viewer_session_set_auto_usbredir(VirtViewerSession* session, gboolean auto_usbredir);
|
||||
gboolean virt_viewer_session_get_auto_usbredir(VirtViewerSession* session);
|
||||
|
||||
@ -63,7 +63,7 @@ G_DEFINE_TYPE (VirtViewer, virt_viewer, VIRT_VIEWER_TYPE_APP)
|
||||
#define GET_PRIVATE(o) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((o), VIRT_VIEWER_TYPE, VirtViewerPrivate))
|
||||
|
||||
static int virt_viewer_initial_connect(VirtViewerApp *self);
|
||||
static gboolean virt_viewer_initial_connect(VirtViewerApp *self, GError **error);
|
||||
static gboolean virt_viewer_open_connection(VirtViewerApp *self, int *fd);
|
||||
static void virt_viewer_deactivated(VirtViewerApp *self);
|
||||
static gboolean virt_viewer_start(VirtViewerApp *self);
|
||||
@ -406,7 +406,7 @@ virt_viewer_extract_connect_info(VirtViewer *self,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
virt_viewer_update_display(VirtViewer *self, virDomainPtr dom)
|
||||
{
|
||||
VirtViewerPrivate *priv = self->priv;
|
||||
@ -424,10 +424,10 @@ virt_viewer_update_display(VirtViewer *self, virDomainPtr dom)
|
||||
|
||||
if (!virt_viewer_app_has_session(app)) {
|
||||
if (!virt_viewer_extract_connect_info(self, dom))
|
||||
return -1;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -469,6 +469,7 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED,
|
||||
{
|
||||
VirtViewer *self = opaque;
|
||||
VirtViewerApp *app = VIRT_VIEWER_APP(self);
|
||||
GError *error = NULL;
|
||||
|
||||
DEBUG_LOG("Got domain event %d %d", event, detail);
|
||||
|
||||
@ -482,7 +483,13 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED,
|
||||
|
||||
case VIR_DOMAIN_EVENT_STARTED:
|
||||
virt_viewer_update_display(self, dom);
|
||||
virt_viewer_app_activate(app);
|
||||
virt_viewer_app_activate(app, &error);
|
||||
if (error) {
|
||||
/* we may want to consolidate error reporting in
|
||||
app_activate() instead */
|
||||
g_warning("%s", error->message);
|
||||
g_clear_error(&error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -508,16 +515,15 @@ virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED,
|
||||
|
||||
static int virt_viewer_connect(VirtViewerApp *app);
|
||||
|
||||
static int
|
||||
virt_viewer_initial_connect(VirtViewerApp *app)
|
||||
static gboolean
|
||||
virt_viewer_initial_connect(VirtViewerApp *app, GError **error)
|
||||
{
|
||||
virDomainPtr dom = NULL;
|
||||
virDomainInfo info;
|
||||
int ret = -1;
|
||||
gboolean ret = FALSE;
|
||||
VirtViewer *self = VIRT_VIEWER(app);
|
||||
VirtViewerPrivate *priv = self->priv;
|
||||
|
||||
|
||||
DEBUG_LOG("initial connect");
|
||||
|
||||
if (!priv->conn &&
|
||||
@ -552,9 +558,9 @@ virt_viewer_initial_connect(VirtViewerApp *app)
|
||||
virt_viewer_app_show_status(app, _("Waiting for guest domain to start"));
|
||||
} else {
|
||||
ret = virt_viewer_update_display(self, dom);
|
||||
if (ret >= 0)
|
||||
ret = VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->initial_connect(app);
|
||||
if (ret < 0) {
|
||||
if (ret)
|
||||
ret = VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->initial_connect(app, error);
|
||||
if (!ret) {
|
||||
if (priv->waitvm) {
|
||||
virt_viewer_app_show_status(app, _("Waiting for guest domain to start server"));
|
||||
virt_viewer_app_trace(app, "Guest %s has not activated its display yet, waiting for it to start",
|
||||
@ -563,15 +569,11 @@ virt_viewer_initial_connect(VirtViewerApp *app)
|
||||
DEBUG_LOG("Failed to activate viewer");
|
||||
goto cleanup;
|
||||
}
|
||||
} else if (ret == 0) {
|
||||
DEBUG_LOG("Failed to activate viewer");
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
ret = 0;
|
||||
ret = TRUE;
|
||||
cleanup:
|
||||
if (dom)
|
||||
virDomainFree(dom);
|
||||
@ -660,6 +662,7 @@ virt_viewer_connect(VirtViewerApp *app)
|
||||
.cbdata = app,
|
||||
};
|
||||
int oflags = 0;
|
||||
GError *error = NULL;
|
||||
|
||||
if (!virt_viewer_app_get_attach(app))
|
||||
oflags |= VIR_CONNECT_RO;
|
||||
@ -678,8 +681,12 @@ virt_viewer_connect(VirtViewerApp *app)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virt_viewer_app_initial_connect(app) < 0)
|
||||
if (!virt_viewer_app_initial_connect(app, &error)) {
|
||||
if (error)
|
||||
g_warning(error->message);
|
||||
g_clear_error(&error);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virConnectDomainEventRegister(priv->conn,
|
||||
virt_viewer_domain_event,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user