Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=fwife.git;a=commitdiff;h=d70bf06963a0cd425b9b10dc8869a1c921828fb1

commit d70bf06963a0cd425b9b10dc8869a1c921828fb1
Author: Elentir <elen...@mailoo.org>
Date:   Sun Dec 27 21:47:31 2009 +0100

add support for scanning wifi access points in post netconf plugin

diff --git a/src/plugins/netconf.c b/src/plugins/netconf.c
index 8242625..52afe03 100644
--- a/src/plugins/netconf.c
+++ b/src/plugins/netconf.c
@@ -88,6 +88,252 @@ plugin_t *info()
return &plugin;
}

+struct two_ptr {
+       void *first;
+       void *sec;
+};
+
+struct wifi_ap {
+       char *address;
+       char *essid;
+       char *encmode;
+       char *cypher;
+       char *protocol;
+       char *mode;
+       int quality;
+       int channel;
+       int encryption;
+};
+
+void free_wifi_ap(struct wifi_ap *ap)
+{
+       if(ap != NULL) {
+               free(ap->address);
+               free(ap->essid);
+               free(ap->encmode);
+               free(ap->cypher);
+               free(ap->protocol);
+               free(ap->mode);
+       }
+       free(ap);
+}
+
+/* Parser for iwlist command */
+GList *list_entry_points(char *ifacename)
+{
+       char *line = malloc(256);
+       size_t len = 0;
+       FILE * fp = NULL;
+       char *command = NULL;
+       struct wifi_ap *ap = NULL;
+       char *tok = NULL;
+
+       GList *entrys = NULL;
+
+       /* up interface */
+       command = g_strdup_printf("ifconfig %s up", ifacename);
+       system(command);
+       free(command);
+       /* scan APs */
+       command = g_strdup_printf("iwlist %s scan", ifacename);
+       fp = popen(command, "r");
+
+       while (getline(&line, &len, fp) != -1) {
+                       if((tok = strstr(line, "Address: ")) != NULL) {
+                               if(ap != NULL)
+                                       entrys = g_list_append(entrys, ap);
+
+                               ap = malloc(sizeof(struct wifi_ap));
+                               memset(ap, 0, sizeof(struct wifi_ap));
+                               strchr(tok+9, '\n')[0] = '\0';
+                               ap->address = strdup(tok+9);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "ESSID:\"")) != NULL) {
+                               strchr(tok+7, '"')[0] = '\0';
+                               ap->essid = strdup(tok+7);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Protocol:")) != NULL) {
+                               strchr(tok+9, '\n')[0] = '\0';
+                               ap->protocol = strdup(tok+9);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Encryption key:")) != NULL) {
+                               if(strstr(tok, "on") != NULL)
+                                       ap->encryption = 1;
+                               else
+                                       ap->encryption = 0;
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Channel:")) != NULL) {
+                               strchr(tok+8, '\n')[0] = '\0';
+                               ap->channel= atoi(tok+8);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Mode:")) != NULL) {
+                               strchr(tok+5, '\n')[0] = '\0';
+                               ap->mode = strdup(tok+5);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Quality=")) != NULL) {
+                               strchr(tok+8, '/')[0] = '\0';
+                               ap->quality = atoi(tok+8);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "IE: ")) != NULL && strstr(line, 
"Unknown") == NULL) {
+                               strchr(tok+4, '\n')[0] = '\0';
+                               ap->encmode = strdup(tok+4);
+                               continue;
+                       }
+
+                       if((tok = strstr(line, "Group Cipher : ")) != NULL) {
+                               strchr(tok+15, '\n')[0] = '\0';
+                               ap->cypher = strdup(tok+15);
+                               continue;
+                       }
+               }
+
+               if(ap != NULL)
+                       entrys = g_list_append(entrys, ap);
+
+               free(line);
+               free(command);
+               pclose(fp);
+               return entrys;
+}
+
+char *select_entry_point(fwnet_interface_t *interface)
+{
+       GtkWidget* pBoite;
+
+       GtkWidget *viewif;
+       GtkListStore *store;
+       GtkTreeViewColumn *col;
+       GtkCellRenderer *renderer;
+       GtkTreeIter iter;
+       GtkTreeModel *model;
+       GtkTreeSelection *selection;
+       GdkPixbuf *connectimg;
+       GtkWidget *cellview;
+       int i;
+       char *essidap;
+
+       GList *listaps = NULL;
+       struct wifi_ap *ap = NULL;
+
+       pBoite = gtk_dialog_new_with_buttons(_("Select your access point :"),
+        GTK_WINDOW(assistant),
+        GTK_DIALOG_MODAL,
+        GTK_STOCK_REFRESH, GTK_RESPONSE_APPLY,
+        GTK_STOCK_OK, GTK_RESPONSE_OK,
+        NULL);
+
+        gtk_window_set_default_size(GTK_WINDOW(pBoite), 320, 200);
+        gtk_window_set_position(GTK_WINDOW (pBoite), GTK_WIN_POS_CENTER);
+
+       store = gtk_list_store_new(7, GDK_TYPE_PIXBUF, G_TYPE_STRING, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+       viewif = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref (store);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(viewif));
+       gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+
+       renderer = gtk_cell_renderer_pixbuf_new();
+       col = gtk_tree_view_column_new_with_attributes (_("Signal"), renderer, 
"pixbuf", 0, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       renderer = gtk_cell_renderer_text_new();
+       col = gtk_tree_view_column_new_with_attributes (_("Address"), renderer, 
"text", 1, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       col = gtk_tree_view_column_new_with_attributes (_("ESSID"), renderer, 
"text", 2, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       col = gtk_tree_view_column_new_with_attributes (_("Mode"), renderer, 
"text", 3, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       col = gtk_tree_view_column_new_with_attributes (_("Protocol"), 
renderer, "text", 4, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       col = gtk_tree_view_column_new_with_attributes (_("Encryption"), 
renderer, "text", 5, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       col = gtk_tree_view_column_new_with_attributes (_("Cypher"), renderer, 
"text", 6, NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(viewif), col);
+
+       cellview = gtk_cell_view_new ();
+
+       gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), viewif, TRUE, 
TRUE, 5);
+
+       gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);
+
+       while(1) {
+               if((listaps = list_entry_points(interface->name)) == NULL)
+                       return NULL;
+
+               for(i = 0; i < g_list_length(listaps); i++) {
+                       ap = (struct wifi_ap*)g_list_nth_data(listaps, i);
+                       
gtk_list_store_append(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(viewif))),
 &iter);
+
+                       /* set image according to quality signal */
+                       if(ap->quality < 25)
+                               connectimg = 
gtk_image_get_pixbuf(GTK_IMAGE(gtk_image_new_from_file(g_strdup_printf("%s/signal-25.png",
 IMAGEDIR))));
+                       else if(ap->quality >= 25 && ap->quality < 50)
+                               connectimg = 
gtk_image_get_pixbuf(GTK_IMAGE(gtk_image_new_from_file(g_strdup_printf("%s/signal-50.png",
 IMAGEDIR))));
+                       else if(ap->quality >= 50 && ap->quality < 75)
+                               connectimg = 
gtk_image_get_pixbuf(GTK_IMAGE(gtk_image_new_from_file(g_strdup_printf("%s/signal-75.png",
 IMAGEDIR))));
+                       else if(ap->quality >= 75)
+                               connectimg = 
gtk_image_get_pixbuf(GTK_IMAGE(gtk_image_new_from_file(g_strdup_printf("%s/signal-100.png",
 IMAGEDIR))));
+
+                       if(ap->encryption == 1) {
+                               
gtk_list_store_set(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(viewif))),
 &iter,
+                                       0, connectimg, 1, ap->address, 2, 
ap->essid,
+                                       3, ap->mode, 4, ap->protocol,
+                                       5, ap->encmode, 6, ap->cypher,
+                                       -1);
+                       } else {
+                               
gtk_list_store_set(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(viewif))),
 &iter,
+                                       0, connectimg, 1, ap->address, 2, 
ap->essid,
+                                       3, ap->mode, 4, ap->protocol,
+                                       5, _("No encryption"), 6, "",
+                                       -1);
+                       }
+                       free_wifi_ap(ap);
+                       g_object_unref(connectimg);
+               }
+
+               int ret = gtk_dialog_run(GTK_DIALOG(pBoite));
+               if(ret == GTK_RESPONSE_OK) {
+                       model = 
gtk_tree_view_get_model(GTK_TREE_VIEW(GTK_TREE_VIEW(viewif)));
+                       if(gtk_tree_selection_get_selected(selection, &model, 
&iter))
+                               gtk_tree_model_get (model, &iter, 2, &essidap, 
-1);
+                       else
+                               essidap = "";
+
+                       gtk_widget_destroy(pBoite);
+                       g_list_free(listaps);
+                       return strdup(essidap);
+               } else if(ret == GTK_RESPONSE_APPLY) {
+                       
gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(viewif))));
+                       g_list_free(listaps);
+               } else {
+                       gtk_widget_destroy(pBoite);
+                       g_list_free(listaps);
+                       return NULL;
+               }
+       }
+
+       return NULL;
+}
+
char *ask_nettype()
{
char *str = NULL;
@@ -157,6 +403,14 @@ char *ask_nettype()
return str;
}

