Skip to content

Commit

Permalink
Merge pull request #14 from felipealfonsog/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
felipealfonsog authored Jul 21, 2024
2 parents 0a0e129 + 3bbb002 commit 8d56d87
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 39 deletions.
70 changes: 55 additions & 15 deletions src/connman.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,68 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define BUFFER_SIZE 1024

void load_saved_networks(GtkTreeStore *store) {
FILE *fp = popen("connmanctl services", "r");
if (fp == NULL) {
perror("popen");
return;
}
static gboolean check_command(const char *cmd) {
return system(cmd) == 0;
}

void load_saved_networks(GtkTreeStore *store) {
FILE *fp;
char buffer[BUFFER_SIZE];
while (fgets(buffer, sizeof(buffer), fp)) {
if (strstr(buffer, "Wifi")) {

// Check if ConnMan is enabled and available
if (check_command("connmanctl services")) {
fp = popen("connmanctl services", "r");
if (fp == NULL) {
perror("popen");
return;
}

while (fgets(buffer, sizeof(buffer), fp)) {
GtkTreeIter iter;
if (strstr(buffer, "Wifi")) {
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1);
}
}

pclose(fp);
} else if (check_command("nmcli -f SSID dev wifi")) {
fp = popen("nmcli -f SSID dev wifi", "r");
if (fp == NULL) {
perror("popen");
return;
}

while (fgets(buffer, sizeof(buffer), fp)) {
GtkTreeIter iter;
if (strstr(buffer, "SSID")) continue; // Skip header line
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1);
}

pclose(fp);
} else if (access("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport", X_OK) == 0) {
fp = popen("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", "r");
if (fp == NULL) {
perror("popen");
return;
}

while (fgets(buffer, sizeof(buffer), fp)) {
GtkTreeIter iter;
if (strstr(buffer, "SSID")) continue; // Skip header line
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1);
}
}

pclose(fp);
pclose(fp);
} else {
fprintf(stderr, "No compatible network manager found.\n");
}
}

void prompt_for_password_and_connect(const gchar *network_name) {
Expand All @@ -30,9 +72,9 @@ void prompt_for_password_and_connect(const gchar *network_name) {
GtkWidget *content_area;
GtkResponseType result;

dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL,
("Cancel"), GTK_RESPONSE_CANCEL,
("Connect"), GTK_RESPONSE_ACCEPT,
dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL,
"Cancel", GTK_RESPONSE_CANCEL,
"Connect", GTK_RESPONSE_ACCEPT,
NULL);

content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
Expand All @@ -45,7 +87,6 @@ void prompt_for_password_and_connect(const gchar *network_name) {

if (result == GTK_RESPONSE_ACCEPT) {
const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry));
// Connect using connmanctl with password
char command[BUFFER_SIZE];
snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password);
system(command);
Expand All @@ -55,7 +96,6 @@ void prompt_for_password_and_connect(const gchar *network_name) {
}

void update_auto_connect_configuration(const gchar *network_name) {
// Placeholder for actual auto-connect configuration
char command[BUFFER_SIZE];
snprintf(command, sizeof(command), "connmanctl enable %s", network_name);
system(command);
Expand Down
114 changes: 90 additions & 24 deletions src/main.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "connman.h"
#include <unistd.h>

#define AIRPORT_PATH "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport"

// Function prototypes
static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview);
static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview);
static GtkWidget* create_main_window();
static GtkWidget *treeview; // Declarar treeview globalmente para que sea accesible

static void update_auto_connect_configuration(const gchar *network_name) {
// Implementar configuración de auto-conexión según la red.
printf("Updating auto-connect for network: %s\n", network_name);
}

static void prompt_for_password_and_connect(const gchar *network_name) {
// Implementar la lógica para pedir la contraseña y conectar a la red.
printf("Prompting for password and connecting to network: %s\n", network_name);
}

static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) {
GtkTreeModel *model = gtk_tree_view_get_model(treeview);
Expand All @@ -26,27 +35,29 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview)
}
}

