You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/03/17 01:09:52 UTC

[5/9] arrow git commit: ARROW-631: [GLib] Import

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable-file.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable-file.cpp b/c_glib/arrow-glib/io-writeable-file.cpp
new file mode 100644
index 0000000..3de42dd
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable-file.cpp
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/api.h>
+
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/io-writeable-file.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: io-writeable-file
+ * @title: GArrowIOWriteableFile
+ * @short_description: File output interface
+ *
+ * #GArrowIOWriteableFile is an interface for file output.
+ */
+
+G_DEFINE_INTERFACE(GArrowIOWriteableFile,
+                   garrow_io_writeable_file,
+                   G_TYPE_OBJECT)
+
+static void
+garrow_io_writeable_file_default_init (GArrowIOWriteableFileInterface *iface)
+{
+}
+
+/**
+ * garrow_io_writeable_file_write_at:
+ * @writeable_file: A #GArrowIOWriteableFile.
+ * @position: The write start position.
+ * @data: (array length=n_bytes): The data to be written.
+ * @n_bytes: The number of bytes to be written.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_io_writeable_file_write_at(GArrowIOWriteableFile *writeable_file,
+                                  gint64 position,
+                                  const guint8 *data,
+                                  gint64 n_bytes,
+                                  GError **error)
+{
+  const auto arrow_writeable_file =
+    garrow_io_writeable_file_get_raw(writeable_file);
+
+  auto status = arrow_writeable_file->WriteAt(position, data, n_bytes);
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[io][writeable-file][write-at]");
+    return FALSE;
+  }
+}
+
+G_END_DECLS
+
+std::shared_ptr<arrow::io::WriteableFileInterface>
+garrow_io_writeable_file_get_raw(GArrowIOWriteableFile *writeable_file)
+{
+  auto *iface = GARROW_IO_WRITEABLE_FILE_GET_IFACE(writeable_file);
+  return iface->get_raw(writeable_file);
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable-file.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable-file.h b/c_glib/arrow-glib/io-writeable-file.h
new file mode 100644
index 0000000..4a4dee5
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable-file.h
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IO_TYPE_WRITEABLE_FILE           \
+  (garrow_io_writeable_file_get_type())
+#define GARROW_IO_WRITEABLE_FILE(obj)                           \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IO_TYPE_WRITEABLE_FILE,    \
+                              GArrowIOWriteableFileInterface))
+#define GARROW_IO_IS_WRITEABLE_FILE(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IO_TYPE_WRITEABLE_FILE))
+#define GARROW_IO_WRITEABLE_FILE_GET_IFACE(obj)                         \
+  (G_TYPE_INSTANCE_GET_INTERFACE((obj),                                 \
+                                 GARROW_IO_TYPE_WRITEABLE_FILE,         \
+                                 GArrowIOWriteableFileInterface))
+
+typedef struct _GArrowIOWriteableFile          GArrowIOWriteableFile;
+typedef struct _GArrowIOWriteableFileInterface GArrowIOWriteableFileInterface;
+
+GType garrow_io_writeable_file_get_type(void) G_GNUC_CONST;
+
+gboolean garrow_io_writeable_file_write_at(GArrowIOWriteableFile *writeable_file,
+                                           gint64 position,
+                                           const guint8 *data,
+                                           gint64 n_bytes,
+                                           GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable-file.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable-file.hpp b/c_glib/arrow-glib/io-writeable-file.hpp
new file mode 100644
index 0000000..2043007
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable-file.hpp
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/io/interfaces.h>
+
+#include <arrow-glib/io-writeable-file.h>
+
+/**
+ * GArrowIOWriteableFileInterface:
+ *
+ * It wraps `arrow::io::WriteableFileInterface`.
+ */
+struct _GArrowIOWriteableFileInterface
+{
+  GTypeInterface parent_iface;
+
+  std::shared_ptr<arrow::io::WriteableFileInterface> (*get_raw)(GArrowIOWriteableFile *file);
+};
+
+std::shared_ptr<arrow::io::WriteableFileInterface> garrow_io_writeable_file_get_raw(GArrowIOWriteableFile *writeable_file);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable.cpp b/c_glib/arrow-glib/io-writeable.cpp
new file mode 100644
index 0000000..9ea69e3
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable.cpp
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/api.h>
+
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/io-writeable.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: io-writeable
+ * @title: GArrowIOWriteable
+ * @short_description: Output interface
+ *
+ * #GArrowIOWriteable is an interface for output. Output must be
+ * writeable.
+ */
+
+G_DEFINE_INTERFACE(GArrowIOWriteable,
+                   garrow_io_writeable,
+                   G_TYPE_OBJECT)
+
+static void
+garrow_io_writeable_default_init (GArrowIOWriteableInterface *iface)
+{
+}
+
+/**
+ * garrow_io_writeable_write:
+ * @writeable: A #GArrowIOWriteable.
+ * @data: (array length=n_bytes): The data to be written.
+ * @n_bytes: The number of bytes to be written.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_io_writeable_write(GArrowIOWriteable *writeable,
+                          const guint8 *data,
+                          gint64 n_bytes,
+                          GError **error)
+{
+  const auto arrow_writeable = garrow_io_writeable_get_raw(writeable);
+
+  auto status = arrow_writeable->Write(data, n_bytes);
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[io][writeable][write]");
+    return FALSE;
+  }
+}
+
+/**
+ * garrow_io_writeable_flush:
+ * @writeable: A #GArrowIOWriteable.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * It ensures writing all data on memory to storage.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_io_writeable_flush(GArrowIOWriteable *writeable,
+                          GError **error)
+{
+  const auto arrow_writeable = garrow_io_writeable_get_raw(writeable);
+
+  auto status = arrow_writeable->Flush();
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[io][writeable][flush]");
+    return FALSE;
+  }
+}
+
+G_END_DECLS
+
+std::shared_ptr<arrow::io::Writeable>
+garrow_io_writeable_get_raw(GArrowIOWriteable *writeable)
+{
+  auto *iface = GARROW_IO_WRITEABLE_GET_IFACE(writeable);
+  return iface->get_raw(writeable);
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable.h b/c_glib/arrow-glib/io-writeable.h
new file mode 100644
index 0000000..f5c5e91
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable.h
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IO_TYPE_WRITEABLE                \
+  (garrow_io_writeable_get_type())
+#define GARROW_IO_WRITEABLE(obj)                                \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IO_TYPE_WRITEABLE,         \
+                              GArrowIOWriteableInterface))
+#define GARROW_IO_IS_WRITEABLE(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IO_TYPE_WRITEABLE))
+#define GARROW_IO_WRITEABLE_GET_IFACE(obj)                      \
+  (G_TYPE_INSTANCE_GET_INTERFACE((obj),                         \
+                                 GARROW_IO_TYPE_WRITEABLE,      \
+                                 GArrowIOWriteableInterface))
+
+typedef struct _GArrowIOWriteable          GArrowIOWriteable;
+typedef struct _GArrowIOWriteableInterface GArrowIOWriteableInterface;
+
+GType garrow_io_writeable_get_type(void) G_GNUC_CONST;
+
+gboolean garrow_io_writeable_write(GArrowIOWriteable *writeable,
+                                   const guint8 *data,
+                                   gint64 n_bytes,
+                                   GError **error);
+gboolean garrow_io_writeable_flush(GArrowIOWriteable *writeable,
+                                   GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/io-writeable.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/io-writeable.hpp b/c_glib/arrow-glib/io-writeable.hpp
new file mode 100644
index 0000000..f833924
--- /dev/null
+++ b/c_glib/arrow-glib/io-writeable.hpp
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/io/interfaces.h>
+
+#include <arrow-glib/io-writeable.h>
+
+/**
+ * GArrowIOWriteableInterface:
+ *
+ * It wraps `arrow::io::Writeable`.
+ */
+struct _GArrowIOWriteableInterface
+{
+  GTypeInterface parent_iface;
+
+  std::shared_ptr<arrow::io::Writeable> (*get_raw)(GArrowIOWriteable *file);
+};
+
+std::shared_ptr<arrow::io::Writeable> garrow_io_writeable_get_raw(GArrowIOWriteable *writeable);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-enums.c.template
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-enums.c.template b/c_glib/arrow-glib/ipc-enums.c.template
new file mode 100644
index 0000000..c938f77
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-enums.c.template
@@ -0,0 +1,56 @@
+/*** BEGIN file-header ***/
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/arrow-ipc-glib.h>
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+
+/* enumerations from "@filename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+GType
+@enum_name@_get_type(void)
+{
+  static GType etype = 0;
+  if (G_UNLIKELY(etype == 0)) {
+    static const G@Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+      {@VALUENAME@, "@VALUENAME@", "@valuenick@"},
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+      {0, NULL, NULL}
+    };
+    etype = g_@type@_register_static(g_intern_static_string("@EnumName@"), values);
+  }
+  return etype;
+}
+/*** END value-tail ***/
+
+/*** BEGIN file-tail ***/
+/*** END file-tail ***/

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-enums.h.template
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-enums.h.template b/c_glib/arrow-glib/ipc-enums.h.template
new file mode 100644
index 0000000..e103c5b
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-enums.h.template
@@ -0,0 +1,41 @@
+/*** BEGIN file-header ***/
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/ipc-metadata-version.h>
+
+G_BEGIN_DECLS
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+
+/* enumerations from "@filename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+GType @enum_name@_get_type(void) G_GNUC_CONST;
+#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type())
+/*** END value-header ***/
+
+/*** BEGIN file-tail ***/
+
+G_END_DECLS
+/*** END file-tail ***/

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-reader.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-reader.cpp b/c_glib/arrow-glib/ipc-file-reader.cpp
new file mode 100644
index 0000000..b9e408c
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-reader.cpp
@@ -0,0 +1,247 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/record-batch.hpp>
+#include <arrow-glib/schema.hpp>
+
+#include <arrow-glib/io-readable-file.hpp>
+
+#include <arrow-glib/ipc-file-reader.hpp>
+#include <arrow-glib/ipc-metadata-version.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: ipc-file-reader
+ * @short_description: File reader class
+ *
+ * #GArrowIPCFileReader is a class for receiving data by file based IPC.
+ */
+
+typedef struct GArrowIPCFileReaderPrivate_ {
+  std::shared_ptr<arrow::ipc::FileReader> file_reader;
+} GArrowIPCFileReaderPrivate;
+
+enum {
+  PROP_0,
+  PROP_FILE_READER
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowIPCFileReader,
+                           garrow_ipc_file_reader,
+                           G_TYPE_OBJECT);
+
+#define GARROW_IPC_FILE_READER_GET_PRIVATE(obj)                         \
+  (G_TYPE_INSTANCE_GET_PRIVATE((obj),                                   \
+                               GARROW_IPC_TYPE_FILE_READER,             \
+                               GArrowIPCFileReaderPrivate))
+
+static void
+garrow_ipc_file_reader_finalize(GObject *object)
+{
+  GArrowIPCFileReaderPrivate *priv;
+
+  priv = GARROW_IPC_FILE_READER_GET_PRIVATE(object);
+
+  priv->file_reader = nullptr;
+
+  G_OBJECT_CLASS(garrow_ipc_file_reader_parent_class)->finalize(object);
+}
+
+static void
+garrow_ipc_file_reader_set_property(GObject *object,
+                                    guint prop_id,
+                                    const GValue *value,
+                                    GParamSpec *pspec)
+{
+  GArrowIPCFileReaderPrivate *priv;
+
+  priv = GARROW_IPC_FILE_READER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_FILE_READER:
+    priv->file_reader =
+      *static_cast<std::shared_ptr<arrow::ipc::FileReader> *>(g_value_get_pointer(value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_file_reader_get_property(GObject *object,
+                                          guint prop_id,
+                                          GValue *value,
+                                          GParamSpec *pspec)
+{
+  switch (prop_id) {
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_file_reader_init(GArrowIPCFileReader *object)
+{
+}
+
+static void
+garrow_ipc_file_reader_class_init(GArrowIPCFileReaderClass *klass)
+{
+  GObjectClass *gobject_class;
+  GParamSpec *spec;
+
+  gobject_class = G_OBJECT_CLASS(klass);
+
+  gobject_class->finalize     = garrow_ipc_file_reader_finalize;
+  gobject_class->set_property = garrow_ipc_file_reader_set_property;
+  gobject_class->get_property = garrow_ipc_file_reader_get_property;
+
+  spec = g_param_spec_pointer("file-reader",
+                              "ipc::FileReader",
+                              "The raw std::shared<arrow::ipc::FileReader> *",
+                              static_cast<GParamFlags>(G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_FILE_READER, spec);
+}
+
+/**
+ * garrow_ipc_file_reader_open:
+ * @file: The file to be read.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full): A newly opened
+ *   #GArrowIPCFileReader or %NULL on error.
+ */
+GArrowIPCFileReader *
+garrow_ipc_file_reader_open(GArrowIOReadableFile *file,
+                            GError **error)
+{
+  std::shared_ptr<arrow::ipc::FileReader> arrow_file_reader;
+  auto status =
+    arrow::ipc::FileReader::Open(garrow_io_readable_file_get_raw(file),
+                                 &arrow_file_reader);
+  if (status.ok()) {
+    return garrow_ipc_file_reader_new_raw(&arrow_file_reader);
+  } else {
+    garrow_error_set(error, status, "[ipc][file-reader][open]");
+    return NULL;
+  }
+}
+
+/**
+ * garrow_ipc_file_reader_get_schema:
+ * @file_reader: A #GArrowIPCFileReader.
+ *
+ * Returns: (transfer full): The schema in the file.
+ */
+GArrowSchema *
+garrow_ipc_file_reader_get_schema(GArrowIPCFileReader *file_reader)
+{
+  auto arrow_file_reader =
+    garrow_ipc_file_reader_get_raw(file_reader);
+  auto arrow_schema = arrow_file_reader->schema();
+  return garrow_schema_new_raw(&arrow_schema);
+}
+
+/**
+ * garrow_ipc_file_reader_get_n_record_batches:
+ * @file_reader: A #GArrowIPCFileReader.
+ *
+ * Returns: The number of record batches in the file.
+ */
+guint
+garrow_ipc_file_reader_get_n_record_batches(GArrowIPCFileReader *file_reader)
+{
+  auto arrow_file_reader =
+    garrow_ipc_file_reader_get_raw(file_reader);
+  return arrow_file_reader->num_record_batches();
+}
+
+/**
+ * garrow_ipc_file_reader_get_version:
+ * @file_reader: A #GArrowIPCFileReader.
+ *
+ * Returns: The format version in the file.
+ */
+GArrowIPCMetadataVersion
+garrow_ipc_file_reader_get_version(GArrowIPCFileReader *file_reader)
+{
+  auto arrow_file_reader =
+    garrow_ipc_file_reader_get_raw(file_reader);
+  auto arrow_version = arrow_file_reader->version();
+  return garrow_ipc_metadata_version_from_raw(arrow_version);
+}
+
+/**
+ * garrow_ipc_file_reader_get_record_batch:
+ * @file_reader: A #GArrowIPCFileReader.
+ * @i: The index of the target record batch.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full):
+ *   The i-th record batch in the file or %NULL on error.
+ */
+GArrowRecordBatch *
+garrow_ipc_file_reader_get_record_batch(GArrowIPCFileReader *file_reader,
+                                        guint i,
+                                        GError **error)
+{
+  auto arrow_file_reader =
+    garrow_ipc_file_reader_get_raw(file_reader);
+  std::shared_ptr<arrow::RecordBatch> arrow_record_batch;
+  auto status = arrow_file_reader->GetRecordBatch(i, &arrow_record_batch);
+
+  if (status.ok()) {
+    return garrow_record_batch_new_raw(&arrow_record_batch);
+  } else {
+    garrow_error_set(error, status, "[ipc][file-reader][get-record-batch]");
+    return NULL;
+  }
+}
+
+G_END_DECLS
+
+GArrowIPCFileReader *
+garrow_ipc_file_reader_new_raw(std::shared_ptr<arrow::ipc::FileReader> *arrow_file_reader)
+{
+  auto file_reader =
+    GARROW_IPC_FILE_READER(g_object_new(GARROW_IPC_TYPE_FILE_READER,
+                                        "file-reader", arrow_file_reader,
+                                        NULL));
+  return file_reader;
+}
+
+std::shared_ptr<arrow::ipc::FileReader>
+garrow_ipc_file_reader_get_raw(GArrowIPCFileReader *file_reader)
+{
+  GArrowIPCFileReaderPrivate *priv;
+
+  priv = GARROW_IPC_FILE_READER_GET_PRIVATE(file_reader);
+  return priv->file_reader;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-reader.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-reader.h b/c_glib/arrow-glib/ipc-file-reader.h
new file mode 100644
index 0000000..22915f8
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-reader.h
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/record-batch.h>
+#include <arrow-glib/schema.h>
+
+#include <arrow-glib/io-readable-file.h>
+
+#include <arrow-glib/ipc-metadata-version.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IPC_TYPE_FILE_READER      \
+  (garrow_ipc_file_reader_get_type())
+#define GARROW_IPC_FILE_READER(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IPC_TYPE_FILE_READER,      \
+                              GArrowIPCFileReader))
+#define GARROW_IPC_FILE_READER_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_IPC_TYPE_FILE_READER, \
+                           GArrowIPCFileReaderClass))
+#define GARROW_IPC_IS_FILE_READER(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IPC_TYPE_FILE_READER))
+#define GARROW_IPC_IS_FILE_READER_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_IPC_TYPE_FILE_READER))
+#define GARROW_IPC_FILE_READER_GET_CLASS(obj)                   \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_IPC_TYPE_FILE_READER,       \
+                             GArrowIPCFileReaderClass))
+
+typedef struct _GArrowIPCFileReader         GArrowIPCFileReader;
+typedef struct _GArrowIPCFileReaderClass    GArrowIPCFileReaderClass;
+
+/**
+ * GArrowIPCFileReader:
+ *
+ * It wraps `arrow::ipc::FileReader`.
+ */
+struct _GArrowIPCFileReader
+{
+  /*< private >*/
+  GObject parent_instance;
+};
+
+struct _GArrowIPCFileReaderClass
+{
+  GObjectClass parent_class;
+};
+
+GType garrow_ipc_file_reader_get_type(void) G_GNUC_CONST;
+
+GArrowIPCFileReader *garrow_ipc_file_reader_open(GArrowIOReadableFile *file,
+                                                 GError **error);
+
+GArrowSchema *garrow_ipc_file_reader_get_schema(GArrowIPCFileReader *file_reader);
+guint garrow_ipc_file_reader_get_n_record_batches(GArrowIPCFileReader *file_reader);
+GArrowIPCMetadataVersion garrow_ipc_file_reader_get_version(GArrowIPCFileReader *file_reader);
+GArrowRecordBatch *garrow_ipc_file_reader_get_record_batch(GArrowIPCFileReader *file_reader,
+                                                           guint i,
+                                                           GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-reader.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-reader.hpp b/c_glib/arrow-glib/ipc-file-reader.hpp
new file mode 100644
index 0000000..66cd45d
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-reader.hpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/ipc-file-reader.h>
+
+GArrowIPCFileReader *garrow_ipc_file_reader_new_raw(std::shared_ptr<arrow::ipc::FileReader> *arrow_file_reader);
+std::shared_ptr<arrow::ipc::FileReader> garrow_ipc_file_reader_get_raw(GArrowIPCFileReader *file_reader);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-writer.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-writer.cpp b/c_glib/arrow-glib/ipc-file-writer.cpp
new file mode 100644
index 0000000..d8b3c2e
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-writer.cpp
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/array.hpp>
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/record-batch.hpp>
+#include <arrow-glib/schema.hpp>
+
+#include <arrow-glib/io-output-stream.hpp>
+
+#include <arrow-glib/ipc-stream-writer.hpp>
+#include <arrow-glib/ipc-file-writer.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: ipc-file-writer
+ * @short_description: File writer class
+ *
+ * #GArrowIPCFileWriter is a class for sending data by file based IPC.
+ */
+
+G_DEFINE_TYPE(GArrowIPCFileWriter,
+              garrow_ipc_file_writer,
+              GARROW_IPC_TYPE_STREAM_WRITER);
+
+static void
+garrow_ipc_file_writer_init(GArrowIPCFileWriter *object)
+{
+}
+
+static void
+garrow_ipc_file_writer_class_init(GArrowIPCFileWriterClass *klass)
+{
+}
+
+/**
+ * garrow_ipc_file_writer_open:
+ * @sink: The output of the writer.
+ * @schema: The schema of the writer.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full): A newly opened
+ *   #GArrowIPCFileWriter or %NULL on error.
+ */
+GArrowIPCFileWriter *
+garrow_ipc_file_writer_open(GArrowIOOutputStream *sink,
+                            GArrowSchema *schema,
+                            GError **error)
+{
+  std::shared_ptr<arrow::ipc::FileWriter> arrow_file_writer;
+  auto status =
+    arrow::ipc::FileWriter::Open(garrow_io_output_stream_get_raw(sink).get(),
+                                 garrow_schema_get_raw(schema),
+                                 &arrow_file_writer);
+  if (status.ok()) {
+    return garrow_ipc_file_writer_new_raw(&arrow_file_writer);
+  } else {
+    garrow_error_set(error, status, "[ipc][file-writer][open]");
+    return NULL;
+  }
+}
+
+/**
+ * garrow_ipc_file_writer_write_record_batch:
+ * @file_writer: A #GArrowIPCFileWriter.
+ * @record_batch: The record batch to be written.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_ipc_file_writer_write_record_batch(GArrowIPCFileWriter *file_writer,
+                                          GArrowRecordBatch *record_batch,
+                                          GError **error)
+{
+  auto arrow_file_writer =
+    garrow_ipc_file_writer_get_raw(file_writer);
+  auto arrow_record_batch =
+    garrow_record_batch_get_raw(record_batch);
+  auto arrow_record_batch_raw =
+    arrow_record_batch.get();
+
+  auto status = arrow_file_writer->WriteRecordBatch(*arrow_record_batch_raw);
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[ipc][file-writer][write-record-batch]");
+    return FALSE;
+  }
+}
+
+/**
+ * garrow_ipc_file_writer_close:
+ * @file_writer: A #GArrowIPCFileWriter.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_ipc_file_writer_close(GArrowIPCFileWriter *file_writer,
+                             GError **error)
+{
+  auto arrow_file_writer =
+    garrow_ipc_file_writer_get_raw(file_writer);
+
+  auto status = arrow_file_writer->Close();
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[ipc][file-writer][close]");
+    return FALSE;
+  }
+}
+
+G_END_DECLS
+
+GArrowIPCFileWriter *
+garrow_ipc_file_writer_new_raw(std::shared_ptr<arrow::ipc::FileWriter> *arrow_file_writer)
+{
+  auto file_writer =
+    GARROW_IPC_FILE_WRITER(g_object_new(GARROW_IPC_TYPE_FILE_WRITER,
+                                        "stream-writer", arrow_file_writer,
+                                        NULL));
+  return file_writer;
+}
+
+arrow::ipc::FileWriter *
+garrow_ipc_file_writer_get_raw(GArrowIPCFileWriter *file_writer)
+{
+  auto arrow_stream_writer =
+    garrow_ipc_stream_writer_get_raw(GARROW_IPC_STREAM_WRITER(file_writer));
+  auto arrow_file_writer_raw =
+    dynamic_cast<arrow::ipc::FileWriter *>(arrow_stream_writer.get());
+  return arrow_file_writer_raw;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-writer.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-writer.h b/c_glib/arrow-glib/ipc-file-writer.h
new file mode 100644
index 0000000..732d942
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-writer.h
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/ipc-stream-writer.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IPC_TYPE_FILE_WRITER             \
+  (garrow_ipc_file_writer_get_type())
+#define GARROW_IPC_FILE_WRITER(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IPC_TYPE_FILE_WRITER,      \
+                              GArrowIPCFileWriter))
+#define GARROW_IPC_FILE_WRITER_CLASS(klass)             \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_IPC_TYPE_FILE_WRITER, \
+                           GArrowIPCFileWriterClass))
+#define GARROW_IPC_IS_FILE_WRITER(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IPC_TYPE_FILE_WRITER))
+#define GARROW_IPC_IS_FILE_WRITER_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_IPC_TYPE_FILE_WRITER))
+#define GARROW_IPC_FILE_WRITER_GET_CLASS(obj)                   \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_IPC_TYPE_FILE_WRITER,       \
+                             GArrowIPCFileWriterClass))
+
+typedef struct _GArrowIPCFileWriter         GArrowIPCFileWriter;
+typedef struct _GArrowIPCFileWriterClass    GArrowIPCFileWriterClass;
+
+/**
+ * GArrowIPCFileWriter:
+ *
+ * It wraps `arrow::ipc::FileWriter`.
+ */
+struct _GArrowIPCFileWriter
+{
+  /*< private >*/
+  GArrowIPCStreamWriter parent_instance;
+};
+
+struct _GArrowIPCFileWriterClass
+{
+  GObjectClass parent_class;
+};
+
+GType garrow_ipc_file_writer_get_type(void) G_GNUC_CONST;
+
+GArrowIPCFileWriter *garrow_ipc_file_writer_open(GArrowIOOutputStream *sink,
+                                                 GArrowSchema *schema,
+                                                 GError **error);
+
+gboolean garrow_ipc_file_writer_write_record_batch(GArrowIPCFileWriter *file_writer,
+                                                   GArrowRecordBatch *record_batch,
+                                                   GError **error);
+gboolean garrow_ipc_file_writer_close(GArrowIPCFileWriter *file_writer,
+                                      GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-file-writer.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-file-writer.hpp b/c_glib/arrow-glib/ipc-file-writer.hpp
new file mode 100644
index 0000000..b8ae113
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-file-writer.hpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/ipc-file-writer.h>
+
+GArrowIPCFileWriter *garrow_ipc_file_writer_new_raw(std::shared_ptr<arrow::ipc::FileWriter> *arrow_file_writer);
+arrow::ipc::FileWriter *garrow_ipc_file_writer_get_raw(GArrowIPCFileWriter *file_writer);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-metadata-version.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-metadata-version.cpp b/c_glib/arrow-glib/ipc-metadata-version.cpp
new file mode 100644
index 0000000..c5cc8d3
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-metadata-version.cpp
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/ipc-metadata-version.hpp>
+
+/**
+ * SECTION: ipc-metadata-version
+ * @title: GArrowIPCMetadataVersion
+ * @short_description: Metadata version mapgging between Arrow and arrow-glib
+ *
+ * #GArrowIPCMetadataVersion provides metadata versions corresponding
+ * to `arrow::ipc::MetadataVersion::type` values.
+ */
+
+GArrowIPCMetadataVersion
+garrow_ipc_metadata_version_from_raw(arrow::ipc::MetadataVersion::type version)
+{
+  switch (version) {
+  case arrow::ipc::MetadataVersion::type::V1:
+    return GARROW_IPC_METADATA_VERSION_V1;
+  case arrow::ipc::MetadataVersion::type::V2:
+    return GARROW_IPC_METADATA_VERSION_V2;
+  default:
+    return GARROW_IPC_METADATA_VERSION_V2;
+  }
+}
+
+arrow::ipc::MetadataVersion::type
+garrow_ipc_metadata_version_to_raw(GArrowIPCMetadataVersion version)
+{
+  switch (version) {
+  case GARROW_IPC_METADATA_VERSION_V1:
+    return arrow::ipc::MetadataVersion::type::V1;
+  case GARROW_IPC_METADATA_VERSION_V2:
+    return arrow::ipc::MetadataVersion::type::V2;
+  default:
+    return arrow::ipc::MetadataVersion::type::V2;
+  }
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-metadata-version.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-metadata-version.h b/c_glib/arrow-glib/ipc-metadata-version.h
new file mode 100644
index 0000000..ccfd52a
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-metadata-version.h
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GArrowIPCMetadataVersion:
+ * @GARROW_IPC_METADATA_VERSION_V1: Version 1.
+ * @GARROW_IPC_METADATA_VERSION_V2: Version 2.
+ *
+ * They are corresponding to `arrow::ipc::MetadataVersion::type`
+ * values.
+ */
+typedef enum {
+  GARROW_IPC_METADATA_VERSION_V1,
+  GARROW_IPC_METADATA_VERSION_V2
+} GArrowIPCMetadataVersion;
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-metadata-version.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-metadata-version.hpp b/c_glib/arrow-glib/ipc-metadata-version.hpp
new file mode 100644
index 0000000..2a7e8cf
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-metadata-version.hpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/ipc-metadata-version.h>
+
+GArrowIPCMetadataVersion garrow_ipc_metadata_version_from_raw(arrow::ipc::MetadataVersion::type version);
+arrow::ipc::MetadataVersion::type garrow_ipc_metadata_version_to_raw(GArrowIPCMetadataVersion version);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-reader.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-reader.cpp b/c_glib/arrow-glib/ipc-stream-reader.cpp
new file mode 100644
index 0000000..4804784
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-reader.cpp
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/record-batch.hpp>
+#include <arrow-glib/schema.hpp>
+
+#include <arrow-glib/io-input-stream.hpp>
+
+#include <arrow-glib/ipc-metadata-version.hpp>
+#include <arrow-glib/ipc-stream-reader.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: ipc-stream-reader
+ * @short_description: Stream reader class
+ *
+ * #GArrowIPCStreamReader is a class for receiving data by stream
+ * based IPC.
+ */
+
+typedef struct GArrowIPCStreamReaderPrivate_ {
+  std::shared_ptr<arrow::ipc::StreamReader> stream_reader;
+} GArrowIPCStreamReaderPrivate;
+
+enum {
+  PROP_0,
+  PROP_STREAM_READER
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowIPCStreamReader,
+                           garrow_ipc_stream_reader,
+                           G_TYPE_OBJECT);
+
+#define GARROW_IPC_STREAM_READER_GET_PRIVATE(obj)               \
+  (G_TYPE_INSTANCE_GET_PRIVATE((obj),                           \
+                               GARROW_IPC_TYPE_STREAM_READER,   \
+                               GArrowIPCStreamReaderPrivate))
+
+static void
+garrow_ipc_stream_reader_finalize(GObject *object)
+{
+  GArrowIPCStreamReaderPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_READER_GET_PRIVATE(object);
+
+  priv->stream_reader = nullptr;
+
+  G_OBJECT_CLASS(garrow_ipc_stream_reader_parent_class)->finalize(object);
+}
+
+static void
+garrow_ipc_stream_reader_set_property(GObject *object,
+                                    guint prop_id,
+                                    const GValue *value,
+                                    GParamSpec *pspec)
+{
+  GArrowIPCStreamReaderPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_READER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_STREAM_READER:
+    priv->stream_reader =
+      *static_cast<std::shared_ptr<arrow::ipc::StreamReader> *>(g_value_get_pointer(value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_stream_reader_get_property(GObject *object,
+                                          guint prop_id,
+                                          GValue *value,
+                                          GParamSpec *pspec)
+{
+  switch (prop_id) {
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_stream_reader_init(GArrowIPCStreamReader *object)
+{
+}
+
+static void
+garrow_ipc_stream_reader_class_init(GArrowIPCStreamReaderClass *klass)
+{
+  GObjectClass *gobject_class;
+  GParamSpec *spec;
+
+  gobject_class = G_OBJECT_CLASS(klass);
+
+  gobject_class->finalize     = garrow_ipc_stream_reader_finalize;
+  gobject_class->set_property = garrow_ipc_stream_reader_set_property;
+  gobject_class->get_property = garrow_ipc_stream_reader_get_property;
+
+  spec = g_param_spec_pointer("stream-reader",
+                              "ipc::StreamReader",
+                              "The raw std::shared<arrow::ipc::StreamReader> *",
+                              static_cast<GParamFlags>(G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_STREAM_READER, spec);
+}
+
+/**
+ * garrow_ipc_stream_reader_open:
+ * @stream: The stream to be read.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full): A newly opened
+ *   #GArrowIPCStreamReader or %NULL on error.
+ */
+GArrowIPCStreamReader *
+garrow_ipc_stream_reader_open(GArrowIOInputStream *stream,
+                              GError **error)
+{
+  std::shared_ptr<arrow::ipc::StreamReader> arrow_stream_reader;
+  auto status =
+    arrow::ipc::StreamReader::Open(garrow_io_input_stream_get_raw(stream),
+                                   &arrow_stream_reader);
+  if (status.ok()) {
+    return garrow_ipc_stream_reader_new_raw(&arrow_stream_reader);
+  } else {
+    garrow_error_set(error, status, "[ipc][stream-reader][open]");
+    return NULL;
+  }
+}
+
+/**
+ * garrow_ipc_stream_reader_get_schema:
+ * @stream_reader: A #GArrowIPCStreamReader.
+ *
+ * Returns: (transfer full): The schema in the stream.
+ */
+GArrowSchema *
+garrow_ipc_stream_reader_get_schema(GArrowIPCStreamReader *stream_reader)
+{
+  auto arrow_stream_reader =
+    garrow_ipc_stream_reader_get_raw(stream_reader);
+  auto arrow_schema = arrow_stream_reader->schema();
+  return garrow_schema_new_raw(&arrow_schema);
+}
+
+/**
+ * garrow_ipc_stream_reader_get_next_record_batch:
+ * @stream_reader: A #GArrowIPCStreamReader.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full):
+ *   The next record batch in the stream or %NULL on end of stream.
+ */
+GArrowRecordBatch *
+garrow_ipc_stream_reader_get_next_record_batch(GArrowIPCStreamReader *stream_reader,
+                                               GError **error)
+{
+  auto arrow_stream_reader =
+    garrow_ipc_stream_reader_get_raw(stream_reader);
+  std::shared_ptr<arrow::RecordBatch> arrow_record_batch;
+  auto status = arrow_stream_reader->GetNextRecordBatch(&arrow_record_batch);
+
+  if (status.ok()) {
+    if (arrow_record_batch == nullptr) {
+      return NULL;
+    } else {
+      return garrow_record_batch_new_raw(&arrow_record_batch);
+    }
+  } else {
+    garrow_error_set(error, status, "[ipc][stream-reader][get-next-record-batch]");
+    return NULL;
+  }
+}
+
+G_END_DECLS
+
+GArrowIPCStreamReader *
+garrow_ipc_stream_reader_new_raw(std::shared_ptr<arrow::ipc::StreamReader> *arrow_stream_reader)
+{
+  auto stream_reader =
+    GARROW_IPC_STREAM_READER(g_object_new(GARROW_IPC_TYPE_STREAM_READER,
+                                          "stream-reader", arrow_stream_reader,
+                                          NULL));
+  return stream_reader;
+}
+
+std::shared_ptr<arrow::ipc::StreamReader>
+garrow_ipc_stream_reader_get_raw(GArrowIPCStreamReader *stream_reader)
+{
+  GArrowIPCStreamReaderPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_READER_GET_PRIVATE(stream_reader);
+  return priv->stream_reader;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-reader.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-reader.h b/c_glib/arrow-glib/ipc-stream-reader.h
new file mode 100644
index 0000000..993cd85
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-reader.h
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/record-batch.h>
+#include <arrow-glib/schema.h>
+
+#include <arrow-glib/io-input-stream.h>
+
+#include <arrow-glib/ipc-metadata-version.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IPC_TYPE_STREAM_READER           \
+  (garrow_ipc_stream_reader_get_type())
+#define GARROW_IPC_STREAM_READER(obj)                           \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IPC_TYPE_STREAM_READER,    \
+                              GArrowIPCStreamReader))
+#define GARROW_IPC_STREAM_READER_CLASS(klass)                   \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
+                           GARROW_IPC_TYPE_STREAM_READER,       \
+                           GArrowIPCStreamReaderClass))
+#define GARROW_IPC_IS_STREAM_READER(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IPC_TYPE_STREAM_READER))
+#define GARROW_IPC_IS_STREAM_READER_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_IPC_TYPE_STREAM_READER))
+#define GARROW_IPC_STREAM_READER_GET_CLASS(obj)                 \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_IPC_TYPE_STREAM_READER,     \
+                             GArrowIPCStreamReaderClass))
+
+typedef struct _GArrowIPCStreamReader         GArrowIPCStreamReader;
+typedef struct _GArrowIPCStreamReaderClass    GArrowIPCStreamReaderClass;
+
+/**
+ * GArrowIPCStreamReader:
+ *
+ * It wraps `arrow::ipc::StreamReader`.
+ */
+struct _GArrowIPCStreamReader
+{
+  /*< private >*/
+  GObject parent_instance;
+};
+
+struct _GArrowIPCStreamReaderClass
+{
+  GObjectClass parent_class;
+};
+
+GType garrow_ipc_stream_reader_get_type(void) G_GNUC_CONST;
+
+GArrowIPCStreamReader *garrow_ipc_stream_reader_open(GArrowIOInputStream *stream,
+                                                     GError **error);
+
+GArrowSchema *garrow_ipc_stream_reader_get_schema(GArrowIPCStreamReader *stream_reader);
+GArrowRecordBatch *garrow_ipc_stream_reader_get_next_record_batch(GArrowIPCStreamReader *stream_reader,
+                                                                  GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-reader.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-reader.hpp b/c_glib/arrow-glib/ipc-stream-reader.hpp
new file mode 100644
index 0000000..a35bdab
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-reader.hpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/ipc-stream-reader.h>
+
+GArrowIPCStreamReader *garrow_ipc_stream_reader_new_raw(std::shared_ptr<arrow::ipc::StreamReader> *arrow_stream_reader);
+std::shared_ptr<arrow::ipc::StreamReader> garrow_ipc_stream_reader_get_raw(GArrowIPCStreamReader *stream_reader);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-writer.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-writer.cpp b/c_glib/arrow-glib/ipc-stream-writer.cpp
new file mode 100644
index 0000000..e2455a4
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-writer.cpp
@@ -0,0 +1,232 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/array.hpp>
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/record-batch.hpp>
+#include <arrow-glib/schema.hpp>
+
+#include <arrow-glib/io-output-stream.hpp>
+
+#include <arrow-glib/ipc-stream-writer.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: ipc-stream-writer
+ * @short_description: Stream writer class
+ *
+ * #GArrowIPCStreamWriter is a class for sending data by stream based
+ * IPC.
+ */
+
+typedef struct GArrowIPCStreamWriterPrivate_ {
+  std::shared_ptr<arrow::ipc::StreamWriter> stream_writer;
+} GArrowIPCStreamWriterPrivate;
+
+enum {
+  PROP_0,
+  PROP_STREAM_WRITER
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GArrowIPCStreamWriter,
+                           garrow_ipc_stream_writer,
+                           G_TYPE_OBJECT);
+
+#define GARROW_IPC_STREAM_WRITER_GET_PRIVATE(obj)               \
+  (G_TYPE_INSTANCE_GET_PRIVATE((obj),                           \
+                               GARROW_IPC_TYPE_STREAM_WRITER,   \
+                               GArrowIPCStreamWriterPrivate))
+
+static void
+garrow_ipc_stream_writer_finalize(GObject *object)
+{
+  GArrowIPCStreamWriterPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_WRITER_GET_PRIVATE(object);
+
+  priv->stream_writer = nullptr;
+
+  G_OBJECT_CLASS(garrow_ipc_stream_writer_parent_class)->finalize(object);
+}
+
+static void
+garrow_ipc_stream_writer_set_property(GObject *object,
+                                    guint prop_id,
+                                    const GValue *value,
+                                    GParamSpec *pspec)
+{
+  GArrowIPCStreamWriterPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_WRITER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_STREAM_WRITER:
+    priv->stream_writer =
+      *static_cast<std::shared_ptr<arrow::ipc::StreamWriter> *>(g_value_get_pointer(value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_stream_writer_get_property(GObject *object,
+                                          guint prop_id,
+                                          GValue *value,
+                                          GParamSpec *pspec)
+{
+  switch (prop_id) {
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+garrow_ipc_stream_writer_init(GArrowIPCStreamWriter *object)
+{
+}
+
+static void
+garrow_ipc_stream_writer_class_init(GArrowIPCStreamWriterClass *klass)
+{
+  GObjectClass *gobject_class;
+  GParamSpec *spec;
+
+  gobject_class = G_OBJECT_CLASS(klass);
+
+  gobject_class->finalize     = garrow_ipc_stream_writer_finalize;
+  gobject_class->set_property = garrow_ipc_stream_writer_set_property;
+  gobject_class->get_property = garrow_ipc_stream_writer_get_property;
+
+  spec = g_param_spec_pointer("stream-writer",
+                              "ipc::StreamWriter",
+                              "The raw std::shared<arrow::ipc::StreamWriter> *",
+                              static_cast<GParamFlags>(G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_STREAM_WRITER, spec);
+}
+
+/**
+ * garrow_ipc_stream_writer_open:
+ * @sink: The output of the writer.
+ * @schema: The schema of the writer.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: (nullable) (transfer full): A newly opened
+ *   #GArrowIPCStreamWriter or %NULL on error.
+ */
+GArrowIPCStreamWriter *
+garrow_ipc_stream_writer_open(GArrowIOOutputStream *sink,
+                              GArrowSchema *schema,
+                              GError **error)
+{
+  std::shared_ptr<arrow::ipc::StreamWriter> arrow_stream_writer;
+  auto status =
+    arrow::ipc::StreamWriter::Open(garrow_io_output_stream_get_raw(sink).get(),
+                                 garrow_schema_get_raw(schema),
+                                 &arrow_stream_writer);
+  if (status.ok()) {
+    return garrow_ipc_stream_writer_new_raw(&arrow_stream_writer);
+  } else {
+    garrow_error_set(error, status, "[ipc][stream-writer][open]");
+    return NULL;
+  }
+}
+
+/**
+ * garrow_ipc_stream_writer_write_record_batch:
+ * @stream_writer: A #GArrowIPCStreamWriter.
+ * @record_batch: The record batch to be written.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_ipc_stream_writer_write_record_batch(GArrowIPCStreamWriter *stream_writer,
+                                            GArrowRecordBatch *record_batch,
+                                            GError **error)
+{
+  auto arrow_stream_writer =
+    garrow_ipc_stream_writer_get_raw(stream_writer);
+  auto arrow_record_batch =
+    garrow_record_batch_get_raw(record_batch);
+  auto arrow_record_batch_raw =
+    arrow_record_batch.get();
+
+  auto status = arrow_stream_writer->WriteRecordBatch(*arrow_record_batch_raw);
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[ipc][stream-writer][write-record-batch]");
+    return FALSE;
+  }
+}
+
+/**
+ * garrow_ipc_stream_writer_close:
+ * @stream_writer: A #GArrowIPCStreamWriter.
+ * @error: (nullable): Return locatipcn for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ */
+gboolean
+garrow_ipc_stream_writer_close(GArrowIPCStreamWriter *stream_writer,
+                               GError **error)
+{
+  auto arrow_stream_writer =
+    garrow_ipc_stream_writer_get_raw(stream_writer);
+
+  auto status = arrow_stream_writer->Close();
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[ipc][stream-writer][close]");
+    return FALSE;
+  }
+}
+
+G_END_DECLS
+
+GArrowIPCStreamWriter *
+garrow_ipc_stream_writer_new_raw(std::shared_ptr<arrow::ipc::StreamWriter> *arrow_stream_writer)
+{
+  auto stream_writer =
+    GARROW_IPC_STREAM_WRITER(g_object_new(GARROW_IPC_TYPE_STREAM_WRITER,
+                                        "stream-writer", arrow_stream_writer,
+                                        NULL));
+  return stream_writer;
+}
+
+std::shared_ptr<arrow::ipc::StreamWriter>
+garrow_ipc_stream_writer_get_raw(GArrowIPCStreamWriter *stream_writer)
+{
+  GArrowIPCStreamWriterPrivate *priv;
+
+  priv = GARROW_IPC_STREAM_WRITER_GET_PRIVATE(stream_writer);
+  return priv->stream_writer;
+}

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-writer.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-writer.h b/c_glib/arrow-glib/ipc-stream-writer.h
new file mode 100644
index 0000000..4488204
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-writer.h
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/array.h>
+#include <arrow-glib/record-batch.h>
+#include <arrow-glib/schema.h>
+
+#include <arrow-glib/io-output-stream.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_IPC_TYPE_STREAM_WRITER           \
+  (garrow_ipc_stream_writer_get_type())
+#define GARROW_IPC_STREAM_WRITER(obj)                           \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_IPC_TYPE_STREAM_WRITER,    \
+                              GArrowIPCStreamWriter))
+#define GARROW_IPC_STREAM_WRITER_CLASS(klass)                   \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
+                           GARROW_IPC_TYPE_STREAM_WRITER,       \
+                           GArrowIPCStreamWriterClass))
+#define GARROW_IPC_IS_STREAM_WRITER(obj)                        \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_IPC_TYPE_STREAM_WRITER))
+#define GARROW_IPC_IS_STREAM_WRITER_CLASS(klass)                \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_IPC_TYPE_STREAM_WRITER))
+#define GARROW_IPC_STREAM_WRITER_GET_CLASS(obj)                 \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_IPC_TYPE_STREAM_WRITER,     \
+                             GArrowIPCStreamWriterClass))
+
+typedef struct _GArrowIPCStreamWriter         GArrowIPCStreamWriter;
+typedef struct _GArrowIPCStreamWriterClass    GArrowIPCStreamWriterClass;
+
+/**
+ * GArrowIPCStreamWriter:
+ *
+ * It wraps `arrow::ipc::StreamWriter`.
+ */
+struct _GArrowIPCStreamWriter
+{
+  /*< private >*/
+  GObject parent_instance;
+};
+
+struct _GArrowIPCStreamWriterClass
+{
+  GObjectClass parent_class;
+};
+
+GType garrow_ipc_stream_writer_get_type(void) G_GNUC_CONST;
+
+GArrowIPCStreamWriter *garrow_ipc_stream_writer_open(GArrowIOOutputStream *sink,
+                                                     GArrowSchema *schema,
+                                                     GError **error);
+
+gboolean garrow_ipc_stream_writer_write_record_batch(GArrowIPCStreamWriter *stream_writer,
+                                                     GArrowRecordBatch *record_batch,
+                                                     GError **error);
+gboolean garrow_ipc_stream_writer_close(GArrowIPCStreamWriter *stream_writer,
+                                        GError **error);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/ipc-stream-writer.hpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/ipc-stream-writer.hpp b/c_glib/arrow-glib/ipc-stream-writer.hpp
new file mode 100644
index 0000000..9d09740
--- /dev/null
+++ b/c_glib/arrow-glib/ipc-stream-writer.hpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow/api.h>
+#include <arrow/ipc/api.h>
+
+#include <arrow-glib/ipc-stream-writer.h>
+
+GArrowIPCStreamWriter *garrow_ipc_stream_writer_new_raw(std::shared_ptr<arrow::ipc::StreamWriter> *arrow_stream_writer);
+std::shared_ptr<arrow::ipc::StreamWriter> garrow_ipc_stream_writer_get_raw(GArrowIPCStreamWriter *stream_writer);

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/list-array-builder.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/list-array-builder.cpp b/c_glib/arrow-glib/list-array-builder.cpp
new file mode 100644
index 0000000..6c8f53d
--- /dev/null
+++ b/c_glib/arrow-glib/list-array-builder.cpp
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/array-builder.hpp>
+#include <arrow-glib/list-array-builder.h>
+#include <arrow-glib/error.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: list-array-builder
+ * @short_description: List array builder class
+ * @include: arrow-glib/arrow-glib.h
+ *
+ * #GArrowListArrayBuilder is the class to create a new
+ * #GArrowListArray.
+ */
+
+G_DEFINE_TYPE(GArrowListArrayBuilder,
+              garrow_list_array_builder,
+              GARROW_TYPE_ARRAY_BUILDER)
+
+static void
+garrow_list_array_builder_init(GArrowListArrayBuilder *builder)
+{
+}
+
+static void
+garrow_list_array_builder_class_init(GArrowListArrayBuilderClass *klass)
+{
+}
+
+/**
+ * garrow_list_array_builder_new:
+ * @value_builder: A #GArrowArrayBuilder for value array.
+ *
+ * Returns: A newly created #GArrowListArrayBuilder.
+ */
+GArrowListArrayBuilder *
+garrow_list_array_builder_new(GArrowArrayBuilder *value_builder)
+{
+  auto memory_pool = arrow::default_memory_pool();
+  auto arrow_value_builder = garrow_array_builder_get_raw(value_builder);
+  auto arrow_list_builder =
+    std::make_shared<arrow::ListBuilder>(memory_pool, arrow_value_builder);
+  std::shared_ptr<arrow::ArrayBuilder> arrow_builder = arrow_list_builder;
+  auto builder = garrow_array_builder_new_raw(&arrow_builder);
+  return GARROW_LIST_ARRAY_BUILDER(builder);
+}
+
+/**
+ * garrow_list_array_builder_append:
+ * @builder: A #GArrowListArrayBuilder.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ *
+ * It appends a new list element. To append a new list element, you
+ * need to call this function then append list element values to
+ * `value_builder`. `value_builder` is the #GArrowArrayBuilder
+ * specified to constructor. You can get `value_builder` by
+ * garrow_list_array_builder_get_value_builder().
+ *
+ * |[<!-- language="C" -->
+ * GArrowInt8ArrayBuilder *value_builder;
+ * GArrowListArrayBuilder *builder;
+ *
+ * value_builder = garrow_int8_array_builder_new();
+ * builder = garrow_list_array_builder_new(value_builder, NULL);
+ *
+ * // Start 0th list element: [1, 0, -1]
+ * garrow_list_array_builder_append(builder, NULL);
+ * garrow_int8_array_builder_append(value_builder, 1);
+ * garrow_int8_array_builder_append(value_builder, 0);
+ * garrow_int8_array_builder_append(value_builder, -1);
+ *
+ * // Start 1st list element: [-29, 29]
+ * garrow_list_array_builder_append(builder, NULL);
+ * garrow_int8_array_builder_append(value_builder, -29);
+ * garrow_int8_array_builder_append(value_builder, 29);
+ *
+ * {
+ *   // [[1, 0, -1], [-29, 29]]
+ *   GArrowArray *array = garrow_array_builder_finish(builder);
+ *   // Now, builder is needless.
+ *   g_object_unref(builder);
+ *   g_object_unref(value_builder);
+ *
+ *   // Use array...
+ *   g_object_unref(array);
+ * }
+ * ]|
+ */
+gboolean
+garrow_list_array_builder_append(GArrowListArrayBuilder *builder,
+                                 GError **error)
+{
+  auto arrow_builder =
+    static_cast<arrow::ListBuilder *>(
+      garrow_array_builder_get_raw(GARROW_ARRAY_BUILDER(builder)).get());
+
+  auto status = arrow_builder->Append();
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[list-array-builder][append]");
+    return FALSE;
+  }
+}
+
+/**
+ * garrow_list_array_builder_append_null:
+ * @builder: A #GArrowListArrayBuilder.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ *
+ * It appends a new NULL element.
+ */
+gboolean
+garrow_list_array_builder_append_null(GArrowListArrayBuilder *builder,
+                                      GError **error)
+{
+  auto arrow_builder =
+    static_cast<arrow::ListBuilder *>(
+      garrow_array_builder_get_raw(GARROW_ARRAY_BUILDER(builder)).get());
+
+  auto status = arrow_builder->AppendNull();
+  if (status.ok()) {
+    return TRUE;
+  } else {
+    garrow_error_set(error, status, "[list-array-builder][append-null]");
+    return FALSE;
+  }
+}
+
+/**
+ * garrow_list_array_builder_get_value_builder:
+ * @builder: A #GArrowListArrayBuilder.
+ *
+ * Returns: (transfer full): The #GArrowArrayBuilder for values.
+ */
+GArrowArrayBuilder *
+garrow_list_array_builder_get_value_builder(GArrowListArrayBuilder *builder)
+{
+  auto arrow_builder =
+    static_cast<arrow::ListBuilder *>(
+      garrow_array_builder_get_raw(GARROW_ARRAY_BUILDER(builder)).get());
+  auto arrow_value_builder = arrow_builder->value_builder();
+  return garrow_array_builder_new_raw(&arrow_value_builder);
+}
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/list-array-builder.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/list-array-builder.h b/c_glib/arrow-glib/list-array-builder.h
new file mode 100644
index 0000000..2c2e58e
--- /dev/null
+++ b/c_glib/arrow-glib/list-array-builder.h
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/array-builder.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_TYPE_LIST_ARRAY_BUILDER          \
+  (garrow_list_array_builder_get_type())
+#define GARROW_LIST_ARRAY_BUILDER(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                            \
+                              GARROW_TYPE_LIST_ARRAY_BUILDER,   \
+                              GArrowListArrayBuilder))
+#define GARROW_LIST_ARRAY_BUILDER_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                             \
+                           GARROW_TYPE_LIST_ARRAY_BUILDER,      \
+                           GArrowListArrayBuilderClass))
+#define GARROW_IS_LIST_ARRAY_BUILDER(obj)                       \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                            \
+                              GARROW_TYPE_LIST_ARRAY_BUILDER))
+#define GARROW_IS_LIST_ARRAY_BUILDER_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                             \
+                           GARROW_TYPE_LIST_ARRAY_BUILDER))
+#define GARROW_LIST_ARRAY_BUILDER_GET_CLASS(obj)                \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                             \
+                             GARROW_TYPE_LIST_ARRAY_BUILDER,    \
+                             GArrowListArrayBuilderClass))
+
+typedef struct _GArrowListArrayBuilder         GArrowListArrayBuilder;
+typedef struct _GArrowListArrayBuilderClass    GArrowListArrayBuilderClass;
+
+/**
+ * GArrowListArrayBuilder:
+ *
+ * It wraps `arrow::ListBuilder`.
+ */
+struct _GArrowListArrayBuilder
+{
+  /*< private >*/
+  GArrowArrayBuilder parent_instance;
+};
+
+struct _GArrowListArrayBuilderClass
+{
+  GArrowArrayBuilderClass parent_class;
+};
+
+GType garrow_list_array_builder_get_type(void) G_GNUC_CONST;
+
+GArrowListArrayBuilder *garrow_list_array_builder_new(GArrowArrayBuilder *value_builder);
+
+gboolean garrow_list_array_builder_append(GArrowListArrayBuilder *builder,
+                                          GError **error);
+gboolean garrow_list_array_builder_append_null(GArrowListArrayBuilder *builder,
+                                               GError **error);
+
+GArrowArrayBuilder *garrow_list_array_builder_get_value_builder(GArrowListArrayBuilder *builder);
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/list-array.cpp
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/list-array.cpp b/c_glib/arrow-glib/list-array.cpp
new file mode 100644
index 0000000..2b3fb31
--- /dev/null
+++ b/c_glib/arrow-glib/list-array.cpp
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <arrow-glib/array.hpp>
+#include <arrow-glib/data-type.hpp>
+#include <arrow-glib/list-array.h>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: list-array
+ * @short_description: List array class
+ * @include: arrow-glib/arrow-glib.h
+ *
+ * #GArrowListArray is a class for list array. It can store zero
+ * or more list data.
+ *
+ * #GArrowListArray is immutable. You need to use
+ * #GArrowListArrayBuilder to create a new array.
+ */
+
+G_DEFINE_TYPE(GArrowListArray,               \
+              garrow_list_array,             \
+              GARROW_TYPE_ARRAY)
+
+static void
+garrow_list_array_init(GArrowListArray *object)
+{
+}
+
+static void
+garrow_list_array_class_init(GArrowListArrayClass *klass)
+{
+}
+
+/**
+ * garrow_list_array_get_value_type:
+ * @array: A #GArrowListArray.
+ *
+ * Returns: (transfer full): The data type of value in each list.
+ */
+GArrowDataType *
+garrow_list_array_get_value_type(GArrowListArray *array)
+{
+  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  auto arrow_list_array =
+    static_cast<arrow::ListArray *>(arrow_array.get());
+  auto arrow_value_type = arrow_list_array->value_type();
+  return garrow_data_type_new_raw(&arrow_value_type);
+}
+
+/**
+ * garrow_list_array_get_value:
+ * @array: A #GArrowListArray.
+ * @i: The index of the target value.
+ *
+ * Returns: (transfer full): The i-th list.
+ */
+GArrowArray *
+garrow_list_array_get_value(GArrowListArray *array,
+                            gint64 i)
+{
+  auto arrow_array = garrow_array_get_raw(GARROW_ARRAY(array));
+  auto arrow_list_array =
+    static_cast<arrow::ListArray *>(arrow_array.get());
+  auto arrow_list =
+    arrow_list_array->values()->Slice(arrow_list_array->value_offset(i),
+                                      arrow_list_array->value_length(i));
+  return garrow_array_new_raw(&arrow_list);
+}
+
+G_END_DECLS

