summaryrefslogtreecommitdiff
path: root/src/ptp-pack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ptp-pack.c')
-rw-r--r--src/ptp-pack.c63
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) {