static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview) {
GtkTreeModel *model = gtk_tree_view_get_model(treeview);
static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) {
GtkTreeIter iter;
GtkTreePath *tree_path = gtk_tree_path_new_from_string(path);
gtk_tree_model_get_iter(model, &iter, tree_path);
GtkTreeModel *model = GTK_TREE_MODEL(store);
gboolean auto_connect;
gtk_tree_model_get(model, &iter, 1, &auto_connect, -1);
auto_connect = !auto_connect;

gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 1, auto_connect, -1);
if (gtk_tree_model_get_iter(model, &iter, tree_path)) {
gtk_tree_model_get(model, &iter, 1, &auto_connect, -1);
auto_connect = !auto_connect;

gtk_tree_path_free(tree_path);
gtk_tree_store_set(store, &iter, 1, auto_connect, -1);

// Retrieve network name for auto-connect configuration
gchar *network_name;
gtk_tree_model_get(model, &iter, 0, &network_name, -1);
gtk_tree_path_free(tree_path);

// Update auto-connect configuration
update_auto_connect_configuration(network_name);
// Retrieve network name for auto-connect configuration
gchar *network_name;
gtk_tree_model_get(model, &iter, 0, &network_name, -1);

// Update auto-connect configuration
update_auto_connect_configuration(network_name);

g_free(network_name);
g_free(network_name);
}
}

static GtkWidget* create_main_window() {
Expand All @@ -57,7 +68,7 @@ static GtkWidget* create_main_window() {
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);

GtkWidget *treeview = gtk_tree_view_new();
treeview = gtk_tree_view_new();
GtkTreeStore *store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));

Expand All @@ -70,7 +81,7 @@ static GtkWidget* create_main_window() {
GtkTreeViewColumn *toggle_column = gtk_tree_view_column_new_with_attributes("Auto-Connect", toggle_renderer, "active", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), toggle_column);

g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), treeview);
g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), store);

gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0);

Expand All @@ -83,15 +94,70 @@ static GtkWidget* create_main_window() {
return window;
}

static void scan_wifi_arch(GtkTreeView *treeview) {
FILE *fp = popen("nmcli -f SSID,IN-USE dev wifi", "r");
if (fp == NULL) {
perror("Failed to run nmcli command");
return;
}

char buffer[256];
GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
GtkTreeIter iter;
gboolean in_use;

while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) {
if (buffer[0] != '\0' && buffer[0] != 'S') { // Skip header line
char *ssid = strtok(buffer, " \n");
char *in_use_str = strtok(NULL, " \n");

in_use = (in_use_str != NULL && strcmp(in_use_str, "[*]") == 0);

gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, 0, ssid, 1, in_use, -1);
}
}

pclose(fp);
}


static void scan_wifi_macos(GtkTreeView *treeview) {
char buffer[128];
FILE *fp = popen(AIRPORT_PATH " -s", "r");
if (fp == NULL) {
perror("Failed to run airport command");
return;
}

GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
GtkTreeIter iter;

while (fgets(buffer, sizeof(buffer), fp) != NULL) {
if (buffer[0] != '\0' && buffer[0] != 'S') { // Skip header line
gchar *ssid = strtok(buffer, "\n");
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, 0, ssid, 1, FALSE, -1);
}
}

pclose(fp);
}

int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);

GtkWidget *window = create_main_window();
gtk_widget_show_all(window);

// Load saved networks
GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window)));
load_saved_networks(store);
// Detect and scan WiFi networks based on system
if (system("connmanctl services > /dev/null 2>&1") == 0) {
scan_wifi_arch(GTK_TREE_VIEW(treeview)); // Arch Linux
} else if (system("nmcli -f SSID dev wifi > /dev/null 2>&1") == 0) {
scan_wifi_arch(GTK_TREE_VIEW(treeview)); // NetworkManager
} else {
scan_wifi_macos(GTK_TREE_VIEW(treeview)); // macOS
}

gtk_main();
return 0;
Expand Down

0 comments on commit 8d56d87

Please sign in to comment.