bool MsgHandler::field_value(uint8_t *msg, const char *label, char *ret, uint8_t retlen) { struct format_field_info *info = find_field_info(label); if (info == NULL) { ::printf("No info for (%s)\n",label); exit(1); } uint8_t offset = info->offset; if (offset == 0) { return false; } memset(ret, '\0', retlen); memcpy(ret, &msg[offset], (retlen < info->length) ? retlen : info->length); return true; }
/* a hook on getting a property; set value_p to override property's value. * Return value is JS_FALSE on OOM/exception. */ static JSBool param_get_prop(JSContext *context, JSObject *obj, jsid id, jsval *value_p) { JSBool success; Param *priv; GParamSpec *pspec; char *name; GType gtype; GIObjectInfo *info = NULL, *parent_info = NULL; GIFieldInfo *field_info = NULL; GITypeInfo *type_info = NULL; GIArgument arg; if (!gjs_get_string_id(context, id, &name)) return JS_TRUE; /* not something we affect, but no error */ priv = priv_from_js(context, obj); if (priv == NULL) { g_free(name); return JS_FALSE; /* wrong class */ } success = JS_FALSE; pspec = priv->gparam; gtype = G_TYPE_FROM_INSTANCE(pspec); info = (GIObjectInfo*)g_irepository_find_by_gtype(g_irepository_get_default(), gtype); if (info == NULL) { /* We may have a non-introspectable GParamSpec subclass here. Just return VOID. */ *value_p = JSVAL_VOID; success = JS_TRUE; goto out; } parent_info = g_object_info_get_parent(info); field_info = find_field_info(info, name); if (field_info == NULL) { /* Try it on the parent GParamSpec for generic GParamSpec properties. */ field_info = find_field_info(parent_info, name); } if (field_info == NULL) { *value_p = JSVAL_VOID; success = JS_TRUE; goto out; } type_info = g_field_info_get_type(field_info); if (!g_field_info_get_field(field_info, priv->gparam, &arg)) { gjs_throw(context, "Reading field %s.%s is not supported", g_base_info_get_name(info), g_base_info_get_name((GIBaseInfo*)field_info)); goto out; } if (!gjs_value_from_g_argument(context, value_p, type_info, &arg, TRUE)) goto out; success = JS_TRUE; out: if (field_info != NULL) g_base_info_unref((GIBaseInfo*)field_info); if (type_info != NULL) g_base_info_unref((GIBaseInfo*)type_info); if (info != NULL) g_base_info_unref((GIBaseInfo*)info); if (parent_info != NULL) g_base_info_unref((GIBaseInfo*)parent_info); g_free(name); return success; }
void pkg_format_show(const struct pkg_format_node *head, struct pkginfo *pkg, struct pkgbin *pkgbin) { struct varbuf vb = VARBUF_INIT, fb = VARBUF_INIT, wb = VARBUF_INIT; while (head) { bool ok; char fmt[16]; ok = false; if (head->width > 0) snprintf(fmt, 16, "%%%s%zus", ((head->pad) ? "-" : ""), head->width); else strcpy(fmt, "%s"); if (head->type == PKG_FORMAT_STRING) { varbuf_printf(&fb, fmt, head->data); ok = true; } else if (head->type == PKG_FORMAT_FIELD) { const struct fieldinfo *fip; fip = find_field_info(fieldinfos, head); if (fip->name == NULL) fip = find_field_info(virtinfos, head); if (fip->name) { fip->wcall(&wb, pkg, pkgbin, 0, fip); varbuf_end_str(&wb); varbuf_printf(&fb, fmt, wb.buf); varbuf_reset(&wb); ok = true; } else { const struct arbitraryfield *afp; for (afp = pkgbin->arbs; afp; afp = afp->next) if (strcasecmp(head->data, afp->name) == 0) { varbuf_printf(&fb, fmt, afp->value); ok = true; break; } } } if (ok) { size_t len = strlen(fb.buf); if ((head->width > 0) && (len > head->width)) len = head->width; varbuf_add_buf(&vb, fb.buf, len); } varbuf_reset(&fb); head = head->next; } if (vb.buf) { varbuf_end_str(&vb); fputs(vb.buf, stdout); } varbuf_destroy(&wb); varbuf_destroy(&fb); varbuf_destroy(&vb); }