Thread: [Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [31] trunk/extractor/extractor.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2007-09-16 10:29:27
|
Revision: 31 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=31&view=rev Author: someone-guy Date: 2007-09-16 03:29:26 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Factor out the file open function from the gui code Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2007-09-16 10:29:17 UTC (rev 30) +++ trunk/extractor/extractor.c 2007-09-16 10:29:26 UTC (rev 31) @@ -111,6 +111,24 @@ } } +static int open_file(char *fname, fmt_desc_t *fmt) { + // close previous file and free its data + if (cur_fmt && flist) + cur_fmt->free_list(flist); + flist = NULL; + cur_fmt = fmt; + if (input_file) + fclose(input_file); + + // open new file + input_file = fopen(fname, "rb"); + if (!input_file) + return 0; + flist = cur_fmt->get_list(input_file); + set_treeview(flist); + return 1; +} + /** * \brief called when a new archive is selected */ @@ -126,24 +144,12 @@ goto err_out; } - // close previous file and free its data - if (cur_fmt && flist) - cur_fmt->free_list(flist); - flist = NULL; - cur_fmt = *fmt; - if (input_file) - fclose(input_file); - - // open new file - input_file = fopen(fname, "rb"); - if (!input_file) { + if (!open_file(fname, *fmt)) { SHOW_MSG(GTK_MESSAGE_ERROR, _("Error opening file '%s': %s"), fname, g_strerror(errno)); goto err_out; } g_free(fname); - flist = cur_fmt->get_list(input_file); - set_treeview(flist); return; err_out: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-09-16 10:29:34
|
Revision: 32 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=32&view=rev Author: someone-guy Date: 2007-09-16 03:29:33 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Default to generic format if none is given Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2007-09-16 10:29:26 UTC (rev 31) +++ trunk/extractor/extractor.c 2007-09-16 10:29:33 UTC (rev 32) @@ -112,6 +112,8 @@ } static int open_file(char *fname, fmt_desc_t *fmt) { + if (!fmt) + fmt = &generic_fmt; // close previous file and free its data if (cur_fmt && flist) cur_fmt->free_list(flist); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-09-16 10:29:43
|
Revision: 33 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=33&view=rev Author: someone-guy Date: 2007-09-16 03:29:42 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Support giving a file name on the command line Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2007-09-16 10:29:33 UTC (rev 32) +++ trunk/extractor/extractor.c 2007-09-16 10:29:42 UTC (rev 33) @@ -278,6 +278,8 @@ gtk_window_set_default_size(GTK_WINDOW(window), -1, 400); gtk_widget_show_all(window); + if (argc > 1) + open_file(argv[1], NULL); gtk_main(); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:00:07
|
Revision: 57 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=57&view=rev Author: someone-guy Date: 2008-02-22 14:00:04 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Avoid a crash if we could not open an output file Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-22 21:59:06 UTC (rev 56) +++ trunk/extractor/extractor.c 2008-02-22 22:00:04 UTC (rev 57) @@ -77,7 +77,8 @@ strcat(fname, "/"); strcat(fname, file->name); out = fopen(fname, "wb"); - cur_fmt->extract_file(input_file, file, out); + if (out) + cur_fmt->extract_file(input_file, file, out); fclose(out); free(fname); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:05:45
|
Revision: 58 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=58&view=rev Author: someone-guy Date: 2008-02-22 14:05:39 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Replace '/' in file names by '_' Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-22 22:00:04 UTC (rev 57) +++ trunk/extractor/extractor.c 2008-02-22 22:05:39 UTC (rev 58) @@ -69,6 +69,7 @@ static void extract_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { char *fname; + char *good_slash, *slash; file_t *file; FILE *out; gtk_tree_model_get(model, iter, PTR_COL, &file, -1); @@ -76,6 +77,9 @@ strcpy(fname, data); strcat(fname, "/"); strcat(fname, file->name); + good_slash = fname + strlen(data); + while ((slash = strrchr(fname, '/')) > good_slash) + *slash = '_'; out = fopen(fname, "wb"); if (out) cur_fmt->extract_file(input_file, file, out); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:34:15
|
Revision: 63 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=63&view=rev Author: someone-guy Date: 2008-02-22 14:34:11 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Format auto-detection for file given on command-line Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-22 22:18:20 UTC (rev 62) +++ trunk/extractor/extractor.c 2008-02-22 22:34:11 UTC (rev 63) @@ -119,13 +119,11 @@ } static int open_file(const char *fname, const fmt_desc_t *fmt) { - if (!fmt) - fmt = &generic_fmt; // close previous file and free its data if (cur_fmt && flist) cur_fmt->free_list(flist); flist = NULL; - cur_fmt = fmt; + cur_fmt = NULL; if (input_file) fclose(input_file); @@ -133,6 +131,18 @@ input_file = fopen(fname, "rb"); if (!input_file) return 0; + if (!fmt) { + int i; + for (i = 0; fmts[i]; i++) { + if (fmts[i]->check_file && fmts[i]->check_file(input_file)) { + fmt = fmts[i]; + break; + } + } + } + if (!fmt) + fmt = &generic_fmt; + cur_fmt = fmt; flist = cur_fmt->get_list(input_file); set_treeview(flist); return 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-03-05 20:28:58
|
Revision: 69 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=69&view=rev Author: someone-guy Date: 2008-03-05 12:28:53 -0800 (Wed, 05 Mar 2008) Log Message: ----------- Add (slightly ugly) image preview code. Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-03-05 20:28:46 UTC (rev 68) +++ trunk/extractor/extractor.c 2008-03-05 20:28:53 UTC (rev 69) @@ -191,9 +191,54 @@ return FALSE; } +#define MAX_IMG_SZ (100*1024*1024) + +/** + * Called when user double-clicks on a archive content + */ +static void row_activate(GtkTreeView *treeview, GtkTreePath *path, + GtkTreeViewColumn *col, gpointer data) { + GtkTreeModel *model = gtk_tree_view_get_model(treeview); + GtkTreeIter iter; + GtkWidget *preview_win = data; + file_t *file; + FILE *tmpf; + int size; + uint8_t *tmpdata; + GdkPixbufLoader *pbl; + GdkPixbuf *pb; + GtkWidget *img = gtk_bin_get_child(GTK_BIN(preview_win)); + if (img) + gtk_container_remove(GTK_CONTAINER(preview_win), img); + + if (!gtk_tree_model_get_iter(model, &iter, path)) + return; + gtk_tree_model_get(model, &iter, PTR_COL, &file, -1); + tmpf = tmpfile(); + cur_fmt->extract_file(input_file, file, tmpf); + fseek(tmpf, 0, SEEK_END); + size = ftell(tmpf); + if (size > MAX_IMG_SZ) size = MAX_IMG_SZ; + rewind(tmpf); + tmpdata = malloc(size); + fread(tmpdata, 1, size, tmpf); + fclose(tmpf); + pbl = gdk_pixbuf_loader_new(); + gdk_pixbuf_loader_write(pbl, tmpdata, size, NULL); + free(tmpdata); + gdk_pixbuf_loader_close(pbl, NULL); + pb = gdk_pixbuf_loader_get_pixbuf(pbl); + img = gtk_image_new_from_pixbuf(pb); + g_object_unref(pbl); + gtk_container_add(GTK_CONTAINER(preview_win), img); + gtk_widget_show(img); + gtk_window_present(GTK_WINDOW(preview_win)); +} + int main(int argc, char *argv[]) { int i; GtkWidget *window; + GtkWidget *preview_win; GtkWidget *table; GtkWidget *file_button; GtkWidget *button; @@ -208,6 +253,11 @@ gtk_disable_setlocale(); gtk_init(&argc, &argv); + preview_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_resizable(GTK_WINDOW(preview_win), FALSE); + g_signal_connect(G_OBJECT(preview_win), "delete_event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), _("extractor")); g_signal_connect(G_OBJECT(window), "delete_event", @@ -242,6 +292,8 @@ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + g_signal_connect(G_OBJECT(treeview), "row-activated", + G_CALLBACK(row_activate), preview_win); gtk_container_add(GTK_CONTAINER(scrollwin), treeview); row++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-03-08 20:11:10
|
Revision: 70 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=70&view=rev Author: someone-guy Date: 2008-03-08 12:11:07 -0800 (Sat, 08 Mar 2008) Log Message: ----------- Fix wrong type of SIZE_COL, this probably caused crashes on all 32 bit architectures Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-03-05 20:28:53 UTC (rev 69) +++ trunk/extractor/extractor.c 2008-03-08 20:11:07 UTC (rev 70) @@ -48,7 +48,7 @@ //! types of columns in the file list table const int coltypes[] = { [FNAME_COL] = G_TYPE_STRING, - [SIZE_COL] = G_TYPE_INT, + [SIZE_COL] = G_TYPE_UINT64, [COMPR_COL] = G_TYPE_BOOLEAN, [PTR_COL] = G_TYPE_POINTER, }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-04-06 21:57:16
|
Revision: 78 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=78&view=rev Author: someone-guy Date: 2008-04-06 14:57:14 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Switch to the much faster GtkListStore (instead of GtkTreeStore). Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-04-06 21:39:31 UTC (rev 77) +++ trunk/extractor/extractor.c 2008-04-06 21:57:14 UTC (rev 78) @@ -55,7 +55,7 @@ }; GtkWidget *dir_button; -GtkTreeStore *ftree; +GtkListStore *gflist; GtkTreeSelection *selection; FILE *input_file = NULL; file_t *flist = NULL; @@ -98,7 +98,7 @@ } static void clear_treeview() { - gtk_tree_store_clear(ftree); + gtk_list_store_clear(gflist); } /** @@ -112,8 +112,8 @@ clear_treeview(); if (!list) return; while (list->name) { - gtk_tree_store_append(ftree, &iter, NULL); - gtk_tree_store_set(ftree, &iter, FNAME_COL, list->name, + gtk_list_store_append(gflist, &iter); + gtk_list_store_set(gflist, &iter, FNAME_COL, list->name, SIZE_COL, list->len, COMPR_COL, list->compressed, PTR_COL, list, -1); list++; } @@ -264,9 +264,9 @@ gtk_table_attach(GTK_TABLE(table), scrollwin, col, col + 3, row, row + 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0); - ftree = gtk_tree_store_new(N_COLS, coltypes[0], coltypes[1], coltypes[2], + gflist = gtk_list_store_new(N_COLS, coltypes[0], coltypes[1], coltypes[2], coltypes[3]); - sort = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(ftree)); + sort = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(gflist)); treeview = gtk_tree_view_new_with_model(sort); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE); renderer = gtk_cell_renderer_text_new(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-05-23 17:48:16
|
Revision: 79 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=79&view=rev Author: someone-guy Date: 2008-05-23 10:48:07 -0700 (Fri, 23 May 2008) Log Message: ----------- Add offset column Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-04-06 21:57:14 UTC (rev 78) +++ trunk/extractor/extractor.c 2008-05-23 17:48:07 UTC (rev 79) @@ -41,6 +41,7 @@ enum { FNAME_COL, SIZE_COL, + OFFSET_COL, COMPR_COL, PTR_COL, N_COLS @@ -50,6 +51,7 @@ const int coltypes[] = { [FNAME_COL] = G_TYPE_STRING, [SIZE_COL] = G_TYPE_UINT64, + [OFFSET_COL] = G_TYPE_UINT64, [COMPR_COL] = G_TYPE_BOOLEAN, [PTR_COL] = G_TYPE_POINTER, }; @@ -114,7 +116,7 @@ while (list->name) { gtk_list_store_append(gflist, &iter); gtk_list_store_set(gflist, &iter, FNAME_COL, list->name, - SIZE_COL, list->len, COMPR_COL, list->compressed, PTR_COL, list, -1); + SIZE_COL, list->len, OFFSET_COL, list->start, COMPR_COL, list->compressed, PTR_COL, list, -1); list++; } } @@ -265,7 +267,7 @@ (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0); gflist = gtk_list_store_new(N_COLS, coltypes[0], coltypes[1], coltypes[2], - coltypes[3]); + coltypes[3], coltypes[4]); sort = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(gflist)); treeview = gtk_tree_view_new_with_model(sort); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE); @@ -279,6 +281,11 @@ "text", SIZE_COL, NULL); gtk_tree_view_column_set_sort_column_id(column, SIZE_COL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Offset"), renderer, + "text", OFFSET_COL, NULL); + gtk_tree_view_column_set_sort_column_id(column, OFFSET_COL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_toggle_new(); column = gtk_tree_view_column_new_with_attributes(_("Compressed"), renderer, "active", COMPR_COL, NULL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-05-23 17:48:23
|
Revision: 80 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=80&view=rev Author: someone-guy Date: 2008-05-23 10:48:15 -0700 (Fri, 23 May 2008) Log Message: ----------- Add empty lines for better readability Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-05-23 17:48:07 UTC (rev 79) +++ trunk/extractor/extractor.c 2008-05-23 17:48:15 UTC (rev 80) @@ -271,26 +271,31 @@ sort = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(gflist)); treeview = gtk_tree_view_new_with_model(sort); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE); + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Filename"), renderer, "text", FNAME_COL, NULL); gtk_tree_view_column_set_sort_column_id(column, FNAME_COL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer, "text", SIZE_COL, NULL); gtk_tree_view_column_set_sort_column_id(column, SIZE_COL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Offset"), renderer, "text", OFFSET_COL, NULL); gtk_tree_view_column_set_sort_column_id(column, OFFSET_COL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + renderer = gtk_cell_renderer_toggle_new(); column = gtk_tree_view_column_new_with_attributes(_("Compressed"), renderer, "active", COMPR_COL, NULL); gtk_tree_view_column_set_sort_column_id(column, COMPR_COL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_signal_connect(G_OBJECT(treeview), "row-activated", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |