mrp-file-module.c 3.72 KB
Newer Older
Richard Hult's avatar
Richard Hult committed
1 2
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
Richard Hult's avatar
Richard Hult committed
3
 * Copyright (C) 2004 Imendio AB
Richard Hult's avatar
Richard Hult committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 * Copyright (C) 2002 CodeFactory AB
 * Copyright (C) 2002 Richard Hult <richard@imendio.com>
 * Copyright (C) 2002 Mikael Hallendal <micke@imendio.com>
 *
 * This library 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 library 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 library; if not, write to the
Josué Abarca's avatar
Josué Abarca committed
20 21
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
Richard Hult's avatar
Richard Hult committed
22 23 24 25
 */

#include <config.h>
#include <string.h>
26
#include <glib/gi18n.h>
27
#include "libplanner/mrp-paths.h"
Richard Hult's avatar
Richard Hult committed
28 29 30 31 32 33
#include "mrp-file-module.h"

static MrpFileModule *
file_module_load (const gchar *file)
{
	MrpFileModule *module;
34

Richard Hult's avatar
Richard Hult committed
35
	module = mrp_file_module_new ();
36

Richard Hult's avatar
Richard Hult committed
37
	module->handle = g_module_open (file, G_MODULE_BIND_LAZY);
38

Richard Hult's avatar
Richard Hult committed
39 40 41
	if (module->handle == NULL) {
		g_warning ("Could not open file module '%s'\n",
			   g_module_error ());
42

Richard Hult's avatar
Richard Hult committed
43 44
		return NULL;
	}
45

46
	g_module_symbol (module->handle, "init", (gpointer)&module->init);
Richard Hult's avatar
Richard Hult committed
47 48 49 50

	return module;
}

51
GList *
Richard Hult's avatar
Richard Hult committed
52 53
mrp_file_module_load_all (MrpApplication *app)
{
54 55 56
	GDir*          dir;
	const gchar   *name;
	MrpFileModule *module;
57
	gchar         *path;
58
	GList         *modules = NULL;
Richard Hult's avatar
Richard Hult committed
59

60
	path = mrp_paths_get_file_modules_dir (NULL);
61

62
	dir = g_dir_open (path, 0, NULL);
Richard Hult's avatar
Richard Hult committed
63

64 65
	if (dir == NULL) {
		g_free (path);
66
		return NULL;
Richard Hult's avatar
Richard Hult committed
67 68 69
	}

	while ((name = g_dir_read_name (dir)) != NULL) {
Richard Hult's avatar
Richard Hult committed
70 71
		if (g_str_has_suffix (name, G_MODULE_SUFFIX)) {
			gchar *plugin;
72

73
			plugin = g_build_filename (path,
Richard Hult's avatar
Richard Hult committed
74 75
						   name,
						   NULL);
76

Richard Hult's avatar
Richard Hult committed
77 78 79
			module = file_module_load (plugin);
			if (module) {
				mrp_file_module_init (module, app);
80
				modules = g_list_prepend (modules, module);
Richard Hult's avatar
Richard Hult committed
81
			}
82

Richard Hult's avatar
Richard Hult committed
83 84 85 86
			g_free (plugin);
		}
	}

87
	g_free (path);
Richard Hult's avatar
Richard Hult committed
88
	g_dir_close (dir);
89 90

	return modules;
Richard Hult's avatar
Richard Hult committed
91 92 93 94 95 96 97 98 99 100 101 102 103
}

MrpFileModule *
mrp_file_module_new (void)
{
        return g_new0 (MrpFileModule, 1);
}

void
mrp_file_module_init (MrpFileModule *plugin, MrpApplication *app)
{
        g_return_if_fail (plugin != NULL);
        g_return_if_fail (MRP_IS_APPLICATION (app));
104

Richard Hult's avatar
Richard Hult committed
105
        plugin->app = app;
106

Richard Hult's avatar
Richard Hult committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120
        if (plugin->init) {
                plugin->init (plugin, app);
        }
}

gboolean
mrp_file_reader_read_string (MrpFileReader  *reader,
			     const gchar    *str,
			     MrpProject     *project,
			     GError        **error)
{
	if (reader->read_string) {
		return reader->read_string (reader, str, project, error);
	}
121 122

	g_set_error (error,
123 124
		     MRP_ERROR,
		     MRP_ERROR_FAILED,
Richard Hult's avatar
Richard Hult committed
125
		     _("This format does not support reading"));
126

Richard Hult's avatar
Richard Hult committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
	return FALSE;
}

const gchar *
mrp_file_writer_get_string (MrpFileWriter *writer)
{
        g_return_val_if_fail (writer != NULL, NULL);

	if (writer->get_mime_type) {
		return writer->get_mime_type (writer);
	}

	return NULL;
}

const gchar *
mrp_file_writer_get_mime_type (MrpFileWriter *writer)
{
        g_return_val_if_fail (writer != NULL, NULL);

	if (writer->get_string) {
		return writer->get_string (writer);
	}

	return NULL;
}

gboolean
155 156
mrp_file_writer_write (MrpFileWriter    *writer,
		       MrpProject       *project,
Richard Hult's avatar
Richard Hult committed
157 158 159 160 161
		       const gchar      *uri,
		       gboolean          force,
		       GError          **error)
{
        g_return_val_if_fail (writer != NULL, FALSE);
162

Richard Hult's avatar
Richard Hult committed
163 164 165 166 167 168
        if (writer->write) {
		return writer->write (writer, project, uri, force, error);
        }

        return FALSE;
}