1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  *  Copyright (C) 2007  Kouhei Sutou <kou@cozmixng.org>
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 
27 #include "cut-factory-builder.h"
28 #include "cut-report-factory-builder.h"
29 #include "cut-ui-factory-builder.h"
30 
31 #define CUT_FACTORY_BUILDER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CUT_TYPE_FACTORY_BUILDER, CutFactoryBuilderPrivate))
32 
33 typedef struct _CutFactoryBuilderPrivate    CutFactoryBuilderPrivate;
34 struct _CutFactoryBuilderPrivate
35 {
36     gchar *module_dir;
37     GOptionContext *option_context;
38     GList *factories;
39 };
40 
41 enum
42 {
43     PROP_0,
44     PROP_MODULE_DIR,
45     PROP_OPTION_CONTEXT
46 };
47 
48 G_DEFINE_ABSTRACT_TYPE(CutFactoryBuilder, cut_factory_builder, G_TYPE_OBJECT)
49 
50 static void dispose        (GObject         *object);
51 static void set_property   (GObject         *object,
52                             guint            prop_id,
53                             const GValue    *value,
54                             GParamSpec      *pspec);
55 static void get_property   (GObject         *object,
56                             guint            prop_id,
57                             GValue          *value,
58                             GParamSpec      *pspec);
59 static void
cut_factory_builder_class_init(CutFactoryBuilderClass * klass)60 cut_factory_builder_class_init (CutFactoryBuilderClass *klass)
61 {
62     GObjectClass *gobject_class;
63     GParamSpec *spec;
64 
65     gobject_class = G_OBJECT_CLASS(klass);
66 
67     gobject_class->dispose      = dispose;
68     gobject_class->set_property = set_property;
69     gobject_class->get_property = get_property;
70 
71     spec = g_param_spec_string("module-dir",
72                                "The name of the directory",
73                                "The name of the directory in which includes target factory",
74                                NULL,
75                                G_PARAM_READWRITE);
76     g_object_class_install_property(gobject_class, PROP_MODULE_DIR, spec);
77 
78     spec = g_param_spec_pointer("option-context",
79                                 "GOptionContext",
80                                 "GOptionContext",
81                                 G_PARAM_READWRITE);
82     g_object_class_install_property(gobject_class, PROP_OPTION_CONTEXT, spec);
83 
84     g_type_class_add_private(gobject_class, sizeof(CutFactoryBuilderPrivate));
85 }
86 
87 static void
cut_factory_builder_init(CutFactoryBuilder * builder)88 cut_factory_builder_init (CutFactoryBuilder *builder)
89 {
90     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(builder);
91 
92     priv->module_dir = NULL;
93     priv->option_context = NULL;
94     priv->factories = NULL;
95 }
96 
97 static void
dispose(GObject * object)98 dispose (GObject *object)
99 {
100     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(object);
101 
102     if (priv->module_dir) {
103         g_free(priv->module_dir);
104         priv->module_dir = NULL;
105     }
106 
107     if (priv->factories) {
108         g_list_free(priv->factories);
109         priv->factories = NULL;
110     }
111     priv->option_context = NULL;
112 
113     G_OBJECT_CLASS(cut_factory_builder_parent_class)->dispose(object);
114 }
115 
116 static void
set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)117 set_property (GObject      *object,
118               guint         prop_id,
119               const GValue *value,
120               GParamSpec   *pspec)
121 {
122     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(object);
123 
124     switch (prop_id) {
125       case PROP_MODULE_DIR:
126         if (priv->module_dir)
127             g_free(priv->module_dir);
128         priv->module_dir = g_value_dup_string(value);
129         break;
130       case PROP_OPTION_CONTEXT:
131         priv->option_context = g_value_get_pointer(value);
132         break;
133       default:
134         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
135         break;
136     }
137 }
138 
139 static void
get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)140 get_property (GObject    *object,
141               guint       prop_id,
142               GValue     *value,
143               GParamSpec *pspec)
144 {
145     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(object);
146 
147     switch (prop_id) {
148       case PROP_MODULE_DIR:
149         g_value_set_string(value, priv->module_dir);
150         break;
151       case PROP_OPTION_CONTEXT:
152         g_value_set_pointer(value, priv->option_context);
153         break;
154       default:
155         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
156         break;
157     }
158 }
159 
160 const gchar *
cut_factory_builder_get_type_name(CutFactoryBuilder * builder)161 cut_factory_builder_get_type_name (CutFactoryBuilder *builder)
162 {
163     CutFactoryBuilderClass *klass;
164 
165     g_return_val_if_fail(CUT_IS_FACTORY_BUILDER(builder), NULL);
166 
167     klass = CUT_FACTORY_BUILDER_GET_CLASS(builder);
168     if (klass->get_type_name)
169         return klass->get_type_name(builder);
170 
171     return NULL;
172 }
173 
174 const gchar *
cut_factory_builder_get_module_dir(CutFactoryBuilder * builder)175 cut_factory_builder_get_module_dir (CutFactoryBuilder *builder)
176 {
177     return CUT_FACTORY_BUILDER_GET_PRIVATE(builder)->module_dir;
178 }
179 
180 void
cut_factory_builder_set_option_context(CutFactoryBuilder * builder,GOptionContext * context)181 cut_factory_builder_set_option_context (CutFactoryBuilder *builder,
182                                         GOptionContext *context)
183 {
184     CutFactoryBuilderClass *klass;
185     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(builder);
186 
187     g_return_if_fail(CUT_IS_FACTORY_BUILDER(builder));
188 
189     klass = CUT_FACTORY_BUILDER_GET_CLASS(builder);
190     g_return_if_fail(klass->set_option_context);
191 
192     priv->option_context = context;
193     klass->set_option_context(builder, context);
194 }
195 
196 GList *
cut_factory_builder_build(CutFactoryBuilder * builder)197 cut_factory_builder_build (CutFactoryBuilder *builder)
198 {
199     CutFactoryBuilderClass *klass;
200     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(builder);
201 
202     g_return_val_if_fail(CUT_IS_FACTORY_BUILDER(builder), NULL);
203 
204     klass = CUT_FACTORY_BUILDER_GET_CLASS(builder);
205     g_return_val_if_fail(klass->build, NULL);
206 
207     priv->factories = klass->build(builder);
208 
209     return priv->factories;
210 }
211 
212 GList *
cut_factory_builder_build_all(CutFactoryBuilder * builder)213 cut_factory_builder_build_all (CutFactoryBuilder *builder)
214 {
215     CutFactoryBuilderClass *klass;
216     CutFactoryBuilderPrivate *priv = CUT_FACTORY_BUILDER_GET_PRIVATE(builder);
217 
218     g_return_val_if_fail(CUT_IS_FACTORY_BUILDER(builder), NULL);
219 
220     klass = CUT_FACTORY_BUILDER_GET_CLASS(builder);
221     g_return_val_if_fail(klass->build_all, NULL);
222 
223     priv->factories = klass->build_all(builder);
224 
225     return priv->factories;
226 }
227 
228 /*
229 vi:ts=4:nowrap:ai:expandtab:sw=4
230 */
231