diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2007-11-16 22:51:52 +0000 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2007-11-16 22:51:52 +0000 |
commit | 2f954b7848972681c72605ee5530ee12ad340b5f (patch) | |
tree | ba83eaedf6350e56e7ff98b721d6f6a8971e263c /camlibs/sonydscf1 | |
parent | ce998a61a5d40aa00a20a5ac3e696bc3c8c9af3d (diff) | |
download | libgphoto2-2f954b7848972681c72605ee5530ee12ad340b5f.tar.gz |
merged chotplay.c into sonydscf1.c, more cleanups
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@10871 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'camlibs/sonydscf1')
-rw-r--r-- | camlibs/sonydscf1/Makefile-files | 3 | ||||
-rw-r--r-- | camlibs/sonydscf1/chotplay.c | 486 | ||||
-rw-r--r-- | camlibs/sonydscf1/chotplay.h | 7 | ||||
-rw-r--r-- | camlibs/sonydscf1/command.c | 15 | ||||
-rw-r--r-- | camlibs/sonydscf1/sonydscf1.c | 455 |
5 files changed, 458 insertions, 508 deletions
diff --git a/camlibs/sonydscf1/Makefile-files b/camlibs/sonydscf1/Makefile-files index b6092453b..c54289073 100644 --- a/camlibs/sonydscf1/Makefile-files +++ b/camlibs/sonydscf1/Makefile-files @@ -4,8 +4,7 @@ camlibdoc_DATA += sonydscf1/README.sonydscf1 EXTRA_LTLIBRARIES += sony_dscf1.la sony_dscf1_la_SOURCES = \ - sonydscf1/command.c sonydscf1/chotplay.c \ - sonydscf1/command.h sonydscf1/chotplay.h \ + sonydscf1/command.c sonydscf1/command.h \ sonydscf1/sonydscf1.c \ sonydscf1/pmp.h sonydscf1/common.h sony_dscf1_la_LDFLAGS = $(camlib_ldflags) diff --git a/camlibs/sonydscf1/chotplay.c b/camlibs/sonydscf1/chotplay.c deleted file mode 100644 index cf77b1d55..000000000 --- a/camlibs/sonydscf1/chotplay.c +++ /dev/null @@ -1,486 +0,0 @@ -#include "config.h" -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <gphoto2/gphoto2.h> - -#include <stdlib.h> - -#if HAVE_UNISTD_H -# include <sys/types.h> -# include <unistd.h> -#endif - -#include "chotplay.h" -#include "common.h" -#include "command.h" -#include "pmp.h" - -#define MAX_PICTURE_NUM 200 - -static u_char picture_index[MAX_PICTURE_NUM]; -static u_short picture_thumbnail_index[MAX_PICTURE_NUM]; -static u_char picture_protect[MAX_PICTURE_NUM]; -static u_char picture_rotate[MAX_PICTURE_NUM]; - -static int verbose = 0; -static int errflg = 0; - -static int -make_jpeg_comment(u_char *buf, u_char *jpeg_comment) -{ - int i, cur = 0; - int reso, shutter; - - struct resolution { - int reso_val; - char *reso_conv; - } reso_tab[] = { - {PMP_FIN, "fine"}, - {PMP_STD, "standard"}, - {PMP_ECM, "economy"}, - {0, "unknown"}, - }; - - struct sh_speed { - int spd_val; - char *spd_conv; - } sh_speed_tab[] = { - {0x0123, "1/7.5"}, - {0x0187, "1/15"}, - {0x01eb, "1/30"}, - {0x024f, "1/60"}, - {0x0298, "1/100"}, - {0x031d, "1/250"}, - {0x0381, "1/500"}, - {0x03e5, "1/1000"}, - {0, "unknown"}, - }; - - jpeg_comment[0] = 0xff; - jpeg_comment[1] = 0xd8; - jpeg_comment[2] = 0xff; - jpeg_comment[3] = 0xfe; - - /* resolution */ - reso = *(buf+PMP_RESOLUTION); - - i = 0; - while (1) { - if ((reso == reso_tab[i].reso_val) || (reso_tab[i].reso_val == 0)) { - cur = 6 + sprintf(&jpeg_comment[6], "Resolution: %s\n", - reso_tab[i].reso_conv); - break; - } - i++; - } - - /* shutter speed */ - shutter = (buf[PMP_SPEED]<<8)|buf[PMP_SPEED+1]; - - i = 0; - while (1) { - if ((shutter == sh_speed_tab[i].spd_val) || - (sh_speed_tab[i].spd_val == 0)) { - cur = cur + sprintf(&jpeg_comment[cur], "Shutter-speed: %s\n", - sh_speed_tab[i].spd_conv); - break; - } - i++; - } - - /* PMP comment */ - if (*(buf+PMP_COMMENT)) { - cur = cur + sprintf(&jpeg_comment[cur], "Comment: %s\n", - (char *)(buf+PMP_COMMENT)); - } - - /* taken date */ - if (*(buf+PMP_TAKE_YEAR) == 0xff) { - cur = cur + sprintf(&jpeg_comment[cur], - "Date-Taken: ----/--/-- --:--:--\n"); - } - else { - cur = cur + sprintf(&jpeg_comment[cur], - "Date-Taken: %d/%02d/%02d %02d:%02d:%02d\n", - 2000+(*(buf+PMP_TAKE_YEAR)), *(buf+PMP_TAKE_MONTH), - *(buf+PMP_TAKE_DATE), *(buf+PMP_TAKE_HOUR), *(buf+PMP_TAKE_MINUTE), - *(buf+PMP_TAKE_SECOND)); - } - - /* edited date */ - if (*(buf+PMP_EDIT_YEAR) == 0xff) { - cur = cur + sprintf(&jpeg_comment[cur], - "Date-Edited: ----/--/-- --:--:--\n"); - } - else { - cur = cur + sprintf(&jpeg_comment[cur], - "Date-Edited: %d/%02d/%02d %02d:%02d:%02d\n", - 2000+(*(buf+PMP_EDIT_YEAR)), *(buf+PMP_EDIT_MONTH), - *(buf+PMP_EDIT_DATE), *(buf+PMP_EDIT_HOUR), *(buf+PMP_EDIT_MINUTE), - *(buf+PMP_EDIT_SECOND)); - } - - /* use flash? */ - if (*(buf+PMP_FLASH) != 0) { - cur = cur + sprintf(&jpeg_comment[cur], "Flash: on\n"); - } - - /* insert total jpeg comment length */ - jpeg_comment[4] = (u_char)((cur - 4) >> 8); - jpeg_comment[5] = (u_char)(cur - 4); - - return cur; -} - -int get_picture_information(GPPort *port,int *pmx_num, int outit) -{ - u_char buforg[PMF_MAXSIZ]; - char name[64]; - long len; - int i, n; - int j, k; - char *buf = (char *) &buforg; - - strcpy(name, "/PIC_CAM/PIC00000/PIC_INF.PMF"); - F1ok(port); - len = F1getdata(port, name, buf, 0); - - n = buf[26] * 256 + buf[27]; /* how many files */ - *pmx_num = buf[31]; /* ??? */ - - if(n ==10) - buf++; - - k = 0; - for(i = 0 ; i < (int) *pmx_num ; i++){ - for(j = 0 ; j < buforg[0x20 + 4 * i + 3]; j++){ - picture_thumbnail_index[k] = (j << 8) | buforg[0x20 + 4 * i] ; - k++; - } - } - for(i = 0 ; i < n ; i++){ - picture_index[i] = buf[0x420 + 0x10 * i + 3]; - picture_rotate[i] = buf[0x420 + 0x10 * i + 5]; - picture_protect[i] = buf[0x420 + 0x10 * i + 14]; - } - - if(outit == 2){ - fprintf(stdout," No:Internal name:Thumbnail name(Nth):Rotate:Protect\n"); - for(i = 0 ; i < n ; i++){ - fprintf(stdout,"%03d:", i + 1); - fprintf(stdout," PSN%05d.PMP:", picture_index[i]); - fprintf(stdout,"PIDX%03d.PMX(%02d) :", - 0xff & picture_thumbnail_index[i], - 0xff & (picture_thumbnail_index[i] >> 8)); - switch(picture_rotate[i]){ - case 0x00: - fprintf(stdout," 0:"); - break; - case 0x04: - fprintf(stdout," 270:"); - break; - case 0x08: - fprintf(stdout," 180:"); - break; - case 0x0c: - fprintf(stdout," 90:"); - break; - default: - fprintf(stdout," ???:"); - break; - } - if(picture_protect[i]) - fprintf(stdout,"on"); - else - fprintf(stdout,"off"); - fprintf(stdout,"\n"); - } - } - return(n); -} - -long get_file(GPPort *port,char *name, char **data, int format, int verbose) -{ - u_long filelen; - u_long total = 0; - long len,memcpylen; - char *ptr = NULL; - u_char buf[0x400]; - u_char jpeg_comment[256]; - - /* verbose=1; */ - F1ok(port); - - F1status(port,0); - - filelen = F1finfo(port,name); - if(filelen == 0) - return(0); - - if(F1fopen(port,name) != 0) - return(0); - - /* printf("camfile: %s\n",name); */ - if(format != JPEG) - return(0); - - len = F1fread(port, buf, 126); - if( len < 126){ - F1fclose(port); - return(0); - } - /*write_file(jpeg_comment, make_jpeg_comment(buf, jpeg_comment), fp);*/ - memcpylen=make_jpeg_comment(buf, jpeg_comment); - ptr = malloc(memcpylen+filelen); - *data=ptr; - ptr = memcpy(ptr,jpeg_comment,memcpylen); - total = 126; - ptr +=memcpylen; - - while((len = F1fread(port, buf, 0x0400)) != 0){ - if(len < 0) - return(0); - total = total + len; -/* gp_camera_progress(camera, ((float)total / (float)filelen)); */ - if(verbose){ - fprintf(stderr, "%6lu/", total); - fprintf(stderr, "%6lu", filelen); - fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b"); - } - /*result = fwrite(buf, sizeof(u_char), (size_t) len, fp);*/ - memcpylen=len; - ptr = memcpy(ptr,buf,memcpylen); - ptr +=memcpylen; - - } - - F1fclose(port); - if(verbose) - fprintf(stderr, "\n"); - return(total); -} - -long get_thumbnail(GPPort *port,char *name, char **data, int format, int verbose, int n) -{ - u_long filelen; - u_long total = 0; - long len; - int i; - u_char buf[0x1000]; - u_char *p; - char *ptr; - /* printf("name %s,%d\n",name,n); */ - p = buf; - - F1ok(port); - F1status(port,0); - - filelen = F1finfo(port,name); - if(filelen == 0) - return(0); - - if(F1fopen(port,name) != 0) - return(0); - - for( i = 0 ; i < n ; i++) - len = F1fseek(port, 0x1000, 1); - - while((len = F1fread(port, p, 0x0400)) != 0){ - if(len < 0){ - F1fclose(port); - return(0); - } - total = total + len; - if(verbose){ - fprintf(stderr, "%4lu/", total); - fprintf(stderr, "%4u", 0x1000); - fprintf(stderr, "\b\b\b\b\b\b\b\b\b"); - } - p = p + len; - if(total >= 0x1000) - break; - } - F1fclose(port); - if(verbose) - fprintf(stderr, "\n"); - - filelen = buf[12] * 0x1000000 + buf[13] * 0x10000 + - buf[14] * 0x100 + buf[15]; - - ptr = malloc(filelen); - *data=ptr; - ptr = memcpy(ptr,&buf[256],filelen); - - /* write_file(&buf[256], (int) filelen, fp); */ - return(total); -} - -void get_date_info(GPPort *port, char *name, char *outfilename ,char *newfilename) -{ - char *p, *q; - int year = 0; - int month = 0; - int date = 0; - int hour = 0; - int minute = 0; - int second = 0; - u_char buf[128]; - - F1ok(port); - F1status(port,0); - - (void) F1finfo(port, name); - if(F1fopen(port, name) ==0){ - if(F1fread(port, buf, 126) == 126){ - if(*(buf+PMP_TAKE_YEAR) != 0xff){ - year = (int) *(buf+PMP_TAKE_YEAR); - month = (int) *(buf+PMP_TAKE_MONTH); - date = (int) *(buf+PMP_TAKE_DATE); - hour = (int) *(buf+PMP_TAKE_HOUR); - minute = (int) *(buf+PMP_TAKE_MINUTE); - second = (int) *(buf+PMP_TAKE_SECOND); - } - } - F1fclose(port); - } - - p = outfilename; - q = newfilename; - while(*p){ - if(*p == '%'){ - p++; - switch(*p){ - case '%': - *q = '%'; - break; - case 'H': - q = q + sprintf(q, "%02d", hour); - break; - case 'M': - q = q + sprintf(q, "%02d", minute); - break; - case 'S': - q = q + sprintf(q, "%02d", second); - break; - case 'T': -#ifdef BINARYFILEMODE - q = q + sprintf(q, "%02d%02d%02d", hour, minute, date); -#else - q = q + sprintf(q, "%02d:%02d:%02d", hour, minute, date); -#endif - break; - case 'y': - q = q + sprintf(q, "%02d", year); - break; - case 'm': - q = q + sprintf(q, "%02d", month); - break; - case 'd': - q = q + sprintf(q, "%02d", date); - break; - case 'D': -#ifdef BINARYFILEMODE - q = q + sprintf(q, "%02d%02d%02d", year, month, date); -#else - q = q + sprintf(q, "%02d_%02d_%02d", year, month, date); -#endif - break; - default: - q = q + sprintf(q, "%%%c", *p); - break; - } - p++; - }else - *q++ = *p++; - } - *q = 0; - -} - -long get_picture(GPPort *port, int n, char **data, int format, int ignore, int all_pic_num) -{ - long len; - char name[64]; - char name2[64]; - int i; - - all_pic_num = get_picture_information(port,&i,0); - -retry: - - if (all_pic_num < n) { - fprintf(stderr, "picture number %d is too large. %d\n",all_pic_num,n); - errflg ++; - return(GP_ERROR); - } - - switch(format){ - case PMX: - sprintf(name, "/PIC_CAM/PIC00000/PIDX%03d.PMX", n - 1); - break; - case JPEG_T: - sprintf(name, "/PIC_CAM/PIC00000/PIDX%03d.PMX", - (picture_thumbnail_index[n] & 0xff)); - break; - case JPEG: - case PMP: - default: - if(ignore) - sprintf(name, "/PIC_CAM/PIC00000/PSN%05d.PMP", n); - else - sprintf(name, "/PIC_CAM/PIC00000/PSN%05d.PMP", picture_index[n]); - break; - } - if(ignore) - sprintf(name2, "/PIC_CAM/PIC00000/PSN%05d.PMP", n ); - else - sprintf(name2, "/PIC_CAM/PIC00000/PSN%05d.PMP", picture_index[n]); - - /* printf("name %s, name2 %s, %d\n",name,name2,n); */ - - if(verbose) - switch(format){ - case PMX: - fprintf(stdout, "pidx%03d.pmx: ", n -1 ); - break; - case JPEG_T: - fprintf(stderr, "Thumbnail %03d: ", n); - break; - case PMP: - case JPEG: - default: - fprintf(stdout, "Picture %03d: ", n); - break; - } - - if(format == JPEG_T) - len = get_thumbnail(port, name, data, format, verbose, - 0xff & (picture_thumbnail_index[n] >> 8)); - else - len = get_file(port, name, data, format, verbose); - if(len == 0 ) { - if(verbose) - fprintf(stderr, "\n"); - goto retry; - } - - if (len < 0) - errflg ++; - - return(len); -} - -int -delete_picture(GPPort *port, int n, int all_pic_num) { - if (all_pic_num < n) { - gp_log (GP_LOG_ERROR, "delete_picture", "picture number %d is too large. %d",n,all_pic_num); - return GP_ERROR; - } - - if(picture_protect[n-1] != 0x00){ - gp_log (GP_LOG_DEBUG, "delete_picture", "picture %d is protected.", n); - return GP_ERROR; - } - return F1deletepicture(port, picture_index[n]); -} diff --git a/camlibs/sonydscf1/chotplay.h b/camlibs/sonydscf1/chotplay.h deleted file mode 100644 index 9c0617470..000000000 --- a/camlibs/sonydscf1/chotplay.h +++ /dev/null @@ -1,7 +0,0 @@ -int get_picture_information (GPPort *,int *, int); -long get_file(GPPort*,char *name, char **data, int format, int verbose); -long get_thumbnail(GPPort*,char *name, char **data, int format, int verbose, int n); -void get_date_info (GPPort*,char *, char * ,char *); -long get_picture (GPPort*,int, char **, int, int, int); -void get_all_pictures (GPPort*,int, int, char *, int, int); -int delete_picture (GPPort*,int, int); diff --git a/camlibs/sonydscf1/command.c b/camlibs/sonydscf1/command.c index 893f25a77..700a89c56 100644 --- a/camlibs/sonydscf1/command.c +++ b/camlibs/sonydscf1/command.c @@ -3,21 +3,13 @@ #include <stdio.h> #include <string.h> #include <sys/types.h> -#if HAVE_UNISTD_H #include <unistd.h> -#endif #include <gphoto2/gphoto2.h> #include "command.h" #include "common.h" -#ifdef DEBUG -#define dprintf(x) printf x -#else -#define dprintf(x) -#endif - static u_char address = 0; static const u_char sendaddr[8] = { 0x00, 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee }; static const u_char recvaddr[8] = { 0x0e, 0x20, 0x42, 0x64, 0x86, 0xa8, 0xca, 0xec }; @@ -32,12 +24,11 @@ static const u_char EOFRAME = 0xC1; static int F1reset(GPPort *port); -static void wbyte(GPPort *port,u_char c) +static int +wbyte(GPPort *port,u_char c) { u_char temp = c; - if( gp_port_write(port, (char*)&temp, 1) <0) { - perror("wbyte"); - } + return gp_port_write(port, (char*)&temp, 1); } static u_char diff --git a/camlibs/sonydscf1/sonydscf1.c b/camlibs/sonydscf1/sonydscf1.c index 9b90bf68c..bf7478a73 100644 --- a/camlibs/sonydscf1/sonydscf1.c +++ b/camlibs/sonydscf1/sonydscf1.c @@ -3,6 +3,7 @@ #include <stdio.h> #include <string.h> +#include <stdlib.h> #include <gphoto2/gphoto2.h> @@ -20,8 +21,460 @@ # define N_(String) (String) #endif +#include "common.h" #include "command.h" -#include "chotplay.h" +#include "pmp.h" + +#define MAX_PICTURE_NUM 200 + +static u_char picture_index[MAX_PICTURE_NUM]; +static u_short picture_thumbnail_index[MAX_PICTURE_NUM]; +static u_char picture_protect[MAX_PICTURE_NUM]; +static u_char picture_rotate[MAX_PICTURE_NUM]; + +static int errflg = 0; + +static int +make_jpeg_comment(u_char *buf, u_char *jpeg_comment) +{ + int i, cur = 0; + int reso, shutter; + + struct resolution { + int reso_val; + char *reso_conv; + } reso_tab[] = { + {PMP_FIN, "fine"}, + {PMP_STD, "standard"}, + {PMP_ECM, "economy"}, + {0, "unknown"}, + }; + + struct sh_speed { + int spd_val; + char *spd_conv; + } sh_speed_tab[] = { + {0x0123, "1/7.5"}, + {0x0187, "1/15"}, + {0x01eb, "1/30"}, + {0x024f, "1/60"}, + {0x0298, "1/100"}, + {0x031d, "1/250"}, + {0x0381, "1/500"}, + {0x03e5, "1/1000"}, + {0, "unknown"}, + }; + + jpeg_comment[0] = 0xff; + jpeg_comment[1] = 0xd8; + jpeg_comment[2] = 0xff; + jpeg_comment[3] = 0xfe; + + /* resolution */ + reso = *(buf+PMP_RESOLUTION); + + i = 0; + while (1) { + if ((reso == reso_tab[i].reso_val) || (reso_tab[i].reso_val == 0)) { + cur = 6 + sprintf(&jpeg_comment[6], "Resolution: %s\n", + reso_tab[i].reso_conv); + break; + } + i++; + } + + /* shutter speed */ + shutter = (buf[PMP_SPEED]<<8)|buf[PMP_SPEED+1]; + + i = 0; + while (1) { + if ((shutter == sh_speed_tab[i].spd_val) || + (sh_speed_tab[i].spd_val == 0)) { + cur = cur + sprintf(&jpeg_comment[cur], "Shutter-speed: %s\n", + sh_speed_tab[i].spd_conv); + break; + } + i++; + } + + /* PMP comment */ + if (*(buf+PMP_COMMENT)) { + cur = cur + sprintf(&jpeg_comment[cur], "Comment: %s\n", + (char *)(buf+PMP_COMMENT)); + } + + /* taken date */ + if (*(buf+PMP_TAKE_YEAR) == 0xff) { + cur = cur + sprintf(&jpeg_comment[cur], + "Date-Taken: ----/--/-- --:--:--\n"); + } + else { + cur = cur + sprintf(&jpeg_comment[cur], + "Date-Taken: %d/%02d/%02d %02d:%02d:%02d\n", + 2000+(*(buf+PMP_TAKE_YEAR)), *(buf+PMP_TAKE_MONTH), + *(buf+PMP_TAKE_DATE), *(buf+PMP_TAKE_HOUR), *(buf+PMP_TAKE_MINUTE), + *(buf+PMP_TAKE_SECOND)); + } + + /* edited date */ + if (*(buf+PMP_EDIT_YEAR) == 0xff) { + cur = cur + sprintf(&jpeg_comment[cur], + "Date-Edited: ----/--/-- --:--:--\n"); + } + else { + cur = cur + sprintf(&jpeg_comment[cur], + "Date-Edited: %d/%02d/%02d %02d:%02d:%02d\n", + 2000+(*(buf+PMP_EDIT_YEAR)), *(buf+PMP_EDIT_MONTH), + *(buf+PMP_EDIT_DATE), *(buf+PMP_EDIT_HOUR), *(buf+PMP_EDIT_MINUTE), + *(buf+PMP_EDIT_SECOND)); + } + + /* use flash? */ + if (*(buf+PMP_FLASH) != 0) { + cur = cur + sprintf(&jpeg_comment[cur], "Flash: on\n"); + } + + /* insert total jpeg comment length */ + jpeg_comment[4] = (u_char)((cur - 4) >> 8); + jpeg_comment[5] = (u_char)(cur - 4); + + return cur; +} + +static int +get_picture_information(GPPort *port,int *pmx_num, int outit) +{ + u_char buforg[PMF_MAXSIZ]; + char name[64]; + long len; + int i, n; + int j, k; + char *buf = (char *) &buforg; + + strcpy(name, "/PIC_CAM/PIC00000/PIC_INF.PMF"); + F1ok(port); + len = F1getdata(port, name, buf, 0); + + n = buf[26] * 256 + buf[27]; /* how many files */ + *pmx_num = buf[31]; /* ??? */ + + if(n ==10) + buf++; + + k = 0; + for(i = 0 ; i < (int) *pmx_num ; i++){ + for(j = 0 ; j < buforg[0x20 + 4 * i + 3]; j++){ + picture_thumbnail_index[k] = (j << 8) | buforg[0x20 + 4 * i] ; + k++; + } + } + for(i = 0 ; i < n ; i++){ + picture_index[i] = buf[0x420 + 0x10 * i + 3]; + picture_rotate[i] = buf[0x420 + 0x10 * i + 5]; + picture_protect[i] = buf[0x420 + 0x10 * i + 14]; + } + + if(outit == 2){ + fprintf(stdout," No:Internal name:Thumbnail name(Nth):Rotate:Protect\n"); + for(i = 0 ; i < n ; i++){ + fprintf(stdout,"%03d:", i + 1); + fprintf(stdout," PSN%05d.PMP:", picture_index[i]); + fprintf(stdout,"PIDX%03d.PMX(%02d) :", + 0xff & picture_thumbnail_index[i], + 0xff & (picture_thumbnail_index[i] >> 8)); + switch(picture_rotate[i]){ + case 0x00: + fprintf(stdout," 0:"); + break; + case 0x04: + fprintf(stdout," 270:"); + break; + case 0x08: + fprintf(stdout," 180:"); + break; + case 0x0c: + fprintf(stdout," 90:"); + break; + default: + fprintf(stdout," ???:"); + break; + } + if(picture_protect[i]) + fprintf(stdout,"on"); + else + fprintf(stdout,"off"); + fprintf(stdout,"\n"); + } + } + return(n); +} + +static long +get_file(GPPort *port,char *name, char **data, int format) +{ + u_long filelen; + u_long total = 0; + long len,memcpylen; + char *ptr = NULL; + u_char buf[0x400]; + u_char jpeg_comment[256]; + + F1ok(port); + F1status(port,0); + + filelen = F1finfo(port,name); + if(filelen == 0) + return(0); + + if(F1fopen(port,name) != 0) + return(0); + + if(format != JPEG) + return(0); + + len = F1fread(port, buf, 126); + if( len < 126){ + F1fclose(port); + return(0); + } + memcpylen=make_jpeg_comment(buf, jpeg_comment); + ptr = malloc(memcpylen+filelen); + *data=ptr; + ptr = memcpy(ptr,jpeg_comment,memcpylen); + total = 126; + ptr +=memcpylen; + + while((len = F1fread(port, buf, 0x0400)) != 0){ + if(len < 0) + return(0); + total = total + len; +/* gp_camera_progress(camera, ((float)total / (float)filelen)); */ + memcpylen=len; + ptr = memcpy(ptr,buf,memcpylen); + ptr +=memcpylen; + + } + F1fclose(port); + return(total); +} + +static long +get_thumbnail(GPPort *port,char *name, char **data, int format, int n) +{ + u_long filelen; + u_long total = 0; + long len; + int i; + u_char buf[0x1000]; + u_char *p; + char *ptr; + /* printf("name %s,%d\n",name,n); */ + p = buf; + + F1ok(port); + F1status(port,0); + + filelen = F1finfo(port,name); + if(filelen == 0) + return(0); + + if(F1fopen(port,name) != 0) + return(0); + + for( i = 0 ; i < n ; i++) + len = F1fseek(port, 0x1000, 1); + + while((len = F1fread(port, p, 0x0400)) != 0){ + if(len < 0){ + F1fclose(port); + return(0); + } + total = total + len; + p = p + len; + if(total >= 0x1000) + break; + } + F1fclose(port); + + filelen = buf[12] * 0x1000000 + buf[13] * 0x10000 + + buf[14] * 0x100 + buf[15]; + + ptr = malloc(filelen); + *data=ptr; + ptr = memcpy(ptr,&buf[256],filelen); + + /* write_file(&buf[256], (int) filelen, fp); */ + return(total); +} + +static void +get_date_info(GPPort *port, char *name, char *outfilename ,char *newfilename) +{ + char *p, *q; + int year = 0; + int month = 0; + int date = 0; + int hour = 0; + int minute = 0; + int second = 0; + u_char buf[128]; + + F1ok(port); + F1status(port,0); + + (void) F1finfo(port, name); + if(F1fopen(port, name) ==0){ + if(F1fread(port, buf, 126) == 126){ + if(*(buf+PMP_TAKE_YEAR) != 0xff){ + year = (int) *(buf+PMP_TAKE_YEAR); + month = (int) *(buf+PMP_TAKE_MONTH); + date = (int) *(buf+PMP_TAKE_DATE); + hour = (int) *(buf+PMP_TAKE_HOUR); + minute = (int) *(buf+PMP_TAKE_MINUTE); + second = (int) *(buf+PMP_TAKE_SECOND); + } + } + F1fclose(port); + } + + p = outfilename; + q = newfilename; + while(*p){ + if(*p == '%'){ + p++; + switch(*p){ + case '%': + *q = '%'; + break; + case 'H': + q = q + sprintf(q, "%02d", hour); + break; + case 'M': + q = q + sprintf(q, "%02d", minute); + break; + case 'S': + q = q + sprintf(q, "%02d", second); + break; + case 'T': +#ifdef BINARYFILEMODE + q = q + sprintf(q, "%02d%02d%02d", hour, minute, date); +#else + q = q + sprintf(q, "%02d:%02d:%02d", hour, minute, date); +#endif + break; + case 'y': + q = q + sprintf(q, "%02d", year); + break; + case 'm': + q = q + sprintf(q, "%02d", month); + break; + case 'd': + q = q + sprintf(q, "%02d", date); + break; + case 'D': +#ifdef BINARYFILEMODE + q = q + sprintf(q, "%02d%02d%02d", year, month, date); +#else + q = q + sprintf(q, "%02d_%02d_%02d", year, month, date); +#endif + break; + default: + q = q + sprintf(q, "%%%c", *p); + break; + } + p++; + }else + *q++ = *p++; + } + *q = 0; + +} + +static long +get_picture(GPPort *port, int n, char **data, int format, int ignore, int all_pic_num) +{ + long len; + char name[64]; + char name2[64]; + int i; + + all_pic_num = get_picture_information(port,&i,0); + +retry: + + if (all_pic_num < n) { + fprintf(stderr, "picture number %d is too large. %d\n",all_pic_num,n); + errflg ++; + return(GP_ERROR); + } + + switch(format){ + case PMX: + sprintf(name, "/PIC_CAM/PIC00000/PIDX%03d.PMX", n - 1); + break; + case JPEG_T: + sprintf(name, "/PIC_CAM/PIC00000/PIDX%03d.PMX", + (picture_thumbnail_index[n] & 0xff)); + break; + case JPEG: + case PMP: + default: + if(ignore) + sprintf(name, "/PIC_CAM/PIC00000/PSN%05d.PMP", n); + else + sprintf(name, "/PIC_CAM/PIC00000/PSN%05d.PMP", picture_index[n]); + break; + } + if(ignore) + sprintf(name2, "/PIC_CAM/PIC00000/PSN%05d.PMP", n ); + else + sprintf(name2, "/PIC_CAM/PIC00000/PSN%05d.PMP", picture_index[n]); + + /* printf("name %s, name2 %s, %d\n",name,name2,n); */ + + if(0) + switch(format){ + case PMX: + fprintf(stdout, "pidx%03d.pmx: ", n -1 ); + break; + case JPEG_T: + fprintf(stderr, "Thumbnail %03d: ", n); + break; + case PMP: + case JPEG: + default: + fprintf(stdout, "Picture %03d: ", n); + break; + } + + if(format == JPEG_T) + len = get_thumbnail(port, name, data, format, + 0xff & (picture_thumbnail_index[n] >> 8)); + else + len = get_file(port, name, data, format); + if(len == 0 ) { + goto retry; + } + + if (len < 0) + errflg ++; + + return(len); +} + +static int +delete_picture(GPPort *port, int n, int all_pic_num) { + if (all_pic_num < n) { + gp_log (GP_LOG_ERROR, "delete_picture", "picture number %d is too large. %d",n,all_pic_num); + return GP_ERROR; + } + + if(picture_protect[n-1] != 0x00){ + gp_log (GP_LOG_DEBUG, "delete_picture", "picture %d is protected.", n); + return GP_ERROR; + } + return F1deletepicture(port, picture_index[n]); +} int camera_id (CameraText *id) { |