📄 config.c
字号:
/*-*-linux-c-*-*/
#include <gtk/gtk.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include "newtella.h"
#include "gui.h"
#include "config.h"
#include "file.h"
GtkWidget *config_window;
GtkWidget *speed_combo;
GtkWidget *speed_edit_box, *port_edit_box, *ip_edit_box, *max_sr_edit_box;
GtkWidget *auto_reconnect_check_box;
GtkWidget *download_dir_label;
GtkWidget *shared_dir_list;
/* Check wether path is a directory */
gboolean is_directory(gchar *path)
{
/* taken from gtk-gnutella */
struct stat st;
if (stat(path, &st) == -1) return FALSE;
return S_ISDIR(st.st_mode);
}
int config_create_dir(char *c_dir)
{
if (mkdir(c_dir, 0755) == -1) {
g_print("Can't create config dir!\n");
return -1;
}
return 1;
}
int config_save_to_file(void)
{
GList *iter;
DIR *cfg_dir;
FILE *cfg_file;
gchar *cfg_name = newtella_malloc(255);
strcpy(cfg_name, getenv("HOME"));
cfg_name = strcat(cfg_name, "/.gnewtellium");
/* check if dir exist */
cfg_dir = opendir(cfg_name);
if (!cfg_dir && errno == ENOENT)
config_create_dir(cfg_name);
cfg_name = strcat(cfg_name, "/gnewtellium");
cfg_file = fopen(cfg_name, "w+");
if (cfg_file) {
/* some useful comments. :-) */
fprintf(cfg_file, "# "GNEWTELLIUM" - configuration file\n");
fprintf(cfg_file, "# this is an auto-generated configuration\n");
fprintf(cfg_file, "# please do not try to edit it manually\n");
fprintf(cfg_file, "# the parser is not quite flexible in this version\n\n");
/* dump configuration */
fprintf(cfg_file, "speed=%d\n", gl_options->con_speed);
fprintf(cfg_file, "listen_port=%d\n", gl_options->newtella_port);
fprintf(cfg_file, "local_ip=%d\n", gl_options->local_ip);
fprintf(cfg_file, "max_downloads=%d\n", gl_options->max_downloads);
fprintf(cfg_file, "max_uploads=%d\n", gl_options->max_uploads);
fprintf(cfg_file, "max_uploads_per_host=%d\n", gl_options->max_uploads_per_host);
fprintf(cfg_file, "max_search_results=%d\n", gl_options->max_search_results);
fprintf(cfg_file, "host_cache_length=%d\n", gl_options->host_cache_length);
fprintf(cfg_file, "auto_reconnect=%d\n", gl_options->auto_reconnect);
fprintf(cfg_file, "min_con=%d\n", gl_options->min_con);
fprintf(cfg_file, "max_con=%d\n", gl_options->max_con);
fprintf(cfg_file, "auto_connect=%d\n", gl_options->auto_connect);
fprintf(cfg_file, "accept_in_con=%d\n", gl_options->accept_in_con);
fprintf(cfg_file, "download_dir=%s\n", gl_options->download_dir);
iter = g_list_first(gl_options->shared_dirs);
while (iter) {
fprintf(cfg_file, "shared_dir=%s\n", (gchar *) iter->data);
iter = g_list_next(iter);
}
}
fclose(cfg_file);
return 1;
}
void config_parse_var(gchar *gv)
{
gchar *seek;
gchar *s;
seek = (gchar *) memchr(gv, '=', 255);
seek++;
if (!strncmp(gv, "speed", 5))
gl_options->con_speed = atoi(seek);
else if (!strncmp(gv, "listen_port", 11))
gl_options->newtella_port = atoi(seek);
else if (!strncmp(gv, "local_ip", 8))
gl_options->local_ip = atol(seek);
else if (!strncmp(gv, "max_downloads", 13))
gl_options->max_downloads = atoi(seek);
else if (!strncmp(gv, "max_uploads_per_host", 20))
gl_options->max_uploads_per_host = atoi(seek);
else if (!strncmp(gv, "max_uploads", 11))
gl_options->max_uploads = atoi(seek);
else if (!strncmp(gv, "max_search_results", 18))
gl_options->max_search_results = atoi(seek);
else if (!strncmp(gv, "host_cache_length", 17))
gl_options->host_cache_length = atoi(seek);
else if (!strncmp(gv, "auto_reconnect", 14))
gl_options->auto_reconnect = atoi(seek);
else if (!strncmp(gv, "min_con", 7))
gl_options->min_con = atoi(seek);
else if (!strncmp(gv, "max_con", 7))
gl_options->max_con = atoi(seek);
else if (!strncmp(gv, "auto_connect", 12))
gl_options->auto_connect = atoi(seek);
else if (!strncmp(gv, "accept_in_con", 13))
gl_options->accept_in_con = atoi(seek);
else if (!strncmp(gv, "download_dir", 12))
strncpy(gl_options->download_dir, seek, strlen(seek)-1);
else if (!strncmp(gv, "shared_dir", 10)) {
s = newtella_malloc(strlen(seek)-1);
s = memcpy(s, seek, strlen(seek)-1);
gl_options->shared_dirs = g_list_append(gl_options->shared_dirs, s);
}
}
int config_load_from_file(void)
{
FILE *cfg_file;
gchar *cfg_name = newtella_malloc(255);
gchar cfg_var[255];
strcpy(cfg_name, getenv("HOME"));
cfg_name = strcat(cfg_name, "/.gnewtellium/gnewtellium");
cfg_file = fopen(cfg_name, "r");
if (!cfg_file)
return 0;
while (fgets(cfg_var, sizeof(cfg_var), cfg_file)) {
if (cfg_var[0] == '#' || cfg_var[0] == '\n') continue;
config_parse_var(cfg_var);
}
fclose(cfg_file);
return 1;
}
void config_refresh_main(void)
{
/* update gui in the main window according to
active configuration
*/
/* connect automatically */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_connect_check_box),
gl_options->auto_connect);
/* accept incoming connections */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(accept_in_con_check_box),
gl_options->accept_in_con);
/* min/max connections */
gtk_spin_button_set_value(GTK_SPIN_BUTTON(min_con), gl_options->min_con);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(max_con), gl_options->max_con);
/* uploads/downloads */
gtk_spin_button_set_value(GTK_SPIN_BUTTON(max_uploads), gl_options->max_uploads);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(max_uploads_per_host), gl_options->max_uploads_per_host);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(max_downloads), gl_options->max_downloads);
}
void config_refresh(void)
{
GList *iter;
gchar buf[255];
gchar *s;
/* update gui according to active configuration */
switch (gl_options->con_speed) {
case 56:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "Modem");
break;
case 64:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "ISDN");
break;
case 128:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "ISDN (Dual Channel)");
break;
case 512:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "Cable Modem");
break;
case 768:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "ADSL");
break;
case 1028:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "T1");
break;
case 10000:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "T3");
break;
default:
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "Custom...");
}
g_snprintf(buf, sizeof(buf), "%d", gl_options->con_speed);
gtk_entry_set_text(GTK_ENTRY(speed_edit_box), buf);
/* max search results */
g_snprintf(buf, sizeof(buf), "%d", gl_options->max_search_results);
gtk_entry_set_text(GTK_ENTRY(max_sr_edit_box), buf);
/* listen port */
g_snprintf(buf, sizeof(buf), "%d", gl_options->newtella_port);
gtk_entry_set_text(GTK_ENTRY(port_edit_box), buf);
/* local ip */
gtk_entry_set_text(GTK_ENTRY(ip_edit_box), ip2str(gl_options->local_ip));
/* download dir */
gtk_label_set_text(GTK_LABEL(download_dir_label), g_strdup(gl_options->download_dir));
/* auto reconnect */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_reconnect_check_box),
gl_options->auto_reconnect);
/* shared directories */
iter = g_list_first(gl_options->shared_dirs);
while (iter) {
s = newtella_malloc(255);
s = strcpy(s, (gchar *)iter->data);
gtk_clist_append(GTK_CLIST(shared_dir_list), &s);
iter = g_list_next(iter);
}
}
void config_set_default(void)
{
/* default values for configuration */
gl_options->con_speed = 56;
gl_options->newtella_port = 6346;
gl_options->local_ip = gl_my_host_info->ip;
gl_options->max_downloads = 10;
gl_options->max_uploads = 10;
gl_options->max_uploads_per_host = 3;
gl_options->max_search_results = 1000;
gl_options->host_cache_length = 100;
gl_options->auto_reconnect = 1;
gl_options->min_con = 2;
gl_options->max_con = 3;
gl_options->auto_connect = 1;
gl_options->accept_in_con = 1;
strcpy(gl_options->download_dir, getenv("HOME"));
}
void config_speed_change(GtkWidget *widget, gpointer data)
{
gchar buf[255];
gchar *selection = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry));
if (!strcmp(selection, "Modem"))
gl_options->con_speed = 56;
else if (!strcmp(selection, "ISDN"))
gl_options->con_speed = 64;
else if (!strcmp(selection, "ISDN (Dual Channel)"))
gl_options->con_speed = 128;
else if (!strcmp(selection, "Cable Modem"))
gl_options->con_speed = 512;
else if (!strcmp(selection, "ADSL"))
gl_options->con_speed = 768;
else if (!strcmp(selection, "T1"))
gl_options->con_speed = 1024;
else if (!strcmp(selection, "T3"))
gl_options->con_speed = 10000;
else if (!strcmp(selection, "Custom..."))
return;
g_snprintf(buf, sizeof(buf), "%d", gl_options->con_speed);
gtk_entry_set_text(GTK_ENTRY(speed_edit_box), buf);
}
void config_speed_entry_change(GtkWidget *widget, gpointer data)
{
gchar *speed = gtk_entry_get_text(GTK_ENTRY(speed_edit_box));
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(speed_combo)->entry), "Custom...");
gl_options->con_speed = atoi(speed);
}
void config_file_request_destroy(GtkWidget *widget, gpointer data)
{
gtk_widget_destroy(GTK_WIDGET(data));
}
void config_dowload_dir(GtkWidget *widget, gpointer data)
{
gchar *download_path = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data));
if (is_directory(download_path)) {
strcpy(gl_options->download_dir, download_path);
gtk_label_set_text(GTK_LABEL(download_dir_label), g_strdup(gl_options->download_dir));
}
gtk_widget_destroy(GTK_WIDGET(data));
}
void config_download_dir_select(void)
{
GtkWidget *filesel;
filesel = gtk_file_selection_new("Please choose a directory to store your MP3s");
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
GTK_SIGNAL_FUNC(config_dowload_dir), (gpointer) filesel);
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked",
GTK_SIGNAL_FUNC(config_file_request_destroy), (gpointer) filesel);
gtk_widget_show(filesel);
}
int config_shared_exists(char *shared)
{
GList *iter;
iter = g_list_first(gl_options->shared_dirs);
while (iter) {
if (!strcmp((char *)iter->data, shared))
return 1;
iter = g_list_next(iter);
}
return 0;
}
void config_shared_dir_add(GtkWidget *widget, gpointer data)
{
gchar *shared_dir_new = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data));
gchar *s = newtella_malloc(255);
s = strcpy(s, shared_dir_new);
if (is_directory(shared_dir_new) && !config_shared_exists(shared_dir_new)) {
gl_options->shared_dirs = g_list_append(gl_options->shared_dirs, s);
/* update database */
file_build_db(shared_dir_new);
/* add entry to the list box */
gtk_clist_append(GTK_CLIST(shared_dir_list), &shared_dir_new);
}
gtk_widget_destroy(GTK_WIDGET(data));
}
void config_shared_dir_select(void)
{
GtkWidget *filesel;
filesel = gtk_file_selection_new("Please choose a directory containing your MP3 files");
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
GTK_SIGNAL_FUNC(config_shared_dir_add), (gpointer) filesel);
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked",
GTK_SIGNAL_FUNC(config_file_request_destroy), (gpointer) filesel);
gtk_widget_show(filesel);
}
void config_shared_dir_remove(void)
{
gint row = (gint) GTK_CLIST(shared_dir_list)->selection->data;
gchar *shared;
GList *iter;
gtk_clist_get_text(GTK_CLIST(shared_dir_list), row, 0, &shared);
/* remove songs from db */
file_exclude_from_db(shared);
gl_options->shared_dirs = g_list_remove(gl_options->shared_dirs, shared);
iter = g_list_first(gl_options->shared_dirs);
while (iter) {
if (!strcmp(shared, iter->data)) {
gl_options->shared_dirs = g_list_remove(gl_options->shared_dirs,
iter->data);
newtella_free(iter->data);
break;
}
iter = g_list_next(iter);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -