[anjuta] project-wizard: Allow to install and open a compressed project template



commit 68be4c2b06aac9a2a773228a9e263331230f5fa0
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Sat Jun 12 09:41:42 2010 +0200

    project-wizard: Allow to install and open a compressed project template

 libanjuta/anjuta-utils.c                           |   20 ++-
 libanjuta/anjuta-utils.h                           |    1 +
 mime/anjuta.xml                                    |    5 +
 plugins/project-wizard/Makefile.am                 |    4 +-
 .../project-wizard/anjuta-project-wizard.plugin.in |    5 +-
 plugins/project-wizard/druid.c                     |   46 +++--
 plugins/project-wizard/druid.h                     |    2 +-
 plugins/project-wizard/plugin.c                    |  153 ++++++++++++--
 plugins/project-wizard/plugin.h                    |    2 +
 plugins/project-wizard/tar.c                       |  229 ++++++++++++++++++++
 plugins/project-wizard/tar.h                       |   34 +++
 src/anjuta.c                                       |   24 ++-
 12 files changed, 483 insertions(+), 42 deletions(-)
---
diff --git a/libanjuta/anjuta-utils.c b/libanjuta/anjuta-utils.c
index fe07133..c9bb5d7 100644
--- a/libanjuta/anjuta-utils.c
+++ b/libanjuta/anjuta-utils.c
@@ -1462,7 +1462,25 @@ gboolean
 anjuta_util_is_project_file (const gchar *filename)
 {
 	gsize len = strlen (filename);
-	return (len > 8) && (strcmp (filename + len - 7, ".anjuta") == 0);
+	return ((len > 8) && (strcmp (filename + len - 7, ".anjuta") == 0));
+}
+
+/**
+ * anjuta_util_is_template_file:
+ * @filename: the file name
+ *
+ * Return TRUE if the file is an template project file. It is implemented by
+ * checking only the file extension. So it does not check the existence
+ * of the file. But it is working on an URI if it does not containt a
+ * fragment.
+ *
+ * Returns: TRUE if the file is a template file, else FALSE
+ */
+gboolean
+anjuta_util_is_template_file (const gchar *filename)
+{
+	gsize len = strlen (filename);
+	return ((len > 9) && (strcmp (filename + len - 8, ".wiz.tgz") == 0));
 }
 
 /**
diff --git a/libanjuta/anjuta-utils.h b/libanjuta/anjuta-utils.h
index 031c895..b091494 100644
--- a/libanjuta/anjuta-utils.h
+++ b/libanjuta/anjuta-utils.h
@@ -121,6 +121,7 @@ gchar* anjuta_util_str_middle_truncate (const gchar *string,
 										 guint        truncate_length);
 
 gboolean anjuta_util_is_project_file (const gchar *filename);
+gboolean anjuta_util_is_template_file (const gchar *filename);
 gchar* anjuta_util_get_file_mime_type (GFile *file);
 gchar* anjuta_util_get_local_path_from_uri (const gchar *uri);
 
diff --git a/mime/anjuta.xml b/mime/anjuta.xml
index 6825f4c..4762002 100644
--- a/mime/anjuta.xml
+++ b/mime/anjuta.xml
@@ -9,4 +9,9 @@
     <glob pattern="*.anjuta"/>
     <glob pattern="*.prj"/>
   </mime-type>
+  <mime-type type="application/x-anjuta-compressed-project-template">
+    <sub-class-of type="application/x-compressed-tar"/>
+    <comment>Anjuta IDE Compressed Project Template</comment>
+    <glob pattern="*.wiz.tgz"/>
+  </mime-type>
 </mime-info>
diff --git a/plugins/project-wizard/Makefile.am b/plugins/project-wizard/Makefile.am
index 6ee5bff..015fd73 100644
--- a/plugins/project-wizard/Makefile.am
+++ b/plugins/project-wizard/Makefile.am
@@ -60,7 +60,9 @@ libanjuta_project_wizard_la_SOURCES= \
 	install.c \
 	install.h \
 	autogen.c \
-	autogen.h 
+	autogen.h \
+	tar.c \
+	tar.h
 
 EXTRA_DIST = \
 	$(plugin_in_files) \
diff --git a/plugins/project-wizard/anjuta-project-wizard.plugin.in b/plugins/project-wizard/anjuta-project-wizard.plugin.in
index c46a21d..d783790 100644
--- a/plugins/project-wizard/anjuta-project-wizard.plugin.in
+++ b/plugins/project-wizard/anjuta-project-wizard.plugin.in
@@ -3,8 +3,11 @@ _Name=Project Assistant
 _Description=Project Assistant
 Location=anjuta-project-wizard:NPWPlugin
 Icon=anjuta-project-wizard-plugin-48.png
-Interfaces=IAnjutaWizard
+Interfaces=IAnjutaFile,IAnjutaWizard
 UserActivatable=no
 
+[File Loader]
+SupportedMimeTypes=application/x-anjuta-compressed-project-template
+
 [Wizard]
 _Title=Project
diff --git a/plugins/project-wizard/druid.c b/plugins/project-wizard/druid.c
index c40e8ad..70d431e 100644
--- a/plugins/project-wizard/druid.c
+++ b/plugins/project-wizard/druid.c
@@ -357,7 +357,7 @@ cb_druid_insert_project_page (gpointer value, gpointer user_data)
 
 /* Fill project selection page */
 static gboolean
-npw_druid_fill_selection_page (NPWDruid* druid)
+npw_druid_fill_selection_page (NPWDruid* druid, const gchar *directory)
 {
 	gchar* dir;
 	const gchar * const * sys_dir;
@@ -370,23 +370,31 @@ npw_druid_fill_selection_page (NPWDruid* druid)
 	/* Create list of projects */
 	druid->header_list = npw_header_list_new ();	
 	
-	/* Read project template in user directory,
-	 * normally ~/.local/share/anjuta/project,
-	 * the first template read override the others */
-	dir = g_build_filename (g_get_user_data_dir (), "anjuta", "project", NULL);
-	npw_header_list_readdir (&druid->header_list, dir);
-	g_free (dir);
-	
-	/* Read project template in system directory */	
-	for (sys_dir = g_get_system_data_dirs (); *sys_dir != NULL; sys_dir++)
+	if (directory != NULL)
 	{
-		dir = g_build_filename (*sys_dir, "anjuta", "project", NULL);
-		npw_header_list_readdir (&druid->header_list, PROJECT_WIZARD_DIRECTORY);
-		g_free (dir);
+		/* Read project template only in specified directory */
+		npw_header_list_readdir (&druid->header_list, directory);
 	}
+	else
+	{
+		/* Read project template in user directory,
+		 * normally ~/.local/share/anjuta/project,
+		 * the first template read override the others */
+		dir = g_build_filename (g_get_user_data_dir (), "anjuta", "project", NULL);
+		npw_header_list_readdir (&druid->header_list, dir);
+		g_free (dir);
+	
+		/* Read project template in system directory */	
+		for (sys_dir = g_get_system_data_dirs (); *sys_dir != NULL; sys_dir++)
+		{
+			dir = g_build_filename (*sys_dir, "anjuta", "project", NULL);
+			npw_header_list_readdir (&druid->header_list, dir);
+			g_free (dir);
+		}
 
-	/* Read anjuta installation directory */
-	npw_header_list_readdir (&druid->header_list, PROJECT_WIZARD_DIRECTORY);
+		/* Read anjuta installation directory */
+		npw_header_list_readdir (&druid->header_list, PROJECT_WIZARD_DIRECTORY);
+	}
 	
 	if (g_list_length (druid->header_list) == 0)
 	{
@@ -1008,7 +1016,7 @@ on_druid_finish (GtkAssistant* assistant, NPWDruid* druid)
 }
 
 static GtkWidget*
-npw_druid_create_assistant (NPWDruid* druid)
+npw_druid_create_assistant (NPWDruid* druid, const gchar *directory)
 {
 	AnjutaShell *shell;
 	GtkBuilder *builder;
@@ -1046,7 +1054,7 @@ npw_druid_create_assistant (NPWDruid* druid)
 	g_signal_connect(G_OBJECT(assistant), "key-press-event", G_CALLBACK(on_project_wizard_key_press_event), druid);
 
 	/* Setup project selection page */
-	if (!npw_druid_fill_selection_page (druid))
+	if (!npw_druid_fill_selection_page (druid, directory))
 	{
 		return NULL;
 	}
@@ -1117,7 +1125,7 @@ npw_druid_add_default_property (NPWDruid* druid)
  *---------------------------------------------------------------------------*/
 
 NPWDruid*
-npw_druid_new (NPWPlugin* plugin)
+npw_druid_new (NPWPlugin* plugin, const gchar *directory)
 {
 	NPWDruid* druid;
 
@@ -1138,7 +1146,7 @@ npw_druid_new (NPWPlugin* plugin)
 	druid->plugin = plugin;
 	druid->error_extra_widget = NULL;
 
-	if (npw_druid_create_assistant (druid) == NULL)
+	if (npw_druid_create_assistant (druid, directory) == NULL)
 	{
 		npw_druid_free (druid);
 		
diff --git a/plugins/project-wizard/druid.h b/plugins/project-wizard/druid.h
index e32878a..be7c676 100644
--- a/plugins/project-wizard/druid.h
+++ b/plugins/project-wizard/druid.h
@@ -28,7 +28,7 @@
 struct _NPWPlugin;
 typedef struct _NPWDruid NPWDruid;
 
-NPWDruid* npw_druid_new (struct _NPWPlugin* plugin);
+NPWDruid* npw_druid_new (struct _NPWPlugin* plugin, const gchar *directory);
 void npw_druid_free (NPWDruid* druid);
 
 void npw_druid_show (NPWDruid* druid);
diff --git a/plugins/project-wizard/plugin.c b/plugins/project-wizard/plugin.c
index 2a1a70d..48302a5 100644
--- a/plugins/project-wizard/plugin.c
+++ b/plugins/project-wizard/plugin.c
@@ -28,9 +28,116 @@
 #include "plugin.h"
 
 #include "druid.h"
+#include "tar.h"
 
 #include <libanjuta/anjuta-debug.h>
 #include <libanjuta/interfaces/ianjuta-wizard.h>
+#include <libanjuta/interfaces/ianjuta-file.h>
+
+
+/* Private functions
+ *---------------------------------------------------------------------------*/
+
+static void
+npw_open_project_template (GFile *destination, GFile *tarfile, gpointer data, GError *error)
+{
+	NPWPlugin *plugin = (NPWPlugin *)data;
+	
+	if (error != NULL)
+	{
+		gchar *tarname = g_file_get_path (tarfile);
+		
+		anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (plugin)->shell),_("Unable to extrat project template %s: %s"), tarname, error->message);
+	}
+	else
+	{
+		/* Show the project wizard dialog, loading only the new projects */
+		gchar *path;
+		
+		path = g_file_get_path (destination);
+		npw_plugin_show_wizard (plugin, path);
+		g_free (path);
+	}
+}
+
+static gboolean
+npw_install_project_template_with_callback (NPWPlugin *plugin, GFile *file, NPWTarCompleteFunc callback, GError **error)
+{
+	GFileInputStream *stream;
+	gchar *name;
+	gchar *ext;
+	gchar *path;
+	GFile *dest;
+	gboolean ok;
+	GError *err = NULL;
+	
+	/* Check if tarfile exist */
+	stream = g_file_read (file, NULL, error);
+	if (stream == NULL)
+	{
+		return FALSE;
+	}
+	g_input_stream_close (G_INPUT_STREAM (stream), NULL, NULL);
+	
+	/* Get name without extension */
+	name = g_file_get_basename (file);
+	ext = strchr (name, '.');
+	if (ext != NULL) *ext = '\0';
+	
+	/* Create a directory for template */
+	path = g_build_filename (g_get_user_data_dir (), "anjuta", "project", name, NULL);
+	g_free (name);
+	dest = g_file_new_for_path (path);
+	g_free (path);
+	ok = g_file_make_directory_with_parents (dest, NULL, &err);
+	if (err != NULL)
+	{
+		if (err->code == G_IO_ERROR_EXISTS)
+		{
+			/* Allow to overwrite directories */
+			ok = TRUE;
+			g_error_free (err);
+		}
+		else
+		{
+			g_object_unref (dest);
+			
+			return FALSE;
+		}
+	}
+	
+	ok = npw_tar_extract (dest, file, callback, plugin, error);
+	g_object_unref (dest);
+	
+	return ok;
+}
+
+/* Public functions
+ *---------------------------------------------------------------------------*/
+
+/* Display the project wizard selection dialog using only templates in the 
+ * specified directory if non NULL */
+gboolean
+npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *directory)
+{
+	if (plugin->install != NULL)
+	{
+		/* New project wizard is busy copying project file */
+	}
+	else if (plugin->druid == NULL)
+	{
+		/* Create a new project wizard druid */
+		npw_druid_new (plugin, directory);
+	}
+
+	if (plugin->druid != NULL)
+	{
+		/* New project wizard druid is waiting for user inputs */
+		npw_druid_show (plugin->druid);
+	}
+
+	return TRUE;
+}
 
 /*---------------------------------------------------------------------------*/
 
@@ -100,26 +207,13 @@ npw_plugin_class_init (GObjectClass *klass)
 	klass->finalize = npw_plugin_finalize;
 }
 
