/*! * \brief Get the state variable with the name varName * \param varName Name of the state variable * \return An instance of ServiceProxyStateVariable containing information about the state variable */ ServiceProxyStateVariable ServiceIntrospection::variable(const QString &varName) const { Q_D(const ServiceIntrospection); ServiceProxyStateVariable var; auto stateVar = gupnp_service_introspection_get_state_variable(d->m_introspection, varName.toUtf8().constData()); if (stateVar != 0) { var.m_maximum = gValueToQVariant(&(stateVar->maximum)); auto it = stateVar->allowed_values; while (it != 0) { var.m_allowedValues << QString::fromUtf8((const char *)it->data); it = it->next; } } return var; }
static GHashTable * retrieve_out_action_arguments (GUPnPServiceIntrospection *introspection, GUPnPServiceActionInfo *action_info) { GHashTable *out_args; GList *arg_node; out_args = g_hash_table_new_full (g_str_hash, g_direct_equal, NULL, g_value_free); for (arg_node = action_info->arguments; arg_node; arg_node = arg_node->next) { GUPnPServiceActionArgInfo *arg_info; const GUPnPServiceStateVariableInfo *variable_info; GValue *value; arg_info = (GUPnPServiceActionArgInfo *) arg_node->data; if (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_IN) continue; variable_info = gupnp_service_introspection_get_state_variable ( introspection, arg_info->related_state_variable); value = g_slice_alloc0 (sizeof (GValue)); g_value_init (value, variable_info->type); g_hash_table_insert (out_args, arg_info->name, value); } return out_args; }
static GtkWidget * create_widget_for_argument (GUPnPServiceActionArgInfo *arg_info, GUPnPServiceIntrospection *introspection) { GtkWidget *widget; const GUPnPServiceStateVariableInfo *variable; GValue default_value; variable = gupnp_service_introspection_get_state_variable ( introspection, arg_info->related_state_variable); memset (&default_value, 0, sizeof (GValue)); if (variable->is_numeric) { GValue min, max, step; memset (&min, 0, sizeof (GValue)); memset (&max, 0, sizeof (GValue)); memset (&step, 0, sizeof (GValue)); g_value_init (&min, G_TYPE_DOUBLE); g_value_init (&max, G_TYPE_DOUBLE); g_value_init (&step, G_TYPE_DOUBLE); g_value_init (&default_value, G_TYPE_DOUBLE); g_value_transform (&variable->minimum, &min); g_value_transform (&variable->maximum, &max); g_value_transform (&variable->step, &step); g_value_transform (&variable->default_value, &default_value); widget = gtk_spin_button_new_with_range ( g_value_get_double (&min), g_value_get_double (&max), g_value_get_double (&step)); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (widget), g_value_get_double (&default_value)); if (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT) gtk_widget_set_sensitive (widget, FALSE); g_value_unset (&min); g_value_unset (&max); g_value_unset (&step); g_value_unset (&default_value); } else if (variable->type == G_TYPE_BOOLEAN) { gboolean active; widget = gtk_check_button_new (); active = g_value_get_boolean (&variable->default_value); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), active); if (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT) gtk_widget_set_sensitive (widget, FALSE); } else { const gchar *default_str; g_value_init (&default_value, G_TYPE_STRING); g_value_transform (&variable->default_value, &default_value); default_str = g_value_get_string (&default_value); /* Use a combobox if we are restricted to a list of values and * it's an input argument */ if (variable->allowed_values && arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_IN) { GList *node; gint index = 0; widget = gtk_combo_box_text_new (); for (node = variable->allowed_values; node; node = node->next) { gtk_combo_box_text_insert ( GTK_COMBO_BOX_TEXT (widget), index, NULL, (const char *) node->data); if (node == variable->allowed_values || (default_str != NULL && strcmp (default_str, node->data) == 0)) { gtk_combo_box_set_active ( GTK_COMBO_BOX (widget), index); } index++; } } else { GtkTextView *text_view; GtkTextBuffer *text_buffer; text_view = GTK_TEXT_VIEW (gtk_text_view_new ()); widget = gtk_scrolled_window_new (NULL, NULL); g_object_set (widget, "shadow-type", GTK_SHADOW_IN, "hscrollbar-policy", GTK_POLICY_AUTOMATIC, "vscrollbar-policy", GTK_POLICY_AUTOMATIC, "min-content-height", DEFAULT_TEXTVIEW_HEIGHT, NULL); gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (text_view)); gtk_text_view_set_wrap_mode (text_view, GTK_WRAP_CHAR); text_buffer = gtk_text_view_get_buffer (text_view); if (default_str != NULL) gtk_text_buffer_set_text (text_buffer, default_str, -1); if (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT) gtk_text_view_set_editable (text_view, FALSE); } g_value_unset (&default_value); } g_object_set_data_full (G_OBJECT (widget), "argument-name", g_strdup (arg_info->name), g_free); return widget; }
static void update_out_action_argument_widget (GtkWidget *arg_widget, GUPnPServiceIntrospection *introspection, GUPnPServiceActionInfo *action_info, GValue *value) { GUPnPServiceActionArgInfo *arg_info; const GUPnPServiceStateVariableInfo *variable_info; gchar *argument_name; g_assert (value != NULL); argument_name = g_object_get_data (G_OBJECT (arg_widget), "argument-name"); if (argument_name == NULL) return; arg_info = get_action_argument (action_info, argument_name); variable_info = gupnp_service_introspection_get_state_variable ( introspection, arg_info->related_state_variable); g_assert (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT); if (variable_info->is_numeric) { GValue double_value; gdouble num; memset (&double_value, 0, sizeof (GValue)); g_value_init (&double_value, G_TYPE_DOUBLE); g_value_transform (value, &double_value); num = g_value_get_double (&double_value); gtk_spin_button_set_value (GTK_SPIN_BUTTON (arg_widget), num); g_value_unset (&double_value); } else if (variable_info->type == G_TYPE_BOOLEAN) { gboolean active; active = g_value_get_boolean (value); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (arg_widget), active); } else { GValue str_value; const gchar *text; memset (&str_value, 0, sizeof (GValue)); g_value_init (&str_value, G_TYPE_STRING); g_value_transform (value, &str_value); text = g_value_get_string (&str_value); if (text != NULL) { GtkWidget *text_view; GtkTextBuffer *text_buffer; text_view = gtk_bin_get_child (GTK_BIN (arg_widget)); text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_set_text (text_buffer, text, -1); } g_value_unset (&str_value); } }
static gchar * get_action_arg_widget_info (GtkWidget *arg_widget, GUPnPServiceIntrospection *introspection, GUPnPServiceActionInfo *action_info, GValue **value) { GUPnPServiceActionArgInfo *arg_info; const GUPnPServiceStateVariableInfo *variable_info; gchar *arg_name; g_assert (value != NULL); arg_name = g_object_get_data (G_OBJECT (arg_widget), "argument-name"); if (arg_name == NULL) return NULL; arg_info = get_action_argument (action_info, arg_name); variable_info = gupnp_service_introspection_get_state_variable ( introspection, arg_info->related_state_variable); *value = g_slice_alloc0 (sizeof (GValue)); g_value_init (*value, variable_info->type); if (arg_info->direction == GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT) return arg_info->name; if (variable_info->is_numeric) { GValue double_value; gdouble num; memset (&double_value, 0, sizeof (GValue)); g_value_init (&double_value, G_TYPE_DOUBLE); num = gtk_spin_button_get_value (GTK_SPIN_BUTTON (arg_widget)); g_value_set_double (&double_value, num); g_value_transform (&double_value, *value); g_value_unset (&double_value); } else if (variable_info->type == G_TYPE_BOOLEAN) { gboolean active; active = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (arg_widget)); g_value_set_boolean (*value, active); } else { GValue str_value; memset (&str_value, 0, sizeof (GValue)); g_value_init (&str_value, G_TYPE_STRING); if (GTK_IS_SCROLLED_WINDOW (arg_widget)) { GtkWidget *text_view; GtkTextBuffer *text_buffer; GtkTextIter start, end; const gchar *text; text_view = gtk_bin_get_child (GTK_BIN (arg_widget)); text_buffer = gtk_text_view_get_buffer ( GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_bounds (text_buffer, &start, &end); text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE); g_value_set_string (&str_value, text); } else { gchar *text; text = gtk_combo_box_text_get_active_text ( GTK_COMBO_BOX_TEXT (arg_widget)); g_value_set_string (&str_value, text); g_free (text); } g_value_transform (&str_value, *value); g_value_unset (&str_value); } return arg_info->name; }