5 * Giorgio Tino <giorgio.tino@cacetech.com>
6 * Copyright (c) CACE Technologies, LLC 2006
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 2000 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
35 #include <glib/gprintf.h>
39 #include <epan/filesystem.h>
44 #include "dlg_utils.h"
45 #include "gui_utils.h"
46 #include "simple_dialog.h"
47 #include "dfilter_expr_dlg.h"
48 #include "compat_macros.h"
49 #include "gtkglobals.h"
53 #include "airpcap_loader.h"
54 #include "airpcap_gui_utils.h"
55 #include "airpcap_dlg.h"
59 /* temporary block signals to widgets */
60 BOOL block_advanced_signals;
63 * This struct will contain useful data for the selected (actual) airpcap device
66 airpcap_fill_if_combo(GtkWidget *combo, GList* if_list)
69 GList* popdown_if_list = NULL;
71 airpcap_if_info_t* if_info = NULL;
73 curr = g_list_nth(if_list, ifn);
75 if(curr != NULL) if_info = curr->data;
77 popdown_if_list = NULL;
78 ifn = g_list_length(if_list) - 1;
79 while(ifn >= 0) /* reverse order */
81 curr = g_list_nth(if_list, ifn);
86 popdown_if_list = g_list_append( popdown_if_list , if_info->description) ;
89 gtk_combo_set_popdown_strings( GTK_COMBO(combo), popdown_if_list) ;
91 if(airpcap_if_selected != NULL)
93 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), airpcap_if_selected->description);
97 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), "No Wireless Interfaces Found");
102 * Callback for the crc chackbox
105 crc_check_cb(GtkWidget *w, gpointer user_data)
107 if( !block_advanced_signals && (airpcap_if_selected != NULL))
109 if(airpcap_if_selected->IsFcsPresent)
111 airpcap_if_selected->IsFcsPresent = FALSE;
112 airpcap_if_selected->saved = FALSE;
116 airpcap_if_selected->IsFcsPresent = TRUE;
117 airpcap_if_selected->saved = FALSE;
123 * Callback for the wrong crc combo
126 wrong_crc_combo_cb(GtkWidget *w, gpointer data)
130 s = gtk_entry_get_text(GTK_ENTRY(data));
132 if( !block_advanced_signals && (data != NULL) && (w != NULL) )
134 if((g_strcasecmp("",s)))
136 airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(s);
137 airpcap_if_selected->saved = FALSE;
143 * Changed callback for the channel combobox
146 channel_changed_cb(GtkWidget *w _U_, gpointer data)
150 s = gtk_entry_get_text(GTK_ENTRY(data));
152 if( !block_advanced_signals && (data != NULL) && (w != NULL) )
154 s = gtk_entry_get_text(GTK_ENTRY(data));
155 if((g_strcasecmp("",s)))
157 if(airpcap_if_selected != NULL)
159 airpcap_if_selected->channel = airpcap_get_channel_number(s);
160 airpcap_if_selected->saved = FALSE;
167 * Changed callback for the link layer combobox
170 link_type_changed_cb(GtkWidget *w _U_, gpointer data)
174 s = gtk_entry_get_text(GTK_ENTRY(data));
176 if( !block_advanced_signals && (data != NULL) && (w != NULL) )
178 if((g_strcasecmp("",s)))
180 airpcap_if_selected->linkType = airpcap_get_link_type(s);
181 airpcap_if_selected->saved = FALSE;
187 * Activate callback for the adapter combobox
190 combo_if_activate_cb(GtkWidget *entry _U_, gpointer data)
195 * Changed callback for the adapter combobox
198 airpcap_advanced_combo_if_changed_cb(GtkWidget *w _U_, gpointer data)
200 const gchar* s = NULL;
202 s = gtk_entry_get_text(GTK_ENTRY(w));
204 if((g_strcasecmp("",s)))
206 /* We are trying to change the interface to set up...*/
207 /* Check if the current interface settings need to be SAVED! */
208 if( (airpcap_if_selected != NULL) && !block_advanced_signals)
210 if( (airpcap_if_selected->saved) ) /* Just change interface */
212 /* No changes for this interface, no need to save anything */
213 airpcap_change_if(w,data);
217 /* Popup a dialog to ask if user wants to save settings for selected
218 * interface before changing it...
220 airpcap_ask_for_save(w,data);
227 * Takes the keys from the GtkList widget, and add them to the interface list
230 airpcap_add_keys_from_list(GtkWidget *keylist, airpcap_if_info_t *if_info)
236 gchar *text_entered = NULL;
238 GtkWidget *nl_item,*nl_lb;
246 PAirpcapKeysCollection KeysCollection;
247 ULONG KeysCollectionSize;
250 UINT keys_in_list = 0;
254 keys_in_list = (UINT)g_list_length(GTK_LIST(key_ls)->children);
259 * Save the encryption keys, if we have any of them
261 KeysCollectionSize = 0;
264 * Calculate the size of the keys collection
266 KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
269 * Allocate the collection
271 KeysCollection = (PAirpcapKeysCollection)malloc(KeysCollectionSize);
274 /* Simple dialog ERROR */
275 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","Failed mamory allocation for KeysCollection!");
280 * Populate the key collection
282 list = GTK_LIST(key_ls)->children;
283 KeysCollection->nKeys = keys_in_list;
285 for(i = 0; i < keys_in_list; i++)
287 KeysCollection->Keys[i].KeyType = AIRPCAP_KEYTYPE_WEP;
289 /* Retrieve the Item corresponding to the i-th key */
290 nl_item = g_list_nth_data(list, i);
291 children = gtk_container_children(GTK_CONTAINER(nl_item));
292 nl_lb = g_list_nth_data(children,0);
293 new_key = g_string_new(GTK_LABEL(nl_lb)->label);
295 KeysCollection->Keys[i].KeyLen = new_key->len / 2;
296 memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
298 for(j = 0 ; j < new_key->len; j += 2)
300 s[0] = new_key->str[j];
301 s[1] = new_key->str[j+1];
303 KeyByte = (UCHAR)strtol(s, NULL, 16);
304 KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
309 * Free the old adapter key collection!
311 if(airpcap_if_selected->keysCollection != NULL)
312 g_free(airpcap_if_selected->keysCollection);
315 * Set this collection ad the new one
317 airpcap_if_selected->keysCollection = KeysCollection;
318 airpcap_if_selected->keysCollectionSize = KeysCollectionSize;
326 * Pop-up window, used to ask the user if he wants to save the selected interface settings
327 * when closing the window.
330 airpcap_ask_for_save_before_closing(GtkWidget *w _U_, gpointer data)
334 dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
335 PRIMARY_TEXT_START "Save settings before closing?" PRIMARY_TEXT_END "\n\n"
336 "If you close the window without saving, changes you made will\nbe discarded.");
337 simple_dialog_set_cb(dialog, airpcap_dialog_save_before_closing_cb, data);
340 /* user confirmed the "Save settings..." dialog */
342 airpcap_dialog_save_before_closing_cb(gpointer dialog _U_, gint btn, gpointer data)
344 GtkWidget* interface_combo;
347 /* I need the combo box entry */
348 interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
349 key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
353 /* save interface and exit */
354 airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
355 airpcap_save_selected_if_configuration(airpcap_if_selected);
356 /* Remove gtk timeout */
357 gtk_timeout_remove(airpcap_if_selected->tag);
359 case(ESD_BTN_DONT_SAVE):
360 /* exit without saving */
369 * Pop-up window, used to ask the user if he wants to save the selected interface settings
370 * when changing the interface in the advanced dialog box
373 airpcap_ask_for_save(GtkWidget *entry _U_, gpointer data)
377 dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
378 PRIMARY_TEXT_START "Save settings before changing interface?" PRIMARY_TEXT_END "\n\n"
379 "If you change interface without saving, changes you made will\nbe discarded.");
380 simple_dialog_set_cb(dialog, airpcap_dialog_save_cb, data);
384 /* user confirmed the "Save settings..." dialog */
386 airpcap_dialog_save_cb(GtkWidget* dialog _U_, gint btn, gpointer data)
388 GtkWidget* interface_combo;
391 /* I need the combo box entry */
392 interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
393 key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
397 /* save interface and change */
398 airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
399 airpcap_save_selected_if_configuration(airpcap_if_selected);
400 /* Remove gtk timeout */
401 gtk_timeout_remove(airpcap_if_selected->tag);
402 airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
404 case(ESD_BTN_DONT_SAVE):
405 /* change interface without saving */
406 airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
408 case(ESD_BTN_CANCEL):
409 /* don't change interface and don't save */
417 * Function used to change the selected interface and advanced dialog box
420 airpcap_change_if(GtkWidget *entry _U_, gpointer data)
427 GtkWidget *interface_combo;
428 GtkWidget *channel_combo;
429 GtkWidget *capture_combo;
430 GtkWidget *crc_check;
431 GtkWidget *wrong_crc_combo;
435 airpcap_if_info_t *new_if;
437 /* Retrieve the GUI object pointers */
438 main_w = GTK_WIDGET(data);
439 interface_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
440 channel_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
441 capture_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
442 crc_check = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CRC_KEY));
443 wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY));
444 blink_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY));
445 key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
447 s = gtk_entry_get_text(GTK_ENTRY(entry));
449 /* Select actual interface*/
450 new_if = get_airpcap_if_from_description(airpcap_if_list, s);
452 /* And change the GUI according to it... */
453 /* This should always happen, but it seems that the callback is
454 * called twice, the first time with an 'empty' text... so it
459 airpcap_if_selected = new_if;
462 /* I need to 'block' signals to widgets or they will receive a signal now
463 and will change twice */
464 block_advanced_signals = TRUE;
467 if(airpcap_if_selected->blinking)
469 #if GTK_MAJOR_VERSION >= 2
470 gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
472 gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
477 #if GTK_MAJOR_VERSION >= 2
478 gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
480 gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child)," Blink Led ");
485 channel_s = g_strdup_printf("%d",airpcap_if_selected->channel);
486 if(channel_combo != NULL) /* this event seems to happen when combo is still NULL */
487 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_combo)->entry), channel_s);
489 /* Link Layer combo */
491 if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
493 capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
494 if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
495 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
497 else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
499 capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
500 if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
501 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
504 /* Fcs Presence check box */
505 if(airpcap_if_selected->IsFcsPresent)
506 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE);
508 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE);
510 /* Wrong Crc combo box */
511 if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_EVERYTHING)
512 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_ALL);
513 else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRECT_FRAMES)
514 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRECT);
515 else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES)
516 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT);
518 /* Remove old keys */
519 gtk_list_remove_items(GTK_LIST(key_ls),GTK_LIST(key_ls)->children);
521 airpcap_fill_key_list(key_ls,airpcap_if_selected);
523 /* Enable the signals again */
524 block_advanced_signals = FALSE;
529 * Thread function used to blink the led
531 void update_blink(gpointer data _U_)
533 airpcap_if_info_t* sel;
535 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
537 sel = (airpcap_if_info_t*)data;
539 ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list, sel->description), ebuf);
544 airpcap_if_turn_led_off(ad, 0);
549 airpcap_if_turn_led_on(ad, 0);
552 airpcap_if_close(ad);
557 * Blink button callback
560 blink_cb( GtkWidget *blink_bt _U_, gpointer if_data )
562 PAirpcapHandle ad = NULL;
563 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
565 if(airpcap_if_selected != NULL)
566 if(!(airpcap_if_selected->blinking))
568 #if GTK_MAJOR_VERSION >= 2
569 gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
571 gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
573 airpcap_if_selected->tag = gtk_timeout_add(500, (GtkFunction)update_blink,airpcap_if_selected);
574 airpcap_if_selected->blinking = TRUE;
578 #if GTK_MAJOR_VERSION >= 2
579 gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
581 gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child)," Blink Led ");
583 gtk_timeout_remove(airpcap_if_selected->tag);
584 airpcap_if_selected->blinking = FALSE;
585 /* Switch on the led! */
586 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
589 gtk_timeout_remove(airpcap_if_selected->tag);
590 airpcap_if_turn_led_on(ad, 0);
591 airpcap_if_selected->blinking = FALSE;
592 airpcap_if_selected->led = TRUE;
593 airpcap_if_close(ad);
598 /* the window was closed, cleanup things */
600 airpcap_if_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
602 PAirpcapHandle ad = NULL;
603 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
605 /* Retrieve object data */
607 GtkWidget *channel_combo;
608 GtkWidget *capture_combo;
609 GtkWidget *crc_check;
610 GtkWidget *wrong_crc_combo;
612 GtkWidget *interface_combo;
613 GtkWidget *cancel_bt;
617 /* widgets in the toolbar */
621 *toolbar_wrong_crc_cm,
622 *toolbar_decryption_ck,
625 gint *from_widget = NULL;
627 /* Retrieve the GUI object pointers */
628 main_w = GTK_WIDGET(user_data);
629 interface_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
630 channel_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
631 capture_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
632 crc_check = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CRC_KEY));
633 wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY));
634 blink_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY));
635 cancel_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CANCEL_KEY));
636 ok_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_OK_KEY));
637 key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
638 advanced_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEY));
640 toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
642 /* retrieve toolbar info */
643 toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
644 toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
645 toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
646 toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
648 from_widget = (gint*)OBJECT_GET_DATA(toolbar,AIRPCAP_ADVANCED_FROM_KEY);
651 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
652 if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
653 gtk_widget_set_sensitive(toolbar,TRUE);
655 /* Stop blinking ALL leds (go through the airpcap_if_list) */
656 if(airpcap_if_selected != NULL)
658 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
661 gtk_timeout_remove(airpcap_if_selected->tag);
662 airpcap_if_turn_led_on(ad, 0);
663 airpcap_if_selected->blinking = FALSE;
664 airpcap_if_selected->led = TRUE;
665 airpcap_if_close(ad);
669 /* See if the 'Cancel' button was pressed or not
670 * if button is pressed, don't save configuration!
672 if(GTK_BUTTON(cancel_bt)->in_button)
674 /* reload the configuration!!! Configuration has not been saved but
675 the corresponding structure has been modified probably...*/
676 if(!airpcap_if_selected->saved)
678 airpcap_load_selected_if_configuration(airpcap_if_selected);
681 /* NULL to everything */
684 channel_combo = NULL;
685 interface_combo = NULL;
686 capture_combo = NULL;
688 wrong_crc_combo = NULL;
691 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
692 if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
693 gtk_widget_set_sensitive(toolbar,TRUE);
698 else if(GTK_BUTTON(ok_bt)->in_button)
701 /* ??? - Ask if want to save configuration */
703 /* Save the configuration */
704 airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
705 airpcap_save_selected_if_configuration(airpcap_if_selected);
706 /* Remove gtk timeout */
707 gtk_timeout_remove(airpcap_if_selected->tag);
709 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
710 if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
712 gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
714 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
716 airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
718 gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
719 if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
720 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
722 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
723 gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
726 /* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */
727 if( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL)
729 airpcap_set_toolbar_start_capture(airpcap_if_active);
733 airpcap_set_toolbar_stop_capture(airpcap_if_active);
736 /* NULL to everything */
739 channel_combo = NULL;
740 interface_combo = NULL;
741 capture_combo = NULL;
743 wrong_crc_combo = NULL;
746 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
747 if( *from_widget == AIRPCAP_ADVANCED_FROM_OPTIONS)
748 gtk_widget_set_sensitive(toolbar,FALSE);
754 /* reload the configuration!!! Configuration has not been saved but
755 the corresponding structure has been modified probably...*/
756 if(!airpcap_if_selected->saved)
758 airpcap_load_selected_if_configuration(airpcap_if_selected);
763 * Callback for the 'Apply' button.
766 airpcap_advanced_apply_cb(GtkWidget *button, gpointer data _U_)
768 /* advenced window */
771 /* widgets in the toolbar */
775 *toolbar_wrong_crc_cm,
776 *toolbar_decryption_ck;
780 /* retrieve main window */
781 main_w = GTK_WIDGET(data);
782 key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
784 toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
786 /* retrieve toolbar info */
787 toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
788 toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
789 toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
790 toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
792 /* Save the configuration */
793 airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
794 airpcap_save_selected_if_configuration(airpcap_if_selected);
796 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
797 if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
799 gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
800 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
801 airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
803 gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
804 if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
805 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
807 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
808 gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
813 * Callback for the 'Ok' button.
816 airpcap_advanced_ok_cb(GtkWidget *w, gpointer data _U_)
818 /* advenced window */
821 /* widgets in the toolbar */
825 *toolbar_wrong_crc_cm,
826 *toolbar_decryption_ck;
830 /* retrieve main window */
831 main_w = GTK_WIDGET(data);
833 toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
835 key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
837 /* retrieve toolbar info */
838 toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
839 toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
840 toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
841 toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
843 /* Save the configuration */
844 airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
845 airpcap_save_selected_if_configuration(airpcap_if_selected);
846 /* Remove gtk timeout */
847 gtk_timeout_remove(airpcap_if_selected->tag);
849 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
850 if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
852 gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
853 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
854 airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
856 gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
857 if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
858 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
860 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
861 gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
866 * Callback for the 'Reset Configuration' button.
869 airpcap_advanced_reset_configuration_cb(GtkWidget *button, gpointer data _U_)
875 * Callback for the 'About' button.
878 airpcap_advanced_about_cb(GtkWidget *button, gpointer data _U_)
880 /* retrieve toolbar info */
884 * Callback used to add a WEP key in the add new key box;
887 add_key(GtkWidget *widget, gpointer data _U_)
895 gchar *text_entered = NULL;
897 int keys_in_list = 0;
900 text = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_TEXT_KEY);
901 ok_bt = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_OK_KEY);
902 key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
904 keys_in_list = g_list_length(GTK_LIST(key_ls)->children);
905 text_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(text)));
908 if(keys_in_list == MAX_ENCRYPTION_KEYS)
910 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","Reached the Wep Keys Limit for this Interface.");
914 /* Check if key is correct */
915 new_key = g_string_new(text_entered);
917 g_strchug(new_key->str);
918 g_strchomp(new_key->str);
920 if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE)
922 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);
926 if((new_key->len % 2) != 0)
928 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even.");
932 for(i = 0; i < new_key->len; i++)
934 if(!g_ascii_isxdigit(new_key->str[i]))
936 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
941 /* If so... Add key */
942 airpcap_add_key_to_list(key_ls,new_key->str);
944 airpcap_if_selected->saved = FALSE;
946 g_string_free(new_key,TRUE);
947 g_free(text_entered);
949 window_destroy(GTK_WIDGET(data));
955 * Callback used to add a WEP key in the edit key box;
958 edit_key(GtkWidget *widget, gpointer data _U_)
966 gchar *text_entered = NULL;
971 int keys_in_list = 0;
974 text = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_TEXT_KEY);
975 ok_bt = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY);
976 key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
977 label = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_LABEL_KEY);
979 keys_in_list = g_list_length(GTK_LIST(key_ls)->children);
980 text_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(text)));
982 /* Check if key is correct */
983 new_key = g_string_new(text_entered);
985 g_strchug(new_key->str);
986 g_strchomp(new_key->str);
988 if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE)
990 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);
994 if((new_key->len % 2) != 0)
996 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even.");
1000 for(i = 0; i < new_key->len; i++)
1002 if(!g_ascii_isxdigit(new_key->str[i]))
1004 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
1009 /* If so... modify key */
1010 gtk_label_set_text(GTK_LABEL(label),new_key->str);
1012 airpcap_if_selected->saved = FALSE;
1014 g_string_free(new_key,TRUE);
1015 g_free(text_entered);
1017 window_destroy(GTK_WIDGET(data));
1022 * Callback for the 'Add Key' button.
1025 airpcap_advanced_add_key_cb(GtkWidget *button, gpointer data _U_)
1028 GtkWidget *add_key_w;
1031 GtkWidget *add_key_frame;
1034 GtkWidget *main_box, /* vertical */
1035 *key_box, /* orizontal */
1036 *text_box, /* orizontal */
1037 *button_box;/* orizontal (packed to end)*/
1040 GtkWidget *key_text_entry;
1043 GtkWidget *key_ok_bt,
1046 /* Key List Widget */
1049 /* Pop-up a new window */
1050 add_key_w = window_new (GTK_WINDOW_TOPLEVEL,"Add a WEP Key");
1052 /* Connect events */
1053 SIGNAL_CONNECT(add_key_w, "delete_event",window_delete_event_cb, add_key_w);
1054 SIGNAL_CONNECT(add_key_w, "destroy",add_key_w_destroy_cb, add_key_w);
1056 /* Sets the border width of the window. */
1057 gtk_container_set_border_width (GTK_CONTAINER (add_key_w), 5);
1059 /* Retrieve the key list widget pointer, and add it to the add_key_w */
1060 key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
1061 OBJECT_SET_DATA(GTK_WIDGET(add_key_w),AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
1062 OBJECT_SET_DATA(GTK_WIDGET(add_key_w),AIRPCAP_ADVANCED_KEY,data);
1065 main_box = gtk_vbox_new(FALSE,1);
1066 key_box = gtk_hbox_new(FALSE,1);
1067 button_box = gtk_hbox_new(FALSE,1);
1068 text_box = gtk_hbox_new(TRUE,1);
1070 /* Add the two sub boxes to the main box */
1071 gtk_box_pack_start(GTK_BOX(main_box), key_box, FALSE, FALSE, 1);
1072 gtk_box_pack_start(GTK_BOX(main_box), button_box, FALSE, FALSE, 1);
1074 /* Add the main box to the main window */
1075 gtk_container_add(GTK_CONTAINER(add_key_w),main_box);
1077 /* Crete key frame */
1078 add_key_frame = gtk_frame_new("");
1079 gtk_frame_set_label(GTK_FRAME(add_key_frame),"Key");
1080 #if GTK_MAJOR_VERSION < 2
1081 gtk_widget_set_usize( GTK_WIDGET(add_key_frame),
1085 gtk_widget_set_size_request( GTK_WIDGET(add_key_frame),
1090 gtk_box_pack_start(GTK_BOX(key_box), add_key_frame, FALSE, FALSE, 1);
1092 /* Create and Add text entry*/
1093 key_text_entry = gtk_entry_new();
1094 OBJECT_SET_DATA(add_key_w, AIRPCAP_ADVANCED_ADD_KEY_TEXT_KEY, key_text_entry);
1095 SIGNAL_CONNECT(key_text_entry, "activate", add_key, add_key_w );
1096 gtk_box_pack_start(GTK_BOX(text_box), key_text_entry, FALSE, FALSE, 1);
1097 gtk_container_add(GTK_CONTAINER(add_key_frame),text_box);
1098 gtk_container_set_border_width (GTK_CONTAINER (text_box), 5);
1100 /* Create and add buttons */
1101 key_ok_bt = gtk_button_new_with_label("OK");
1102 SIGNAL_CONNECT(key_ok_bt, "clicked", add_key, add_key_w );
1103 OBJECT_SET_DATA(add_key_w, AIRPCAP_ADVANCED_ADD_KEY_OK_KEY, key_ok_bt);
1104 #if GTK_MAJOR_VERSION < 2
1105 gtk_widget_set_usize( GTK_WIDGET(key_ok_bt),
1109 gtk_widget_set_size_request( GTK_WIDGET(key_ok_bt),
1113 key_cancel_bt = gtk_button_new_with_label("Cancel");
1114 SIGNAL_CONNECT(key_cancel_bt, "clicked", window_cancel_button_cb, add_key_w );
1115 #if GTK_MAJOR_VERSION < 2
1116 gtk_widget_set_usize( GTK_WIDGET(key_cancel_bt),
1120 gtk_widget_set_size_request( GTK_WIDGET(key_cancel_bt),
1125 gtk_box_pack_end(GTK_BOX(button_box), key_cancel_bt, FALSE, FALSE, 1);
1126 gtk_box_pack_end(GTK_BOX(button_box), key_ok_bt, FALSE, FALSE, 1);
1129 gtk_widget_show(key_ok_bt);
1130 gtk_widget_show(key_cancel_bt);
1131 gtk_widget_show(key_text_entry);
1132 gtk_widget_show(add_key_frame);
1133 gtk_widget_show(text_box);
1134 gtk_widget_show(button_box);
1135 gtk_widget_show(key_box);
1136 gtk_widget_show(main_box);
1137 gtk_widget_show(add_key_w);
1141 * Add key window destroy callback
1144 add_key_w_destroy_cb(GtkWidget *button, gpointer data _U_)
1150 * Edit key window destroy callback
1153 edit_key_w_destroy_cb(GtkWidget *button, gpointer data _U_)
1159 * Callback for the 'Remove Key' button.
1162 airpcap_advanced_remove_key_cb(GtkWidget *button, gpointer data _U_)
1169 /* retrieve key list */
1170 key_ls = GTK_LIST(data);
1172 /* Remove selected keys*/
1173 if(key_ls->selection != NULL)
1175 item = g_list_nth(key_ls->selection,0);
1178 n = gtk_list_child_position(key_ls,item->data);
1179 label = GTK_BIN(item->data)->child;
1180 gtk_list_clear_items(key_ls,n,n+1);
1184 /* Need to save config... */
1185 airpcap_if_selected->saved = FALSE;
1189 * Callback for the 'Edit Key' button.
1192 airpcap_advanced_edit_key_cb(GtkWidget *button, gpointer data _U_)
1195 GtkWidget *edit_key_w;
1198 GtkWidget *edit_key_frame;
1201 GtkWidget *main_box, /* vertical */
1202 *key_box, /* orizontal */
1203 *text_box, /* orizontal */
1204 *button_box;/* orizontal (packed to end)*/
1207 GtkWidget *key_text_entry;
1210 GtkWidget *key_ok_bt,
1213 /* Key List Widget */
1220 /* Retrieve the key list widget pointer, and add it to the edit_key_w */
1221 key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
1224 * Check if a key has been selected. If not, just do nothing.
1226 if(GTK_LIST(key_ls)->selection != NULL)
1228 item = g_list_nth(GTK_LIST(key_ls)->selection,0);
1231 /* Pop-up a new window */
1232 edit_key_w = window_new (GTK_WINDOW_TOPLEVEL,"Edit a WEP Key");
1234 /* Connect events */
1235 SIGNAL_CONNECT(edit_key_w, "delete_event",window_delete_event_cb, edit_key_w);
1236 SIGNAL_CONNECT(edit_key_w, "destroy",edit_key_w_destroy_cb, edit_key_w);
1238 /* Sets the border width of the window. */
1239 gtk_container_set_border_width (GTK_CONTAINER (edit_key_w), 5);
1241 OBJECT_SET_DATA(GTK_WIDGET(edit_key_w),AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
1242 OBJECT_SET_DATA(GTK_WIDGET(edit_key_w),AIRPCAP_ADVANCED_KEY,data);
1245 main_box = gtk_vbox_new(FALSE,1);
1246 key_box = gtk_hbox_new(FALSE,1);
1247 button_box = gtk_hbox_new(FALSE,1);
1248 text_box = gtk_hbox_new(TRUE,1);
1250 /* Add the two sub boxes to the main box */
1251 gtk_box_pack_start(GTK_BOX(main_box), key_box, FALSE, FALSE, 1);
1252 gtk_box_pack_start(GTK_BOX(main_box), button_box, FALSE, FALSE, 1);
1254 /* Add the main box to the main window */
1255 gtk_container_add(GTK_CONTAINER(edit_key_w),main_box);
1257 /* Crete key frame */
1258 edit_key_frame = gtk_frame_new("");
1259 gtk_frame_set_label(GTK_FRAME(edit_key_frame),"Key");
1260 #if GTK_MAJOR_VERSION < 2
1261 gtk_widget_set_usize( GTK_WIDGET(edit_key_frame),
1265 gtk_widget_set_size_request( GTK_WIDGET(edit_key_frame),
1270 gtk_box_pack_start(GTK_BOX(key_box), edit_key_frame, FALSE, FALSE, 1);
1272 /* Create and Add text entry*/
1273 key_text_entry = gtk_entry_new();
1274 /* Retrieve the currently selected entry */
1275 if(GTK_LIST(key_ls)->selection != NULL)
1277 item = g_list_nth(GTK_LIST(key_ls)->selection,0);
1280 n = gtk_list_child_position(GTK_LIST(key_ls),item->data);
1281 label = GTK_BIN(item->data)->child;
1282 /* Pass the pointer as data */
1283 OBJECT_SET_DATA(edit_key_w,AIRPCAP_ADVANCED_EDIT_KEY_LABEL_KEY,label);
1286 gtk_entry_set_text(GTK_ENTRY(key_text_entry),GTK_LABEL(label)->label);
1287 OBJECT_SET_DATA(edit_key_w, AIRPCAP_ADVANCED_EDIT_KEY_TEXT_KEY, key_text_entry);
1288 SIGNAL_CONNECT(key_text_entry, "activate", edit_key, edit_key_w );
1289 gtk_box_pack_start(GTK_BOX(text_box), key_text_entry, FALSE, FALSE, 1);
1290 gtk_container_add(GTK_CONTAINER(edit_key_frame),text_box);
1291 gtk_container_set_border_width (GTK_CONTAINER (text_box), 5);
1293 /* Create and add buttons */
1294 key_ok_bt = gtk_button_new_with_label("OK");
1295 SIGNAL_CONNECT(key_ok_bt, "clicked", edit_key, edit_key_w );
1296 OBJECT_SET_DATA(edit_key_w, AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY, key_ok_bt);
1297 #if GTK_MAJOR_VERSION < 2
1298 gtk_widget_set_usize( GTK_WIDGET(key_ok_bt),
1302 gtk_widget_set_size_request( GTK_WIDGET(key_ok_bt),
1306 key_cancel_bt = gtk_button_new_with_label("Cancel");
1307 SIGNAL_CONNECT(key_cancel_bt, "clicked", window_cancel_button_cb, edit_key_w );
1308 #if GTK_MAJOR_VERSION < 2
1309 gtk_widget_set_usize( GTK_WIDGET(key_cancel_bt),
1313 gtk_widget_set_size_request( GTK_WIDGET(key_cancel_bt),
1318 gtk_box_pack_end(GTK_BOX(button_box), key_cancel_bt, FALSE, FALSE, 1);
1319 gtk_box_pack_end(GTK_BOX(button_box), key_ok_bt, FALSE, FALSE, 1);
1322 gtk_widget_show(key_ok_bt);
1323 gtk_widget_show(key_cancel_bt);
1324 gtk_widget_show(key_text_entry);
1325 gtk_widget_show(edit_key_frame);
1326 gtk_widget_show(text_box);
1327 gtk_widget_show(button_box);
1328 gtk_widget_show(key_box);
1329 gtk_widget_show(main_box);
1330 gtk_widget_show(edit_key_w);
1336 * Callback for the 'Move Key Up' button.
1339 airpcap_advanced_move_key_up_cb(GtkWidget *button, gpointer data _U_)
1342 GtkWidget *label,*nl_lb,*nl_item;
1343 GList *new_list = NULL;
1347 /* retrieve key list */
1348 key_ls = GTK_LIST(data);
1350 /* Remove selected keys*/
1351 if(key_ls->selection != NULL)
1353 item = g_list_nth(key_ls->selection,0);
1356 n = gtk_list_child_position(key_ls,item->data);
1359 label = GTK_BIN(item->data)->child;
1360 nl_lb = gtk_label_new(GTK_LABEL(label)->label);
1361 gtk_list_clear_items(key_ls,n,n+1);
1362 nl_item = gtk_list_item_new();
1363 gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5);
1364 gtk_container_add(GTK_CONTAINER(nl_item), nl_lb);
1365 gtk_widget_show(nl_lb);
1366 gtk_widget_show(nl_item);
1367 new_list = g_list_append(new_list,nl_item);
1368 gtk_list_insert_items(key_ls,new_list,n-1);
1369 gtk_list_select_item(key_ls,n-1);
1374 /* Need to save config... */
1375 airpcap_if_selected->saved = FALSE;
1379 * Callback for the 'Move Key Down' button.
1382 airpcap_advanced_move_key_down_cb(GtkWidget *button, gpointer data _U_)
1385 GtkWidget *label,*nl_lb,*nl_item;
1386 GList *new_list = NULL;
1390 /* retrieve key list */
1391 key_ls = GTK_LIST(data);
1393 /* Remove selected keys*/
1394 if(key_ls->selection != NULL)
1396 item = g_list_nth(key_ls->selection,0);
1399 n = gtk_list_child_position(key_ls,item->data);
1400 if(n< (g_list_length(key_ls->children)-1))
1402 label = GTK_BIN(item->data)->child;
1403 nl_lb = gtk_label_new(GTK_LABEL(label)->label);
1404 gtk_list_clear_items(key_ls,n,n+1);
1406 nl_item = gtk_list_item_new();
1407 gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5);
1408 gtk_container_add(GTK_CONTAINER(nl_item), nl_lb);
1409 gtk_widget_show(nl_lb);
1410 gtk_widget_show(nl_item);
1412 new_list = g_list_append(new_list,nl_item);
1413 gtk_list_insert_items(key_ls,new_list,n+1);
1414 gtk_list_select_item(key_ls,n+1);
1419 /* Need to save config... */
1420 airpcap_if_selected->saved = FALSE;
1423 /* Turns the decryption on or off */
1425 wep_encryption_check_cb(GtkWidget *w, gpointer data)
1427 if( !block_advanced_signals && (airpcap_if_selected != NULL))
1429 if(airpcap_if_selected->DecryptionOn == AIRPCAP_DECRYPTION_ON)
1431 airpcap_if_selected->DecryptionOn = AIRPCAP_DECRYPTION_OFF;
1432 airpcap_if_selected->saved = FALSE;
1436 airpcap_if_selected->DecryptionOn = AIRPCAP_DECRYPTION_ON;
1437 airpcap_if_selected->saved = FALSE;
1442 /* Called to create the airpcap settings' window */
1444 display_airpcap_advanced_cb(GtkWidget *w, gpointer data)
1447 GtkWidget *airpcap_advanced_w;
1450 GtkWidget *blink_bt,
1453 GtkWidget *interface_combo,
1457 GtkWidget *wrong_crc_combo;
1463 GtkWidget *interface_frame,
1467 GtkWidget *main_box,
1481 /* blink button is global */
1482 GtkWidget *add_new_key_bt,
1487 *reset_configuration_bt,
1494 /* shortcut to combo entry */
1495 GtkWidget *link_type_te,
1499 /* global check buttons */
1500 GtkWidget *crc_check,
1503 GtkWidget *channel_lb,
1507 GtkWidget *key_text;
1509 /* widgets in the toolbar */
1512 *toolbar_channel_cm,
1513 *toolbar_wrong_crc_cm;
1516 GList *channel_list,*capture_list;
1517 GList *linktype_list = NULL;
1521 /* user data - RETRIEVE pointers of toolbar widgets */
1522 toolbar = GTK_WIDGET(data);
1523 toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
1524 toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
1525 toolbar_wrong_crc_cm= GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
1527 /* gray out the toolbar */
1528 gtk_widget_set_sensitive(toolbar,FALSE);
1533 /* NULL to global widgets */
1535 channel_combo = NULL;
1536 block_advanced_signals = FALSE;
1538 /* the selected is the active, for now */
1539 airpcap_if_selected = airpcap_if_active;
1541 /* Create the new window */
1542 airpcap_advanced_w = window_new(GTK_WINDOW_TOPLEVEL, "Advanced Wireless Settings");
1545 * I will need the toolbar and the main widget in some callback,
1546 * so I will add the toolbar pointer to the airpcap_advanced_w
1548 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY,toolbar);
1550 /* Connect the callbacks */
1551 SIGNAL_CONNECT(airpcap_advanced_w, "delete_event", window_delete_event_cb, airpcap_advanced_w);
1552 SIGNAL_CONNECT(airpcap_advanced_w, "destroy", airpcap_if_destroy_cb, airpcap_advanced_w);
1555 /* Sets the border width of the window. */
1556 gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 10);
1558 /* Create the main box */
1559 main_box = gtk_vbox_new(FALSE,0);
1561 /* Create the button boxes */
1562 buttons_box_1 = gtk_hbox_new(FALSE,0);
1563 buttons_box_2 = gtk_hbox_new(FALSE,0);
1565 /* Create the buttons for box 1 */
1566 reset_configuration_bt = gtk_button_new_with_label("Reset Configuration");
1567 SIGNAL_CONNECT(reset_configuration_bt, "clicked", airpcap_advanced_reset_configuration_cb, toolbar);
1568 gtk_widget_show(reset_configuration_bt);
1570 about_bt = gtk_button_new_with_label("About");
1571 SIGNAL_CONNECT(about_bt, "clicked", airpcap_advanced_about_cb, toolbar);
1572 gtk_widget_show(about_bt);
1574 /* Add them to box 1 */
1575 gtk_box_pack_start (GTK_BOX (buttons_box_1), reset_configuration_bt, FALSE, FALSE, 1);
1576 gtk_box_pack_start (GTK_BOX (buttons_box_1), about_bt, FALSE, FALSE, 1);
1578 /* Create the buttons for box 2 */
1579 apply_bt = gtk_button_new_with_label("Apply");
1580 SIGNAL_CONNECT(apply_bt, "clicked", airpcap_advanced_apply_cb, airpcap_advanced_w);
1581 gtk_widget_show(apply_bt);
1583 ok_bt = gtk_button_new_with_label("Ok");
1584 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY,ok_bt);
1585 window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
1586 gtk_widget_show(ok_bt);
1588 cancel_bt = gtk_button_new_with_label("Cancel");
1589 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY,cancel_bt);
1590 window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);
1591 gtk_widget_show(cancel_bt);
1593 /* Add them to box 2 */
1594 gtk_box_pack_end (GTK_BOX (buttons_box_2), cancel_bt, FALSE, FALSE, 1);
1595 gtk_box_pack_end (GTK_BOX (buttons_box_2), apply_bt, FALSE, FALSE, 1);
1596 gtk_box_pack_end (GTK_BOX (buttons_box_2), ok_bt, FALSE, FALSE, 1);
1598 /* Create the three main frames */
1599 interface_frame = gtk_frame_new("");
1600 gtk_frame_set_label(GTK_FRAME(interface_frame),"Interface");
1602 basic_frame = gtk_frame_new("");
1603 gtk_frame_set_label(GTK_FRAME(basic_frame),"Basic Parameters");
1605 wep_frame = gtk_frame_new("");
1606 gtk_frame_set_label(GTK_FRAME(wep_frame),"WEP Keys");
1608 /* Create the three sub boxes */
1609 interface_box = gtk_hbox_new(FALSE,0);
1610 basic_box = gtk_hbox_new(FALSE,0);
1611 wep_box = gtk_vbox_new(FALSE,0);
1613 /* Fill the interface_box */
1614 if(airpcap_if_active != NULL)
1616 interface_combo = gtk_label_new(airpcap_if_active->description);
1620 interface_combo = gtk_label_new("No airpcap interface found!");
1621 gtk_widget_set_sensitive(main_box,FALSE);
1624 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY,interface_combo);
1625 gtk_box_pack_start (GTK_BOX (interface_box), interface_combo, TRUE, TRUE, 0);
1626 gtk_widget_show(interface_combo);
1628 /* blink led button (BEFORE interface_combo, 'cause its callback will need blink_bt)*/
1629 blink_bt = gtk_button_new_with_label(" Blink Led ");
1630 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY,blink_bt);
1631 gtk_box_pack_end (GTK_BOX (interface_box), blink_bt, FALSE, FALSE, 0);
1632 SIGNAL_CONNECT(blink_bt, "clicked", blink_cb, NULL);
1633 gtk_widget_show(blink_bt);
1635 gtk_container_set_border_width (GTK_CONTAINER (interface_box), 10);
1637 /* Fill the basic_box */
1638 /* Create the two vertical boxes for combo and check */
1639 basic_combo_box = gtk_vbox_new(TRUE,0);
1640 basic_check_box = gtk_vbox_new(TRUE,0);
1641 basic_label_box = gtk_vbox_new(TRUE,0);
1643 /* Create the Wrong CRC horiziontal box */
1644 basic_wrong_box = gtk_hbox_new(FALSE,0);
1646 /* Fill the label vbox */
1647 channel_lb = gtk_label_new("Channel: ");
1648 gtk_label_set_justify(GTK_LABEL(channel_lb),GTK_JUSTIFY_LEFT);
1649 gtk_box_pack_start (GTK_BOX (basic_label_box), channel_lb, TRUE, TRUE, 0);
1650 gtk_widget_show(channel_lb);
1651 capture_lb = gtk_label_new("Capture Type:");
1652 gtk_label_set_justify(GTK_LABEL(capture_lb),GTK_JUSTIFY_LEFT);
1653 gtk_box_pack_start (GTK_BOX (basic_label_box), capture_lb, TRUE, TRUE, 0);
1654 gtk_widget_show(capture_lb);
1656 /* Create the two combo boxes */
1657 channel_combo = gtk_combo_new();
1658 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY,channel_combo);
1660 channel_list = NULL;
1661 channel_list = g_list_append(channel_list, "1");
1662 channel_list = g_list_append(channel_list, "2");
1663 channel_list = g_list_append(channel_list, "3");
1664 channel_list = g_list_append(channel_list, "4");
1665 channel_list = g_list_append(channel_list, "5");
1666 channel_list = g_list_append(channel_list, "6");
1667 channel_list = g_list_append(channel_list, "7");
1668 channel_list = g_list_append(channel_list, "8");
1669 channel_list = g_list_append(channel_list, "9");
1670 channel_list = g_list_append(channel_list, "10");
1671 channel_list = g_list_append(channel_list, "11");
1672 channel_list = g_list_append(channel_list, "12");
1673 channel_list = g_list_append(channel_list, "13");
1674 channel_list = g_list_append(channel_list, "14");
1675 gtk_combo_set_popdown_strings( GTK_COMBO(channel_combo), channel_list) ;
1677 /* Select the first entry */
1678 if(airpcap_if_selected != NULL)
1680 airpcap_update_channel_combo(GTK_WIDGET(channel_combo), airpcap_if_selected);
1683 channel_te = GTK_COMBO(channel_combo)->entry;
1684 gtk_editable_set_editable(GTK_EDITABLE(channel_te),FALSE);
1685 SIGNAL_CONNECT(channel_te, "changed", channel_changed_cb, channel_te);
1686 gtk_box_pack_start (GTK_BOX (basic_combo_box), channel_combo, FALSE, FALSE, 0);
1687 gtk_widget_show(channel_combo);
1689 capture_combo = gtk_combo_new();
1690 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_combo);
1691 capture_list = NULL;
1692 capture_list = g_list_append(capture_list, AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
1693 capture_list = g_list_append(capture_list, AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
1694 gtk_combo_set_popdown_strings( GTK_COMBO(capture_combo), capture_list) ;
1697 if(airpcap_if_selected != NULL)
1699 if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
1700 capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
1701 else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
1702 capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
1703 if(capture_s != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
1707 link_type_te = GTK_COMBO(capture_combo)->entry;
1708 gtk_editable_set_editable(GTK_EDITABLE(link_type_te),FALSE);
1709 SIGNAL_CONNECT(link_type_te, "changed", link_type_changed_cb, link_type_te);
1710 gtk_box_pack_start (GTK_BOX (basic_combo_box), capture_combo, FALSE, FALSE, 1);
1711 gtk_widget_show(capture_combo);
1713 /* Create the two check boxes */
1714 crc_check = gtk_check_button_new_with_label("Include 802.11 FCS in Frames");
1715 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CRC_KEY,crc_check);
1717 /* Fcs Presence check box */
1718 if(airpcap_if_selected != NULL)
1720 if(airpcap_if_selected->IsFcsPresent)
1721 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE);
1723 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE);
1726 SIGNAL_CONNECT(crc_check,"toggled",crc_check_cb,NULL);
1727 gtk_box_pack_start (GTK_BOX (basic_check_box), crc_check, FALSE, FALSE, 0);
1728 gtk_widget_show(crc_check);
1730 /* CRC Filter label */
1731 wrong_lb = gtk_label_new("FCS Filter:");
1732 gtk_box_pack_start (GTK_BOX (basic_wrong_box), wrong_lb, FALSE, FALSE, 0);
1733 gtk_widget_show(wrong_lb);
1735 /* CRC Filter combo */
1736 wrong_crc_combo = gtk_combo_new();
1737 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY,wrong_crc_combo);
1739 linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_ALL);
1740 linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_CORRECT);
1741 linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT);
1743 gtk_combo_set_popdown_strings( GTK_COMBO(wrong_crc_combo), linktype_list) ;
1745 wrong_crc_te = GTK_COMBO(wrong_crc_combo)->entry;
1747 if(airpcap_if_selected != NULL)
1749 airpcap_validation_type_combo_set_by_type(wrong_crc_combo,airpcap_if_selected->CrcValidationOn);
1752 gtk_editable_set_editable(GTK_EDITABLE(wrong_crc_te),FALSE);
1753 SIGNAL_CONNECT(wrong_crc_te,"changed",wrong_crc_combo_cb,wrong_crc_te);
1754 gtk_box_pack_start (GTK_BOX (basic_wrong_box), wrong_crc_combo, FALSE, FALSE, 0);
1755 gtk_widget_show(wrong_crc_combo);
1757 gtk_box_pack_start(GTK_BOX(basic_check_box), basic_wrong_box, FALSE, FALSE, 0);
1758 gtk_widget_show(basic_wrong_box);
1760 /* Add the vertical inner boxes to the basic_box */
1761 gtk_box_pack_start (GTK_BOX (basic_box), basic_label_box, FALSE, FALSE, 10);
1762 gtk_box_pack_start (GTK_BOX (basic_box), basic_combo_box, FALSE, FALSE, 10);
1763 gtk_box_pack_start (GTK_BOX (basic_box), basic_check_box, FALSE, FALSE, 10);
1765 gtk_container_set_border_width (GTK_CONTAINER (basic_box), 10);
1767 /* Fill the wep_box */
1768 wep_sub_box = gtk_hbox_new(FALSE,1);
1769 gtk_widget_show(wep_sub_box);
1770 encryption_box = gtk_hbox_new(FALSE,1);
1771 gtk_widget_show(encryption_box);
1773 /* encryption enabled box */
1774 encryption_check = gtk_check_button_new_with_label("Enable WEP Decryption");
1775 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY,encryption_check);
1777 /* Fcs Presence check box */
1778 if(airpcap_if_selected != NULL)
1780 if(airpcap_if_selected->DecryptionOn == AIRPCAP_DECRYPTION_ON)
1781 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(encryption_check),TRUE);
1783 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(encryption_check),FALSE);
1786 SIGNAL_CONNECT(encryption_check,"toggled",wep_encryption_check_cb,NULL);
1787 gtk_box_pack_start (GTK_BOX (encryption_box), encryption_check, FALSE, FALSE, 0);
1788 gtk_widget_show(encryption_check);
1791 key_text = scrolled_window_new(NULL, NULL);
1792 /* never use a scrollbar in x direction, show the complete relation string */
1793 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(key_text),
1794 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1795 #if GTK_MAJOR_VERSION >= 2
1796 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(key_text),
1800 /* add WEP keys if present... */
1801 key_ls = gtk_list_new();
1802 gtk_list_set_selection_mode(GTK_LIST(key_ls), GTK_SELECTION_SINGLE);
1803 OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
1805 airpcap_fill_key_list(key_ls,airpcap_if_selected);
1806 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(key_text),key_ls);
1807 gtk_widget_show(key_ls);
1808 gtk_box_pack_start (GTK_BOX (wep_sub_box), key_text, TRUE, TRUE, 0);
1809 gtk_widget_show(key_text);
1812 wep_buttons_box = gtk_vbox_new(FALSE,0);
1814 /* Create and add buttons */
1815 add_new_key_bt = gtk_button_new_with_label("Add New Key");
1816 SIGNAL_CONNECT(add_new_key_bt, "clicked", airpcap_advanced_add_key_cb, airpcap_advanced_w);
1817 gtk_box_pack_start (GTK_BOX (wep_buttons_box), add_new_key_bt, FALSE, FALSE, 0);
1818 gtk_widget_show(add_new_key_bt);
1819 remove_key_bt = gtk_button_new_with_label("Remove Key");
1820 SIGNAL_CONNECT(remove_key_bt, "clicked", airpcap_advanced_remove_key_cb, key_ls);
1821 gtk_box_pack_start (GTK_BOX (wep_buttons_box), remove_key_bt, FALSE, FALSE, 0);
1822 gtk_widget_show(remove_key_bt);
1823 edit_key_bt = gtk_button_new_with_label("Edit Key");
1824 SIGNAL_CONNECT(edit_key_bt, "clicked", airpcap_advanced_edit_key_cb, airpcap_advanced_w);
1825 gtk_box_pack_start (GTK_BOX (wep_buttons_box), edit_key_bt, FALSE, FALSE, 0);
1826 gtk_widget_show(edit_key_bt);
1827 move_key_up_bt = gtk_button_new_with_label("Move Key Up");
1828 SIGNAL_CONNECT(move_key_up_bt, "clicked", airpcap_advanced_move_key_up_cb, key_ls);
1829 gtk_box_pack_start (GTK_BOX (wep_buttons_box), move_key_up_bt, FALSE, FALSE, 0);
1830 gtk_widget_show(move_key_up_bt);
1831 move_key_down_bt = gtk_button_new_with_label("Move Key Down");
1832 SIGNAL_CONNECT(move_key_down_bt, "clicked", airpcap_advanced_move_key_down_cb, key_ls);
1833 gtk_box_pack_start (GTK_BOX (wep_buttons_box), move_key_down_bt, FALSE, FALSE, 0);
1834 gtk_widget_show(move_key_down_bt);
1836 gtk_box_pack_end (GTK_BOX (wep_sub_box), wep_buttons_box, FALSE, FALSE, 0);
1838 gtk_container_set_border_width (GTK_CONTAINER (wep_sub_box), 10);
1840 gtk_box_pack_start (GTK_BOX (wep_box), encryption_box, FALSE, FALSE,0);
1841 gtk_box_pack_start (GTK_BOX (wep_box), wep_sub_box, FALSE, FALSE,0);
1842 gtk_widget_show(wep_sub_box);
1844 /* Add them to the frames */
1845 gtk_container_add(GTK_CONTAINER(interface_frame),interface_box);
1846 gtk_container_add(GTK_CONTAINER(basic_frame),basic_box);
1847 gtk_container_add(GTK_CONTAINER(wep_frame),wep_box);
1849 /* Add frames to the main box */
1850 gtk_box_pack_start (GTK_BOX (main_box), interface_frame, FALSE, FALSE, 1);
1851 gtk_box_pack_start (GTK_BOX (main_box), basic_frame, FALSE, FALSE, 1);
1852 gtk_box_pack_start (GTK_BOX (main_box), wep_frame, FALSE, FALSE, 1);
1854 /* Add buttons' boxes to the main box */
1855 gtk_box_pack_start (GTK_BOX (main_box), buttons_box_2, FALSE, FALSE, 1);
1857 /* Add the main box to the main window */
1858 gtk_container_add(GTK_CONTAINER(airpcap_advanced_w),main_box);
1860 /* SHOW EVERYTHING */
1861 /* Show the WEP key buttons */
1862 gtk_widget_show (wep_buttons_box);
1864 /* Show the combo and check boxes */
1865 gtk_widget_show (basic_label_box);
1866 gtk_widget_show (basic_combo_box);
1867 gtk_widget_show (basic_check_box);
1869 /* Show the button boxes */
1870 gtk_widget_show (buttons_box_1);
1871 gtk_widget_show (buttons_box_2);
1873 /* Show the frames */
1874 gtk_widget_show (interface_frame);
1875 gtk_widget_show (basic_frame);
1876 gtk_widget_show (wep_frame);
1878 /* Show the sub main boxes */
1879 gtk_widget_show (interface_box);
1880 gtk_widget_show (basic_box);
1881 gtk_widget_show (wep_box);
1883 /* Show the main box */
1884 gtk_widget_show (main_box);
1886 /* Show the window */
1887 gtk_widget_show (airpcap_advanced_w);
1890 #endif /* HAVE_AIRPCAP */