XMMS2
xmms_object.h
Go to the documentation of this file.
1 /* XMMS2 - X Music Multiplexer System
2  * Copyright (C) 2003-2009 XMMS2 Team
3  *
4  * PLUGINS ARE NOT CONSIDERED TO BE DERIVED WORK !!!
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library 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 GNU
14  * Lesser General Public License for more details.
15  */
16 
17 
18 
19 
20 #ifndef __XMMS_OBJECT_H__
21 #define __XMMS_OBJECT_H__
22 
23 #include <glib.h>
24 #include "xmms/xmms_error.h"
25 #include "xmmsc/xmmsc_idnumbers.h"
26 #include "xmmsc/xmmsv.h"
27 #include "xmmsc/xmmsv_coll.h"
28 
29 #define XMMS_OBJECT_MID 0x00455574
30 
31 G_BEGIN_DECLS
32 
33 struct xmms_object_St;
36 
37 typedef void (*xmms_object_destroy_func_t) (xmms_object_t *object);
38 
39 /** @addtogroup Object
40  * @{
41  */
43  guint32 id;
44  GMutex *mutex;
45 
46  GTree *signals;
47  GTree *cmds;
48 
49  gint ref;
51 };
52 
53 
54 /* Convenience wrapper to create #xmmsv_t from GLib types. */
55 xmmsv_t *xmms_convert_and_kill_list (GList *list);
56 xmmsv_t *xmms_convert_and_kill_dict (GTree *dict);
58 xmmsv_t *xmms_convert_and_kill_bin (GString *gs);
59 
60 int xmms_bin_to_gstring (xmmsv_t *value, GString **gs);
61 int dummy_identity (xmmsv_t *value, xmmsv_t **arg);
62 gboolean check_string_list (xmmsv_t *list);
63 
64 
65 /** @} */
66 
67 typedef void (*xmms_object_handler_t) (xmms_object_t *object, xmmsv_t *data, gpointer userdata);
68 
69 #define XMMS_OBJECT_CMD_MAX_ARGS 6
70 typedef struct {
75 
77 
82 };
83 
84 #define XMMS_OBJECT(p) ((xmms_object_t *)p)
85 #define XMMS_IS_OBJECT(p) (XMMS_OBJECT (p)->id == XMMS_OBJECT_MID)
86 
87 void xmms_object_cleanup (xmms_object_t *object);
88 
89 void xmms_object_connect (xmms_object_t *object, guint32 signalid,
90  xmms_object_handler_t handler, gpointer userdata);
91 
92 void xmms_object_disconnect (xmms_object_t *object, guint32 signalid,
93  xmms_object_handler_t handler, gpointer userdata);
94 
95 void xmms_object_emit (xmms_object_t *object, guint32 signalid, xmmsv_t *data);
96 
97 void xmms_object_emit_f (xmms_object_t *object, guint32 signalid,
98  xmmsv_type_t type, ...);
99 
101 
102 void xmms_object_cmd_add (xmms_object_t *object, guint cmdid, const xmms_object_cmd_desc_t *desc);
103 
104 void xmms_object_cmd_call (xmms_object_t *object, guint cmdid, xmms_object_cmd_arg_t *arg);
105 
106 /* Some minor macro-magic. XMMS_CMD_DEFINE and XMMS_CMD_FUNC
107  * are the only ones to be used directly */
108 
109 #define __XMMS_CMD_INIT_ARG_FULL(argn, argtypecode, extract_func) \
110  argtypecode argval##argn; \
111  g_return_if_fail (extract_func (arg->values[argn], &argval##argn));
112 
113 #define __XMMS_CMD_INIT_ARG(argn, argtype, argtypecode) \
114  __XMMS_CMD_INIT_ARG_FULL(argn, argtypecode, xmmsv_get_##argtype)
115 
116 #define __XMMS_CMD_INIT_ARG_NONE(a)
117 #define __XMMS_CMD_INIT_ARG_STRING(a) __XMMS_CMD_INIT_ARG(a, string, const gchar *)
118 #define __XMMS_CMD_INIT_ARG_INT32(a) __XMMS_CMD_INIT_ARG(a, int, gint)
119 #define __XMMS_CMD_INIT_ARG_COLL(a) __XMMS_CMD_INIT_ARG(a, coll, xmmsv_coll_t *)
120 #define __XMMS_CMD_INIT_ARG_BIN(a) __XMMS_CMD_INIT_ARG_FULL(a, GString *, xmms_bin_to_gstring)
121 #define __XMMS_CMD_INIT_ARG_LIST(a) __XMMS_CMD_INIT_ARG_FULL(a, xmmsv_t *, dummy_identity)
122 #define __XMMS_CMD_INIT_ARG_DICT(a) __XMMS_CMD_INIT_ARG_FULL(a, xmmsv_t *, dummy_identity)
123 
124 #define __XMMS_CMD_PRINT_ARG_NONE(a)
125 #define __XMMS_CMD_PRINT_ARG_STRING(a) , argval##a
126 #define __XMMS_CMD_PRINT_ARG_INT32(a) , argval##a
127 #define __XMMS_CMD_PRINT_ARG_COLL(a) , argval##a
128 #define __XMMS_CMD_PRINT_ARG_BIN(a) , argval##a
129 #define __XMMS_CMD_PRINT_ARG_LIST(a) , argval##a
130 #define __XMMS_CMD_PRINT_ARG_DICT(a) , argval##a
131 
132 #define __XMMS_CMD_DO_RETVAL_NONE() arg->retval = xmmsv_new_none();
133 #define __XMMS_CMD_DO_RETVAL_DICT() arg->retval = xmms_convert_and_kill_dict
134 #define __XMMS_CMD_DO_RETVAL_INT32() arg->retval = xmmsv_new_int
135 #define __XMMS_CMD_DO_RETVAL_LIST() arg->retval = xmms_convert_and_kill_list
136 #define __XMMS_CMD_DO_RETVAL_STRING() arg->retval = xmms_convert_and_kill_string
137 #define __XMMS_CMD_DO_RETVAL_COLL() arg->retval = xmmsv_new_coll
138 #define __XMMS_CMD_DO_RETVAL_BIN() arg->retval =
139 
140 #define __XMMS_CMD_DO_RETTYPE_NONE() void
141 #define __XMMS_CMD_DO_RETTYPE_STRING() char *
142 #define __XMMS_CMD_DO_RETTYPE_INT32() gint32
143 #define __XMMS_CMD_DO_RETTYPE_COLL(a) xmmsv_coll_t *
144 #define __XMMS_CMD_DO_RETTYPE_BIN(a) xmmsv_t *
145 #define __XMMS_CMD_DO_RETTYPE_LIST(a) GList *
146 #define __XMMS_CMD_DO_RETTYPE_DICT(a) GTree *
147 
148 #define __XMMS_CMD_DO_ARGTYPE_NONE
149 #define __XMMS_CMD_DO_ARGTYPE_STRING , const char *
150 #define __XMMS_CMD_DO_ARGTYPE_INT32 , gint32
151 #define __XMMS_CMD_DO_ARGTYPE_COLL , xmmsv_coll_t *
152 #define __XMMS_CMD_DO_ARGTYPE_BIN , GString *
153 #define __XMMS_CMD_DO_ARGTYPE_LIST , xmmsv_t *
154 #define __XMMS_CMD_DO_ARGTYPE_DICT , xmmsv_t *
155 
156 
157 #define XMMS_CMD_DEFINE6(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, argtype4, argtype5, argtype6) \
158 \
159  static __XMMS_CMD_DO_RETTYPE_##_rettype() realfunc (argtype0 __XMMS_CMD_DO_ARGTYPE_##argtype1 __XMMS_CMD_DO_ARGTYPE_##argtype2 __XMMS_CMD_DO_ARGTYPE_##argtype3 __XMMS_CMD_DO_ARGTYPE_##argtype4 __XMMS_CMD_DO_ARGTYPE_##argtype5 __XMMS_CMD_DO_ARGTYPE_##argtype6, xmms_error_t *); \
160 \
161 static void \
162 __int_xmms_cmd_##cmdid (xmms_object_t *object, xmms_object_cmd_arg_t *arg) \
163 { \
164 g_return_if_fail (XMMS_IS_OBJECT (object)); \
165 __XMMS_CMD_INIT_ARG_##argtype1 (0) \
166 __XMMS_CMD_INIT_ARG_##argtype2 (1) \
167 __XMMS_CMD_INIT_ARG_##argtype3 (2) \
168 __XMMS_CMD_INIT_ARG_##argtype4 (3) \
169 __XMMS_CMD_INIT_ARG_##argtype5 (4) \
170 __XMMS_CMD_INIT_ARG_##argtype6 (5) \
171 __XMMS_CMD_DO_RETVAL_##_rettype() (realfunc ((argtype0)object __XMMS_CMD_PRINT_ARG_##argtype1(0) __XMMS_CMD_PRINT_ARG_##argtype2(1) __XMMS_CMD_PRINT_ARG_##argtype3(2) __XMMS_CMD_PRINT_ARG_##argtype4(3) __XMMS_CMD_PRINT_ARG_##argtype5(4) __XMMS_CMD_PRINT_ARG_##argtype6(5), &arg->error)); \
172 } \
173 static const xmms_object_cmd_desc_t __int_xmms_cmd_desc_##cmdid = { __int_xmms_cmd_##cmdid, XMMSV_TYPE_##_rettype, {XMMSV_TYPE_##argtype1, XMMSV_TYPE_##argtype2, XMMSV_TYPE_##argtype3, XMMSV_TYPE_##argtype4, XMMSV_TYPE_##argtype5, XMMSV_TYPE_##argtype6} }
174 
175 
176 #define XMMS_CMD_DEFINE(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2) XMMS_CMD_DEFINE6(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, NONE, NONE, NONE, NONE)
177 #define XMMS_CMD_DEFINE3(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3) XMMS_CMD_DEFINE6(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, NONE, NONE, NONE)
178 #define XMMS_CMD_DEFINE4(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, argtype4) XMMS_CMD_DEFINE6(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, argtype4, NONE, NONE)
179 #define XMMS_CMD_DEFINE5(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, argtype4, argtype5) XMMS_CMD_DEFINE6(cmdid, realfunc, argtype0, _rettype, argtype1, argtype2, argtype3, argtype4, argtype5, NONE)
180 
181 #define XMMS_CMD_FUNC(cmdid) &__int_xmms_cmd_desc_##cmdid
182 
183 
186 
187 #define xmms_object_ref(obj) do { \
188  if (obj && XMMS_IS_OBJECT (obj)) { \
189  g_atomic_int_inc (&(XMMS_OBJECT (obj)->ref)); \
190  } \
191 } while (0)
192 
193 #define xmms_object_unref(obj) do { \
194  if (obj && XMMS_IS_OBJECT (obj)) { \
195  __int_xmms_object_unref (XMMS_OBJECT (obj)); \
196  } \
197 } while (0)
198 
199 #define xmms_object_new(objtype,destroyfunc) (objtype *) __int_xmms_object_new (sizeof (objtype), destroyfunc)
200 
201 G_END_DECLS
202 
203 #endif /* __XMMS_OBJECT_H__ */
struct xmmsv_St xmmsv_t
Definition: xmmsv.h:51
void __int_xmms_object_unref(xmms_object_t *object)
Definition: object.c:489
xmmsv_t * xmms_convert_and_kill_bin(GString *gs)
xmmsv_type_t args[XMMS_OBJECT_CMD_MAX_ARGS]
Definition: xmms_object.h:81
xmms_object_cmd_func_t func
Definition: xmms_object.h:79
void xmms_object_cmd_add(xmms_object_t *object, guint cmdid, const xmms_object_cmd_desc_t *desc)
Add a command that could be called from the client API to a object.
Definition: object.c:321
GTree * signals
Definition: xmms_object.h:46
gboolean check_string_list(xmmsv_t *list)
Checks that the list only contains string values.
Definition: object.c:470
int xmms_bin_to_gstring(xmmsv_t *value, GString **gs)
Definition: object.c:448
GTree * cmds
Definition: xmms_object.h:47
void xmms_object_cleanup(xmms_object_t *object)
Cleanup all the resources for the object.
Definition: object.c:63
void xmms_object_emit(xmms_object_t *object, guint32 signalid, xmmsv_t *data)
Emit a signal and thus call all the handlers that are connected.
Definition: object.c:196
void xmms_object_cmd_arg_init(xmms_object_cmd_arg_t *arg)
Initialize a command argument.
Definition: object.c:237
void xmms_object_emit_f(xmms_object_t *object, guint32 signalid, xmmsv_type_t type,...)
Emits a signal on the current object.
Definition: object.c:257
void(* xmms_object_cmd_func_t)(xmms_object_t *object, xmms_object_cmd_arg_t *arg)
Definition: xmms_object.h:76
GMutex * mutex
Definition: xmms_object.h:44
void xmms_object_cmd_call(xmms_object_t *object, guint cmdid, xmms_object_cmd_arg_t *arg)
Call a command with argument.
Definition: object.c:339
xmmsv_type_t
Definition: xmmsv.h:29
int dummy_identity(xmmsv_t *value, xmmsv_t **arg)
Definition: object.c:460
xmmsv_t * xmms_convert_and_kill_list(GList *list)
Definition: object.c:368
xmmsv_t * xmms_convert_and_kill_string(gchar *str)
Definition: object.c:409
void(* xmms_object_destroy_func_t)(xmms_object_t *object)
Definition: xmms_object.h:37
xmmsv_t * xmms_convert_and_kill_dict(GTree *dict)
Definition: object.c:395
void xmms_object_connect(xmms_object_t *object, guint32 signalid, xmms_object_handler_t handler, gpointer userdata)
Connect to a signal that is emitted by this object.
Definition: object.c:116
void xmms_object_disconnect(xmms_object_t *object, guint32 signalid, xmms_object_handler_t handler, gpointer userdata)
Disconnect from a signal.
Definition: object.c:147
G_BEGIN_DECLS struct xmms_error_St xmms_error_t
void(* xmms_object_handler_t)(xmms_object_t *object, xmmsv_t *data, gpointer userdata)
Definition: xmms_object.h:67
xmms_error_t error
Definition: xmms_object.h:73
xmms_object_t * __int_xmms_object_new(gint size, xmms_object_destroy_func_t destfunc)
Definition: object.c:501
xmms_object_destroy_func_t destroy_func
Definition: xmms_object.h:50
#define XMMS_OBJECT_CMD_MAX_ARGS
Definition: xmms_object.h:69