void chanopt_save (session *sess) { int i; guint8 vals; guint8 valm; chanopt_in_memory *co; char *network; if (sess->channel[0] == 0) return; network = server_get_network (sess->server, FALSE); if (!network) return; /* 2. reconcile sess with what we loaded from disk */ co = chanopt_find (network, sess->channel, TRUE); i = 0; while (i < sizeof (chanopt) / sizeof (channel_options)) { vals = G_STRUCT_MEMBER(guint8, sess, chanopt[i].offset); valm = G_STRUCT_MEMBER(guint8, co, chanopt[i].offset); if (vals != valm) { *(guint8 *)G_STRUCT_MEMBER_P(co, chanopt[i].offset) = vals; chanopt_changed = TRUE; } i++; } }
static void chanopt_save_one_channel (chanopt_in_memory *co, int fh) { int i; char buf[256]; guint8 val; snprintf (buf, sizeof (buf), "%s = %s\n", "network", co->network); write (fh, buf, strlen (buf)); snprintf (buf, sizeof (buf), "%s = %s\n", "channel", co->channel); write (fh, buf, strlen (buf)); i = 0; while (i < sizeof (chanopt) / sizeof (channel_options)) { val = G_STRUCT_MEMBER (guint8, co, chanopt[i].offset); if (val != SET_DEFAULT) { snprintf (buf, sizeof (buf), "%s = %d\n", chanopt[i].name, val); write (fh, buf, strlen (buf)); } i++; } }
void chanopt_load (session *sess) { int i; guint8 val; chanopt_in_memory *co; char *network; if (sess->channel[0] == 0) return; network = server_get_network (sess->server, FALSE); if (!network) return; if (!chanopt_open) { chanopt_open = TRUE; chanopt_load_all (); } co = chanopt_find (network, sess->channel, FALSE); if (!co) return; /* fill in all the sess->xxxxx fields */ i = 0; while (i < sizeof (chanopt) / sizeof (channel_options)) { val = G_STRUCT_MEMBER(guint8, co, chanopt[i].offset); *(guint8 *)G_STRUCT_MEMBER_P(sess, chanopt[i].offset) = val; i++; } }
void chanopt_save_all (void) { int i; int num_saved; int fh; GSList *list; chanopt_in_memory *co; guint8 val; if (!chanopt_list || !chanopt_changed) { return; } fh = hexchat_open_file ("chanopt.conf", O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh == -1) { return; } for (num_saved = 0, list = chanopt_list; list; list = list->next) { co = list->data; i = 0; while (i < sizeof (chanopt) / sizeof (channel_options)) { val = G_STRUCT_MEMBER (guint8, co, chanopt[i].offset); /* not using global/default setting, must save */ if (val != SET_DEFAULT) { if (num_saved != 0) write (fh, "\n", 1); chanopt_save_one_channel (co, fh); num_saved++; goto cont; } i++; } cont: g_free (co->network); g_free (co->channel); g_free (co); } close (fh); /* we're quiting, no need to free */ /*g_slist_free (chanopt_list); chanopt_list = NULL; chanopt_open = FALSE; chanopt_changed = FALSE;*/ }
static void gst_xvidenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstXvidEnc *xvidenc; guint offset; xvidenc = GST_XVIDENC (object); if (prop_id > xvidenc_prop_count) { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } /* our param specs should have such qdata */ offset = GPOINTER_TO_UINT (g_param_spec_get_qdata (pspec, xvidenc_pspec_quark)); if (offset == 0) return; switch (G_PARAM_SPEC_VALUE_TYPE (pspec)) { case G_TYPE_BOOLEAN: g_value_set_boolean (value, G_STRUCT_MEMBER (gboolean, xvidenc, offset)); break; case G_TYPE_INT: g_value_set_int (value, G_STRUCT_MEMBER (gint, xvidenc, offset)); break; case G_TYPE_STRING: g_value_take_string (value, g_strdup (G_STRUCT_MEMBER (gchar *, xvidenc, offset))); break; default: /* must be enum, given the check above */ if (G_IS_PARAM_SPEC_ENUM (pspec)) { g_value_set_enum (value, G_STRUCT_MEMBER (gint, xvidenc, offset)); } else if (G_IS_PARAM_SPEC_FLAGS (pspec)) { g_value_set_flags (value, G_STRUCT_MEMBER (guint, xvidenc, offset)); } else { /* oops, bit lazy we don't cover this case yet */ g_critical ("%s does not yet support type %s", GST_FUNCTION, g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec))); } break; } }
static void gst_xvidenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstXvidEnc *xvidenc; guint offset; xvidenc = GST_XVIDENC (object); if (prop_id > xvidenc_prop_count) { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } /* our param specs should have such qdata */ offset = GPOINTER_TO_UINT (g_param_spec_get_qdata (pspec, xvidenc_pspec_quark)); if (offset == 0) return; switch (G_PARAM_SPEC_VALUE_TYPE (pspec)) { case G_TYPE_BOOLEAN: G_STRUCT_MEMBER (gboolean, xvidenc, offset) = g_value_get_boolean (value); break; case G_TYPE_INT: G_STRUCT_MEMBER (gint, xvidenc, offset) = g_value_get_int (value); break; case G_TYPE_STRING: g_free (G_STRUCT_MEMBER (gchar *, xvidenc, offset)); G_STRUCT_MEMBER (gchar *, xvidenc, offset) = g_value_dup_string (value); break; default: /* must be enum, given the check above */ if (G_IS_PARAM_SPEC_ENUM (pspec)) { G_STRUCT_MEMBER (gint, xvidenc, offset) = g_value_get_enum (value); } else { G_STRUCT_MEMBER (guint, xvidenc, offset) = g_value_get_flags (value); } break; } }
static void gst_alloc_trace_print (const GstAllocTrace * trace) { GSList *mem_live; g_return_if_fail (trace != NULL); if (trace->flags & GST_ALLOC_TRACE_LIVE) { g_print ("%-22.22s : %d\n", trace->name, trace->live); } else { g_print ("%-22.22s : (no live count)\n", trace->name); } if (trace->flags & GST_ALLOC_TRACE_MEM_LIVE) { mem_live = trace->mem_live; while (mem_live) { gpointer data = mem_live->data; const gchar *type_name; gchar *extra = NULL; gint refcount = -1; if (trace->offset == -2) { if (G_IS_OBJECT (data)) { type_name = G_OBJECT_TYPE_NAME (data); refcount = G_OBJECT (data)->ref_count; } else type_name = "<invalid>"; } else if (trace->offset == -1) { type_name = "<unknown>"; } else { GType type; type = G_STRUCT_MEMBER (GType, data, trace->offset); type_name = g_type_name (type); if (type == GST_TYPE_CAPS) { extra = gst_caps_to_string (data); } refcount = GST_MINI_OBJECT_REFCOUNT_VALUE (data); } if (extra) { g_print (" %-20.20s : (%d) %p (\"%s\")\n", type_name, refcount, data, extra); g_free (extra); } else g_print (" %-20.20s : (%d) %p\n", type_name, refcount, data); mem_live = mem_live->next; } } }
CORBA_unsigned_long giop_recv_buffer_get_request_id (GIOPRecvBuffer *buf) { static const glong reqid_offsets [GIOP_NUM_MSG_TYPES] [GIOP_NUM_VERSIONS] = { /* GIOP_REQUEST */ { G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.request_1_0.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.request_1_1.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.request_1_2.request_id)}, /* GIOP_REPLY */ { G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.reply_1_0.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.reply_1_1.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.reply_1_2.request_id)}, /* GIOP_CANCELREQUEST */ { G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.cancel_request.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.cancel_request.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.cancel_request.request_id)}, /* GIOP_LOCATEREQUEST */ { G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_request_1_0.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_request_1_1.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_request_1_2.request_id)}, /* GIOP_LOCATEREPLY */ { G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_reply_1_0.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_reply_1_1.request_id), G_STRUCT_OFFSET(GIOPRecvBuffer, msg.u.locate_reply_1_2.request_id)}, {0,0,0}, /* GIOP_CLOSECONNECTION */ {0,0,0}, /* GIOP_MESSAGEERROR */ {0,0,0} /* GIOP_FRAGMENT */ }; gulong offset; offset = reqid_offsets [buf->msg.header.message_type] [buf->giop_version]; if (!offset) return 0; return G_STRUCT_MEMBER (CORBA_unsigned_long, buf, offset); }
static void generic_interface_init (gpointer iface, gpointer data) { GIInterfaceInfo *info = data; GIStructInfo *struct_info; gint n, i; struct_info = g_interface_info_get_iface_struct (info); n = g_interface_info_get_n_vfuncs (info); for (i = 0; i < n; i++) { GIVFuncInfo *vfunc_info; const gchar *vfunc_name; GIFieldInfo *field_info; gint field_offset; GITypeInfo *field_type_info; gchar *perl_method_name; GPerlI11nPerlCallbackInfo *callback_info; vfunc_info = g_interface_info_get_vfunc (info, i); vfunc_name = g_base_info_get_name (vfunc_info); /* FIXME: g_vfunc_info_get_offset does not seem to work here. */ field_info = get_field_info (struct_info, vfunc_name); g_assert (field_info); field_offset = g_field_info_get_offset (field_info); field_type_info = g_field_info_get_type (field_info); perl_method_name = g_ascii_strup (vfunc_name, -1); callback_info = create_perl_callback_closure_for_named_sub ( field_type_info, perl_method_name); dwarn ("installing vfunc %s as %s at offset %d (vs. %d) inside %p\n", vfunc_name, perl_method_name, field_offset, g_vfunc_info_get_offset (vfunc_info), iface); G_STRUCT_MEMBER (gpointer, iface, field_offset) = callback_info->closure; g_base_info_unref (field_type_info); g_base_info_unref (field_info); g_base_info_unref (vfunc_info); } g_base_info_unref (struct_info); }
static PyObject * _wrap_g_field_info_set_value (PyGIBaseInfo *self, PyObject *args) { PyObject *instance; PyObject *py_value; GIBaseInfo *container_info; GIInfoType container_info_type; gpointer pointer; GITypeInfo *field_type_info; GIArgument value; PyObject *retval = NULL; if (!PyArg_ParseTuple (args, "OO:FieldInfo.set_value", &instance, &py_value)) { return NULL; } container_info = g_base_info_get_container (self->info); g_assert (container_info != NULL); /* Check the instance. */ if (!_pygi_g_registered_type_info_check_object ( (GIRegisteredTypeInfo *) container_info, TRUE, instance)) { _PyGI_ERROR_PREFIX ("argument 1: "); return NULL; } /* Get the pointer to the container. */ container_info_type = g_base_info_get_type (container_info); switch (container_info_type) { case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_STRUCT: pointer = pyg_boxed_get (instance, void); break; case GI_INFO_TYPE_OBJECT: pointer = pygobject_get (instance); break; default: /* Other types don't have fields. */ g_assert_not_reached(); } field_type_info = g_field_info_get_type ( (GIFieldInfo *) self->info); /* Check the value. */ { gboolean retval; retval = _pygi_g_type_info_check_object (field_type_info, py_value, TRUE); if (retval < 0) { goto out; } if (!retval) { _PyGI_ERROR_PREFIX ("argument 2: "); goto out; } } /* Set the field's value. */ /* A few types are not handled by g_field_info_set_field, so do it here. */ if (!g_type_info_is_pointer (field_type_info) && g_type_info_get_tag (field_type_info) == GI_TYPE_TAG_INTERFACE) { GIBaseInfo *info; GIInfoType info_type; if (! (g_field_info_get_flags ( (GIFieldInfo *) self->info) & GI_FIELD_IS_WRITABLE)) { PyErr_SetString (PyExc_RuntimeError, "field is not writable"); goto out; } info = g_type_info_get_interface (field_type_info); info_type = g_base_info_get_type (info); switch (info_type) { case GI_INFO_TYPE_UNION: PyErr_SetString (PyExc_NotImplementedError, "setting an union is not supported yet"); goto out; case GI_INFO_TYPE_STRUCT: { gboolean is_simple; gsize offset; gssize size; is_simple = pygi_g_struct_info_is_simple ( (GIStructInfo *) info); if (!is_simple) { PyErr_SetString (PyExc_TypeError, "cannot set a structure which has no well-defined ownership transfer rules"); g_base_info_unref (info); goto out; } value = _pygi_argument_from_object (py_value, field_type_info, GI_TRANSFER_NOTHING); if (PyErr_Occurred()) { g_base_info_unref (info); goto out; } offset = g_field_info_get_offset ( (GIFieldInfo *) self->info); size = g_struct_info_get_size ( (GIStructInfo *) info); g_assert (size > 0); g_memmove ((char*) pointer + offset, value.v_pointer, size); g_base_info_unref (info); retval = Py_None; goto out; } default: /* Fallback. */ break; } g_base_info_unref (info); } else if (g_type_info_is_pointer (field_type_info) && g_type_info_get_tag (field_type_info) == GI_TYPE_TAG_VOID) { int offset; if (py_value != Py_None && !PYGLIB_PyLong_Check(py_value)) { if (PyErr_WarnEx(PyExc_RuntimeWarning, "Usage of gpointers to store objects is being deprecated. " "Please use integer values only, see: https://bugzilla.gnome.org/show_bug.cgi?id=683599", 1)) goto out; } offset = g_field_info_get_offset ((GIFieldInfo *) self->info); value = _pygi_argument_from_object (py_value, field_type_info, GI_TRANSFER_NOTHING); /* Decrement the previous python object stashed on the void pointer. * This seems somewhat dangerous as the code is blindly assuming any * void pointer field stores a python object pointer and then decrefs it. * This is essentially the same as something like: * Py_XDECREF(struct->void_ptr); */ Py_XDECREF(G_STRUCT_MEMBER (gpointer, pointer, offset)); /* Assign and increment the newly assigned object. At this point the value * arg will hold a pointer the python object "py_value" or NULL. * This is essentially: * struct->void_ptr = value.v_pointer; * Py_XINCREF(struct->void_ptr); */ G_STRUCT_MEMBER (gpointer, pointer, offset) = (gpointer)value.v_pointer; Py_XINCREF(G_STRUCT_MEMBER (gpointer, pointer, offset)); retval = Py_None; goto out; } value = _pygi_argument_from_object (py_value, field_type_info, GI_TRANSFER_EVERYTHING); if (PyErr_Occurred()) { goto out; } if (!g_field_info_set_field ( (GIFieldInfo *) self->info, pointer, &value)) { _pygi_argument_release (&value, field_type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN); PyErr_SetString (PyExc_RuntimeError, "unable to set value for field"); goto out; } retval = Py_None; out: g_base_info_unref ( (GIBaseInfo *) field_type_info); Py_XINCREF (retval); return retval; }
int chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[]) { int dots, i = 0, j, p = 0; guint8 val; int offset = 2; char *find; gboolean quiet = FALSE; int newval = -1; if (!strcmp (word[2], "-quiet")) { quiet = TRUE; offset++; } find = word[offset++]; if (word[offset][0]) { if (!g_ascii_strcasecmp (word[offset], "ON")) newval = 1; else if (!g_ascii_strcasecmp (word[offset], "OFF")) newval = 0; else if (word[offset][0] == 'u') newval = SET_DEFAULT; else newval = atoi (word[offset]); } if (!quiet) PrintTextf (sess, "\002Network\002: %s \002Channel\002: %s\n", sess->server->network ? server_get_network (sess->server, TRUE) : _("<none>"), sess->channel[0] ? sess->channel : _("<none>")); while (i < sizeof (chanopt) / sizeof (channel_options)) { if (find[0] == 0 || match (find, chanopt[i].name) || (chanopt[i].alias && match (find, chanopt[i].alias))) { if (newval != -1) /* set new value */ { *(guint8 *)G_STRUCT_MEMBER_P(sess, chanopt[i].offset) = newval; } if (!quiet) /* print value */ { strcpy (tbuf, chanopt[i].name); p = strlen (tbuf); tbuf[p++] = 3; tbuf[p++] = '2'; dots = 20 - strlen (chanopt[i].name); for (j = 0; j < dots; j++) tbuf[p++] = '.'; tbuf[p++] = 0; val = G_STRUCT_MEMBER (guint8, sess, chanopt[i].offset); PrintTextf (sess, "%s\0033:\017 %s", tbuf, chanopt_value (val)); } } i++; } return TRUE; }
/* --- functions --- */ static inline GParamSpecPrivate * g_param_spec_get_private (GParamSpec *pspec) { return &G_STRUCT_MEMBER (GParamSpecPrivate, pspec, g_param_private_offset); }
/** * g_field_info_set_field: * @field_info: a #GIFieldInfo * @mem: pointer to a block of memory representing a C structure or union * @value: a #GArgument holding the value to store * * Writes a field identified by a #GFieldInfo to a C structure or * union. This only handles fields of simple C types. It will fail * for a field of a composite type like a nested structure or union * even if that is actually writable. Note also that that it will refuse * to write fields where memory management would by required. A field * with a type such as 'char *' must be set with a setter function. * * Returns: %TRUE if writing the field succeeded, otherwise %FALSE */ gboolean g_field_info_set_field (GIFieldInfo *field_info, gpointer mem, const GArgument *value) { int offset; GITypeInfo *type_info; gboolean result = FALSE; if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_WRITABLE) == 0) return FALSE; offset = g_field_info_get_offset (field_info); type_info = g_field_info_get_type (field_info); if (!g_type_info_is_pointer (type_info)) { switch (g_type_info_get_tag (type_info)) { case GI_TYPE_TAG_VOID: g_warning("Field %s: should not be have void type", g_base_info_get_name ((GIBaseInfo *)field_info)); break; case GI_TYPE_TAG_BOOLEAN: G_STRUCT_MEMBER(gboolean, mem, offset) = value->v_boolean != FALSE; result = TRUE; break; case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: G_STRUCT_MEMBER(guint8, mem, offset) = value->v_uint8; result = TRUE; break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_SHORT: case GI_TYPE_TAG_USHORT: G_STRUCT_MEMBER(guint16, mem, offset) = value->v_uint16; result = TRUE; break; case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT: case GI_TYPE_TAG_UINT: G_STRUCT_MEMBER(guint32, mem, offset) = value->v_uint32; result = TRUE; break; case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: G_STRUCT_MEMBER(guint64, mem, offset) = value->v_uint64; result = TRUE; break; case GI_TYPE_TAG_LONG: case GI_TYPE_TAG_ULONG: G_STRUCT_MEMBER(gulong, mem, offset)= value->v_ulong; result = TRUE; break; case GI_TYPE_TAG_SSIZE: case GI_TYPE_TAG_SIZE: case GI_TYPE_TAG_GTYPE: G_STRUCT_MEMBER(gsize, mem, offset) = value->v_size; result = TRUE; break; case GI_TYPE_TAG_FLOAT: G_STRUCT_MEMBER(gfloat, mem, offset) = value->v_float; result = TRUE; break; case GI_TYPE_TAG_DOUBLE: G_STRUCT_MEMBER(gdouble, mem, offset)= value->v_double; result = TRUE; break; case GI_TYPE_TAG_TIME_T: #if SIZEOF_TIME_T == 4 G_STRUCT_MEMBER(time_t, mem, offset) = value->v_int32; #elif SIZEOF_TIME_T == 8 G_STRUCT_MEMBER(time_t, mem, offset) = value->v_int64; #else # error "Unexpected size for time_t: not 4 or 8" #endif result = TRUE; break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: g_warning("Field %s: type %s should have is_pointer set", g_base_info_get_name ((GIBaseInfo *)field_info), g_type_tag_to_string (g_type_info_get_tag (type_info))); break; case GI_TYPE_TAG_ERROR: /* Needs to be handled by the language binding directly */ break; case GI_TYPE_TAG_INTERFACE: { GIBaseInfo *interface = g_type_info_get_interface (type_info); switch (g_base_info_get_type (interface)) { case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_BOXED: /* Needs to be handled by the language binding directly */ break; case GI_INFO_TYPE_OBJECT: break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: { /* See FIXME above */ GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); switch (storage_type) { case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: G_STRUCT_MEMBER(guint8, mem, offset) = (guint8)value->v_int; result = TRUE; break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_SHORT: case GI_TYPE_TAG_USHORT: G_STRUCT_MEMBER(guint16, mem, offset) = (guint16)value->v_int; result = TRUE; break; case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT: case GI_TYPE_TAG_UINT: G_STRUCT_MEMBER(guint32, mem, offset) = (guint32)value->v_int; result = TRUE; break; case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: G_STRUCT_MEMBER(guint64, mem, offset) = (guint64)value->v_int; result = TRUE; break; case GI_TYPE_TAG_LONG: case GI_TYPE_TAG_ULONG: G_STRUCT_MEMBER(gulong, mem, offset) = (gulong)value->v_int; result = TRUE; break; default: g_warning("Field %s: Unexpected enum storage type %s", g_base_info_get_name ((GIBaseInfo *)field_info), g_type_tag_to_string (storage_type)); break; } break; } break; case GI_INFO_TYPE_VFUNC: case GI_INFO_TYPE_CALLBACK: g_warning("Field%s: Interface type %d should have is_pointer set", g_base_info_get_name ((GIBaseInfo *)field_info), g_base_info_get_type (interface)); break; case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CONSTANT: case GI_INFO_TYPE_ERROR_DOMAIN: case GI_INFO_TYPE_VALUE: case GI_INFO_TYPE_SIGNAL: case GI_INFO_TYPE_PROPERTY: case GI_INFO_TYPE_FIELD: case GI_INFO_TYPE_ARG: case GI_INFO_TYPE_TYPE: case GI_INFO_TYPE_UNRESOLVED: g_warning("Field %s: Interface type %d not expected", g_base_info_get_name ((GIBaseInfo *)field_info), g_base_info_get_type (interface)); break; } g_base_info_unref ((GIBaseInfo *)interface); break; } break; } } g_base_info_unref ((GIBaseInfo *)type_info); return result; }
/** * g_field_info_get_field: * @field_info: a #GIFieldInfo * @mem: pointer to a block of memory representing a C structure or union * @value: a #GArgument into which to store the value retrieved * * Reads a field identified by a #GFieldInfo from a C structure or * union. This only handles fields of simple C types. It will fail * for a field of a composite type like a nested structure or union * even if that is actually readable. * * Returns: %TRUE if reading the field succeeded, otherwise %FALSE */ gboolean g_field_info_get_field (GIFieldInfo *field_info, gpointer mem, GArgument *value) { int offset; GITypeInfo *type_info; gboolean result = FALSE; if ((g_field_info_get_flags (field_info) & GI_FIELD_IS_READABLE) == 0) return FALSE; offset = g_field_info_get_offset (field_info); type_info = g_field_info_get_type (field_info); if (g_type_info_is_pointer (type_info)) { value->v_pointer = G_STRUCT_MEMBER(gpointer, mem, offset); result = TRUE; } else { switch (g_type_info_get_tag (type_info)) { case GI_TYPE_TAG_VOID: g_warning("Field %s: should not be have void type", g_base_info_get_name ((GIBaseInfo *)field_info)); break; case GI_TYPE_TAG_BOOLEAN: value->v_boolean = G_STRUCT_MEMBER(gboolean, mem, offset) != FALSE; result = TRUE; break; case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: value->v_uint8 = G_STRUCT_MEMBER(guint8, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_SHORT: case GI_TYPE_TAG_USHORT: value->v_uint16 = G_STRUCT_MEMBER(guint16, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT: case GI_TYPE_TAG_UINT: value->v_uint32 = G_STRUCT_MEMBER(guint32, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: value->v_uint64 = G_STRUCT_MEMBER(guint64, mem, offset); result = TRUE; break; case GI_TYPE_TAG_LONG: case GI_TYPE_TAG_ULONG: value->v_ulong = G_STRUCT_MEMBER(gulong, mem, offset); result = TRUE; break; case GI_TYPE_TAG_SSIZE: case GI_TYPE_TAG_SIZE: case GI_TYPE_TAG_GTYPE: value->v_size = G_STRUCT_MEMBER(gsize, mem, offset); result = TRUE; break; case GI_TYPE_TAG_FLOAT: value->v_float = G_STRUCT_MEMBER(gfloat, mem, offset); result = TRUE; break; case GI_TYPE_TAG_DOUBLE: value->v_double = G_STRUCT_MEMBER(gdouble, mem, offset); result = TRUE; break; case GI_TYPE_TAG_TIME_T: #if SIZEOF_TIME_T == 4 value->v_int32 = G_STRUCT_MEMBER(time_t, mem, offset); #elif SIZEOF_TIME_T == 8 value->v_int64 = G_STRUCT_MEMBER(time_t, mem, offset); #else # error "Unexpected size for time_t: not 4 or 8" #endif result = TRUE; break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: g_warning("Field %s: type %s should have is_pointer set", g_base_info_get_name ((GIBaseInfo *)field_info), g_type_tag_to_string (g_type_info_get_tag (type_info))); break; case GI_TYPE_TAG_ERROR: /* Needs to be handled by the language binding directly */ break; case GI_TYPE_TAG_INTERFACE: { GIBaseInfo *interface = g_type_info_get_interface (type_info); switch (g_base_info_get_type (interface)) { case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_UNION: case GI_INFO_TYPE_BOXED: /* Needs to be handled by the language binding directly */ break; case GI_INFO_TYPE_OBJECT: break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: { /* FIXME: there's a mismatch here between the value->v_int we use * here and the glong result returned from g_value_info_get_value(). * But to switch this to glong, we'd have to make g_function_info_invoke() * translate value->v_long to the proper ABI for an enum function * call parameter, which will usually be int, and then fix up language * bindings. */ GITypeTag storage_type = g_enum_info_get_storage_type ((GIEnumInfo *)interface); switch (storage_type) { case GI_TYPE_TAG_INT8: case GI_TYPE_TAG_UINT8: value->v_int = (gint)G_STRUCT_MEMBER(guint8, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_SHORT: case GI_TYPE_TAG_USHORT: value->v_int = (gint)G_STRUCT_MEMBER(guint16, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT32: case GI_TYPE_TAG_UINT32: case GI_TYPE_TAG_INT: case GI_TYPE_TAG_UINT: value->v_int = (gint)G_STRUCT_MEMBER(guint32, mem, offset); result = TRUE; break; case GI_TYPE_TAG_INT64: case GI_TYPE_TAG_UINT64: value->v_int = (gint)G_STRUCT_MEMBER(guint64, mem, offset); result = TRUE; break; case GI_TYPE_TAG_LONG: case GI_TYPE_TAG_ULONG: value->v_int = (gint)G_STRUCT_MEMBER(gulong, mem, offset); result = TRUE; break; default: g_warning("Field %s: Unexpected enum storage type %s", g_base_info_get_name ((GIBaseInfo *)field_info), g_type_tag_to_string (storage_type)); break; } break; } case GI_INFO_TYPE_VFUNC: case GI_INFO_TYPE_CALLBACK: g_warning("Field %s: Interface type %d should have is_pointer set", g_base_info_get_name ((GIBaseInfo *)field_info), g_base_info_get_type (interface)); break; case GI_INFO_TYPE_INVALID: case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_FUNCTION: case GI_INFO_TYPE_CONSTANT: case GI_INFO_TYPE_ERROR_DOMAIN: case GI_INFO_TYPE_VALUE: case GI_INFO_TYPE_SIGNAL: case GI_INFO_TYPE_PROPERTY: case GI_INFO_TYPE_FIELD: case GI_INFO_TYPE_ARG: case GI_INFO_TYPE_TYPE: case GI_INFO_TYPE_UNRESOLVED: g_warning("Field %s: Interface type %d not expected", g_base_info_get_name ((GIBaseInfo *)field_info), g_base_info_get_type (interface)); break; } g_base_info_unref ((GIBaseInfo *)interface); break; } break; } } g_base_info_unref ((GIBaseInfo *)type_info); return result; }
static gboolean ibus_panel_service_ibus_message (IBusPanelService *panel, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_PANEL_SERVICE (panel)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); const static struct { const gchar *name; const gint offset; } no_arg_methods [] = { { "CursorUpLookupTable" , G_STRUCT_OFFSET (IBusPanelServiceClass, cursor_down_lookup_table) }, { "CursorDownLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, cursor_up_lookup_table) }, { "Destroy", G_STRUCT_OFFSET (IBusPanelServiceClass, destroy) }, { "HideAuxiliaryText", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_auxiliary_text) }, { "HideLanguageBar", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_language_bar) }, { "HideLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_lookup_table) }, { "HidePreeditText", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_preedit_text) }, { "PageDownLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, page_down_lookup_table) }, { "PageUpLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, page_up_lookup_table) }, { "Reset", G_STRUCT_OFFSET (IBusPanelServiceClass, reset) }, { "ShowAuxiliaryText", G_STRUCT_OFFSET (IBusPanelServiceClass, show_auxiliary_text) }, { "ShowLanguageBar", G_STRUCT_OFFSET (IBusPanelServiceClass, show_language_bar) }, { "ShowLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, show_lookup_table) }, { "ShowPreeditText", G_STRUCT_OFFSET (IBusPanelServiceClass, show_preedit_text) }, { "StartSetup", G_STRUCT_OFFSET (IBusPanelServiceClass, start_setup) }, { "StateChanged", G_STRUCT_OFFSET (IBusPanelServiceClass, state_changed) }, }; IBusMessage *reply = NULL; gint i; for (i = 0; i < G_N_ELEMENTS (no_arg_methods); i++) { if (!ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, no_arg_methods[i].name)) continue; IBusMessageIter iter; ibus_message_iter_init (message, &iter); if (ibus_message_iter_has_next (&iter)) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Method does not have arguments", IBUS_INTERFACE_PANEL, no_arg_methods[i].name); } else { IBusError *error = NULL; typedef gboolean (* NoArgFunc) (IBusPanelService *, IBusError **); NoArgFunc func; func = G_STRUCT_MEMBER (NoArgFunc, IBUS_PANEL_SERVICE_GET_CLASS (panel), no_arg_methods[i].offset); if (!func (panel, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; } if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "FocusIn")) { const gchar* input_context_path = NULL; IBusError *error = NULL; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_OBJECT_PATH, &input_context_path, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->focus_in (panel, input_context_path, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "FocusOut")) { const gchar* input_context_path = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_OBJECT_PATH, &input_context_path, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->focus_out (panel, input_context_path, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "RegisterProperties")) { IBusPropList *prop_list = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROP_LIST, &prop_list, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->register_properties (panel, prop_list, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (prop_list != NULL && g_object_is_floating (prop_list)) g_object_unref (prop_list); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateAuxiliaryText")) { IBusText *text = NULL; gboolean visible; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_auxiliary_text (panel, text, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (text != NULL && g_object_is_floating (text)) g_object_unref (text); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateLookupTable")) { IBusLookupTable *table = NULL; gboolean visible = FALSE; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_LOOKUP_TABLE, &table, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_lookup_table (panel, table, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (table != NULL && g_object_is_floating (table)) g_object_unref (table); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdatePreeditText")) { IBusText *text = NULL; guint cursor_pos; gboolean visible; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_UINT, &cursor_pos, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_preedit_text (panel, text, cursor_pos, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (text != NULL && g_object_is_floating (text)) g_object_unref (text); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateProperty")) { IBusProperty *property = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROPERTY, &property, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_property (panel, property, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (property != NULL && g_object_is_floating (property)) g_object_unref (property); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "SetCursorLocation")) { guint x, y, w, h; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, G_TYPE_INT, &x, G_TYPE_INT, &y, G_TYPE_INT, &w, G_TYPE_INT, &h, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->set_cursor_location (panel, x, y, w, h, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } if (reply) { ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; } return TRUE; }
static void gst_alloc_trace_print (const GstAllocTrace * trace) { GSList *mem_live; g_return_if_fail (trace != NULL); if (trace->flags & GST_ALLOC_TRACE_LIVE) { g_print ("%-22.22s : %d\n", trace->name, trace->live); } else { g_print ("%-22.22s : (no live count)\n", trace->name); } if (trace->flags & GST_ALLOC_TRACE_MEM_LIVE) { mem_live = trace->mem_live; while (mem_live) { gpointer data = mem_live->data; const gchar *type_name; gchar *extra = NULL; gint refcount = -1; if (trace->offset == -2) { if (G_IS_OBJECT (data)) { type_name = G_OBJECT_TYPE_NAME (data); refcount = G_OBJECT (data)->ref_count; } else type_name = "<invalid>"; } else if (trace->offset == -1) { type_name = "<unknown>"; } else { GType type; type = G_STRUCT_MEMBER (GType, data, trace->offset); type_name = g_type_name (type); if (type == GST_TYPE_CAPS) { extra = gst_caps_to_string (data); } else if (type == GST_TYPE_EVENT) { const GstStructure *s = gst_event_get_structure (data); if (s == NULL) extra = g_strdup_printf ("%s", GST_EVENT_TYPE_NAME (data)); else extra = gst_structure_to_string (s); } else if (type == GST_TYPE_MESSAGE) { const GstStructure *s = gst_message_get_structure (data); if (s == NULL) extra = g_strdup_printf ("%s", GST_MESSAGE_TYPE_NAME (data)); else extra = gst_structure_to_string (s); } else if (type == GST_TYPE_BUFFER) { guint size = gst_buffer_get_size (data); extra = g_strdup_printf ("%u bytes", size); } else if (type == GST_TYPE_MEMORY) { GstMemory *mem = (GstMemory *) data; extra = g_strdup_printf ("%u bytes, %s allocator", (guint) mem->size, mem->allocator ? mem->allocator->mem_type : "unknown"); } refcount = GST_MINI_OBJECT_REFCOUNT_VALUE (data); } if (extra) { g_print (" %-20.20s : (%d) %p (\"%s\")\n", type_name, refcount, data, extra); g_free (extra); } else g_print (" %-20.20s : (%d) %p\n", type_name, refcount, data); mem_live = mem_live->next; } } }