http://git-wip-us.apache.org/repos/asf/arrow/blob/39c7274f/c_glib/arrow-glib/list-array.h
----------------------------------------------------------------------
diff --git a/c_glib/arrow-glib/list-array.h b/c_glib/arrow-glib/list-array.h
new file mode 100644
index 0000000..c49aed1
--- /dev/null
+++ b/c_glib/arrow-glib/list-array.h
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <arrow-glib/array.h>
+#include <arrow-glib/data-type.h>
+
+G_BEGIN_DECLS
+
+#define GARROW_TYPE_LIST_ARRAY                  \
+  (garrow_list_array_get_type())
+#define GARROW_LIST_ARRAY(obj)                          \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),                    \
+                              GARROW_TYPE_LIST_ARRAY,   \
+                              GArrowListArray))
+#define GARROW_LIST_ARRAY_CLASS(klass)                  \
+  (G_TYPE_CHECK_CLASS_CAST((klass),                     \
+                           GARROW_TYPE_LIST_ARRAY,      \
+                           GArrowListArrayClass))
+#define GARROW_IS_LIST_ARRAY(obj)                       \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),                    \
+                              GARROW_TYPE_LIST_ARRAY))
+#define GARROW_IS_LIST_ARRAY_CLASS(klass)               \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),                     \
+                           GARROW_TYPE_LIST_ARRAY))
+#define GARROW_LIST_ARRAY_GET_CLASS(obj)                \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),                     \
+                             GARROW_TYPE_LIST_ARRAY,    \
+                             GArrowListArrayClass))
+
+typedef struct _GArrowListArray         GArrowListArray;
+typedef struct _GArrowListArrayClass    GArrowListArrayClass;
+
+/**
+ * GArrowListArray:
+ *
+ * It wraps `arrow::ListArray`.
+ */
+struct _GArrowListArray
+{
+  /*< private >*/
+  GArrowArray parent_instance;
+};
+
+struct _GArrowListArrayClass
+{
+  GArrowArrayClass parent_class;
+};
+
+GType garrow_list_array_get_type(void) G_GNUC_CONST;
+
+GArrowDataType *garrow_list_array_get_value_type(GArrowListArray *array);
+GArrowArray *garrow_list_array_get_value(GArrowListArray *array,
+                                         gint64 i);
+
+G_END_DECLS