1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
4 *
5 * This library is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 */
19
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif /* HAVE_CONFIG_H */
23
24 #include <string.h>
25 #include <glib.h>
26 #include <glib/gi18n-lib.h>
27
28 #include "cut-utils.h"
29 #include "cut-loader-customizer-factory-builder.h"
30 #include "cut-module-factory.h"
31 #include "cut-module-factory-utils.h"
32
33 static CutLoaderCustomizerFactoryBuilder *the_builder = NULL;
34 #ifdef G_OS_WIN32
35 static gchar *win32_loader_customizer_factory_module_dir = NULL;
36 #endif
37
38 static GObject *constructor (GType type,
39 guint n_props,
40 GObjectConstructParam *props);
41
42 static GList *build (CutFactoryBuilder *builder);
43 static GList *build_all (CutFactoryBuilder *builder);
44 static const gchar *get_type_name (CutFactoryBuilder *builder);
45
G_DEFINE_TYPE(CutLoaderCustomizerFactoryBuilder,cut_loader_customizer_factory_builder,CUT_TYPE_FACTORY_BUILDER)46 G_DEFINE_TYPE(CutLoaderCustomizerFactoryBuilder,
47 cut_loader_customizer_factory_builder,
48 CUT_TYPE_FACTORY_BUILDER)
49
50 static void
51 cut_loader_customizer_factory_builder_class_init (CutLoaderCustomizerFactoryBuilderClass *klass)
52 {
53 GObjectClass *gobject_class;
54 CutFactoryBuilderClass *builder_class;
55
56 gobject_class = G_OBJECT_CLASS(klass);
57 builder_class = CUT_FACTORY_BUILDER_CLASS(klass);
58
59 gobject_class->constructor = constructor;
60
61 builder_class->build = build;
62 builder_class->build_all = build_all;
63 builder_class->get_type_name = get_type_name;
64 }
65
66 static GObject *
constructor(GType type,guint n_props,GObjectConstructParam * props)67 constructor (GType type, guint n_props, GObjectConstructParam *props)
68 {
69 GObject *object;
70
71 if (!the_builder) {
72 GObjectClass *klass;
73 klass = G_OBJECT_CLASS(cut_loader_customizer_factory_builder_parent_class);
74 object = klass->constructor(type, n_props, props);
75 the_builder = CUT_LOADER_CUSTOMIZER_FACTORY_BUILDER(object);
76 } else {
77 object = g_object_ref(the_builder);
78 }
79
80 return object;
81 }
82
83 static void
cut_loader_customizer_factory_builder_init(CutLoaderCustomizerFactoryBuilder * builder)84 cut_loader_customizer_factory_builder_init (CutLoaderCustomizerFactoryBuilder *builder)
85 {
86 const gchar *dir;
87
88 dir = g_getenv("CUT_LOADER_CUSTOMIZER_FACTORY_MODULE_DIR");
89 if (!dir) {
90 #ifdef G_OS_WIN32
91 if (!win32_loader_customizer_factory_module_dir)
92 win32_loader_customizer_factory_module_dir =
93 cut_win32_build_factory_module_dir_name("loader-cutomizer");
94 dir = win32_loader_customizer_factory_module_dir;
95 #else
96 dir = LOADER_CUSTOMIZER_FACTORY_MODULE_DIR;
97 #endif
98 }
99
100 g_object_set(G_OBJECT(builder),
101 "module-dir", dir,
102 NULL);
103 cut_module_factory_load(dir, "loader-customizer");
104 }
105
106 static GList *
build(CutFactoryBuilder * builder)107 build (CutFactoryBuilder *builder)
108 {
109 return build_all(builder);
110 }
111
112 static GList *
build_all(CutFactoryBuilder * builder)113 build_all (CutFactoryBuilder *builder)
114 {
115 GList *factories = NULL, *node;
116 GList *factory_names;
117
118 factory_names = cut_module_factory_get_names("loader-customizer");
119
120 for (node = factory_names; node; node = g_list_next(node)) {
121 CutModuleFactory *module_factory;
122 module_factory = cut_module_factory_new("loader-customizer",
123 node->data, NULL);
124 factories = g_list_prepend(factories, module_factory);
125 }
126
127 g_list_foreach(factory_names, (GFunc)g_free, NULL);
128 g_list_free(factory_names);
129
130 return g_list_reverse(factories);
131 }
132
133 static const gchar *
get_type_name(CutFactoryBuilder * builder)134 get_type_name (CutFactoryBuilder *builder)
135 {
136 return "loader-cutomizer";
137 }
138
139 /*
140 vi:ts=4:nowrap:ai:expandtab:sw=4
141 */
142