libgsf r982 - in trunk: . tools



Author: jody
Date: Sun May  4 04:34:02 2008
New Revision: 982
URL: http://svn.gnome.org/viewvc/libgsf?rev=982&view=rev

Log:
2008-05-04  Jody Goldberg <jody gnome org>

	* tools/gsf-vba-dump.c (test) : support MS OOX.


Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/tools/gsf-vba-dump.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Sun May  4 04:34:02 2008
@@ -3,6 +3,9 @@
 Dom:
 	* Revitalize gio support.
 
+Jody:
+	* Add MS OOX support to gsf-vba-dump.
+
 Morten:
 	* Use g_base64_-routines from glib when available.
 	* Prepare for using gio to simulate gnome-vfs interface.

Modified: trunk/tools/gsf-vba-dump.c
==============================================================================
--- trunk/tools/gsf-vba-dump.c	(original)
+++ trunk/tools/gsf-vba-dump.c	Sun May  4 04:34:02 2008
@@ -1,8 +1,8 @@
 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * test-msvba.c:
+ * gsf-vba-dump.c:
  *
- * Copyright (C) 2002-2003	Jody Goldberg (jody gnome org)
+ * Copyright (C) 2002-2008	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
@@ -25,14 +25,28 @@
 #include <gsf/gsf-infile.h>
 #include <gsf/gsf-infile-msole.h>
 #include <gsf/gsf-infile-msvba.h>
+#include <gsf/gsf-infile-zip.h>
+#include <gsf/gsf-open-pkg-utils.h>
 
 #include <stdio.h>
 
+static void
+dump_vba (GsfInput *vba, char const *filename, GError **err)
+{
+	GsfInfile *vba_wrapper;
+
+	fprintf (stderr, "%s\n", filename);
+
+	vba_wrapper = gsf_infile_msvba_new (GSF_INFILE (vba), err);
+	if (vba_wrapper != NULL)
+		g_object_unref (G_OBJECT (vba_wrapper));
+}
+
 static int
 test (int argc, char *argv[])
 {
-	GsfInfile *vba_wrapper;
-	GsfInput  *input;
+	GsfInput  *input, *vba;
+	GsfInfile *infile;
 	GError    *err = NULL;
 	int i;
 
@@ -41,10 +55,7 @@
 		if (input == NULL)	/* Only report error if stdio fails too */
 			input = gsf_input_stdio_new (argv[i], &err);
 		if (input != NULL) {
-			GsfInfile *infile = gsf_infile_msole_new (input, &err);
-			if (infile != NULL) {
-				GsfInput *vba;
-				
+			if (NULL != (infile = gsf_infile_msole_new (input, &err))) {
 				// Try XLS first
 				vba = gsf_infile_child_by_vname (infile, "_VBA_PROJECT_CUR", "VBA", NULL);
 
@@ -55,22 +66,38 @@
 				// TODO : PPT is more complex
 
 				if (vba != NULL) {
-					fprintf( stderr, "%s\n",argv[i]);
-
-					vba_wrapper = gsf_infile_msvba_new (GSF_INFILE (vba), &err);
-					if (vba_wrapper != NULL) {
-						g_object_unref (G_OBJECT (vba_wrapper));
-					}
+					dump_vba (vba, argv[1], &err);
 					g_object_unref (G_OBJECT (vba));
-				} else {
-#if 0
-					g_warning ("'%s' : No VBA directory", argv[i]);
-#endif
-					continue;
+				}
+				g_object_unref (G_OBJECT (infile));
+			} else if (NULL != (infile = gsf_infile_zip_new (input, NULL))) {
+				GsfInput *main_part = gsf_open_pkg_get_rel_by_type (GSF_INPUT (infile),
+					"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";);
+				if (NULL != err)  {
+					g_error_free (err);
+					err = NULL;
 				}
 
+				if (NULL != main_part) {
+					GsfInput *vba_stream = gsf_open_pkg_get_rel_by_type (main_part,
+						"http://schemas.microsoft.com/office/2006/relationships/vbaProject";);
+					if (NULL != vba_stream) {
+						GsfInfile *ole = gsf_infile_msole_new (vba_stream, &err);
+						if (NULL != ole) {
+							vba = gsf_infile_child_by_vname (ole, "VBA", NULL);
+							if (NULL != vba) {
+								dump_vba (vba, argv[1], &err);
+								g_object_unref (G_OBJECT (vba));
+							}
+							g_object_unref (G_OBJECT (ole));
+						}
+						g_object_unref (G_OBJECT (vba_stream));
+					}
+					g_object_unref (G_OBJECT (main_part));
+				}
 				g_object_unref (G_OBJECT (infile));
 			}
+
 			g_object_unref (G_OBJECT (input));
 		}
 



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