/* -*- Mode: C; c-basic-offset: 4 -*-
 * pygobject - Python bindings for GObject
 * Copyright (C) 2008  Johan Dahlin
 * Copyright (C) 2009  Paul Pogonyshev
 *
 *   gdatainputstream.override: module overrides for GDataInputStream
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
 * USA
 */

%%
override g_data_input_stream_read_line kwargs
static PyObject *
_wrap_g_data_input_stream_read_line(PyGObject *self,
				    PyObject *args,
				    PyObject *kwargs)
{
    static char *kwlist[] = { "cancellable", NULL };
    PyGObject *pycancellable = NULL;
    GCancellable *cancellable;
    char *line;
    gsize length;
    PyObject *py_line;
    GError *error = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
				     "|O:gio.DataInputStream.read_line",
                                     kwlist, &pycancellable))
        return NULL;

    if (!pygio_check_cancellable(pycancellable, &cancellable))
	return NULL;

    line = g_data_input_stream_read_line(G_DATA_INPUT_STREAM(self->obj),
					 &length, cancellable, &error);
    if (pyg_error_check(&error))
        return NULL;

    py_line = PyString_FromStringAndSize(line, length);
    g_free(line);
    return py_line;
}

%%
override g_data_input_stream_read_line_async kwargs
static PyObject *
_wrap_g_data_input_stream_read_line_async(PyGObject *self,
				          PyObject *args,
				          PyObject *kwargs)
{
    static char *kwlist[] = { "callback", "io_priority",
                              "cancellable", "user_data", NULL };
    int io_priority = G_PRIORITY_DEFAULT;
    PyGObject *pycancellable = NULL;
    GCancellable *cancellable;
    PyGIONotify *notify;

    notify = pygio_notify_new();

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
                                     "O|iOO:gio.DataInputStream.read_line_async",
                                     kwlist,
                                     &notify->callback,
                                     &io_priority,
                                     &pycancellable,
                                     &notify->data))
        goto error;

    if (!pygio_notify_callback_is_valid(notify))
        goto error;

    if (!pygio_check_cancellable(pycancellable, &cancellable))
        goto error;

    pygio_notify_reference_callback(notify);

    g_data_input_stream_read_line_async(G_DATA_INPUT_STREAM(self->obj),
                                        io_priority,
                                        cancellable,
                                        (GAsyncReadyCallback) async_result_callback_marshal,
                                        notify);

    Py_INCREF(Py_None);
    return Py_None;

 error:
    pygio_notify_free(notify);
    return NULL;
}

%%
override g_data_input_stream_read_line_finish kwargs
static PyObject *
_wrap_g_data_input_stream_read_line_finish(PyGObject *self,
                                           PyObject *args,
                                           PyObject *kwargs)
{
    static char *kwlist[] = { "result", NULL };
    PyGObject *result;
    GError *error = NULL;
    gchar *line;
    gsize length;
    PyObject *py_line;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
                                     "O!:gio.DataInputStream.read_line_finish",
                                     kwlist, &PyGAsyncResult_Type, &result))
        return NULL;

    line = g_data_input_stream_read_line_finish(G_DATA_INPUT_STREAM(self->obj),
                                                G_ASYNC_RESULT(result->obj),
                                                &length,
                                                &error);

    if (pyg_error_check(&error))
        return NULL;

    py_line = PyString_FromStringAndSize(line, length);
    g_free(line);
    return py_line;
}

%%
override g_data_input_stream_read_until kwargs
static PyObject *
_wrap_g_data_input_stream_read_until(PyGObject *self,
				     PyObject *args,
				     PyObject *kwargs)
{
    static char *kwlist[] = { "stop_chars", "cancellable", NULL };
    const char *stop_chars;
    PyGObject *pycancellable = NULL;
    GCancellable *cancellable;
    char *line;
    gsize length;
    PyObject *py_line;
    GError *error = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
				     "s|O:gio.DataInputStream.read_line",
                                     kwlist, &stop_chars, &pycancellable))
        return NULL;

    if (!pygio_check_cancellable(pycancellable, &cancellable))
	return NULL;

    line = g_data_input_stream_read_until(G_DATA_INPUT_STREAM(self->obj),
					  stop_chars, &length, cancellable, &error);
    if (pyg_error_check(&error))
        return NULL;

    py_line = PyString_FromStringAndSize(line, length);
    g_free(line);
    return py_line;
}

%%
override g_data_input_stream_read_until_async kwargs
static PyObject *
_wrap_g_data_input_stream_read_until_async(PyGObject *self,
                                           PyObject *args,
                                           PyObject *kwargs)
{
    static char *kwlist[] = { "stop_chars", "callback", "io_priority",
                              "cancellable", "user_data", NULL };
    const char *stop_chars;
    int io_priority = G_PRIORITY_DEFAULT;
    PyGObject *pycancellable = NULL;
    GCancellable *cancellable;
    PyGIONotify *notify;

    notify = pygio_notify_new();

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
                                     "sO|iOO:gio.DataInputStream.read_until_async",
                                     kwlist,
                                     &stop_chars,
                                     &notify->callback,
                                     &io_priority,
                                     &pycancellable,
                                     &notify->data))
        goto error;

    if (!pygio_notify_callback_is_valid(notify))
        goto error;

    if (!pygio_check_cancellable(pycancellable, &cancellable))
        goto error;

    pygio_notify_reference_callback(notify);

    g_data_input_stream_read_until_async(G_DATA_INPUT_STREAM(self->obj),
                                         stop_chars,
                                         io_priority,
                                         cancellable,
                                         (GAsyncReadyCallback) async_result_callback_marshal,
                                         notify);

    Py_INCREF(Py_None);
    return Py_None;

 error:
    pygio_notify_free(notify);
    return NULL;
}

%%
override g_data_input_stream_read_until_finish kwargs
static PyObject *
_wrap_g_data_input_stream_read_until_finish(PyGObject *self,
                                           PyObject *args,
                                           PyObject *kwargs)
{
    static char *kwlist[] = { "result", NULL };
    PyGObject *result;
    GError *error = NULL;
    gchar *line;
    gsize length;
    PyObject *py_line;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
                                     "O!:gio.DataInputStream.read_until_finish",
                                     kwlist, &PyGAsyncResult_Type, &result))
        return NULL;

    line = g_data_input_stream_read_until_finish(G_DATA_INPUT_STREAM(self->obj),
                                                 G_ASYNC_RESULT(result->obj),
                                                 &length,
                                                 &error);

    if (pyg_error_check(&error))
        return NULL;

    py_line = PyString_FromStringAndSize(line, length);
    g_free(line);
    return py_line;
}
