Have the frame_tvbuff.c routines not use the global cfile.
[metze/wireshark/wip.git] / ui / gtk / manual_addr_resolv.c
1 /* manual_addr_resolv.c
2  * Dialog box for manual address resolve
3  * Copyright 2010 Stig Bjorlykke <stig@bjorlykke.org>
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23
24 #include "config.h"
25
26 #include <string.h>
27
28 #include <gtk/gtk.h>
29
30 #include "epan/addr_resolv.h"
31
32 #include "ui/gtk/old-gtk-compat.h"
33 #include "ui/gtk/dlg_utils.h"
34 #include "ui/gtk/gui_utils.h"
35 #include "ui/gtk/help_dlg.h"
36 #include "ui/gtk/main.h"
37 #include "ui/gtk/menus.h"
38 #include "ui/gtk/manual_addr_resolv.h"
39 #include "ui/gtk/packet_win.h"
40 #include "simple_dialog.h"
41
42 #include "globals.h"
43
44 GtkWidget *man_addr_resolv_dlg = NULL;
45
46 static void
47 man_addr_ill_addr_cb(gpointer dialog _U_, gint btn _U_, gpointer data _U_)
48 {
49   gtk_window_present(GTK_WINDOW(man_addr_resolv_dlg));
50 }
51
52 static void
53 man_addr_resolv_ok(GtkWidget *w _U_, gpointer data _U_)
54 {
55   GtkWidget   *addr_cb, *name_te, *resolv_cb;
56   const gchar *name;
57   gchar       *addr;
58   gboolean     active, redissect = FALSE;
59
60   addr_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "address");
61   name_te = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "name");
62
63   addr = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(addr_cb));
64   name = gtk_entry_get_text(GTK_ENTRY(name_te));
65
66   if (strlen(addr) && strlen(name)) {
67     if (!cf_add_ip_name_from_string(&cfile, addr, name)) {
68       GtkWidget *dialog = (GtkWidget *)simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
69                                         "Illegal IP address: \"%s\".", addr);
70       simple_dialog_set_cb(dialog, man_addr_ill_addr_cb, NULL);
71       g_free(addr);
72       return;
73     } else {
74       redissect = TRUE;
75       main_update_for_unsaved_changes(&cfile);
76     }
77   }
78   g_free(addr);
79
80   resolv_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "resolv");
81   active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(resolv_cb));
82   if (!gbl_resolv_flags.network_name && active) {
83     /* Name resolution for Network Layer activated */
84     gbl_resolv_flags.network_name = TRUE;
85     menu_name_resolution_changed();
86     redissect = TRUE;
87   }
88
89   if (redissect) {
90     redissect_packets();
91     redissect_all_packet_windows();
92   }
93   window_destroy(man_addr_resolv_dlg);
94   man_addr_resolv_dlg = NULL;
95 }
96
97 static void
98 changed_cb(GtkWidget *w _U_, GtkWidget *ok_bt)
99 {
100   const gchar *name;
101   gchar       *addr;
102   GtkWidget   *addr_cb, *name_cb, *resolv_cb;
103   gboolean     active;
104
105   name_cb   = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "name");
106   addr_cb   = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "address");
107   resolv_cb = (GtkWidget *)g_object_get_data(G_OBJECT(man_addr_resolv_dlg), "resolv");
108
109   name   = gtk_entry_get_text(GTK_ENTRY(name_cb));
110   addr   = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(addr_cb));
111   active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(resolv_cb));
112
113   gtk_widget_set_sensitive(ok_bt, strlen(name) > 0 && strlen(addr) && active ? TRUE : FALSE);
114   g_free(addr);
115 }
116
117 void
118 manual_addr_resolv_dlg(GtkWidget *w _U_, gpointer data)
119 {
120   GtkWidget *vbox, *bbox, *grid, *sep;
121   GtkWidget *ok_bt, *close_bt, *help_bt;
122   GtkWidget *addr_lb, *addr_cb;
123   GtkWidget *name_lb, *name_te, *resolv_cb;
124   GList     *addr_list = NULL;
125
126   man_addr_resolv_dlg = dlg_window_new("Manual Address Resolve");
127   gtk_window_set_default_size(GTK_WINDOW(man_addr_resolv_dlg), 310, 80);
128
129   vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
130   gtk_container_add(GTK_CONTAINER(man_addr_resolv_dlg), vbox);
131   gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
132
133   grid = ws_gtk_grid_new();
134   gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
135
136   addr_lb = gtk_label_new("Address:");
137   ws_gtk_grid_attach_defaults(GTK_GRID(grid), addr_lb, 0, 0, 1, 1);
138
139   addr_cb = gtk_combo_box_text_new_with_entry();
140   if (data) {
141     GList *addr_entry;
142     addr_list = get_ip_address_list_from_packet_list_row(data);
143     for (addr_entry = addr_list; addr_entry != NULL; addr_entry = g_list_next(addr_entry)) {
144       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(addr_cb), (const gchar *)addr_entry->data);
145       g_free(addr_entry->data);
146     }
147     g_list_free(addr_entry);
148     gtk_combo_box_set_active(GTK_COMBO_BOX(addr_cb), 0);
149   }
150   ws_gtk_grid_attach_defaults(GTK_GRID(grid), addr_cb, 1, 0, 1, 1);
151   g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "address", addr_cb);
152
153   name_lb = gtk_label_new("Name:");
154   ws_gtk_grid_attach_defaults(GTK_GRID(grid), name_lb, 0, 1, 1, 1);
155
156   name_te = gtk_entry_new();
157   ws_gtk_grid_attach_defaults(GTK_GRID(grid), name_te, 1, 1, 1, 1);
158   g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "name", name_te);
159
160   sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
161   gtk_box_pack_start(GTK_BOX(vbox), sep, TRUE, TRUE, 0);
162
163   resolv_cb = gtk_check_button_new_with_mnemonic("Enable network name resolution");
164   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb), gbl_resolv_flags.network_name);
165   gtk_widget_set_sensitive(resolv_cb, !gbl_resolv_flags.network_name);
166
167   gtk_widget_set_tooltip_text(resolv_cb, "Perform network layer name resolution.");
168   g_object_set_data(G_OBJECT(man_addr_resolv_dlg), "resolv", resolv_cb);
169   gtk_box_pack_start(GTK_BOX(vbox), resolv_cb, TRUE, TRUE, 0);
170
171   /* Button row. */
172   bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
173   gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
174
175   ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK);
176   g_signal_connect(ok_bt, "clicked", G_CALLBACK(man_addr_resolv_ok), NULL);
177   gtk_widget_set_sensitive(ok_bt, FALSE);
178
179   g_signal_connect(name_te, "changed", G_CALLBACK(changed_cb), ok_bt);
180   g_signal_connect(addr_cb, "changed", G_CALLBACK(changed_cb), ok_bt);
181   g_signal_connect(resolv_cb, "toggled", G_CALLBACK(changed_cb), ok_bt);
182   dlg_set_activate(name_te, ok_bt);
183
184   close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
185   window_set_cancel_button(man_addr_resolv_dlg, close_bt, window_cancel_button_cb);
186
187   help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
188   g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_MANUAL_ADDR_RESOLVE_DIALOG);
189
190   gtk_widget_grab_default(ok_bt);
191   g_signal_connect(man_addr_resolv_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
192
193   if (addr_list) {
194     /* We have column data, activate name box */
195     gtk_widget_grab_focus(name_te);
196   }
197   gtk_widget_show_all(man_addr_resolv_dlg);
198   window_present(man_addr_resolv_dlg);
199 }
200
201 /*
202  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
203  *
204  * Local Variables:
205  * c-basic-offset: 2
206  * tab-width: 8
207  * indent-tabs-mode: nil
208  * End:
209  *
210  * vi: set shiftwidth=2 tabstop=8 expandtab:
211  * :indentSize=2:tabSize=8:noTabs=true:
212  */