Author: peter Date: 2008-07-07 23:01:09 +0000 (Mon, 07 Jul 2008) New Revision: 27234
Modified: squeeze/trunk/data/zip.squeeze squeeze/trunk/libsqueeze/archive-iter.c squeeze/trunk/libsqueeze/archive.c squeeze/trunk/libsqueeze/archive.h squeeze/trunk/libsqueeze/command-queue.c squeeze/trunk/libsqueeze/parser-context.c squeeze/trunk/libsqueeze/parser-context.h squeeze/trunk/libsqueeze/scanf-parser.c Log: Open archive works now. partialy fixed zip.squeeze Modified: squeeze/trunk/data/zip.squeeze =================================================================== --- squeeze/trunk/data/zip.squeeze 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/data/zip.squeeze 2008-07-07 23:01:09 UTC (rev 27234) @@ -2,14 +2,24 @@ Name=Zip Version=1.0 Type=X-Squeeze-Archiver -MimeType=application/x-zip +MimeType=application/zip;application/x-zip X-Squeeze-Version=0.3 +[application/zip] +X-Squeeze-Requires=zip;unzip +X-Squeeze-New=zip +X-Squeeze-Add=zip +X-Squeeze-Remove=zip +X-Squeeze-Extract=zip +X-Squeeze-Refresh=unzip -lv -qq %a + [application/x-zip] -X-Squeeze-Requires=zip +X-Squeeze-Requires=zip;unzip X-Squeeze-New=zip X-Squeeze-Add=zip X-Squeeze-Remove=zip +X-Squeeze-Extract=zip +X-Squeeze-Refresh=unzip -lv -qq %a [Squeeze-Add] [Squeeze-Remove] @@ -18,12 +28,12 @@ X-Squeeze-Options=Password;Overwrite;w00t [Squeeze-Refresh] -X-Squeeze-Headers=Rights;Owner/Group;Size;Date;Time;Name +X-Squeeze-Headers=Size;Method;Compressed;Ratio;Date;Time;CRC-32 # Tar does not support passwords, this is just for illustrative purposes X-Squeeze-Options=Password # I wonder if this will be enough... -X-Squeeze-Parse=%s %s %u %s %s %F +X-Squeeze-Parse=%u %s %u %s %s %s %s %F X-Squeeze-Separator=space [Squeeze-Option-Password] Modified: squeeze/trunk/libsqueeze/archive-iter.c =================================================================== --- squeeze/trunk/libsqueeze/archive-iter.c 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/archive-iter.c 2008-07-07 23:01:09 UTC (rev 27234) @@ -1448,11 +1448,11 @@ props_iter += sizeof(gchar *); break; case G_TYPE_UINT: - (*((guint *)props_iter)) = ((const guint)props[i]); + (*((guint *)props_iter)) = *((const guint *)props[i]); props_iter += sizeof(guint); break; case G_TYPE_UINT64: - (*((guint64 *)props_iter)) = (*(const guint64 *)props[i]); + (*((guint64 *)props_iter)) = *((const guint64 *)props[i]); props_iter += sizeof(guint64); break; } Modified: squeeze/trunk/libsqueeze/archive.c =================================================================== --- squeeze/trunk/libsqueeze/archive.c 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/archive.c 2008-07-07 23:01:09 UTC (rev 27234) @@ -31,8 +31,8 @@ #include "slist.h" #include "archive-tempfs.h" +#include "command-queue.h" - #include "internals.h" #ifndef LSQ_ENTRY_CHILD_BUFFER_SIZE Modified: squeeze/trunk/libsqueeze/archive.h =================================================================== --- squeeze/trunk/libsqueeze/archive.h 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/archive.h 2008-07-07 23:01:09 UTC (rev 27234) @@ -116,7 +116,10 @@ LSQArchiveState lsq_archive_get_state(const LSQArchive *archive); +void +lsq_archive_refreshed(const LSQArchive *archive); + G_END_DECLS #endif /* __ARCHIVE_H__ */ Modified: squeeze/trunk/libsqueeze/command-queue.c =================================================================== --- squeeze/trunk/libsqueeze/command-queue.c 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/command-queue.c 2008-07-07 23:01:09 UTC (rev 27234) @@ -18,6 +18,7 @@ #include <glib.h> #include <glib-object.h> #include <signal.h> +#include <string.h> #include <thunar-vfs/thunar-vfs.h> #include "libsqueeze.h" @@ -64,6 +65,8 @@ } state; }; +static void lsq_command_entry_start(LSQCommandEntry *entry, LSQExecuteContext *ctx); + static void build_queue(LSQCommandQueue *queue, const gchar *command_string); G_DEFINE_TYPE(LSQCommandQueue, lsq_command_queue, G_TYPE_OBJECT); @@ -174,8 +177,6 @@ return argv; } -static void lsq_command_entry_start(LSQCommandEntry *entry, LSQExecuteContext *ctx); - static void child_exit(GPid pid, gint status, LSQExecuteContext *ctx) { g_spawn_close_pid(pid); @@ -251,7 +252,9 @@ parse_channel(GIOChannel *source, GIOCondition condition, LSQExecuteContext *ctx) { if(condition & G_IO_IN) - lsq_parser_parse(ctx->parser, ctx->ctx); + do { + lsq_parser_parse(ctx->parser, ctx->ctx); + } while(lsq_parser_context_read_again(ctx->ctx)); if(condition & G_IO_HUP || !lsq_parser_context_is_good(ctx->ctx)) { lsq_parser_context_set_channel(ctx->ctx, NULL); @@ -271,11 +274,12 @@ static void lsq_command_entry_start(LSQCommandEntry *entry, LSQExecuteContext *ctx) { + GError *error = NULL; gint fd_in = FALSE; gint fd_out = TRUE; - GIOChannel *redir_in; + GIOChannel *redir_in = NULL; GIOChannel *chan_in; - GIOChannel *redir_out; + //GIOChannel *redir_out; GIOChannel *chan_out; gchar **argv; GPid pid; @@ -294,15 +298,31 @@ if(entry->redirect_in) { gchar *file = format_get_filename(entry->redirect_in, ctx); - redir_in = g_io_channel_new_file(file, "r", NULL); + //redir_in = g_io_channel_new_file(file, "r", NULL); g_free(file); fd_in = TRUE; } argv = lsq_command_entry_to_argv(entry, ctx); - g_spawn_async_with_pipes(NULL, argv, NULL, flags, NULL, NULL, &pid, fd_in?&fd_in:NULL, fd_out?&fd_out:NULL, NULL, NULL); + g_debug("command: %s", argv[0]); + gchar **argvi = argv; + while (argvi[1]) + { + g_debug("arg: '%s'", argvi[1]); + argvi++; + } + + if(!g_spawn_async_with_pipes(NULL, argv, NULL, flags, NULL, NULL, &pid, fd_in?&fd_in:NULL, fd_out?&fd_out:NULL, NULL, &error)) + { + g_debug("spawn failed: %s", error->message); + g_error_free(error); + return; + } + + g_strfreev(argv); + g_child_watch_add(pid, (GChildWatchFunc)child_exit, ctx); ctx->state |= LSQ_EXEC_CTX_STATE_RUNNING; Modified: squeeze/trunk/libsqueeze/parser-context.c =================================================================== --- squeeze/trunk/libsqueeze/parser-context.c 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/parser-context.c 2008-07-07 23:01:09 UTC (rev 27234) @@ -116,3 +116,9 @@ return ctx->last_stat == G_IO_STATUS_NORMAL || ctx->last_stat == G_IO_STATUS_AGAIN; } +gboolean +lsq_parser_context_read_again(LSQParserContext *ctx) +{ + return ctx->last_stat == G_IO_STATUS_NORMAL; +} + Modified: squeeze/trunk/libsqueeze/parser-context.h =================================================================== --- squeeze/trunk/libsqueeze/parser-context.h 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/parser-context.h 2008-07-07 23:01:09 UTC (rev 27234) @@ -63,6 +63,12 @@ gboolean lsq_parser_context_get_line (LSQParserContext *, gchar **, gsize *); +gboolean lsq_parser_context_is_good (LSQParserContext *); + +gboolean lsq_parser_context_read_again(LSQParserContext *); + +void lsq_parser_context_set_channel(LSQParserContext *, GIOChannel *); + G_END_DECLS #endif /* __LIBSQUEEZE_PARSER_CONTEXT_H__ */ Modified: squeeze/trunk/libsqueeze/scanf-parser.c =================================================================== --- squeeze/trunk/libsqueeze/scanf-parser.c 2008-07-07 20:21:25 UTC (rev 27233) +++ squeeze/trunk/libsqueeze/scanf-parser.c 2008-07-07 23:01:09 UTC (rev 27234) @@ -99,7 +99,7 @@ ctx = g_object_new(lsq_scanf_parser_context_get_type(), "archive", archive, NULL); guint n_props = lsq_parser_n_properties(LSQ_PARSER(parser)); ctx->data_store = g_new0(union _data_store, n_props); - ctx->props_store = g_new0(gpointer, n_props); + ctx->props_store = g_new0(gpointer, n_props+1); return LSQ_PARSER_CONTEXT(ctx); } @@ -170,16 +170,24 @@ guint skip_char(gchar *str, guint lng, parse_part *part, LSQScanfParserContext *ctx) { const gchar *ptr; + const gchar *delim; if(!lng) return 0; - if(!part->delimiter) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim) return 1; //for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(str, lng, part->delimiter); + ptr = g_strstr_len(str, lng, delim); + + if(!ptr) + return 0; return ptr - str; } @@ -190,11 +198,16 @@ #ifdef DO_EXSTENSIVE_CHECKING gchar *ptr2; #endif + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) { g_ascii_strtoll(str, &ptr, 10); return ptr - str; @@ -202,7 +215,10 @@ for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(ptr, lng, part->delimiter); + ptr = g_strstr_len(ptr, lng, delim); + + if(!ptr) + return 0; #ifdef DO_EXSTENSIVE_CHECKING g_ascii_strtoll(str, &ptr2, 10); if(ptr > ptr2) @@ -218,11 +234,16 @@ #ifdef DO_EXSTENSIVE_CHECKING gchar *ptr2; #endif + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) { g_ascii_strtod(str, &ptr); return ptr - str; @@ -230,7 +251,10 @@ for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(ptr, lng, part->delimiter); + ptr = g_strstr_len(ptr, lng, delim); + + if(!ptr) + return 0; #ifdef DO_EXSTENSIVE_CHECKING g_ascii_strtod(str, &ptr2); if(ptr > ptr2) @@ -246,11 +270,16 @@ #ifdef DO_EXSTENSIVE_CHECKING gchar *ptr2; #endif + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) { g_ascii_strtoll(str, &ptr, 010); return ptr - str; @@ -258,7 +287,10 @@ for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(ptr, lng, part->delimiter); + ptr = g_strstr_len(ptr, lng, delim); + + if(!ptr) + return 0; #ifdef DO_EXSTENSIVE_CHECKING g_ascii_strtoll(str, &ptr2, 010); if(ptr > ptr2) @@ -271,16 +303,24 @@ guint skip_string(gchar *str, guint lng, parse_part *part, LSQScanfParserContext *ctx) { gchar *ptr; + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) return 0; for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(ptr, lng, part->delimiter); + ptr = g_strstr_len(ptr, lng, delim); + + if(!ptr) + return 0; return ptr - str; } @@ -291,17 +331,25 @@ #ifdef DO_EXSTENSIVE_CHECKING gchar *ptr2; #endif + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) { g_ascii_strtoull(str, &ptr, 10); return ptr - str; } - ptr = g_strstr_len(str, lng, part->delimiter); + ptr = g_strstr_len(str, lng, delim); + + if(!ptr) + return 0; #ifdef DO_EXSTENSIVE_CHECKING g_ascii_strtoull(str, &ptr2, 10); if(ptr > ptr2) @@ -317,17 +365,25 @@ #ifdef DO_EXSTENSIVE_CHECKING gchar *ptr2; #endif + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) { g_ascii_strtoll(str, &ptr, 0x10); return ptr - str; } - ptr = g_strstr_len(str, lng, part->delimiter); + ptr = g_strstr_len(str, lng, delim); + + if(!ptr) + return 0; #ifdef DO_EXSTENSIVE_CHECKING g_ascii_strtoll(str, &ptr2, 0x10); if(ptr > ptr2) @@ -357,16 +413,20 @@ gchar *ptr2; \ type val; \ ptype *pval; \ + const gchar *delim; \ if(!lng) return 0; \ + delim = part->delimiter; \ + if(!delim && !part->next) delim = "\n"; \ pval = &ctx->data_store[part->index].pname; \ ctx->props_store[part->index] = pval; \ - if(!part->delimiter[0]) { \ + if(!delim[0]) { \ val = g_ascii_strtoll(str, &ptr, base); \ - *pval = val; \ + *pval = val; \ return ptr - str; \ } \ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \ - ptr = g_strstr_len(ptr, lng, part->delimiter); \ + ptr = g_strstr_len(ptr, lng, delim); \ + if(!ptr) return 0; \ val = g_ascii_strtoll(str, &ptr2, base); \ *pval = val; \ if(ptr > ptr2) return 0; \ @@ -379,16 +439,20 @@ gchar *ptr2; \ type val; \ type *pval; \ + const gchar *delim; \ if(!lng) return 0; \ + delim = part->delimiter; \ + if(!delim && !part->next) delim = "\n"; \ pval = &ctx->data_store[part->index].pname; \ ctx->props_store[part->index] = pval; \ - if(!part->delimiter[0]) { \ + if(!delim[0]) { \ val = g_ascii_strtod(str, &ptr); \ - *pval = val; \ + *pval = val; \ return ptr - str; \ } \ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \ - ptr = g_strstr_len(ptr, lng, part->delimiter); \ + ptr = g_strstr_len(ptr, lng, delim); \ + if(!ptr) return 0; \ val = g_ascii_strtod(str, &ptr2); \ *pval = val; \ if(ptr > ptr2) return 0; \ @@ -401,16 +465,20 @@ gchar *ptr2; \ type val; \ ptype *pval; \ + const gchar *delim; \ if(!lng) return 0; \ + delim = part->delimiter; \ + if(!delim && !part->next) delim = "\n"; \ pval = &ctx->data_store[part->index].pname; \ ctx->props_store[part->index] = pval; \ - if(!part->delimiter[0]) { \ + if(!delim[0]) { \ val = g_ascii_strtoull(str, &ptr, base); \ - *pval = val; \ + *pval = val; \ return ptr - str; \ } \ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \ - ptr = g_strstr_len(ptr, lng, part->delimiter); \ + ptr = g_strstr_len(ptr, lng, delim); \ + if(!ptr) return 0; \ val = g_ascii_strtoull(str, &ptr2, base); \ *pval = val; \ if(ptr > ptr2) return 0; \ @@ -427,24 +495,32 @@ const gchar *ptr; gchar val; gchar *pval; + const gchar *delim; if(!lng) return 0; + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + pval = &ctx->data_store[part->index].c; ctx->props_store[part->index] = pval; - if(!part->delimiter[0]) + if(!delim[0]) { - val = *str; - *pval = val; + val = *str; + *pval = val; return 1; } //for(ptr = str; g_ascii_isspace(*ptr); ptr++); - ptr = g_strstr_len(str, lng, part->delimiter); + ptr = g_strstr_len(str, lng, delim); + if(!ptr) + return 0; + //FIXME? val = *(ptr-1); *pval = val; @@ -469,19 +545,27 @@ { gchar *ptr; gchar *cur; + const gchar *delim; if(!lng) return 0; - if(!part->delimiter[0]) + delim = part->delimiter; + if(!delim && !part->next) + delim = "\n"; + + if(!delim[0]) return 0; for(cur = str; g_ascii_isspace(*cur); cur++); - ptr = g_strstr_len(cur, lng, part->delimiter); + ptr = g_strstr_len(cur, lng, delim); - ctx->props_store[part->index] = g_strndup(cur, ptr-cur); + if(!ptr) + return 0; + g_debug("string: %s", (gchar*)(ctx->props_store[part->index] = g_strndup(cur, ptr-cur))); + return ptr - str; } @@ -498,15 +582,24 @@ guint parse_filename(gchar *str, guint lng, parse_part *part, LSQScanfParserContext *ctx) { gchar *ptr; + const gchar *delim; if(!lng) return 0; - if(!part->delimiter) - return 1; + delim = part->delimiter; - ptr = g_strstr_len(str, lng, part->delimiter); + if(!delim && !part->next) + delim = "\n"; + if(!delim[0]) + return 0; + + ptr = g_strstr_len(str, lng, delim); + + if(!ptr) + return 0; + ctx->filename = g_strndup(str, ptr-str); return ptr - str; @@ -1030,14 +1123,22 @@ gchar *line, *ptr; gsize line_length, lng; guint size, line_nr; + parse_part *part; if(!lsq_parser_context_get_line(LSQ_PARSER_CONTEXT(ctx), &line, &line_length)) return; + ptr = line; lng = line_length; line_nr = ctx->parse_line; + part = ctx->parse_loc; - parse_part *part = ctx->parse_loc; + if(!part) + { + ctx->parse_loc = part = parser->parser; + ctx->parse_line = line_nr = 0; + } + while(part) { //parse @@ -1066,37 +1167,43 @@ if(part->delimiter) { - if(!g_str_has_prefix(ptr, part->delimiter)) + if(!g_str_has_prefix(ptr, part->delimiter)) + { + //no match + if(line_nr) { - //no match - if(line_nr) - { - ptr = line; - lng = line_length; - part = parser->parser; - line_nr = 0; - continue; - } - ctx->parse_loc = parser->parser; - ctx->parse_line = 0; - g_free(line); - return; + ptr = line; + lng = line_length; + part = parser->parser; + line_nr = 0; + continue; } + ctx->parse_loc = parser->parser; + ctx->parse_line = 0; + g_free(line); + return; + } + + size = strlen(part->delimiter); + if(size > lng) + size = lng; + ptr += size; + lng -= size; } if(part->delimiter) { - if(g_str_has_suffix(part->delimiter, "\n")) + if(g_str_has_suffix(part->delimiter, "\n")) + { + //next line + if(part->next) { - //next line - if(part->next) - { - ctx->parse_loc = part->next; - ctx->parse_line = line_nr+1; - g_free(line); - return; - } + ctx->parse_loc = part->next; + ctx->parse_line = line_nr+1; + g_free(line); + return; } + } } part = part->next; @@ -1106,6 +1213,7 @@ if(!part) { + g_debug("file: %s", ctx->filename); LSQArchiveIter *iter = lsq_archive_add_file(LSQ_PARSER_CONTEXT(ctx)->archive, ctx->filename); lsq_archive_iter_set_propsv(iter, ctx->props_store); lsq_archive_iter_unref(iter); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits