forked from Leak_Technologies/VideoTools
Vendor gotk3 library to ensure consistent GTK3 bindings across environments and simplify dependency management. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
438 lines
11 KiB
Go
438 lines
11 KiB
Go
package glib
|
|
|
|
// #cgo pkg-config: gio-2.0 glib-2.0 gobject-2.0
|
|
// #include <gio/gio.h>
|
|
// #include <stdlib.h>
|
|
// #include "giostream.go.h"
|
|
import "C"
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"unsafe"
|
|
)
|
|
|
|
func init() {
|
|
|
|
tm := []TypeMarshaler{
|
|
{Type(C.g_io_stream_get_type()), marshalIOStream},
|
|
{Type(C.g_output_stream_get_type()), marshalOutputStream},
|
|
{Type(C.g_input_stream_get_type()), marshalInputStream},
|
|
}
|
|
|
|
RegisterGValueMarshalers(tm)
|
|
}
|
|
|
|
// OutputStreamSpliceFlags is a representation of GTK's GOutputStreamSpliceFlags.
|
|
type OutputStreamSpliceFlags int
|
|
|
|
const (
|
|
OUTPUT_STREAM_SPLICE_NONE OutputStreamSpliceFlags = C.G_OUTPUT_STREAM_SPLICE_NONE
|
|
OUTPUT_STREAM_SPLICE_CLOSE_SOURCE = C.G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE
|
|
OUTPUT_STREAM_SPLICE_CLOSE_TARGET = C.G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET
|
|
)
|
|
|
|
/*
|
|
* GIOStream
|
|
*/
|
|
|
|
// IOStream is a representation of GIO's GIOStream.
|
|
// Base class for implementing read/write streams
|
|
type IOStream struct {
|
|
*Object
|
|
}
|
|
|
|
// native returns a pointer to the underlying GIOStream.
|
|
func (v *IOStream) native() *C.GIOStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGIOStream(p)
|
|
}
|
|
|
|
// NativePrivate: to be used inside Gotk3 only.
|
|
func (v *IOStream) NativePrivate() *C.GIOStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGIOStream(p)
|
|
}
|
|
|
|
// Native returns a pointer to the underlying GIOStream.
|
|
func (v *IOStream) Native() uintptr {
|
|
return uintptr(unsafe.Pointer(v.native()))
|
|
}
|
|
|
|
func marshalIOStream(p uintptr) (interface{}, error) {
|
|
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
|
|
obj := Take(unsafe.Pointer(c))
|
|
return wrapIOStream(obj), nil
|
|
}
|
|
|
|
func wrapIOStream(obj *Object) *IOStream {
|
|
return &IOStream{obj}
|
|
}
|
|
|
|
/*
|
|
GInputStream * g_io_stream_get_input_stream ()
|
|
GOutputStream * g_io_stream_get_output_stream ()
|
|
void g_io_stream_splice_async ()
|
|
gboolean g_io_stream_splice_finish ()
|
|
*/
|
|
|
|
// Close is a wrapper around g_io_stream_close().
|
|
func (v *IOStream) Close(cancellable *Cancellable) (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_io_stream_close(
|
|
v.native(),
|
|
cancellable.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
/*
|
|
void g_io_stream_close_async ()
|
|
gboolean g_io_stream_close_finish ()
|
|
gboolean g_io_stream_is_closed ()
|
|
gboolean g_io_stream_has_pending ()
|
|
gboolean g_io_stream_set_pending ()
|
|
void g_io_stream_clear_pending ()
|
|
*/
|
|
|
|
/*
|
|
* GInputStream
|
|
*/
|
|
|
|
// InputStream is a representation of GIO's GInputStream.
|
|
// Base class for implementing streaming input
|
|
type InputStream struct {
|
|
*Object
|
|
}
|
|
|
|
// native returns a pointer to the underlying GInputStream.
|
|
func (v *InputStream) native() *C.GInputStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGInputStream(p)
|
|
}
|
|
|
|
// NativePrivate: to be used inside Gotk3 only.
|
|
func (v *InputStream) NativePrivate() *C.GInputStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGInputStream(p)
|
|
}
|
|
|
|
// Native returns a pointer to the underlying GInputStream.
|
|
func (v *InputStream) Native() uintptr {
|
|
return uintptr(unsafe.Pointer(v.native()))
|
|
}
|
|
|
|
func marshalInputStream(p uintptr) (interface{}, error) {
|
|
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
|
|
obj := Take(unsafe.Pointer(c))
|
|
return wrapInputStream(obj), nil
|
|
}
|
|
|
|
func wrapInputStream(obj *Object) *InputStream {
|
|
return &InputStream{obj}
|
|
}
|
|
|
|
// Read is a wrapper around g_input_stream_read().
|
|
func (v *InputStream) Read(length uint, cancellable *Cancellable) (*bytes.Buffer, int, error) {
|
|
var gerr *C.GError
|
|
var buffer = bytes.NewBuffer(make([]byte, length))
|
|
|
|
c := C.g_input_stream_read(
|
|
v.native(),
|
|
unsafe.Pointer(&buffer.Bytes()[0]),
|
|
C.gsize(length),
|
|
cancellable.native(),
|
|
&gerr)
|
|
if c == -1 {
|
|
defer C.g_error_free(gerr)
|
|
return nil, -1, errors.New(goString(gerr.message))
|
|
}
|
|
return buffer, int(c), nil
|
|
}
|
|
|
|
// TODO find a way to get size to be read without asking for ...
|
|
/*
|
|
gboolean
|
|
g_input_stream_read_all (GInputStream *stream,
|
|
void *buffer,
|
|
gsize count,
|
|
gsize *bytes_read,
|
|
GCancellable *cancellable,
|
|
GError **error);
|
|
*/
|
|
|
|
/*
|
|
void g_input_stream_read_all_async ()
|
|
gboolean g_input_stream_read_all_finish ()
|
|
gssize g_input_stream_skip ()
|
|
*/
|
|
|
|
// Close is a wrapper around g_input_stream_close().
|
|
func (v *InputStream) Close(cancellable *Cancellable) (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_input_stream_close(
|
|
v.native(),
|
|
cancellable.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// TODO g_input_stream***
|
|
/*
|
|
void g_input_stream_read_async ()
|
|
gssize g_input_stream_read_finish ()
|
|
void g_input_stream_skip_async ()
|
|
gssize g_input_stream_skip_finish ()
|
|
void g_input_stream_close_async ()
|
|
gboolean g_input_stream_close_finish ()
|
|
*/
|
|
|
|
// IsClosed is a wrapper around g_input_stream_is_closed().
|
|
func (v *InputStream) IsClosed() bool {
|
|
return gobool(C.g_input_stream_is_closed(v.native()))
|
|
}
|
|
|
|
// HasPending is a wrapper around g_input_stream_has_pending().
|
|
func (v *InputStream) HasPending() bool {
|
|
return gobool(C.g_input_stream_has_pending(v.native()))
|
|
}
|
|
|
|
// SetPending is a wrapper around g_input_stream_set_pending().
|
|
func (v *InputStream) SetPending() (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_input_stream_set_pending(
|
|
v.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// ClearPending is a wrapper around g_input_stream_clear_pending().
|
|
func (v *InputStream) ClearPending() {
|
|
C.g_input_stream_clear_pending(v.native())
|
|
}
|
|
|
|
/* Useless functions due to Go language specification and actual
|
|
implementation of (*InputStream).Read that do same thing.
|
|
|
|
GBytes * g_input_stream_read_bytes ()
|
|
void g_input_stream_read_bytes_async ()
|
|
GBytes * g_input_stream_read_bytes_finish ()
|
|
*/
|
|
|
|
/*
|
|
* GOutputStream
|
|
*/
|
|
|
|
// OutputStream is a representation of GIO's GOutputStream.
|
|
// Base class for implementing streaming output
|
|
type OutputStream struct {
|
|
*Object
|
|
}
|
|
|
|
// native returns a pointer to the underlying GOutputStream.
|
|
func (v *OutputStream) native() *C.GOutputStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGOutputStream(p)
|
|
}
|
|
|
|
// NativePrivate: to be used inside Gotk3 only.
|
|
func (v *OutputStream) NativePrivate() *C.GOutputStream {
|
|
if v == nil || v.GObject == nil {
|
|
return nil
|
|
}
|
|
p := unsafe.Pointer(v.GObject)
|
|
return C.toGOutputStream(p)
|
|
}
|
|
|
|
// Native returns a pointer to the underlying GOutputStream.
|
|
func (v *OutputStream) Native() uintptr {
|
|
return uintptr(unsafe.Pointer(v.native()))
|
|
}
|
|
|
|
func marshalOutputStream(p uintptr) (interface{}, error) {
|
|
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
|
|
obj := Take(unsafe.Pointer(c))
|
|
return wrapOutputStream(obj), nil
|
|
}
|
|
|
|
func wrapOutputStream(obj *Object) *OutputStream {
|
|
return &OutputStream{obj}
|
|
}
|
|
|
|
/*
|
|
gssize
|
|
g_output_stream_write (GOutputStream *stream,
|
|
const void *buffer,
|
|
gsize count,
|
|
GCancellable *cancellable,
|
|
GError **error);
|
|
*/
|
|
|
|
// Write is a wrapper around g_output_stream_write().
|
|
// buffer := bytes.NewBuffer(make([]byte, length))
|
|
func (v *OutputStream) Write(buffer *bytes.Buffer, cancellable *Cancellable) (int, error) {
|
|
var gerr *C.GError
|
|
length := buffer.Len()
|
|
|
|
c := C.g_output_stream_write(
|
|
v.native(),
|
|
unsafe.Pointer(&buffer.Bytes()[0]),
|
|
C.gsize(length),
|
|
cancellable.native(),
|
|
&gerr)
|
|
if c == -1 {
|
|
defer C.g_error_free(gerr)
|
|
return -1, errors.New(goString(gerr.message))
|
|
}
|
|
return int(c), nil
|
|
}
|
|
|
|
// Write is a wrapper around g_output_stream_write().
|
|
// func (v *OutputStream) Write(buffer *[]byte, cancellable *Cancellable) (int, error) {
|
|
// // cdata := C.CString(data)
|
|
// // defer C.free(unsafe.Pointer(cdata))
|
|
// var gerr *C.GError
|
|
// c := C.g_output_stream_write(
|
|
// v.native(),
|
|
// unsafe.Pointer(buffer),
|
|
// C.gsize(len(*buffer)),
|
|
// cancellable.native(),
|
|
// &gerr)
|
|
// if c == -1 {
|
|
// defer C.g_error_free(gerr)
|
|
// return 0, errors.New(goString(gerr.message))
|
|
// }
|
|
// return int(c), nil
|
|
// }
|
|
|
|
/*
|
|
gboolean g_output_stream_write_all ()
|
|
*/
|
|
|
|
// TODO outputStream asynch functions
|
|
/*
|
|
void g_output_stream_write_all_async ()
|
|
gboolean g_output_stream_write_all_finish ()
|
|
gboolean g_output_stream_writev ()
|
|
gboolean g_output_stream_writev_all ()
|
|
void g_output_stream_writev_async ()
|
|
gboolean g_output_stream_writev_finish ()
|
|
void g_output_stream_writev_all_async ()
|
|
gboolean g_output_stream_writev_all_finish ()
|
|
*/
|
|
/*
|
|
gssize
|
|
g_output_stream_splice (GOutputStream *stream,
|
|
GInputStream *source,
|
|
GOutputStreamSpliceFlags flags,
|
|
GCancellable *cancellable,
|
|
GError **error);
|
|
*/
|
|
|
|
// Flush is a wrapper around g_output_stream_flush().
|
|
func (v *OutputStream) Flush(cancellable *Cancellable) (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_output_stream_flush(
|
|
v.native(),
|
|
cancellable.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// Close is a wrapper around g_output_stream_close().
|
|
func (v *OutputStream) Close(cancellable *Cancellable) (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_output_stream_close(
|
|
v.native(),
|
|
cancellable.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// TODO outputStream asynch functions
|
|
/*
|
|
void g_output_stream_write_async ()
|
|
gssize g_output_stream_write_finish ()
|
|
void g_output_stream_splice_async ()
|
|
gssize g_output_stream_splice_finish ()
|
|
void g_output_stream_flush_async ()
|
|
gboolean g_output_stream_flush_finish ()
|
|
void g_output_stream_close_async ()
|
|
gboolean g_output_stream_close_finish ()
|
|
*/
|
|
|
|
// IsClosing is a wrapper around g_output_stream_is_closing().
|
|
func (v *OutputStream) IsClosing() bool {
|
|
return gobool(C.g_output_stream_is_closing(v.native()))
|
|
}
|
|
|
|
// IsClosed is a wrapper around g_output_stream_is_closed().
|
|
func (v *OutputStream) IsClosed() bool {
|
|
return gobool(C.g_output_stream_is_closed(v.native()))
|
|
}
|
|
|
|
// HasPending is a wrapper around g_output_stream_has_pending().
|
|
func (v *OutputStream) HasPending() bool {
|
|
return gobool(C.g_output_stream_has_pending(v.native()))
|
|
}
|
|
|
|
// SetPending is a wrapper around g_output_stream_set_pending().
|
|
func (v *OutputStream) SetPending() (bool, error) {
|
|
var gerr *C.GError
|
|
ok := gobool(C.g_output_stream_set_pending(
|
|
v.native(),
|
|
&gerr))
|
|
if !ok {
|
|
defer C.g_error_free(gerr)
|
|
return false, errors.New(goString(gerr.message))
|
|
}
|
|
return ok, nil
|
|
}
|
|
|
|
// ClearPending is a wrapper around g_output_stream_clear_pending().
|
|
func (v *OutputStream) ClearPending() {
|
|
C.g_output_stream_clear_pending(v.native())
|
|
}
|
|
|
|
/*
|
|
gssize g_output_stream_write_bytes ()
|
|
void g_output_stream_write_bytes_async ()
|
|
gssize g_output_stream_write_bytes_finish ()
|
|
gboolean g_output_stream_printf ()
|
|
gboolean g_output_stream_vprintf ()
|
|
*/
|