diff options
-rw-r--r-- | camlibs/canon/canon.c | 185 | ||||
-rw-r--r-- | camlibs/canon/canon.h | 150 | ||||
-rw-r--r-- | camlibs/canon/library.c | 22 | ||||
-rw-r--r-- | camlibs/canon/serial.c | 13 | ||||
-rw-r--r-- | camlibs/canon/usb.c | 293 |
5 files changed, 256 insertions, 407 deletions
diff --git a/camlibs/canon/canon.c b/camlibs/canon/canon.c index 85a2e7612..9f1097b4c 100644 --- a/camlibs/canon/canon.c +++ b/camlibs/canon/canon.c @@ -98,107 +98,111 @@ const struct canonCamModelData models[] = { /* *INDENT-OFF* */ - {"Canon:PowerShot A5", CANON_PS_A5, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "DE300 Canon Inc."}, - {"Canon:PowerShot A5 Zoom", CANON_PS_A5_ZOOM, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot A5 Zoom"}, - {"Canon:PowerShot A50", CANON_PS_A50, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot A50"}, - {"Canon:PowerShot Pro70", CANON_PS_PRO70, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot Pro70"}, - {"Canon:PowerShot S10", CANON_PS_S10, 0x04A9, 0x3041, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot S10"}, - - {"Canon:PowerShot S20", CANON_PS_S20, 0x04A9, 0x3043, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot S20"}, - {"Canon:EOS D30", CANON_EOS_D30, 0x04A9, 0x3044, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S100", CANON_PS_S100, 0x04A9, 0x3045, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:IXY DIGITAL", CANON_PS_S100, 0x04A9, 0x3046, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS", CANON_PS_S100, 0x04A9, 0x3047, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot G1", CANON_PS_G1, 0x04A9, 0x3048, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot G1"}, - {"Canon:PowerShot Pro90 IS", CANON_PS_PRO90_IS, 0x04A9, 0x3049, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot Pro90 IS"}, - - {"Canon:IXY DIGITAL 300", CANON_PS_S300, 0x04A9, 0x304B, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S300", CANON_PS_S300, 0x04A9, 0x304C, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS 300", CANON_PS_S300, 0x04A9, 0x304D, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A20", CANON_PS_A20, 0x04A9, 0x304E, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A10", CANON_PS_A10, 0x04A9, 0x304F, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A5", CANON_CLASS_3, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "DE300 Canon Inc."}, + {"Canon:PowerShot A5 Zoom", CANON_CLASS_3, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot A5 Zoom"}, + {"Canon:PowerShot A50", CANON_CLASS_1, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot A50"}, + {"Canon:PowerShot Pro70", CANON_CLASS_2, NO_USB, NO_USB, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot Pro70"}, + {"Canon:PowerShot S10", CANON_CLASS_0, 0x04A9, 0x3041, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot S10"}, + + {"Canon:PowerShot S20", CANON_CLASS_0, 0x04A9, 0x3043, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot S20"}, + {"Canon:EOS D30", CANON_CLASS_4, 0x04A9, 0x3044, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S100", CANON_CLASS_0, 0x04A9, 0x3045, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:IXY DIGITAL", CANON_CLASS_0, 0x04A9, 0x3046, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS", CANON_CLASS_0, 0x04A9, 0x3047, CAP_NON, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot G1", CANON_CLASS_0, 0x04A9, 0x3048, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot G1"}, + {"Canon:PowerShot Pro90 IS", CANON_CLASS_0, 0x04A9, 0x3049, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, "Canon PowerShot Pro90 IS"}, + + {"Canon:IXY DIGITAL 300", CANON_CLASS_1, 0x04A9, 0x304B, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S300", CANON_CLASS_1, 0x04A9, 0x304C, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS 300", CANON_CLASS_1, 0x04A9, 0x304D, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A20", CANON_CLASS_1, 0x04A9, 0x304E, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A10", CANON_CLASS_1, 0x04A9, 0x304F, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* Mac OS includes this as a valid ID; don't know which camera model --swestin */ - {"Canon:PowerShot unknown 1", CANON_PS_UNK1, 0x04A9, 0x3050, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot unknown 1", CANON_CLASS_1, 0x04A9, 0x3050, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* Canon IXY DIGITAL 200 here? */ - {"Canon:PowerShot S110", CANON_PS_S100, 0x04A9, 0x3051, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:DIGITAL IXUS v", CANON_PS_S100, 0x04A9, 0x3052, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S110", CANON_CLASS_0, 0x04A9, 0x3051, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:DIGITAL IXUS v", CANON_CLASS_0, 0x04A9, 0x3052, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot G2", CANON_PS_G2, 0x04A9, 0x3055, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S40", CANON_PS_S40, 0x04A9, 0x3056, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S30", CANON_PS_S30, 0x04A9, 0x3057, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A40", CANON_PS_A40, 0x04A9, 0x3058, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A30", CANON_PS_A30, 0x04A9, 0x3059, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot G2", CANON_CLASS_1, 0x04A9, 0x3055, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S40", CANON_CLASS_1, 0x04A9, 0x3056, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S30", CANON_CLASS_1, 0x04A9, 0x3057, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A40", CANON_CLASS_1, 0x04A9, 0x3058, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A30", CANON_CLASS_1, 0x04A9, 0x3059, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* 305c is in MacOS Info.plist, but I don't know what it is --swestin. */ - {"Canon:PowerShot unknown 2", CANON_PS_UNK2, 0x04A9, 0x305c, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot unknown 2", CANON_CLASS_1, 0x04A9, 0x305c, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:EOS D60", CANON_EOS_D60, 0x04A9, 0x3060, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A100", CANON_PS_A100, 0x04A9, 0x3061, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A200", CANON_PS_A200, 0x04A9, 0x3062, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:EOS D60", CANON_CLASS_4, 0x04A9, 0x3060, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A100", CANON_CLASS_1, 0x04A9, 0x3061, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A200", CANON_CLASS_1, 0x04A9, 0x3062, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S200", CANON_PS_S200, 0x04A9, 0x3065, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS v2", CANON_PS_S200, 0x04A9, 0x3065, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS 330", CANON_PS_S330, 0x04A9, 0x3066, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S200", CANON_CLASS_1, 0x04A9, 0x3065, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS v2", CANON_CLASS_1, 0x04A9, 0x3065, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS 330", CANON_CLASS_1, 0x04A9, 0x3066, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* 306a is in MacOS Info.plist, but I don't know what it is --swestin. */ - {"Canon:Digital unknown 3", CANON_PS_UNK3, 0x04A9, 0x306a, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - /* Canon MVX2i in some mode is 0x3067 - probably PTP */ - {"Canon:MVX2i", CANON_OPT_200, 0x04A9, 0x306B, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Optura 200 MC", CANON_OPT_200, 0x04A9, 0x306B, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S45 (normal mode)", CANON_PS_S45, 0x04A9, 0x306C, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital unknown 3", CANON_CLASS_1, 0x04A9, 0x306a, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + /* Apparently the MVX2i is the same as Optura 200 MC (Philippe + * Gramoulle), so share the code. */ + {"Canon:MVX2i", CANON_CLASS_1, 0x04A9, 0x306B, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Optura 200 MC", CANON_CLASS_1, 0x04A9, 0x306B, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S45 (normal mode)", CANON_CLASS_5, 0x04A9, 0x306C, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* 0x306D is S45 in PTP mode */ - {"Canon:PowerShot G3 (normal mode)", CANON_PS_G3, 0x04A9, 0x306E, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot G3 (normal mode)", CANON_CLASS_5, 0x04A9, 0x306E, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* 0x306F is G3 in PTP mode */ - {"Canon:PowerShot S230 (normal mode)", CANON_PS_S230, 0x04A9, 0x3070, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS v3 (normal mode)", CANON_PS_S230, 0x04A9, 0x3070, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S230 (normal mode)", CANON_CLASS_4, 0x04A9, 0x3070, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS v3 (normal mode)", CANON_CLASS_4, 0x04A9, 0x3070, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* 0x3071 is S230/IXUS v3 in PTP mode */ - {"Canon:PowerShot SD100 (normal mode)", CANON_PS_SD100, 0x04A9, 0x3072, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS II (normal mode)", CANON_PS_SD100, 0x04A9, 0x3072, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot SD100 (normal mode)", CANON_CLASS_5, 0x04A9, 0x3072, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS II (normal mode)", CANON_CLASS_5, 0x04A9, 0x3072, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* added from report on mailinglist. XXX: assuming capture works -Marcus */ /* PS A70 uses the same ProductID for PTP and Canon, with protocol autodetection */ - {"Canon:PowerShot A70", CANON_PS_A70, 0x04A9, 0x3073, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A70", CANON_CLASS_5, 0x04A9, 0x3073, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* PS A60 uses the same ProductID for PTP and Canon, with protocol autodetection */ - {"Canon:PowerShot A60", CANON_PS_A60, 0x04A9, 0x3074, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A60", CANON_CLASS_5, 0x04A9, 0x3074, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, /* reported working on SourceForge patch tracker. */ - {"Canon:Digital IXUS 400", CANON_PS_S400, 0x04A9, 0x3075, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - /* PS S400 used the same ProductID for PTP and Canon, with protocol autodetection */ - {"Canon:PowerShot S400", CANON_PS_S400, 0x04A9, 0x3075, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + /* PS S400 uses the same ProductID for PTP and Canon, with protocol autodetection */ + {"Canon:Digital IXUS 400", CANON_CLASS_4, 0x04A9, 0x3075, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S400", CANON_CLASS_4, 0x04A9, 0x3075, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A300", CANON_PS_A300, 0x04A9, 0x3076, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S50 (normal mode)", CANON_PS_S50, 0x04A9, 0x3077, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A300", CANON_CLASS_4, 0x04A9, 0x3076, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S50 (normal mode)", CANON_CLASS_4, 0x04A9, 0x3077, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:ZR70MC", CANON_CLASS_5, 0x04A9, 0x3078, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:ZR70MC", CANON_ZR70MC, 0x04A9, 0x3078, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - - /* 3078 and 307a are in MacOS Info.plist, but I don't know - * what they are --swestin. */ - {"Canon:PowerShot unknown 5", CANON_PS_UNK5, 0x04A9, 0x307a, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + /* 307a is in MacOS Info.plist, but I don't know what it is + * --swestin. */ + {"Canon:PowerShot unknown 5", CANON_CLASS_5, 0x04A9, 0x307a, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* MV630i is a DV camcorder */ - {"Canon:MV630i", CANON_MV630I, 0x04A9, 0x307b, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:MV650i", CANON_MV650I, 0x04A9, 0x3079, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Optura 20", CANON_OPT_20, 0x04A9, 0x307f, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Optura 10", CANON_OPT_10, 0x04A9, 0x3081, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:MV630i", CANON_CLASS_5, 0x04A9, 0x307b, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:MV650i", CANON_CLASS_5, 0x04A9, 0x3079, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + + {"Canon:Optura 20", CANON_CLASS_5, 0x04A9, 0x307f, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Optura 10", CANON_CLASS_5, 0x04A9, 0x3081, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + + {"Canon:EOS 10D", CANON_CLASS_4, 0x04A9, 0x3083, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:EOS 300D (normal mode)", CANON_CLASS_4, 0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:EOS Digital Rebel (normal mode)",CANON_CLASS_4, 0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:EOS Kiss Digital (normal mode)",CANON_CLASS_4, 0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:EOS 10D", CANON_EOS_10D, 0x04A9, 0x3083, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - /* 0x3099 is the EOS 300D/Digital Rebel in PTP mode */ - {"Canon:EOS 300D (normal mode)", CANON_EOS_300D, 0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:EOS Digital Rebel (normal mode)",CANON_EOS_300D,0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:EOS Kiss Digital (normal mode)",CANON_EOS_300D, 0x04A9, 0x3084, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, /* PS G5 uses the same ProductID for PTP and Canon, with protocol autodetection */ - {"Canon:PowerShot G5 (normal mode)", CANON_PS_G5, 0x04A9, 0x3085, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot G5 (normal mode)", CANON_CLASS_5, 0x04A9, 0x3085, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + /* Canon MVX3i / Optura Xi uses 308d in PTP mode; 3089 in Canon mode? */ - {"Canon:PowerShot A80 (normal mode)",CANON_PS_A80, 0x04A9, 0x309A, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S60 (normal mode)", CANON_PS_S60, 0x04A9, 0x30b2, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS 500 (normal mode)",CANON_PS_S500, 0x04A9, 0x30b4, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A75", CANON_PS_A75, 0x04A9, 0x30b5, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A400", CANON_PS_A400, 0x04A9, 0x30b7, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A310", CANON_PS_A310, 0x04A9, 0x30b8, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A85 (normal mode)",CANON_PS_A85, 0x04A9, 0x30b9, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot S410 (normal mode)",CANON_PS_S410, 0x04A9, 0x30ba, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:Digital IXUS 430 (normal mode)",CANON_PS_S410, 0x04A9, 0x30ba, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot A95 (normal mode)",CANON_PS_A95, 0x04A9, 0x30bb, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:PowerShot SD20 (normal mode)",CANON_PS_SD20, 0x04A9, 0x30c4, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, - {"Canon:EOS 20D (normal mode)",CANON_EOS_20D, 0x04A9, 0x30eb, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + + /* 0x3099 is the EOS 300D/Digital Rebel in PTP mode */ + {"Canon:PowerShot A80 (normal mode)", CANON_CLASS_1, 0x04A9, 0x309A, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S60 (normal mode)", CANON_CLASS_5, 0x04A9, 0x30b2, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS 500 (normal mode)",CANON_CLASS_5, 0x04A9, 0x30b4, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A75", CANON_CLASS_5, 0x04A9, 0x30b5, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A400", CANON_CLASS_5, 0x04A9, 0x30b7, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A310", CANON_CLASS_5, 0x04A9, 0x30b8, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A85 (normal mode)", CANON_CLASS_5, 0x04A9, 0x30b9, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot S410 (normal mode)", CANON_CLASS_5, 0x04A9, 0x30ba, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:Digital IXUS 430 (normal mode)",CANON_CLASS_5, 0x04A9, 0x30ba, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot A95 (normal mode)", CANON_CLASS_5, 0x04A9, 0x30bb, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:PowerShot SD20 (normal mode)",CANON_CLASS_5, 0x04A9, 0x30c4, CAP_SUP, SL_MOVIE_SMALL, SL_THUMB, SL_PICTURE, NULL}, + {"Canon:EOS 20D (normal mode)", CANON_CLASS_4, 0x04A9, 0x30eb, CAP_SUP, SL_MOVIE_LARGE, SL_THUMB, SL_PICTURE, NULL}, {NULL} /* *INDENT-ON* */ @@ -322,27 +326,8 @@ canon_int_filename2audioname (Camera *camera, const char *filename) { char *result; - /* FIXME: I want capabilities */ - /* FIXME: Do we really have to check the model here? Someone - * could just have inserted the CF card into another camera... - * */ - switch (camera->pl->md->model) { - case CANON_PS_S30: - case CANON_PS_S40: - case CANON_PS_S45: - case CANON_PS_S50: - case CANON_PS_S400: - case CANON_PS_G3: - case CANON_PS_G5: - break; - default: - GP_DEBUG ("canon_int_filename2audioname: camera model doesn't support audio files"); - return NULL; - break; - } - - /* We use the audio file itself as the audio file of the - * audio file file. In short: audiofile = audiofile(audiofile) + /* We use the audio file itself as the audio file. In short: + * audiofile = audiofile(audiofile) */ if (is_audio (filename)) { GP_DEBUG ("canon_int_filename2audioname: \"%s\" IS an audio file", @@ -1114,8 +1099,8 @@ canon_int_capture_image (Camera *camera, CameraFilePath *path, /** * canon_int_set_file_attributes: * @camera: camera to work with - * @dir: directory to work in * @file: file to work on + * @dir: directory to work in * @attrs: #canonDirentAttributeBits with the bits to set * @context: context for error reporting * diff --git a/camlibs/canon/canon.h b/camlibs/canon/canon.h index 7eff368d4..da1ee39c6 100644 --- a/camlibs/canon/canon.h +++ b/camlibs/canon/canon.h @@ -62,126 +62,33 @@ typedef enum { } canonJpegMarkerCode; /** - * canonCamModel - * @CANON_PS_A5: PowerShot A5 - * @CANON_PS_A5_ZOOM: PowerShot A5 Zoom - * @CANON_PS_A50: PowerShot A50 - * @CANON_PS_A60: PowerShot A60 - * @CANON_PS_A70: PowerShot A70 - * @CANON_PS_A75: PowerShot A75 - * @CANON_PS_A85: PowerShot A95 - * @CANON_PS_A80: PowerShot A80 - * @CANON_PS_A95: PowerShot A95 - * @CANON_PS_PRO70: PowerShot Pro70 - * @CANON_PS_S10: PowerShot S10 - * @CANON_PS_S20: PowerShot S20 - * @CANON_EOS_D30: EOS D30 - * @CANON_PS_S100: PowerShot S100, PowerShot S110, IXY DIGITAL, - * Digital IXUS, DIGITAL IXUS v - * @CANON_PS_G1: PowerShot G1 - * @CANON_PS_PRO90_IS: PowerShot Pro90 IS - * @CANON_PS_S300: PowerShot S300, Digital IXUS 300 - * @CANON_PS_A20: PowerShot A20 - * @CANON_PS_A10: PowerShot A10 - * @CANON_PS_G2: PowerShot G2 - * @CANON_PS_S40: PowerShot S40 - * @CANON_PS_S30: PowerShot S30 - * @CANON_PS_A40: PowerShot A40 - * @CANON_PS_A30: PowerShot A30 - * @CANON_EOS_D60: EOS D60 - * @CANON_PS_A100: PowerShot A100 - * @CANON_PS_A200: PowerShot A200 - * @CANON_PS_A300: PowerShot A300 - * @CANON_PS_S200: PowerShot S200, Digital IXUS v2 - * @CANON_PS_S330: Digital IXUS 330 - * @CANON_PS_S410: Digital IXUS 430 - * @CANON_PS_S500: Digital IXUS 500 - * @CANON_PS_S45: PowerShot S45 - * @CANON_PS_S60: PowerShot S60 - * @CANON_PS_G3: PowerShot G3 - * @CANON_PS_G5: PowerShot G5 - * @CANON_PS_S230: PowerShot S230, Digital IXUS v3 - * @CANON_MV630I: MV630i camcorder - * @CANON_MV650I: MV650i camcorder - * @CANON_EOS_10D: EOS 10D - * @CANON_OPT_10: Optura 10 - * @CANON_OPT_20: Optura 20 - * @CANON_OPT_200: Optura 200 MC, MVX2i - * @CANON_PS_UNK1: Unknown camera seen in Mac OS X Image Capture - * @CANON_PS_UNK2: Unknown camera seen in Mac OS X Image Capture - * @CANON_PS_UNK3: Unknown camera seen in Mac OS X Image Capture - * @CANON_ZR70MC: Canon ZR70MC Mini-DV Camcorder - * @CANON_PS_UNK5: Unknown camera seen in Mac OS X Image Capture - * @CANON_EOS_300D: EOS 300D / Digital Rebel / KISS Rebel - * @CANON_PS_S50: PowerShot S50 - * @CANON_PS_S400: PowerShot S400, Digital IXUS 400 - * @CANON_PS_SD100: PowerShot SD100, Digital IXUS II - * @CANON_PS_A400: PowerShot A400 - * @CANON_EOS_20D: EOS 20D - * - * Enumeration of all camera types currently supported. + * canonCamClass: + * @CANON_CLASS_0: does not support key lock at all. Examples: G1, + * Pro 90is, S100, S10, S20 + * @CANON_CLASS_1: supports lock, but not unlock. Supports (and + * requires) "get picture abilities" before capture. + * Examples: A5, A5 Zoom, A50, S30, S40, S200, S300, + * S330, G2, A10, A20, A30, A40, A100, A200, + * Optura200/MVX2i. + * @CANON_CLASS_2: like class 1, but doesn't support EXIF. Example: Pro 70. + * @CANON_CLASS_3: like class 1, but can't delete image + * @CANON_CLASS_4: supports lock/unlock. EOS D30 was first example; others + * include D60, 10D, 300D, S230, S400. + * @CANON_CLASS_5: supports lock, no unlock, but not "get picture abilities". + * Examples: S45, G3. + * + * Enumeration of all camera types currently supported. Simplified so + * that all cameras with similar behavior have the same code. * */ typedef enum { - CANON_PS_A5, - CANON_PS_A5_ZOOM, - CANON_PS_A50, - CANON_PS_A60, - CANON_PS_A70, - CANON_PS_A75, - CANON_PS_A80, - CANON_PS_A85, - CANON_PS_A95, - CANON_PS_S10, - CANON_PS_S20, - CANON_PS_S30, - CANON_PS_S40, - CANON_PS_PRO70, - CANON_PS_S100, - CANON_PS_S300, - CANON_PS_G1, - CANON_PS_G2, - CANON_PS_A10, - CANON_PS_A20, - CANON_PS_A30, - CANON_PS_A40, - CANON_EOS_D30, - CANON_PS_PRO90_IS, - CANON_PS_S330, - CANON_PS_S200, - CANON_PS_SD20, - CANON_EOS_D60, - CANON_PS_A100, - CANON_PS_A200, - CANON_PS_A300, - CANON_PS_A310, - CANON_PS_A400, - CANON_PS_S50, - CANON_PS_S45, - CANON_PS_G3, - CANON_PS_S230, - CANON_MV630I, - CANON_MV650I, - CANON_EOS_10D, - CANON_EOS_20D, - CANON_OPT_200, - /* In Mac OS Image Capture, but not yet seen in the wild. */ - CANON_PS_UNK1, - CANON_PS_UNK2, - CANON_PS_UNK3, - CANON_ZR70MC, - CANON_PS_UNK5, - /* other cameras */ - CANON_PS_S400, - CANON_PS_S410, - CANON_PS_S60, - CANON_PS_S500, - CANON_PS_SD100, - CANON_EOS_300D, - CANON_PS_G5, - CANON_OPT_20, - CANON_OPT_10 -} canonCamModel; + CANON_CLASS_0, + CANON_CLASS_1, + CANON_CLASS_2, + CANON_CLASS_3, + CANON_CLASS_4, + CANON_CLASS_5 +} canonCamClass; /** * canonTransferMode: @@ -272,7 +179,7 @@ typedef enum { struct canonCamModelData { char *id_str; - canonCamModel model; + canonCamClass model; unsigned short usb_vendor; unsigned short usb_product; canonCaptureSupport usb_capture_support; @@ -474,12 +381,7 @@ typedef enum { * Treat PS 230 as EOS just as a guess; I really don't know. * */ -#define IS_EOS(cam) ( ((cam)==CANON_EOS_D30) \ - || ((cam)==CANON_EOS_D60) \ - || ((cam)==CANON_PS_S230) \ - || ((cam)==CANON_PS_S400) \ - || ((cam)==CANON_EOS_20D) \ - ) +#define IS_EOS(cam) ((cam)==CANON_CLASS_4) /* * All functions returning a pointer have malloc'ed the data. The caller must diff --git a/camlibs/canon/library.c b/camlibs/canon/library.c index c03024ab9..a77aafe54 100644 --- a/camlibs/canon/library.c +++ b/camlibs/canon/library.c @@ -568,7 +568,7 @@ get_file_func (CameraFilesystem *fs, const char *folder, const char *filename, * GP_FILE_TYPE_EXIF instead */ if (is_jpeg (filename)) { - if (camera->pl->md->model != CANON_PS_PRO70) { + if (camera->pl->md->model != CANON_CLASS_2) { GP_DEBUG ("get_file_func: preview requested where " "EXIF should be possible"); return (GP_ERROR_NOT_SUPPORTED); @@ -589,7 +589,7 @@ get_file_func (CameraFilesystem *fs, const char *folder, const char *filename, case GP_FILE_TYPE_EXIF: #ifdef HAVE_EXIF /* the PowerShot Pro 70 does not support EXIF */ - if (camera->pl->md->model == CANON_PS_PRO70) + if (camera->pl->md->model == CANON_CLASS_2) return (GP_ERROR_NOT_SUPPORTED); thumbname = canon_int_filename2thumbname (camera, canon_path); @@ -795,7 +795,7 @@ camera_summary (Camera *camera, CameraText *summary, GPContext *context) tm = localtime (&tmp_time); #ifdef HAVE_TM_GMTOFF local_time = tmp_time + tm->tm_gmtoff; - GP_DEBUG ("camera_summary: converted %ld to localtime %ld (tm_gmtoff is %ld)", + GP_DEBUG ("camera_summary: converted %ld to localtime %ld (tm_gmtoff is %ld)", (long)tmp_time, (long)local_time, (long)tm->tm_gmtoff); #else local_time = tmp_time - timezone; @@ -866,7 +866,7 @@ delete_file_func (CameraFilesystem *fs, const char *folder, const char *filename if (check_readiness (camera, context) != 1) return GP_ERROR; - if (camera->pl->md->model == CANON_PS_A5 || camera->pl->md->model == CANON_PS_A5_ZOOM) { + if (camera->pl->md->model == CANON_CLASS_3) { GP_DEBUG ("delete_file_func: deleting " "pictures disabled for cameras: PowerShot A5, PowerShot A5 ZOOM"); @@ -1017,8 +1017,9 @@ put_file_func (CameraFilesystem *fs, const char *folder, CameraFile *file, void return GP_ERROR; gp_camera_get_abilities (camera, &a); - if ((camera->pl->speed > 57600) && ((camera->pl->md->model == CANON_PS_A50) - || (camera->pl->md->model == CANON_PS_PRO70))) { + /* Special case for A50 and Pro 70 */ + if ((camera->pl->speed > 57600) && ((camera->pl->md->model == CANON_CLASS_1) + || (camera->pl->md->model == CANON_CLASS_2))) { gp_context_error (context, _("Speeds greater than 57600 are not supported for uploading to this camera")); return GP_ERROR_NOT_SUPPORTED; @@ -1144,8 +1145,9 @@ put_file_func (CameraFilesystem *fs, const char *folder, CameraFile *file, void return GP_ERROR; gp_camera_get_abilities (camera, &a); - if ((camera->pl->speed > 57600) && ((camera->pl->md->model == CANON_PS_A50) - || (camera->pl->md->model == CANON_PS_PRO70))) { + /* Special case for A50 and Pro 70 */ + if ((camera->pl->speed > 57600) && ((camera->pl->md->model == CANON_CLASS_1) + || (camera->pl->md->model == CANON_CLASS_2))) { gp_context_error (context, _("Speeds greater than 57600 are not supported for uploading to this camera")); return GP_ERROR_NOT_SUPPORTED; @@ -1369,7 +1371,7 @@ camera_set_config (Camera *camera, CameraWidget *window, GPContext *context) gp_widget_get_child_by_label (window, _("Keep filename on upload"), &w); if (gp_widget_changed (w)) { gp_widget_get_value (w, &camera->pl->upload_keep_filename); - GP_DEBUG ("New config value for tmb: %i", &camera->pl->upload_keep_filename); + GP_DEBUG ("New config value for tmb: %i", camera->pl->upload_keep_filename); } #endif /* CANON_EXPERIMENTAL_UPLOAD */ @@ -1401,7 +1403,7 @@ get_info_func (CameraFilesystem *fs, const char *folder, const char *filename, else if (is_audio (filename)) strcpy (info->file.type, GP_MIME_WAV); else - /* May no be correct behaviour ... */ + /* May not be correct behaviour ... */ strcpy (info->file.type, "unknown"); strcpy (info->file.name, filename); diff --git a/camlibs/canon/serial.c b/camlibs/canon/serial.c index c201d986c..b4641c57f 100644 --- a/camlibs/canon/serial.c +++ b/camlibs/canon/serial.c @@ -779,17 +779,17 @@ canon_serial_recv_msg (Camera *camera, unsigned char mtype, unsigned char dir, i } if (camera->pl->receive_error == NOERROR) { /*we want to be sure the camera U N D E R S T A N D S our packets */ - if (camera->pl->uploading == 1 && camera->pl->md->model == CANON_PS_A50) + if (camera->pl->uploading == 1 && camera->pl->md->model == CANON_CLASS_1) camera->pl->slow_send = 1; if (!canon_serial_send_packet (camera, PKT_ACK, camera->pl->seq_rx++, camera->pl->psa50_eot + PKT_HDR_LEN, 0)) { if (camera->pl->uploading == 1 - && camera->pl->md->model == CANON_PS_A50) + && camera->pl->md->model == CANON_CLASS_1) camera->pl->slow_send = 0; return NULL; } - if (camera->pl->uploading == 1 && camera->pl->md->model == CANON_PS_A50) + if (camera->pl->uploading == 1 && camera->pl->md->model == CANON_CLASS_1) camera->pl->slow_send = 0; if (total) *total = msg_pos; @@ -1058,7 +1058,7 @@ canon_serial_get_file (Camera *camera, const char *name, int *length, GPContext if (!file) { total = le32atoh (msg + 4); - if (total > camera->pl->md->max_movie_size) { + if (total > camera->pl->md->max_picture_size) { GP_DEBUG ("ERROR: %d is too big\n", total); break; } @@ -1389,9 +1389,8 @@ canon_serial_ready (Camera *camera, GPContext *context) /* take care of some model specific things */ switch (camera->pl->md->model) { - case CANON_PS_A5: - case CANON_PS_A5_ZOOM: - case CANON_PS_A50: + case CANON_CLASS_3: + case CANON_CLASS_1: if (camera->pl->speed > 57600) camera->pl->slow_send = 1; break; diff --git a/camlibs/canon/usb.c b/camlibs/canon/usb.c index 6360c3350..914e6f0a5 100644 --- a/camlibs/canon/usb.c +++ b/camlibs/canon/usb.c @@ -320,21 +320,44 @@ canon_usb_lock_keys (Camera *camera, GPContext *context) GP_DEBUG ("canon_usb_lock_keys()"); switch (camera->pl->md->model) { - case CANON_PS_G1: - case CANON_PS_S100: - case CANON_PS_S20: - case CANON_PS_S10: + case CANON_CLASS_0: GP_DEBUG ("canon_usb_lock_keys: Your camera model does not need the keylock."); break; - case CANON_PS_PRO90_IS: - GP_DEBUG ("canon_usb_lock_keys: Your camera model does not support keylocking."); + + case CANON_CLASS_1: + case CANON_CLASS_2: + case CANON_CLASS_3: + /* Previous default; I doubt that any new + * cameras will work this way. */ + GP_DEBUG ("Locking camera keys and turning off LCD using 'normal' locking code..."); + + c_res = canon_usb_dialogue (camera, + CANON_USB_FUNCTION_GET_PIC_ABILITIES, + &bytes_read, NULL, 0); + if ( bytes_read == 0x334 ) { + GP_DEBUG ( "canon_usb_lock_keys: Got the expected number of bytes back from \"get picture abilities.\"" ); + } else { + gp_context_error ( context, + _("canon_usb_lock_keys: " + "Unexpected return of %i bytes (expected %i) from \"get picture abilities.\""), + bytes_read, 0x334 ); + return GP_ERROR; + } + c_res = canon_usb_dialogue (camera, + CANON_USB_FUNCTION_GENERIC_LOCK_KEYS, + &bytes_read, NULL, 0); + if (bytes_read == 0x4) { + GP_DEBUG ("canon_usb_lock_keys: Got the expected number of bytes back."); + } else { + gp_context_error (context, + _("canon_usb_lock_keys: " + "Unexpected amount of data returned (%i bytes, expected %i)"), + bytes_read, 0x4); + return GP_ERROR; + } break; - case CANON_EOS_D30: - case CANON_EOS_D60: - case CANON_EOS_10D: - case CANON_EOS_300D: - case CANON_PS_S230: - case CANON_PS_S400: + + case CANON_CLASS_4: GP_DEBUG ("Locking camera keys and turning off LCD using 'EOS' locking code..."); memset (payload, 0, sizeof (payload)); @@ -353,15 +376,10 @@ canon_usb_lock_keys (Camera *camera, GPContext *context) bytes_read, 0x4); return GP_ERROR; } - break; - case CANON_PS_S45: - case CANON_PS_S50: - case CANON_PS_G3: - case CANON_PS_G5: - default: - /* Special case: doesn't implement "get + case CANON_CLASS_5: + /* Doesn't implement "get picture abilities", but isn't an EOS camera, so we have to use the "normal" key lock command. Since the S45 is a relatively @@ -383,55 +401,6 @@ canon_usb_lock_keys (Camera *camera, GPContext *context) } break; - case CANON_PS_A5: - case CANON_PS_A5_ZOOM: - case CANON_PS_A50: - case CANON_PS_S30: - case CANON_PS_S40: - case CANON_PS_PRO70: - case CANON_PS_S300: - case CANON_PS_G2: - case CANON_PS_A10: - case CANON_PS_A20: - case CANON_PS_A30: - case CANON_PS_A40: - case CANON_PS_S330: - case CANON_PS_S200: - case CANON_PS_A100: - case CANON_PS_A200: - case CANON_OPT_200: - case CANON_PS_A80: - /* Previous default; I doubt that any new - * cameras will work this way, so it now is - * explicit for the older cameras that use - * it. */ - GP_DEBUG ("Locking camera keys and turning off LCD using 'normal' locking code..."); - - c_res = canon_usb_dialogue (camera, - CANON_USB_FUNCTION_GET_PIC_ABILITIES, - &bytes_read, NULL, 0); - if ( bytes_read == 0x334 ) { - GP_DEBUG ( "canon_usb_lock_keys: Got the expected number of bytes back from \"get picture abilities.\"" ); - } else { - gp_context_error ( context, - _("canon_usb_lock_keys: " - "Unexpected return of %i bytes (expected %i) from \"get picture abilities.\""), - bytes_read, 0x334 ); - return GP_ERROR; - } - c_res = canon_usb_dialogue (camera, - CANON_USB_FUNCTION_GENERIC_LOCK_KEYS, - &bytes_read, NULL, 0); - if (bytes_read == 0x4) { - GP_DEBUG ("canon_usb_lock_keys: Got the expected number of bytes back."); - } else { - gp_context_error (context, - _("canon_usb_lock_keys: " - "Unexpected amount of data returned (%i bytes, expected %i)"), - bytes_read, 0x4); - return GP_ERROR; - } - break; } return GP_OK; @@ -455,36 +424,28 @@ canon_usb_unlock_keys (Camera *camera, GPContext *context) GP_DEBUG ("canon_usb_unlock_keys()"); - switch (camera->pl->md->model) { - case CANON_EOS_D30: - case CANON_EOS_D60: - case CANON_EOS_10D: - case CANON_EOS_300D: - case CANON_PS_S230: - case CANON_PS_S400: - c_res = canon_usb_dialogue (camera, CANON_USB_FUNCTION_EOS_UNLOCK_KEYS, - &bytes_read, NULL, 0); - if (!c_res) - return GP_ERROR; - if (bytes_read == 0x4) { - GP_DEBUG ("canon_usb_unlock_keys: Got the expected number of bytes back."); - } else { - gp_context_error (context, - _("canon_usb_unlock_keys: " - "Unexpected amount of data returned (%i bytes, expected %i)"), - bytes_read, 0x4); - return GP_ERROR; - } - - break; - default: - /* Your camera model does not need unlocking, cannot do unlocking or - * we don't know how to unlock it's keys. - */ - GP_DEBUG ("canon_usb_unlock_keys: Not unlocking the kind of camera you have.\n" - "If unlocking works when using the Windows software with your camera,\n" - "please contact %s.", MAIL_GPHOTO_DEVEL); - break; + if ( camera->pl->md->model == CANON_CLASS_4 ) { + c_res = canon_usb_dialogue (camera, CANON_USB_FUNCTION_EOS_UNLOCK_KEYS, + &bytes_read, NULL, 0); + if (!c_res) + return GP_ERROR; + if (bytes_read == 0x4) { + GP_DEBUG ("canon_usb_unlock_keys: Got the expected number of bytes back."); + } else { + gp_context_error (context, + _("canon_usb_unlock_keys: " + "Unexpected amount of data returned (%i bytes, expected %i)"), + bytes_read, 0x4); + return GP_ERROR; + } + } + else { + /* Your camera model does not need unlocking, cannot do unlocking or + * we don't know how to unlock it's keys. + */ + GP_DEBUG ("canon_usb_unlock_keys: Not unlocking the kind of camera you have.\n" + "If unlocking works when using the Windows software with your camera,\n" + "please contact %s.", MAIL_GPHOTO_DEVEL); } return GP_OK; @@ -1377,6 +1338,67 @@ int canon_usb_set_file_time ( Camera *camera, char *camera_filename, time_t time } /** + * canon_usb_set_file_attributes: + * @camera: camera to initialize + * @attr_bits: bits to write in the camera directory entry + * @pathname: pathname of file whose attributes are to be changed. + * @context: context for error reporting + * + * Changes the attribute bits in a specified directory entry. + * + * Returns: gphoto2 error code + * + */ +int +canon_usb_set_file_attributes (Camera *camera, unsigned short attr_bits, + const char *pathname, GPContext *context) +{ + /* Pathname string plus 32-bit parameter plus two NULs. */ + unsigned int payload_length = strlen(pathname) + 6; + unsigned char *payload = malloc ( payload_length ); + int bytes_read; + unsigned char *res; + + GP_DEBUG ( "canon_usb_set_file_attributes()" ); + + /* build payload : + * + * <attr bits> pathname 0x00 0x00 + * + * The attribute bits will be a 32-bit little-endian integer. + * NOTE: the first 0x00 after dirname is the NULL byte terminating + * the string, so payload_length is strlen(dirname) + 4 + */ + memset (payload, 0x00, payload_length); + memcpy (payload + 4, pathname, strlen (pathname)); + htole32a ( payload, (unsigned long)attr_bits ); + + /* 1024 * 1024 is max realistic data size, out of the blue. + * 0 is to not show progress status + */ + res = canon_usb_dialogue ( camera, CANON_USB_FUNCTION_SET_ATTR, &bytes_read, + payload, payload_length ); + if ( res == NULL ) { + gp_context_error (context, + _("canon_usb_set_file_attributes: " + "canon_usb_dialogue failed")); + free ( payload ); + return GP_ERROR; + } + else if ( le32atoh ( res+0x50 ) != 0 ) { + gp_context_error (context, + _("canon_usb_set_file_attributes: " + "canon_usb_dialogue returned error status 0x%08x from camera"), + le32atoh ( res+0x50 ) ); + free ( payload ); + return GP_ERROR; + } + + free ( payload ); + return GP_OK; +} + +/** * canon_usb_put_file: * @camera: camera to lock keys on * @file: CameraFile object to upload @@ -1413,7 +1435,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest long int offs = 0; char filename[256]; int filename_len; - const char *data; + char *data; char *newdata = NULL; long int size; /* Total size of file to upload */ FILE *fi; @@ -1439,7 +1461,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest CHECK_RESULT (gp_file_get_name (file, &srcname)); /* Open input file and read all its data into a buffer. */ - if(!gp_file_get_data_and_size (file, &data, &size)) { + if(!gp_file_get_data_and_size (file, (const char **)&data, &size)) { fi = fopen(srcname, "rb"); if(!fi) { gp_context_error(context, _("Couldn't read from file \"%s\""), srcname); @@ -1452,7 +1474,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest fseek(fi, 0, SEEK_SET); newdata = data = malloc(size); if(!newdata) { - gp_context_error(context, _("Out of memory: %d bytes needed."), size); + gp_context_error(context, _("Out of memory: %ld bytes needed."), size); free(packet); return GP_ERROR_NO_MEMORY; } @@ -1461,7 +1483,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest } GP_DEBUG ( "canon_put_file_usb:" - " finished reading file, %d bytes (0x%x)", + " finished reading file, %ld bytes (0x%lx)", size, size ); /* Take the buffer and send it to the camera, breaking it into @@ -1472,7 +1494,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest len2 = size - offs; len1 = len2 + 0x1c + filename_len + 1; - GP_DEBUG ( "canon_put_file_usb: len1=%x, len2=%x", len1, len2 ); + GP_DEBUG ( "canon_put_file_usb: len1=%lx, len2=%lx", len1, len2 ); memset(packet, 0, 0x40); packet[4]=3; @@ -1531,7 +1553,7 @@ canon_usb_put_file (Camera *camera, CameraFile *file, char *destname, char *dest status = gp_port_write (camera->port, packet, len1+0x40); if (status != len1+0x40) { GP_DEBUG ("canon_put_file_usb: write 2 failed! " - "(returned %i, expected %i)", status, len1+0x40); + "(returned %i, expected %li)", status, len1+0x40); gp_context_error(context, _("File upload failed.")); if(newdata) free(newdata); @@ -1717,67 +1739,6 @@ canon_usb_list_all_dirs (Camera *camera, unsigned char **dirent_data, } /** - * canon_usb_set_file_attributes: - * @camera: camera to initialize - * @attr_bits: bits to write in the camera directory entry - * @pathname: pathname of file whose attributes are to be changed. - * @context: context for error reporting - * - * Changes the attribute bits in a specified directory entry. - * - * Returns: gphoto2 error code - * - */ -int -canon_usb_set_file_attributes (Camera *camera, unsigned short attr_bits, - const char *pathname, GPContext *context) -{ - /* Pathname string plus 32-bit parameter plus two NULs. */ - unsigned int payload_length = strlen(pathname) + 6; - unsigned char *payload = malloc ( payload_length ); - int bytes_read; - unsigned char *res; - - GP_DEBUG ( "canon_usb_set_file_attributes()" ); - - /* build payload : - * - * <attr bits> pathname 0x00 0x00 - * - * The attribute bits will be a 32-bit little-endian integer. - * NOTE: the first 0x00 after dirname is the NULL byte terminating - * the string, so payload_length is strlen(dirname) + 4 - */ - memset (payload, 0x00, payload_length); - memcpy (payload + 4, pathname, strlen (pathname)); - htole32a ( payload, (unsigned long)attr_bits ); - - /* 1024 * 1024 is max realistic data size, out of the blue. - * 0 is to not show progress status - */ - res = canon_usb_dialogue ( camera, CANON_USB_FUNCTION_SET_ATTR, &bytes_read, - payload, payload_length ); - if ( res == NULL ) { - gp_context_error (context, - _("canon_usb_set_file_attributes: " - "canon_usb_dialogue failed")); - free ( payload ); - return GP_ERROR; - } - else if ( le32atoh ( res+0x50 ) != 0 ) { - gp_context_error (context, - _("canon_usb_set_file_attributes: " - "canon_usb_dialogue returned error status 0x%08x from camera"), - le32atoh ( res+0x50 ) ); - free ( payload ); - return GP_ERROR; - } - - free ( payload ); - return GP_OK; -} - -/** * canon_usb_ready: * @camera: camera to get ready * @@ -1835,7 +1796,7 @@ canon_usb_identify (Camera *camera, GPContext *context) && models[i].usb_product && (a.usb_vendor == models[i].usb_vendor) && (a.usb_product == models[i].usb_product)) { - GP_DEBUG ("canon_usb_identify: USB ID match 0x%04x:0x%04x (%s)", + GP_DEBUG ("canon_usb_identify: USB ID match 0x%04x:0x%04x (model name \"%s\")", models[i].usb_vendor, models[i].usb_product, models[i].id_str); gp_context_status (context, _("Detected a '%s'."), models[i].id_str); camera->pl->md = (struct canonCamModelData *) &models[i]; |