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