mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-16 13:26:36 +00:00
elements: don't depend on libgio just for g_io_error_from_errno()
https://bugzilla.gnome.org/show_bug.cgi?id=729949
This commit is contained in:
parent
fa94322349
commit
f28a4cc671
3 changed files with 268 additions and 10 deletions
|
@ -60,13 +60,22 @@
|
|||
#include "gstdownloadbuffer.h"
|
||||
|
||||
#include <glib/gstdio.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include "gst/gst-i18n-lib.h"
|
||||
#include "gst/glib-compat-private.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
#include <io.h> /* lseek, open, close, read */
|
||||
#undef lseek
|
||||
#define lseek _lseeki64
|
||||
#undef off_t
|
||||
#define off_t guint64
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -778,7 +787,7 @@ gst_download_buffer_read_buffer (GstDownloadBuffer * dlbuf, guint64 offset,
|
|||
&remaining, &error);
|
||||
if (G_UNLIKELY (res == 0)) {
|
||||
switch (error->code) {
|
||||
case G_IO_ERROR_WOULD_BLOCK:
|
||||
case GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK:
|
||||
/* we don't have the requested data in the file, decide what to
|
||||
* do next. */
|
||||
ret = gst_download_buffer_wait_for_data (dlbuf, offset, length);
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
#include <gst/gst.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include "gstsparsefile.h"
|
||||
|
||||
|
@ -45,6 +44,11 @@
|
|||
#define FSEEK_FILE(file,offset) (fseek (file, offset, SEEK_SET) != 0)
|
||||
#endif
|
||||
|
||||
#define GST_SPARSE_FILE_IO_ERROR \
|
||||
g_quark_from_static_string("gst-sparse-file-io-error-quark")
|
||||
|
||||
static GstSparseFileIOErrorEnum
|
||||
gst_sparse_file_io_error_from_errno (gint err_no);
|
||||
|
||||
typedef struct _GstSparseRange GstSparseRange;
|
||||
|
||||
|
@ -290,8 +294,9 @@ gst_sparse_file_write (GstSparseFile * file, gsize offset, gconstpointer data,
|
|||
/* ERRORS */
|
||||
error:
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
|
||||
"Error writing file: %s", g_strerror (errno));
|
||||
g_set_error (error, GST_SPARSE_FILE_IO_ERROR,
|
||||
gst_sparse_file_io_error_from_errno (errno), "Error writing file: %s",
|
||||
g_strerror (errno));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -308,7 +313,7 @@ error:
|
|||
* Read @count bytes from @file at @offset into @data.
|
||||
*
|
||||
* On error, @error will be set. If there are no @count bytes available
|
||||
* at @offset, %G_IO_ERROR_WOULD_BLOCK is returned.
|
||||
* at @offset, %GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK is returned.
|
||||
*
|
||||
* @remaining will be set to the amount of bytes remaining in the read
|
||||
* range.
|
||||
|
@ -353,15 +358,16 @@ gst_sparse_file_read (GstSparseFile * file, gsize offset, gpointer data,
|
|||
/* ERRORS */
|
||||
no_range:
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK,
|
||||
"Offset not written to file yet");
|
||||
g_set_error_literal (error, GST_SPARSE_FILE_IO_ERROR,
|
||||
GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK, "Offset not written to file yet");
|
||||
return 0;
|
||||
}
|
||||
error:
|
||||
{
|
||||
if (ferror (file->file)) {
|
||||
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
|
||||
"Error reading file: %s", g_strerror (errno));
|
||||
g_set_error (error, GST_SPARSE_FILE_IO_ERROR,
|
||||
gst_sparse_file_io_error_from_errno (errno), "Error reading file: %s",
|
||||
g_strerror (errno));
|
||||
} else if (feof (file->file)) {
|
||||
return res;
|
||||
}
|
||||
|
@ -466,3 +472,197 @@ gst_sparse_file_get_range_after (GstSparseFile * file, gsize offset,
|
|||
}
|
||||
return result != NULL;
|
||||
}
|
||||
|
||||
/* we don't want to rely on libgio just for g_io_error_from_errno() */
|
||||
static GstSparseFileIOErrorEnum
|
||||
gst_sparse_file_io_error_from_errno (gint err_no)
|
||||
{
|
||||
switch (err_no) {
|
||||
#ifdef EEXIST
|
||||
case EEXIST:
|
||||
return GST_SPARSE_FILE_IO_ERROR_EXISTS;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EISDIR
|
||||
case EISDIR:
|
||||
return GST_SPARSE_FILE_IO_ERROR_IS_DIRECTORY;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EACCES
|
||||
case EACCES:
|
||||
return GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENAMETOOLONG
|
||||
case ENAMETOOLONG:
|
||||
return GST_SPARSE_FILE_IO_ERROR_FILENAME_TOO_LONG;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENOENT
|
||||
case ENOENT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_FOUND;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENOTDIR
|
||||
case ENOTDIR:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_DIRECTORY;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EROFS
|
||||
case EROFS:
|
||||
return GST_SPARSE_FILE_IO_ERROR_READ_ONLY;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ELOOP
|
||||
case ELOOP:
|
||||
return GST_SPARSE_FILE_IO_ERROR_TOO_MANY_LINKS;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENOSPC
|
||||
case ENOSPC:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NO_SPACE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENOMEM
|
||||
case ENOMEM:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NO_SPACE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EINVAL
|
||||
case EINVAL:
|
||||
return GST_SPARSE_FILE_IO_ERROR_INVALID_ARGUMENT;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EPERM
|
||||
case EPERM:
|
||||
return GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ECANCELED
|
||||
case ECANCELED:
|
||||
return GST_SPARSE_FILE_IO_ERROR_CANCELLED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
/* ENOTEMPTY == EEXIST on AIX for backward compatibility reasons */
|
||||
#if defined (ENOTEMPTY) && (!defined (EEXIST) || (ENOTEMPTY != EEXIST))
|
||||
case ENOTEMPTY:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_EMPTY;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENOTSUP
|
||||
case ENOTSUP:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
/* EOPNOTSUPP == ENOTSUP on Linux, but POSIX considers them distinct */
|
||||
#if defined (EOPNOTSUPP) && (!defined (ENOTSUP) || (EOPNOTSUPP != ENOTSUP))
|
||||
case EOPNOTSUPP:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EPROTONOSUPPORT
|
||||
case EPROTONOSUPPORT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ESOCKTNOSUPPORT
|
||||
case ESOCKTNOSUPPORT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EPFNOSUPPORT
|
||||
case EPFNOSUPPORT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EAFNOSUPPORT
|
||||
case EAFNOSUPPORT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ETIMEDOUT
|
||||
case ETIMEDOUT:
|
||||
return GST_SPARSE_FILE_IO_ERROR_TIMED_OUT;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EBUSY
|
||||
case EBUSY:
|
||||
return GST_SPARSE_FILE_IO_ERROR_BUSY;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EWOULDBLOCK
|
||||
case EWOULDBLOCK:
|
||||
return GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK;
|
||||
break;
|
||||
#endif
|
||||
|
||||
/* EWOULDBLOCK == EAGAIN on most systems, but POSIX considers them distinct */
|
||||
#if defined (EAGAIN) && (!defined (EWOULDBLOCK) || (EWOULDBLOCK != EAGAIN))
|
||||
case EAGAIN:
|
||||
return GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EMFILE
|
||||
case EMFILE:
|
||||
return GST_SPARSE_FILE_IO_ERROR_TOO_MANY_OPEN_FILES;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EADDRINUSE
|
||||
case EADDRINUSE:
|
||||
return GST_SPARSE_FILE_IO_ERROR_ADDRESS_IN_USE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EHOSTUNREACH
|
||||
case EHOSTUNREACH:
|
||||
return GST_SPARSE_FILE_IO_ERROR_HOST_UNREACHABLE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ENETUNREACH
|
||||
case ENETUNREACH:
|
||||
return GST_SPARSE_FILE_IO_ERROR_NETWORK_UNREACHABLE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef ECONNREFUSED
|
||||
case ECONNREFUSED:
|
||||
return GST_SPARSE_FILE_IO_ERROR_CONNECTION_REFUSED;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef EPIPE
|
||||
case EPIPE:
|
||||
return GST_SPARSE_FILE_IO_ERROR_BROKEN_PIPE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return GST_SPARSE_FILE_IO_ERROR_FAILED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,55 @@ G_BEGIN_DECLS
|
|||
|
||||
typedef struct _GstSparseFile GstSparseFile;
|
||||
|
||||
/* NOTE: Remove this before making this public API again! */
|
||||
typedef enum {
|
||||
GST_SPARSE_FILE_IO_ERROR_FAILED,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_FOUND,
|
||||
GST_SPARSE_FILE_IO_ERROR_EXISTS,
|
||||
GST_SPARSE_FILE_IO_ERROR_IS_DIRECTORY,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_DIRECTORY,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_EMPTY,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_REGULAR_FILE,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_SYMBOLIC_LINK,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_MOUNTABLE_FILE,
|
||||
GST_SPARSE_FILE_IO_ERROR_FILENAME_TOO_LONG,
|
||||
GST_SPARSE_FILE_IO_ERROR_INVALID_FILENAME,
|
||||
GST_SPARSE_FILE_IO_ERROR_TOO_MANY_LINKS,
|
||||
GST_SPARSE_FILE_IO_ERROR_NO_SPACE,
|
||||
GST_SPARSE_FILE_IO_ERROR_INVALID_ARGUMENT,
|
||||
GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_MOUNTED,
|
||||
GST_SPARSE_FILE_IO_ERROR_ALREADY_MOUNTED,
|
||||
GST_SPARSE_FILE_IO_ERROR_CLOSED,
|
||||
GST_SPARSE_FILE_IO_ERROR_CANCELLED,
|
||||
GST_SPARSE_FILE_IO_ERROR_PENDING,
|
||||
GST_SPARSE_FILE_IO_ERROR_READ_ONLY,
|
||||
GST_SPARSE_FILE_IO_ERROR_CANT_CREATE_BACKUP,
|
||||
GST_SPARSE_FILE_IO_ERROR_WRONG_ETAG,
|
||||
GST_SPARSE_FILE_IO_ERROR_TIMED_OUT,
|
||||
GST_SPARSE_FILE_IO_ERROR_WOULD_RECURSE,
|
||||
GST_SPARSE_FILE_IO_ERROR_BUSY,
|
||||
GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK,
|
||||
GST_SPARSE_FILE_IO_ERROR_HOST_NOT_FOUND,
|
||||
GST_SPARSE_FILE_IO_ERROR_WOULD_MERGE,
|
||||
GST_SPARSE_FILE_IO_ERROR_FAILED_HANDLED,
|
||||
GST_SPARSE_FILE_IO_ERROR_TOO_MANY_OPEN_FILES,
|
||||
GST_SPARSE_FILE_IO_ERROR_NOT_INITIALIZED,
|
||||
GST_SPARSE_FILE_IO_ERROR_ADDRESS_IN_USE,
|
||||
GST_SPARSE_FILE_IO_ERROR_PARTIAL_INPUT,
|
||||
GST_SPARSE_FILE_IO_ERROR_INVALID_DATA,
|
||||
GST_SPARSE_FILE_IO_ERROR_DBUS_ERROR,
|
||||
GST_SPARSE_FILE_IO_ERROR_HOST_UNREACHABLE,
|
||||
GST_SPARSE_FILE_IO_ERROR_NETWORK_UNREACHABLE,
|
||||
GST_SPARSE_FILE_IO_ERROR_CONNECTION_REFUSED,
|
||||
GST_SPARSE_FILE_IO_ERROR_PROXY_FAILED,
|
||||
GST_SPARSE_FILE_IO_ERROR_PROXY_AUTH_FAILED,
|
||||
GST_SPARSE_FILE_IO_ERROR_PROXY_NEED_AUTH,
|
||||
GST_SPARSE_FILE_IO_ERROR_PROXY_NOT_ALLOWED,
|
||||
GST_SPARSE_FILE_IO_ERROR_BROKEN_PIPE
|
||||
} GstSparseFileIOErrorEnum;
|
||||
|
||||
GstSparseFile * gst_sparse_file_new (void);
|
||||
void gst_sparse_file_free (GstSparseFile *file);
|
||||
|
||||
|
|
Loading…
Reference in a new issue