/*- * Copyright (c) 1999-2000 Robin Ericsson * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: backbone.c,v 1.6 2000/03/25 10:36:06 lobbin Exp $ */ #include "config.h" #include #include #include #include #include #include #include "gsfv.h" #include "callback.h" #include "dirtree.h" #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif #include "pixmaps/unprocessed.xpm" #include "pixmaps/ok.xpm" #include "pixmaps/error.xpm" #include "pixmaps/notfound.xpm" #include "pixmaps/skipped.xpm" #include "pixmaps/notpresent.xpm" GtkWidget *crc_entry; GtkWidget *check_button_log; GtkWidget *check_button_delete; GtkWidget *progress_total; GtkWidget *progress_file; GtkWidget *info_window; GtkWidget *label_filename; GtkWidget *label_size; GtkWidget *clist1; GtkWidget *check_addcomment; GtkWidget *check_addfileinfos; GtkWidget *button_comment; GtkWidget *button_abort; GtkWidget *create_label_comment; GtkWidget *entry_commentfile; GtkWidget *entry2; GtkWidget *label_active; GtkAdjustment *total_adjustment; GtkAdjustment *file_adjustment; static GdkPixmap *unprocessed, *ok, *error, *notfound, *skipped, *notpresent; gint amount; double total_filesize; gboolean skip_file; gboolean aborted; gboolean log; gboolean del_failed; gboolean add_fileinfos; gboolean add_comment; gboolean status_done; GList *create_files; void popup_window (gchar *string) { GtkWidget *popup_window; GtkWidget *vbox1; GtkWidget *popup_label; GtkWidget *hseparator1; GtkWidget *button1; popup_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (popup_window), "popup_window", popup_window); gtk_window_set_title (GTK_WINDOW (popup_window), "GSFV Popup"); gtk_window_set_policy (GTK_WINDOW (popup_window), TRUE, TRUE, FALSE); gtk_window_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE); vbox1 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (popup_window), "vbox1", vbox1); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (popup_window), vbox1); gtk_container_border_width (GTK_CONTAINER (vbox1), 5); popup_label = gtk_label_new (string); gtk_object_set_data (GTK_OBJECT (popup_window), "popup_label", popup_label); gtk_widget_show (popup_label); gtk_box_pack_start (GTK_BOX (vbox1), popup_label, FALSE, FALSE, 5); hseparator1 = gtk_hseparator_new (); gtk_object_set_data (GTK_OBJECT (popup_window), "hseparator1", hseparator1); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, TRUE, 0); button1 = gtk_button_new_with_label ("OK"); gtk_object_set_data (GTK_OBJECT (popup_window), "button1", button1); gtk_widget_show (button1); gtk_box_pack_start (GTK_BOX (vbox1), button1, TRUE, TRUE, 0); gtk_container_border_width (GTK_CONTAINER (button1), 5); gtk_signal_connect_object (GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (GTK_OBJECT (popup_window))); gtk_widget_show (popup_window); } void create_clist_append (FILE_DATA *fd, GtkCList *clist) { if (fd) { gchar *text[2]; gchar tempo[512]; g_snprintf (tempo, 512, "%d", (long) fd->filesize); text[0] = fd->filename; text[1] = g_strdup (tempo); gtk_clist_append (GTK_CLIST (clist), text); } } void gsfv_create_sfvfile () { FILE_DATA *fd; GtkWidget *create_sfv_window; GtkWidget *vbox1; GtkWidget *hbox2; GtkWidget *vbox3; GtkWidget *label3; GtkWidget *hbox4; GtkWidget *button_sfvfile; GtkWidget *hbox3; GtkWidget *scrolledwindow1; GtkWidget *clist2; GtkWidget *label6; GtkWidget *label7; GtkWidget *hseparator2; GtkWidget *hbox1; GtkWidget *label1; GtkWidget *button_prev; GtkWidget *button_next; struct dirent *file; DIR *directory; create_sfv_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "create_sfv_window", create_sfv_window); gtk_window_set_title (GTK_WINDOW (create_sfv_window), "Create SFV-File"); gtk_window_position (GTK_WINDOW (create_sfv_window), GTK_WIN_POS_CENTER); gtk_window_set_policy (GTK_WINDOW (create_sfv_window), TRUE, TRUE, FALSE); gtk_widget_set_usize (create_sfv_window, 400, 300); vbox1 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "vbox1", vbox1); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (create_sfv_window), vbox1); gtk_container_border_width (GTK_CONTAINER (vbox1), 5); hbox2 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "hbox2", hbox2); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0); vbox3 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "vbox3", vbox3); gtk_widget_show (vbox3); gtk_box_pack_start (GTK_BOX (hbox2), vbox3, FALSE, TRUE, 0); label3 = gtk_label_new ("SFV-File"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "label3", label3); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (vbox3), label3, FALSE, FALSE, 5); gtk_misc_set_alignment (GTK_MISC (label3), 0.0900002, 0.5); hbox4 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "hbox4", hbox4); gtk_widget_show (hbox4); gtk_box_pack_start (GTK_BOX (vbox3), hbox4, FALSE, FALSE, 3); entry2 = gtk_entry_new (); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "entry2", entry2); gtk_widget_show (entry2); gtk_box_pack_start (GTK_BOX (hbox4), entry2, FALSE, FALSE, 0); button_sfvfile = gtk_button_new_with_label ("Browse"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "button_sfvfile", button_sfvfile); gtk_widget_show (button_sfvfile); gtk_box_pack_start (GTK_BOX (hbox4), button_sfvfile, FALSE, FALSE, 5); gtk_signal_connect (GTK_OBJECT (button_sfvfile), "clicked", GTK_SIGNAL_FUNC (create_button_sfvfile_cb), NULL); check_addfileinfos = gtk_check_button_new_with_label ("Add Fileinfos?"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "check_addfileinfos", check_addfileinfos); gtk_widget_show (check_addfileinfos); gtk_box_pack_start (GTK_BOX (vbox3), check_addfileinfos, FALSE, FALSE, 5); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (check_addfileinfos), TRUE); check_addcomment = gtk_check_button_new_with_label ("Add Comment?"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "check_addcomment", check_addcomment); gtk_widget_show (check_addcomment); gtk_box_pack_start (GTK_BOX (vbox3), check_addcomment, FALSE, FALSE, 5); gtk_signal_connect (GTK_OBJECT (check_addcomment), "toggled", GTK_SIGNAL_FUNC (create_check_addcomment_cb), NULL); create_label_comment = gtk_label_new ("Comment File:"); gtk_widget_show (create_label_comment); gtk_box_pack_start (GTK_BOX (vbox3), create_label_comment, FALSE, FALSE, 0); gtk_misc_set_alignment (GTK_MISC (create_label_comment), 0.1, 0.5); hbox3 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "hbox3", hbox3); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (vbox3), hbox3, FALSE, TRUE, 0); gtk_container_border_width (GTK_CONTAINER (hbox3), 3); entry_commentfile = gtk_entry_new (); gtk_widget_show (entry_commentfile); gtk_box_pack_start (GTK_BOX (hbox3), entry_commentfile, FALSE, FALSE, 0); button_comment = gtk_button_new_with_label ("Browse"); gtk_widget_show (button_comment); gtk_box_pack_start (GTK_BOX (hbox3), button_comment, FALSE, FALSE, 5); gtk_signal_connect (GTK_OBJECT (button_comment), "clicked", GTK_SIGNAL_FUNC (button_comment_clicked), NULL); gtk_widget_set_sensitive (create_label_comment, FALSE); gtk_widget_set_sensitive (entry_commentfile, FALSE); gtk_widget_set_sensitive (button_comment, FALSE); scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "scrolledwindow1", scrolledwindow1); gtk_widget_show (scrolledwindow1); gtk_box_pack_start (GTK_BOX (hbox2), scrolledwindow1, TRUE, TRUE, 0); clist2 = gtk_clist_new (2); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "clist2", clist2); gtk_widget_show (clist2); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwindow1), clist2); gtk_clist_set_column_width (GTK_CLIST (clist2), 0, 70); gtk_clist_column_titles_show (GTK_CLIST (clist2)); gtk_clist_set_selection_mode (GTK_CLIST (clist2), GTK_SELECTION_MULTIPLE); gtk_signal_connect (GTK_OBJECT (clist2), "select_row", GTK_SIGNAL_FUNC (create_clist_select_row), NULL); gtk_signal_connect (GTK_OBJECT (clist2), "unselect_row", GTK_SIGNAL_FUNC (create_clist_unselect_row), NULL); label6 = gtk_label_new ("Filename"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "label6", label6); gtk_widget_show (label6); gtk_clist_set_column_widget (GTK_CLIST (clist2), 0, label6); gtk_widget_set_usize (label6, 16, -1); label7 = gtk_label_new ("Size"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "label7", label7); gtk_widget_show (label7); gtk_clist_set_column_widget (GTK_CLIST (clist2), 1, label7); hseparator2 = gtk_hseparator_new (); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "hseparator2", hseparator2); gtk_widget_show (hseparator2); gtk_box_pack_start (GTK_BOX (vbox1), hseparator2, FALSE, FALSE, 5); hbox1 = gtk_hbox_new (TRUE, 0); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "hbox1", hbox1); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0); label1 = gtk_label_new (""); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "label1", label1); gtk_widget_show (label1); gtk_box_pack_start (GTK_BOX (hbox1), label1, TRUE, TRUE, 0); button_prev = gtk_button_new_with_label ("<< Prev"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "button_prev", button_prev); gtk_widget_show (button_prev); gtk_box_pack_start (GTK_BOX (hbox1), button_prev, TRUE, TRUE, 0); gtk_signal_connect_object (GTK_OBJECT (button_prev), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (create_sfv_window)); button_next = gtk_button_new_with_label ("Next >>"); gtk_object_set_data (GTK_OBJECT (create_sfv_window), "button_next", button_next); gtk_signal_connect (GTK_OBJECT (button_next), "clicked", GTK_SIGNAL_FUNC (create_button_next_cb), NULL); gtk_widget_show (button_next); gtk_box_pack_start (GTK_BOX (hbox1), button_next, TRUE, TRUE, 0); directory = opendir (dirtree_get_dir (DIRTREE (tree))); if (directory == NULL) { popup_window (strerror (errno)); return; } while ((file = readdir (directory))) { struct stat buf; gchar tempo[1024] = ""; g_snprintf (tempo, 1024, "%s/%s", dirtree_get_dir (DIRTREE (tree)), (gchar *) file->d_name); stat (tempo, &buf); fd = (FILE_DATA *) g_malloc0 ( sizeof (FILE_DATA) ); fd->filename = g_strdup ((gchar *) file->d_name); fd->filesize = (long) buf.st_size; fd->exists = TRUE; fd->selected = FALSE; fd->ctime = buf.st_mtime; if (S_ISDIR (buf.st_mode)) continue; if (create_files == NULL) create_files = g_list_alloc (); create_files = g_list_append (create_files, fd); } closedir (directory); g_list_foreach (create_files, (GFunc) create_clist_append, clist2); gtk_widget_show (create_sfv_window); } void gsfv_verify_files () { GtkWidget *verify_window; GtkWidget *alignment1; GtkWidget *vbox2; GtkWidget *label; GtkWidget *hbox1; GtkWidget *select_file_button; GtkWidget *hseparator1; GtkWidget *hbox2; GtkWidget *button_prev; GtkWidget *button_next; verify_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (verify_window), "verify_window", verify_window); gtk_container_border_width (GTK_CONTAINER (verify_window), 6); gtk_window_set_title (GTK_WINDOW (verify_window), "Verify Files"); gtk_window_position (GTK_WINDOW (verify_window), GTK_WIN_POS_CENTER); gtk_window_set_policy (GTK_WINDOW (verify_window), FALSE, FALSE, FALSE); alignment1 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_object_set_data (GTK_OBJECT (verify_window), "alignment1", alignment1); gtk_widget_show (alignment1); gtk_container_add (GTK_CONTAINER (verify_window), alignment1); vbox2 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (verify_window), "vbox2", vbox2); gtk_widget_show (vbox2); gtk_container_add (GTK_CONTAINER (alignment1), vbox2); label = gtk_label_new ("CRC-File:"); gtk_object_set_data (GTK_OBJECT (verify_window), "label", label); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label), 0.0500002, 0.5); hbox1 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (verify_window), "hbox1", hbox1); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 1); crc_entry = gtk_entry_new (); gtk_object_set_data (GTK_OBJECT (verify_window), "crc_entry", crc_entry); gtk_widget_show (crc_entry); gtk_box_pack_start (GTK_BOX (hbox1), crc_entry, TRUE, TRUE, 3); select_file_button = gtk_button_new_with_label ("Browse"); gtk_object_set_data (GTK_OBJECT (verify_window), "select_file_button", select_file_button); gtk_widget_show (select_file_button); gtk_signal_connect (GTK_OBJECT (select_file_button), "clicked", GTK_SIGNAL_FUNC (select_file_button_cb), NULL); gtk_box_pack_start (GTK_BOX (hbox1), select_file_button, TRUE, TRUE, 3); check_button_log = gtk_check_button_new_with_label ("Log Bad Files?"); gtk_object_set_data (GTK_OBJECT (verify_window), "check_button_log", check_button_log); gtk_widget_show (check_button_log); gtk_box_pack_start (GTK_BOX (vbox2), check_button_log, FALSE, TRUE, 0); gtk_container_border_width (GTK_CONTAINER (check_button_log), 5); gtk_widget_set_sensitive (check_button_log, FALSE); check_button_delete = gtk_check_button_new_with_label ("Delete Failed?"); gtk_object_set_data (GTK_OBJECT (verify_window), "check_button_delete", check_button_delete); gtk_widget_show (check_button_delete); gtk_box_pack_start (GTK_BOX (vbox2), check_button_delete, FALSE, TRUE, 0); gtk_container_border_width (GTK_CONTAINER (check_button_delete), 5); hseparator1 = gtk_hseparator_new (); gtk_object_set_data (GTK_OBJECT (verify_window), "hseparator1", hseparator1); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox2), hseparator1, FALSE, TRUE, 0); hbox2 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (verify_window), "hbox2", hbox2); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 5); button_prev = gtk_button_new_with_label ("<< Prev"); gtk_object_set_data (GTK_OBJECT (verify_window), "button_prev", button_prev); gtk_widget_show (button_prev); gtk_box_pack_start (GTK_BOX (hbox2), button_prev, TRUE, TRUE, 0); gtk_signal_connect_object (GTK_OBJECT (button_prev), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (verify_window)); button_next = gtk_button_new_with_label ("Next >>"); gtk_object_set_data (GTK_OBJECT (verify_window), "button_next", button_next); gtk_widget_show (button_next); gtk_box_pack_start (GTK_BOX (hbox2), button_next, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT (button_next), "clicked", GTK_SIGNAL_FUNC (verify_button_next_cb), NULL); gtk_widget_show (verify_window); } void status_clist_append (FILE_DATA *fd, GtkCList *clist) { if (fd && fd->selected) { struct stat file_stat; gchar *text[1]; gchar filename[1024] = ""; text[0] = fd->filename; g_snprintf (filename, 1024, "%s/%s", dirtree_get_dir (DIRTREE (tree)), fd->filename); gtk_clist_append (GTK_CLIST (clist), text); if (!stat (filename, &file_stat)) { gtk_clist_set_pixtext (GTK_CLIST (clist), amount, 0, (gchar *) fd->filename, 5, unprocessed, NULL); total_filesize += (long) file_stat.st_size; fd->filesize = (long) file_stat.st_size; } else { gtk_clist_set_pixtext (GTK_CLIST (clist), amount, 0, fd->filename, 5, notfound, NULL); fd->exists = FALSE; } amount++; } } gint update_active_time (gpointer data) { struct timeval current; gchar string[10]; long active_time; int sec = 0, min = 0, hour = 0; if (aborted || status_done) return FALSE; gettimeofday (¤t, NULL); active_time = current.tv_sec - (long) data; hour = active_time / 3600; active_time -= hour *3600; min = active_time / 60; active_time -= min *60; sec = active_time; g_snprintf (string, 10, "%s%d:%s%d:%s%d", hour < 10 ? "0" : "", hour, min < 10 ? "0" : "", min, sec < 10 ? "0" : "", sec); gtk_label_set_text (GTK_LABEL (label_active), string); return TRUE; } gint start_sfvcheck (GList *files) { GList *tmp; gint amount2; amount2 = 0; for (tmp = files; tmp != NULL; tmp = tmp->next) { if (tmp->data != NULL) { FILE_DATA *fd; unsigned long crc; fd = (FILE_DATA *) tmp->data; if (fd && fd->exists) { FILE *fp; struct stat buf; long size; gchar tempo[30]; gchar tempo2[10]; gchar filename[1024] = ""; skip_file = aborted = status_done = FALSE; g_snprintf (filename, 1024, "%s/%s", dirtree_get_dir (DIRTREE (tree)), fd->filename); stat( filename, &buf ); size = (long) buf.st_size; fp = fopen (filename, "r"); file_adjustment->lower = 0; file_adjustment->upper = fd->filesize / 512; gtk_progress_set_adjustment (GTK_PROGRESS (progress_file), file_adjustment); gtk_progress_set_value (GTK_PROGRESS (progress_file), 0); gtk_label_set_text (GTK_LABEL (label_filename), fd->filename); g_snprintf (tempo, 30, "%li", (long) fd->filesize); gtk_label_set_text (GTK_LABEL (label_size), tempo); while (gtk_events_pending()) gtk_main_iteration(); crc = generate_file_crc32(fp, size); g_snprintf (tempo2, 10, "%08lx", crc); g_strup (tempo2); if (skip_file) { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, skipped, NULL); skip_file = FALSE; } else { if (aborted) { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, skipped, NULL); gtk_progress_set_value (GTK_PROGRESS (progress_total), total_adjustment->upper); return FALSE; } if (!g_strcasecmp (fd->crc, tempo2)) { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, ok, NULL); } else { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, error, NULL); if (del_failed) unlink (filename); } } } gtk_progress_set_value (GTK_PROGRESS (progress_total), gtk_progress_get_value (GTK_PROGRESS (progress_total)) + 1); while (gtk_events_pending()) gtk_main_iteration(); amount2++; } } status_done = TRUE; gtk_label_set_text (GTK_LABEL (GTK_BIN (button_abort)->child), "Done"); return FALSE; } gint start_sfvcreate (GList *files) { GList *tmp; gint amount2; amount2 = 0; for (tmp = files; tmp != NULL; tmp = tmp->next) { if (tmp->data != NULL) { FILE_DATA *fd; unsigned long crc; fd = (FILE_DATA *) tmp->data; if (fd && fd->selected) { FILE *fp; struct stat buf; long size; gchar tempo[30]; gchar tempo2[10]; gchar filename[1024] = ""; skip_file = aborted = FALSE; g_snprintf (filename, 1024, "%s/%s", dirtree_get_dir (DIRTREE (tree)), fd->filename); stat( filename, &buf ); size = (long) buf.st_size; fp = fopen (filename, "r"); file_adjustment->lower = 0; file_adjustment->upper = fd->filesize / 512; gtk_progress_set_adjustment (GTK_PROGRESS (progress_file), file_adjustment); gtk_progress_set_value (GTK_PROGRESS (progress_file), 0); gtk_label_set_text (GTK_LABEL (label_filename), fd->filename); g_snprintf (tempo, 30, "%li", (long) fd->filesize); gtk_label_set_text (GTK_LABEL (label_size), tempo); while (gtk_events_pending()) gtk_main_iteration(); crc = generate_file_crc32(fp, size); g_snprintf (tempo2, 10, "%08lx", crc); g_strup (tempo2); if (skip_file) { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, skipped, NULL); skip_file = FALSE; } else { if (aborted) { gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, skipped, NULL); gtk_progress_set_value (GTK_PROGRESS (progress_total), total_adjustment->upper); return FALSE; } gtk_clist_set_pixtext (GTK_CLIST (clist1), amount2, 0, (gchar *) fd->filename, 5, ok, NULL); fd->crc = g_strdup (tempo2); } } if (fd->selected) gtk_progress_set_value (GTK_PROGRESS (progress_total), gtk_progress_get_value (GTK_PROGRESS (progress_total)) + 1); while (gtk_events_pending()) gtk_main_iteration(); if (fd->selected) amount2++; } } write_sfvfile(create_files); status_done = TRUE; gtk_label_set_text (GTK_LABEL (GTK_BIN (button_abort)->child), "Done"); return FALSE; } void gsfv_do (GSFV_Type type, gpointer addc_log, gpointer addf_del, GList *link_sfv) { GtkWidget *vbox1; GtkWidget *hbox2; GtkWidget *vbox2; GtkWidget *hbox3; GtkWidget *label3; GtkWidget *label7; GtkWidget *label8; GtkWidget *hbox4; GtkWidget *label9; GtkWidget *label_total; GtkWidget *hbox5; GtkWidget *label12; GtkWidget *frame1; GtkWidget *table2; GtkWidget *label; GtkWidget *hseparator1; GtkWidget *hbox1; GtkWidget *hbox6; GtkWidget *scrolled; GtkWidget *label15; GtkWidget *button_skip; GtkWidget *pixmap_ok, *pixmap_notfound, *pixmap_error, *pixmap_notpresent, *pixmap_unprocessed, *pixmap_skipped; GtkWidget *temp_label; static GdkBitmap *mask; if (type == GSFV_VERIFY) { log = del_failed = FALSE; log = (gboolean) addc_log; del_failed = (gboolean) addf_del; } else { add_fileinfos = add_comment = FALSE; add_fileinfos = (gboolean) addc_log; add_comment = (gboolean) addf_del; } info_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (info_window), "info_window", info_window); gtk_widget_set_usize (info_window, 440, 240); gtk_container_border_width (GTK_CONTAINER (info_window), 6); gtk_window_set_policy (GTK_WINDOW (info_window), FALSE, FALSE, FALSE); if (type == GSFV_VERIFY) gtk_window_set_title (GTK_WINDOW (info_window), "Verify Files..."); else gtk_window_set_title (GTK_WINDOW (info_window), "Create SFV-File..."); vbox1 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "vbox1", vbox1); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (info_window), vbox1); hbox2 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox2", hbox2); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0); vbox2 = gtk_vbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "vbox2", vbox2); gtk_widget_show (vbox2); gtk_box_pack_start (GTK_BOX (hbox2), vbox2, TRUE, TRUE, 3); gtk_widget_set_usize (vbox2, 143, -1); hbox3 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox3", hbox3); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (vbox2), hbox3, FALSE, TRUE, 5); label3 = gtk_label_new ("Filename: "); gtk_object_set_data (GTK_OBJECT (info_window), "label3", label3); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (hbox3), label3, FALSE, TRUE, 0); label_filename = gtk_label_new ("The File Name"); gtk_object_set_data (GTK_OBJECT (info_window), "label_filename", label_filename); gtk_widget_show (label_filename); gtk_box_pack_start (GTK_BOX (hbox3), label_filename, FALSE, TRUE, 0); gtk_label_set_justify (GTK_LABEL (label_filename), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label_filename), 1.93715e-07, 0.5); label7 = gtk_label_new (" Size: "); gtk_object_set_data (GTK_OBJECT (info_window), "label7", label7); gtk_widget_show (label7); gtk_box_pack_start (GTK_BOX (hbox3), label7, FALSE, FALSE, 0); label_size = gtk_label_new ("150 000"); gtk_object_set_data (GTK_OBJECT (info_window), "label_size", label_size); gtk_widget_show (label_size); gtk_box_pack_start (GTK_BOX (hbox3), label_size, FALSE, FALSE, 0); label8 = gtk_label_new ("bytes"); gtk_object_set_data (GTK_OBJECT (info_window), "label8", label8); gtk_widget_show (label8); gtk_box_pack_start (GTK_BOX (hbox3), label8, FALSE, TRUE, 4); hbox4 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox4", hbox4); gtk_widget_show (hbox4); gtk_box_pack_start (GTK_BOX (vbox2), hbox4, FALSE, TRUE, 0); label9 = gtk_label_new ("Total of "); gtk_object_set_data (GTK_OBJECT (info_window), "label9", label9); gtk_widget_show (label9); gtk_box_pack_start (GTK_BOX (hbox4), label9, FALSE, TRUE, 0); label_total = gtk_label_new ("150 000 bytes."); gtk_object_set_data (GTK_OBJECT (info_window), "label_total", label_total); gtk_widget_show (label_total); gtk_box_pack_start (GTK_BOX (hbox4), label_total, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label_total), 1.93715e-07, 0.5); hbox5 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox5", hbox5); gtk_widget_show (hbox5); gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, TRUE, 5); label12 = gtk_label_new ("Active time: "); gtk_object_set_data (GTK_OBJECT (info_window), "label12", label12); gtk_widget_show (label12); gtk_box_pack_start (GTK_BOX (hbox5), label12, FALSE, TRUE, 0); label_active = gtk_label_new ("00:00:00"); gtk_object_set_data (GTK_OBJECT (info_window), "label_active", label_active); gtk_widget_show (label_active); gtk_box_pack_start (GTK_BOX (hbox5), label_active, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label_active), 1.93715e-07, 0.5); frame1 = gtk_frame_new (" Color Explanation "); gtk_object_set_data (GTK_OBJECT (info_window), "frame1", frame1); gtk_widget_show (frame1); gtk_box_pack_start (GTK_BOX (vbox2), frame1, TRUE, TRUE, 0); gtk_frame_set_label_align (GTK_FRAME (frame1), 0.08, 0.5); table2 = gtk_table_new (2, 6, FALSE); gtk_object_set_data (GTK_OBJECT (info_window), "table2", table2); gtk_widget_show (table2); gtk_container_add (GTK_CONTAINER (frame1), table2); gtk_container_border_width (GTK_CONTAINER (table2), 3); gtk_widget_realize (info_window); if (notpresent == NULL) { notpresent = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) notpresent_xpm); } pixmap_notpresent = gtk_pixmap_new (notpresent, mask); gtk_widget_show (pixmap_notpresent); gtk_table_attach (GTK_TABLE (table2), pixmap_notpresent, 4, 5, 1, 2, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, 0, 0); if (unprocessed == NULL) { unprocessed = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) unprocessed_xpm); } pixmap_unprocessed = gtk_pixmap_new (unprocessed, mask); gtk_widget_show (pixmap_unprocessed); gtk_table_attach (GTK_TABLE (table2), pixmap_unprocessed, 0, 1, 0, 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); if (ok == NULL) { ok = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) ok_xpm); } pixmap_ok = gtk_pixmap_new (ok, mask); gtk_widget_show (pixmap_ok); gtk_table_attach (GTK_TABLE (table2), pixmap_ok, 2, 3, 0, 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); if (error == NULL) { error = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) error_xpm); } pixmap_error = gtk_pixmap_new (error, mask); gtk_widget_show (pixmap_error); gtk_table_attach (GTK_TABLE (table2), pixmap_error, 4, 5, 0, 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); if (notfound == NULL) { notfound = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) notfound_xpm); } pixmap_notfound = gtk_pixmap_new (notfound, mask); gtk_widget_show (pixmap_notfound); gtk_table_attach (GTK_TABLE (table2), pixmap_notfound, 0, 1, 1, 2, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); if (skipped == NULL) { skipped = gdk_pixmap_create_from_xpm_d (info_window->window, &mask, &info_window->style->bg[GTK_STATE_NORMAL], (gchar **) skipped_xpm); } pixmap_skipped = gtk_pixmap_new (skipped, mask); gtk_widget_show (pixmap_skipped); gtk_table_attach (GTK_TABLE (table2), pixmap_skipped, 2, 3, 1, 2, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("Not Found"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 1, 2, 1, 2, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("Unprocessed"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 1, 2, 0, 1, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("OK"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 3, 4, 0, 1, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("Skipped"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 3, 4, 1, 2, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("Error"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 5, 6, 0, 1, (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0); temp_label = gtk_label_new ("Not Present\nIn SFV-File"); gtk_widget_show (temp_label); gtk_table_attach (GTK_TABLE (table2), temp_label, 5, 6, 1, 2, (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0); file_adjustment = (GtkAdjustment *) gtk_adjustment_new (0, 1, 10, 0, 0, 0); progress_file = gtk_progress_bar_new_with_adjustment (file_adjustment); gtk_object_set_data (GTK_OBJECT (info_window), "progress_file", progress_file); gtk_widget_show (progress_file); gtk_box_pack_start (GTK_BOX (vbox2), progress_file, FALSE, TRUE, 5); total_adjustment = (GtkAdjustment *) gtk_adjustment_new (0, 1, 10, 0, 0, 0); progress_total = gtk_progress_bar_new_with_adjustment (total_adjustment); gtk_object_set_data (GTK_OBJECT (info_window), "progress_total", progress_total); gtk_widget_show (progress_total); gtk_box_pack_start (GTK_BOX (vbox2), progress_total, FALSE, TRUE, 5); hbox6 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox6", hbox6); gtk_widget_show (hbox6); gtk_box_pack_start (GTK_BOX (hbox2), hbox6, TRUE, TRUE, 0); clist1 = gtk_clist_new (1); gtk_object_set_data (GTK_OBJECT (info_window), "clist1", clist1); gtk_widget_show (clist1); gtk_widget_set_usize (clist1, 50, -1); gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 80); gtk_clist_column_titles_show (GTK_CLIST (clist1)); gtk_widget_realize (info_window); amount = total_filesize = 0; g_list_foreach (link_sfv, (GFunc) status_clist_append, clist1); total_adjustment->lower = 0; total_adjustment->upper = amount; gtk_progress_set_adjustment (GTK_PROGRESS (progress_total), total_adjustment); { gchar temp[30]; g_snprintf (temp, 30, "%d bytes", (long) total_filesize); gtk_label_set_text (GTK_LABEL (label_total), temp); } label = gtk_label_new ("Files"); gtk_object_set_data (GTK_OBJECT (info_window), "label", label); gtk_widget_show (label); gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, label); scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled), clist1); gtk_box_pack_start (GTK_BOX (hbox6), scrolled, TRUE, TRUE, 0); gtk_widget_show (scrolled); hseparator1 = gtk_hseparator_new (); gtk_object_set_data (GTK_OBJECT (info_window), "hseparator1", hseparator1); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, TRUE, 2); hbox1 = gtk_hbox_new (FALSE, 0); gtk_object_set_data (GTK_OBJECT (info_window), "hbox1", hbox1); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 2); label15 = gtk_label_new (""); gtk_object_set_data (GTK_OBJECT (info_window), "label15", label15); gtk_widget_show (label15); gtk_box_pack_start (GTK_BOX (hbox1), label15, TRUE, TRUE, 0); gtk_widget_set_usize (label15, 35, -1); button_skip = gtk_button_new_with_label ("Skip File"); gtk_object_set_data (GTK_OBJECT (info_window), "button_skip", button_skip); gtk_signal_connect (GTK_OBJECT (button_skip), "clicked", GTK_SIGNAL_FUNC (status_button_skip_cb), NULL); gtk_widget_show (button_skip); gtk_box_pack_start (GTK_BOX (hbox1), button_skip, TRUE, TRUE, 0); button_abort = gtk_button_new_with_label ("Abort"); gtk_object_set_data (GTK_OBJECT (info_window), "button_abort", button_abort); gtk_signal_connect (GTK_OBJECT (button_abort), "clicked", GTK_SIGNAL_FUNC (status_button_abort_cb), NULL); gtk_widget_show (button_abort); gtk_box_pack_start (GTK_BOX (hbox1), button_abort, TRUE, TRUE, 0); gtk_widget_show (info_window); if (type == GSFV_VERIFY) gtk_timeout_add (500, (GtkFunction) start_sfvcheck, link_sfv); if (type == GSFV_CREATE) gtk_timeout_add (500, (GtkFunction) start_sfvcreate, link_sfv); { struct timeval current_time; gettimeofday (¤t_time, NULL); gtk_timeout_add (1000, (GtkFunction) update_active_time, (gpointer) current_time.tv_sec); } }