summaryrefslogtreecommitdiff
path: root/gusb/gusb-endpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gusb/gusb-endpoint.c')
-rw-r--r--gusb/gusb-endpoint.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/gusb/gusb-endpoint.c b/gusb/gusb-endpoint.c
index fcf86cf..338fb57 100644
--- a/gusb/gusb-endpoint.c
+++ b/gusb/gusb-endpoint.c
@@ -53,6 +53,101 @@ g_usb_endpoint_init(GUsbEndpoint *self)
{
}
+gboolean
+_g_usb_endpoint_load(GUsbEndpoint *self, JsonObject *json_object, GError **error)
+{
+ const gchar *str;
+
+ g_return_val_if_fail(G_USB_IS_ENDPOINT(self), FALSE);
+ g_return_val_if_fail(json_object != NULL, FALSE);
+ g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
+
+#if JSON_CHECK_VERSION(1, 6, 0)
+ /* optional properties */
+ self->endpoint_descriptor.bDescriptorType =
+ json_object_get_int_member_with_default(json_object, "DescriptorType", 0x0);
+ self->endpoint_descriptor.bEndpointAddress =
+ json_object_get_int_member_with_default(json_object, "EndpointAddress", 0x0);
+ self->endpoint_descriptor.bRefresh =
+ json_object_get_int_member_with_default(json_object, "Refresh", 0x0);
+ self->endpoint_descriptor.bInterval =
+ json_object_get_int_member_with_default(json_object, "Interval", 0x0);
+ self->endpoint_descriptor.bSynchAddress =
+ json_object_get_int_member_with_default(json_object, "SynchAddress", 0x0);
+ self->endpoint_descriptor.wMaxPacketSize =
+ json_object_get_int_member_with_default(json_object, "MaxPacketSize", 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_endpoint_save(GUsbEndpoint *self, JsonBuilder *json_builder, GError **error)
+{
+ g_return_val_if_fail(G_USB_IS_ENDPOINT(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->endpoint_descriptor.bDescriptorType != 0) {
+ json_builder_set_member_name(json_builder, "DescriptorType");
+ json_builder_add_int_value(json_builder, self->endpoint_descriptor.bDescriptorType);
+ }
+ if (self->endpoint_descriptor.bEndpointAddress != 0) {
+ json_builder_set_member_name(json_builder, "EndpointAddress");
+ json_builder_add_int_value(json_builder,
+ self->endpoint_descriptor.bEndpointAddress);
+ }
+ if (self->endpoint_descriptor.bRefresh != 0) {
+ json_builder_set_member_name(json_builder, "Refresh");
+ json_builder_add_int_value(json_builder, self->endpoint_descriptor.bRefresh);
+ }
+ if (self->endpoint_descriptor.bInterval != 0) {
+ json_builder_set_member_name(json_builder, "Interval");
+ json_builder_add_int_value(json_builder, self->endpoint_descriptor.bInterval);
+ }
+ if (self->endpoint_descriptor.bSynchAddress != 0) {
+ json_builder_set_member_name(json_builder, "SynchAddress");
+ json_builder_add_int_value(json_builder, self->endpoint_descriptor.bSynchAddress);
+ }
+ if (self->endpoint_descriptor.wMaxPacketSize != 0) {
+ json_builder_set_member_name(json_builder, "MaxPacketSize");
+ json_builder_add_int_value(json_builder, self->endpoint_descriptor.wMaxPacketSize);
+ }
+
+ /* 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_endpoint_new:
*