summaryrefslogtreecommitdiff
path: root/gusb/gusb-bos-descriptor.c
diff options
context:
space:
mode:
Diffstat (limited to 'gusb/gusb-bos-descriptor.c')
-rw-r--r--gusb/gusb-bos-descriptor.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/gusb/gusb-bos-descriptor.c b/gusb/gusb-bos-descriptor.c
index 48265dd..2e4134b 100644
--- a/gusb/gusb-bos-descriptor.c
+++ b/gusb/gusb-bos-descriptor.c
@@ -53,6 +53,70 @@ g_usb_bos_descriptor_init(GUsbBosDescriptor *self)
{
}
+gboolean
+_g_usb_bos_descriptor_load(GUsbBosDescriptor *self, JsonObject *json_object, GError **error)
+{
+ const gchar *str;
+
+ g_return_val_if_fail(G_USB_IS_BOS_DESCRIPTOR(self), FALSE);
+ g_return_val_if_fail(json_object != NULL, FALSE);
+ g_return_val_if_fail(error == NULL || *error == NULL, -1);
+
+#if JSON_CHECK_VERSION(1, 6, 0)
+ /* optional properties */
+ self->bos_cap.bDevCapabilityType =
+ json_object_get_int_member_with_default(json_object, "DevCapabilityType", 0x0);
+
+ /* extra data */
+ str = json_object_get_string_member_with_default(json_object, "ExtraData", NULL);
+ if (str != NULL) {
+ gsize bufsz = 0;
+ g_autofree guchar *buf = g_base64_decode(str, &bufsz);
+ if (self->extra != NULL)
+ g_bytes_unref(self->extra);
+ self->extra = g_bytes_new_take(g_steal_pointer(&buf), bufsz);
+ }
+#else
+ g_set_error_literal(error,
+ G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ "json-glib version too old");
+ return FALSE;
+#endif
+
+ /* success */
+ return TRUE;
+}
+
+gboolean
+_g_usb_bos_descriptor_save(GUsbBosDescriptor *self, JsonBuilder *json_builder, GError **error)
+{
+ g_return_val_if_fail(G_USB_IS_BOS_DESCRIPTOR(self), FALSE);
+ g_return_val_if_fail(json_builder != NULL, FALSE);
+ g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
+
+ /* start */
+ json_builder_begin_object(json_builder);
+
+ /* optional properties */
+ if (self->bos_cap.bDevCapabilityType != 0) {
+ json_builder_set_member_name(json_builder, "DevCapabilityType");
+ json_builder_add_int_value(json_builder, self->bos_cap.bDevCapabilityType);
+ }
+
+ /* extra data */
+ if (self->extra != NULL && g_bytes_get_size(self->extra) > 0) {
+ g_autofree gchar *str = g_base64_encode(g_bytes_get_data(self->extra, NULL),
+ g_bytes_get_size(self->extra));
+ json_builder_set_member_name(json_builder, "ExtraData");
+ json_builder_add_string_value(json_builder, str);
+ }
+
+ /* success */
+ json_builder_end_object(json_builder);
+ return TRUE;
+}
+
/**
* _g_usb_bos_descriptor_new:
*