pike.git / src / modules / SANE / sane.c

version» Context lines:

pike.git/src/modules/SANE/sane.c:27:   #include "module_support.h"   #include "builtin_functions.h"      #include "../Image/image.h"      /* must be included last */   #include "module_magic.h"      #define sp Pike_sp    - RCSID("$Id: sane.c,v 1.11 2002/05/19 15:25:24 per Exp $"); + RCSID("$Id: sane.c,v 1.12 2002/07/28 23:59:49 nilsson Exp $");    - /* - **! module SANE - **! - **! This module enables access to the SANE (Scanner Access Now Easy) - **! library from pike - **! - **! note - **! $Id: sane.c,v 1.11 2002/05/19 15:25:24 per Exp $ + /*! @module SANE +  *! +  *! This module enables access to the SANE (Scanner Access Now Easy) +  *! library from pike   */      static int sane_is_inited;      struct scanner   {    SANE_Handle h;   };      static void init_sane()
pike.git/src/modules/SANE/sane.c:63:   static void push_device( SANE_Device *d )   {    push_text( "name" ); push_text( d->name );    push_text( "vendor" ); push_text( d->vendor );    push_text( "model" ); push_text( d->model );    push_text( "type" ); push_text( d->type );    f_aggregate_mapping( 8 );   }       - /* - **! method array(mapping) list_scanners() - **! - **! Returns an array with all available scanners. - **! - **! Example: - **! <pre> - **! Pike v0.7 release 120 running Hilfe v2.0 (Incremental Pike Frontend) - **! > SANE.list_scanners(); - **! Result: ({ - **! ([ - **! "model":"Astra 1220S ", - **! "name":"umax:/dev/scg1f", - **! "type":"flatbed scanner", - **! "vendor":"UMAX " - **! ]), - **! ([ - **! "model":"Astra 1220S ", - **! "name":"net:lain.idonex.se:umax:/dev/scg1f", - **! "type":"flatbed scanner", - **! "vendor":"UMAX " - **! ]) - **! }) - **! - **! </pre> + /*! @decl array(mapping) list_scanners() +  *! +  *! Returns an array with all available scanners. +  *! +  *! @example +  *! Pike v0.7 release 120 running Hilfe v2.0 (Incremental Pike Frontend) +  *! > SANE.list_scanners(); +  *! Result: ({ +  *! ([ +  *! "model":"Astra 1220S ", +  *! "name":"umax:/dev/scg1f", +  *! "type":"flatbed scanner", +  *! "vendor":"UMAX " +  *! ]), +  *! ([ +  *! "model":"Astra 1220S ", +  *! "name":"net:lain.idonex.se:umax:/dev/scg1f", +  *! "type":"flatbed scanner", +  *! "vendor":"UMAX " +  *! ]) +  *! })   */   static void f_list_scanners( INT32 args )   {    SANE_Device **devices;    int i = 0;       if( !sane_is_inited ) init_sane();    switch( sane_get_devices( (void *)&devices, 0 ) )    {    case 0:
pike.git/src/modules/SANE/sane.c:201:    push_text( "list" );    for( i = 0; o->constraint.string_list[i]; i++ )    push_text( o->constraint.string_list[i] );    f_aggregate( i );    f_aggregate_mapping( 4 );    break;    }    f_aggregate_mapping( sp - osp );   }    - /* - **! class Scanner - **! Scanner s = Scanner( scanner name ) + /*! @class Scanner    */ -  +  + /*! @decl void create(string name) +  */   static void f_scanner_create( INT32 args )   {    char *name;    if(!sane_is_inited) init_sane();    get_all_args( "create", args, "%s", &name );       if( sane_open( name, &THIS->h ) )    Pike_error("Failed to open scanner \"%s\"\n", name );   }    - /* - **! method array(mapping) list_options() + /*! @decl array(mapping) list_options() +  *! +  *! This method returns an array where every element is a +  *! mapping, layed out as follows. +  *! +  *! @mapping +  *! @member string "name" +  *! +  *! @member string "title" +  *! +  *! @member string "desc" +  *! +  *! @member string "type" +  *! @string +  *! @value "boolean" +  *! @value "int" +  *! @value "float" +  *! @value "string" +  *! @value "button" +  *! @value "group" +  *! @endstring +  *! @member string "unit" +  *! @string +  *! @value "none" +  *! @value "pixel" +  *! @value "bit" +  *! @value "mm" +  *! @value "dpi" +  *! @value "percent" +  *! @value "microsend" +  *! @endstring +  *! @member int "size" +  *! +  *! @member multiset "cap" +  *! @multiset +  *! @index "soft_select" +  *! @index "hard_select" +  *! @index "emulate" +  *! @index "automatic" +  *! @index "inactive" +  *! @index "advanced" +  *! @endmultiset +  *! @member int(0..0)|mapping "constraint" +  *! Constraints can be of three different types; range, word list or string +  *! list. Constraint contains 0 if there are no constraints. +  *! +  *! @mapping range +  *! @member string "type" +  *! Contains the value "range". +  *! @member int "max" +  *! @member int "min" +  *! @member int "quant" +  *! @endmapping +  *! +  *! @mapping "word list" +  *! @member string "type" +  *! Contains the value "list". +  *! @member array(float|int) "list" +  *! @endmapping +  *! +  *! @mapping "string list" +  *! @member string "type" +  *! Contains the value "list". +  *! @member array(string) "list" +  *! @endmapping +  *! @endmapping   */   static void f_scanner_list_options( INT32 args )   {    int i, n;    const SANE_Option_Descriptor *d;    pop_n_elems( args );       for( i = 1; (d = sane_get_option_descriptor( THIS->h, i) ); i++ )    push_option_descriptor( d );    f_aggregate( i-1 );
pike.git/src/modules/SANE/sane.c:243:    for( i = 1; (d = sane_get_option_descriptor( THIS->h, i ) ); i++ )    if(d->name && !strcmp( d->name, name ) )    {    *p = d;    return i;    }    Pike_error("No such option: %s\n", name );   }       - /* - **! method void set_option( string name, mixed new_value ) - **! method void set_option( string name ) - **! If no value is specified, the option is set to it's default value + /*! @decl void set_option( string name, mixed new_value ) +  *! @decl void set_option( string name ) +  *! If no value is specified, the option is set to it's default value   */   static void f_scanner_set_option( INT32 args )   {    char *name;    int no;    INT_TYPE int_value;    FLOAT_TYPE float_value;    SANE_Int tmp;    const SANE_Option_Descriptor *d;    get_all_args( "set_option", args, "%s", &name );
pike.git/src/modules/SANE/sane.c:292:    }    } else {    int_value = 1;    sane_control_option( THIS->h, no, SANE_ACTION_SET_AUTO, &int_value, &tmp );    }    pop_n_elems( args );    push_int( 0 );   }       - /* - **! method mixed get_option( string name ) + /*! @decl mixed get_option( string name )   */   static void f_scanner_get_option( INT32 args )   {    char *name;    int no;    SANE_Int int_value;    float f;    SANE_Int tmp;    const SANE_Option_Descriptor *d;    get_all_args( "get_option", args, "%s", &name );
pike.git/src/modules/SANE/sane.c:333:    case SANE_TYPE_STRING:    sane_control_option( THIS->h, no, SANE_ACTION_GET_VALUE,    &name, &tmp );    pop_n_elems( args );    push_text( name );    case SANE_TYPE_GROUP:    break;    }   }    - /* - **! method mapping(string:int) get_parameters() + /*! @decl mapping(string:int) get_parameters() +  *! +  *! @returns +  *! @mapping +  *! @member int "format" +  *! @member int "last_frame" +  *! @member int "lines" +  *! @member int "depth" +  *! @member int "pixels_per_line" +  *! @member int "bytes_per_line" +  *! @endmapping   */   static void f_scanner_get_parameters( INT32 args )   {    SANE_Parameters p;    pop_n_elems( args );    sane_get_parameters( THIS->h, &p );    push_text( "format" ); push_int( p.format );    push_text( "last_frame" ); push_int( p.last_frame );    push_text( "lines" ); push_int( p.lines );    push_text( "depth" ); push_int( p.depth );
pike.git/src/modules/SANE/sane.c:415:    {    push_text( "Image.Image" );    APPLY_MASTER( "resolv", 1 );    image_program = program_from_svalue( sp - 1 );    sp--;/* Do not free image program.. */    }    if( !image_program )    Pike_error("No Image.Image?!\n");   }    - /* - **! method Image.Image simple_scan() + /*! @decl Image.Image simple_scan()   */   static void f_scanner_simple_scan( INT32 args )   {    SANE_Parameters p;    SANE_Handle h = THIS->h;    struct object *o;    rgb_group *r;          assert_image_program();
pike.git/src/modules/SANE/sane.c:470:    get_comp_frame( h, &p, ((char *)r)+2 );    break;    }    }    while( !p.last_frame );       THREADS_DISALLOW();    push_object( o );   }    - /* - **! method void row_scan(function(Image.Image,int,Scanner:void) callback) + /*! @decl void row_scan(function(Image.Image,int,Scanner:void) callback)   */   static void f_scanner_row_scan( INT32 args )   {    SANE_Parameters p;    SANE_Handle h = THIS->h;    struct svalue *s;    struct object *o;    rgb_group *r, or;    int i, nr;   
pike.git/src/modules/SANE/sane.c:615:    {    set_read_callback( fd, 0, 0 );    free_object( c->o );    free_object( c->t );    free_svalue( &c->callback );    free( c->buffer );    free( c );    }   }    - /* - **! method void nonblocking_row_scan(function(Image.Image,int,Scanner,int:void) callback) + /*! @decl void nonblocking_row_scan(function(Image.Image,int,Scanner,int:void) callback)   */   static void f_scanner_nonblocking_row_scan( INT32 args )   {    SANE_Parameters p;    SANE_Handle h = THIS->h;    struct svalue *s;    int fd;    struct row_scan_struct *rsp;       if( sane_start( THIS->h ) ) Pike_error("Start failed\n");
pike.git/src/modules/SANE/sane.c:672:    free_object( rsp->o );    free_object( rsp->t );    free( rsp->buffer );    free( rsp );    Pike_error("Failed to get select fd for scanning device!\n");    }    set_read_callback( fd, nonblocking_row_scan_callback, (void*)rsp );    push_int( 0 );   }    + /*! @decl void cancel_scan() +  */   static void f_scanner_cancel_scan( INT32 args )   {    sane_cancel( THIS->h );   }    -  + /*! @endclass +  */ +  + /*! @decl constant FrameGray +  *! @decl constant FrameRGB +  *! @decl constant FrameRed +  *! @decl constant FrameGreen +  *! @decl cosntant FrameBlue +  */ +  + /*! @endmodule +  */ +    static void init_scanner_struct( struct object *p )   {    THIS->h = 0;   }      static void exit_scanner_struct( struct object *p )   {    if( THIS->h )    sane_close( THIS->h );   }