Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/ptp-pack.c

Issue 2345493002: Uprev libmtp to 1.1.12 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libmtp@master
Patch Set: Re-upload cl Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ptp.c ('k') | src/util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* ptp-pack.c 1 /* ptp-pack.c
2 * 2 *
3 * Copyright (C) 2001-2004 Mariusz Woloszyn <emsi@ipartners.pl> 3 * Copyright (C) 2001-2004 Mariusz Woloszyn <emsi@ipartners.pl>
4 * Copyright (C) 2003-2012 Marcus Meissner <marcus@jet.franken.de> 4 * Copyright (C) 2003-2014 Marcus Meissner <marcus@jet.franken.de>
5 * Copyright (C) 2006-2008 Linus Walleij <triad@df.lth.se> 5 * Copyright (C) 2006-2008 Linus Walleij <triad@df.lth.se>
6 * Copyright (C) 2007 Tero Saarni <tero.saarni@gmail.com> 6 * Copyright (C) 2007 Tero Saarni <tero.saarni@gmail.com>
7 * Copyright (C) 2009 Axel Waggershauser <awagger@web.de> 7 * Copyright (C) 2009 Axel Waggershauser <awagger@web.de>
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public 10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either 11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version. 12 * version 2 of the License, or (at your option) any later version.
13 * 13 *
14 * This library is distributed in the hope that it will be useful, 14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details. 17 * Lesser General Public License for more details.
18 * 18 *
19 * You should have received a copy of the GNU Lesser General Public 19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the 20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02111-1307, USA. 22 * Boston, MA 02110-1301 USA
23 */ 23 */
24 24
25 /* currently this file is included into ptp.c */ 25 /* currently this file is included into ptp.c */
26 26
27 #ifdef HAVE_ICONV 27 #ifdef HAVE_LIMITS_H
28 #include <limits.h>
29 #endif
30 #ifndef UINT_MAX
31 # define UINT_MAX 0xFFFFFFFF
32 #endif
33 #if defined(HAVE_ICONV) && defined(HAVE_LANGINFO_H)
28 #include <iconv.h> 34 #include <iconv.h>
29 #endif 35 #endif
30 36
31 static inline uint16_t 37 static inline uint16_t
32 htod16p (PTPParams *params, uint16_t var) 38 htod16p (PTPParams *params, uint16_t var)
33 { 39 {
34 return ((params->byteorder==PTP_DL_LE)?htole16(var):htobe16(var)); 40 return ((params->byteorder==PTP_DL_LE)?htole16(var):htobe16(var));
35 } 41 }
36 42
37 static inline uint32_t 43 static inline uint32_t
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 memcpy(string, &data[offset+1], length * sizeof(string[0])); 145 memcpy(string, &data[offset+1], length * sizeof(string[0]));
140 string[length] = 0x0000U; /* be paranoid! add a terminator. */ 146 string[length] = 0x0000U; /* be paranoid! add a terminator. */
141 loclstr[0] = '\0'; 147 loclstr[0] = '\0';
142 148
143 /* convert from camera UCS-2 to our locale */ 149 /* convert from camera UCS-2 to our locale */
144 src = (char *)string; 150 src = (char *)string;
145 srclen = length * sizeof(string[0]); 151 srclen = length * sizeof(string[0]);
146 dest = loclstr; 152 dest = loclstr;
147 destlen = sizeof(loclstr)-1; 153 destlen = sizeof(loclstr)-1;
148 nconv = (size_t)-1; 154 nconv = (size_t)-1;
149 #ifdef HAVE_ICONV 155 #if defined(HAVE_ICONV) && defined(HAVE_LANGINFO_H)
150 if (params->cd_ucs2_to_locale != (iconv_t)-1) 156 if (params->cd_ucs2_to_locale != (iconv_t)-1)
151 nconv = iconv(params->cd_ucs2_to_locale, &src, &srclen, &dest, & destlen); 157 nconv = iconv(params->cd_ucs2_to_locale, &src, &srclen, &dest, & destlen);
152 #endif 158 #endif
153 if (nconv == (size_t) -1) { /* do it the hard way */ 159 if (nconv == (size_t) -1) { /* do it the hard way */
154 int i; 160 int i;
155 /* try the old way, in case iconv is broken */ 161 /* try the old way, in case iconv is broken */
156 for (i=0;i<length;i++) { 162 for (i=0;i<length;i++) {
157 if (dtoh16a(&data[offset+1+2*i])>127) 163 if (dtoh16a(&data[offset+1+2*i])>127)
158 loclstr[i] = '?'; 164 loclstr[i] = '?';
159 else 165 else
(...skipping 20 matching lines...) Expand all
180 static inline void 186 static inline void
181 ptp_pack_string(PTPParams *params, char *string, unsigned char* data, uint16_t o ffset, uint8_t *len) 187 ptp_pack_string(PTPParams *params, char *string, unsigned char* data, uint16_t o ffset, uint8_t *len)
182 { 188 {
183 int packedlen = 0; 189 int packedlen = 0;
184 uint16_t ucs2str[PTP_MAXSTRLEN+1]; 190 uint16_t ucs2str[PTP_MAXSTRLEN+1];
185 char *ucs2strp = (char *) ucs2str; 191 char *ucs2strp = (char *) ucs2str;
186 size_t convlen = strlen(string); 192 size_t convlen = strlen(string);
187 193
188 /* Cannot exceed 255 (PTP_MAXSTRLEN) since it is a single byte, duh ... */ 194 /* Cannot exceed 255 (PTP_MAXSTRLEN) since it is a single byte, duh ... */
189 memset(ucs2strp, 0, sizeof(ucs2str)); /* XXX: necessary? */ 195 memset(ucs2strp, 0, sizeof(ucs2str)); /* XXX: necessary? */
190 #ifdef HAVE_ICONV 196 #if defined(HAVE_ICONV) && defined(HAVE_LANGINFO_H)
191 if (params->cd_locale_to_ucs2 != (iconv_t)-1) { 197 if (params->cd_locale_to_ucs2 != (iconv_t)-1) {
192 size_t nconv; 198 size_t nconv;
193 size_t convmax = PTP_MAXSTRLEN * 2; /* Includes the terminator * / 199 size_t convmax = PTP_MAXSTRLEN * 2; /* Includes the terminator * /
194 char *stringp = string; 200 char *stringp = string;
195 201
196 nconv = iconv(params->cd_locale_to_ucs2, &stringp, &convlen, 202 nconv = iconv(params->cd_locale_to_ucs2, &stringp, &convlen,
197 &ucs2strp, &convmax); 203 &ucs2strp, &convmax);
198 if (nconv == (size_t) -1) 204 if (nconv == (size_t) -1)
199 ucs2str[0] = 0x0000U; 205 ucs2str[0] = 0x0000U;
200 } else 206 } else
201 #endif 207 #endif
202 { 208 {
203 » » int i; 209 » » unsigned int i;
210
204 for (i=0;i<convlen;i++) { 211 for (i=0;i<convlen;i++) {
205 ucs2str[i] = string[i]; 212 ucs2str[i] = string[i];
206 } 213 }
207 ucs2str[convlen] = 0; 214 ucs2str[convlen] = 0;
208 } 215 }
209 /* 216 /*
210 * XXX: isn't packedlen just ( (uint16_t *)ucs2strp - ucs2str )? 217 * XXX: isn't packedlen just ( (uint16_t *)ucs2strp - ucs2str )?
211 * why do we need ucs2strlen()? 218 * why do we need ucs2strlen()?
212 */ 219 */
213 packedlen = ucs2strlen(ucs2str); 220 packedlen = ucs2strlen(ucs2str);
(...skipping 30 matching lines...) Expand all
244 if (!retcopy) { 251 if (!retcopy) {
245 *packed_size = 0; 252 *packed_size = 0;
246 return NULL; 253 return NULL;
247 } 254 }
248 memcpy(retcopy, packed, plen); 255 memcpy(retcopy, packed, plen);
249 *packed_size = plen; 256 *packed_size = plen;
250 return (retcopy); 257 return (retcopy);
251 } 258 }
252 259
253 static inline uint32_t 260 static inline uint32_t
254 ptp_unpack_uint32_t_array(PTPParams *params, unsigned char* data, uint16_t offse t, uint32_t **array) 261 ptp_unpack_uint32_t_array(PTPParams *params, unsigned char* data, unsigned int o ffset, unsigned int datalen, uint32_t **array)
255 { 262 {
256 uint32_t n, i=0; 263 uint32_t n, i=0;
257 264
265 if (offset >= datalen)
266 return 0;
267
268 if (offset + sizeof(uint32_t) > datalen)
269 return 0;
270
271 *array = NULL;
258 n=dtoh32a(&data[offset]); 272 n=dtoh32a(&data[offset]);
273 if (n >= UINT_MAX/sizeof(uint32_t))
274 return 0;
275 if (!n)
276 return 0;
277
278 if (offset + sizeof(uint32_t)*(n+1) > datalen) {
279 ptp_debug (params ,"array runs over datalen bufferend (%d vs %d) ", offset + sizeof(uint32_t)*(n+1) , datalen);
280 return 0;
281 }
282
259 *array = malloc (n*sizeof(uint32_t)); 283 *array = malloc (n*sizeof(uint32_t));
260 » while (n>i) { 284 » for (i=0;i<n;i++)
261 (*array)[i]=dtoh32a(&data[offset+(sizeof(uint32_t)*(i+1))]); 285 (*array)[i]=dtoh32a(&data[offset+(sizeof(uint32_t)*(i+1))]);
262 i++;
263 }
264 return n; 286 return n;
265 } 287 }
266 288
267 static inline uint32_t 289 static inline uint32_t
268 ptp_pack_uint32_t_array(PTPParams *params, uint32_t *array, uint32_t arraylen, u nsigned char **data ) 290 ptp_pack_uint32_t_array(PTPParams *params, uint32_t *array, uint32_t arraylen, u nsigned char **data )
269 { 291 {
270 uint32_t i=0; 292 uint32_t i=0;
271 293
272 *data = malloc ((arraylen+1)*sizeof(uint32_t)); 294 *data = malloc ((arraylen+1)*sizeof(uint32_t));
273 htod32a(&(*data)[0],arraylen); 295 htod32a(&(*data)[0],arraylen);
274 for (i=0;i<arraylen;i++) 296 for (i=0;i<arraylen;i++)
275 htod32a(&(*data)[sizeof(uint32_t)*(i+1)], array[i]); 297 htod32a(&(*data)[sizeof(uint32_t)*(i+1)], array[i]);
276 return (arraylen+1)*sizeof(uint32_t); 298 return (arraylen+1)*sizeof(uint32_t);
277 } 299 }
278 300
279 static inline uint32_t 301 static inline uint32_t
280 ptp_unpack_uint16_t_array(PTPParams *params, unsigned char* data, uint16_t offse t, uint16_t **array) 302 ptp_unpack_uint16_t_array(PTPParams *params, unsigned char* data, unsigned int o ffset, unsigned int datalen, uint16_t **array)
281 { 303 {
282 uint32_t n, i=0; 304 uint32_t n, i=0;
283 305
306 *array = NULL;
284 n=dtoh32a(&data[offset]); 307 n=dtoh32a(&data[offset]);
308 if (n >= UINT_MAX/sizeof(uint16_t))
309 return 0;
310 if (!n)
311 return 0;
312 if (offset + sizeof(uint32_t) > datalen)
313 return 0;
314 if (offset + sizeof(uint32_t)+sizeof(uint16_t)*n > datalen) {
315 ptp_debug (params ,"array runs over datalen bufferend (%d vs %d) ", offset + sizeof(uint32_t)+n*sizeof(uint16_t) , datalen);
316 return 0;
317 }
285 *array = malloc (n*sizeof(uint16_t)); 318 *array = malloc (n*sizeof(uint16_t));
286 » while (n>i) { 319 » for (i=0;i<n;i++)
287 (*array)[i]=dtoh16a(&data[offset+(sizeof(uint16_t)*(i+2))]); 320 (*array)[i]=dtoh16a(&data[offset+(sizeof(uint16_t)*(i+2))]);
288 i++;
289 }
290 return n; 321 return n;
291 } 322 }
292 323
293 /* DeviceInfo pack/unpack */ 324 /* DeviceInfo pack/unpack */
294 325
295 #define PTP_di_StandardVersion 0 326 #define PTP_di_StandardVersion 0
296 #define PTP_di_VendorExtensionID 2 327 #define PTP_di_VendorExtensionID 2
297 #define PTP_di_VendorExtensionVersion 6 328 #define PTP_di_VendorExtensionVersion 6
298 #define PTP_di_VendorExtensionDesc 8 329 #define PTP_di_VendorExtensionDesc 8
299 #define PTP_di_FunctionalMode 8 330 #define PTP_di_FunctionalMode 8
(...skipping 13 matching lines...) Expand all
313 di->VendorExtensionVersion = 344 di->VendorExtensionVersion =
314 dtoh16a(&data[PTP_di_VendorExtensionVersion]); 345 dtoh16a(&data[PTP_di_VendorExtensionVersion]);
315 di->VendorExtensionDesc = 346 di->VendorExtensionDesc =
316 ptp_unpack_string(params, data, 347 ptp_unpack_string(params, data,
317 PTP_di_VendorExtensionDesc, &len); 348 PTP_di_VendorExtensionDesc, &len);
318 totallen=len*2+1; 349 totallen=len*2+1;
319 di->FunctionalMode = 350 di->FunctionalMode =
320 dtoh16a(&data[PTP_di_FunctionalMode+totallen]); 351 dtoh16a(&data[PTP_di_FunctionalMode+totallen]);
321 di->OperationsSupported_len = ptp_unpack_uint16_t_array(params, data, 352 di->OperationsSupported_len = ptp_unpack_uint16_t_array(params, data,
322 PTP_di_OperationsSupported+totallen, 353 PTP_di_OperationsSupported+totallen,
354 datalen,
323 &di->OperationsSupported); 355 &di->OperationsSupported);
324 totallen=totallen+di->OperationsSupported_len*sizeof(uint16_t)+sizeof(ui nt32_t); 356 totallen=totallen+di->OperationsSupported_len*sizeof(uint16_t)+sizeof(ui nt32_t);
325 di->EventsSupported_len = ptp_unpack_uint16_t_array(params, data, 357 di->EventsSupported_len = ptp_unpack_uint16_t_array(params, data,
326 PTP_di_OperationsSupported+totallen, 358 PTP_di_OperationsSupported+totallen,
359 datalen,
327 &di->EventsSupported); 360 &di->EventsSupported);
328 totallen=totallen+di->EventsSupported_len*sizeof(uint16_t)+sizeof(uint32 _t); 361 totallen=totallen+di->EventsSupported_len*sizeof(uint16_t)+sizeof(uint32 _t);
329 di->DevicePropertiesSupported_len = 362 di->DevicePropertiesSupported_len =
330 ptp_unpack_uint16_t_array(params, data, 363 ptp_unpack_uint16_t_array(params, data,
331 PTP_di_OperationsSupported+totallen, 364 PTP_di_OperationsSupported+totallen,
365 datalen,
332 &di->DevicePropertiesSupported); 366 &di->DevicePropertiesSupported);
333 totallen=totallen+di->DevicePropertiesSupported_len*sizeof(uint16_t)+siz eof(uint32_t); 367 totallen=totallen+di->DevicePropertiesSupported_len*sizeof(uint16_t)+siz eof(uint32_t);
334 di->CaptureFormats_len = ptp_unpack_uint16_t_array(params, data, 368 di->CaptureFormats_len = ptp_unpack_uint16_t_array(params, data,
335 PTP_di_OperationsSupported+totallen, 369 PTP_di_OperationsSupported+totallen,
370 datalen,
336 &di->CaptureFormats); 371 &di->CaptureFormats);
337 totallen=totallen+di->CaptureFormats_len*sizeof(uint16_t)+sizeof(uint32_ t); 372 totallen=totallen+di->CaptureFormats_len*sizeof(uint16_t)+sizeof(uint32_ t);
338 di->ImageFormats_len = ptp_unpack_uint16_t_array(params, data, 373 di->ImageFormats_len = ptp_unpack_uint16_t_array(params, data,
339 PTP_di_OperationsSupported+totallen, 374 PTP_di_OperationsSupported+totallen,
375 datalen,
340 &di->ImageFormats); 376 &di->ImageFormats);
341 totallen=totallen+di->ImageFormats_len*sizeof(uint16_t)+sizeof(uint32_t) ; 377 totallen=totallen+di->ImageFormats_len*sizeof(uint16_t)+sizeof(uint32_t) ;
342 di->Manufacturer = ptp_unpack_string(params, data, 378 di->Manufacturer = ptp_unpack_string(params, data,
343 PTP_di_OperationsSupported+totallen, 379 PTP_di_OperationsSupported+totallen,
344 &len); 380 &len);
345 totallen+=len*2+1; 381 totallen+=len*2+1;
346 di->Model = ptp_unpack_string(params, data, 382 di->Model = ptp_unpack_string(params, data,
347 PTP_di_OperationsSupported+totallen, 383 PTP_di_OperationsSupported+totallen,
348 &len); 384 &len);
349 totallen+=len*2+1; 385 totallen+=len*2+1;
350 di->DeviceVersion = ptp_unpack_string(params, data, 386 di->DeviceVersion = ptp_unpack_string(params, data,
351 PTP_di_OperationsSupported+totallen, 387 PTP_di_OperationsSupported+totallen,
352 &len); 388 &len);
353 totallen+=len*2+1; 389 totallen+=len*2+1;
354 di->SerialNumber = ptp_unpack_string(params, data, 390 di->SerialNumber = ptp_unpack_string(params, data,
355 PTP_di_OperationsSupported+totallen, 391 PTP_di_OperationsSupported+totallen,
356 &len); 392 &len);
357 } 393 }
358 394
359 static void inline 395 inline static void
360 ptp_free_DI (PTPDeviceInfo *di) { 396 ptp_free_DI (PTPDeviceInfo *di) {
361 » if (di->SerialNumber) free (di->SerialNumber); 397 » free (di->SerialNumber);
362 » if (di->DeviceVersion) free (di->DeviceVersion); 398 » free (di->DeviceVersion);
363 » if (di->Model) free (di->Model); 399 » free (di->Model);
364 » if (di->Manufacturer) free (di->Manufacturer); 400 » free (di->Manufacturer);
365 » if (di->ImageFormats) free (di->ImageFormats); 401 » free (di->ImageFormats);
366 » if (di->CaptureFormats) free (di->CaptureFormats); 402 » free (di->CaptureFormats);
367 » if (di->VendorExtensionDesc) free (di->VendorExtensionDesc); 403 » free (di->VendorExtensionDesc);
368 » if (di->OperationsSupported) free (di->OperationsSupported); 404 » free (di->OperationsSupported);
369 » if (di->EventsSupported) free (di->EventsSupported); 405 » free (di->EventsSupported);
370 » if (di->DevicePropertiesSupported) free (di->DevicePropertiesSupported); 406 » free (di->DevicePropertiesSupported);
371 } 407 }
372 408
373 /* EOS Device Info unpack */ 409 /* EOS Device Info unpack */
374 static inline void 410 static inline void
375 ptp_unpack_EOS_DI (PTPParams *params, unsigned char* data, PTPCanonEOSDeviceInfo *di, unsigned int datalen) 411 ptp_unpack_EOS_DI (PTPParams *params, unsigned char* data, PTPCanonEOSDeviceInfo *di, unsigned int datalen)
376 { 412 {
377 » int totallen = 4; 413 » unsigned int totallen = 4;
378 414
379 memset (di,0, sizeof(*di)); 415 memset (di,0, sizeof(*di));
380 if (datalen < 8) return; 416 if (datalen < 8) return;
381 417
382 /* uint32_t struct len - ignore */ 418 /* uint32_t struct len - ignore */
383 di->EventsSupported_len = ptp_unpack_uint32_t_array(params, data, 419 di->EventsSupported_len = ptp_unpack_uint32_t_array(params, data,
384 » » totallen, &di->EventsSupported); 420 » » totallen, datalen, &di->EventsSupported);
385 if (!di->EventsSupported) return; 421 if (!di->EventsSupported) return;
386 totallen += di->EventsSupported_len*sizeof(uint32_t)+4; 422 totallen += di->EventsSupported_len*sizeof(uint32_t)+4;
387 if (totallen >= datalen) return; 423 if (totallen >= datalen) return;
388 424
389 di->DevicePropertiesSupported_len = ptp_unpack_uint32_t_array(params, da ta, 425 di->DevicePropertiesSupported_len = ptp_unpack_uint32_t_array(params, da ta,
390 » » totallen, &di->DevicePropertiesSupported); 426 » » totallen, datalen, &di->DevicePropertiesSupported);
391 if (!di->DevicePropertiesSupported) return; 427 if (!di->DevicePropertiesSupported) return;
392 totallen += di->DevicePropertiesSupported_len*sizeof(uint32_t)+4; 428 totallen += di->DevicePropertiesSupported_len*sizeof(uint32_t)+4;
393 if (totallen >= datalen) return; 429 if (totallen >= datalen) return;
394 430
395 di->unk_len = ptp_unpack_uint32_t_array(params, data, 431 di->unk_len = ptp_unpack_uint32_t_array(params, data,
396 » » totallen, &di->unk); 432 » » totallen, datalen, &di->unk);
397 if (!di->unk) return; 433 if (!di->unk) return;
398 totallen += di->unk_len*sizeof(uint32_t)+4; 434 totallen += di->unk_len*sizeof(uint32_t)+4;
399 return; 435 return;
400 } 436 }
401 437
402 static inline void 438 static inline void
403 ptp_free_EOS_DI (PTPCanonEOSDeviceInfo *di) 439 ptp_free_EOS_DI (PTPCanonEOSDeviceInfo *di)
404 { 440 {
405 free (di->EventsSupported); 441 free (di->EventsSupported);
406 free (di->DevicePropertiesSupported); 442 free (di->DevicePropertiesSupported);
407 free (di->unk); 443 free (di->unk);
408 } 444 }
409 445
410 /* ObjectHandles array pack/unpack */ 446 /* ObjectHandles array pack/unpack */
411 447
412 #define PTP_oh 0 448 #define PTP_oh 0
413 449
414 static inline void 450 static inline void
415 ptp_unpack_OH (PTPParams *params, unsigned char* data, PTPObjectHandles *oh, uns igned int len) 451 ptp_unpack_OH (PTPParams *params, unsigned char* data, PTPObjectHandles *oh, uns igned int len)
416 { 452 {
417 if (len) { 453 if (len) {
418 » » oh->n = ptp_unpack_uint32_t_array(params, data, PTP_oh, &oh->Han dler); 454 » » oh->n = ptp_unpack_uint32_t_array(params, data, PTP_oh, len, &oh ->Handler);
419 } else { 455 } else {
420 oh->n = 0; 456 oh->n = 0;
421 oh->Handler = NULL; 457 oh->Handler = NULL;
422 } 458 }
423 } 459 }
424 460
425 /* StoreIDs array pack/unpack */ 461 /* StoreIDs array pack/unpack */
426 462
427 #define PTP_sids 0 463 #define PTP_sids 0
428 464
429 static inline void 465 static inline void
430 ptp_unpack_SIDs (PTPParams *params, unsigned char* data, PTPStorageIDs *sids, un signed int len) 466 ptp_unpack_SIDs (PTPParams *params, unsigned char* data, PTPStorageIDs *sids, un signed int len)
431 { 467 {
432 if (!data && !len) { 468 » if (!data || !len) {
433 sids->n = 0; 469 sids->n = 0;
434 sids->Storage = NULL; 470 sids->Storage = NULL;
435 return; 471 return;
436 } 472 }
437 » sids->n = ptp_unpack_uint32_t_array(params, data, PTP_sids, 473 » sids->n = ptp_unpack_uint32_t_array(params, data, PTP_sids, len, &sids-> Storage);
438 » &sids->Storage);
439 } 474 }
440 475
441 /* StorageInfo pack/unpack */ 476 /* StorageInfo pack/unpack */
442 477
443 #define PTP_si_StorageType 0 478 #define PTP_si_StorageType 0
444 #define PTP_si_FilesystemType 2 479 #define PTP_si_FilesystemType 2
445 #define PTP_si_AccessCapability 4 480 #define PTP_si_AccessCapability 4
446 #define PTP_si_MaxCapability 6 481 #define PTP_si_MaxCapability 6
447 #define PTP_si_FreeSpaceInBytes 14 482 #define PTP_si_FreeSpaceInBytes 14
448 #define PTP_si_FreeSpaceInImages 22 483 #define PTP_si_FreeSpaceInImages 22
449 #define PTP_si_StorageDescription 26 484 #define PTP_si_StorageDescription 26
450 485
451 static inline void 486 static inline void
452 ptp_unpack_SI (PTPParams *params, unsigned char* data, PTPStorageInfo *si, unsig ned int len) 487 ptp_unpack_SI (PTPParams *params, unsigned char* data, PTPStorageInfo *si, unsig ned int len)
453 { 488 {
454 uint8_t storagedescriptionlen; 489 uint8_t storagedescriptionlen;
455 490
491 if (len < 26) return;
456 si->StorageType=dtoh16a(&data[PTP_si_StorageType]); 492 si->StorageType=dtoh16a(&data[PTP_si_StorageType]);
457 si->FilesystemType=dtoh16a(&data[PTP_si_FilesystemType]); 493 si->FilesystemType=dtoh16a(&data[PTP_si_FilesystemType]);
458 si->AccessCapability=dtoh16a(&data[PTP_si_AccessCapability]); 494 si->AccessCapability=dtoh16a(&data[PTP_si_AccessCapability]);
459 si->MaxCapability=dtoh64a(&data[PTP_si_MaxCapability]); 495 si->MaxCapability=dtoh64a(&data[PTP_si_MaxCapability]);
460 si->FreeSpaceInBytes=dtoh64a(&data[PTP_si_FreeSpaceInBytes]); 496 si->FreeSpaceInBytes=dtoh64a(&data[PTP_si_FreeSpaceInBytes]);
461 si->FreeSpaceInImages=dtoh32a(&data[PTP_si_FreeSpaceInImages]); 497 si->FreeSpaceInImages=dtoh32a(&data[PTP_si_FreeSpaceInImages]);
498
499 /* FIXME: check more lengths here */
462 si->StorageDescription=ptp_unpack_string(params, data, 500 si->StorageDescription=ptp_unpack_string(params, data,
463 PTP_si_StorageDescription, &storagedescriptionlen); 501 PTP_si_StorageDescription, &storagedescriptionlen);
464 si->VolumeLabel=ptp_unpack_string(params, data, 502 si->VolumeLabel=ptp_unpack_string(params, data,
465 PTP_si_StorageDescription+storagedescriptionlen*2+1, 503 PTP_si_StorageDescription+storagedescriptionlen*2+1,
466 &storagedescriptionlen); 504 &storagedescriptionlen);
467 } 505 }
468 506
469 /* ObjectInfo pack/unpack */ 507 /* ObjectInfo pack/unpack */
470 508
471 #define PTP_oi_StorageID 0 509 #define PTP_oi_StorageID 0
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 return mktime (&tm); 635 return mktime (&tm);
598 } 636 }
599 637
600 static inline void 638 static inline void
601 ptp_unpack_OI (PTPParams *params, unsigned char* data, PTPObjectInfo *oi, unsign ed int len) 639 ptp_unpack_OI (PTPParams *params, unsigned char* data, PTPObjectInfo *oi, unsign ed int len)
602 { 640 {
603 uint8_t filenamelen; 641 uint8_t filenamelen;
604 uint8_t capturedatelen; 642 uint8_t capturedatelen;
605 char *capture_date; 643 char *capture_date;
606 644
645 if (len < PTP_oi_SequenceNumber)
646 return;
647
648 oi->Filename = oi->Keywords = NULL;
649
650 /* FIXME: also handle length with all the strings at the end */
607 oi->StorageID=dtoh32a(&data[PTP_oi_StorageID]); 651 oi->StorageID=dtoh32a(&data[PTP_oi_StorageID]);
608 oi->ObjectFormat=dtoh16a(&data[PTP_oi_ObjectFormat]); 652 oi->ObjectFormat=dtoh16a(&data[PTP_oi_ObjectFormat]);
609 oi->ProtectionStatus=dtoh16a(&data[PTP_oi_ProtectionStatus]); 653 oi->ProtectionStatus=dtoh16a(&data[PTP_oi_ProtectionStatus]);
610 oi->ObjectCompressedSize=dtoh32a(&data[PTP_oi_ObjectCompressedSize]); 654 oi->ObjectCompressedSize=dtoh32a(&data[PTP_oi_ObjectCompressedSize]);
611 655
612 /* Stupid Samsung Galaxy developers emit a 64bit objectcompressedsize */ 656 /* Stupid Samsung Galaxy developers emit a 64bit objectcompressedsize */
613 if ((data[PTP_oi_filenamelen] == 0) && (data[PTP_oi_filenamelen+4] != 0) ) { 657 if ((data[PTP_oi_filenamelen] == 0) && (data[PTP_oi_filenamelen+4] != 0) ) {
614 params->ocs64 = 1; 658 params->ocs64 = 1;
615 data += 4; 659 data += 4;
616 } 660 }
(...skipping 29 matching lines...) Expand all
646 690
647 /* Custom Type Value Assignement (without Length) macro frequently used below */ 691 /* Custom Type Value Assignement (without Length) macro frequently used below */
648 #define CTVAL(target,func) { \ 692 #define CTVAL(target,func) { \
649 if (total - *offset < sizeof(target)) \ 693 if (total - *offset < sizeof(target)) \
650 return 0; \ 694 return 0; \
651 target = func(&data[*offset]); \ 695 target = func(&data[*offset]); \
652 *offset += sizeof(target); \ 696 *offset += sizeof(target); \
653 } 697 }
654 698
655 #define RARR(val,member,func) { \ 699 #define RARR(val,member,func) { \
656 » int n,j;» » » » » \ 700 » unsigned int n,j;» » » » \
657 if (total - *offset < sizeof(uint32_t)) \ 701 if (total - *offset < sizeof(uint32_t)) \
658 return 0; \ 702 return 0; \
659 n = dtoh32a (&data[*offset]); \ 703 n = dtoh32a (&data[*offset]); \
660 *offset += sizeof(uint32_t); \ 704 *offset += sizeof(uint32_t); \
661 \ 705 \
706 if (n >= UINT_MAX/sizeof(val->a.v[0])) \
707 return 0; \
662 val->a.count = n; \ 708 val->a.count = n; \
663 val->a.v = malloc(sizeof(val->a.v[0])*n); \ 709 val->a.v = malloc(sizeof(val->a.v[0])*n); \
664 if (!val->a.v) return 0; \ 710 if (!val->a.v) return 0; \
665 for (j=0;j<n;j++) \ 711 for (j=0;j<n;j++) \
666 CTVAL(val->a.v[j].member, func); \ 712 CTVAL(val->a.v[j].member, func); \
667 } 713 }
668 714
669 static inline int 715 static inline unsigned int
670 ptp_unpack_DPV ( 716 ptp_unpack_DPV (
671 » PTPParams *params, unsigned char* data, int *offset, int total, 717 » PTPParams *params, unsigned char* data, unsigned int *offset, unsigned i nt total,
672 PTPPropertyValue* value, uint16_t datatype 718 PTPPropertyValue* value, uint16_t datatype
673 ) { 719 ) {
674 switch (datatype) { 720 switch (datatype) {
675 case PTP_DTC_INT8: 721 case PTP_DTC_INT8:
676 CTVAL(value->i8,dtoh8a); 722 CTVAL(value->i8,dtoh8a);
677 break; 723 break;
678 case PTP_DTC_UINT8: 724 case PTP_DTC_UINT8:
679 CTVAL(value->u8,dtoh8a); 725 CTVAL(value->u8,dtoh8a);
680 break; 726 break;
681 case PTP_DTC_INT16: 727 case PTP_DTC_INT16:
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 return 1; 789 return 1;
744 break; 790 break;
745 } 791 }
746 default: 792 default:
747 return 0; 793 return 0;
748 } 794 }
749 return 1; 795 return 1;
750 } 796 }
751 797
752 /* Device Property pack/unpack */ 798 /* Device Property pack/unpack */
753
754 #define PTP_dpd_DevicePropertyCode 0 799 #define PTP_dpd_DevicePropertyCode 0
755 #define PTP_dpd_DataType 2 800 #define PTP_dpd_DataType 2
756 #define PTP_dpd_GetSet 4 801 #define PTP_dpd_GetSet 4
757 #define PTP_dpd_FactoryDefaultValue 5 802 #define PTP_dpd_FactoryDefaultValue 5
758 803
759 static inline int 804 static inline int
760 ptp_unpack_DPD (PTPParams *params, unsigned char* data, PTPDevicePropDesc *dpd, unsigned int dpdlen) 805 ptp_unpack_DPD (PTPParams *params, unsigned char* data, PTPDevicePropDesc *dpd, unsigned int dpdlen)
761 { 806 {
762 » int offset=0, ret; 807 » unsigned int offset = 0, ret;
763 808
764 memset (dpd, 0, sizeof(*dpd)); 809 memset (dpd, 0, sizeof(*dpd));
765 dpd->DevicePropertyCode=dtoh16a(&data[PTP_dpd_DevicePropertyCode]); 810 dpd->DevicePropertyCode=dtoh16a(&data[PTP_dpd_DevicePropertyCode]);
766 dpd->DataType=dtoh16a(&data[PTP_dpd_DataType]); 811 dpd->DataType=dtoh16a(&data[PTP_dpd_DataType]);
767 dpd->GetSet=dtoh8a(&data[PTP_dpd_GetSet]); 812 dpd->GetSet=dtoh8a(&data[PTP_dpd_GetSet]);
768 dpd->FormFlag=PTP_DPFF_None; 813 dpd->FormFlag=PTP_DPFF_None;
769 814
770 offset = PTP_dpd_FactoryDefaultValue; 815 offset = PTP_dpd_FactoryDefaultValue;
771 ret = ptp_unpack_DPV (params, data, &offset, dpdlen, &dpd->FactoryDefaul tValue, dpd->DataType); 816 ret = ptp_unpack_DPV (params, data, &offset, dpdlen, &dpd->FactoryDefaul tValue, dpd->DataType);
772 if (!ret) goto outofmemory; 817 if (!ret) goto outofmemory;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 } 867 }
823 } 868 }
824 } 869 }
825 #undef N 870 #undef N
826 return 1; 871 return 1;
827 outofmemory: 872 outofmemory:
828 ptp_free_devicepropdesc(dpd); 873 ptp_free_devicepropdesc(dpd);
829 return 0; 874 return 0;
830 } 875 }
831 876
832 /* (MTP) Object Property pack/unpack */ 877 /* Device Property pack/unpack */
878 #define PTP_dpd_Sony_DevicePropertyCode»0
879 #define PTP_dpd_Sony_DataType» » 2
880 #define PTP_dpd_Sony_GetSet» » 4
881 #define PTP_dpd_Sony_Unknown» » 5
882 #define PTP_dpd_Sony_FactoryDefaultValue» 6
883
884 static inline int
885 ptp_unpack_Sony_DPD (PTPParams *params, unsigned char* data, PTPDevicePropDesc * dpd, unsigned int dpdlen, unsigned int *poffset)
886 {
887 » unsigned int ret;
888 #if 0
889 » unsigned int unk1, unk2;
890 #endif
891
892 » memset (dpd, 0, sizeof(*dpd));
893 » dpd->DevicePropertyCode=dtoh16a(&data[PTP_dpd_Sony_DevicePropertyCode]);
894 » dpd->DataType=dtoh16a(&data[PTP_dpd_Sony_DataType]);
895
896 #if 0
897 » /* get set ? */
898 » unk1 = dtoh8a(&data[PTP_dpd_Sony_GetSet]);
899 » unk2 = dtoh8a(&data[PTP_dpd_Sony_Unknown]);
900 » ptp_debug (params, "prop 0x%04x, datatype 0x%04x, unk1 %d unk2 %d", dpd- >DevicePropertyCode, dpd->DataType, unk1, unk2);
901 #endif
902 » dpd->GetSet=1;
903
904 » dpd->FormFlag=PTP_DPFF_None;
905
906 » *poffset = PTP_dpd_Sony_FactoryDefaultValue;
907 » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dpd->FactoryDefaul tValue, dpd->DataType);
908 » if (!ret) goto outofmemory;
909 » if ((dpd->DataType == PTP_DTC_STR) && (*poffset == dpdlen))
910 » » return 1;
911 » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dpd->CurrentValue, dpd->DataType);
912 » if (!ret) goto outofmemory;
913
914 » /* if offset==0 then Data Type format is not supported by this
915 » code or the Data Type is a string (with two empty strings as
916 » values). In both cases Form Flag should be set to 0x00 and FORM is
917 » not present. */
918
919 » if (*poffset==PTP_dpd_Sony_FactoryDefaultValue)
920 » » return 1;
921
922 » dpd->FormFlag=dtoh8a(&data[*poffset]);
923 » *poffset+=sizeof(uint8_t);
924
925 » switch (dpd->FormFlag) {
926 » case PTP_DPFF_Range:
927 » » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dpd->FORM. Range.MinimumValue, dpd->DataType);
928 » » if (!ret) goto outofmemory;
929 » » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dpd->FORM. Range.MaximumValue, dpd->DataType);
930 » » if (!ret) goto outofmemory;
931 » » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dpd->FORM. Range.StepSize, dpd->DataType);
932 » » if (!ret) goto outofmemory;
933 » » break;
934 » case PTP_DPFF_Enumeration: {
935 » » int i;
936 #define N» dpd->FORM.Enum.NumberOfValues
937 » » N = dtoh16a(&data[*poffset]);
938 » » *poffset+=sizeof(uint16_t);
939 » » dpd->FORM.Enum.SupportedValue = malloc(N*sizeof(dpd->FORM.Enum.S upportedValue[0]));
940 » » if (!dpd->FORM.Enum.SupportedValue)
941 » » » goto outofmemory;
942
943 » » memset (dpd->FORM.Enum.SupportedValue,0 , N*sizeof(dpd->FORM.Enu m.SupportedValue[0]));
944 » » for (i=0;i<N;i++) {
945 » » » ret = ptp_unpack_DPV (params, data, poffset, dpdlen, &dp d->FORM.Enum.SupportedValue[i], dpd->DataType);
946
947 » » » /* Slightly different handling here. The HP PhotoSmart 1 20
948 » » » * specifies an enumeration with N in wrong endian
949 » » » * 00 01 instead of 01 00, so we count the enum just unt il the
950 » » » * the end of the packet.
951 » » » */
952 » » » if (!ret) {
953 » » » » if (!i)
954 » » » » » goto outofmemory;
955 » » » » dpd->FORM.Enum.NumberOfValues = i;
956 » » » » break;
957 » » » }
958 » » }
959 » » }
960 » }
961 #undef N
962 » return 1;
963 outofmemory:
964 » ptp_free_devicepropdesc(dpd);
965 » return 0;
966 }
967
968 static inline void
969 duplicate_PropertyValue (const PTPPropertyValue *src, PTPPropertyValue *dst, uin t16_t type) {
970 » if (type == PTP_DTC_STR) {
971 » » if (src->str)
972 » » » dst->str = strdup(src->str);
973 » » else
974 » » » dst->str = NULL;
975 » » return;
976 » }
977
978 » if (type & PTP_DTC_ARRAY_MASK) {
979 » » unsigned int i;
980
981 » » dst->a.count = src->a.count;
982 » » dst->a.v = malloc (sizeof(src->a.v[0])*src->a.count);
983 » » for (i=0;i<src->a.count;i++)
984 » » » duplicate_PropertyValue (&src->a.v[i], &dst->a.v[i], typ e & ~PTP_DTC_ARRAY_MASK);
985 » » return;
986 » }
987 » switch (type & ~PTP_DTC_ARRAY_MASK) {
988 » case PTP_DTC_INT8:» dst->i8 = src->i8; break;
989 » case PTP_DTC_UINT8:» dst->u8 = src->u8; break;
990 » case PTP_DTC_INT16:» dst->i16 = src->i16; break;
991 » case PTP_DTC_UINT16:» dst->u16 = src->u16; break;
992 » case PTP_DTC_INT32:» dst->i32 = src->i32; break;
993 » case PTP_DTC_UINT32:» dst->u32 = src->u32; break;
994 » case PTP_DTC_UINT64:» dst->u64 = src->u64; break;
995 » case PTP_DTC_INT64:» dst->i64 = src->i64; break;
996 #if 0
997 » case PTP_DTC_INT128:» dst->i128 = src->i128; break;
998 » case PTP_DTC_UINT128:» dst->u128 = src->u128; break;
999 #endif
1000 » default:» » break;
1001 » }
1002 » return;
1003 }
1004
1005 static inline void
1006 duplicate_DevicePropDesc(const PTPDevicePropDesc *src, PTPDevicePropDesc *dst) {
1007 » int i;
1008
1009 » dst->DevicePropertyCode»= src->DevicePropertyCode;
1010 » dst->DataType» » = src->DataType;
1011 » dst->GetSet» » = src->GetSet;
1012 »
1013 » duplicate_PropertyValue (&src->FactoryDefaultValue, &dst->FactoryDefault Value, src->DataType);
1014 » duplicate_PropertyValue (&src->CurrentValue, &dst->CurrentValue, src->Da taType);
1015
1016 » dst->FormFlag» » = src->FormFlag;
1017 » switch (src->FormFlag) {
1018 » case PTP_DPFF_Range:
1019 » » duplicate_PropertyValue (&src->FORM.Range.MinimumValue, &dst->FO RM.Range.MinimumValue, src->DataType);
1020 » » duplicate_PropertyValue (&src->FORM.Range.MaximumValue, &dst->FO RM.Range.MaximumValue, src->DataType);
1021 » » duplicate_PropertyValue (&src->FORM.Range.StepSize, &dst->FO RM.Range.StepSize, src->DataType);
1022 » » break;
1023 » case PTP_DPFF_Enumeration:
1024 » » dst->FORM.Enum.NumberOfValues = src->FORM.Enum.NumberOfValues;
1025 » » dst->FORM.Enum.SupportedValue = malloc (sizeof(dst->FORM.Enum.Su pportedValue[0])*src->FORM.Enum.NumberOfValues);
1026 » » for (i = 0; i<src->FORM.Enum.NumberOfValues ; i++)
1027 » » » duplicate_PropertyValue (&src->FORM.Enum.SupportedValue[ i], &dst->FORM.Enum.SupportedValue[i], src->DataType);
1028 » » break;
1029 » case PTP_DPFF_None:
1030 » » break;
1031 » }
1032 }
1033
833 #define PTP_opd_ObjectPropertyCode 0 1034 #define PTP_opd_ObjectPropertyCode 0
834 #define PTP_opd_DataType 2 1035 #define PTP_opd_DataType 2
835 #define PTP_opd_GetSet 4 1036 #define PTP_opd_GetSet 4
836 #define PTP_opd_FactoryDefaultValue 5 1037 #define PTP_opd_FactoryDefaultValue 5
837 1038
838 static inline int 1039 static inline int
839 ptp_unpack_OPD (PTPParams *params, unsigned char* data, PTPObjectPropDesc *opd, unsigned int opdlen) 1040 ptp_unpack_OPD (PTPParams *params, unsigned char* data, PTPObjectPropDesc *opd, unsigned int opdlen)
840 { 1041 {
841 » int offset=0, ret; 1042 » unsigned int offset=0, ret;
842 1043
843 memset (opd, 0, sizeof(*opd)); 1044 memset (opd, 0, sizeof(*opd));
844 opd->ObjectPropertyCode=dtoh16a(&data[PTP_opd_ObjectPropertyCode]); 1045 opd->ObjectPropertyCode=dtoh16a(&data[PTP_opd_ObjectPropertyCode]);
845 opd->DataType=dtoh16a(&data[PTP_opd_DataType]); 1046 opd->DataType=dtoh16a(&data[PTP_opd_DataType]);
846 opd->GetSet=dtoh8a(&data[PTP_opd_GetSet]); 1047 opd->GetSet=dtoh8a(&data[PTP_opd_GetSet]);
847 1048
848 offset = PTP_opd_FactoryDefaultValue; 1049 offset = PTP_opd_FactoryDefaultValue;
849 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FactoryDefaul tValue, opd->DataType); 1050 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FactoryDefaul tValue, opd->DataType);
850 if (!ret) goto outofmemory; 1051 if (!ret) goto outofmemory;
851 1052
852 opd->GroupCode=dtoh32a(&data[offset]); 1053 opd->GroupCode=dtoh32a(&data[offset]);
853 offset+=sizeof(uint32_t); 1054 offset+=sizeof(uint32_t);
854 1055
855 opd->FormFlag=dtoh8a(&data[offset]); 1056 opd->FormFlag=dtoh8a(&data[offset]);
856 offset+=sizeof(uint8_t); 1057 offset+=sizeof(uint8_t);
857 1058
858 switch (opd->FormFlag) { 1059 switch (opd->FormFlag) {
859 case PTP_OPFF_Range: 1060 case PTP_OPFF_Range:
860 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.MinimumValue, opd->DataType); 1061 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.MinimumValue, opd->DataType);
861 if (!ret) goto outofmemory; 1062 if (!ret) goto outofmemory;
862 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.MaximumValue, opd->DataType); 1063 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.MaximumValue, opd->DataType);
863 if (!ret) goto outofmemory; 1064 if (!ret) goto outofmemory;
864 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.StepSize, opd->DataType); 1065 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &opd->FORM. Range.StepSize, opd->DataType);
865 if (!ret) goto outofmemory; 1066 if (!ret) goto outofmemory;
866 break; 1067 break;
867 case PTP_OPFF_Enumeration: { 1068 case PTP_OPFF_Enumeration: {
868 » » int i; 1069 » » unsigned int i;
869 #define N opd->FORM.Enum.NumberOfValues 1070 #define N opd->FORM.Enum.NumberOfValues
870 N = dtoh16a(&data[offset]); 1071 N = dtoh16a(&data[offset]);
871 offset+=sizeof(uint16_t); 1072 offset+=sizeof(uint16_t);
872 opd->FORM.Enum.SupportedValue = malloc(N*sizeof(opd->FORM.Enum.S upportedValue[0])); 1073 opd->FORM.Enum.SupportedValue = malloc(N*sizeof(opd->FORM.Enum.S upportedValue[0]));
873 if (!opd->FORM.Enum.SupportedValue) 1074 if (!opd->FORM.Enum.SupportedValue)
874 goto outofmemory; 1075 goto outofmemory;
875 1076
876 memset (opd->FORM.Enum.SupportedValue,0 , N*sizeof(opd->FORM.Enu m.SupportedValue[0])); 1077 memset (opd->FORM.Enum.SupportedValue,0 , N*sizeof(opd->FORM.Enu m.SupportedValue[0]));
877 for (i=0;i<N;i++) { 1078 for (i=0;i<N;i++) {
878 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &op d->FORM.Enum.SupportedValue[i], opd->DataType); 1079 ret = ptp_unpack_DPV (params, data, &offset, opdlen, &op d->FORM.Enum.SupportedValue[i], opd->DataType);
(...skipping 18 matching lines...) Expand all
897 ptp_free_objectpropdesc(opd); 1098 ptp_free_objectpropdesc(opd);
898 return 0; 1099 return 0;
899 } 1100 }
900 1101
901 1102
902 static inline uint32_t 1103 static inline uint32_t
903 ptp_pack_DPV (PTPParams *params, PTPPropertyValue* value, unsigned char** dpvptr , uint16_t datatype) 1104 ptp_pack_DPV (PTPParams *params, PTPPropertyValue* value, unsigned char** dpvptr , uint16_t datatype)
904 { 1105 {
905 unsigned char* dpv=NULL; 1106 unsigned char* dpv=NULL;
906 uint32_t size=0; 1107 uint32_t size=0;
907 » int» i; 1108 » unsigned int i;
908 1109
909 switch (datatype) { 1110 switch (datatype) {
910 case PTP_DTC_INT8: 1111 case PTP_DTC_INT8:
911 size=sizeof(int8_t); 1112 size=sizeof(int8_t);
912 dpv=malloc(size); 1113 dpv=malloc(size);
913 htod8a(dpv,value->i8); 1114 htod8a(dpv,value->i8);
914 break; 1115 break;
915 case PTP_DTC_UINT8: 1116 case PTP_DTC_UINT8:
916 size=sizeof(uint8_t); 1117 size=sizeof(uint8_t);
917 dpv=malloc(size); 1118 dpv=malloc(size);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 const MTPProperties *py = y; 1279 const MTPProperties *py = y;
1079 1280
1080 return px->ObjectHandle - py->ObjectHandle; 1281 return px->ObjectHandle - py->ObjectHandle;
1081 } 1282 }
1082 1283
1083 static inline int 1284 static inline int
1084 ptp_unpack_OPL (PTPParams *params, unsigned char* data, MTPProperties **pprops, unsigned int len) 1285 ptp_unpack_OPL (PTPParams *params, unsigned char* data, MTPProperties **pprops, unsigned int len)
1085 { 1286 {
1086 uint32_t prop_count = dtoh32a(data); 1287 uint32_t prop_count = dtoh32a(data);
1087 MTPProperties *props = NULL; 1288 MTPProperties *props = NULL;
1088 » int offset = 0, i; 1289 » unsigned int offset = 0, i;
1089 1290
1090 if (prop_count == 0) { 1291 if (prop_count == 0) {
1091 *pprops = NULL; 1292 *pprops = NULL;
1092 return 0; 1293 return 0;
1093 } 1294 }
1094 ptp_debug (params ,"Unpacking MTP OPL, size %d (prop_count %d)", len, pr op_count); 1295 ptp_debug (params ,"Unpacking MTP OPL, size %d (prop_count %d)", len, pr op_count);
1095 data += sizeof(uint32_t); 1296 data += sizeof(uint32_t);
1096 len -= sizeof(uint32_t); 1297 len -= sizeof(uint32_t);
1097 props = malloc(prop_count * sizeof(MTPProperties)); 1298 props = malloc(prop_count * sizeof(MTPProperties));
1098 if (!props) return 0; 1299 if (!props) return 0;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 #define PTP_ec_Type 4 1337 #define PTP_ec_Type 4
1137 #define PTP_ec_Code 6 1338 #define PTP_ec_Code 6
1138 #define PTP_ec_TransId 8 1339 #define PTP_ec_TransId 8
1139 #define PTP_ec_Param1 12 1340 #define PTP_ec_Param1 12
1140 #define PTP_ec_Param2 16 1341 #define PTP_ec_Param2 16
1141 #define PTP_ec_Param3 20 1342 #define PTP_ec_Param3 20
1142 1343
1143 static inline void 1344 static inline void
1144 ptp_unpack_EC (PTPParams *params, unsigned char* data, PTPContainer *ec, unsigne d int len) 1345 ptp_unpack_EC (PTPParams *params, unsigned char* data, PTPContainer *ec, unsigne d int len)
1145 { 1346 {
1146 » int» length; 1347 » unsigned int» length;
1147 int type; 1348 int type;
1148 1349
1149 if (data==NULL) 1350 if (data==NULL)
1150 return; 1351 return;
1151 memset(ec,0,sizeof(*ec)); 1352 memset(ec,0,sizeof(*ec));
1353
1152 length=dtoh32a(&data[PTP_ec_Length]); 1354 length=dtoh32a(&data[PTP_ec_Length]);
1355 if (length > len) {
1356 ptp_debug (params, "length %d in container, but data only %d byt es?!", length, len);
1357 return;
1358 }
1153 type = dtoh16a(&data[PTP_ec_Type]); 1359 type = dtoh16a(&data[PTP_ec_Type]);
1154 1360
1155 ec->Code=dtoh16a(&data[PTP_ec_Code]); 1361 ec->Code=dtoh16a(&data[PTP_ec_Code]);
1156 ec->Transaction_ID=dtoh32a(&data[PTP_ec_TransId]); 1362 ec->Transaction_ID=dtoh32a(&data[PTP_ec_TransId]);
1157 1363
1158 if (type!=PTP_USB_CONTAINER_EVENT) { 1364 if (type!=PTP_USB_CONTAINER_EVENT) {
1159 ptp_debug (params, "Unknown canon event type %d (code=%x,tid=%x) , please report!",type,ec->Code,ec->Transaction_ID); 1365 ptp_debug (params, "Unknown canon event type %d (code=%x,tid=%x) , please report!",type,ec->Code,ec->Transaction_ID);
1160 return; 1366 return;
1161 } 1367 }
1162 if (length>=(PTP_ec_Param1+4)) { 1368 if (length>=(PTP_ec_Param1+4)) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1233 AssociationType: 0x0000 1439 AssociationType: 0x0000
1234 AssociationDesc: 0x00000000 1440 AssociationDesc: 0x00000000
1235 SequenceNumber: 0x00000000 1441 SequenceNumber: 0x00000000
1236 ModificationDate: 0x4d985ff0 1442 ModificationDate: 0x4d985ff0
1237 CaptureDate: 0x4d985ff0 1443 CaptureDate: 0x4d985ff0
1238 1444
1239 0010 38 00 00 00 Size of this entry 1445 0010 38 00 00 00 Size of this entry
1240 0014 72 0c 74 92 OID 1446 0014 72 0c 74 92 OID
1241 0018 01 00 02 00 StorageID 1447 0018 01 00 02 00 StorageID
1242 001c 01 38 00 00 OFC 1448 001c 01 38 00 00 OFC
1243 0020 00 00 00 00 00 00 00 00 ? 1449 0020 00 00 00 00 ??
1450 0024 21 00 00 00 flags (4 bytes? 1 byte?)
1244 0028 19 d5 21 00 Size 1451 0028 19 d5 21 00 Size
1245 002c 00 00 74 92 ? 1452 002c 00 00 74 92 ?
1246 0030 70 0c 74 92 OID 1453 0030 70 0c 74 92 OID
1247 0034 49 4d 47 5f-30 31 39 39 2e 4a 50 47 IMG_0199.JPG 1454 0034 49 4d 47 5f-30 31 39 39 2e 4a 50 47 IMG_0199.JPG
1248 0040 00 00 00 00 1455 0040 00 00 00 00
1249 0044 10 7c 98 4d Time 1456 0044 10 7c 98 4d Time
1250 1457
1251 1458
1252 */ 1459 */
1253 #define PTP_cefe_ObjectHandle 0 1460 #define PTP_cefe_ObjectHandle 0
1254 #define PTP_cefe_StorageID 4 1461 #define PTP_cefe_StorageID 4
1255 #define PTP_cefe_ObjectFormatCode 8 1462 #define PTP_cefe_ObjectFormatCode 8
1256 #define PTP_cefe_Flags» » » 12 1463 #define PTP_cefe_Flags» » » 16
1257 #define PTP_cefe_ObjectSize 20 1464 #define PTP_cefe_ObjectSize 20
1258 #define PTP_cefe_Filename 32 1465 #define PTP_cefe_Filename 32
1259 #define PTP_cefe_Time 48 1466 #define PTP_cefe_Time 48
1260 1467
1261 static inline void 1468 static inline void
1262 ptp_unpack_Canon_EOS_FE (PTPParams *params, unsigned char* data, PTPCANONFolderE ntry *fe) 1469 ptp_unpack_Canon_EOS_FE (PTPParams *params, unsigned char* data, PTPCANONFolderE ntry *fe)
1263 { 1470 {
1264 int i; 1471 int i;
1265 1472
1266 fe->ObjectHandle=dtoh32a(&data[PTP_cefe_ObjectHandle]); 1473 fe->ObjectHandle=dtoh32a(&data[PTP_cefe_ObjectHandle]);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 htod32a(data+=4, ((value >> 0) & 0xF) == 4 ? 6 : 1); 1572 htod32a(data+=4, ((value >> 0) & 0xF) == 4 ? 6 : 1);
1366 htod32a(data+=4, PACK_5DM3_SMALL_JPEG_SIZE((value >> 4) & 0xF)); 1573 htod32a(data+=4, PACK_5DM3_SMALL_JPEG_SIZE((value >> 4) & 0xF));
1367 htod32a(data+=4, (value >> 0) & 0xF); 1574 htod32a(data+=4, (value >> 0) & 0xF);
1368 } 1575 }
1369 1576
1370 #undef PACK_5DM3_SMALL_JPEG_SIZE 1577 #undef PACK_5DM3_SMALL_JPEG_SIZE
1371 1578
1372 return s; 1579 return s;
1373 } 1580 }
1374 1581
1582 /* 00: 32 bit size
1583 * 04: 16 bit subsize
1584 * 08: 16 bit version (?)
1585 * 0c: 16 bit focus_points_in_struct
1586 * 10: 16 bit focus_points_in_use
1587 * 14: variable arrays:
1588 * 16 bit sizex, 16 bit sizey
1589 * 16 bit othersizex, 16 bit othersizey
1590 * 16 bit array height[focus_points_in_struct]
1591 * 16 bit array width[focus_points_in_struct]
1592 * 16 bit array offsetheight[focus_points_in_struct] middle is 0
1593 * 16 bit array offsetwidth[focus_points_in_struct] middle is ?
1594 * bitfield of selected focus points, starting with 0 [size focus_points_in_stru ct in bits]
1595 * unknown stuff , likely which are active
1596 * 16 bit 0xffff
1597 *
1598 * size=NxN,size2=NxN,points={NxNxNxN,NxNxNxN,...},selected={0,1,2}
1599 */
1600 static inline char*
1601 ptp_unpack_EOS_FocusInfoEx (PTPParams* params, unsigned char** data )
1602 {
1603 uint32_t size = dtoh32a( *data );
1604 uint32_t halfsize = dtoh16a( (*data) + 4);
1605 uint32_t version = dtoh16a( (*data) + 6);
1606 uint32_t focus_points_in_struct = dtoh16a( (*data) + 8);
1607 uint32_t focus_points_in_use = dtoh16a( (*data) + 10);
1608 uint32_t sizeX = dtoh16a( (*data) + 12);
1609 uint32_t sizeY = dtoh16a( (*data) + 14);
1610 uint32_t size2X = dtoh16a( (*data) + 16);
1611 uint32_t size2Y = dtoh16a( (*data) + 18);
1612 uint32_t i;
1613 uint32_t maxlen;
1614 char *str, *p;
1615
1616 /* every focuspoint gets 4 (16 bit number and a x) and a ,*/
1617 /* inital things around lets say 100 chars at most.
1618 * FIXME: check selected when we decode it */
1619 maxlen = focus_points_in_use*6*4 + focus_points_in_use + 100;
1620 if (halfsize != size-4) {
1621 ptp_error(params, "halfsize %d is not expected %d", halfsize, si ze-4);
1622 return "bad size";
1623 }
1624 if (20 + focus_points_in_struct*8 + (focus_points_in_struct+7)/8 > size) {
1625 ptp_error(params, "size %d is too large for fp in struct %d", fo cus_points_in_struct*8 + 20 + (focus_points_in_struct+7)/8, size);
1626 return "bad size 2";
1627 }
1628 #if 0
1629 ptp_debug(params,"d1d3 content:");
1630 for (i=0;i<size;i+=2)
1631 ptp_debug(params,"%d: %02x %02x", i, (*data)[i], (*data)[i+1]);
1632 #endif
1633 ptp_debug(params,"d1d3 version", version);
1634 ptp_debug(params,"d1d3 focus points in struct %d, in use %d", focus_poin ts_in_struct, focus_points_in_use);
1635
1636 str = (char*)malloc( maxlen );
1637 if (!str)
1638 return NULL;
1639 p = str;
1640
1641 p += sprintf(p,"eosversion=%d,size=%dx%d,size2=%dx%d,points={", version, sizeX, sizeY, size2X, size2Y);
1642 for (i=0;i<focus_points_in_use;i++) {
1643 int16_t x = dtoh16a((*data) + focus_points_in_struct*4 + 20 + 2* i);
1644 int16_t y = dtoh16a((*data) + focus_points_in_struct*6 + 20 + 2* i);
1645 int16_t w = dtoh16a((*data) + focus_points_in_struct*2 + 20 + 2* i);
1646 int16_t h = dtoh16a((*data) + focus_points_in_struct*0 + 20 + 2* i);
1647
1648 p += sprintf(p,"{%d,%d,%d,%d}",x,y,w,h);
1649
1650 if (i<focus_points_in_use-1)
1651 p += sprintf(p,",");
1652 }
1653 p += sprintf(p,"},select={");
1654 for (i=0;i<focus_points_in_use;i++) {
1655 if ((1<<(i%7)) & ((*data)[focus_points_in_struct*8+20+i/8]))
1656 p+=sprintf(p,"%d,", i);
1657 }
1658
1659 p += sprintf(p,"},unknown={");
1660 for (i=focus_points_in_struct*8+(focus_points_in_struct+7)/8+20;i<size;i ++) {
1661 p+=sprintf(p,"%02x", (*data)[i]);
1662 }
1663 p += sprintf(p,"}");
1664 return str;
1665 }
1666
1667
1375 static inline char* 1668 static inline char*
1376 ptp_unpack_EOS_CustomFuncEx (PTPParams* params, unsigned char** data ) 1669 ptp_unpack_EOS_CustomFuncEx (PTPParams* params, unsigned char** data )
1377 { 1670 {
1378 uint32_t s = dtoh32a( *data ); 1671 uint32_t s = dtoh32a( *data );
1379 uint32_t n = s/4, i; 1672 uint32_t n = s/4, i;
1380 » char* str = (char*)malloc( s ); // n is size in uint32, average len(itoa (i)) < 4 -> alloc n chars 1673 » char* str = (char*)malloc( s*2+s/4+1 ); /* n is size in uint32, maximum %x len is 8 chars and \0*/
1381 if (!str) 1674 if (!str)
1382 return str; 1675 return str;
1383 char* p = str; 1676 char* p = str;
1384 1677
1385 for (i=0; i < n; ++i) 1678 for (i=0; i < n; ++i)
1386 p += sprintf(p, "%x,", dtoh32a( *data + 4*i )); 1679 p += sprintf(p, "%x,", dtoh32a( *data + 4*i ));
1387 1680
1388 return str; 1681 return str;
1389 } 1682 }
1390 1683
1391 static inline uint32_t 1684 static inline uint32_t
1392 ptp_pack_EOS_CustomFuncEx (PTPParams* params, unsigned char* data, char* str) 1685 ptp_pack_EOS_CustomFuncEx (PTPParams* params, unsigned char* data, char* str)
1393 { 1686 {
1394 uint32_t s = strtoul(str, NULL, 16); 1687 uint32_t s = strtoul(str, NULL, 16);
1395 uint32_t n = s/4, i, v; 1688 uint32_t n = s/4, i, v;
1396 1689
1397 if (!data) 1690 if (!data)
1398 return s; 1691 return s;
1399 1692
1400 for (i=0; i<n; i++) 1693 for (i=0; i<n; i++)
1401 { 1694 {
1402 v = strtoul(str, &str, 16); 1695 v = strtoul(str, &str, 16);
1403 » » str++; // skip the ',' delimiter 1696 » » str++; /* skip the ',' delimiter */
1404 htod32a(data + i*4, v); 1697 htod32a(data + i*4, v);
1405 } 1698 }
1406 1699
1407 return s; 1700 return s;
1408 } 1701 }
1409 1702
1410 /* 1703 /*
1411 PTP EOS Changes Entry unpack 1704 PTP EOS Changes Entry unpack
1412 */ 1705 */
1413 #define PTP_ece_Size 0 1706 #define PTP_ece_Size 0
(...skipping 12 matching lines...) Expand all
1426 #define PTP_ece_OI_Name 0x1c 1719 #define PTP_ece_OI_Name 0x1c
1427 1720
1428 /* for PTP_EC_CANON_EOS_ObjectAddedEx */ 1721 /* for PTP_EC_CANON_EOS_ObjectAddedEx */
1429 #define PTP_ece_OA_ObjectID 8 1722 #define PTP_ece_OA_ObjectID 8
1430 #define PTP_ece_OA_StorageID 0x0c 1723 #define PTP_ece_OA_StorageID 0x0c
1431 #define PTP_ece_OA_OFC 0x10 1724 #define PTP_ece_OA_OFC 0x10
1432 #define PTP_ece_OA_Size 0x1c 1725 #define PTP_ece_OA_Size 0x1c
1433 #define PTP_ece_OA_Parent 0x20 1726 #define PTP_ece_OA_Parent 0x20
1434 #define PTP_ece_OA_Name 0x28 1727 #define PTP_ece_OA_Name 0x28
1435 1728
1729 static PTPDevicePropDesc*
1730 _lookup_or_allocate_canon_prop(PTPParams *params, uint16_t proptype)
1731 {
1732 unsigned int j;
1733
1734 for (j=0;j<params->nrofcanon_props;j++)
1735 if (params->canon_props[j].proptype == proptype)
1736 break;
1737 if (j<params->nrofcanon_props)
1738 return &params->canon_props[j].dpd;
1739
1740 if (j)
1741 params->canon_props = realloc(params->canon_props, sizeof(params ->canon_props[0])*(j+1));
1742 else
1743 params->canon_props = malloc(sizeof(params->canon_props[0]));
1744 params->canon_props[j].proptype = proptype;
1745 params->canon_props[j].size = 0;
1746 params->canon_props[j].data = NULL;
1747 memset (&params->canon_props[j].dpd,0,sizeof(params->canon_props[j].dpd) );
1748 params->canon_props[j].dpd.GetSet = 1;
1749 params->canon_props[j].dpd.FormFlag = PTP_DPFF_None;
1750 params->nrofcanon_props = j+1;
1751 return &params->canon_props[j].dpd;
1752 }
1753
1754
1436 static inline int 1755 static inline int
1437 ptp_unpack_CANON_changes (PTPParams *params, unsigned char* data, int datasize, PTPCanon_changes_entry **ce) 1756 ptp_unpack_CANON_changes (PTPParams *params, unsigned char* data, int datasize, PTPCanon_changes_entry **pce)
1438 { 1757 {
1439 int i = 0, entries = 0; 1758 int i = 0, entries = 0;
1440 unsigned char *curdata = data; 1759 unsigned char *curdata = data;
1760 PTPCanon_changes_entry *ce;
1441 1761
1442 if (data==NULL) 1762 if (data==NULL)
1443 return 0; 1763 return 0;
1444 while (curdata - data < datasize) { 1764 while (curdata - data < datasize) {
1445 uint32_t size = dtoh32a(&curdata[PTP_ece_Size]); 1765 uint32_t size = dtoh32a(&curdata[PTP_ece_Size]);
1446 uint32_t type = dtoh32a(&curdata[PTP_ece_Type]); 1766 uint32_t type = dtoh32a(&curdata[PTP_ece_Type]);
1447 1767
1448 curdata += size;
1449 if ((size == 8) && (type == 0)) 1768 if ((size == 8) && (type == 0))
1450 break; 1769 break;
1770 if (type == PTP_EC_CANON_EOS_OLCInfoChanged) {
1771 unsigned int j;
1772
1773 for (j=0;j<31;j++)
1774 if (dtoh32a(curdata+12) & (1<<j))
1775 entries++;
1776 }
1777 curdata += size;
1451 entries++; 1778 entries++;
1452 } 1779 }
1453 » *ce = malloc (sizeof(PTPCanon_changes_entry)*(entries+1)); 1780 » ce = malloc (sizeof(PTPCanon_changes_entry)*(entries+1));
1454 » if (!*ce) return 0; 1781 » if (!ce) return 0;
1455 1782
1456 curdata = data; 1783 curdata = data;
1457 while (curdata - data < datasize) { 1784 while (curdata - data < datasize) {
1458 uint32_t size = dtoh32a(&curdata[PTP_ece_Size]); 1785 uint32_t size = dtoh32a(&curdata[PTP_ece_Size]);
1459 uint32_t type = dtoh32a(&curdata[PTP_ece_Type]); 1786 uint32_t type = dtoh32a(&curdata[PTP_ece_Type]);
1460 1787
1461 » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN; 1788 » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
1462 » » (*ce)[i].u.info = NULL; 1789 » » ce[i].u.info = NULL;
1463 switch (type) { 1790 switch (type) {
1464 case PTP_EC_CANON_EOS_ObjectAddedEx: 1791 case PTP_EC_CANON_EOS_ObjectAddedEx:
1465 » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_OBJECTINFO; 1792 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_OBJECTINFO;
1466 » » » (*ce)[i].u.object.oid » » = dtoh32a(&curda ta[PTP_ece_OA_ObjectID]); 1793 » » » ce[i].u.object.oid » » = dtoh32a(&curdata[PTP_e ce_OA_ObjectID]);
1467 » » » (*ce)[i].u.object.oi.StorageID »» = dtoh32a(&curda ta[PTP_ece_OA_StorageID]); 1794 » » » ce[i].u.object.oi.StorageID » » = dtoh32a(&curda ta[PTP_ece_OA_StorageID]);
1468 » » » (*ce)[i].u.object.oi.ParentObject» = dtoh32a(&curda ta[PTP_ece_OA_Parent]); 1795 » » » ce[i].u.object.oi.ParentObject» = dtoh32a(&curdata[PTP_e ce_OA_Parent]);
1469 » » » (*ce)[i].u.object.oi.ObjectFormat » = dtoh16a(&curda ta[PTP_ece_OA_OFC]); 1796 » » » ce[i].u.object.oi.ObjectFormat »= dtoh16a(&curdata[PTP_e ce_OA_OFC]);
1470 » » » (*ce)[i].u.object.oi.ObjectCompressedSize= dtoh32a(&curd ata[PTP_ece_OA_Size]); 1797 » » » ce[i].u.object.oi.ObjectCompressedSize= dtoh32a(&curdata [PTP_ece_OA_Size]);
1471 » » » (*ce)[i].u.object.oi.Filename » » = strdup(((char* )&curdata[PTP_ece_OA_Name])); 1798 » » » ce[i].u.object.oi.Filename » » = strdup(((char* )&curdata[PTP_ece_OA_Name]));
1472 » » » ptp_debug (params, "event %d: objectinfo added oid %08lx , parent %08lx, ofc %04x, size %d, filename %s", i, (*ce)[i].u.object.oid, (*ce) [i].u.object.oi.ParentObject, (*ce)[i].u.object.oi.ObjectFormat, (*ce)[i].u.obje ct.oi.ObjectCompressedSize, (*ce)[i].u.object.oi.Filename); 1799 » » » ptp_debug (params, "event %d: objectinfo added oid %08lx , parent %08lx, ofc %04x, size %d, filename %s", i, ce[i].u.object.oid, ce[i].u. object.oi.ParentObject, ce[i].u.object.oi.ObjectFormat, ce[i].u.object.oi.Object CompressedSize, ce[i].u.object.oi.Filename);
1473 break; 1800 break;
1474 case PTP_EC_CANON_EOS_RequestObjectTransfer: 1801 case PTP_EC_CANON_EOS_RequestObjectTransfer:
1475 » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_OBJECTTRANSFE R; 1802 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_OBJECTTRANSFER;
1476 » » » (*ce)[i].u.object.oid » » = dtoh32a(&curda ta[PTP_ece_OI_ObjectID]); 1803 » » » ce[i].u.object.oid » » = dtoh32a(&curdata[PTP_e ce_OI_ObjectID]);
1477 » » » (*ce)[i].u.object.oi.StorageID »» = 0; /* use as m arker */ 1804 » » » ce[i].u.object.oi.StorageID » » = 0; /* use as m arker */
1478 » » » (*ce)[i].u.object.oi.ObjectFormat » = dtoh16a(&curda ta[PTP_ece_OI_OFC]); 1805 » » » ce[i].u.object.oi.ObjectFormat »= dtoh16a(&curdata[PTP_e ce_OI_OFC]);
1479 » » » (*ce)[i].u.object.oi.ParentObject» = 0; /* check, b ut use as marker */ 1806 » » » ce[i].u.object.oi.ParentObject» = 0; /* check, but use a s marker */
1480 » » » (*ce)[i].u.object.oi.ObjectCompressedSize = dtoh32a(&cur data[PTP_ece_OI_Size]); 1807 » » » ce[i].u.object.oi.ObjectCompressedSize = dtoh32a(&curdat a[PTP_ece_OI_Size]);
1481 » » » (*ce)[i].u.object.oi.Filename » » = strdup(((char* )&curdata[PTP_ece_OI_Name])); 1808 » » » ce[i].u.object.oi.Filename » » = strdup(((char* )&curdata[PTP_ece_OI_Name]));
1482 1809
1483 » » » ptp_debug (params, "event %d: request object transfer oi d %08lx, ofc %04x, size %d, filename %s", i, (*ce)[i].u.object.oid, (*ce)[i].u.o bject.oi.ObjectFormat, (*ce)[i].u.object.oi.ObjectCompressedSize, (*ce)[i].u.obj ect.oi.Filename); 1810 » » » ptp_debug (params, "event %d: request object transfer oi d %08lx, ofc %04x, size %d, filename %p", i, ce[i].u.object.oid, ce[i].u.object. oi.ObjectFormat, ce[i].u.object.oi.ObjectCompressedSize, ce[i].u.object.oi.Filen ame);
1484 break; 1811 break;
1485 case PTP_EC_CANON_EOS_AvailListChanged: { /* property desc */ 1812 case PTP_EC_CANON_EOS_AvailListChanged: { /* property desc */
1486 uint32_t proptype = dtoh32a(&curdata[PTP_ece_Prop _Subtype]); 1813 uint32_t proptype = dtoh32a(&curdata[PTP_ece_Prop _Subtype]);
1487 uint32_t propxtype = dtoh32a(&curdata[PTP_ece_Pro p_Desc_Type]); 1814 uint32_t propxtype = dtoh32a(&curdata[PTP_ece_Pro p_Desc_Type]);
1488 uint32_t propxcnt = dtoh32a(&curdata[PTP_ece_Prop _Desc_Count]); 1815 uint32_t propxcnt = dtoh32a(&curdata[PTP_ece_Prop _Desc_Count]);
1489 unsigned char *xdata = &curdata[PTP_ece_Prop_Desc_Data ]; 1816 unsigned char *xdata = &curdata[PTP_ece_Prop_Desc_Data ];
1490 » » » int» » j; 1817 » » » unsigned int» j;
1491 PTPDevicePropDesc *dpd; 1818 PTPDevicePropDesc *dpd;
1492 1819
1493 ptp_debug (params, "event %d: EOS prop %04x desc record, datasize %d, propxtype %d", i, proptype, size-PTP_ece_Prop_Desc_Data, propxtype ); 1820 ptp_debug (params, "event %d: EOS prop %04x desc record, datasize %d, propxtype %d", i, proptype, size-PTP_ece_Prop_Desc_Data, propxtype );
1494 for (j=0;j<params->nrofcanon_props;j++) 1821 for (j=0;j<params->nrofcanon_props;j++)
1495 if (params->canon_props[j].proptype == proptype) 1822 if (params->canon_props[j].proptype == proptype)
1496 break; 1823 break;
1497 if (j==params->nrofcanon_props) { 1824 if (j==params->nrofcanon_props) {
1498 ptp_debug (params, "event %d: propdesc %x, defau lt value not found.", i, proptype); 1825 ptp_debug (params, "event %d: propdesc %x, defau lt value not found.", i, proptype);
1499 break; 1826 break;
1500 } 1827 }
1501 dpd = &params->canon_props[j].dpd; 1828 dpd = &params->canon_props[j].dpd;
1502 /* 1 - uint16 ? 1829 /* 1 - uint16 ?
1503 * 3 - uint16 1830 * 3 - uint16
1504 * 7 - string? 1831 * 7 - string?
1505 */ 1832 */
1506 if (propxtype != 3) { 1833 if (propxtype != 3) {
1507 ptp_debug (params, "event %d: propxtype is %x fo r %04x, unhandled.", i, propxtype, proptype); 1834 ptp_debug (params, "event %d: propxtype is %x fo r %04x, unhandled.", i, propxtype, proptype);
1508 for (j=0;j<size-PTP_ece_Prop_Desc_Data;j++) 1835 for (j=0;j<size-PTP_ece_Prop_Desc_Data;j++)
1509 ptp_debug (params, " %d: %02x", j, xd ata[j]); 1836 ptp_debug (params, " %d: %02x", j, xd ata[j]);
1510 break; 1837 break;
1511 } 1838 }
1512 if (! propxcnt) 1839 if (! propxcnt)
1513 break; 1840 break;
1841 if (propxcnt >= 2<<16) /* buggy or exploit */
1842 break;
1514 1843
1515 ptp_debug (params, "event %d: propxtype is %x, prop is 0 x%04x, data type is 0x%04x, propxcnt is %d.", 1844 ptp_debug (params, "event %d: propxtype is %x, prop is 0 x%04x, data type is 0x%04x, propxcnt is %d.",
1516 i, propxtype, proptype, dpd->DataType, propxc nt); 1845 i, propxtype, proptype, dpd->DataType, propxc nt);
1517 dpd->FormFlag = PTP_DPFF_Enumeration; 1846 dpd->FormFlag = PTP_DPFF_Enumeration;
1518 dpd->FORM.Enum.NumberOfValues = propxcnt; 1847 dpd->FORM.Enum.NumberOfValues = propxcnt;
1519 » » » if (dpd->FORM.Enum.SupportedValue) free (dpd->FORM.Enum. SupportedValue); 1848 » » » free (dpd->FORM.Enum.SupportedValue);
1520 dpd->FORM.Enum.SupportedValue = malloc (sizeof (PTPPrope rtyValue)*propxcnt); 1849 dpd->FORM.Enum.SupportedValue = malloc (sizeof (PTPPrope rtyValue)*propxcnt);
1521 1850
1522 switch (proptype) { 1851 switch (proptype) {
1523 case PTP_DPC_CANON_EOS_ImageFormat: 1852 case PTP_DPC_CANON_EOS_ImageFormat:
1524 case PTP_DPC_CANON_EOS_ImageFormatCF: 1853 case PTP_DPC_CANON_EOS_ImageFormatCF:
1525 case PTP_DPC_CANON_EOS_ImageFormatSD: 1854 case PTP_DPC_CANON_EOS_ImageFormatSD:
1526 case PTP_DPC_CANON_EOS_ImageFormatExtHD: 1855 case PTP_DPC_CANON_EOS_ImageFormatExtHD:
1527 /* special handling of ImageFormat properties */ 1856 /* special handling of ImageFormat properties */
1528 for (j=0;j<propxcnt;j++) { 1857 for (j=0;j<propxcnt;j++) {
1529 dpd->FORM.Enum.SupportedValue[j].u16 = 1858 dpd->FORM.Enum.SupportedValue[j].u16 =
1530 » » » » » » » dtoh16( ptp_unpack_EOS_I mageFormat( params, &xdata ) ); 1859 » » » » » » » ptp_unpack_EOS_ImageForm at( params, &xdata );
1531 ptp_debug (params, "event %d: suppval[%d ] of %x is 0x%x.", i, j, proptype, dpd->FORM.Enum.SupportedValue[j].u16); 1860 ptp_debug (params, "event %d: suppval[%d ] of %x is 0x%x.", i, j, proptype, dpd->FORM.Enum.SupportedValue[j].u16);
1532 } 1861 }
1533 break; 1862 break;
1534 default: 1863 default:
1535 /* 'normal' enumerated types */ 1864 /* 'normal' enumerated types */
1536 switch (dpd->DataType) { 1865 switch (dpd->DataType) {
1537 #define XX( TYPE, CONV )\ 1866 #define XX( TYPE, CONV )\
1538 for (j=0;j<propxcnt;j++) { \ 1867 for (j=0;j<propxcnt;j++) { \
1539 dpd->FORM.Enum.SupportedValue[j] .TYPE = CONV(xdata); \ 1868 dpd->FORM.Enum.SupportedValue[j] .TYPE = CONV(xdata); \
1540 ptp_debug (params, "event %d: su ppval[%d] of %x is 0x%x.", i, j, proptype, CONV(xdata)); \ 1869 ptp_debug (params, "event %d: su ppval[%d] of %x is 0x%x.", i, j, proptype, CONV(xdata)); \
(...skipping 10 matching lines...) Expand all
1551 ptp_debug (params ,"event %d: data type 0x%04x of %x unhandled, raw values:", i, dpd->DataType, proptype, dtoh32a(xdata) ); 1880 ptp_debug (params ,"event %d: data type 0x%04x of %x unhandled, raw values:", i, dpd->DataType, proptype, dtoh32a(xdata) );
1552 for (j=0;j<(size-PTP_ece_Prop_Desc_Data) /4;j++, xdata+=4) /* 4 is good for propxtype 3 */ 1881 for (j=0;j<(size-PTP_ece_Prop_Desc_Data) /4;j++, xdata+=4) /* 4 is good for propxtype 3 */
1553 ptp_debug (params, " %3d: 0x% 8x", j, dtoh32a(xdata)); 1882 ptp_debug (params, " %3d: 0x% 8x", j, dtoh32a(xdata));
1554 break; 1883 break;
1555 } 1884 }
1556 } 1885 }
1557 break; 1886 break;
1558 } 1887 }
1559 case PTP_EC_CANON_EOS_PropValueChanged: 1888 case PTP_EC_CANON_EOS_PropValueChanged:
1560 if (size >= 0xc) { /* property info */ 1889 if (size >= 0xc) { /* property info */
1561 » » » » int j; 1890 » » » » unsigned int j;
1562 uint32_t proptype = dtoh32a(&curdata[PTP_ ece_Prop_Subtype]); 1891 uint32_t proptype = dtoh32a(&curdata[PTP_ ece_Prop_Subtype]);
1563 unsigned char *xdata = &curdata[PTP_ece_Prop_V al_Data]; 1892 unsigned char *xdata = &curdata[PTP_ece_Prop_V al_Data];
1564 PTPDevicePropDesc *dpd; 1893 PTPDevicePropDesc *dpd;
1565 1894
1566 ptp_debug (params, "event %d: EOS prop %04x info record, datasize is %d", i, proptype, size-PTP_ece_Prop_Val_Data); 1895 ptp_debug (params, "event %d: EOS prop %04x info record, datasize is %d", i, proptype, size-PTP_ece_Prop_Val_Data);
1567 for (j=0;j<params->nrofcanon_props;j++) 1896 for (j=0;j<params->nrofcanon_props;j++)
1568 if (params->canon_props[j].proptype == p roptype) 1897 if (params->canon_props[j].proptype == p roptype)
1569 break; 1898 break;
1570 if (j<params->nrofcanon_props) { 1899 if (j<params->nrofcanon_props) {
1571 if ( (params->canon_props[j].size != size) || 1900 if ( (params->canon_props[j].size != size) ||
1572 (memcmp(params->canon_props[j].d ata,xdata,size-PTP_ece_Prop_Val_Data))) { 1901 (memcmp(params->canon_props[j].d ata,xdata,size-PTP_ece_Prop_Val_Data))) {
1573 params->canon_props[j].data = re alloc(params->canon_props[j].data,size-PTP_ece_Prop_Val_Data); 1902 params->canon_props[j].data = re alloc(params->canon_props[j].data,size-PTP_ece_Prop_Val_Data);
1574 memcpy (params->canon_props[j].d ata,xdata,size-PTP_ece_Prop_Val_Data); 1903 memcpy (params->canon_props[j].d ata,xdata,size-PTP_ece_Prop_Val_Data);
1575 } 1904 }
1576 } else { 1905 } else {
1577 if (j) 1906 if (j)
1578 params->canon_props = realloc(pa rams->canon_props, sizeof(params->canon_props[0])*(j+1)); 1907 params->canon_props = realloc(pa rams->canon_props, sizeof(params->canon_props[0])*(j+1));
1579 else 1908 else
1580 params->canon_props = malloc(siz eof(params->canon_props[0])); 1909 params->canon_props = malloc(siz eof(params->canon_props[0]));
1581 params->canon_props[j].type = type;
1582 params->canon_props[j].proptype = propty pe; 1910 params->canon_props[j].proptype = propty pe;
1583 params->canon_props[j].size = size; 1911 params->canon_props[j].size = size;
1584 params->canon_props[j].data = malloc(siz e-PTP_ece_Prop_Val_Data); 1912 params->canon_props[j].data = malloc(siz e-PTP_ece_Prop_Val_Data);
1585 memcpy(params->canon_props[j].data, xdat a, size-PTP_ece_Prop_Val_Data); 1913 memcpy(params->canon_props[j].data, xdat a, size-PTP_ece_Prop_Val_Data);
1586 memset (&params->canon_props[j].dpd,0,si zeof(params->canon_props[j].dpd)); 1914 memset (&params->canon_props[j].dpd,0,si zeof(params->canon_props[j].dpd));
1587 params->canon_props[j].dpd.GetSet = 1; 1915 params->canon_props[j].dpd.GetSet = 1;
1588 params->canon_props[j].dpd.FormFlag = PT P_DPFF_None; 1916 params->canon_props[j].dpd.FormFlag = PT P_DPFF_None;
1589 params->nrofcanon_props = j+1; 1917 params->nrofcanon_props = j+1;
1590 } 1918 }
1591 dpd = &params->canon_props[j].dpd; 1919 dpd = &params->canon_props[j].dpd;
1592 1920
1593 » » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_PROPE RTY; 1921 » » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_PROPERTY ;
1594 » » » » (*ce)[i].u.propid = proptype; 1922 » » » » ce[i].u.propid = proptype;
1595 1923
1596 /* fix GetSet value */ 1924 /* fix GetSet value */
1597 switch (proptype) { 1925 switch (proptype) {
1598 #define XX(x) case PTP_DPC_CANON_##x: 1926 #define XX(x) case PTP_DPC_CANON_##x:
1599 XX(EOS_FocusMode) 1927 XX(EOS_FocusMode)
1600 XX(EOS_BatteryPower) 1928 XX(EOS_BatteryPower)
1601 XX(EOS_BatterySelect) 1929 XX(EOS_BatterySelect)
1602 XX(EOS_ModelID) 1930 XX(EOS_ModelID)
1603 XX(EOS_PTPExtensionVersion) 1931 XX(EOS_PTPExtensionVersion)
1604 XX(EOS_DPOFVersion) 1932 XX(EOS_DPOFVersion)
(...skipping 20 matching lines...) Expand all
1625 XX(EOS_LensName) 1953 XX(EOS_LensName)
1626 XX(EOS_LensID) 1954 XX(EOS_LensID)
1627 #undef XX 1955 #undef XX
1628 dpd->GetSet = PTP_DPGS_Get; 1956 dpd->GetSet = PTP_DPGS_Get;
1629 break; 1957 break;
1630 } 1958 }
1631 1959
1632 /* set DataType */ 1960 /* set DataType */
1633 switch (proptype) { 1961 switch (proptype) {
1634 case PTP_DPC_CANON_EOS_CameraTime: 1962 case PTP_DPC_CANON_EOS_CameraTime:
1963 case PTP_DPC_CANON_EOS_UTCTime:
1964 case PTP_DPC_CANON_EOS_Summertime: /* basical th e DST flag */
1635 case PTP_DPC_CANON_EOS_AvailableShots: 1965 case PTP_DPC_CANON_EOS_AvailableShots:
1636 case PTP_DPC_CANON_EOS_CaptureDestination: 1966 case PTP_DPC_CANON_EOS_CaptureDestination:
1637 case PTP_DPC_CANON_EOS_WhiteBalanceXA: 1967 case PTP_DPC_CANON_EOS_WhiteBalanceXA:
1638 case PTP_DPC_CANON_EOS_WhiteBalanceXB: 1968 case PTP_DPC_CANON_EOS_WhiteBalanceXB:
1639 case PTP_DPC_CANON_EOS_CurrentStorage: 1969 case PTP_DPC_CANON_EOS_CurrentStorage:
1640 case PTP_DPC_CANON_EOS_CurrentFolder: 1970 case PTP_DPC_CANON_EOS_CurrentFolder:
1641 case PTP_DPC_CANON_EOS_ShutterCounter: 1971 case PTP_DPC_CANON_EOS_ShutterCounter:
1642 case PTP_DPC_CANON_EOS_ModelID: 1972 case PTP_DPC_CANON_EOS_ModelID:
1643 case PTP_DPC_CANON_EOS_LensID: 1973 case PTP_DPC_CANON_EOS_LensID:
1644 case PTP_DPC_CANON_EOS_StroboFiring: 1974 case PTP_DPC_CANON_EOS_StroboFiring:
1975 case PTP_DPC_CANON_EOS_AFSelectFocusArea:
1976 case PTP_DPC_CANON_EOS_ContinousAFMode:
1645 dpd->DataType = PTP_DTC_UINT32; 1977 dpd->DataType = PTP_DTC_UINT32;
1646 break; 1978 break;
1647 /* enumeration for AEM is never provided, but is available to set */ 1979 /* enumeration for AEM is never provided, but is available to set */
1648 case PTP_DPC_CANON_EOS_AutoExposureMode: 1980 case PTP_DPC_CANON_EOS_AutoExposureMode:
1649 dpd->DataType = PTP_DTC_UINT16; 1981 dpd->DataType = PTP_DTC_UINT16;
1650 dpd->FormFlag = PTP_DPFF_Enumeration; 1982 dpd->FormFlag = PTP_DPFF_Enumeration;
1651 dpd->FORM.Enum.NumberOfValues = 0; 1983 dpd->FORM.Enum.NumberOfValues = 0;
1652 break; 1984 break;
1653 case PTP_DPC_CANON_EOS_Aperture: 1985 case PTP_DPC_CANON_EOS_Aperture:
1654 case PTP_DPC_CANON_EOS_ShutterSpeed: 1986 case PTP_DPC_CANON_EOS_ShutterSpeed:
1655 case PTP_DPC_CANON_EOS_ISOSpeed: 1987 case PTP_DPC_CANON_EOS_ISOSpeed:
1656 case PTP_DPC_CANON_EOS_FocusMode: 1988 case PTP_DPC_CANON_EOS_FocusMode:
1657 case PTP_DPC_CANON_EOS_ColorSpace: 1989 case PTP_DPC_CANON_EOS_ColorSpace:
1658 case PTP_DPC_CANON_EOS_BatteryPower: 1990 case PTP_DPC_CANON_EOS_BatteryPower:
1659 case PTP_DPC_CANON_EOS_BatterySelect: 1991 case PTP_DPC_CANON_EOS_BatterySelect:
1660 case PTP_DPC_CANON_EOS_PTPExtensionVersion: 1992 case PTP_DPC_CANON_EOS_PTPExtensionVersion:
1661 case PTP_DPC_CANON_EOS_DriveMode: 1993 case PTP_DPC_CANON_EOS_DriveMode:
1662 case PTP_DPC_CANON_EOS_AEB: 1994 case PTP_DPC_CANON_EOS_AEB:
1663 case PTP_DPC_CANON_EOS_BracketMode: 1995 case PTP_DPC_CANON_EOS_BracketMode:
1664 case PTP_DPC_CANON_EOS_QuickReviewTime: 1996 case PTP_DPC_CANON_EOS_QuickReviewTime:
1665 case PTP_DPC_CANON_EOS_EVFMode: 1997 case PTP_DPC_CANON_EOS_EVFMode:
1666 case PTP_DPC_CANON_EOS_EVFOutputDevice: 1998 case PTP_DPC_CANON_EOS_EVFOutputDevice:
1999 case PTP_DPC_CANON_EOS_AutoPowerOff:
2000 case PTP_DPC_CANON_EOS_EVFRecordStatus:
1667 dpd->DataType = PTP_DTC_UINT16; 2001 dpd->DataType = PTP_DTC_UINT16;
1668 break; 2002 break;
1669 case PTP_DPC_CANON_EOS_PictureStyle: 2003 case PTP_DPC_CANON_EOS_PictureStyle:
1670 case PTP_DPC_CANON_EOS_WhiteBalance: 2004 case PTP_DPC_CANON_EOS_WhiteBalance:
1671 case PTP_DPC_CANON_EOS_MeteringMode: 2005 case PTP_DPC_CANON_EOS_MeteringMode:
1672 » » » » case PTP_DPC_CANON_EOS_ExpCompensation: /* actua lly int8 if you calculate */ 2006 » » » » case PTP_DPC_CANON_EOS_ExpCompensation:
1673 dpd->DataType = PTP_DTC_UINT8; 2007 dpd->DataType = PTP_DTC_UINT8;
1674 break; 2008 break;
1675 case PTP_DPC_CANON_EOS_Owner: 2009 case PTP_DPC_CANON_EOS_Owner:
1676 case PTP_DPC_CANON_EOS_Artist: 2010 case PTP_DPC_CANON_EOS_Artist:
1677 case PTP_DPC_CANON_EOS_Copyright: 2011 case PTP_DPC_CANON_EOS_Copyright:
1678 case PTP_DPC_CANON_EOS_SerialNumber: 2012 case PTP_DPC_CANON_EOS_SerialNumber:
1679 case PTP_DPC_CANON_EOS_LensName: 2013 case PTP_DPC_CANON_EOS_LensName:
1680 dpd->DataType = PTP_DTC_STR; 2014 dpd->DataType = PTP_DTC_STR;
1681 break; 2015 break;
1682 case PTP_DPC_CANON_EOS_WhiteBalanceAdjustA: 2016 case PTP_DPC_CANON_EOS_WhiteBalanceAdjustA:
1683 case PTP_DPC_CANON_EOS_WhiteBalanceAdjustB: 2017 case PTP_DPC_CANON_EOS_WhiteBalanceAdjustB:
1684 dpd->DataType = PTP_DTC_INT16; 2018 dpd->DataType = PTP_DTC_INT16;
1685 break; 2019 break;
1686 /* unknown props, listed from dump.... all 16 bi t, but vals might be smaller */ 2020 /* unknown props, listed from dump.... all 16 bi t, but vals might be smaller */
1687 case 0xd114:
1688 case PTP_DPC_CANON_EOS_DPOFVersion: 2021 case PTP_DPC_CANON_EOS_DPOFVersion:
1689 dpd->DataType = PTP_DTC_UINT16; 2022 dpd->DataType = PTP_DTC_UINT16;
1690 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d, using uint16", i ,proptype, size-PTP_ece_Prop_V al_Data); 2023 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d, using uint16", i ,proptype, size-PTP_ece_Prop_V al_Data);
1691 for (j=0;j<size-PTP_ece_Prop_Val_Data;j+ +) 2024 for (j=0;j<size-PTP_ece_Prop_Val_Data;j+ +)
1692 ptp_debug (params, " %d: %02x ", j, xdata[j]); 2025 ptp_debug (params, " %d: %02x ", j, xdata[j]);
1693 break; 2026 break;
1694 case PTP_DPC_CANON_EOS_CustomFunc1: 2027 case PTP_DPC_CANON_EOS_CustomFunc1:
1695 case PTP_DPC_CANON_EOS_CustomFunc2: 2028 case PTP_DPC_CANON_EOS_CustomFunc2:
1696 case PTP_DPC_CANON_EOS_CustomFunc3: 2029 case PTP_DPC_CANON_EOS_CustomFunc3:
1697 case PTP_DPC_CANON_EOS_CustomFunc4: 2030 case PTP_DPC_CANON_EOS_CustomFunc4:
(...skipping 16 matching lines...) Expand all
1714 case PTP_DPC_CANON_EOS_WftStatus: 2047 case PTP_DPC_CANON_EOS_WftStatus:
1715 case PTP_DPC_CANON_EOS_LensStatus: 2048 case PTP_DPC_CANON_EOS_LensStatus:
1716 case PTP_DPC_CANON_EOS_CardExtension: 2049 case PTP_DPC_CANON_EOS_CardExtension:
1717 case PTP_DPC_CANON_EOS_TempStatus: 2050 case PTP_DPC_CANON_EOS_TempStatus:
1718 case PTP_DPC_CANON_EOS_PhotoStudioMode: 2051 case PTP_DPC_CANON_EOS_PhotoStudioMode:
1719 case PTP_DPC_CANON_EOS_DepthOfFieldPreview: 2052 case PTP_DPC_CANON_EOS_DepthOfFieldPreview:
1720 case PTP_DPC_CANON_EOS_EVFSharpness: 2053 case PTP_DPC_CANON_EOS_EVFSharpness:
1721 case PTP_DPC_CANON_EOS_EVFWBMode: 2054 case PTP_DPC_CANON_EOS_EVFWBMode:
1722 case PTP_DPC_CANON_EOS_EVFClickWBCoeffs: 2055 case PTP_DPC_CANON_EOS_EVFClickWBCoeffs:
1723 case PTP_DPC_CANON_EOS_EVFColorTemp: 2056 case PTP_DPC_CANON_EOS_EVFColorTemp:
1724 case PTP_DPC_CANON_EOS_EVFRecordStatus:
1725 case PTP_DPC_CANON_EOS_ExposureSimMode: 2057 case PTP_DPC_CANON_EOS_ExposureSimMode:
1726 case PTP_DPC_CANON_EOS_LvAfSystem: 2058 case PTP_DPC_CANON_EOS_LvAfSystem:
1727 case PTP_DPC_CANON_EOS_MovSize: 2059 case PTP_DPC_CANON_EOS_MovSize:
1728 case PTP_DPC_CANON_EOS_DepthOfField: 2060 case PTP_DPC_CANON_EOS_DepthOfField:
1729 case PTP_DPC_CANON_EOS_LvViewTypeSelect: 2061 case PTP_DPC_CANON_EOS_LvViewTypeSelect:
2062 case PTP_DPC_CANON_EOS_AloMode:
2063 case PTP_DPC_CANON_EOS_Brightness:
1730 dpd->DataType = PTP_DTC_UINT32; 2064 dpd->DataType = PTP_DTC_UINT32;
1731 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d, using uint32", i ,proptype, size-PTP_ece_Prop_V al_Data); 2065 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d, using uint32", i ,proptype, size-PTP_ece_Prop_V al_Data);
1732 if ((size-PTP_ece_Prop_Val_Data) % sizeo f(uint32_t) != 0) 2066 if ((size-PTP_ece_Prop_Val_Data) % sizeo f(uint32_t) != 0)
1733 ptp_debug (params, "event %d: Wa rning: datasize modulo sizeof(uint32) is not 0: ", i, (size-PTP_ece_Prop_Val_Dat a) % sizeof(uint32_t) ); 2067 ptp_debug (params, "event %d: Wa rning: datasize modulo sizeof(uint32) is not 0: ", i, (size-PTP_ece_Prop_Val_Dat a) % sizeof(uint32_t) );
1734 for (j=0;j<(size-PTP_ece_Prop_Val_Data)/ sizeof(uint32_t);j++) 2068 for (j=0;j<(size-PTP_ece_Prop_Val_Data)/ sizeof(uint32_t);j++)
1735 » » » » » » ptp_debug (params, " %d: 0x%8 x", j, ((uint32_t*)xdata)[j]); 2069 » » » » » » ptp_debug (params, " %d: 0x%8 x", j, dtoh32a(xdata+j*4));
1736 break; 2070 break;
1737 /* ImageFormat properties have to be ignored her e, see special handling below */ 2071 /* ImageFormat properties have to be ignored her e, see special handling below */
1738 case PTP_DPC_CANON_EOS_ImageFormat: 2072 case PTP_DPC_CANON_EOS_ImageFormat:
1739 case PTP_DPC_CANON_EOS_ImageFormatCF: 2073 case PTP_DPC_CANON_EOS_ImageFormatCF:
1740 case PTP_DPC_CANON_EOS_ImageFormatSD: 2074 case PTP_DPC_CANON_EOS_ImageFormatSD:
1741 case PTP_DPC_CANON_EOS_ImageFormatExtHD: 2075 case PTP_DPC_CANON_EOS_ImageFormatExtHD:
1742 case PTP_DPC_CANON_EOS_CustomFuncEx: 2076 case PTP_DPC_CANON_EOS_CustomFuncEx:
2077 case PTP_DPC_CANON_EOS_FocusInfoEx:
1743 break; 2078 break;
1744 default: 2079 default:
1745 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d", i ,proptype, size-PTP_ece_Prop_Val_Data); 2080 ptp_debug (params, "event %d: Unknown EO S property %04x, datasize is %d", i ,proptype, size-PTP_ece_Prop_Val_Data);
1746 for (j=0;j<size-PTP_ece_Prop_Val_Data;j+ +) 2081 for (j=0;j<size-PTP_ece_Prop_Val_Data;j+ +)
1747 ptp_debug (params, " %d: %02x ", j, xdata[j]); 2082 ptp_debug (params, " %d: %02x ", j, xdata[j]);
1748 break; 2083 break;
1749 } 2084 }
1750 switch (dpd->DataType) { 2085 switch (dpd->DataType) {
1751 case PTP_DTC_UINT32: 2086 case PTP_DTC_UINT32:
1752 dpd->FactoryDefaultValue.u32 = dtoh32 a(xdata); 2087 dpd->FactoryDefaultValue.u32 = dtoh32 a(xdata);
1753 dpd->CurrentValue.u32 = dtoh32 a(xdata); 2088 dpd->CurrentValue.u32 = dtoh32 a(xdata);
1754 ptp_debug (params ,"event %d: currentval ue of %x is %x", i, proptype, dpd->CurrentValue.u32); 2089 ptp_debug (params ,"event %d: currentval ue of %x is %x", i, proptype, dpd->CurrentValue.u32);
1755 break; 2090 break;
2091 case PTP_DTC_INT16:
2092 dpd->FactoryDefaultValue.i16 = dtoh16 a(xdata);
2093 dpd->CurrentValue.i16 = dtoh16 a(xdata);
2094 ptp_debug (params,"event %d: currentvalu e of %x is %d", i, proptype, dpd->CurrentValue.i16);
2095 break;
1756 case PTP_DTC_UINT16: 2096 case PTP_DTC_UINT16:
1757 dpd->FactoryDefaultValue.u16 = dtoh16 a(xdata); 2097 dpd->FactoryDefaultValue.u16 = dtoh16 a(xdata);
1758 dpd->CurrentValue.u16 = dtoh16 a(xdata); 2098 dpd->CurrentValue.u16 = dtoh16 a(xdata);
1759 ptp_debug (params,"event %d: currentvalu e of %x is %x", i, proptype, dpd->CurrentValue.u16); 2099 ptp_debug (params,"event %d: currentvalu e of %x is %x", i, proptype, dpd->CurrentValue.u16);
1760 break; 2100 break;
1761 case PTP_DTC_UINT8: 2101 case PTP_DTC_UINT8:
1762 dpd->FactoryDefaultValue.u8 = dtoh8a (xdata); 2102 dpd->FactoryDefaultValue.u8 = dtoh8a (xdata);
1763 dpd->CurrentValue.u8 = dtoh8a (xdata); 2103 dpd->CurrentValue.u8 = dtoh8a (xdata);
1764 ptp_debug (params,"event %d: currentvalu e of %x is %x", i, proptype, dpd->CurrentValue.u8); 2104 ptp_debug (params,"event %d: currentvalu e of %x is %x", i, proptype, dpd->CurrentValue.u8);
1765 break; 2105 break;
2106 case PTP_DTC_INT8:
2107 dpd->FactoryDefaultValue.i8 = dtoh8a (xdata);
2108 dpd->CurrentValue.i8 = dtoh8a (xdata);
2109 ptp_debug (params,"event %d: currentvalu e of %x is %x", i, proptype, dpd->CurrentValue.i8);
2110 break;
1766 case PTP_DTC_STR: { 2111 case PTP_DTC_STR: {
1767 #if 0 /* 5D MII and 400D aktually store plain ASCII in their string properties * / 2112 #if 0 /* 5D MII and 400D aktually store plain ASCII in their string properties * /
1768 uint8_t len = 0; 2113 uint8_t len = 0;
1769 dpd->FactoryDefaultValue.str = ptp_un pack_string(params, data, 0, &len); 2114 dpd->FactoryDefaultValue.str = ptp_un pack_string(params, data, 0, &len);
1770 dpd->CurrentValue.str = ptp_un pack_string(params, data, 0, &len); 2115 dpd->CurrentValue.str = ptp_un pack_string(params, data, 0, &len);
1771 #else 2116 #else
1772 » » » » » if (dpd->FactoryDefaultValue.str) free ( dpd->FactoryDefaultValue.str); 2117 » » » » » free (dpd->FactoryDefaultValue.str);
1773 dpd->FactoryDefaultValue.str = strdup ( (char*)xdata ); 2118 dpd->FactoryDefaultValue.str = strdup ( (char*)xdata );
1774 2119
1775 » » » » » if (dpd->CurrentValue.str) free (dpd->Cu rrentValue.str); 2120 » » » » » free (dpd->CurrentValue.str);
1776 dpd->CurrentValue.str = strdup ( (char*)xdata ); 2121 dpd->CurrentValue.str = strdup ( (char*)xdata );
1777 #endif 2122 #endif
1778 ptp_debug (params,"event %d: currentvalu e of %x is %s", i, proptype, dpd->CurrentValue.str); 2123 ptp_debug (params,"event %d: currentvalu e of %x is %s", i, proptype, dpd->CurrentValue.str);
1779 break; 2124 break;
1780 } 2125 }
1781 default: 2126 default:
1782 /* debug is printed in switch above this one */ 2127 /* debug is printed in switch above this one */
1783 break; 2128 break;
1784 } 2129 }
1785 2130
1786 /* ImageFormat and customFuncEx special handling (WARNING: dont move this in front of the dpd->DataType switch!) */ 2131 /* ImageFormat and customFuncEx special handling (WARNING: dont move this in front of the dpd->DataType switch!) */
1787 switch (proptype) { 2132 switch (proptype) {
1788 case PTP_DPC_CANON_EOS_ImageFormat: 2133 case PTP_DPC_CANON_EOS_ImageFormat:
1789 case PTP_DPC_CANON_EOS_ImageFormatCF: 2134 case PTP_DPC_CANON_EOS_ImageFormatCF:
1790 case PTP_DPC_CANON_EOS_ImageFormatSD: 2135 case PTP_DPC_CANON_EOS_ImageFormatSD:
1791 case PTP_DPC_CANON_EOS_ImageFormatExtHD: 2136 case PTP_DPC_CANON_EOS_ImageFormatExtHD:
1792 dpd->DataType = PTP_DTC_UINT16; 2137 dpd->DataType = PTP_DTC_UINT16;
1793 dpd->FactoryDefaultValue.u16 = ptp_un pack_EOS_ImageFormat( params, &xdata ); 2138 dpd->FactoryDefaultValue.u16 = ptp_un pack_EOS_ImageFormat( params, &xdata );
1794 dpd->CurrentValue.u16 = dpd->F actoryDefaultValue.u16; 2139 dpd->CurrentValue.u16 = dpd->F actoryDefaultValue.u16;
1795 ptp_debug (params,"event %d: decoded ima geformat, currentvalue of %x is %x", i, proptype, dpd->CurrentValue.u16); 2140 ptp_debug (params,"event %d: decoded ima geformat, currentvalue of %x is %x", i, proptype, dpd->CurrentValue.u16);
1796 break; 2141 break;
1797 case PTP_DPC_CANON_EOS_CustomFuncEx: 2142 case PTP_DPC_CANON_EOS_CustomFuncEx:
1798 dpd->DataType = PTP_DTC_STR; 2143 dpd->DataType = PTP_DTC_STR;
1799 » » » » » if (dpd->FactoryDefaultValue.str) free ( dpd->FactoryDefaultValue.str); 2144 » » » » » free (dpd->FactoryDefaultValue.str);
1800 » » » » » if (dpd->CurrentValue.str)» free ( dpd->CurrentValue.str); 2145 » » » » » free (dpd->CurrentValue.str);
1801 » » » » » dpd->FactoryDefaultValue.str» = ptp_un pack_EOS_CustomFuncEx( params, &data ); 2146 » » » » » dpd->FactoryDefaultValue.str» = ptp_un pack_EOS_CustomFuncEx( params, &xdata );
1802 dpd->CurrentValue.str = strdup ( (char*)dpd->FactoryDefaultValue.str ); 2147 dpd->CurrentValue.str = strdup ( (char*)dpd->FactoryDefaultValue.str );
1803 ptp_debug (params,"event %d: decoded cus tom function, currentvalue of %x is %s", i, proptype, dpd->CurrentValue.str); 2148 ptp_debug (params,"event %d: decoded cus tom function, currentvalue of %x is %s", i, proptype, dpd->CurrentValue.str);
1804 break; 2149 break;
2150 case PTP_DPC_CANON_EOS_FocusInfoEx:
2151 dpd->DataType = PTP_DTC_STR;
2152 free (dpd->FactoryDefaultValue.str);
2153 free (dpd->CurrentValue.str);
2154 dpd->FactoryDefaultValue.str = ptp_un pack_EOS_FocusInfoEx( params, &xdata );
2155 dpd->CurrentValue.str = strdup ( (char*)dpd->FactoryDefaultValue.str );
2156 ptp_debug (params,"event %d: decoded foc us info, currentvalue of %x is %s", i, proptype, dpd->CurrentValue.str);
2157 break;
1805 } 2158 }
1806 2159
1807 break; 2160 break;
1808 } 2161 }
2162 /* one more information record handed to us */
2163 case PTP_EC_CANON_EOS_OLCInfoChanged: {
2164 uint32_t len, curoff;
2165 uint16_t mask,proptype;
2166 PTPDevicePropDesc *dpd;
2167
2168 /* unclear what OLC stands for */
2169 ptp_debug (params, "event %d: EOS event OLCInfoChanged ( size %d)", i, size);
2170 if (size >= 0x8) { /* event info */
2171 unsigned int k;
2172 for (k=8;k<size;k++)
2173 ptp_debug (params, " %d: %02x", k-8, curdata[k]);
2174 }
2175 len = dtoh32a(curdata+8);
2176 if (len != size-8) {
2177 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2178 ptp_debug (params, "event %d: size %d, len %d", i, size, len);
2179 break;
2180 }
2181 mask = dtoh16a(curdata+8+4);
2182 curoff = 8+4+4;
2183 if (mask & CANON_EOS_OLC_BUTTON) {
2184 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2185 ce[i].u.info = malloc(strlen("Button 1234567"));
2186 sprintf(ce[i].u.info, "Button %d", dtoh16a(curd ata+curoff));
2187 i++;
2188 curoff += 2;
2189 }
2190
2191 if (mask & CANON_EOS_OLC_SHUTTERSPEED) {
2192 /* 6 bytes: 01 01 98 10 00 60 */
2193 /* this seesm to be the shutter speed record */
2194 proptype = PTP_DPC_CANON_EOS_ShutterSpeed;
2195 dpd = _lookup_or_allocate_canon_prop(params, pro ptype);
2196 dpd->CurrentValue.u16 = curdata[curoff+5]; /* ju st use last byte */
2197
2198 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_PROPERTY ;
2199 ce[i].u.propid = proptype;
2200 curoff += 6;
2201 i++;
2202 }
2203 if (mask & CANON_EOS_OLC_APERTURE) {
2204 /* 5 bytes: 01 01 5b 30 30 */
2205 /* this seesm to be the aperture record */
2206 proptype = PTP_DPC_CANON_EOS_Aperture;
2207 dpd = _lookup_or_allocate_canon_prop(params, pro ptype);
2208 dpd->CurrentValue.u16 = curdata[curoff+4]; /* ju st use last byte */
2209
2210 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_PROPERTY ;
2211 ce[i].u.propid = proptype;
2212 curoff += 5;
2213 i++;
2214 }
2215 if (mask & CANON_EOS_OLC_ISO) {
2216 /* 5 bytes: 01 01 00 78 */
2217 /* this seesm to be the aperture record */
2218 proptype = PTP_DPC_CANON_EOS_ISOSpeed;
2219 dpd = _lookup_or_allocate_canon_prop(params, pro ptype);
2220 dpd->CurrentValue.u16 = curdata[curoff+3]; /* ju st use last byte */
2221
2222 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_PROPERTY ;
2223 ce[i].u.propid = proptype;
2224 curoff += 4;
2225 i++;
2226 }
2227 if (mask & 0x0010) {
2228 /* mask 0x0010: 4 bytes, 04 00 00 00 observed */
2229 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2230 ce[i].u.info = malloc(strlen("OLCInfo event 0x00 10 content 01234567")+1);
2231 sprintf(ce[i].u.info,"OLCInfo event 0x0010 conte nt %02x%02x%02x%02x",
2232 curdata[curoff],
2233 curdata[curoff+1],
2234 curdata[curoff+2],
2235 curdata[curoff+3]
2236 );
2237 curoff += 4;
2238 i++;
2239 }
2240 if (mask & 0x0020) {
2241 /* mask 0x0020: 6 bytes, 00 00 00 00 00 00 obser ved */
2242 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2243 ce[i].u.info = malloc(strlen("OLCInfo event 0x00 20 content 0123456789ab")+1);
2244 sprintf(ce[i].u.info,"OLCInfo event 0x0020 conte nt %02x%02x%02x%02x%02x%02x",
2245 curdata[curoff],
2246 curdata[curoff+1],
2247 curdata[curoff+2],
2248 curdata[curoff+3],
2249 curdata[curoff+4],
2250 curdata[curoff+5]
2251 );
2252 curoff += 6;
2253 i++;
2254 }
2255 if (mask & 0x0040) {
2256 int value = (signed char)curdata[curoff+2];
2257 /* mask 0x0040: 7 bytes, 01 01 00 00 00 00 00 ob served */
2258 /* exposure indicator */
2259 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2260 ce[i].u.info = malloc(strlen("OLCInfo exposure i ndicator 012345678901234567890123456789abcd")+1);
2261 sprintf(ce[i].u.info,"OLCInfo exposure indicator %d,%d,%d.%d (%02x%02x%02x%02x)",
2262 curdata[curoff],
2263 curdata[curoff+1],
2264 value/10,abs(value)%10,
2265 curdata[curoff+3],
2266 curdata[curoff+4],
2267 curdata[curoff+5],
2268 curdata[curoff+6]
2269 );
2270 curoff += 7;
2271 i++;
2272 }
2273 if (mask & 0x0080) {
2274 /* mask 0x0080: 4 bytes, 00 00 00 00 observed */
2275 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2276 ce[i].u.info = malloc(strlen("OLCInfo event 0x00 80 content 01234567")+1);
2277 sprintf(ce[i].u.info,"OLCInfo event 0x0080 conte nt %02x%02x%02x%02x",
2278 curdata[curoff],
2279 curdata[curoff+1],
2280 curdata[curoff+2],
2281 curdata[curoff+3]
2282 );
2283 curoff += 4;
2284 i++;
2285 }
2286 if (mask & 0x0100) {
2287 /* mask 0x0100: 6 bytes, 00 00 00 00 00 00 (befo re focus) and 00 00 00 00 01 00 (on focus) observed */
2288 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_FOCUSINF O;
2289 ce[i].u.info = malloc(strlen("0123456789ab")+1);
2290 sprintf(ce[i].u.info,"%02x%02x%02x%02x%02x%02x",
2291 curdata[curoff],
2292 curdata[curoff+1],
2293 curdata[curoff+2],
2294 curdata[curoff+3],
2295 curdata[curoff+4],
2296 curdata[curoff+5]
2297 );
2298 curoff += 6;
2299 i++;
2300 }
2301 if (mask & 0x0200) {
2302 /* mask 0x0200: 7 bytes, 00 00 00 00 00 00 00 ob served */
2303 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_FOCUSMAS K;
2304 ce[i].u.info = malloc(strlen("0123456789abcd0123 456789abcdef")+1);
2305 sprintf(ce[i].u.info,"%02x%02x%02x%02x%02x%02x%0 2x",
2306 curdata[curoff],
2307 curdata[curoff+1],
2308 curdata[curoff+2],
2309 curdata[curoff+3],
2310 curdata[curoff+4],
2311 curdata[curoff+5],
2312 curdata[curoff+6]
2313 );
2314 curoff += 7;
2315 i++;
2316 }
2317 if (mask & 0x0400) {
2318 /* mask 0x0400: 7 bytes, 00 00 00 00 00 00 00 ob served */
2319 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2320 ce[i].u.info = malloc(strlen("OLCInfo event 0x04 00 content 0123456789abcd")+1);
2321 sprintf(ce[i].u.info,"OLCInfo event 0x0400 conte nt %02x%02x%02x%02x%02x%02x%02x",
2322 curdata[curoff],
2323 curdata[curoff+1],
2324 curdata[curoff+2],
2325 curdata[curoff+3],
2326 curdata[curoff+4],
2327 curdata[curoff+5],
2328 curdata[curoff+6]
2329 );
2330 curoff += 7;
2331 i++;
2332 }
2333 if (mask & 0x0800) {
2334 /* mask 0x0800: 8 bytes, 00 00 00 00 00 00 00 00 and 19 01 00 00 00 00 00 00 and others observed */
2335 /* might be mask of focus points selected */
2336 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2337 ce[i].u.info = malloc(strlen("OLCInfo event 0x08 00 content 0123456789abcdef")+1);
2338 sprintf(ce[i].u.info,"OLCInfo event 0x0800 conte nt %02x%02x%02x%02x%02x%02x%02x%02x",
2339 curdata[curoff],
2340 curdata[curoff+1],
2341 curdata[curoff+2],
2342 curdata[curoff+3],
2343 curdata[curoff+4],
2344 curdata[curoff+5],
2345 curdata[curoff+6],
2346 curdata[curoff+7]
2347 );
2348 curoff += 8;
2349 i++;
2350 }
2351 if (mask & 0x1000) {
2352 /* mask 0x1000: 1 byte, 00 observed */
2353 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2354 ce[i].u.info = malloc(strlen("OLCInfo event 0x10 00 content 01")+1);
2355 sprintf(ce[i].u.info,"OLCInfo event 0x1000 conte nt %02x",
2356 curdata[curoff]
2357 );
2358 curoff += 1;
2359 i++;
2360 }
2361 /* handle more masks */
2362 ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
2363 ce[i].u.info = malloc(strlen("OLCInfo event mask 0123456 789")+1);
2364 sprintf(ce[i].u.info, "OLCInfo event mask=%x", mask);
2365 break;
2366 }
1809 case PTP_EC_CANON_EOS_CameraStatusChanged: 2367 case PTP_EC_CANON_EOS_CameraStatusChanged:
1810 » » » ptp_debug (params, "event %d: EOS event CameraStatusChan ged (size %d)", i, size); 2368 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_CAMERASTATUS;
1811 » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_CAMERASTATUS; 2369 » » » ce[i].u.status = dtoh32a(curdata+8);
1812 » » » (*ce)[i].u.status = dtoh32a(curdata+8); 2370 » » » ptp_debug (params, "event %d: EOS event CameraStatusChan ged (size %d) = %d", i, size, dtoh32a(curdata+8));
1813 params->eos_camerastatus = dtoh32a(curdata+8); 2371 params->eos_camerastatus = dtoh32a(curdata+8);
1814 break; 2372 break;
1815 case 0: /* end marker */ 2373 case 0: /* end marker */
1816 if (size == 8) /* no output */ 2374 if (size == 8) /* no output */
1817 break; 2375 break;
1818 ptp_debug (params, "event %d: EOS event 0, but size %d", i, size); 2376 ptp_debug (params, "event %d: EOS event 0, but size %d", i, size);
1819 break; 2377 break;
1820 case PTP_EC_CANON_EOS_BulbExposureTime: 2378 case PTP_EC_CANON_EOS_BulbExposureTime:
1821 » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN; 2379 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
1822 » » » (*ce)[i].u.info = malloc(strlen("BulbExposureTime 123456 789")); 2380 » » » ce[i].u.info = malloc(strlen("BulbExposureTime 123456789 "));
1823 » » » sprintf ((*ce)[i].u.info, "BulbExposureTime %d", dtoh32 a(curdata+8)); 2381 » » » sprintf (ce[i].u.info, "BulbExposureTime %d", dtoh32a(c urdata+8));
2382 » » » break;
2383 » » case PTP_EC_CANON_EOS_ObjectRemoved:
2384 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_OBJECTREMOVED;
2385 » » » ce[i].u.object.oid = dtoh32a(curdata+8);
1824 break; 2386 break;
1825 default: 2387 default:
1826 switch (type) { 2388 switch (type) {
1827 #define XX(x) case PTP_EC_CANON_EOS_##x: \ 2389 #define XX(x) case PTP_EC_CANON_EOS_##x: \
1828 ptp_debug (params, "event %d: unhandled EOS even t "#x" (size %d)", i, size); \ 2390 ptp_debug (params, "event %d: unhandled EOS even t "#x" (size %d)", i, size); \
1829 » » » » (*ce)[i].u.info = malloc(strlen("unhandled EOS e vent "#x" (size 123456789)"));» \ 2391 » » » » ce[i].u.info = malloc(strlen("unhandled EOS even t "#x" (size 123456789)"));» \
1830 » » » » sprintf ((*ce)[i].u.info, "unhandled EOS event " #x" (size %d)", size);»» \ 2392 » » » » sprintf (ce[i].u.info, "unhandled EOS event "#x" (size %d)", size);» » \
1831 break; 2393 break;
1832 XX(RequestGetEvent) 2394 XX(RequestGetEvent)
1833 XX(ObjectRemoved)
1834 XX(RequestGetObjectInfoEx) 2395 XX(RequestGetObjectInfoEx)
1835 XX(StorageStatusChanged) 2396 XX(StorageStatusChanged)
1836 XX(StorageInfoChanged) 2397 XX(StorageInfoChanged)
1837 XX(ObjectInfoChangedEx) 2398 XX(ObjectInfoChangedEx)
1838 XX(ObjectContentChanged) 2399 XX(ObjectContentChanged)
1839 XX(WillSoonShutdown) 2400 XX(WillSoonShutdown)
1840 XX(ShutdownTimerUpdated) 2401 XX(ShutdownTimerUpdated)
1841 XX(RequestCancelTransfer) 2402 XX(RequestCancelTransfer)
1842 XX(RequestObjectTransferDT) 2403 XX(RequestObjectTransferDT)
1843 XX(RequestCancelTransferDT) 2404 XX(RequestCancelTransferDT)
1844 XX(StoreAdded) 2405 XX(StoreAdded)
1845 XX(StoreRemoved) 2406 XX(StoreRemoved)
1846 XX(BulbExposureTime) 2407 XX(BulbExposureTime)
1847 XX(RecordingTime) 2408 XX(RecordingTime)
1848 XX(RequestObjectTransferTS) 2409 XX(RequestObjectTransferTS)
1849 XX(AfResult) 2410 XX(AfResult)
1850 #undef XX 2411 #undef XX
1851 default: 2412 default:
1852 ptp_debug (params, "event %d: unknown EOS event %04x", i, type); 2413 ptp_debug (params, "event %d: unknown EOS event %04x", i, type);
1853 break; 2414 break;
1854 } 2415 }
1855 if (size >= 0x8) { /* event info */ 2416 if (size >= 0x8) { /* event info */
1856 » » » » int j; 2417 » » » » unsigned int j;
1857 for (j=8;j<size;j++) 2418 for (j=8;j<size;j++)
1858 ptp_debug (params, " %d: %02x", j, cu rdata[j]); 2419 ptp_debug (params, " %d: %02x", j, cu rdata[j]);
1859 } 2420 }
1860 » » » (*ce)[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN; 2421 » » » ce[i].type = PTP_CANON_EOS_CHANGES_TYPE_UNKNOWN;
1861 break; 2422 break;
1862 } 2423 }
1863 curdata += size; 2424 curdata += size;
1864 i++;
1865 if ((size == 8) && (type == 0)) 2425 if ((size == 8) && (type == 0))
1866 break; 2426 break;
2427 i++;
1867 } 2428 }
1868 » if (!entries) { 2429 » if (!i) {
1869 » » free (*ce); 2430 » » free (ce);
1870 » » *ce = NULL; 2431 » » ce = NULL;
1871 } 2432 }
1872 » return entries; 2433 » *pce = ce;
2434 » return i;
1873 } 2435 }
1874 2436
1875 /* 2437 /*
1876 PTP USB Event container unpack for Nikon events. 2438 PTP USB Event container unpack for Nikon events.
1877 */ 2439 */
1878 #define PTP_nikon_ec_Length 0 2440 #define PTP_nikon_ec_Length 0
1879 #define PTP_nikon_ec_Code 2 2441 #define PTP_nikon_ec_Code 2
1880 #define PTP_nikon_ec_Param1 4 2442 #define PTP_nikon_ec_Param1 4
1881 #define PTP_nikon_ec_Size 6 2443 #define PTP_nikon_ec_Size 6
1882 static inline void 2444 static inline void
1883 ptp_unpack_Nikon_EC (PTPParams *params, unsigned char* data, unsigned int len, P TPContainer **ec, int *cnt) 2445 ptp_unpack_Nikon_EC (PTPParams *params, unsigned char* data, unsigned int len, P TPContainer **ec, unsigned int *cnt)
1884 { 2446 {
1885 » int i; 2447 » unsigned int i;
1886 2448
1887 *ec = NULL; 2449 *ec = NULL;
1888 if (data == NULL) 2450 if (data == NULL)
1889 return; 2451 return;
1890 if (len < PTP_nikon_ec_Code) 2452 if (len < PTP_nikon_ec_Code)
1891 return; 2453 return;
1892 *cnt = dtoh16a(&data[PTP_nikon_ec_Length]); 2454 *cnt = dtoh16a(&data[PTP_nikon_ec_Length]);
1893 if (*cnt > (len-PTP_nikon_ec_Code)/PTP_nikon_ec_Size) /* broken cnt? */ 2455 if (*cnt > (len-PTP_nikon_ec_Code)/PTP_nikon_ec_Size) /* broken cnt? */
1894 return; 2456 return;
1895 if (!*cnt) 2457 if (!*cnt)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 PTPObjectHandles *handles, 2541 PTPObjectHandles *handles,
1980 PTPObjectInfo **oinfos, /* size(handles->n) */ 2542 PTPObjectInfo **oinfos, /* size(handles->n) */
1981 uint32_t **flags /* size(handles->n) */ 2543 uint32_t **flags /* size(handles->n) */
1982 ) { 2544 ) {
1983 unsigned int i, j, nrofobs = 0, curob = 0; 2545 unsigned int i, j, nrofobs = 0, curob = 0;
1984 2546
1985 #define ISOBJECT(ptr) (dtoh32a((ptr)+ptp_canon_dir_storageid) == 0xffffffff) 2547 #define ISOBJECT(ptr) (dtoh32a((ptr)+ptp_canon_dir_storageid) == 0xffffffff)
1986 for (i=0;i<cnt;i++) 2548 for (i=0;i<cnt;i++)
1987 if (ISOBJECT(dir+i*0x4c)) nrofobs++; 2549 if (ISOBJECT(dir+i*0x4c)) nrofobs++;
1988 handles->n = nrofobs; 2550 handles->n = nrofobs;
1989 » handles->Handler = calloc(sizeof(handles->Handler[0]),nrofobs); 2551 » handles->Handler = calloc(nrofobs,sizeof(handles->Handler[0]));
1990 if (!handles->Handler) return PTP_RC_GeneralError; 2552 if (!handles->Handler) return PTP_RC_GeneralError;
1991 » *oinfos = calloc(sizeof((*oinfos)[0]),nrofobs); 2553 » *oinfos = calloc(nrofobs,sizeof((*oinfos)[0]));
1992 if (!*oinfos) return PTP_RC_GeneralError; 2554 if (!*oinfos) return PTP_RC_GeneralError;
1993 » *flags = calloc(sizeof((*flags)[0]),nrofobs); 2555 » *flags = calloc(nrofobs,sizeof((*flags)[0]));
1994 if (!*flags) return PTP_RC_GeneralError; 2556 if (!*flags) return PTP_RC_GeneralError;
1995 2557
1996 /* Migrate data into objects ids, handles into 2558 /* Migrate data into objects ids, handles into
1997 * the object handler array. 2559 * the object handler array.
1998 */ 2560 */
1999 curob = 0; 2561 curob = 0;
2000 for (i=0;i<cnt;i++) { 2562 for (i=0;i<cnt;i++) {
2001 unsigned char *cur = dir+i*0x4c; 2563 unsigned char *cur = dir+i*0x4c;
2002 PTPObjectInfo *oi = (*oinfos)+curob; 2564 PTPObjectInfo *oi = (*oinfos)+curob;
2003 2565
(...skipping 20 matching lines...) Expand all
2024 uint32_t nextchild = dtoh32a(cur + ptp_canon_dir_nextchil d); 2586 uint32_t nextchild = dtoh32a(cur + ptp_canon_dir_nextchil d);
2025 2587
2026 if (ISOBJECT(cur)) 2588 if (ISOBJECT(cur))
2027 continue; 2589 continue;
2028 for (j=0;j<handles->n;j++) if (nextchild == handles->Handler[j]) break; 2590 for (j=0;j<handles->n;j++) if (nextchild == handles->Handler[j]) break;
2029 if (j == handles->n) continue; 2591 if (j == handles->n) continue;
2030 (*oinfos)[j].StorageID = dtoh32a(cur + ptp_canon_dir_storageid); 2592 (*oinfos)[j].StorageID = dtoh32a(cur + ptp_canon_dir_storageid);
2031 } 2593 }
2032 /* Walk over all objects and distribute the storage ids */ 2594 /* Walk over all objects and distribute the storage ids */
2033 while (1) { 2595 while (1) {
2034 » » int changed = 0; 2596 » » unsigned int changed = 0;
2035 for (i=0;i<cnt;i++) { 2597 for (i=0;i<cnt;i++) {
2036 unsigned char *cur = dir+i*0x4c; 2598 unsigned char *cur = dir+i*0x4c;
2037 uint32_t oid = dtoh32a(cur + ptp_canon_dir_object id); 2599 uint32_t oid = dtoh32a(cur + ptp_canon_dir_object id);
2038 uint32_t nextoid = dtoh32a(cur + ptp_canon_dir_ne xtid); 2600 uint32_t nextoid = dtoh32a(cur + ptp_canon_dir_ne xtid);
2039 uint32_t nextchild = dtoh32a(cur + ptp_canon_dir_ nextchild); 2601 uint32_t nextchild = dtoh32a(cur + ptp_canon_dir_ nextchild);
2040 uint32_t storageid; 2602 uint32_t storageid;
2041 2603
2042 if (!ISOBJECT(cur)) 2604 if (!ISOBJECT(cur))
2043 continue; 2605 continue;
2044 for (j=0;j<handles->n;j++) if (oid == handles->Handler[j ]) break; 2606 for (j=0;j<handles->n;j++) if (oid == handles->Handler[j ]) break;
(...skipping 30 matching lines...) Expand all
2075 * - changed no entry (nothing more to do) 2637 * - changed no entry (nothing more to do)
2076 * - changed all of them at once (usually happens) 2638 * - changed all of them at once (usually happens)
2077 * break if we do. 2639 * break if we do.
2078 */ 2640 */
2079 if (!changed || (changed==nrofobs-1)) 2641 if (!changed || (changed==nrofobs-1))
2080 break; 2642 break;
2081 } 2643 }
2082 #undef ISOBJECT 2644 #undef ISOBJECT
2083 return PTP_RC_OK; 2645 return PTP_RC_OK;
2084 } 2646 }
OLDNEW
« no previous file with comments | « src/ptp.c ('k') | src/util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698