finish up ginputstream source

This commit is contained in:
John Cupitt 2020-12-29 16:08:45 +00:00
parent 0c53d05598
commit e23f0c58f6

View File

@ -1,7 +1,4 @@
/* A Source subclass with signals you can easily hook up to other input /* A Source subclass which wraps a ginputstream.
* sources.
*
* J.Cupitt, 21/11/19
*/ */
/* /*
@ -32,8 +29,8 @@
*/ */
/* /*
*/
#define VIPS_DEBUG #define VIPS_DEBUG
*/
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -62,9 +59,16 @@ G_DEFINE_TYPE( VipsSourceGInputStream, vips_source_g_input_stream,
VIPS_TYPE_SOURCE ); VIPS_TYPE_SOURCE );
/* TODO: /* TODO:
* - can get get a fileno out? it'd be useful if we could make * - some more docs
* vips_source_map() work for eg. vips or ppm images */
* - can we set the filename? it would let eg. openslide work
/* This will only be useful for memory and pipe-style streams. It's not
* possible to get filename or filenos from GInputStream objects.
* Without those two bits of information, important VipsSource features like
* mmap and openslide load will not work.
*
* For sources which are files on local disc, you should use
* vips_source_new_from_file() instead.
*/ */
static int static int
@ -82,9 +86,14 @@ vips_source_g_input_stream_build( VipsObject *object )
return( -1 ); return( -1 );
if( G_IS_FILE_INPUT_STREAM( source_ginput->stream ) ) { if( G_IS_FILE_INPUT_STREAM( source_ginput->stream ) ) {
const char *name;
/* It's unclear if this will ever produce useful output.
*/
if( !(source_ginput->info = g_file_input_stream_query_info( if( !(source_ginput->info = g_file_input_stream_query_info(
G_FILE_INPUT_STREAM( source_ginput->stream ), G_FILE_INPUT_STREAM( source_ginput->stream ),
G_FILE_ATTRIBUTE_STANDARD_NAME, NULL, &error )) ) { G_FILE_ATTRIBUTE_STANDARD_NAME,
NULL, &error )) ) {
vips_g_error( &error ); vips_g_error( &error );
return( -1 ); return( -1 );
} }
@ -94,21 +103,29 @@ vips_source_g_input_stream_build( VipsObject *object )
char **attributes; char **attributes;
int i; int i;
/* Swap G_FILE_ATTRIBUTE_STANDARD_NAME above for "*" to get a
* list of all available attributes.
*/
attributes = g_file_info_list_attributes( attributes = g_file_info_list_attributes(
source_ginput->info, NULL ); source_ginput->info, NULL );
printf( "stream attributes:\n" ); printf( "stream attributes:\n" );
for( i = 0; attributes[i]; i++ ) for( i = 0; attributes[i]; i++ ) {
printf( "\t%s\n", attributes[i] ); char *name = attributes[i];
char *value;
value = g_file_info_get_attribute_as_string(
source_ginput->info, name );
printf( "\t%s = %s\n", name, value );
g_free( value );
}
g_strfreev( attributes ); g_strfreev( attributes );
} }
#endif /*VIPS_DEBUG*/ #endif /*VIPS_DEBUG*/
printf( "setting filename: %s\n", if( (name = g_file_info_get_name( source_ginput->info )) )
g_file_info_get_name( source_ginput->info ) ); g_object_set( object,
"filename", name,
g_object_set( object, NULL );
"filename", g_file_info_get_name( source_ginput->info ),
NULL );
} }
if( G_IS_SEEKABLE( source_ginput->stream ) && if( G_IS_SEEKABLE( source_ginput->stream ) &&