1 /* ide-simple-build-target.c
2  *
3  * Copyright 2018-2019 Christian Hergert <chergert@redhat.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU 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 program 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 General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  * SPDX-License-Identifier: GPL-3.0-or-later
19  */
20 
21 #define G_LOG_DOMAIN "ide-simple-build-target"
22 
23 #include "config.h"
24 
25 #include "ide-build-target.h"
26 #include "ide-simple-build-target.h"
27 
28 typedef struct
29 {
30   GFile *install_directory;
31   gchar *name;
32   gchar **argv;
33   gchar *cwd;
34   gchar *language;
35   gint priority;
36 } IdeSimpleBuildTargetPrivate;
37 
38 static void build_target_iface_init (IdeBuildTargetInterface *iface);
39 
G_DEFINE_TYPE_WITH_CODE(IdeSimpleBuildTarget,ide_simple_build_target,IDE_TYPE_OBJECT,G_ADD_PRIVATE (IdeSimpleBuildTarget)G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET,build_target_iface_init))40 G_DEFINE_TYPE_WITH_CODE (IdeSimpleBuildTarget, ide_simple_build_target, IDE_TYPE_OBJECT,
41                          G_ADD_PRIVATE (IdeSimpleBuildTarget)
42                          G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET,
43                                                 build_target_iface_init))
44 
45 static void
46 ide_simple_build_target_finalize (GObject *object)
47 {
48   IdeSimpleBuildTarget *self = (IdeSimpleBuildTarget *)object;
49   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
50 
51   g_clear_object (&priv->install_directory);
52   g_clear_pointer (&priv->name, g_free);
53   g_clear_pointer (&priv->argv, g_strfreev);
54   g_clear_pointer (&priv->cwd, g_free);
55   g_clear_pointer (&priv->language, g_free);
56 
57   G_OBJECT_CLASS (ide_simple_build_target_parent_class)->finalize (object);
58 }
59 
60 static void
ide_simple_build_target_class_init(IdeSimpleBuildTargetClass * klass)61 ide_simple_build_target_class_init (IdeSimpleBuildTargetClass *klass)
62 {
63   GObjectClass *object_class = G_OBJECT_CLASS (klass);
64 
65   object_class->finalize = ide_simple_build_target_finalize;
66 }
67 
68 static void
ide_simple_build_target_init(IdeSimpleBuildTarget * self)69 ide_simple_build_target_init (IdeSimpleBuildTarget *self)
70 {
71 }
72 
73 IdeSimpleBuildTarget *
ide_simple_build_target_new(IdeContext * context)74 ide_simple_build_target_new (IdeContext *context)
75 {
76   g_return_val_if_fail (!context || IDE_IS_CONTEXT (context), NULL);
77 
78   return g_object_new (IDE_TYPE_SIMPLE_BUILD_TARGET,
79                        "parent", context,
80                        NULL);
81 }
82 
83 void
ide_simple_build_target_set_install_directory(IdeSimpleBuildTarget * self,GFile * install_directory)84 ide_simple_build_target_set_install_directory (IdeSimpleBuildTarget *self,
85                                                GFile                *install_directory)
86 {
87   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
88 
89   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
90   g_return_if_fail (!install_directory || G_IS_FILE (install_directory));
91 
92   g_set_object (&priv->install_directory, install_directory);
93 }
94 
95 void
ide_simple_build_target_set_name(IdeSimpleBuildTarget * self,const gchar * name)96 ide_simple_build_target_set_name (IdeSimpleBuildTarget *self,
97                                   const gchar          *name)
98 {
99   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
100 
101   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
102 
103   if (g_strcmp0 (priv->name, name) != 0)
104     {
105       g_free (priv->name);
106       priv->name = g_strdup (name);
107     }
108 }
109 
110 void
ide_simple_build_target_set_priority(IdeSimpleBuildTarget * self,gint priority)111 ide_simple_build_target_set_priority (IdeSimpleBuildTarget *self,
112                                       gint                  priority)
113 {
114   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
115 
116   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
117 
118   priv->priority = priority;
119 }
120 
121 void
ide_simple_build_target_set_argv(IdeSimpleBuildTarget * self,const gchar * const * argv)122 ide_simple_build_target_set_argv (IdeSimpleBuildTarget *self,
123                                   const gchar * const  *argv)
124 {
125   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
126 
127   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
128 
129   if (priv->argv != (gchar **)argv)
130     {
131       g_strfreev (priv->argv);
132       priv->argv = g_strdupv ((gchar **)argv);
133     }
134 }
135 
136 void
ide_simple_build_target_set_cwd(IdeSimpleBuildTarget * self,const gchar * cwd)137 ide_simple_build_target_set_cwd (IdeSimpleBuildTarget *self,
138                                  const gchar          *cwd)
139 {
140   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
141 
142   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
143 
144   if (g_strcmp0 (priv->cwd, cwd) != 0)
145     {
146       g_free (priv->cwd);
147       priv->cwd = g_strdup (cwd);
148     }
149 }
150 
151 void
ide_simple_build_target_set_language(IdeSimpleBuildTarget * self,const gchar * language)152 ide_simple_build_target_set_language (IdeSimpleBuildTarget *self,
153                                       const gchar          *language)
154 {
155   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
156 
157   g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
158 
159   if (g_strcmp0 (priv->language, language) != 0)
160     {
161       g_free (priv->language);
162       priv->language = g_strdup (language);
163     }
164 }
165 
166 static GFile *
get_install_directory(IdeBuildTarget * target)167 get_install_directory (IdeBuildTarget *target)
168 {
169   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
170   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
171   return priv->install_directory ? g_object_ref (priv->install_directory) : NULL;
172 }
173 
174 static gchar *
get_name(IdeBuildTarget * target)175 get_name (IdeBuildTarget *target)
176 {
177   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
178   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
179   return g_strdup (priv->name);
180 }
181 
182 static gchar **
get_argv(IdeBuildTarget * target)183 get_argv (IdeBuildTarget *target)
184 {
185   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
186   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
187   return g_strdupv (priv->argv);
188 }
189 
190 static gchar *
get_cwd(IdeBuildTarget * target)191 get_cwd (IdeBuildTarget *target)
192 {
193   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
194   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
195   return g_strdup (priv->cwd);
196 }
197 
198 static gchar *
get_language(IdeBuildTarget * target)199 get_language (IdeBuildTarget *target)
200 {
201   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
202   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
203   return g_strdup (priv->language);
204 }
205 
206 static gint
get_priority(IdeBuildTarget * target)207 get_priority (IdeBuildTarget *target)
208 {
209   IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
210   IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
211   return priv->priority;
212 }
213 
214 static void
build_target_iface_init(IdeBuildTargetInterface * iface)215 build_target_iface_init (IdeBuildTargetInterface *iface)
216 {
217   iface->get_install_directory = get_install_directory;
218   iface->get_name = get_name;
219   iface->get_priority = get_priority;
220   iface->get_argv = get_argv;
221   iface->get_cwd = get_cwd;
222   iface->get_language = get_language;
223 }
224