1 /*
2  * libInstPatch
3  * Copyright (C) 1999-2014 Element Green <element@elementsofsound.org>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation; version 2.1
8  * of the License only.
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, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA or on the web at http://www.gnu.org.
19  */
20 #ifndef __IPATCH_CONTAINER_H__
21 #define __IPATCH_CONTAINER_H__
22 
23 #include <stdarg.h>
24 #include <glib.h>
25 #include <glib-object.h>
26 
27 /* forward type declarations */
28 
29 typedef struct _IpatchContainer IpatchContainer;
30 typedef struct _IpatchContainerClass IpatchContainerClass;
31 
32 #include <libinstpatch/IpatchItem.h>
33 #include <libinstpatch/IpatchIter.h>
34 #include <libinstpatch/IpatchList.h>
35 
36 #define IPATCH_TYPE_CONTAINER   (ipatch_container_get_type ())
37 #define IPATCH_CONTAINER(obj) \
38   (G_TYPE_CHECK_INSTANCE_CAST ((obj), IPATCH_TYPE_CONTAINER, IpatchContainer))
39 #define IPATCH_CONTAINER_CLASS(klass) \
40   (G_TYPE_CHECK_CLASS_CAST ((klass), IPATCH_TYPE_CONTAINER, \
41   IpatchContainerClass))
42 #define IPATCH_IS_CONTAINER(obj) \
43   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IPATCH_TYPE_CONTAINER))
44 #define IPATCH_IS_CONTAINER_CLASS(klass) \
45   (G_TYPE_CHECK_CLASS_TYPE ((klass), IPATCH_TYPE_CONTAINER))
46 #define IPATCH_CONTAINER_GET_CLASS(obj) \
47   (G_TYPE_INSTANCE_GET_CLASS ((obj), IPATCH_TYPE_CONTAINER, \
48   IpatchContainerClass))
49 
50 /**
51  * IpatchContainerCallback:
52  * @container: Container item
53  * @item: Item that was added/removed to/from @container
54  * @user_data: User defined pointer assigned when callback connected
55  *
56  * A function prototype callback which is called for container adds or removes
57  * (after adds, before removes).
58  */
59 typedef void (*IpatchContainerCallback)(IpatchContainer *container,
60                                         IpatchItem *item,
61                                         gpointer user_data);
62 /**
63  * IpatchContainerDisconnect:
64  * @container: Container item
65  * @child: Match child item of original connect
66  *   (ipatch_container_remove_connect() only, always NULL for
67  *    ipatch_container_add_connect()).
68  * @user_data: User defined pointer assigned when callback connected
69  *
70  * A function prototype which is called when a callback gets disconnected.
71  */
72 typedef void (*IpatchContainerDisconnect)(IpatchContainer *container,
73         IpatchItem *child,
74         gpointer user_data);
75 
76 /* Base patch container object */
77 struct _IpatchContainer
78 {
79     IpatchItem parent_instance;
80 };
81 
82 struct _IpatchContainerClass
83 {
84     IpatchItemClass parent_class;
85 
86     /*< public >*/
87 
88     /* methods */
89     const GType *(*child_types)(void);
90     const GType *(*virtual_types)(void);
91     gboolean(*init_iter)(IpatchContainer *container, IpatchIter *iter,
92                          GType type);
93     void (*make_unique)(IpatchContainer *container, IpatchItem *item);
94     gboolean(*get_dups)(IpatchContainer *container, IpatchItem *item,
95                         IpatchList **list);
96 };
97 
98 /* container uses no item flags */
99 /**
100  * IPATCH_CONTAINER_UNUSED_FLAG_SHIFT: (skip)
101  */
102 #define IPATCH_CONTAINER_UNUSED_FLAG_SHIFT  IPATCH_ITEM_UNUSED_FLAG_SHIFT
103 
104 /**
105  * IPATCH_CONTAINER_ERRMSG_INVALID_CHILD_2: (skip)
106  */
107 #define IPATCH_CONTAINER_ERRMSG_INVALID_CHILD_2 \
108     "Invalid child type '%s' for parent type '%s'"
109 
110 GType ipatch_container_get_type(void);
111 
112 IpatchList *ipatch_container_get_children(IpatchContainer *container,
113         GType type);
114 GList *ipatch_container_get_children_list(IpatchContainer *container);
115 
116 GList *ipatch_container_get_children_by_type(IpatchContainer *container,
117         GType type);
118 const GType *ipatch_container_get_child_types(IpatchContainer *container);
119 const GType *ipatch_container_get_virtual_types(IpatchContainer *container);
120 const GType *ipatch_container_type_get_child_types(GType container_type);
121 void ipatch_container_insert(IpatchContainer *container,
122                              IpatchItem *item, int pos);
123 void ipatch_container_append(IpatchContainer *container, IpatchItem *item);
124 void ipatch_container_add(IpatchContainer *container, IpatchItem *item);
125 void ipatch_container_prepend(IpatchContainer *container, IpatchItem *item);
126 void ipatch_container_remove(IpatchContainer *container, IpatchItem *item);
127 void ipatch_container_remove_all(IpatchContainer *container);
128 guint ipatch_container_count(IpatchContainer *container, GType type);
129 void ipatch_container_make_unique(IpatchContainer *container,
130                                   IpatchItem *item);
131 void ipatch_container_add_unique(IpatchContainer *container,
132                                  IpatchItem *item);
133 gboolean ipatch_container_init_iter(IpatchContainer *container,
134                                     IpatchIter *iter, GType type);
135 void ipatch_container_insert_iter(IpatchContainer *container,
136                                   IpatchItem *item, IpatchIter *iter);
137 void ipatch_container_remove_iter(IpatchContainer *container,
138                                   IpatchIter *iter);
139 
140 /* defined in IpatchContainer_notify.c */
141 
142 void ipatch_container_add_notify(IpatchContainer *container, IpatchItem *child);
143 void ipatch_container_remove_notify(IpatchContainer *container, IpatchItem *child);
144 guint ipatch_container_add_connect(IpatchContainer *container,
145                                    IpatchContainerCallback callback,
146                                    IpatchContainerDisconnect disconnect,
147                                    gpointer user_data);
148 guint
149 ipatch_container_add_connect_notify(IpatchContainer *container,
150                                     IpatchContainerCallback callback,
151                                     GDestroyNotify notify_func,
152                                     gpointer user_data);
153 guint ipatch_container_remove_connect(IpatchContainer *container,
154                                       IpatchItem *child,
155                                       IpatchContainerCallback callback,
156                                       IpatchContainerDisconnect disconnect,
157                                       gpointer user_data);
158 guint
159 ipatch_container_remove_connect_notify(IpatchContainer *container,
160                                        IpatchItem *child,
161                                        IpatchContainerCallback callback,
162                                        GDestroyNotify notify_func,
163                                        gpointer user_data);
164 void ipatch_container_add_disconnect(guint handler_id);
165 void ipatch_container_add_disconnect_matched(IpatchContainer *container,
166         IpatchContainerCallback callback,
167         gpointer user_data);
168 void ipatch_container_remove_disconnect(guint handler_id);
169 void ipatch_container_remove_disconnect_matched(IpatchContainer *container,
170         IpatchItem *child,
171         IpatchContainerCallback callback,
172         gpointer user_data);
173 #endif
174