diff options
Diffstat (limited to 'src/ptp-pack.c')
-rw-r--r-- | src/ptp-pack.c | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/src/ptp-pack.c b/src/ptp-pack.c index e3e9a2c..5df73d0 100644 --- a/src/ptp-pack.c +++ b/src/ptp-pack.c @@ -2129,7 +2129,7 @@ ptp_unpack_CANON_changes (PTPParams *params, unsigned char* data, unsigned int d break; } - ptp_debug (params, "event %d: EOS prop %04x desc record, datasize %d, propxtype %d", i, proptype, size-PTP_ece_Prop_Desc_Data, propxtype); + ptp_debug (params, "event %d: EOS prop %04x (%s) desc record, datasize %d, propxtype %d", i, proptype, ptp_get_property_description (params, proptype), size-PTP_ece_Prop_Desc_Data, propxtype); for (j=0;j<params->nrofcanon_props;j++) if (params->canon_props[j].proptype == proptype) break; @@ -2217,7 +2217,7 @@ ptp_unpack_CANON_changes (PTPParams *params, unsigned char* data, unsigned int d ptp_debug (params, "size %d is smaller than %d", size, PTP_ece_Prop_Val_Data); break; } - ptp_debug (params, "event %d: EOS prop %04x info record, datasize is %d", i, proptype, size-PTP_ece_Prop_Val_Data); + ptp_debug (params, "event %d: EOS prop %04x (%s) info record, datasize is %d", i, proptype, ptp_get_property_description(params,proptype), size-PTP_ece_Prop_Val_Data); for (j=0;j<params->nrofcanon_props;j++) if (params->canon_props[j].proptype == proptype) break; @@ -2867,6 +2867,65 @@ ptp_unpack_Nikon_EC (PTPParams *params, unsigned char* data, unsigned int len, P } } +/* + * PTP USB Event container unpack for Nikon events, 2nd generation. + */ +#define PTP_nikon_ec_ex_Length 0 +#define PTP_nikon_ec_ex_Code 2 + +static inline int +ptp_unpack_Nikon_EC_EX (PTPParams *params, unsigned char* data, unsigned int len, PTPContainer **ec, unsigned int *cnt) +{ + unsigned int i, offset; + + *ec = NULL; + if (data == NULL) + return 0; + if (len < PTP_nikon_ec_ex_Code) + return 0; + *cnt = dtoh16a(&data[PTP_nikon_ec_ex_Length]); + if (*cnt > (len-PTP_nikon_ec_ex_Code)/4) { /* broken cnt? simple first check ... due to dynamic size, we need to do more later */ + *cnt = 0; + return 0; + } + if (!*cnt) + return 1; + + *ec = malloc(sizeof(PTPContainer)*(*cnt)); + offset = PTP_nikon_ec_ex_Code+sizeof(uint16_t); + + for (i=0;i<*cnt;i++) { + memset(&(*ec)[i],0,sizeof(PTPContainer)); + if (len - offset < 4) { + free (*ec); + *ec = NULL; + *cnt = 0; + return 0; + } + (*ec)[i].Code = dtoh16a(&data[offset]); + (*ec)[i].Nparam = dtoh16a(&data[offset+2]); + ptp_debug (params, "nikon eventex %d: code 0x%04x, params %d", i, (*ec)[i].Code, (*ec)[i].Nparam); + if ( ((*ec)[i].Nparam > 5) || + (len < ((*ec)[i].Nparam*sizeof(uint32_t)) + 4 + offset) + ) { + free (*ec); + *ec = NULL; + *cnt = 0; + return 0; + } + switch ((*ec)[i].Nparam) { + case 5: (*ec)[i].Param5 = dtoh32a(&data[offset+4+sizeof(uint32_t)*4]);/* fallthrough */ + case 4: (*ec)[i].Param4 = dtoh32a(&data[offset+4+sizeof(uint32_t)*3]);/* fallthrough */ + case 3: (*ec)[i].Param3 = dtoh32a(&data[offset+4+sizeof(uint32_t)*2]);/* fallthrough */ + case 2: (*ec)[i].Param2 = dtoh32a(&data[offset+4+sizeof(uint32_t)*1]);/* fallthrough */ + case 1: (*ec)[i].Param1 = dtoh32a(&data[offset+4]); + /* fallthrough */ + case 0: break; + } + offset += (*ec)[i].Nparam*sizeof(uint32_t) + 4; + } + return 1; +} static inline uint32_t ptp_pack_EK_text(PTPParams *params, PTPEKTextParams *text, unsigned char **data) { |