37 #define XSPICE_DEFAULT_PORT 5900 56 #ifdef SPICE_GTK_CHECK_VERSION 57 # if SPICE_GTK_CHECK_VERSION(0, 31, 0) 70 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
73 gpdata->
session = spice_session_new();
74 g_signal_connect(gpdata->
session,
80 "password", g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"password")),
81 "read-only", remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE),
82 "enable-audio", remmina_plugin_service->
file_get_int(remminafile,
"enableaudio", FALSE),
83 "enable-smartcard", remmina_plugin_service->
file_get_int(remminafile,
"sharesmartcard", FALSE),
84 "shared-dir", remmina_plugin_service->
file_get_string(remminafile,
"sharefolder"),
90 !remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE),
100 gchar *host, *tunnel;
116 g_object_set(gpdata->
session,
"host", host, NULL);
121 if (!remmina_plugin_service->
file_get_int(remminafile,
"usetls", FALSE)) {
122 g_object_set(gpdata->
session,
"port", g_strdup_printf(
"%i", port), NULL);
126 g_object_set(gpdata->
session,
"tls_port", g_strdup_printf(
"%i", port), NULL);
129 cacert = remmina_plugin_service->
file_get_string(remminafile,
"cacert");
131 g_object_set(gpdata->
session,
"ca-file", cacert, NULL);
135 spice_session_connect(gpdata->
session);
147 TRACE_CALL(__func__);
151 g_signal_handlers_disconnect_by_func(gpdata->
main_channel,
157 spice_session_disconnect(gpdata->
session);
158 g_object_unref(gpdata->
session);
163 #ifdef SPICE_GTK_CHECK_VERSION 164 # if SPICE_GTK_CHECK_VERSION(0, 31, 0) 176 TRACE_CALL(__func__);
182 g_object_get(channel,
"channel-id", &
id, NULL);
184 if (SPICE_IS_MAIN_CHANNEL(channel)) {
186 g_signal_connect(channel,
190 #ifdef SPICE_GTK_CHECK_VERSION 191 # if SPICE_GTK_CHECK_VERSION(0, 31, 0) 192 g_signal_connect(channel,
200 if (SPICE_IS_DISPLAY_CHANNEL(channel)) {
203 g_signal_connect(gpdata->
display,
210 if (SPICE_IS_PLAYBACK_CHANNEL(channel)) {
211 if (remmina_plugin_service->
file_get_int(remminafile,
"enableaudio", FALSE)) {
216 if (SPICE_IS_WEBDAV_CHANNEL(channel)) {
217 if (remmina_plugin_service->
file_get_string(remminafile,
"sharefolder")) {
218 spice_channel_connect(channel);
225 TRACE_CALL(__func__);
228 gboolean disablepasswordstoring;
235 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
239 _(
"Enter SPICE password"),
244 if (ret == GTK_RESPONSE_OK) {
248 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
250 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
256 g_object_set(gpdata->
session,
"password", s_password, NULL);
262 TRACE_CALL(__func__);
269 case SPICE_CHANNEL_CLOSED:
278 case SPICE_CHANNEL_OPENED:
280 case SPICE_CHANNEL_ERROR_AUTH:
289 case SPICE_CHANNEL_ERROR_TLS:
293 case SPICE_CHANNEL_ERROR_IO:
294 case SPICE_CHANNEL_ERROR_LINK:
295 case SPICE_CHANNEL_ERROR_CONNECT:
306 TRACE_CALL(__func__);
311 g_object_get(display,
"ready", &ready, NULL);
314 g_signal_handlers_disconnect_by_func(display,
318 g_object_set(display,
320 "resize-guest", remmina_plugin_service->
file_get_int(remminafile,
"resizeguest", FALSE),
322 gtk_container_add(GTK_CONTAINER(gp), GTK_WIDGET(display));
323 gtk_widget_show(GTK_WIDGET(display));
333 TRACE_CALL(__func__);
337 spice_display_send_keys(gpdata->
display,
340 SPICE_DISPLAY_KEY_EVENT_CLICK);
347 TRACE_CALL(__func__);
349 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
356 TRACE_CALL(__func__);
358 gint scale, width, height;
362 scale = remmina_plugin_service->
file_get_int(remminafile,
"scale", FALSE);
363 g_object_set(gpdata->
display,
"scaling", scale, NULL);
367 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
display), -1, -1 );
374 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
display), width, height);
380 TRACE_CALL(__func__);
387 TRACE_CALL(__func__);
392 switch (feature->
id) {
396 remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE),
402 remmina_plugin_service->
file_get_int(remminafile,
"resizeguest", TRUE),
408 !remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE),
482 N_(
"SPICE - Simple Protocol for Independent Computing Environments"),
485 "remmina-spice-symbolic",
486 "remmina-spice-ssh-symbolic",
500 G_MODULE_EXPORT gboolean
503 TRACE_CALL(__func__);
504 remmina_plugin_service = service;
506 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
507 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
static const RemminaProtocolFeature remmina_plugin_spice_features[]
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
static void remmina_plugin_spice_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
static RemminaProtocolPlugin remmina_plugin_spice
static void remmina_plugin_spice_main_channel_event_cb(SpiceChannel *, SpiceChannelEvent, RemminaProtocolWidget *)
SpiceDisplayChannel * display_channel
static gboolean remmina_plugin_spice_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
GHashTable * file_transfers
void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)
gboolean(* protocol_plugin_init_get_savepassword)(RemminaProtocolWidget *gp)
void remmina_plugin_spice_select_usb_devices(RemminaProtocolWidget *)
gboolean(* register_plugin)(RemminaPlugin *plugin)
static SoupSession * session
static gboolean remmina_plugin_spice_open_connection(RemminaProtocolWidget *gp)
void remmina_plugin_spice_file_transfer_new_cb(SpiceMainChannel *, SpiceFileTransferTask *, RemminaProtocolWidget *)
SpiceGtkSession * gtk_session
gint(* protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt)
static void remmina_plugin_spice_display_ready_cb(GObject *, GParamSpec *, RemminaProtocolWidget *)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
static const RemminaProtocolSetting remmina_plugin_spice_basic_settings[]
gchar *(* protocol_plugin_init_get_password)(RemminaProtocolWidget *gp)
static void remmina_plugin_spice_update_scale(RemminaProtocolWidget *)
static void remmina_plugin_spice_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)
static gboolean remmina_plugin_spice_ask_auth(RemminaProtocolWidget *gp)
SpiceMainChannel * main_channel
void(* file_set_string)(RemminaFile *remminafile, const gchar *setting, const gchar *value)
static const RemminaProtocolSetting remmina_plugin_spice_advanced_settings[]
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
gchar *(* protocol_plugin_start_direct_tunnel)(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
static void remmina_plugin_spice_channel_new_cb(SpiceSession *, SpiceChannel *, RemminaProtocolWidget *)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static void remmina_plugin_spice_send_ctrlaltdel(RemminaProtocolWidget *gp)
N_("Unable to connect to VNC server")
static void remmina_plugin_spice_init(RemminaProtocolWidget *gp)
static RemminaPluginService * remmina_plugin_service
static gboolean remmina_plugin_spice_close_connection(RemminaProtocolWidget *gp)