aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2022-05-03 07:57:47 +0900
committer坂本 貴史 <o-takashi@sakamocchi.jp>2022-05-03 08:31:29 +0900
commit6b925f5d131a46cadb416d7cf22ee5b2c5f25d24 (patch)
treec2c14368493fdc2a25c6285de84e8edeef32b877
parent79a1092c5132d33e1eddb21617eb123e86e4f5a1 (diff)
downloadlibhinoko-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.c26
-rw-r--r--src/fw_iso_resource.h5
-rw-r--r--src/fw_iso_resource_auto.c39
-rw-r--r--src/fw_iso_resource_once.c38
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:
*