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