/*****************************************************************************/ /* Klavaro - a flexible touch typing tutor */ /* Copyright (C) 2005, 2006, 2007, 2008 Felipe Castro */ /* Copyright (C) 2009, 2010, 2011 Free Software Foundation */ /* */ /* This program is free software, licensed under the terms of the GNU */ /* General Public License as published by the Free Software Foundation, */ /* either version 3 of the License, or (at your option) any later version. */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /*****************************************************************************/ /* * Contest for fluidness performance */ #include #include #include #include #include #include #include #include #include #include #include #include "auxiliar.h" #include "main.h" #include "translation.h" #include "top10.h" /************************************************** * Variables */ Statistics top10_local[10]; Statistics top10_global[10]; GKeyFile *keyfile = NULL; /************************************************** * Functions */ void top10_init () { gint i; gchar *str; GtkListStore *list; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeView *tv; GtkTreeIter iter; GtkComboBox *cmb; renderer = gtk_cell_renderer_text_new (); /* Main info on treeview */ tv = GTK_TREE_VIEW (get_wg ("treeview_top10_1")); list = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model (tv, GTK_TREE_MODEL (list)); column = gtk_tree_view_column_new_with_attributes ("#", renderer, "text", 0, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("Name"), renderer, "text", 1, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("Score"), renderer, "text", 2, NULL); gtk_tree_view_append_column (tv, column); for (i = 0; i < 10; i++) { str = g_strdup_printf ("%02i", i + 1); gtk_list_store_append (list, &iter); gtk_list_store_set (list, &iter, 0, str, 1, "--------------------------", 2, "0.000", -1); g_free (str); } /* Extra info on treeview */ tv = GTK_TREE_VIEW (get_wg ("treeview_top10_2")); list = gtk_list_store_new (5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model (tv, GTK_TREE_MODEL (list)); column = gtk_tree_view_column_new_with_attributes (_("Accuracy"), renderer, "text", 0, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("Speed"), renderer, "text", 1, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("Fluidity"), renderer, "text", 2, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("Chars"), renderer, "text", 3, NULL); gtk_tree_view_append_column (tv, column); column = gtk_tree_view_column_new_with_attributes (_("When"), renderer, "text", 4, NULL); gtk_tree_view_append_column (tv, column); for (i = 0; i < 10; i++) { gtk_list_store_append (list, &iter); gtk_list_store_set (list, &iter, 0, "--", 1, "--", 2, "--", 3, "--", 4, "--", -1); } /* Set modules combo */ cmb = GTK_COMBO_BOX (get_wg ("combobox_stat_module")); for (i = 0; i < 4; i++) gtk_combo_box_remove_text (cmb, 0); str = g_strdup_printf ("1 - %s", _("Basic course")); gtk_combo_box_append_text (cmb, str); g_free (str); str = g_strdup_printf ("2 - %s", _("Adaptability")); gtk_combo_box_append_text (cmb, str); g_free (str); str = g_strdup_printf ("3 - %s", _("Speed")); gtk_combo_box_append_text (cmb, str); g_free (str); str = g_strdup_printf ("4 - %s", _("Fluidity")); gtk_combo_box_append_text (cmb, str); g_free (str); // Fix missing translation bug cmb = GTK_COMBO_BOX (get_wg ("combobox_top10")); gtk_combo_box_remove_text (cmb, 0); gtk_combo_box_append_text (cmb, _("Local scores")); gtk_combo_box_append_text (cmb, _("External scores")); } void top10_message (gchar * msg) { static gboolean init = TRUE; if (!init) gtk_statusbar_pop (GTK_STATUSBAR (get_wg ("statusbar_top10_message")), 0); if (msg == NULL) { gtk_statusbar_push (GTK_STATUSBAR (get_wg ("statusbar_top10_message")), 0, ""); return; } gtk_statusbar_push (GTK_STATUSBAR (get_wg ("statusbar_top10_message")), 0, msg); } #define NOBODY "xxx" void top10_clean_stat (gint i, gboolean locally) { Statistics *top10; top10 = locally ? top10_local : top10_global; if (i > 9) return; top10[i].lang[0] = 'x'; top10[i].lang[1] = 'x'; top10[i].genv = 'x'; top10[i].when = 0; top10[i].nchars = MIN_CHARS_TO_LOG; top10[i].accur = 0.0; top10[i].velo = 0.0; top10[i].fluid = 0.0; top10[i].score = 0.0; top10[i].name_len = strlen (NOBODY); strcpy (top10[i].name, NOBODY); } void top10_init_stats (gboolean locally) { gint i; for (i = 0; i < 10; i++) top10_clean_stat (i, locally); } void top10_insert_stat (Statistics * stat, gint i, gboolean locally) { gint j; Statistics *top10; top10 = locally ? top10_local : top10_global; if (i > 9) return; for (j = 8; j >= i; j--) memmove (&top10[j + 1], &top10[j], sizeof (Statistics)); memmove (&top10[i], stat, sizeof (Statistics)); } gboolean top10_compare_insert_stat (Statistics * stat, gboolean locally) { gint i, j; gint statnamelen; gchar *pos; Statistics *top10; top10 = locally ? top10_local : top10_global; statnamelen = strlen (stat->name); pos = strrchr (stat->name, '['); if (pos != NULL) if (pos > stat->name && *(pos - 1) == ' ') { statnamelen = pos - stat->name - 1; if (statnamelen < 1) statnamelen = strlen (stat->name); } for (i = 0; i < 10; i++) { if (stat->score > top10[i].score) { for (j = i - 1; j >= 0; j--) { if (strncmp (stat->name, top10[j].name, statnamelen) == 0) return (FALSE); } for (j = i; j < 10; j++) { if (strncmp (stat->name, top10[j].name, statnamelen) == 0 && stat->score > 0) { top10_delete_stat (j, locally); j--; } } top10_insert_stat (stat, i, locally); return (TRUE); } } return (FALSE); } void top10_delete_stat (gint i, gboolean locally) { gint j; Statistics *top10; top10 = locally ? top10_local : top10_global; if (i > 9) return; for (j = i; j < 9; j++) memmove (&top10[j], &top10[j + 1], sizeof (Statistics)); top10_clean_stat (9, locally); } gfloat top10_calc_score_old (Statistics * stat) { gfloat score; // Don't touch this anymore! score = (6 * stat->velo + 3 * stat->accur + stat->fluid) / 100; return (score); } gfloat top10_calc_score (Statistics * stat) { gfloat score; // Don't touch this anymore! (touched: new_WPM = 1.2 old_WPM) score = (6 * stat->velo / 1.2 + 3 * stat->accur + stat->fluid) / 100; return (score); } gboolean top10_validate_stat (Statistics * stat) { if (stat->score > 10.0 || stat->score < 0.0) { g_message ("Invalid score (%g): it must be between 0 and 10", stat->score); return (FALSE); } if ((stat->score - top10_calc_score (stat) > 1.0e-5) && (stat->score - top10_calc_score_old (stat) > 1.0e-5)) { g_message ("Invalid score (%g): did you try to edit the scores file?", stat->score); return (FALSE); } if (stat->fluid > 95) { g_message ("Invalid score (fluidness = %g): robots shouldn't compete with humans...", stat->fluid); return (FALSE); } return (TRUE); } gchar * top10_get_score_file (gboolean locally, gint lang) { gchar *tmp = NULL; gchar *ksc; if (lang < 0) tmp = main_preferences_get_string ("interface", "language"); else tmp = g_strdup (trans_get_code (lang)); if (tmp == NULL) tmp = g_strdup ("en"); if (tmp[0] == 'C') ksc = g_strdup (locally ? "local_en.ksc" : "global_en.ksc"); else ksc = g_strdup_printf ("%s_%c%c.ksc", locally ? "local" : "global", tmp[0], tmp[1]); g_free (tmp); return (ksc); } static void top10_merge_stats_from_file (gchar * file) { gint i, j; gint32 n; FILE *fh; Statistics top10; fh = g_fopen (file, "r"); if (fh == NULL) return; for (i = 0; i < 10; i++) { /* lang[0] */ top10.lang[0] = getc (fh); if (!g_ascii_isalpha (top10.lang[0])) { g_message ("Problem: lang[0] = %c", top10.lang[0]); break; } /* lang[1] */ top10.lang[1] = getc (fh); if (!g_ascii_isalpha (top10.lang[1])) { top10.lang[0] = 'e'; top10.lang[1] = 'o'; } /* genv */ top10.genv = getc (fh); if (top10.genv != 'x' && top10.genv != 'w') { g_message ("Problem: genv = %c", top10.genv); break; } /* when */ //n = fread (&top10.when, sizeof (time_t), 1, fh); n = fread (&top10.when, sizeof (gint32), 1, fh); if (n == 0) { g_message ("Problem: when = %li", top10.when); break; } /* nchars */ n = fread (&top10.nchars, sizeof (gint32), 1, fh); if (n == 0 || top10.nchars < MIN_CHARS_TO_LOG) { g_message ("Problem: nchars = %i, < %i", top10.nchars, MIN_CHARS_TO_LOG); break; } /* accur */ n = fread (&top10.accur, sizeof (gfloat), 1, fh); if (n == 0 || top10.accur < 0 || top10.accur > 100) { g_message ("Problem: accur = %f <> [0, 100]", top10.accur); break; } /* velo */ n = fread (&top10.velo, sizeof (gfloat), 1, fh); if (n == 0 || top10.velo < 0 || top10.velo > 300) { g_message ("Problem: velo = %f <> [0, 300]", top10.velo); break; } /* fluid */ n = fread (&top10.fluid, sizeof (gfloat), 1, fh); if (n == 0 || top10.fluid < 0 || top10.fluid > 100) { g_message ("Problem: fluid = %f <> [0, 100]", top10.fluid); break; } /* score */ n = fread (&top10.score, sizeof (gfloat), 1, fh); if (n == 0 || top10.score < 0 || top10.score > 20) { g_message ("Problem: score = %f <> [0, 20]", top10.score); break; } /* name_len */ n = fread (&top10.name_len, sizeof (gint32), 1, fh); if (n == 0 || top10.name_len < 0 || top10.name_len > MAX_NAME_LEN) { g_message ("Problem: name_len = %i <> [0, MAX_NAME_LEN]", top10.name_len); break; } /* name */ n = fread (&top10.name, sizeof (gchar), top10.name_len, fh); top10.name[top10.name_len] = '\0'; if (!g_utf8_validate (top10.name, -1, NULL)) { for (j = 0; j < top10.name_len; j++) if (!g_ascii_isalpha (top10.name[j])) top10.name[j] = '?'; } top10_compare_insert_stat (&top10, TRUE); } fclose (fh); } gboolean top10_read_stats_from_file (gboolean locally, gchar * file) { gint i, j; gint32 n; gboolean success; FILE *fh; Statistics *top10; top10 = locally ? top10_local : top10_global; fh = g_fopen (file, "r"); if (fh == NULL) return FALSE; for (i = 0; i < 10; i++) { success = FALSE; /* lang[0] */ top10[i].lang[0] = fgetc (fh); if (!g_ascii_isalpha (top10[i].lang[0])) { g_message ("Problem: lang[0] = %c", top10[i].lang[0]); break; } /* lang[1] */ top10[i].lang[1] = fgetc (fh); if (!g_ascii_isalpha (top10[i].lang[1])) { top10[i].lang[0] = 'e'; top10[i].lang[1] = 'o'; } /* genv */ top10[i].genv = fgetc (fh); if (top10[i].genv != 'x' && top10[i].genv != 'w') { g_message ("Problem: genv = %c", top10[i].genv); break; } /* when */ //n = fread (&top10[i].when, sizeof (time_t), 1, fh); n = fread (&top10[i].when, sizeof (gint32), 1, fh); if (n == 0) { g_message ("Problem: when = %li", top10[i].when); break; } /* nchars */ n = fread (&top10[i].nchars, sizeof (gint32), 1, fh); if (n == 0 || top10[i].nchars < MIN_CHARS_TO_LOG) { g_message ("Problem: nchars = %i, < %i", top10[i].nchars, MIN_CHARS_TO_LOG); break; } /* accur */ n = fread (&top10[i].accur, sizeof (gfloat), 1, fh); if (n == 0 || top10[i].accur < 0 || top10[i].accur > 100) { g_message ("Problem: accur = %f <> [0, 100]", top10[i].accur); break; } /* velo */ n = fread (&top10[i].velo, sizeof (gfloat), 1, fh); if (n == 0 || top10[i].velo < 0 || top10[i].velo > 300) { g_message ("Problem: velo = %f <> [0, 300]", top10[i].velo); break; } /* fluid */ n = fread (&top10[i].fluid, sizeof (gfloat), 1, fh); if (n == 0 || top10[i].fluid < 0 || top10[i].fluid > 100) { g_message ("Problem: fluid = %f <> [0, 100]", top10[i].fluid); break; } /* score */ n = fread (&top10[i].score, sizeof (gfloat), 1, fh); if (n == 0 || top10[i].score < 0 || top10[i].score > 20) { g_message ("Problem: score = %f <> [0, 20]", top10[i].score); break; } /* name_len */ n = fread (&top10[i].name_len, sizeof (gint32), 1, fh); if (n == 0 || top10[i].name_len < 0 || top10[i].name_len > MAX_NAME_LEN) { g_message ("Problem: name_len = %i <> [0, MAX_NAME_LEN]", top10[i].name_len); break; } /* name */ n = fread (&top10[i].name, sizeof (gchar), top10[i].name_len, fh); top10[i].name[top10[i].name_len] = '\0'; if (!g_utf8_validate (top10[i].name, -1, NULL)) { for (j = 0; j < top10[i].name_len; j++) if (!g_ascii_isalpha (top10[i].name[j])) top10[i].name[j] = '?'; } success = TRUE; } fclose (fh); return (success); } void top10_read_stats (gboolean locally, gint lang) { gchar *local_ksc; gchar *tmp; gchar *uname; gchar *stat_dir; gboolean success; GDir *home; top10_init_stats (locally); local_ksc = top10_get_score_file (locally, lang); tmp = g_build_filename (main_path_score (), local_ksc, NULL); if (!top10_read_stats_from_file (locally, tmp)) { g_message ("Could not read the scores file '%s'.\n Creating a blank one.", tmp); top10_init_stats (locally); top10_write_stats (locally, lang); //top10_show_stat (locally ? top10_local : top10_global); } g_free (tmp); if (!locally) { g_free (local_ksc); return; } /* Go search other users' subdirs */ tmp = strchr (main_path_stats (), G_DIR_SEPARATOR); if (tmp) tmp = strchr (tmp + 1, G_DIR_SEPARATOR); if (tmp) tmp = strchr (tmp + 1, G_DIR_SEPARATOR); if (tmp) { stat_dir = tmp + 1; home = g_dir_open ("/home", 0, NULL); } else { stat_dir = NULL; home = NULL; } success = FALSE; if (home) { while ((uname = (gchar*) g_dir_read_name (home))) { if (g_str_equal (uname, "root")) continue; if (g_str_equal (uname, "lost+found")) continue; if (g_str_equal (uname, g_get_user_name ())) continue; tmp = g_build_filename ("/home", uname, stat_dir, "ksc", local_ksc, NULL); if (g_file_test (tmp, G_FILE_TEST_IS_REGULAR)) { top10_merge_stats_from_file (tmp); success = TRUE; } g_free (tmp); } g_dir_close (home); } g_free (local_ksc); if (success) top10_write_stats (TRUE, -1); } void top10_write_stats (gboolean locally, gint lang) { gint i; gchar *filename; gchar *lsfile; FILE *fh; Statistics *top10; top10 = locally ? top10_local : top10_global; if (!g_file_test (main_path_score (), G_FILE_TEST_IS_DIR)) g_mkdir_with_parents (main_path_score (), DIR_PERM); filename = top10_get_score_file (locally, lang); lsfile = g_build_filename (main_path_score (), filename, NULL); fh = g_fopen (lsfile, "w"); if (fh == NULL) { g_warning ("Could not write the scores file in %s", main_path_score ()); g_free (filename); g_free (lsfile); return; } for (i = 0; i < 10; i++) { fputc (top10[i].lang[0], fh); fputc (top10[i].lang[1], fh); fputc (top10[i].genv, fh); //fwrite (&top10[i].when, sizeof (time_t), 1, fh); fwrite (&top10[i].when, sizeof (gint32), 1, fh); fwrite (&top10[i].nchars, sizeof (gint32), 1, fh); fwrite (&top10[i].accur, sizeof (gfloat), 1, fh); fwrite (&top10[i].velo, sizeof (gfloat), 1, fh); fwrite (&top10[i].fluid, sizeof (gfloat), 1, fh); fwrite (&top10[i].score, sizeof (gfloat), 1, fh); fwrite (&top10[i].name_len, sizeof (gint32), 1, fh); if (top10[i].name && top10[i].name_len > 0) fputs (top10[i].name, fh); } fputs ("KLAVARO!", fh); fclose (fh); g_free (filename); g_free (lsfile); } /* Test function to show every field of a scoring record, at the terminal */ void top10_show_stat (Statistics * stat) { g_print ("Language: %c%c\n", stat->lang[0], stat->lang[1]); g_print ("Graphical environment: %s\n", stat->genv == 'x' ? "Linux" : "Windows"); g_print ("When: %li\n", stat->when); g_print ("# of characters: %i\n", stat->nchars); g_print ("Accuracy: %2.1f\n", stat->accur); g_print ("Velocity: %2.1f\n", stat->velo); g_print ("Fluidness: %2.1f\n", stat->fluid); g_print ("Score: %05.1f\n", stat->score); g_print ("Name length: %i\n", stat->name_len); g_print ("Name: %s\n", stat->name); } void top10_show_stats (gboolean locally) { gint i; gboolean success; gchar *tmp; gchar *url; gchar *accur; gchar *velo; gchar *fluid; gchar *nchars; gchar *date; struct tm *ltime; Statistics *top10; GtkListStore *list1; GtkListStore *list2; GtkTreeIter iter1; GtkTreeIter iter2; top10 = locally ? top10_local : top10_global; top10_read_stats (locally, -1); top10_read_stats (!locally, -1); /* Set layout */ if (top10[0].score == 0.0) { top10_message (_("Empty ranking. Please practice fluidness.")); gtk_widget_set_sensitive (get_wg ("treeview_top10_1"), FALSE); gtk_widget_set_sensitive (get_wg ("treeview_top10_2"), FALSE); } else { gtk_widget_set_sensitive (get_wg ("treeview_top10_1"), TRUE); gtk_widget_set_sensitive (get_wg ("treeview_top10_2"), TRUE); } gtk_widget_set_sensitive (get_wg ("button_top10_update"), !locally); if (top10_local[0].score == 0.0) gtk_widget_set_sensitive (get_wg ("button_top10_publish"), FALSE); else gtk_widget_set_sensitive (get_wg ("button_top10_publish"), !locally); /* Set web link */ tmp = main_preferences_get_string ("interface", "language"); if (tmp[0] == 'C') { g_free (tmp); tmp = g_strdup ("en"); } url = g_strdup_printf ("http://" DOWNHOST "/%c%c/", tmp[0], tmp[1]); gtk_widget_set_tooltip_text (get_wg ("button_top10_go_www"), url); g_free (tmp); g_free (url); /* Print the ranking */ list1 = GTK_LIST_STORE ( gtk_tree_view_get_model (GTK_TREE_VIEW (get_wg ("treeview_top10_1"))) ); list2 = GTK_LIST_STORE ( gtk_tree_view_get_model (GTK_TREE_VIEW (get_wg ("treeview_top10_2"))) ); success = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list1), &iter1); success = (success && gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list2), &iter2)); if (! success) { g_warning ("not able to set Top10 Treeviews"); return; } for (i = 0; i < 10; i++) { if (top10[i].score == 0) { gtk_list_store_set (list1, &iter1, 1, "", 2, "", -1); gtk_list_store_set (list2, &iter2, 0, "", 1, "", 2, "", 3, "", 4, "", -1); } else { /* First treeview: main info */ tmp = g_strdup_printf ("%3.4f", top10[i].score); gtk_list_store_set (list1, &iter1, 1, top10[i].name, 2, tmp, -1); g_free (tmp); /* Second treeview: further info */ accur = g_strdup_printf ("%2.1f", top10[i].accur); velo = g_strdup_printf ("%2.1f", top10[i].velo); fluid = g_strdup_printf ("%2.1f", top10[i].fluid); nchars = g_strdup_printf ("%i", top10[i].nchars); ltime = localtime (&top10[i].when); date = g_strdup_printf ("%i-%2.2i-%2.2i %02i:%02i", (ltime->tm_year) + 1900, (ltime->tm_mon) + 1, (ltime->tm_mday), (ltime->tm_hour), (ltime->tm_min)); gtk_list_store_set (list2, &iter2, 0, accur, 1, velo, 2, fluid, 3, nchars, 4, date, -1); g_free (accur); g_free (velo); g_free (fluid); g_free (nchars); g_free (date); } gtk_tree_model_iter_next (GTK_TREE_MODEL (list1), &iter1); gtk_tree_model_iter_next (GTK_TREE_MODEL (list2), &iter2); } } gboolean top10_global_update (gpointer data) { gboolean fail; gchar *tmp; gchar *ksc; gchar *host; gchar *command; GtkImage *img; CURL *curl; FILE *fh; img = GTK_IMAGE (get_wg ("image_top10_update")); top10_message (NULL); if (!main_curl_ok ()) { tmp = g_strconcat (_("Not able to download files"), ": 'libcurl' ", _("not found"), ". ", _("Are you sure you have it installed in your system?"), NULL); top10_message (tmp); g_free (tmp); gtk_image_set_from_stock (img, "gtk-goto-bottom", GTK_ICON_SIZE_BUTTON); return FALSE; } /************************************************** * Download from downhost */ host = g_strdup (DOWNHOST); ksc = top10_get_score_file (GLOBAL, -1); if (! (curl = curl_easy_init ()) ) { g_message ("Not able to initialize 'curl'"); gtk_image_set_from_stock (img, "gtk-goto-bottom", GTK_ICON_SIZE_BUTTON); g_free (host); return FALSE; } if (!g_file_test (main_path_score (), G_FILE_TEST_IS_DIR)) g_mkdir_with_parents (main_path_score (), DIR_PERM); tmp = g_build_filename (main_path_score (), ksc, NULL); fail = TRUE; command = g_strdup_printf ("http://%s/%s", host, ksc); if ( (fh = g_fopen (tmp, "wb")) ) { /* curl_easy_setopt (curl, CURLOPT_VERBOSE, 1); */ curl_easy_setopt (curl, CURLOPT_TIMEOUT, TIMEOUT); curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT); curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME); curl_easy_setopt (curl, CURLOPT_URL, command); curl_easy_setopt (curl, CURLOPT_WRITEDATA, fh); fail = curl_easy_perform (curl); fclose (fh); } curl_easy_cleanup (curl); g_free (command); g_free (host); if (fail) { top10_message (_("Could not download file from the host server.")); gtk_image_set_from_stock (img, "gtk-goto-bottom", GTK_ICON_SIZE_BUTTON); g_free (ksc); g_free (tmp); return FALSE; } if (!g_file_test (tmp, G_FILE_TEST_IS_REGULAR)) g_message ("No file downloaded from the host server."); gtk_image_set_from_stock (img, "gtk-goto-bottom", GTK_ICON_SIZE_BUTTON); g_free (tmp); g_free (ksc); if (gtk_combo_box_get_active (GTK_COMBO_BOX (get_wg ("combobox_top10"))) == 0) top10_show_stats (LOCAL); else top10_show_stats (GLOBAL); return FALSE; } gboolean top10_global_publish (gpointer data) { gint i; gboolean success; gchar *tmp; gchar *ksc; gchar *host; gchar *path; gchar *username; gchar *url; GtkImage *img; FILE *fh, *fh2; struct stat fs; CURL *curl; fs.st_size = 0; img = GTK_IMAGE (get_wg ("image_top10_publish")); top10_message (NULL); if (!main_curl_ok ()) { tmp = g_strconcat (_("Not able to upload files"), ": 'libcurl' ", _("not found"), ". ", _("Are you sure you have it installed in your system?"), NULL); top10_message (tmp); g_free (tmp); gtk_image_set_from_stock (img, "gtk-goto-top", GTK_ICON_SIZE_BUTTON); return FALSE; } if (! (curl = curl_easy_init ())) { g_message ("Not able to initialize curl session"); gtk_image_set_from_stock (img, "gtk-goto-top", GTK_ICON_SIZE_BUTTON); return FALSE; } /************************************************** * Upload to uphost, updating local ranking */ host = g_strdup (CGI_SERVER); tmp = main_preferences_get_string ("interface", "language"); if (tmp[0] == 'C') { g_free (tmp); tmp = g_strdup ("en"); } ksc = g_strdup_printf ("local_%c%c.ksc", tmp[0], tmp[1]); path = g_build_filename (main_path_score (), ksc, NULL); g_free (ksc); g_stat (path, &fs); username = g_strdup (g_get_real_name ()); username = g_strdelimit (username, " ", '_'); if (strlen (username) == 0) { g_free (username); username = g_strdup (g_get_user_name ()); } ksc = g_strdup_printf ("%s_%s_%c%c.ksc", username, g_get_host_name (), tmp[0], tmp[1]); url = g_strdup_printf ("http://%s?dosiernomo=%s&lingvo=%c%c", host, ksc, tmp[0], tmp[1]); g_free (username); g_free (host); g_free (ksc); g_free (tmp); /* curl_easy_setopt (curl, CURLOPT_VERBOSE, 1); */ curl_easy_setopt (curl, CURLOPT_TIMEOUT, TIMEOUT); curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT); curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME); curl_easy_setopt (curl, CURLOPT_UPLOAD, TRUE); curl_easy_setopt (curl, CURLOPT_INFILESIZE, (long) fs.st_size); curl_easy_setopt (curl, CURLOPT_URL, url); success = FALSE; if ( (fh = g_fopen (path, "rb")) ) { i = 0; while (1) { tmp = g_strdup_printf ("%s/klavaro_%03i.html", g_get_tmp_dir (), i++); if ((fh2 = g_fopen (tmp, "wb"))) break; g_free (tmp); } g_free (tmp); curl_easy_setopt (curl, CURLOPT_READDATA, fh); curl_easy_setopt (curl, CURLOPT_WRITEDATA, fh2); if (curl_easy_perform (curl)) g_message ("HTTP upload failed!"); else success = TRUE; fclose (fh); fclose (fh2); } curl_easy_cleanup (curl); g_free (path); g_free (url); gtk_image_set_from_stock (img, "gtk-goto-top", GTK_ICON_SIZE_BUTTON); if (!success) top10_message (_("Could not upload/download scores.")); else g_idle_add ((GSourceFunc) top10_global_update, NULL); return FALSE; }