| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  | /* GIO - GLib Input, IO and Streaming Library
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright (C) 2006-2007 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2022-05-18 09:12:45 +01:00
										 |  |  |  * SPDX-License-Identifier: LGPL-2.1-or-later | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2017-05-27 18:21:30 +02:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  |  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Author: Alexander Larsson <alexl@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | #include <glib/gstdio.h>
 | 
					
						
							|  |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | #include "gioerror.h"
 | 
					
						
							|  |  |  | #include "gcancellable.h"
 | 
					
						
							|  |  |  | #include "glocalfileiostream.h"
 | 
					
						
							|  |  |  | #include "glocalfileinputstream.h"
 | 
					
						
							|  |  |  | #include "glocalfileinfo.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 10:51:00 -04:00
										 |  |  | #ifdef G_OS_UNIX
 | 
					
						
							|  |  |  | #include "gfiledescriptorbased.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define g_local_file_io_stream_get_type _g_local_file_io_stream_get_type
 | 
					
						
							| 
									
										
										
										
											2014-10-17 11:54:02 +01:00
										 |  |  | G_DEFINE_TYPE (GLocalFileIOStream, g_local_file_io_stream, G_TYPE_FILE_IO_STREAM) | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_local_file_io_stream_finalize (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GLocalFileIOStream *file; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   file = G_LOCAL_FILE_IO_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_object_unref (file->input_stream); | 
					
						
							|  |  |  |   g_object_unref (file->output_stream); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   G_OBJECT_CLASS (g_local_file_io_stream_parent_class)->finalize (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GFileIOStream * | 
					
						
							|  |  |  | _g_local_file_io_stream_new (GLocalFileOutputStream *output_stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GLocalFileIOStream *stream; | 
					
						
							|  |  |  |   int fd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream = g_object_new (G_TYPE_LOCAL_FILE_IO_STREAM, NULL); | 
					
						
							| 
									
										
										
										
											2017-11-22 00:00:39 -08:00
										 |  |  |   stream->output_stream = g_object_ref (G_OUTPUT_STREAM (output_stream)); | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |   _g_local_file_output_stream_set_do_close (output_stream, FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-20 10:51:00 -04:00
										 |  |  |   fd = _g_local_file_output_stream_get_fd (output_stream); | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |   stream->input_stream = (GInputStream *)_g_local_file_input_stream_new (fd); | 
					
						
							| 
									
										
										
										
											2010-05-20 10:51:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-13 13:03:47 +02:00
										 |  |  |   _g_local_file_input_stream_set_do_close (G_LOCAL_FILE_INPUT_STREAM (stream->input_stream), | 
					
						
							|  |  |  | 					   FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return G_FILE_IO_STREAM (stream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GInputStream * | 
					
						
							|  |  |  | g_local_file_io_stream_get_input_stream (GIOStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return G_LOCAL_FILE_IO_STREAM (stream)->input_stream; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GOutputStream * | 
					
						
							|  |  |  | g_local_file_io_stream_get_output_stream (GIOStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return G_LOCAL_FILE_IO_STREAM (stream)->output_stream; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | g_local_file_io_stream_close (GIOStream  *stream, | 
					
						
							|  |  |  | 			      GCancellable   *cancellable, | 
					
						
							|  |  |  | 			      GError        **error) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GLocalFileIOStream *file = G_LOCAL_FILE_IO_STREAM (stream); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* There are shortcutted and can't fail */ | 
					
						
							|  |  |  |   g_output_stream_close (file->output_stream, cancellable, NULL); | 
					
						
							|  |  |  |   g_input_stream_close (file->input_stream, cancellable, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return | 
					
						
							|  |  |  |     _g_local_file_output_stream_really_close (G_LOCAL_FILE_OUTPUT_STREAM (file->output_stream), | 
					
						
							|  |  |  | 					      cancellable, error); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_local_file_io_stream_class_init (GLocalFileIOStreamClass *klass) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gobject_class->finalize = g_local_file_io_stream_finalize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream_class->get_input_stream = g_local_file_io_stream_get_input_stream; | 
					
						
							|  |  |  |   stream_class->get_output_stream = g_local_file_io_stream_get_output_stream; | 
					
						
							|  |  |  |   stream_class->close_fn = g_local_file_io_stream_close; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_local_file_io_stream_init (GLocalFileIOStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } |