diff options
author | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2022-05-03 07:57:47 +0900 |
---|---|---|
committer | 坂本 貴史 <o-takashi@sakamocchi.jp> | 2022-05-03 08:31:29 +0900 |
commit | 6b925f5d131a46cadb416d7cf22ee5b2c5f25d24 (patch) | |
tree | c2c14368493fdc2a25c6285de84e8edeef32b877 | |
parent | 79a1092c5132d33e1eddb21617eb123e86e4f5a1 (diff) | |
download | libhinoko-6b925f5d131a46cadb416d7cf22ee5b2c5f25d24.tar.gz |
fw_iso_resource: add class virtual function and implementation for future use
It's planned to make Hinoko.FwIsoResource as interface, therefore some
virtual functions are provided.
This commit adds and implements them as virtual functions of class. They
are not called yet.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-rw-r--r-- | src/fw_iso_resource.c | 26 | ||||
-rw-r--r-- | src/fw_iso_resource.h | 5 | ||||
-rw-r--r-- | src/fw_iso_resource_auto.c | 39 | ||||
-rw-r--r-- | src/fw_iso_resource_once.c | 38 |
4 files changed, 107 insertions, 1 deletions
diff --git a/src/fw_iso_resource.c b/src/fw_iso_resource.c index 2a0d441..cc7ef2c 100644 --- a/src/fw_iso_resource.c +++ b/src/fw_iso_resource.c @@ -77,18 +77,44 @@ static void fw_iso_resource_finalize(GObject *obj) G_OBJECT_CLASS(hinoko_fw_iso_resource_parent_class)->finalize(obj); } +static gboolean fw_iso_resource_open_real(HinokoFwIsoResource *self, const gchar *path, + gint open_flag, GError **error) +{ + HinokoFwIsoResourcePrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE(self), FALSE); + priv = hinoko_fw_iso_resource_get_instance_private(self); + + return fw_iso_resource_open(&priv->fd, path, open_flag, error); +} + static void fw_iso_resource_handle_event(HinokoFwIsoResource *inst, const char *signal_name, guint channel, guint bandwidth, const GError *error) { g_signal_emit_by_name(inst, signal_name, channel, bandwidth, error); } +static gboolean fw_iso_resource_create_source_real(HinokoFwIsoResource *self, GSource **source, + GError **error) +{ + HinokoFwIsoResourcePrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE(self), FALSE); + priv = hinoko_fw_iso_resource_get_instance_private(self); + + return fw_iso_resource_create_source(priv->fd, self, fw_iso_resource_handle_event, source, + error); +} + static void hinoko_fw_iso_resource_class_init(HinokoFwIsoResourceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->finalize = fw_iso_resource_finalize; + klass->open = fw_iso_resource_open_real; + klass->create_source = fw_iso_resource_create_source_real; + /** * HinokoFwIsoResource::allocated: * @self: A [class@FwIsoResource]. diff --git a/src/fw_iso_resource.h b/src/fw_iso_resource.h index 1690915..532e78e 100644 --- a/src/fw_iso_resource.h +++ b/src/fw_iso_resource.h @@ -18,6 +18,11 @@ GQuark hinoko_fw_iso_resource_error_quark(); struct _HinokoFwIsoResourceClass { GObjectClass parent_class; + gboolean (*open)(HinokoFwIsoResource *self, const gchar *path, gint open_flag, + GError **error); + + gboolean (*create_source)(HinokoFwIsoResource *self, GSource **source, GError **error); + /** * HinokoFwIsoResourceClass::allocated: * @self: A [class@FwIsoResource]. diff --git a/src/fw_iso_resource_auto.c b/src/fw_iso_resource_auto.c index e3a0180..ef459ee 100644 --- a/src/fw_iso_resource_auto.c +++ b/src/fw_iso_resource_auto.c @@ -10,6 +10,8 @@ * updates. The maintenance of allocated isochronous resource is done by Linux FireWire subsystem. */ typedef struct { + int fd; + gboolean is_allocated; guint channel; guint bandwidth; @@ -76,12 +78,22 @@ static void fw_iso_resource_auto_get_property(GObject *obj, guint id, g_mutex_unlock(&priv->mutex); } +static gboolean fw_iso_resource_auto_open(HinokoFwIsoResource *inst, const gchar *path, + gint open_flag, GError **error); + +static gboolean fw_iso_resource_auto_create_source(HinokoFwIsoResource *inst, GSource **source, + GError **error); + static void hinoko_fw_iso_resource_auto_class_init(HinokoFwIsoResourceAutoClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + HinokoFwIsoResourceClass *parent_class = HINOKO_FW_ISO_RESOURCE_CLASS(klass); gobject_class->get_property = fw_iso_resource_auto_get_property; + parent_class->open = fw_iso_resource_auto_open; + parent_class->create_source = fw_iso_resource_auto_create_source; + fw_iso_resource_auto_props[FW_ISO_RESOURCE_AUTO_PROP_IS_ALLOCATED] = g_param_spec_boolean("is-allocated", "is-allocated", "Whether to allocated or not.", @@ -112,6 +124,19 @@ static void hinoko_fw_iso_resource_auto_init(HinokoFwIsoResourceAuto *self) g_mutex_init(&priv->mutex); } +static gboolean fw_iso_resource_auto_open(HinokoFwIsoResource *inst, const gchar *path, + gint open_flag, GError **error) +{ + HinokoFwIsoResourceAuto *self; + HinokoFwIsoResourceAutoPrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE_AUTO(inst), FALSE); + self = HINOKO_FW_ISO_RESOURCE_AUTO(inst); + priv = hinoko_fw_iso_resource_auto_get_instance_private(self); + + return fw_iso_resource_open(&priv->fd, path, open_flag, error); +} + void fw_iso_resource_auto_handle_event(HinokoFwIsoResource *inst, const char *signal_name, guint channel, guint bandwidth, const GError *error) { @@ -143,6 +168,20 @@ void fw_iso_resource_auto_handle_event(HinokoFwIsoResource *inst, const char *si g_signal_emit_by_name(self, signal_name, channel, bandwidth, error); } +static gboolean fw_iso_resource_auto_create_source(HinokoFwIsoResource *inst, GSource **source, + GError **error) +{ + HinokoFwIsoResourceAuto *self; + HinokoFwIsoResourceAutoPrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE_AUTO(inst), FALSE); + self = HINOKO_FW_ISO_RESOURCE_AUTO(inst); + priv = hinoko_fw_iso_resource_auto_get_instance_private(self); + + return fw_iso_resource_create_source(priv->fd, inst, fw_iso_resource_auto_handle_event, + source, error); +} + /** * hinoko_fw_iso_resource_auto_new: * diff --git a/src/fw_iso_resource_once.c b/src/fw_iso_resource_once.c index 2b19ace..065e0b4 100644 --- a/src/fw_iso_resource_once.c +++ b/src/fw_iso_resource_once.c @@ -17,9 +17,18 @@ typedef struct { G_DEFINE_TYPE_WITH_CODE(HinokoFwIsoResourceOnce, hinoko_fw_iso_resource_once, HINOKO_TYPE_FW_ISO_RESOURCE, G_ADD_PRIVATE(HinokoFwIsoResourceOnce)) +static gboolean fw_iso_resource_once_open(HinokoFwIsoResource *inst, const gchar *path, + gint open_flag, GError **error); + +static gboolean fw_iso_resource_once_create_source(HinokoFwIsoResource *inst, GSource **source, + GError **error); + static void hinoko_fw_iso_resource_once_class_init(HinokoFwIsoResourceOnceClass *klass) { - return; + HinokoFwIsoResourceClass *parent_class = HINOKO_FW_ISO_RESOURCE_CLASS(klass); + + parent_class->open = fw_iso_resource_once_open; + parent_class->create_source = fw_iso_resource_once_create_source; } static void hinoko_fw_iso_resource_once_init(HinokoFwIsoResourceOnce *self) @@ -27,12 +36,39 @@ static void hinoko_fw_iso_resource_once_init(HinokoFwIsoResourceOnce *self) return; } +static gboolean fw_iso_resource_once_open(HinokoFwIsoResource *inst, const gchar *path, + gint open_flag, GError **error) +{ + HinokoFwIsoResourceOnce *self; + HinokoFwIsoResourceOncePrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE_ONCE(inst), FALSE); + self = HINOKO_FW_ISO_RESOURCE_ONCE(inst); + priv = hinoko_fw_iso_resource_once_get_instance_private(self); + + return fw_iso_resource_open(&priv->fd, path, open_flag, error); +} + void fw_iso_resource_once_handle_event(HinokoFwIsoResource *inst, const char *signal_name, guint channel, guint bandwidth, const GError *error) { g_signal_emit_by_name(inst, signal_name, channel, bandwidth, error); } +static gboolean fw_iso_resource_once_create_source(HinokoFwIsoResource *inst, GSource **source, + GError **error) +{ + HinokoFwIsoResourceOnce *self; + HinokoFwIsoResourceOncePrivate *priv; + + g_return_val_if_fail(HINOKO_IS_FW_ISO_RESOURCE_ONCE(inst), FALSE); + self = HINOKO_FW_ISO_RESOURCE_ONCE(inst); + priv = hinoko_fw_iso_resource_once_get_instance_private(self); + + return fw_iso_resource_create_source(priv->fd, inst, fw_iso_resource_once_handle_event, + source, error); +} + /** * hinoko_fw_iso_resource_once_new: * |