Re: grokking libgsf



Allin Cottrell wrote:
I'm trying some tests with the hope of switching to libgsf in
place of low-level fiddling with pkzip structures in reading and
writing zipfiles.  So far I'm only partially successful and I'd
much appreciate any guidance.

I have the following C source (with correct headers included, and
followed by a trivial main() function).  The idea is to print the
structure of a zipfile and then "unzip" it to a specified
location.

The printing part, "print_kids", is working fine, but the
"unzipping" part is giving me an empty directory "foo".  I have
removed error-checking from the following for brevity, but no
errors were triggered when running the full version of the code.

There is example code in the 'tests' subdirectory. You may already have discovered this.
It looks like test-cp-zip.c should be a good starting point.

Regards

Jon Kåre


static void print_kids (GsfInfile *infile, int level)
{
    int nkids = gsf_infile_num_children(infile);
    const char *cname;
    GsfInput *child;
    gsf_off_t sz;
    int i, j;

    for (i=0; i<nkids; i++) {
        child = gsf_infile_child_by_index(infile, i);
        cname = gsf_input_name(child);
        sz = gsf_input_size(child);
        for (j=0; j<level; j++) {
            putchar(' ');
        }
        printf("child %d: '%s' (%d bytes)\n", i, cname, (int) sz);
        print_kids(GSF_INFILE(child), ++level);
        g_object_unref(child);
    }
}

static int gsf_test_zipread (const char *fname)
{
    GsfInput *src, *uncomp;
    GsfInfile *zipfile;
    GsfOutfile *outfile;

    gsf_init();

    src = gsf_input_stdio_new(fname, NULL);
    zipfile = gsf_infile_zip_new(src, NULL);
    g_object_unref(src);

    print_kids(zipfile, 0);

    uncomp = gsf_input_uncompress(GSF_INPUT(zipfile));
    g_object_unref(zipfile);

    outfile = gsf_outfile_stdio_new("foo", &err);

    gsf_input_seek(uncomp, 0, G_SEEK_SET);
    gsf_output_seek(GSF_OUTPUT(outfile), 0, G_SEEK_SET);

    if (!gsf_input_copy(uncomp, GSF_OUTPUT(outfile))) {
        fprintf(stderr, "gsf_input_copy failed\n");
    }

    gsf_output_close(GSF_OUTPUT(outfile));
    gsf_shutdown();

    return 0;
}

Please, what am I doing wrong in gsf_test_zipread?





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]