+void set_access_point(GtkWidget *widget, gpointer data)
+{
+       struct two_ptr *tptr = (struct two_ptr*)data;
+       char *result = select_entry_point(tptr->first);
+       gtk_entry_set_text(GTK_ENTRY(tptr->sec), result);
+       free(result);
+}
+
int configure_wireless(fwnet_interface_t *interface)
{
GtkWidget *phboxtemp, *labeltemp;
@@ -186,6 +440,8 @@ int configure_wireless(fwnet_interface_t *interface)
gtk_box_pack_start(GTK_BOX(phboxtemp), labeltemp, FALSE, FALSE, 5);
GtkWidget *pEntryEssid = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(phboxtemp), pEntryEssid, FALSE, FALSE, 0);
+       GtkWidget *butaps = gtk_button_new_with_label(_("Scan for Access 
Points"));
+       gtk_box_pack_start(GTK_BOX(phboxtemp), butaps, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), phboxtemp, FALSE, FALSE, 
5);

phboxtemp = gtk_hbox_new(FALSE, 0);
@@ -208,6 +464,9 @@ int configure_wireless(fwnet_interface_t *interface)
GtkWidget *pEntryWpaDriver = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(phboxtemp), pEntryWpaDriver, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), phboxtemp, FALSE, FALSE, 
5);
+
+       struct two_ptr tptr = {interface, pEntryEssid};
+       g_signal_connect (butaps, "clicked", G_CALLBACK (set_access_point), 
&tptr);

gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to