static int get_file_func (CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context) { Camera *camera = data; int file_number=0, result; file_number = gp_filesystem_number(fs, folder, filename, context); if (file_number < 0) return (file_number); switch (type) { case GP_FILE_TYPE_NORMAL: gp_file_set_mime_type (file, GP_MIME_JPEG); result = dimagev_get_picture (camera->pl, file_number + 1, file); break; case GP_FILE_TYPE_PREVIEW: gp_file_set_mime_type (file, GP_MIME_PPM); result = dimagev_get_thumbnail (camera->pl, file_number + 1, file); break; default: return (GP_ERROR_NOT_SUPPORTED); } if (result < 0) { GP_DEBUG( "camera_file_get::unable to retrieve image file"); return result; } sleep(2); return GP_OK; }
static int get_file_func (CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context) { Camera *camera = data; int file_number=0, result; char buffer[128]; file_number = gp_filesystem_number(fs, folder, filename, context); if (file_number < 0) return (file_number); switch (type) { case GP_FILE_TYPE_NORMAL: gp_file_set_mime_type (file, GP_MIME_JPEG); gp_file_set_name (file, filename); result = dimagev_get_picture (camera->pl, file_number + 1, file); break; case GP_FILE_TYPE_PREVIEW: gp_file_set_mime_type (file, GP_MIME_PPM); #if defined HAVE_SNPRINTF snprintf(buffer, sizeof(buffer), DIMAGEV_THUMBNAIL_FMT, ( file_number + 1) ); #else sprintf(buffer, DIMAGEV_THUMBNAIL_FMT, ( file_number + 1) ); #endif gp_file_set_name (file, buffer); result = dimagev_get_thumbnail (camera->pl, file_number + 1, file); break; default: return (GP_ERROR_NOT_SUPPORTED); } if (result < 0) { GP_DEBUG( "camera_file_get::unable to retrieve image file"); return result; } sleep(2); return GP_OK; }
int dimagev_get_picture(dimagev_t *dimagev, int file_number, CameraFile *file) { int total_packets, i; unsigned long size = 0; dimagev_packet *p, *r; unsigned char char_buffer, command_buffer[3]; char *data; if ( dimagev->data->host_mode != (unsigned char) 1 ) { dimagev->data->host_mode = (unsigned char) 1; if ( dimagev_send_data(dimagev) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::unable to set host mode"); return GP_ERROR_IO; } } GP_DEBUG( "dimagev_get_picture::file_number is %d", file_number); /* Maybe check if it exists? Check the file type? */ /* First make the command packet. */ command_buffer[0] = 0x04; command_buffer[1] = (unsigned char)( file_number / 256 ); command_buffer[2] = (unsigned char)( file_number % 256 ); if ( ( p = dimagev_make_packet(command_buffer, 3, 0) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to allocate command packet"); return GP_ERROR_NO_MEMORY; } if ( gp_port_write(dimagev->dev, (char *)p->buffer, p->length) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::unable to send set_data packet"); free(p); return GP_ERROR_IO; } else if ( gp_port_read(dimagev->dev, (char *)&char_buffer, 1) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::no response from camera"); free(p); return GP_ERROR_IO; } free(p); switch ( char_buffer ) { case DIMAGEV_ACK: break; case DIMAGEV_NAK: GP_DEBUG( "dimagev_get_picture::camera did not acknowledge transmission"); return dimagev_get_picture(dimagev, file_number, file); /* return GP_ERROR_IO;*/ case DIMAGEV_CAN: GP_DEBUG( "dimagev_get_picture::camera cancels transmission"); return GP_ERROR_IO; default: GP_DEBUG( "dimagev_get_picture::camera responded with unknown value %x", char_buffer); return GP_ERROR_IO; } if ( ( p = dimagev_read_packet(dimagev) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to read packet"); return GP_ERROR_IO; } if ( ( r = dimagev_strip_packet(p) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to strip packet"); free(p); return GP_ERROR_NO_MEMORY; } free(p); total_packets = (int) r->buffer[0]; /* Allocate an extra byte just in case. */ if ( ( data = malloc((size_t)((993 * total_packets) + 1)) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to allocate buffer for file"); free(r); return GP_ERROR_NO_MEMORY; } memcpy(data, &(r->buffer[1]), (size_t) r->length ); size += ( r->length - 2 ); free(r); for ( i = 0 ; i < ( total_packets -1 ) ; i++ ) { char_buffer=DIMAGEV_ACK; if ( gp_port_write(dimagev->dev, (char *)&char_buffer, 1) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::unable to send ACK"); free(data); return GP_ERROR_IO; } if ( ( p = dimagev_read_packet(dimagev) ) == NULL ) { /* GP_DEBUG( "dimagev_get_picture::unable to read packet"); return GP_ERROR_IO; */ GP_DEBUG( "dimagev_get_picture::sending NAK to get retry"); char_buffer=DIMAGEV_NAK; if ( gp_port_write(dimagev->dev, (char *)&char_buffer, 1) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::unable to send NAK"); free(data); return GP_ERROR_IO; } if ( ( p = dimagev_read_packet(dimagev) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to read packet"); free(data); return GP_ERROR_IO; } } if ( ( r = dimagev_strip_packet(p) ) == NULL ) { GP_DEBUG( "dimagev_get_picture::unable to strip packet"); free(data); free(p); return GP_ERROR_NO_MEMORY; } free(p); memcpy(&( data[ ( size + 1) ] ), r->buffer, (size_t) r->length ); size += r->length; free(r); } size++; char_buffer=DIMAGEV_EOT; if ( gp_port_write(dimagev->dev, (char *)&char_buffer, 1) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::unable to send ACK"); free(data); return GP_ERROR_IO; } if ( gp_port_read(dimagev->dev, (char *)&char_buffer, 1) < GP_OK ) { GP_DEBUG( "dimagev_get_picture::no response from camera"); free(data); return GP_ERROR_IO; } switch ( char_buffer ) { case DIMAGEV_ACK: break; case DIMAGEV_NAK: GP_DEBUG( "dimagev_get_picture::camera did not acknowledge transmission"); free(data); return GP_ERROR_IO; case DIMAGEV_CAN: GP_DEBUG( "dimagev_get_picture::camera cancels transmission"); free(data); return GP_ERROR_IO; default: GP_DEBUG( "dimagev_get_picture::camera responded with unknown value %x", char_buffer); free(data); return GP_ERROR_IO; } gp_file_set_data_and_size (file, data, size); return GP_OK; }