static void _external_ip_address_changed (GUPnPServiceProxy *proxy, const gchar *variable, GValue *value, gpointer user_data) { struct Proxy *prox = user_data; gchar *new_ip; guint i; g_return_if_fail (G_VALUE_HOLDS_STRING(value)); /* It hasn't really changed, ignore it */ if (prox->external_ip && !strcmp (g_value_get_string (value), prox->external_ip)) return; /* Ignore invalid external IP address */ if (!validate_ip_address (g_value_get_string (value))) return; new_ip = g_value_dup_string (value); for (i=0; i < prox->proxymappings->len; i++) { struct ProxyMapping *pm = g_ptr_array_index (prox->proxymappings, i); if (pm->mapped) g_signal_emit (prox->parent, signals[SIGNAL_MAPPED_EXTERNAL_PORT], 0, pm->mapping->protocol, new_ip, prox->external_ip, pm->actual_external_port, pm->mapping->local_ip, pm->mapping->local_port, pm->mapping->description); } g_free (prox->external_ip); prox->external_ip = new_ip; }
void cell_edited_callback(GtkCellRendererText *cell, const gchar *path_string, gchar *new_text, gpointer data) { GtkTreeModel *model = (GtkTreeModel *)data; GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; GtkTreeIter iter_name; gchar *col_name; char new_ip[20]; strcpy(new_ip, new_text); gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column")); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get_iter(model, &iter_name, path); gtk_tree_model_get(model, &iter_name, 0, &col_name, -1); switch (column) { case COLUMN_VALUE: { uint i = 0, index_offset = 0; gchar *old_text; gtk_tree_model_get(model, &iter, column, &old_text, -1); if (0 == strcmp(col_name, pktgen_ethernet_fields[3])) if ((atoi(new_text) > 4096) || (atoi(new_text) < 1)) { GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(stream_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Invalid VLAN Id! It should be [1-4095]"); gtk_window_set_title(GTK_WINDOW(dialog), "Pktgen"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } if ((0 == strcmp(col_name, pktgen_ipv4_fields[9])) || (0 == strcmp(col_name, pktgen_ipv4_fields[10])) ) if (!validate_ip_address(new_ip)) { GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(stream_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "The given IP is not a valid IP address!"); gtk_window_set_title(GTK_WINDOW(dialog), "Pktgen"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } /* Validate the MAC address */ if ((0 == strcmp(col_name, pktgen_ethernet_fields[0])) || (0 == strcmp(col_name, pktgen_ethernet_fields[1])) ) { if (12 == strlen(new_text)) { gchar *ch; for (i = 0; i < strlen(new_text); i++) { ch = (new_text + i); if ((*ch >= 'a' && *ch <= 'f') || (*ch >= 'A' && *ch <= 'F') || (*ch >= '0' && *ch <= '9')) continue; else { GtkWidget *dialog; dialog = gtk_message_dialog_new( GTK_WINDOW(stream_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Please input only hex values[0-9][a-f], special characters are not allowed!"); gtk_window_set_title(GTK_WINDOW(dialog), "Pktgen"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } } } else { GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(stream_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Please input 6 bytes of MAC address in hex pattern [e.g. 012345abcdef]"); gtk_window_set_title(GTK_WINDOW(dialog), "Pktgen"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } } if ((0 != strcmp(old_text, "<auto>")) && (0 != strcmp(old_text, "IPv4")) && (0 != strcmp(old_text, "UDP")) ) { g_free(old_text); i = gtk_tree_path_get_indices(path)[0]; switch (gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))) { case 0: index_offset = 0; break; case 1: index_offset = 4; break; case 2: index_offset = 15; break; } g_free(g_array_index(packet_info, protocol, (i + index_offset)).value); g_array_index(packet_info, protocol, (i + index_offset)).value = g_strdup(new_text); gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, g_array_index(packet_info, protocol, (i + index_offset)).value, -1); } else { GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(stream_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Auto generated values can not be modified!"); gtk_window_set_title(GTK_WINDOW(dialog), "Pktgen"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } break; } gtk_tree_path_free(path); }
static void _service_proxy_got_external_ip_address (GUPnPServiceProxy *proxy, GUPnPServiceProxyAction *action, gpointer user_data) { struct Proxy *prox = user_data; GUPnPSimpleIgd *self = prox->parent; GError *error = NULL; gchar *ip = NULL; g_return_if_fail (prox->external_ip_action == action); prox->external_ip_action = NULL; if (gupnp_service_proxy_end_action (proxy, action, &error, "NewExternalIPAddress", G_TYPE_STRING, &ip, NULL)) { guint i; if (!validate_ip_address (ip)) { prox->external_ip_failed = TRUE; for (i=0; i < prox->proxymappings->len; i++) { struct ProxyMapping *pm = g_ptr_array_index (prox->proxymappings, i); GError gerror = {GUPNP_SIMPLE_IGD_ERROR, GUPNP_SIMPLE_IGD_ERROR_EXTERNAL_ADDRESS, "Invalid IP address returned by router" }; g_signal_emit (self, signals[SIGNAL_ERROR_MAPPING_PORT], GUPNP_SIMPLE_IGD_ERROR, &gerror, pm->mapping->protocol, pm->mapping->requested_external_port, pm->mapping->local_ip, pm->mapping->local_port, pm->mapping->description); } return; } /* Only emit the new signal if the IP changes */ if (prox->external_ip && strcmp (ip, prox->external_ip)) { for (i=0; i < prox->proxymappings->len; i++) { struct ProxyMapping *pm = g_ptr_array_index (prox->proxymappings, i); if (pm->mapped) g_signal_emit (self, signals[SIGNAL_MAPPED_EXTERNAL_PORT], 0, pm->mapping->protocol, ip, prox->external_ip, pm->actual_external_port, pm->mapping->local_ip, pm->mapping->local_port, pm->mapping->description); } } g_free (prox->external_ip); prox->external_ip = ip; } else { guint i; prox->external_ip_failed = TRUE; g_return_if_fail (error); for (i=0; i < prox->proxymappings->len; i++) { struct ProxyMapping *pm = g_ptr_array_index (prox->proxymappings, i); g_signal_emit (self, signals[SIGNAL_ERROR_MAPPING_PORT], error->domain, error, pm->mapping->protocol, pm->mapping->requested_external_port, pm->mapping->local_ip, pm->mapping->local_port, pm->mapping->description); } } g_clear_error (&error); }