X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fglocalfileinputstream.c;h=2b7944462869ca077f5e83149ad2a1f27f1d8999;hb=d108ada4b98cb50fb1517f55c4f09acdaf3de471;hp=bb05bb678ff94e88144b7eab49f7fcb1756e6794;hpb=f398bec5bcc0d924e2401c76a6b94133e9490835;p=platform%2Fupstream%2Fglib.git diff --git a/gio/glocalfileinputstream.c b/gio/glocalfileinputstream.c index bb05bb6..2b79444 100644 --- a/gio/glocalfileinputstream.c +++ b/gio/glocalfileinputstream.c @@ -13,9 +13,7 @@ * 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: Alexander Larsson */ @@ -25,9 +23,6 @@ #include #include #include -#ifdef HAVE_UNISTD_H -#include -#endif #include #include @@ -39,6 +34,7 @@ #include "glibintl.h" #ifdef G_OS_UNIX +#include #include "glib-unix.h" #include "gfiledescriptorbased.h" #endif @@ -47,7 +43,10 @@ #include #endif - +struct _GLocalFileInputStreamPrivate { + int fd; + guint do_close : 1; +}; #ifdef G_OS_UNIX static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); @@ -56,18 +55,14 @@ static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIfac #define g_local_file_input_stream_get_type _g_local_file_input_stream_get_type #ifdef G_OS_UNIX G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM, + G_ADD_PRIVATE (GLocalFileInputStream) G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, - g_file_descriptor_based_iface_init) -); + g_file_descriptor_based_iface_init)) #else -G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM,); +G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM, + G_ADD_PRIVATE (GLocalFileInputStream)) #endif -struct _GLocalFileInputStreamPrivate { - int fd; - guint do_close : 1; -}; - static gssize g_local_file_input_stream_read (GInputStream *stream, void *buffer, gsize count, @@ -95,12 +90,6 @@ static GFileInfo *g_local_file_input_stream_query_info (GFileInputStream *strea static int g_local_file_input_stream_get_fd (GFileDescriptorBased *stream); #endif -static void -g_local_file_input_stream_finalize (GObject *object) -{ - G_OBJECT_CLASS (g_local_file_input_stream_parent_class)->finalize (object); -} - void _g_local_file_input_stream_set_do_close (GLocalFileInputStream *in, gboolean do_close) @@ -111,13 +100,8 @@ _g_local_file_input_stream_set_do_close (GLocalFileInputStream *in, static void g_local_file_input_stream_class_init (GLocalFileInputStreamClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); GFileInputStreamClass *file_stream_class = G_FILE_INPUT_STREAM_CLASS (klass); - - g_type_class_add_private (klass, sizeof (GLocalFileInputStreamPrivate)); - - gobject_class->finalize = g_local_file_input_stream_finalize; stream_class->read_fn = g_local_file_input_stream_read; stream_class->skip = g_local_file_input_stream_skip; @@ -139,9 +123,7 @@ g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) static void g_local_file_input_stream_init (GLocalFileInputStream *info) { - info->priv = G_TYPE_INSTANCE_GET_PRIVATE (info, - G_TYPE_LOCAL_FILE_INPUT_STREAM, - GLocalFileInputStreamPrivate); + info->priv = g_local_file_input_stream_get_instance_private (info); info->priv->do_close = TRUE; } @@ -199,7 +181,7 @@ g_local_file_input_stream_skip (GInputStream *stream, GCancellable *cancellable, GError **error) { - off_t res, start; + off_t start, end; GLocalFileInputStream *file; file = G_LOCAL_FILE_INPUT_STREAM (stream); @@ -219,8 +201,8 @@ g_local_file_input_stream_skip (GInputStream *stream, return -1; } - res = lseek (file->priv->fd, count, SEEK_CUR); - if (res == -1) + end = lseek (file->priv->fd, 0, SEEK_END); + if (end == -1) { int errsv = errno; @@ -231,7 +213,22 @@ g_local_file_input_stream_skip (GInputStream *stream, return -1; } - return res - start; + if (end - start > count) + { + end = lseek (file->priv->fd, count - (end - start), SEEK_CUR); + if (end == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + return -1; + } + } + + return end - start; } static gboolean