1 /* GSequencer - Advanced GTK Sequencer
2 * Copyright (C) 2005-2020 Joël Krähemann
3 *
4 * This file is part of GSequencer.
5 *
6 * GSequencer is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * GSequencer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GSequencer. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <ags/object/ags_connectable.h>
21
22 void ags_connectable_base_init(AgsConnectableInterface *ginterface);
23
24 /**
25 * SECTION:ags_connectable
26 * @short_description: unique access to objects
27 * @title: AgsConnectable
28 * @section_id: AgsConnectable
29 * @include: ags/object/ags_connectable.h
30 *
31 * The #AgsConnectable interface gives you a unique access to all objects
32 * and is responsible to set up signal handlers.
33 */
34
35 GType
ags_connectable_get_type()36 ags_connectable_get_type()
37 {
38 static volatile gsize g_define_type_id__volatile = 0;
39
40 if(g_once_init_enter (&g_define_type_id__volatile)){
41 GType ags_type_connectable = 0;
42
43 static const GTypeInfo ags_connectable_info = {
44 sizeof(AgsConnectableInterface),
45 (GBaseInitFunc) ags_connectable_base_init,
46 NULL, /* base_finalize */
47 };
48
49 ags_type_connectable = g_type_register_static(G_TYPE_INTERFACE,
50 "AgsConnectable", &ags_connectable_info,
51 0);
52
53 g_once_init_leave(&g_define_type_id__volatile, ags_type_connectable);
54 }
55
56 return g_define_type_id__volatile;
57 }
58
59 void
ags_connectable_base_init(AgsConnectableInterface * ginterface)60 ags_connectable_base_init(AgsConnectableInterface *ginterface)
61 {
62 /* empty */
63 }
64
65 /**
66 * ags_connectable_get_uuid:
67 * @connectable: the #AgsConnectable
68 *
69 * Get UUID of @connectable.
70 *
71 * Returns: the assigned #AgsUUID
72 *
73 * Since: 3.0.0
74 */
75 AgsUUID*
ags_connectable_get_uuid(AgsConnectable * connectable)76 ags_connectable_get_uuid(AgsConnectable *connectable)
77 {
78 AgsConnectableInterface *connectable_interface;
79
80 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL);
81 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
82 g_return_val_if_fail(connectable_interface->get_uuid, NULL);
83
84 return(connectable_interface->get_uuid(connectable));
85 }
86
87 /**
88 * ags_connectable_has_resource:
89 * @connectable: the #AgsConnectable
90 *
91 * Check the connectable to have resources.
92 *
93 * Returns: %TRUE if @connectable can be added to registry, otherwise %FALSE.
94 *
95 * Since: 3.0.0
96 */
97 gboolean
ags_connectable_has_resource(AgsConnectable * connectable)98 ags_connectable_has_resource(AgsConnectable *connectable)
99 {
100 AgsConnectableInterface *connectable_interface;
101
102 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), FALSE);
103 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
104 g_return_val_if_fail(connectable_interface->has_resource, FALSE);
105
106 return(connectable_interface->has_resource(connectable));
107 }
108
109 /**
110 * ags_connectable_is_ready:
111 * @connectable: the #AgsConnectable
112 *
113 * Connect the connectable.
114 *
115 * Returns: %TRUE if is added to registry, otherwise %FALSE.
116 *
117 * Since: 3.0.0
118 */
119 gboolean
ags_connectable_is_ready(AgsConnectable * connectable)120 ags_connectable_is_ready(AgsConnectable *connectable)
121 {
122 AgsConnectableInterface *connectable_interface;
123
124 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), TRUE);
125 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
126 g_return_val_if_fail(connectable_interface->is_ready, TRUE);
127
128 return(connectable_interface->is_ready(connectable));
129 }
130
131 /**
132 * ags_connectable_add_to_registry:
133 * @connectable: the #AgsConnectable
134 *
135 * Add connectable to registry.
136 *
137 * Since: 3.0.0
138 */
139 void
ags_connectable_add_to_registry(AgsConnectable * connectable)140 ags_connectable_add_to_registry(AgsConnectable *connectable)
141 {
142 AgsConnectableInterface *connectable_interface;
143
144 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
145 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
146 g_return_if_fail(connectable_interface->add_to_registry);
147 connectable_interface->add_to_registry(connectable);
148 }
149
150 /**
151 * ags_connectable_remove_from_registry:
152 * @connectable: the #AgsConnectable
153 *
154 * Remove connectable from registry.
155 *
156 * Since: 3.0.0
157 */
158 void
ags_connectable_remove_from_registry(AgsConnectable * connectable)159 ags_connectable_remove_from_registry(AgsConnectable *connectable)
160 {
161 AgsConnectableInterface *connectable_interface;
162
163 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
164 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
165 g_return_if_fail(connectable_interface->remove_from_registry);
166 connectable_interface->remove_from_registry(connectable);
167 }
168
169 /**
170 * ags_connectable_list_resource:
171 * @connectable: the #AgsConnectable
172 *
173 * List resources as an XML element and return it.
174 *
175 * Returns: (transfer none): the #xmlNode-struct
176 *
177 * Since: 3.0.0
178 */
179 xmlNode*
ags_connectable_list_resource(AgsConnectable * connectable)180 ags_connectable_list_resource(AgsConnectable *connectable)
181 {
182 AgsConnectableInterface *connectable_interface;
183
184 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL);
185 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
186 g_return_val_if_fail(connectable_interface->list_resource, NULL);
187
188 return(connectable_interface->list_resource(connectable));
189 }
190
191 /**
192 * ags_connectable_xml_compose:
193 * @connectable: the #AgsConnectable
194 *
195 * Compose an XML element and return it.
196 *
197 * Returns: (transfer none): the #xmlNode-struct
198 *
199 * Since: 3.0.0
200 */
201 xmlNode*
ags_connectable_xml_compose(AgsConnectable * connectable)202 ags_connectable_xml_compose(AgsConnectable *connectable)
203 {
204 AgsConnectableInterface *connectable_interface;
205
206 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL);
207 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
208 g_return_val_if_fail(connectable_interface->xml_compose, NULL);
209
210 return(connectable_interface->xml_compose(connectable));
211 }
212
213 /**
214 * ags_connectable_xml_parse:
215 * @connectable: the #AgsConnectable
216 * @node: (transfer none): the #xmlNode-struct
217 *
218 * Parse @node as XML element and apply it.
219 *
220 * Since: 3.0.0
221 */
222 void
ags_connectable_xml_parse(AgsConnectable * connectable,xmlNode * node)223 ags_connectable_xml_parse(AgsConnectable *connectable,
224 xmlNode *node)
225 {
226 AgsConnectableInterface *connectable_interface;
227
228 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
229 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
230 g_return_if_fail(connectable_interface->xml_parse);
231 connectable_interface->xml_parse(connectable,
232 node);
233 }
234
235 /**
236 * ags_connectable_is_connected:
237 * @connectable: the #AgsConnectable
238 *
239 * Check if the @connectable was connected.
240 *
241 * Returns: %TRUE if is connected, otherwise %FALSE.
242 *
243 * Since: 3.0.0
244 */
245 gboolean
ags_connectable_is_connected(AgsConnectable * connectable)246 ags_connectable_is_connected(AgsConnectable *connectable)
247 {
248 AgsConnectableInterface *connectable_interface;
249
250 g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), FALSE);
251 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
252 g_return_val_if_fail(connectable_interface->is_connected, FALSE);
253
254 return(connectable_interface->is_connected(connectable));
255 }
256
257 /**
258 * ags_connectable_connect:
259 * @connectable: the #AgsConnectable
260 *
261 * Connect the connectable.
262 *
263 * Since: 3.0.0
264 */
265 void
ags_connectable_connect(AgsConnectable * connectable)266 ags_connectable_connect(AgsConnectable *connectable)
267 {
268 AgsConnectableInterface *connectable_interface;
269
270 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
271 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
272 g_return_if_fail(connectable_interface->connect);
273
274 connectable_interface->connect(connectable);
275 }
276
277 /**
278 * ags_connectable_disconnect:
279 * @connectable: the #AgsConnectable
280 *
281 * Disconnect the connectable.
282 *
283 * Since: 3.0.0
284 */
285 void
ags_connectable_disconnect(AgsConnectable * connectable)286 ags_connectable_disconnect(AgsConnectable *connectable)
287 {
288 AgsConnectableInterface *connectable_interface;
289
290 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
291 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
292 g_return_if_fail(connectable_interface->disconnect);
293 connectable_interface->disconnect(connectable);
294 }
295
296 /**
297 * ags_connectable_connect_connection:
298 * @connectable: the #AgsConnectable
299 * @connection: the connection
300 *
301 * Disconnect the connectable.
302 *
303 * Since: 3.0.0
304 */
305 void
ags_connectable_connect_connection(AgsConnectable * connectable,GObject * connection)306 ags_connectable_connect_connection(AgsConnectable *connectable,
307 GObject *connection)
308 {
309 AgsConnectableInterface *connectable_interface;
310
311 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
312 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
313 g_return_if_fail(connectable_interface->connect_connection);
314 connectable_interface->connect_connection(connectable,
315 connection);
316 }
317
318 /**
319 * ags_connectable_disconnect_connection:
320 * @connectable: the #AgsConnectable
321 * @connection: the connection
322 *
323 * Disconnect the connectable.
324 *
325 * Since: 3.0.0
326 */
327 void
ags_connectable_disconnect_connection(AgsConnectable * connectable,GObject * connection)328 ags_connectable_disconnect_connection(AgsConnectable *connectable,
329 GObject *connection)
330 {
331 AgsConnectableInterface *connectable_interface;
332
333 g_return_if_fail(AGS_IS_CONNECTABLE(connectable));
334 connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable);
335 g_return_if_fail(connectable_interface->disconnect_connection);
336 connectable_interface->disconnect_connection(connectable,
337 connection);
338 }
339