+/* IAnjutaWizard implementation
+ *---------------------------------------------------------------------------*/
+
 static void
 iwizard_activate (IAnjutaWizard *wiz, GError **err)
 {
-	NPWPlugin *plugin = ANJUTA_PLUGIN_NPW (wiz);
-	
-	if (plugin->install != NULL)
-	{
-		/* New project wizard is busy copying project file */
-	}
-	else if (plugin->druid == NULL)
-	{
-		/* Create a new project wizard druid */
-		npw_druid_new (plugin);
-	}
-
-	if (plugin->druid != NULL)
-	{
-		/* New project wizard druid is waiting for user inputs */
-		npw_druid_show (plugin->druid);
-	}
+	npw_plugin_show_wizard (ANJUTA_PLUGIN_NPW (wiz), NULL);
 }
 
 static void
@@ -128,7 +222,32 @@ iwizard_iface_init (IAnjutaWizardIface *iface)
 	iface->activate = iwizard_activate;
 }
 
+/* IAnjutaFile implementation
+ *---------------------------------------------------------------------------*/
+
+static void
+ifile_open (IAnjutaFile *ifile, GFile* file, GError **error)
+{
+	NPWPlugin *plugin = ANJUTA_PLUGIN_NPW (ifile);
+
+	npw_install_project_template_with_callback (plugin, file, npw_open_project_template, error);
+}
+
+static GFile*
+ifile_get_file (IAnjutaFile* ifile, GError** error)
+{
+	return NULL;
+}
+
+static void
+ifile_iface_init(IAnjutaFileIface *iface)
+{
+	iface->open = ifile_open;
+	iface->get_file = ifile_get_file;
+}
+ 
 ANJUTA_PLUGIN_BEGIN (NPWPlugin, npw_plugin);
