libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit a95e390c50dd26fb0bfea339dc0f54720b7e348b
parent 273918eeac851a18e00dcd37cccf02e6911006c3
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun, 14 Aug 2005 00:40:17 +0000

big code cleanup

Diffstat:
Msrc/plugins/ole2/Makefile.am | 23+++--------------------
Dsrc/plugins/ole2/gsf-impl-utils.h | 100-------------------------------------------------------------------------------
Dsrc/plugins/ole2/gsf-infile-impl.h | 50--------------------------------------------------
Msrc/plugins/ole2/gsf-infile-msole.c | 458+++++++++++++++++++++++++++++++++++--------------------------------------------
Msrc/plugins/ole2/gsf-infile-msole.h | 40+++++++++++++++++++++++++++++-----------
Dsrc/plugins/ole2/gsf-infile.h | 44--------------------------------------------
Dsrc/plugins/ole2/gsf-input-impl.h | 67-------------------------------------------------------------------
Dsrc/plugins/ole2/gsf-input-memory.c | 155-------------------------------------------------------------------------------
Dsrc/plugins/ole2/gsf-input-memory.h | 43-------------------------------------------
Msrc/plugins/ole2/gsf-input.c | 474++++++++++++++++---------------------------------------------------------------
Msrc/plugins/ole2/gsf-input.h | 60+++++++++++++++++++++++++++++++-----------------------------
Dsrc/plugins/ole2/gsf-msole-impl.h | 84-------------------------------------------------------------------------------
Dsrc/plugins/ole2/gsf-shared-memory.c | 74--------------------------------------------------------------------------
Dsrc/plugins/ole2/gsf-shared-memory.h | 48------------------------------------------------
Msrc/plugins/ole2/gsf-utils.c | 70----------------------------------------------------------------------
Msrc/plugins/ole2/gsf-utils.h | 12++----------
Dsrc/plugins/ole2/gsf.h | 48------------------------------------------------
Msrc/plugins/ole2/ole2extractor.c | 85++++++++++++++++++++++++++++++++++++-------------------------------------------
18 files changed, 397 insertions(+), 1538 deletions(-)

