示例#1
0
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);
}
示例#3
0
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);
}