+ANJUTA_PLUGIN_ADD_INTERFACE (ifile, IANJUTA_TYPE_FILE);
 ANJUTA_PLUGIN_ADD_INTERFACE (iwizard, IANJUTA_TYPE_WIZARD);
 ANJUTA_PLUGIN_END;
 
diff --git a/plugins/project-wizard/plugin.h b/plugins/project-wizard/plugin.h
index 137b16c..2dc32e4 100644
--- a/plugins/project-wizard/plugin.h
+++ b/plugins/project-wizard/plugin.h
@@ -52,4 +52,6 @@ IAnjutaMessageView* npw_plugin_create_view (NPWPlugin* plugin);
 void npw_plugin_append_view (NPWPlugin* plugin, const gchar* text);
 void npw_plugin_print_view (NPWPlugin* plugin, IAnjutaMessageViewType type, const gchar* summary, const gchar* details);
 
+gboolean npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *template_dir);
+
 #endif
diff --git a/plugins/project-wizard/tar.c b/plugins/project-wizard/tar.c
new file mode 100644
index 0000000..bbe096f
--- /dev/null
+++ b/plugins/project-wizard/tar.c
@@ -0,0 +1,229 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+    tar.c
+    Copyright (C) 2010 Sebastien Granjoux
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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 General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include <config.h>
+
+#include "tar.h"
+
+#include <libanjuta/interfaces/ianjuta-wizard.h>
+
+/*---------------------------------------------------------------------------*/
+
+#define TMP_DEF_FILENAME "NPWDEFXXXXXX"
+#define TMP_TPL_FILENAME "NPWTPLXXXXXX"
+
+#define FILE_BUFFER_SIZE	4096
+
+/* Type
+ *---------------------------------------------------------------------------*/
+
+typedef struct _NPWTarPacket NPWTarPacket;
+
+struct _NPWTarPacket
+{
+	gint stdout;
+	gint stderr;
+	gpointer callback;
+	gpointer data;
+	GFile *tarfile;
+	GFile *destination;
+};
+ 
+/* Helper functions
+ *---------------------------------------------------------------------------*/
+
+/* Tar Packet object
+ *---------------------------------------------------------------------------*/
+
+static void
+npw_tar_packet_free (NPWTarPacket *pack)
+{
+	g_object_unref (pack->tarfile);
+	if (pack->destination) g_object_unref (pack->destination);
+	g_free (pack);
+}
+ 
+/* Public functions
+ *---------------------------------------------------------------------------*/
+
+static void
+on_tar_listed (GPid pid,
+				gint status,
+				gpointer data)
+{
+	NPWTarPacket *pack = (NPWTarPacket *)data;
+
+	if (pack->callback != NULL)
+	{
+		GIOChannel *output;
+		GList *list;
+		GString *line;
+		GIOStatus status;
+	
+		list = NULL;
+		line = g_string_new (NULL);
+		output = g_io_channel_unix_new (pack->stdout);
+		do
+		{
+			gsize terminator;
+		
+			status = g_io_channel_read_line_string (output, line, &terminator, NULL);
+			if (status == G_IO_STATUS_NORMAL)
+			{
+				g_string_truncate (line, terminator);
+				
+				list = g_list_prepend (list, g_strdup (line->str));
+				continue;
+			}
+		}
+		while (status == G_IO_STATUS_AGAIN);
+		g_io_channel_close (output);
+		g_string_free (line, TRUE);
+		
+		list = g_list_reverse (list);
+		((NPWTarListFunc)pack->callback) (pack->tarfile, list, pack->data, NULL);
+		
+		g_list_foreach (list, (GFunc)g_free, NULL);
+		g_list_free (list);
+	}
+
+	g_spawn_close_pid(pid);
+} 
+
+static void
+on_tar_completed (GPid pid,
+				gint status,
+				gpointer data)
+{
+	NPWTarPacket *pack = (NPWTarPacket *)data;
+
+	if (pack->callback != NULL)
+	{
+		GError *error = NULL;
+		if (status != 0)
+		{
+			GIOChannel *stderr;
+			gchar *message;
+			gsize length;
+			
+			stderr = g_io_channel_unix_new (pack->stderr);
+			g_io_channel_read_to_end (stderr, &message, &length, &error);
+			if (error != NULL)
+			{
+				error = g_error_new_literal (IANJUTA_WIZARD_ERROR, 0, message);
+			}
+			g_io_channel_close (stderr);
+		}
+			
+		((NPWTarCompleteFunc)pack->callback) (pack->destination, pack->tarfile, pack->data, error);
+		g_clear_error (&error);
+	}
+
+	g_spawn_close_pid(pid);
+}
+ 
+/* Public functions
+ *---------------------------------------------------------------------------*/
+
+gboolean
+npw_tar_list (GFile *tarfile, NPWTarListFunc list, gpointer data, GError **error)
+{
+	gchar *argv [] = {"tar", "--force-local", "--no-wildcards", "-tzf", NULL, NULL};
+	gchar *prog;
+	gchar *filename;
+	GPid pid;
+	gboolean ok;
+	NPWTarPacket *pack;
+	
+	/* Use gtar if available */
+	prog = g_find_program_in_path ("gtar");
+	filename = g_file_get_path (tarfile);
+	argv[4] = filename;
+
+	/* Execute tar command asynchronously */
+	pack = g_new0(NPWTarPacket, 1);
+	pack->callback = (gpointer)list;
+	pack->data = data;
+	pack->tarfile = g_object_ref (tarfile);
+	ok = g_spawn_async_with_pipes (NULL, argv, NULL, 
+				G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
+				NULL, NULL,
+				&pid,
+				NULL,
+				&pack->stdout,
+				NULL,
+				error);
+	
+	if (ok)
+	{
+		g_child_watch_add_full (G_PRIORITY_HIGH_IDLE, pid, on_tar_listed, pack, (GDestroyNotify)npw_tar_packet_free);
+	}
+	
+	g_free (filename);
+	g_free (prog);
+	
+	return ok;
+}
+  
+gboolean
+npw_tar_extract (GFile *destination, GFile *tarfile, NPWTarCompleteFunc complete, gpointer data, GError **error)
+{
+	gchar *argv [] = {"tar", "--force-local", "--no-wildcards", "-C", NULL, "-xzf", NULL, NULL};
+	gchar *prog;
+	gchar *filename;
+	gchar *dirname;
+	GPid pid;
+	gboolean ok;
+	NPWTarPacket *pack;
+	
+	/* Use gtar if available */
+	prog = g_find_program_in_path ("gtar");
+	dirname = g_file_get_path (destination);
+	argv[4] = dirname;
+	filename = g_file_get_path (tarfile);
+	argv[6] = filename;
+
+	/* Execute tar command asynchronously */
+	pack = g_new0(NPWTarPacket, 1);
+	pack->callback = (gpointer)complete;
+	pack->data = data;
+	pack->tarfile = g_object_ref (tarfile);
+	pack->destination = g_object_ref (destination);
+	ok = g_spawn_async_with_pipes (NULL, argv, NULL, 
+				G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
+				NULL, NULL,
+				&pid,
+				NULL,
+				NULL,
+				&pack->stderr,
+				error);
+	
+	if (ok)
+	{
+		g_child_watch_add_full (G_PRIORITY_HIGH_IDLE, pid, on_tar_completed, pack, (GDestroyNotify)npw_tar_packet_free);
+	}
+	
+	g_free (filename);
+	g_free (dirname);
+	g_free (prog);
+	
+	return ok;
+}
+
diff --git a/plugins/project-wizard/tar.h b/plugins/project-wizard/tar.h
new file mode 100644
index 0000000..8c299e0
--- /dev/null
+++ b/plugins/project-wizard/tar.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+    tar.h
+    Copyright (C) 2010 Sebastien Granjoux
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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 General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#ifndef __TAR_H__
+#define __TAR_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+
+typedef void (*NPWTarListFunc) (GFile *tarfile, GList *list, gpointer data, GError *error);
+typedef void (*NPWTarCompleteFunc) (GFile *destination, GFile *tarfile, gpointer data, GError *error);
+
+gboolean npw_tar_list (GFile *tarfile, NPWTarListFunc list, gpointer data, GError **error);
+
+gboolean npw_tar_extract (GFile *destination, GFile *tarfile, NPWTarCompleteFunc complete, gpointer data, GError **error);
+
+#endif
diff --git a/src/anjuta.c b/src/anjuta.c
index 4ef6441..0bb949e 100644
--- a/src/anjuta.c
+++ b/src/anjuta.c
@@ -242,6 +242,7 @@ anjuta_new (gchar *prog_name, gchar **files, gboolean no_splash,
 	GFile *session_profile;
 	gchar *remembered_plugins;
 	gchar *project_uri = NULL;
+	gchar *template_uri = NULL;
 	gchar *profile_name = NULL;
 	GError *error = NULL;
 	
@@ -328,6 +329,7 @@ anjuta_new (gchar *prog_name, gchar **files, gboolean no_splash,
 		session_dir = USER_SESSION_PATH_NEW;
 		
 		project_uri = extract_project_from_session (session_dir);
+		template_uri = NULL;
 		
 		session = anjuta_session_new (session_dir);
 		anjuta_session_clear (session);
@@ -344,6 +346,11 @@ anjuta_new (gchar *prog_name, gchar **files, gboolean no_splash,
 				g_free (project_uri);
 				project_uri = g_strdup (*node);
 			}
+			else if (anjuta_util_is_template_file (*node))
+			{
+				g_free (template_uri);
+				template_uri = g_strdup (*node);
+			}
 			else
 			{
 				files_load = g_list_prepend (files_load, *node);
@@ -401,16 +408,16 @@ anjuta_new (gchar *prog_name, gchar **files, gboolean no_splash,
 	g_signal_connect (profile_manager, "profile-scoped",
 					  G_CALLBACK (on_profile_scoped), app);
 	/* Load project file */
-	if (project_uri)
+	if ((project_uri != NULL) && (template_uri == NULL))
 	{
 		GFile* file = g_file_new_for_uri (project_uri);
 		IAnjutaFileLoader *loader;
 		loader = anjuta_shell_get_interface (ANJUTA_SHELL (app),
 											 IAnjutaFileLoader, NULL);
 		ianjuta_file_loader_load (loader, file, FALSE, NULL);
-		g_free (project_uri);
 		g_object_unref (file);
 	}
+	g_free (project_uri);
 	anjuta_profile_manager_thaw (profile_manager, &error);
 	
 	if (error)
@@ -424,5 +431,18 @@ anjuta_new (gchar *prog_name, gchar **files, gboolean no_splash,
 	
 	anjuta_status_progress_tick (status, NULL, _("Loaded Sessionâ?¦"));
 	anjuta_status_disable_splash (status, TRUE);
+	
+	/* Load template file */
+	if (template_uri != NULL)
+	{
+		GFile* file = g_file_new_for_uri (template_uri);
+		IAnjutaFileLoader *loader;
+		loader = anjuta_shell_get_interface (ANJUTA_SHELL (app),
+											 IAnjutaFileLoader, NULL);
+		ianjuta_file_loader_load (loader, file, FALSE, NULL);
+		g_free (template_uri);
+		g_object_unref (file);
+	}
+	
 	return app;
 }



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