diff --git a/src/plugins/ole2/Makefile.am b/src/plugins/ole2/Makefile.am @@ -13,36 +13,19 @@ plugin_LTLIBRARIES = \ AM_CFLAGS = $(GLIB_CFLAGS) -if MINGW - WINFLAGS = -lgobject-2.0 -endif - libextractor_ole2_la_CFLAGS = \ $(GLIB_CFLAGS) libextractor_ole2_la_LIBADD = \ - $(LIBADD) $(GLIB_LIBS) $(WINFLAGS) \ + $(LIBADD) $(GLIB_LIBS) -lgobject-2.0 \ $(top_builddir)/src/main/libextractor.la -# Ok, linking this one is complicated, see Mantis #787. libextractor_ole2_la_LDFLAGS = \ - -Wl,-Bstatic -Wl,-lgobject-2.0 -Wl,-lglib-2.0 -Wl,-Bdynamic \ - -Wl,-Bsymbolic -avoid-version -module + -export-dynamic -avoid-version -module # Note that we're NOT using PLUGINFLAGS here to avoid -export-dynamic! libextractor_ole2_la_SOURCES = \ ole2extractor.c \ - gsf.h \ gsf-utils.c \ gsf-utils.h \ - gsf-impl-utils.h \ gsf-input.c \ gsf-input.h \ - gsf-input-impl.h \ - gsf-input-memory.c \ - gsf-input-memory.h \ - gsf-infile.h \ - gsf-infile.c \ - gsf-infile-impl.h \ gsf-infile-msole.c \ - gsf-infile-msole.h \ - gsf-msole-impl.h \ - gsf-shared-memory.c \ - gsf-shared-memory.h + gsf-infile-msole.h diff --git a/src/plugins/ole2/gsf-impl-utils.h b/src/plugins/ole2/gsf-impl-utils.h @@ -1,100 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-impl-utils.h: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_IMPL_UTILS_H -#define GSF_IMPL_UTILS_H - -#include "gsf.h" -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GSF_CLASS_FULL(name, prefix, class_init, instance_init, parent_type, \ - abstract, interface_decl) \ -GType \ -prefix ## _get_type (void) \ -{ \ - static GType type = 0; \ - if (type == 0) { \ - static GTypeInfo const object_info = { \ - sizeof (name ## Class), \ - (GBaseInitFunc) NULL, \ - (GBaseFinalizeFunc) NULL, \ - (GClassInitFunc) class_init, \ - (GClassFinalizeFunc) NULL, \ - NULL, /* class_data */ \ - sizeof (name), \ - 0, /* n_preallocs */ \ - (GInstanceInitFunc) instance_init, \ - NULL \ - }; \ - type = g_type_register_static (parent_type, #name, \ - &object_info, (GTypeFlags) abstract); \ - interface_decl \ - } \ - return type; \ -} - -#define GSF_CLASS(name, prefix, class_init, instance_init, parent) \ - GSF_CLASS_FULL(name, prefix, class_init, instance_init, parent, \ - 0, {}) -#define GSF_CLASS_ABSTRACT(name, prefix, class_init, instance_init, parent) \ - GSF_CLASS_FULL(name, prefix, class_init, instance_init, parent, \ - G_TYPE_FLAG_ABSTRACT, {}) - -#define GSF_DYNAMIC_CLASS_FULL(name, prefix, class_init, instance_init, parent_type, \ - abstract, interface_decl, plugin, type) \ - if (type == 0) { \ - static GTypeInfo const type_info = { \ - sizeof (name ## Class), \ - (GBaseInitFunc) NULL, \ - (GBaseFinalizeFunc) NULL, \ - (GClassInitFunc) class_init, \ - (GClassFinalizeFunc) NULL, \ - NULL, /* class_data */ \ - sizeof (name), \ - 0, /* n_preallocs */ \ - (GInstanceInitFunc) instance_init, \ - NULL \ - }; \ - type = g_type_module_register_type (plugin, parent_type, #name, \ - &type_info, (GTypeFlags) abstract); \ - interface_decl \ - } - -#define GSF_DYNAMIC_CLASS(name, prefix, class_init, instance_init, parent, plugin, type) \ - GSF_DYNAMIC_CLASS_FULL(name, prefix, class_init, instance_init, parent, \ - 0, {}, plugin, type) -#define GSF_DYNAMIC_CLASS_ABSTRACT(name, prefix, class_init, instance_init, parent, plugin, type) \ - GSF_DYNAMIC_CLASS_FULL(name, prefix, class_init, instance_init, parent, \ - G_TYPE_FLAG_ABSTRACT, {}, plugin, type) - -#define GSF_INTERFACE_FULL(type, init_func, iface_type) { \ - static GInterfaceInfo const iface = { \ - (GInterfaceInitFunc) init_func, NULL, NULL }; \ - g_type_add_interface_static (type, iface_type, &iface); \ -} -#define GSF_INTERFACE(init_func, iface_type) \ - GSF_INTERFACE_FULL(type, init_func, iface_type) - -G_END_DECLS - -#endif /* GSF_IMPL_UTILS_H */ diff --git a/src/plugins/ole2/gsf-infile-impl.h b/src/plugins/ole2/gsf-infile-impl.h @@ -1,50 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-infile-impl.h: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_INFILE_IMPL_H -#define GSF_INFILE_IMPL_H - -#include "gsf.h" -#include "gsf-input-impl.h" -#include "gsf-infile.h" - -G_BEGIN_DECLS - -struct _GsfInfile { - GsfInput parent; -}; - -typedef struct { - GsfInputClass input_class; - int (*num_children) (GsfInfile *infile); - const char *(*name_by_index) (GsfInfile *infile, int i); - GsfInput *(*child_by_index) (GsfInfile *infile, - int i, GError **err); - GsfInput *(*child_by_name) (GsfInfile *infile, - char const *name, GError **err); -} GsfInfileClass; - -#define GSF_INFILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSF_INFILE_TYPE, GsfInfileClass)) -#define GSF_IS_INFILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSF_INFILE_TYPE)) - -G_END_DECLS - -#endif /* GSF_INFILE_IMPL_H */ diff --git a/src/plugins/ole2/gsf-infile-msole.c b/src/plugins/ole2/gsf-infile-msole.c @@ -20,20 +20,69 @@ */ #include "platform.h" -#include "gsf-infile-impl.h" +#include <glib-object.h> +#include "gsf-input.h" #include "gsf-infile-msole.h" -#include "gsf-impl-utils.h" #include "gsf-utils.h" -#include "gsf-msole-impl.h" #include <string.h> #include <stdio.h> -#undef G_LOG_DOMAIN -#define G_LOG_DOMAIN "libgsf:msole" +#define OLE_HEADER_SIZE 0x200 /* independent of big block size size */ +#define OLE_HEADER_SIGNATURE 0x00 +#define OLE_HEADER_CLSID 0x08 /* See ReadClassStg */ +#define OLE_HEADER_MINOR_VER 0x18 /* 0x33 and 0x3e have been seen */ +#define OLE_HEADER_MAJOR_VER 0x1a /* 0x3 been seen in wild */ +#define OLE_HEADER_BYTE_ORDER 0x1c /* 0xfe 0xff == Intel Little Endian */ +#define OLE_HEADER_BB_SHIFT 0x1e +#define OLE_HEADER_SB_SHIFT 0x20 +/* 0x22..0x27 reserved == 0 */ +#define OLE_HEADER_CSECTDIR 0x28 +#define OLE_HEADER_NUM_BAT 0x2c +#define OLE_HEADER_DIRENT_START 0x30 +/* 0x34..0x37 transacting signature must be 0 */ +#define OLE_HEADER_THRESHOLD 0x38 +#define OLE_HEADER_SBAT_START 0x3c +#define OLE_HEADER_NUM_SBAT 0x40 +#define OLE_HEADER_METABAT_BLOCK 0x44 +#define OLE_HEADER_NUM_METABAT 0x48 +#define OLE_HEADER_START_BAT 0x4c +#define BAT_INDEX_SIZE 4 +#define OLE_HEADER_METABAT_SIZE ((OLE_HEADER_SIZE - OLE_HEADER_START_BAT) / BAT_INDEX_SIZE) + +#define DIRENT_MAX_NAME_SIZE 0x40 +#define DIRENT_DETAILS_SIZE 0x40 +#define DIRENT_SIZE (DIRENT_MAX_NAME_SIZE + DIRENT_DETAILS_SIZE) +#define DIRENT_NAME_LEN 0x40 /* length in bytes incl 0 terminator */ +#define DIRENT_TYPE 0x42 +#define DIRENT_COLOUR 0x43 +#define DIRENT_PREV 0x44 +#define DIRENT_NEXT 0x48 +#define DIRENT_CHILD 0x4c +#define DIRENT_CLSID 0x50 /* only for dirs */ +#define DIRENT_USERFLAGS 0x60 /* only for dirs */ +#define DIRENT_CREATE_TIME 0x64 /* for files */ +#define DIRENT_MODIFY_TIME 0x6c /* for files */ +#define DIRENT_FIRSTBLOCK 0x74 +#define DIRENT_FILE_SIZE 0x78 +/* 0x7c..0x7f reserved == 0 */ + +#define DIRENT_TYPE_INVALID 0 +#define DIRENT_TYPE_DIR 1 +#define DIRENT_TYPE_FILE 2 +#define DIRENT_TYPE_LOCKBYTES 3 /* ? */ +#define DIRENT_TYPE_PROPERTY 4 /* ? */ +#define DIRENT_TYPE_ROOTDIR 5 +#define DIRENT_MAGIC_END 0xffffffff + +/* flags in the block allocation list to denote special blocks */ +#define BAT_MAGIC_UNUSED 0xffffffff /* -1 */ +#define BAT_MAGIC_END_OF_CHAIN 0xfffffffe /* -2 */ +#define BAT_MAGIC_BAT 0xfffffffd /* a bat block, -3 */ +#define BAT_MAGIC_METABAT 0xfffffffc /* a metabat block -4 */ + -static GObjectClass *parent_class; typedef struct { guint32 *block; @@ -59,44 +108,36 @@ typedef struct { unsigned filter; size_t size; } bb, sb; - gsf_off_t max_block; + off_t max_block; guint32 threshold; /* transition between small and big blocks */ guint32 sbat_start, num_sbat; MSOleDirent *root_dir; - GsfInput *sb_file; + struct GsfInput *sb_file; int ref_count; } MSOleInfo; -struct _GsfInfileMSOle { - GsfInfile parent; - - GsfInput *input; +typedef struct GsfInfileMSOle { + off_t size; + off_t cur_offset; + struct GsfInput *input; MSOleInfo *info; MSOleDirent *dirent; MSOleBAT bat; - gsf_off_t cur_block; + off_t cur_block; struct { guint8 *buf; size_t buf_size; } stream; -}; - -typedef struct { - GsfInfileClass parent_class; -} GsfInfileMSOleClass; - -#define GSF_INFILE_MSOLE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSF_INFILE_MSOLE_TYPE, GsfInfileMSOleClass)) -#define GSF_IS_INFILE_MSOLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSF_INFILE_MSOLE_TYPE)) +} GsfInfileMSOle; /* utility macros */ #define OLE_BIG_BLOCK(index, ole) ((index) >> ole->info->bb.shift) -static GsfInput *gsf_infile_msole_new_child (GsfInfileMSOle *parent, - MSOleDirent *dirent, GError **err); -static void ole_info_unref (MSOleInfo *info); +static struct GsfInput *gsf_infile_msole_new_child (GsfInfileMSOle *parent, + MSOleDirent *dirent); /** * ole_get_block : @@ -107,16 +148,16 @@ static void ole_info_unref (MSOleInfo *info); * Read a block of data from the underlying input. * Be really anal. **/ -static guint8 const * -ole_get_block (GsfInfileMSOle const *ole, guint32 block, guint8 *buffer) +static const guint8 * +ole_get_block (const GsfInfileMSOle *ole, guint32 block, guint8 *buffer) { g_return_val_if_fail (block < ole->info->max_block, NULL); /* OLE_HEADER_SIZE is fixed at 512, but the sector containing the * header is padded out to bb.size (sector size) when bb.size > 512. */ if (gsf_input_seek (ole->input, - (gsf_off_t)(MAX (OLE_HEADER_SIZE, ole->info->bb.size) + (block << ole->info->bb.shift)), - G_SEEK_SET) < 0) + (off_t)(MAX (OLE_HEADER_SIZE, ole->info->bb.size) + (block << ole->info->bb.shift)), + SEEK_SET) < 0) return NULL; return gsf_input_read (ole->input, ole->info->bb.size, buffer); @@ -132,7 +173,7 @@ ole_get_block (GsfInfileMSOle const *ole, guint32 block, guint8 *buffer) * Walk the linked list of the supplied block allocation table and build up a * table for the list starting in @block. * - * Retrurns TRUE on error. + * Returns TRUE on error. */ static gboolean ole_make_bat (MSOleBAT const *metabat, size_t size_guess, guint32 block, @@ -227,7 +268,7 @@ gsf_ole_get_guint32s (guint32 *dst, guint8 const *src, int num_bytes) *dst++ = GSF_LE_GET_GUINT32 (src); } -static GsfInput * +static struct GsfInput * ole_info_get_sb_file (GsfInfileMSOle *parent) { MSOleBAT meta_sbat; @@ -236,16 +277,19 @@ ole_info_get_sb_file (GsfInfileMSOle *parent) return parent->info->sb_file; parent->info->sb_file = gsf_infile_msole_new_child (parent, - parent->info->root_dir, NULL); + parent->info->root_dir); - /* avoid creating a circular reference */ - ole_info_unref (((GsfInfileMSOle *)parent->info->sb_file)->info); + if (NULL == parent->info->sb_file) + return NULL; g_return_val_if_fail (parent->info->sb.bat.block == NULL, NULL); if (ole_make_bat (&parent->info->bb.bat, - parent->info->num_sbat, parent->info->sbat_start, &meta_sbat)) + parent->info->num_sbat, + parent->info->sbat_start, + &meta_sbat)) { return NULL; + } parent->info->sb.bat.num_blocks = meta_sbat.num_blocks * (parent->info->bb.size / BAT_INDEX_SIZE); parent->info->sb.bat.block = g_new0 (guint32, parent->info->sb.bat.num_blocks); @@ -258,7 +302,7 @@ ole_info_get_sb_file (GsfInfileMSOle *parent) } static gint -ole_dirent_cmp (MSOleDirent const *a, MSOleDirent const *b) +ole_dirent_cmp (const MSOleDirent *a, const MSOleDirent *b) { g_return_val_if_fail (a, 0); g_return_val_if_fail (b, 0); @@ -301,14 +345,16 @@ ole_dirent_new (GsfInfileMSOle *ole, guint32 entry, MSOleDirent *parent) if (type != DIRENT_TYPE_DIR && type != DIRENT_TYPE_FILE && type != DIRENT_TYPE_ROOTDIR) { +#if 0 g_warning ("Unknown stream type 0x%x", type); +#endif return NULL; } /* It looks like directory (and root directory) sizes are sometimes bogus */ size = GSF_LE_GET_GUINT32 (data + DIRENT_FILE_SIZE); g_return_val_if_fail (type == DIRENT_TYPE_DIR || type == DIRENT_TYPE_ROOTDIR || - size <= (guint32)ole->input->size, NULL); + size <= (guint32)gsf_input_size(ole->input), NULL); dirent = g_new0 (MSOleDirent, 1); dirent->index = entry; @@ -351,37 +397,18 @@ ole_dirent_new (GsfInfileMSOle *ole, guint32 entry, MSOleDirent *parent) dirent->name = g_strdup (""); dirent->collation_name = g_utf8_collate_key (dirent->name, -1); -#if 0 - printf ("%c '%s' :\tsize = %d\tfirst_block = 0x%x\n", - dirent->is_directory ? 'd' : ' ', - dirent->name, dirent->size, dirent->first_block); -#endif - if (parent != NULL) parent->children = g_list_insert_sorted (parent->children, dirent, (GCompareFunc)ole_dirent_cmp); /* NOTE : These links are a tree, not a linked list */ - if (prev == entry) { -#if 0 - g_warning ("Invalid OLE file with a cycle in its directory tree"); -#endif - } else + if (prev != entry) ole_dirent_new (ole, prev, parent); - if (next == entry) { -#if 0 - g_warning ("Invalid OLE file with a cycle in its directory tree"); -#endif - } else + if (next != entry) ole_dirent_new (ole, next, parent); if (dirent->is_directory) ole_dirent_new (ole, child, dirent); -#if 0 - else if (child != DIRENT_MAGIC_END) - g_warning ("A non directory stream with children ?"); -#endif - return dirent; } @@ -415,7 +442,7 @@ ole_info_unref (MSOleInfo *info) info->root_dir = NULL; } if (info->sb_file != NULL) { - g_object_unref (G_OBJECT (info->sb_file)); + gsf_input_finalize(info->sb_file); info->sb_file = NULL; } g_free (info); @@ -428,6 +455,20 @@ ole_info_ref (MSOleInfo *info) return info; } +static void +gsf_infile_msole_init (GsfInfileMSOle * ole) +{ + ole->cur_offset = 0; + ole->size = 0; + ole->input = NULL; + ole->info = NULL; + ole->bat.block = NULL; + ole->bat.num_blocks = 0; + ole->cur_block = BAT_MAGIC_UNUSED; + ole->stream.buf = NULL; + ole->stream.buf_size = 0; +} + /** * ole_dup : * @src : @@ -438,22 +479,22 @@ ole_info_ref (MSOleInfo *info) * Return value: the partial duplicate. **/ static GsfInfileMSOle * -ole_dup (GsfInfileMSOle const *src, GError **err) +ole_dup (GsfInfileMSOle const * src) { GsfInfileMSOle *dst; - GsfInput *input; + struct GsfInput *input; g_return_val_if_fail (src != NULL, NULL); - dst = (GsfInfileMSOle *)g_object_new (GSF_INFILE_MSOLE_TYPE, NULL); + dst = malloc(sizeof(GsfInfileMSOle)); if (dst == NULL) return NULL; - - input = gsf_input_dup (src->input, err); - if (input == NULL) + gsf_infile_msole_init(dst); + input = gsf_input_dup (src->input); + if (input == NULL) { + gsf_infile_msole_finalize(dst); return NULL; - - + } dst->input = input; dst->info = ole_info_ref (src->info); @@ -461,19 +502,18 @@ ole_dup (GsfInfileMSOle const *src, GError **err) return dst; } - + /** * ole_init_info : * @ole : - * @err : optionally NULL * * Read an OLE header and do some sanity checking * along the way. * - * Return value: TRUE on error setting @err if it is supplied. + * Return value: TRUE on error **/ static gboolean -ole_init_info (GsfInfileMSOle *ole, GError **err) +ole_init_info (GsfInfileMSOle *ole) { static guint8 const signature[] = { 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1 }; @@ -484,12 +524,9 @@ ole_init_info (GsfInfileMSOle *ole, GError **err) guint32 metabat_block, *ptr; /* check the header */ - if (gsf_input_seek (ole->input, (gsf_off_t) 0, G_SEEK_SET) || + if (gsf_input_seek (ole->input, (off_t) 0, SEEK_SET) || NULL == (header = gsf_input_read (ole->input, OLE_HEADER_SIZE, NULL)) || 0 != memcmp (header, signature, sizeof (signature))) { - if (err != NULL) - *err = g_error_new (gsf_input_error (), 0, - "No OLE2 signature"); return TRUE; } @@ -506,9 +543,6 @@ ole_init_info (GsfInfileMSOle *ole, GError **err) * Maybe relax this later, but not much. */ if (6 > bb_shift || bb_shift >= 31 || sb_shift > bb_shift) { - if (err != NULL) - *err = g_error_new (gsf_input_error (), 0, - "Unreasonable block sizes"); return TRUE; } @@ -583,78 +617,44 @@ ole_init_info (GsfInfileMSOle *ole, GError **err) } if (ptr == NULL) { - if (err != NULL) - *err = g_error_new (gsf_input_error (), 0, - "Inconsistent block allocation table"); return TRUE; } /* Read the directory's bat, we do not know the size */ if (ole_make_bat (&info->bb.bat, 0, dirent_start, &ole->bat)) { - if (err != NULL) - *err = g_error_new (gsf_input_error (), 0, - "Problems making block allocation table"); return TRUE; } /* Read the directory */ ole->dirent = info->root_dir = ole_dirent_new (ole, 0, NULL); if (ole->dirent == NULL) { - if (err != NULL) - *err = g_error_new (gsf_input_error (), 0, - "Problems reading directory"); return TRUE; } return FALSE; } -static void -gsf_infile_msole_finalize (GObject *obj) +void +gsf_infile_msole_finalize (GsfInfileMSOle * ole) { - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (obj); - if (ole->input != NULL) { - g_object_unref (G_OBJECT (ole->input)); + gsf_input_finalize(ole->input); ole->input = NULL; } - if (ole->info != NULL && - ole->info->sb_file != (GsfInput *)ole) { + if (ole->info != NULL) { ole_info_unref (ole->info); ole->info = NULL; } ols_bat_release (&ole->bat); g_free (ole->stream.buf); - - parent_class->finalize (obj); + free(ole); } - -static GsfInput * -gsf_infile_msole_dup (GsfInput *src_input, GError **err) -{ - GsfInfileMSOle const *src = GSF_INFILE_MSOLE (src_input); - GsfInfileMSOle *dst = ole_dup (src, err); - - if (dst == NULL) - return NULL; - - if (src->bat.block != NULL) { - dst->bat.block = g_new (guint32, src->bat.num_blocks), - memcpy (dst->bat.block, src->bat.block, - sizeof (guint32) * src->bat.num_blocks); - } - dst->bat.num_blocks = src->bat.num_blocks; - dst->dirent = src->dirent; - - return GSF_INPUT (dst); -} - + static guint8 const * -gsf_infile_msole_read (GsfInput *input, size_t num_bytes, guint8 *buffer) +gsf_infile_msole_read (GsfInfileMSOle *ole, size_t num_bytes, guint8 *buffer) { - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (input); - gsf_off_t first_block, last_block, raw_block, offset, i; + off_t first_block, last_block, raw_block, offset, i; guint8 const *data; guint8 *ptr; size_t count; @@ -662,16 +662,19 @@ gsf_infile_msole_read (GsfInput *input, size_t num_bytes, guint8 *buffer) /* small block files are preload */ if (ole->dirent != NULL && ole->dirent->use_sb) { if (buffer != NULL) { - memcpy (buffer, ole->stream.buf + input->cur_offset, num_bytes); + memcpy (buffer, ole->stream.buf + ole->cur_offset, num_bytes); + ole->cur_offset += num_bytes; return buffer; } - return ole->stream.buf + input->cur_offset; + data = ole->stream.buf + ole->cur_offset; + ole->cur_offset += num_bytes; + return data; } /* GsfInput guarantees that num_bytes > 0 */ - first_block = OLE_BIG_BLOCK (input->cur_offset, ole); - last_block = OLE_BIG_BLOCK (input->cur_offset + num_bytes - 1, ole); - offset = input->cur_offset & ole->info->bb.filter; + first_block = OLE_BIG_BLOCK (ole->cur_offset, ole); + last_block = OLE_BIG_BLOCK (ole->cur_offset + num_bytes - 1, ole); + offset = ole->cur_offset & ole->info->bb.filter; /* optimization : are all the raw blocks contiguous */ i = first_block; @@ -682,8 +685,8 @@ gsf_infile_msole_read (GsfInput *input, size_t num_bytes, guint8 *buffer) /* optimization don't seek if we don't need to */ if (ole->cur_block != first_block) { if (gsf_input_seek (ole->input, - (gsf_off_t)(MAX (OLE_HEADER_SIZE, ole->info->bb.size) + (ole->bat.block [first_block] << ole->info->bb.shift) + offset), - G_SEEK_SET) < 0) + (off_t)(MAX (OLE_HEADER_SIZE, ole->info->bb.size) + (ole->bat.block [first_block] << ole->info->bb.shift) + offset), + SEEK_SET) < 0) return NULL; } ole->cur_block = last_block; @@ -715,53 +718,39 @@ gsf_infile_msole_read (GsfInput *input, size_t num_bytes, guint8 *buffer) offset = 0; } ole->cur_block = BAT_MAGIC_UNUSED; - + ole->cur_offset += num_bytes; return buffer; } - -static gboolean -gsf_infile_msole_seek (GsfInput *input, gsf_off_t offset, GSeekType whence) -{ - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (input); - - (void) offset; - (void) whence; - - ole->cur_block = BAT_MAGIC_UNUSED; - return FALSE; -} - -static GsfInput * + +static struct GsfInput * gsf_infile_msole_new_child (GsfInfileMSOle *parent, - MSOleDirent *dirent, GError **err) + MSOleDirent *dirent) { - GsfInfileMSOle *child; + GsfInfileMSOle * child; MSOleInfo *info; MSOleBAT const *metabat; - GsfInput *sb_file = NULL; + struct GsfInput *sb_file = NULL; size_t size_guess; - - child = ole_dup (parent, err); - child->dirent = dirent; - gsf_input_set_size (GSF_INPUT (child), (gsf_off_t) dirent->size); - - /* The root dirent defines the small block file */ - if (dirent->index != 0) { - gsf_input_set_name (GSF_INPUT (child), dirent->name); - gsf_input_set_container (GSF_INPUT (child), GSF_INFILE (parent)); - - if (dirent->is_directory) { - /* be wary. It seems as if some implementations pretend that the - * directories contain data */ - gsf_input_set_size (GSF_INPUT (child), 0); - return GSF_INPUT (child); - } + char * buf; + + + if ( (dirent->index != 0) && + (dirent->is_directory) ) { + /* be wary. It seems as if some implementations pretend that the + * directories contain data */ + return gsf_input_new("", + (off_t) 0, + 0); } - + child = ole_dup (parent); + if (child == NULL) + return NULL; + child->dirent = dirent; + child->size = (off_t) dirent->size; + info = parent->info; - /* build the bat */ - if (dirent->use_sb) { + if (dirent->use_sb) { /* build the bat */ metabat = &info->sb.bat; size_guess = dirent->size >> info->sb.shift; sb_file = ole_info_get_sb_file (parent); @@ -770,55 +759,65 @@ gsf_infile_msole_new_child (GsfInfileMSOle *parent, size_guess = dirent->size >> info->bb.shift; } if (ole_make_bat (metabat, size_guess + 1, dirent->first_block, &child->bat)) { - g_object_unref (G_OBJECT (child)); + gsf_infile_msole_finalize(child); return NULL; } if (dirent->use_sb) { unsigned i; guint8 const *data; - - g_return_val_if_fail (sb_file != NULL, NULL); + + if (sb_file == NULL) { + gsf_infile_msole_finalize(child); + return NULL; + } child->stream.buf_size = info->threshold; child->stream.buf = g_new (guint8, info->threshold); for (i = 0 ; i < child->bat.num_blocks; i++) - if (gsf_input_seek (GSF_INPUT (sb_file), - (gsf_off_t)(child->bat.block [i] << info->sb.shift), G_SEEK_SET) < 0 || - (data = gsf_input_read (GSF_INPUT (sb_file), - info->sb.size, + if (gsf_input_seek (sb_file, + (off_t)(child->bat.block [i] << info->sb.shift), SEEK_SET) < 0 || + (data = gsf_input_read (sb_file, + info->sb.size, child->stream.buf + (i << info->sb.shift))) == NULL) { - -#if 0 - g_warning ("failure reading block %d", i); -#endif - - g_object_unref (G_OBJECT (child)); + gsf_infile_msole_finalize(child); return NULL; } } - - return GSF_INPUT (child); + buf = malloc(child->size); + if (buf == NULL) { + gsf_infile_msole_finalize(child); + return NULL; + } + if (NULL == gsf_infile_msole_read(child, + child->size, + buf)) { + gsf_infile_msole_finalize(child); + return NULL; + } + gsf_infile_msole_finalize(child); + return gsf_input_new(buf, + (off_t) dirent->size, + 1); } + -static GsfInput * -gsf_infile_msole_child_by_index (GsfInfile *infile, int target, GError **err) +struct GsfInput * +gsf_infile_msole_child_by_index (GsfInfileMSOle * ole, int target) { - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (infile); GList *p; for (p = ole->dirent->children; p != NULL ; p = p->next) if (target-- <= 0) return gsf_infile_msole_new_child (ole, - (MSOleDirent *)p->data, err); + (MSOleDirent *)p->data); return NULL; } -static char const * -gsf_infile_msole_name_by_index (GsfInfile *infile, int target) +char const * +gsf_infile_msole_name_by_index (GsfInfileMSOle * ole, int target) { - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (infile); GList *p; for (p = ole->dirent->children; p != NULL ; p = p->next) @@ -827,25 +826,9 @@ gsf_infile_msole_name_by_index (GsfInfile *infile, int target) return NULL; } -static GsfInput * -gsf_infile_msole_child_by_name (GsfInfile *infile, char const *name, GError **err) +int +gsf_infile_msole_num_children (GsfInfileMSOle * ole) { - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (infile); - GList *p; - - for (p = ole->dirent->children; p != NULL ; p = p->next) { - MSOleDirent *dirent = p->data; - if (dirent->name != NULL && !strcmp (name, dirent->name)) - return gsf_infile_msole_new_child (ole, dirent, err); - } - return NULL; -} - -static int -gsf_infile_msole_num_children (GsfInfile *infile) -{ - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (infile); - g_return_val_if_fail (ole->dirent != NULL, -1); if (!ole->dirent->is_directory) @@ -853,76 +836,34 @@ gsf_infile_msole_num_children (GsfInfile *infile) return g_list_length (ole->dirent->children); } -static void -gsf_infile_msole_init (GObject *obj) -{ - GsfInfileMSOle *ole = GSF_INFILE_MSOLE (obj); - - ole->input = NULL; - ole->info = NULL; - ole->bat.block = NULL; - ole->bat.num_blocks = 0; - ole->cur_block = BAT_MAGIC_UNUSED; - ole->stream.buf = NULL; - ole->stream.buf_size = 0; -} - -static void -gsf_infile_msole_class_init (GObjectClass *gobject_class) -{ - GsfInputClass *input_class = GSF_INPUT_CLASS (gobject_class); - GsfInfileClass *infile_class = GSF_INFILE_CLASS (gobject_class); - - gobject_class->finalize = gsf_infile_msole_finalize; - input_class->Dup = gsf_infile_msole_dup; - input_class->Read = gsf_infile_msole_read; - input_class->Seek = gsf_infile_msole_seek; - infile_class->num_children = gsf_infile_msole_num_children; - infile_class->name_by_index = gsf_infile_msole_name_by_index; - infile_class->child_by_index = gsf_infile_msole_child_by_index; - infile_class->child_by_name = gsf_infile_msole_child_by_name; - - parent_class = g_type_class_peek_parent (gobject_class); -} - -GSF_CLASS (GsfInfileMSOle, gsf_infile_msole, - gsf_infile_msole_class_init, gsf_infile_msole_init, - GSF_INFILE_TYPE) /** * gsf_infile_msole_new : * @source : - * @err : * * Opens the root directory of an MS OLE file. * NOTE : adds a reference to @source * * Returns : the new ole file handler **/ -GsfInfile * -gsf_infile_msole_new (GsfInput *source, GError **err) +GsfInfileMSOle * +gsf_infile_msole_new (struct GsfInput *source) { - GsfInfileMSOle *ole; - gsf_off_t calling_pos; - - g_return_val_if_fail (GSF_IS_INPUT (source), NULL); + GsfInfileMSOle * ole; - ole = (GsfInfileMSOle *)g_object_new (GSF_INFILE_MSOLE_TYPE, NULL); + ole = malloc(sizeof(GsfInfileMSOle)); if (ole == NULL) return NULL; - g_object_ref (G_OBJECT (source)); + gsf_infile_msole_init(ole); ole->input = source; - gsf_input_set_size (GSF_INPUT (ole), (gsf_off_t) 0); - - calling_pos = gsf_input_tell (source); - if (ole_init_info (ole, err)) { - gsf_input_seek (source, calling_pos, G_SEEK_SET); + ole->size = (off_t) 0; - g_object_unref (G_OBJECT (ole)); + if (ole_init_info (ole)) { + gsf_infile_msole_finalize(ole); return NULL; } - return GSF_INFILE (ole); + return ole; } /** @@ -935,12 +876,13 @@ gsf_infile_msole_new (GsfInput *source, GError **err) * * Returns TRUE on success **/ -gboolean -gsf_infile_msole_get_class_id (GsfInfileMSOle const *ole, guint8 *res) +int +gsf_infile_msole_get_class_id (const GsfInfileMSOle *ole, + unsigned char * res) { - g_return_val_if_fail (ole != NULL && ole->dirent != NULL, FALSE); + g_return_val_if_fail (ole != NULL && ole->dirent != NULL, 0); memcpy (res, ole->dirent->clsid, sizeof(ole->dirent->clsid)); - return TRUE; + return 1; } diff --git a/src/plugins/ole2/gsf-infile-msole.h b/src/plugins/ole2/gsf-infile-msole.h @@ -22,21 +22,39 @@ #ifndef GSF_INFILE_MSOLE_H #define GSF_INFILE_MSOLE_H -#include "gsf.h" +#include "gsf-input.h" -G_BEGIN_DECLS +struct GsfInfileMSOle; -typedef struct _GsfInfileMSOle GsfInfileMSOle; +struct GsfInfileMSOle * gsf_infile_msole_new (struct GsfInput *source); +int gsf_infile_msole_get_class_id (const struct GsfInfileMSOle * ole, + unsigned char * res); -#define GSF_INFILE_MSOLE_TYPE (gsf_infile_msole_get_type ()) -#define GSF_INFILE_MSOLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_INFILE_MSOLE_TYPE, GsfInfileMSOle)) -#define GSF_IS_INFILE_MSOLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_INFILE_MSOLE_TYPE)) +int +gsf_infile_msole_num_children (struct GsfInfileMSOle *infile); -GType gsf_infile_msole_get_type (void); -GsfInfile *gsf_infile_msole_new (GsfInput *source, GError **err); -gboolean gsf_infile_msole_get_class_id (GsfInfileMSOle const *ole, - guint8 *res); +struct GsfInput * +gsf_infile_msole_child_by_index (struct GsfInfileMSOle *infile, int target); -G_END_DECLS +char const * +gsf_infile_msole_name_by_index (struct GsfInfileMSOle *infile, int target); + + +void +gsf_infile_msole_finalize (struct GsfInfileMSOle * ole); + +/** + * gsf_infile_msole_get_class_id : + * @ole: a #GsfInfileMSOle + * @res: 16 byte identifier (often a GUID in MS Windows apps) + * + * Retrieves the 16 byte indentifier (often a GUID in MS Windows apps) + * stored within the directory associated with @ole and stores it in @res. + * + * Returns TRUE on success + **/ +int +gsf_infile_msole_get_class_id (const struct GsfInfileMSOle *ole, + unsigned char *res); #endif /* GSF_INFILE_MSOLE_H */ diff --git a/src/plugins/ole2/gsf-infile.h b/src/plugins/ole2/gsf-infile.h @@ -1,44 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-infile.h: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_INFILE_H -#define GSF_INFILE_H - -#include "gsf.h" -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GSF_INFILE_TYPE (gsf_infile_get_type ()) -#define GSF_INFILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_INFILE_TYPE, GsfInfile)) -#define GSF_IS_INFILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_INFILE_TYPE)) - -GType gsf_infile_get_type (void); - -int gsf_infile_num_children (GsfInfile *infile); -char const *gsf_infile_name_by_index (GsfInfile *infile, int i); -GsfInput *gsf_infile_child_by_index (GsfInfile *infile, int i); -GsfInput *gsf_infile_child_by_name (GsfInfile *infile, char const *name); -GsfInput *gsf_infile_child_by_vname (GsfInfile *infile, char const *name, ...); - -G_END_DECLS - -#endif /* GSF_INFILE_H */ diff --git a/src/plugins/ole2/gsf-input-impl.h b/src/plugins/ole2/gsf-input-impl.h @@ -1,67 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-input.h-impl.h: interface for used by the ole layer to read raw data - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_INPUT_IMPL_H -#define GSF_INPUT_IMPL_H - -#include "gsf.h" -#include "gsf-input.h" -#include <glib-object.h> - -G_BEGIN_DECLS - -struct _GsfInput { - GObject g_object; - - gsf_off_t size, cur_offset; - char *name; - GsfInfile *container; -}; - -typedef struct { - GObjectClass g_object_class; - - GsfInput *(*Dup) (GsfInput *input, GError **err); - const guint8 *(*Read) (GsfInput *input, size_t num_bytes, - guint8 *optional_buffer); - gboolean (*Seek) (GsfInput *input, gsf_off_t offset, - GSeekType whence); - GsfInput *(*OpenSibling) (GsfInput *input, char const *path, GError **err); - - /* Padding for future expansion */ - void (*_gsf_reserved0) (void); - void (*_gsf_reserved1) (void); - void (*_gsf_reserved2) (void); - void (*_gsf_reserved3) (void); -} GsfInputClass; - -#define GSF_INPUT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSF_INPUT_TYPE, GsfInputClass)) -#define GSF_IS_INPUT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSF_INPUT_TYPE)) - -/* protected */ -gboolean gsf_input_set_name (GsfInput *input, char const *name); -gboolean gsf_input_set_container (GsfInput *input, GsfInfile *container); -gboolean gsf_input_set_size (GsfInput *input, gsf_off_t size); -gboolean gsf_input_seek_emulate (GsfInput *input, gsf_off_t pos); - -G_END_DECLS - -#endif /* GSF_INPUT_IMPL_H */ diff --git a/src/plugins/ole2/gsf-input-memory.c b/src/plugins/ole2/gsf-input-memory.c @@ -1,155 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-input-memory.c: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "platform.h" -#include <string.h> -#include "gsf-input-memory.h" -#include "gsf-input-impl.h" -#include "gsf-impl-utils.h" -#include "gsf-utils.h" -#include "gsf-shared-memory.h" - -static GObjectClass *parent_class; - -struct _GsfInputMemory { - GsfInput parent; - GsfSharedMemory *shared; -}; -typedef GsfInputClass GsfInputMemoryClass; - -/** - * gsf_input_memory_new: - * @buf: The input bytes - * @length: The length of @buf - * @needs_free: Whether you want this memory to be free'd at object destruction - * - * Returns: A new #GsfInputMemory - */ -GsfInput * -gsf_input_memory_new (guint8 const *buf, gsf_off_t length, gboolean needs_free) -{ - GsfInputMemory *mem = g_object_new (GSF_INPUT_MEMORY_TYPE, NULL); - if (mem == NULL) - return NULL; - mem->shared = gsf_shared_memory_new ((void *)buf, length, needs_free); - gsf_input_set_size (GSF_INPUT (mem), length); - return GSF_INPUT (mem); -} - -/** - * gsf_input_memory_new_clone: - * @buf: The input bytes - * @length: The length of @buf - * - * Returns: A new #GsfInputMemory - */ -GsfInput * -gsf_input_memory_new_clone (guint8 const *buf, gsf_off_t length) -{ - GsfInputMemory *mem = NULL; - guint8 * cpy = g_try_malloc (length * sizeof (guint8)); - if (cpy == NULL) - return NULL; - - memcpy (cpy, buf, length); - mem = g_object_new (GSF_INPUT_MEMORY_TYPE, NULL); - if (mem == NULL) - return NULL; - mem->shared = gsf_shared_memory_new ((void *)cpy, length, TRUE); - gsf_input_set_size (GSF_INPUT (mem), length); - return GSF_INPUT (mem); -} - -static void -gsf_input_memory_finalize (GObject *obj) -{ - GsfInputMemory *mem = (GsfInputMemory *) (obj); - - if (mem->shared) - g_object_unref (G_OBJECT (mem->shared)); - - parent_class->finalize (obj); -} - -static GsfInput * -gsf_input_memory_dup (GsfInput *src_input, GError **err) -{ - GsfInputMemory const *src = (GsfInputMemory *) (src_input); - GsfInputMemory *dst = g_object_new (GSF_INPUT_MEMORY_TYPE, NULL); - if (dst == NULL) - return NULL; - (void) err; - - dst->shared = src->shared; - g_object_ref (G_OBJECT (dst->shared)); - - return GSF_INPUT (dst); -} - -static guint8 const * -gsf_input_memory_read (GsfInput *input, size_t num_bytes, guint8 *optional_buffer) -{ - GsfInputMemory *mem = (GsfInputMemory *) (input); - guchar const *src = mem->shared->buf; - - if (src == NULL) - return NULL; - if (optional_buffer) { - memcpy (optional_buffer, src + input->cur_offset, num_bytes); - return optional_buffer; - } else - return src + input->cur_offset; -} - -static gboolean -gsf_input_memory_seek (G_GNUC_UNUSED GsfInput *input, - G_GNUC_UNUSED gsf_off_t offset, - G_GNUC_UNUSED GSeekType whence) -{ - return FALSE; -} - -static void -gsf_input_memory_init (GObject *obj) -{ - GsfInputMemory *mem = (GsfInputMemory *) (obj); - mem->shared = NULL; - -} - -static void -gsf_input_memory_class_init (GObjectClass *gobject_class) -{ - GsfInputClass *input_class = GSF_INPUT_CLASS (gobject_class); - - gobject_class->finalize = gsf_input_memory_finalize; - input_class->Dup = gsf_input_memory_dup; - input_class->Read = gsf_input_memory_read; - input_class->Seek = gsf_input_memory_seek; - - parent_class = g_type_class_peek_parent (gobject_class); -} - -GSF_CLASS (GsfInputMemory, gsf_input_memory, - gsf_input_memory_class_init, gsf_input_memory_init, - GSF_INPUT_TYPE) - - diff --git a/src/plugins/ole2/gsf-input-memory.h b/src/plugins/ole2/gsf-input-memory.h @@ -1,43 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-input-memory.h: interface for used by the ole layer to read raw data - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_INPUT_MEMORY_H -#define GSF_INPUT_MEMORY_H - -#include "gsf-input.h" - -G_BEGIN_DECLS - -#define GSF_INPUT_MEMORY_TYPE (gsf_input_memory_get_type ()) -#define GSF_INPUT_MEMORY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_INPUT_MEMORY_TYPE, GsfInputMemory)) -#define GSF_IS_INPUT_MEMORY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_INPUT_MEMORY_TYPE)) - -typedef struct _GsfInputMemory GsfInputMemory; - -GType gsf_input_memory_get_type (void); -GsfInput *gsf_input_memory_new (guint8 const *buf, gsf_off_t length, - gboolean needs_free); -GsfInput *gsf_input_memory_new_clone (guint8 const *buf, gsf_off_t length); -GsfInput *gsf_input_mmap_new (char const *filename, GError **err); - -G_END_DECLS - -#endif /* GSF_INPUT_MEMORY_H */ diff --git a/src/plugins/ole2/gsf-input.c b/src/plugins/ole2/gsf-input.c @@ -20,201 +20,110 @@ */ #include "platform.h" -#include "gsf-input-impl.h" -#include "gsf-impl-utils.h" +#include "gsf-input.h" +#include "gsf-utils.h" #include <string.h> -#ifdef HAVE_BZIP -#include <gsf/gsf-input-bzip.h> -#endif +typedef struct GsfInput { + off_t size; + off_t cur_offset; + char * name; + const unsigned char * buf; + int needs_free; +} GsfInput; -#define GET_CLASS(instance) G_TYPE_INSTANCE_GET_CLASS (instance, GSF_INPUT_TYPE, GsfInputClass) -static GObjectClass *parent_class; - -enum { - PROP_0, - PROP_NAME, - PROP_SIZE, - PROP_EOF, - PROP_REMAINING, - PROP_POS -}; - -#if 0 static void -gsf_input_set_property (GObject *object, - guint property_id, - GValue const *value, - GParamSpec *pspec) +gsf_input_init (GsfInput * input) { - switch (property_id) - { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } + input->size = 0; + input->cur_offset = 0; + input->name = NULL; + input->buf = NULL; } -#endif -static void -gsf_input_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) +/** + * gsf_input_memory_new: + * @buf: The input bytes + * @length: The length of @buf + * @needs_free: Whether you want this memory to be free'd at object destruction + * + * Returns: A new #GsfInputMemory + */ +GsfInput * +gsf_input_new (const unsigned char * buf, + off_t length, + int needs_free) { - /* gsf_off_t is typedef'd to gint64 */ - switch (property_id) { - case PROP_NAME: - g_value_set_string (value, gsf_input_name (GSF_INPUT (object))); - break; - case PROP_SIZE: - g_value_set_int64 (value, gsf_input_size (GSF_INPUT (object))); - break; - case PROP_EOF: - g_value_set_boolean (value, gsf_input_eof (GSF_INPUT (object))); - break; - case PROP_REMAINING: - g_value_set_int64 (value, gsf_input_remaining (GSF_INPUT (object))); - break; - case PROP_POS: - g_value_set_int64 (value, gsf_input_tell (GSF_INPUT (object))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } + GsfInput *mem = malloc(sizeof(GsfInput)); + if (mem == NULL) + return NULL; + gsf_input_init(mem); + mem->buf = buf; + mem->size = length; + mem->needs_free = needs_free; + return mem; } -static void -gsf_input_finalize (GObject *obj) +void +gsf_input_finalize (GsfInput * input) { - GsfInput *input = GSF_INPUT (obj); - if (input->name != NULL) { - g_free (input->name); + free (input->name); input->name = NULL; } - if (input->container != NULL) { - g_object_unref (G_OBJECT (input->container)); - input->container = NULL; - } - parent_class->finalize (obj); + if ( (input->buf) && input->needs_free) + free((void*) input->buf); + free(input); } -static void -gsf_input_init (GObject *obj) +GsfInput * +gsf_input_dup (GsfInput *src) { - GsfInput *input = GSF_INPUT (obj); - - input->size = 0; - input->cur_offset = 0; - input->name = NULL; - input->container = NULL; + GsfInput * dst = malloc(sizeof(GsfInput)); + if (dst == NULL) + return NULL; + gsf_input_init(dst); + dst->buf = src->buf; + dst->needs_free = 0; + dst->size = src->size; + if (src->name != NULL) + gsf_input_set_name (dst, src->name); + dst->cur_offset = src->cur_offset; + return dst; } -static void -gsf_input_class_init (GObjectClass *gobject_class) +const unsigned char * +gsf_input_read (GsfInput * mem, size_t num_bytes, unsigned char * optional_buffer) { - parent_class = g_type_class_peek_parent (gobject_class); - - gobject_class->finalize = gsf_input_finalize; - /* gobject_class->set_property = gsf_input_set_property; */ - gobject_class->get_property = gsf_input_get_property; + const unsigned char *src = mem->buf; + if (src == NULL) + return NULL; + if (optional_buffer) { + memcpy (optional_buffer, src + mem->cur_offset, num_bytes); + mem->cur_offset += num_bytes; - g_object_class_install_property (gobject_class, - PROP_NAME, - g_param_spec_string ("name", "Name", - "The Input's Name", - NULL, - G_PARAM_READABLE)); - g_object_class_install_property (gobject_class, - PROP_SIZE, - g_param_spec_int64 ("size", "Size", - "The Input's Size", - 0, G_MAXINT64, 0, - G_PARAM_READABLE)); - g_object_class_install_property (gobject_class, - PROP_EOF, - g_param_spec_boolean ("eof", "OEF", - "End Of File", - FALSE, - G_PARAM_READABLE)); - g_object_class_install_property (gobject_class, - PROP_REMAINING, - g_param_spec_int64 ("remaining", "Remaining", - "Amount of Data Remaining", - 0, G_MAXINT64, 0, - G_PARAM_READABLE)); - g_object_class_install_property (gobject_class, - PROP_POS, - g_param_spec_int64 ("position", "Position", - "The Output's Current Position", - 0, G_MAXINT64, 0, - G_PARAM_READABLE)); + return optional_buffer; + } else { + const unsigned char * ret = src + mem->cur_offset; + mem->cur_offset += num_bytes; + return ret; + } } -GSF_CLASS_ABSTRACT (GsfInput, gsf_input, - gsf_input_class_init, gsf_input_init, - G_TYPE_OBJECT) - /** * gsf_input_name : * @input : * * Returns @input's name in utf8 form, DO NOT FREE THIS STRING **/ -char const * +const char * gsf_input_name (GsfInput *input) { - g_return_val_if_fail (GSF_IS_INPUT (input), NULL); return input->name; } /** - * gsf_input_container : - * @input : - * - * Returns, but does not add a reference to @input's container. - * Potentially NULL - **/ -GsfInfile * -gsf_input_container (GsfInput *input) -{ - g_return_val_if_fail (GSF_IS_INPUT (input), NULL); - return input->container; -} - -/** - * gsf_input_dup : - * @input : The input to duplicate - * @err : optionally NULL - * - * Duplicates input @src leaving the new one at the same offset. - * - * Returns : the duplicate, or NULL on error - **/ -GsfInput * -gsf_input_dup (GsfInput *input, GError **err) -{ - GsfInput *dst; - - g_return_val_if_fail (input != NULL, NULL); - - dst = GET_CLASS (input)->Dup (input, err); - if (dst != NULL) { - dst->size = input->size; - if (input->name != NULL) - gsf_input_set_name (dst, input->name); - dst->container = input->container; - if (dst->container != NULL) - g_object_ref (G_OBJECT (dst->container)); - gsf_input_seek (dst, (gsf_off_t)input->cur_offset, G_SEEK_SET); - } - return dst; -} - -/** * gsf_input_size : * @input : The input * @@ -222,7 +131,7 @@ gsf_input_dup (GsfInput *input, GError **err) * * Returns : the size or -1 on error **/ -gsf_off_t +off_t gsf_input_size (GsfInput *input) { g_return_val_if_fail (input != NULL, -1); @@ -237,52 +146,21 @@ gsf_input_size (GsfInput *input) * * Returns : TRUE if the input is at the eof. **/ -gboolean +int gsf_input_eof (GsfInput *input) { - g_return_val_if_fail (input != NULL, FALSE); + g_return_val_if_fail (input != NULL, 0); return input->cur_offset >= input->size; } /** - * gsf_input_read : - * @input : - * @num_bytes : - * @optional_buffer : If supplied copy the data into it - * - * Read at at least @num_bytes. Does not change the current position if there - * is an error. Will only read if the entire amount can be read. Invalidates - * the buffer associated with previous calls to gsf_input_read. - * - * Returns : pointer to the buffer or NULL if there is an error or 0 bytes are - * requested. - **/ -guint8 const * -gsf_input_read (GsfInput *input, size_t num_bytes, guint8 *optional_buffer) -{ - guint8 const *res; - - g_return_val_if_fail (input != NULL, NULL); - - if (num_bytes == 0 || (input->cur_offset + num_bytes) > input->size) - return NULL; - res = GET_CLASS (input)->Read (input, num_bytes, optional_buffer); - if (res == NULL) - return NULL; - - input->cur_offset += num_bytes; - return res; - -} - -/** * gsf_input_remaining : * @input : * * Returns the number of bytes left in the file. **/ -gsf_off_t +off_t gsf_input_remaining (GsfInput *input) { g_return_val_if_fail (input != NULL, 0); @@ -296,7 +174,7 @@ gsf_input_remaining (GsfInput *input) * * Returns the current offset in the file. **/ -gsf_off_t +off_t gsf_input_tell (GsfInput *input) { g_return_val_if_fail (input != NULL, 0); @@ -312,34 +190,32 @@ gsf_input_tell (GsfInput *input) * * Returns TRUE on error. **/ -gboolean -gsf_input_seek (GsfInput *input, gsf_off_t offset, GSeekType whence) +int +gsf_input_seek (GsfInput *input, off_t offset, int whence) { - gsf_off_t pos = offset; + off_t pos = offset; - g_return_val_if_fail (input != NULL, TRUE); + g_return_val_if_fail (input != NULL, 1); switch (whence) { - case G_SEEK_SET : break; - case G_SEEK_CUR : pos += input->cur_offset; break; - case G_SEEK_END : pos += input->size; break; - default : return TRUE; + case SEEK_SET : break; + case SEEK_CUR : pos += input->cur_offset; break; + case SEEK_END : pos += input->size; break; + default : return 1; } if (pos < 0 || pos > input->size) - return TRUE; + return 1; /* * If we go nowhere, just return. This in particular handles null * seeks for streams with no seek method. */ if (pos == input->cur_offset) - return FALSE; + return 0; - if (GET_CLASS (input)->Seek (input, offset, whence)) - return TRUE; input->cur_offset = pos; - return FALSE; + return 0; } /** @@ -351,38 +227,18 @@ gsf_input_seek (GsfInput *input, gsf_off_t offset, GSeekType whence) * * Returns : TRUE if the assignment was ok. **/ -gboolean +int gsf_input_set_name (GsfInput *input, char const *name) { char *buf; - g_return_val_if_fail (input != NULL, FALSE); + g_return_val_if_fail (input != NULL, 0); - buf = g_strdup (name); + buf = strdup (name); if (input->name != NULL) - g_free (input->name); + free (input->name); input->name = buf; - return TRUE; -} - -/** - * gsf_input_set_container : - * @input : - * @container : - * - * Returns : TRUE if the assignment was ok. - */ -gboolean -gsf_input_set_container (GsfInput *input, GsfInfile *container) -{ - g_return_val_if_fail (input != NULL, FALSE); - - if (container != NULL) - g_object_ref (G_OBJECT (container)); - if (input->container != NULL) - g_object_unref (G_OBJECT (input->container)); - input->container = container; - return TRUE; + return 1; } /** @@ -392,156 +248,12 @@ gsf_input_set_container (GsfInput *input, GsfInfile *container) * * Returns : TRUE if the assignment was ok. */ -gboolean -gsf_input_set_size (GsfInput *input, gsf_off_t size) +int +gsf_input_set_size (GsfInput *input, off_t size) { - g_return_val_if_fail (input != NULL, FALSE); + g_return_val_if_fail (input != NULL, 0); input->size = size; - return TRUE; -} - -/** - * gsf_input_seek_emulate: Emulate forward seeks by reading. - * @input : - * @pos : - * - * Returns : TRUE if the emulation worked. - */ -gboolean -gsf_input_seek_emulate (GsfInput *input, gsf_off_t pos) -{ - if (pos < input->cur_offset) - return TRUE; - - while (pos > input->cur_offset) { - gsf_off_t readcount = MIN (pos - input->cur_offset, 8192); - if (!gsf_input_read (input, readcount, NULL)) - return TRUE; - } - return FALSE; -} - -/****************************************************************************/ - -/** - * gsf_input_error : - * - * Returns : A utility quark to flag a GError as being an input problem. - */ -GQuark -gsf_input_error (void) -{ - static GQuark quark; - if (!quark) - quark = g_quark_from_static_string ("gsf_input_error"); - return quark; -} - -/****************************************************************************/ - -#define GSF_READ_BUFSIZE (1024 * 4) - - -/****************************************************************************/ - -/** - * gsf_input_uncompress: maybe uncompress stream. - * @src: stream to be uncompressed. - * - * Returns: A stream equivalent to the source stream, but uncompressed if - * the source was compressed. - * - * This functions takes ownership of the incoming reference and yields a - * new one as its output. - */ -GsfInput * -gsf_input_uncompress (GsfInput *src) -{ - gsf_off_t cur_offset = src->cur_offset; - const guint8 *data; - - if (gsf_input_seek (src, (gsf_off_t) 0, G_SEEK_SET)) - goto error; - - /* Read header up front, so we avoid extra seeks in tests. */ - data = gsf_input_read (src, 4, NULL); - if (!data) - goto error; - -#if 0 - /* Let's try gzip. */ - { - const unsigned char gzip_sig[2] = { 0x1f, 0x8b }; - - if (memcmp (gzip_sig, data, sizeof (gzip_sig)) == 0) { - GsfInput *res = gsf_input_gzip_new (src, NULL); - if (res) { - g_object_unref (G_OBJECT (src)); - return gsf_input_uncompress (res); - } - } - } -#endif - -#ifdef HAVE_BZIP - /* Let's try bzip. */ - { - guint8 const *bzip_sig = "BZh"; - - if (memcmp (gzip_sig, data, strlen (bzip_sig)) == 0) { - GsfInput *res = gsf_input_memory_new_from_bzip (src, NULL); - if (res) { - g_object_unref (G_OBJECT (src)); - return gsf_input_uncompress (res); - } - } - } -#endif - - /* Other methods go here. */ - - error: - (void)gsf_input_seek (src, cur_offset, G_SEEK_SET); - return src; -} - -#if 0 - -#include <gsf/gsf-input-stdio.h> - -#ifdef HAVE_GNOME -#include <gsf-gnome/gsf-input-gnomevfs.h> -#endif - -GsfInput * -gsf_input_new_for_uri (char const * uri, GError ** err) -{ - GsfInput * input = NULL; - size_t len; - - g_return_val_if_fail (uri, NULL); - - len = strlen (uri); - g_return_val_if_fail (len, NULL); - - if (len > 3 && !strstr (uri, ":/")) { - /* assume plain file */ - input = gsf_input_stdio_new (uri, err); - } else { -#if HAVE_GNOME - /* have gnome, let GnomeVFS deal with this */ - input = gsf_input_gnomevfs_new (uri, err); -#else - if (len > 7 && !strncmp (uri, "file:/", 6)) { - /* dumb attempt to translate this into a local path */ - input = gsf_input_stdio_new (uri+7, err); - } - /* else: unknown or unhandled protocol - bail */ -#endif - } - - return input; + return 1; } -#endif diff --git a/src/plugins/ole2/gsf-input.h b/src/plugins/ole2/gsf-input.h @@ -22,38 +22,40 @@ #ifndef GSF_INPUT_H #define GSF_INPUT_H -#include "gsf.h" -#include <glib-object.h> #include <sys/types.h> +#include <unistd.h> -G_BEGIN_DECLS +struct GsfInput; -#define GSF_INPUT_TYPE (gsf_input_get_type ()) -#define GSF_INPUT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_INPUT_TYPE, GsfInput)) -#define GSF_IS_INPUT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_INPUT_TYPE)) - -GType gsf_input_get_type (void); - -char const *gsf_input_name (GsfInput *input); -GsfInfile *gsf_input_container (GsfInput *input); - -GsfInput *gsf_input_dup (GsfInput *input, GError **err); -GsfInput *gsf_input_sibling (GsfInput const *input, char const *name, GError **err); -gsf_off_t gsf_input_size (GsfInput *input); -gboolean gsf_input_eof (GsfInput *input); -guint8 const *gsf_input_read (GsfInput *input, size_t num_bytes, - guint8 *optional_buffer); -gsf_off_t gsf_input_remaining (GsfInput *input); -gsf_off_t gsf_input_tell (GsfInput *input); -gboolean gsf_input_seek (GsfInput *input, - gsf_off_t offset, GSeekType whence); - -/* Utilities */ -gboolean gsf_input_copy (GsfInput *input, GsfOutput *output); -GsfInput *gsf_input_uncompress (GsfInput *src); - -GQuark gsf_input_error (void); +/** + * gsf_input_memory_new: + * @buf: The input bytes + * @length: The length of @buf + * @needs_free: Whether you want this memory to be free'd at object destruction + * + * Returns: A new #GsfInputMemory + */ +struct GsfInput * +gsf_input_new (const unsigned char *buf, + off_t length, + int needs_free); + +char const * gsf_input_name (struct GsfInput *input); +struct GsfInput * gsf_input_dup (struct GsfInput *input); +void gsf_input_finalize (struct GsfInput *input); +struct GsfInput * gsf_input_sibling (const struct GsfInput *input, char const *name); +off_t gsf_input_size (struct GsfInput *input); +int gsf_input_eof (struct GsfInput *input); +const unsigned char * gsf_input_read (struct GsfInput *input, + size_t num_bytes, + unsigned char * optional_buffer); +off_t gsf_input_remaining (struct GsfInput *input); +off_t gsf_input_tell (struct GsfInput *input); +int gsf_input_seek (struct GsfInput *input, + off_t offset, + int whence); +int gsf_input_set_name (struct GsfInput *input, char const *name); +int gsf_input_set_size (struct GsfInput *input, off_t size); -G_END_DECLS #endif /* GSF_INPUT_H */ diff --git a/src/plugins/ole2/gsf-msole-impl.h b/src/plugins/ole2/gsf-msole-impl.h @@ -1,84 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-msole-impl.h: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_MSOLE_IMPL_H -#define GSF_MSOLE_IMPL_H - -#include "gsf.h" - -G_BEGIN_DECLS - -#define OLE_HEADER_SIZE 0x200 /* independent of big block size size */ -#define OLE_HEADER_SIGNATURE 0x00 -#define OLE_HEADER_CLSID 0x08 /* See ReadClassStg */ -#define OLE_HEADER_MINOR_VER 0x18 /* 0x33 and 0x3e have been seen */ -#define OLE_HEADER_MAJOR_VER 0x1a /* 0x3 been seen in wild */ -#define OLE_HEADER_BYTE_ORDER 0x1c /* 0xfe 0xff == Intel Little Endian */ -#define OLE_HEADER_BB_SHIFT 0x1e -#define OLE_HEADER_SB_SHIFT 0x20 -/* 0x22..0x27 reserved == 0 */ -#define OLE_HEADER_CSECTDIR 0x28 -#define OLE_HEADER_NUM_BAT 0x2c -#define OLE_HEADER_DIRENT_START 0x30 -/* 0x34..0x37 transacting signature must be 0 */ -#define OLE_HEADER_THRESHOLD 0x38 -#define OLE_HEADER_SBAT_START 0x3c -#define OLE_HEADER_NUM_SBAT 0x40 -#define OLE_HEADER_METABAT_BLOCK 0x44 -#define OLE_HEADER_NUM_METABAT 0x48 -#define OLE_HEADER_START_BAT 0x4c -#define BAT_INDEX_SIZE 4 -#define OLE_HEADER_METABAT_SIZE ((OLE_HEADER_SIZE - OLE_HEADER_START_BAT) / BAT_INDEX_SIZE) - -#define DIRENT_MAX_NAME_SIZE 0x40 -#define DIRENT_DETAILS_SIZE 0x40 -#define DIRENT_SIZE (DIRENT_MAX_NAME_SIZE + DIRENT_DETAILS_SIZE) -#define DIRENT_NAME_LEN 0x40 /* length in bytes incl 0 terminator */ -#define DIRENT_TYPE 0x42 -#define DIRENT_COLOUR 0x43 -#define DIRENT_PREV 0x44 -#define DIRENT_NEXT 0x48 -#define DIRENT_CHILD 0x4c -#define DIRENT_CLSID 0x50 /* only for dirs */ -#define DIRENT_USERFLAGS 0x60 /* only for dirs */ -#define DIRENT_CREATE_TIME 0x64 /* for files */ -#define DIRENT_MODIFY_TIME 0x6c /* for files */ -#define DIRENT_FIRSTBLOCK 0x74 -#define DIRENT_FILE_SIZE 0x78 -/* 0x7c..0x7f reserved == 0 */ - -#define DIRENT_TYPE_INVALID 0 -#define DIRENT_TYPE_DIR 1 -#define DIRENT_TYPE_FILE 2 -#define DIRENT_TYPE_LOCKBYTES 3 /* ? */ -#define DIRENT_TYPE_PROPERTY 4 /* ? */ -#define DIRENT_TYPE_ROOTDIR 5 -#define DIRENT_MAGIC_END 0xffffffff - -/* flags in the block allocation list to denote special blocks */ -#define BAT_MAGIC_UNUSED 0xffffffff /* -1 */ -#define BAT_MAGIC_END_OF_CHAIN 0xfffffffe /* -2 */ -#define BAT_MAGIC_BAT 0xfffffffd /* a bat block, -3 */ -#define BAT_MAGIC_METABAT 0xfffffffc /* a metabat block -4 */ - -G_END_DECLS - -#endif /* GSF_MSOLE_IMPL_H */ diff --git a/src/plugins/ole2/gsf-shared-memory.c b/src/plugins/ole2/gsf-shared-memory.c @@ -1,74 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-shared-memory.c: - * - * Copyright (C) 2002-2004 Morten Welinder (terra@diku.dk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "platform.h" -#include "gsf-shared-memory.h" -#include "gsf-impl-utils.h" - -typedef struct { - GObjectClass g_object_class; -} GsfSharedMemoryClass; - -static GObjectClass *parent_class; - -GsfSharedMemory * -gsf_shared_memory_new (void *buf, gsf_off_t size, gboolean needs_free) -{ - GsfSharedMemory *mem = g_object_new (GSF_SHARED_MEMORY_TYPE, NULL); - if (mem == NULL) - return NULL; - mem->buf = buf; - mem->size = size; - mem->needs_free = needs_free; - return mem; -} - -static void -gsf_shared_memory_finalize (GObject *obj) -{ - GsfSharedMemory *mem = (GsfSharedMemory *) (obj); - - if (mem->buf != NULL) { - if (mem->needs_free) - g_free (mem->buf); - } - - G_OBJECT_CLASS (parent_class)->finalize (obj); -} - -static void -gsf_shared_memory_init (GObject *obj) -{ - GsfSharedMemory *mem = (GsfSharedMemory *) (obj); - mem->buf = NULL; -} - -static void -gsf_shared_memory_class_init (GObjectClass *gobject_class) -{ - parent_class = g_type_class_peek_parent (gobject_class); - - gobject_class->finalize = gsf_shared_memory_finalize; -} - -GSF_CLASS (GsfSharedMemory, gsf_shared_memory, - gsf_shared_memory_class_init, gsf_shared_memory_init, - G_TYPE_OBJECT) diff --git a/src/plugins/ole2/gsf-shared-memory.h b/src/plugins/ole2/gsf-shared-memory.h @@ -1,48 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf-shared-memory.h - * - * Copyright (C) 2002-2004 Morten Welinder (terra@diku.dk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_SHARED_MEMORY_H -#define GSF_SHARED_MEMORY_H - -#include "gsf.h" -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GSF_SHARED_MEMORY_TYPE (gsf_shared_memory_get_type ()) -#define GSF_SHARED_MEMORY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_SHARED_MEMORY_TYPE, GsfSharedMemory)) -#define GSF_IS_SHARED_MEMORY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_SHARED_MEMORY_TYPE)) - -typedef struct _GsfSharedMemory GsfSharedMemory; -struct _GsfSharedMemory { - GObject g_object; - void *buf; - gsf_off_t size; - - gboolean needs_free; -}; - -GType gsf_shared_memory_get_type (void); -GsfSharedMemory *gsf_shared_memory_new (void *buf, gsf_off_t size, gboolean needs_free); - -G_END_DECLS - -#endif /* GSF_SHARED_MEMORY_H */ diff --git a/src/plugins/ole2/gsf-utils.c b/src/plugins/ole2/gsf-utils.c @@ -38,76 +38,6 @@ #define G_FLOAT_BYTE_ORDER G_BYTE_ORDER #endif - -static void base64_init (void); - - - -static void -gsf_mem_dump_full (guint8 const *ptr, size_t len, unsigned offset) -{ - size_t i, j, off; - - for (i = 0 ; i < (len+15)/16 ; i++) { - g_print ("%8x | ", i*16 + offset); - for (j = 0;j < 16; j++) { - off = j + (i << 4); - off<len ? g_print("%2x ", ptr[off]) : g_print("XX "); - } - g_print ("| "); - for (j = 0 ; j < 16 ; j++) { - off = j + (i<<4); - g_print ("%c", off < len ? (ptr[off] >= '!' && ptr[off] < 127 ? ptr[off] : '.') : '*'); - } - g_print ("\n"); - } -} - -/** - * gsf_mem_dump : - * @ptr: memory area to be dumped. - * @len: how many bytes will be dumped. - * - * Dump @len bytes from the memory location given by @ptr. - **/ -void -gsf_mem_dump (guint8 const *ptr, size_t len) -{ - gsf_mem_dump_full (ptr, len, 0); -} - -/** - * gsf_input_dump : - * @input: a #GsfInput - * @dump_as_hex: If TRUE, dump in hexidecmal format - * - * Dumps @input's contents to STDOUT, optionally in hex format. - */ -void -gsf_input_dump (GsfInput *input, gboolean dump_as_hex) -{ - size_t size, count, offset = 0; - guint8 const *data; - - /* read in small blocks to excercise things */ - size = gsf_input_size (GSF_INPUT (input)); - while (size > 0) { - count = size; - if (count > 0x100) - count = 0x100; - data = gsf_input_read (GSF_INPUT (input), count, NULL); - g_return_if_fail (data != NULL); - if (dump_as_hex) - gsf_mem_dump_full (data, count, offset); - else - fwrite (data, 1, count, stdout); - size -= count; - offset += count; - } - if (!dump_as_hex) - fflush (stdout); -} - guint64 gsf_le_get_guint64 (void const *p) { diff --git a/src/plugins/ole2/gsf-utils.h b/src/plugins/ole2/gsf-utils.h @@ -22,9 +22,7 @@ #ifndef GSF_UTILS_H #define GSF_UTILS_H -#include "gsf.h" - -G_BEGIN_DECLS +#include <glib-object.h> /* Do this the ugly way so that we don't have to worry about alignment */ #define GSF_LE_GET_GUINT8(p) (*(guint8 const *)(p)) @@ -64,18 +62,12 @@ double gsf_le_get_double (void const *p); void gsf_le_set_float (void *p, float f); void gsf_le_set_double (void *p, double d); -/* Debugging utilities */ -void gsf_mem_dump (guint8 const *ptr, size_t len); -void gsf_input_dump (GsfInput *input, gboolean dump_as_hex); - char const *gsf_extension_pointer (char const * path); void gsf_iconv_close (GIConv handle); -G_END_DECLS - #undef g_return_val_if_fail -#define g_return_val_if_fail(cond,ret) do{if (cond) return ret;}while(0) +#define g_return_val_if_fail(cond,ret) do{if (!(cond)) return ret;}while(0) #endif /* GSF_UTILS_H */ diff --git a/src/plugins/ole2/gsf.h b/src/plugins/ole2/gsf.h @@ -1,48 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gsf.h: - * - * Copyright (C) 2002-2004 Jody Goldberg (jody@gnome.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef GSF_H -#define GSF_H - -#include <glib.h> - -G_BEGIN_DECLS - -typedef struct _GsfInput GsfInput; -typedef struct _GsfInfile GsfInfile; - -typedef struct _GsfOutput GsfOutput; -typedef struct _GsfOutfile GsfOutfile; - -typedef struct _GsfDocProp GsfDocProp; -typedef struct _GsfDocMetaData GsfDocMetaData; -typedef struct _GsfTimestamp GsfTimestamp; - -/* FIXME: - * gsf_off_t is really supposed to be the widest type off_t can be configured - * to on the platform - */ -typedef gint64 gsf_off_t; -#define GSF_OFF_T_FORMAT G_GINT64_FORMAT - -G_END_DECLS - -#endif /* GSF_H */ diff --git a/src/plugins/ole2/ole2extractor.c b/src/plugins/ole2/ole2extractor.c @@ -20,10 +20,7 @@ #include "platform.h" #include "extractor.h" - -#include "gsf-utils.h" -#include "gsf-input-memory.h" -#include "gsf-infile.h" +#include <glib-object.h> #include "gsf-infile-msole.h" #include "gsf-input.h" #include "gsf-utils.h" @@ -41,7 +38,7 @@ /* using libgobject, needs init! */ void __attribute__ ((constructor)) ole_gobject_init(void) { - g_type_init(); + g_type_init(); } static struct EXTRACTOR_Keywords * @@ -139,12 +136,12 @@ typedef struct { typedef struct { guint32 id; - gsf_off_t offset; + off_t offset; } GsfMSOleMetaDataProp; typedef struct { GsfMSOleMetaDataType type; - gsf_off_t offset; + off_t offset; guint32 size, num_props; GIConv iconv_handle; unsigned char_size; @@ -295,8 +292,7 @@ msole_prop_parse(GsfMSOleMetaDataSection *section, n = GSF_LE_GET_GUINT32 (*data); *data += 4; - d (printf (" array with %d elem\n", n); - gsf_mem_dump (*data, (unsigned)(data_end - *data));); + d (printf (" array with %d elem\n", n);); for (i = 0 ; i < n ; i++) { GValue *v; d (printf ("\t[%d] ", i);); @@ -523,7 +519,7 @@ msole_prop_parse(GsfMSOleMetaDataSection *section, } static GValue * -msole_prop_read (GsfInput *in, +msole_prop_read (struct GsfInput *in, GsfMSOleMetaDataSection *section, GsfMSOleMetaDataProp *props, unsigned i) @@ -531,7 +527,7 @@ msole_prop_read (GsfInput *in, guint32 type; guint8 const *data; /* TODO : why size-4 ? I must be missing something */ - gsf_off_t size = ((i+1) >= section->num_props) + off_t size = ((i+1) >= section->num_props) ? section->size-4 : props[i+1].offset; char const *prop_name; @@ -539,7 +535,7 @@ msole_prop_read (GsfInput *in, g_return_val_if_fail (size >= props[i].offset + 4, NULL); size -= props[i].offset; /* includes the type id */ - if (gsf_input_seek (in, section->offset+props[i].offset, G_SEEK_SET) || + if (gsf_input_seek (in, section->offset+props[i].offset, SEEK_SET) || NULL == (data = gsf_input_read (in, size, NULL))) { warning ("failed to read prop #%d", i); return NULL; @@ -561,7 +557,6 @@ msole_prop_read (GsfInput *in, g_direct_hash, g_direct_equal, NULL, g_free); - d (gsf_mem_dump (data-4, size);); n = type; for (i = 0 ; i < n ; i++) { id = GSF_LE_GET_GUINT32 (data); @@ -675,7 +670,7 @@ gsf_msole_iconv_open_for_import (int codepage) -static struct EXTRACTOR_Keywords * process(GsfInput * in, +static struct EXTRACTOR_Keywords * process(struct GsfInput * in, struct EXTRACTOR_Keywords * prev) { guint8 const *data = gsf_input_read (in, 28, NULL); guint16 version; @@ -720,7 +715,6 @@ static struct EXTRACTOR_Keywords * process(GsfInput * in, else { sections [i].type = GSF_MSOLE_META_DATA_USER; warning ("Unknown property section type, treating it as USER"); - d(gsf_mem_dump (data, 16);); } sections [i].offset = GSF_LE_GET_GUINT32 (data + 16); @@ -729,7 +723,7 @@ static struct EXTRACTOR_Keywords * process(GsfInput * in, #endif } for (i = 0 ; i < num_sections ; i++) { - if (gsf_input_seek (in, sections[i].offset, G_SEEK_SET) || + if (gsf_input_seek (in, sections[i].offset, SEEK_SET) || NULL == (data = gsf_input_read (in, 8, NULL))) { return prev; } @@ -870,9 +864,9 @@ static struct EXTRACTOR_Keywords * process(GsfInput * in, return prev; } -static struct EXTRACTOR_Keywords * processSO(GsfInput * src, +static struct EXTRACTOR_Keywords * processSO(struct GsfInput * src, struct EXTRACTOR_Keywords * prev) { - gsf_off_t size; + off_t size; char * buf; size = gsf_input_size(src); @@ -923,46 +917,45 @@ libextractor_ole2_extract(const char * filename, char * date, size_t size, struct EXTRACTOR_Keywords * prev) { - GsfInput *input; - GsfInfile *infile; + struct GsfInput *input; + struct GsfInfileMSOle * infile; + struct GsfInput * src; + const char * name; int i; - input = gsf_input_memory_new((guint8 const *) date, - (gsf_off_t) size, - FALSE); + input = gsf_input_new((const unsigned char*) date, + (off_t) size, + 0); if (input == NULL) return prev; - infile = gsf_infile_msole_new(input, NULL); - g_object_unref(G_OBJECT(input)); - + infile = gsf_infile_msole_new(input); if (infile == NULL) return prev; - if (GSF_IS_INFILE(infile) && - gsf_infile_num_children (GSF_INFILE (infile)) > 0) { - GsfInfile * in = GSF_INFILE (infile); - GsfInput * src; - const char * name; - - for (i=0;i<gsf_infile_num_children(in);i++) { - src = gsf_infile_child_by_index (in, i); - name = gsf_infile_name_by_index (in, i); - - if ( (0 == strcmp(name, "\005SummaryInformation")) - || (0 == strcmp(name, "\005DocumentSummaryInformation")) ) { + for (i=0;i<gsf_infile_msole_num_children(infile);i++) { + name = gsf_infile_msole_name_by_index (infile, i); + src = NULL; + if (name == NULL) + continue; + if ( (0 == strcmp(name, "\005SummaryInformation")) + || (0 == strcmp(name, "\005DocumentSummaryInformation")) ) { + src = gsf_infile_msole_child_by_index (infile, i); + if (src != NULL) prev = process(src, - prev); - } - if (0 == strcmp(name, "SfxDocumentInfo")) { + prev); + } + if (0 == strcmp(name, "SfxDocumentInfo")) { + src = gsf_infile_msole_child_by_index (infile, i); + if (src != NULL) prev = processSO(src, prev); - } - g_object_unref(src); } - } - g_object_unref(G_OBJECT(infile)); + if (src != NULL) + gsf_input_finalize(src); + } + gsf_infile_msole_finalize(infile); return prev; } - +/* end of ole2extractor.c */