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

Side by Side Diff: src/ptp.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, 3 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.h ('k') | src/ptp-pack.c » ('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.c 1 /* ptp.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-2012 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 #define _BSD_SOURCE 25 #define _DEFAULT_SOURCE
26 #include "config.h" 26 #include "config.h"
27 #include "ptp.h" 27 #include "ptp.h"
28 28
29 #ifdef HAVE_LIBXML2
30 # include <libxml/parser.h>
31 #endif
32
29 #include <stdlib.h> 33 #include <stdlib.h>
30 #include <stdarg.h> 34 #include <stdarg.h>
31 #include <stdio.h> 35 #include <stdio.h>
32 #include <string.h> 36 #include <string.h>
33 #include <unistd.h> 37 #ifdef HAVE_UNISTD_H
38 # include <unistd.h>
39 #endif
34 40
35 #ifdef ENABLE_NLS 41 #ifdef ENABLE_NLS
36 # include <libintl.h> 42 # include <libintl.h>
37 # undef _ 43 # undef _
38 # define _(String) dgettext (PACKAGE, String) 44 # define _(String) dgettext (PACKAGE, String)
39 # ifdef gettext_noop 45 # ifdef gettext_noop
40 # define N_(String) gettext_noop (String) 46 # define N_(String) gettext_noop (String)
41 # else 47 # else
42 # define N_(String) (String) 48 # define N_(String) (String)
43 # endif 49 # endif
44 #else 50 #else
45 # define textdomain(String) (String) 51 # define textdomain(String) (String)
46 # define gettext(String) (String) 52 # define gettext(String) (String)
47 # define dgettext(Domain,Message) (Message) 53 # define dgettext(Domain,Message) (Message)
48 # define dcgettext(Domain,Message,Type) (Message) 54 # define dcgettext(Domain,Message,Type) (Message)
49 # define bindtextdomain(Domain,Directory) (Domain) 55 # define bindtextdomain(Domain,Directory) (Domain)
50 # define _(String) (String) 56 # define _(String) (String)
51 # define N_(String) (String) 57 # define N_(String) (String)
52 #endif 58 #endif
53 59
54 #define CHECK_PTP_RC(result)» {uint16_t r=(result); if (r!=PTP_RC_OK) return r ;} 60 #define CHECK_PTP_RC(RESULT) do { uint16_t r = (RESULT); if (r != PTP_RC_OK) ret urn r; } while(0)
55 61
56 #define PTP_CNT_INIT(cnt) {memset(&cnt,0,sizeof(cnt));} 62 static inline void
63 ptp_init_container(PTPContainer* ptp, uint16_t code, int n_param, ...)
64 {
65 » va_list»args;
66 » int» i;
67
68 » memset(ptp, 0, sizeof(*ptp));
69 » ptp->Code = code;
70 » ptp->Nparam = n_param;
71
72 » va_start(args, n_param);
73 » for (i=0; i<n_param; ++i)
74 » » (&ptp->Param1)[i] = va_arg(args, uint32_t);
75 » va_end(args);
76 }
77
78 #define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
79 #define NARGS(...) NARGS_SEQ(-1, ##__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
80
81 #define PTP_CNT_INIT(PTP, CODE, ...) \
82 » ptp_init_container(&PTP, CODE, NARGS(__VA_ARGS__), ##__VA_ARGS__)
57 83
58 static uint16_t ptp_exit_recv_memory_handler (PTPDataHandler*,unsigned char**,un signed long*); 84 static uint16_t ptp_exit_recv_memory_handler (PTPDataHandler*,unsigned char**,un signed long*);
59 static uint16_t ptp_init_recv_memory_handler(PTPDataHandler*); 85 static uint16_t ptp_init_recv_memory_handler(PTPDataHandler*);
60 static uint16_t ptp_init_send_memory_handler(PTPDataHandler*,unsigned char*,unsi gned long len); 86 static uint16_t ptp_init_send_memory_handler(PTPDataHandler*,unsigned char*,unsi gned long len);
61 static uint16_t ptp_exit_send_memory_handler (PTPDataHandler *handler); 87 static uint16_t ptp_exit_send_memory_handler (PTPDataHandler *handler);
62 88
63 void 89 void
64 ptp_debug (PTPParams *params, const char *format, ...) 90 ptp_debug (PTPParams *params, const char *format, ...)
65 { 91 {
66 va_list args; 92 va_list args;
(...skipping 26 matching lines...) Expand all
93 } 119 }
94 va_end (args); 120 va_end (args);
95 } 121 }
96 122
97 /* Pack / unpack functions */ 123 /* Pack / unpack functions */
98 124
99 #include "ptp-pack.c" 125 #include "ptp-pack.c"
100 126
101 /* major PTP functions */ 127 /* major PTP functions */
102 128
103 /* Transaction data phase description */
104 #define PTP_DP_NODATA 0x0000 /* no data phase */
105 #define PTP_DP_SENDDATA 0x0001 /* sending data */
106 #define PTP_DP_GETDATA 0x0002 /* receiving data */
107 #define PTP_DP_DATA_MASK 0x00ff /* data phase mask */
108
109 /** 129 /**
110 * ptp_transaction: 130 * ptp_transaction:
111 * params: PTPParams* 131 * params: PTPParams*
112 * PTPContainer* ptp - general ptp container 132 * PTPContainer* ptp - general ptp container
113 * uint16_t flags - lower 8 bits - data phase description 133 * uint16_t flags - lower 8 bits - data phase description
114 * unsigned int sendlen - senddata phase data length 134 * unsigned int sendlen - senddata phase data length
115 * char** data - send or receive data buffer pointer 135 * char** data - send or receive data buffer pointer
116 * int* recvlen - receive data length 136 * int* recvlen - receive data length
117 * 137 *
118 * Performs PTP transaction. ptp is a PTPContainer with appropriate fields 138 * Performs PTP transaction. ptp is a PTPContainer with appropriate fields
119 * filled in (i.e. operation code and parameters). It's up to caller to do 139 * filled in (i.e. operation code and parameters). It's up to caller to do
120 * so. 140 * so.
121 * The flags decide thether the transaction has a data phase and what is its 141 * The flags decide thether the transaction has a data phase and what is its
122 * direction (send or receive). 142 * direction (send or receive).
123 * If transaction is sending data the sendlen should contain its length in 143 * If transaction is sending data the sendlen should contain its length in
124 * bytes, otherwise it's ignored. 144 * bytes, otherwise it's ignored.
125 * The data should contain an address of a pointer to data going to be sent 145 * The data should contain an address of a pointer to data going to be sent
126 * or is filled with such a pointer address if data are received depending 146 * or is filled with such a pointer address if data are received depending
127 * od dataphase direction (send or received) or is beeing ignored (no 147 * od dataphase direction (send or received) or is beeing ignored (no
128 * dataphase). 148 * dataphase).
129 * The memory for a pointer should be preserved by the caller, if data are 149 * The memory for a pointer should be preserved by the caller, if data are
130 * beeing retreived the appropriate amount of memory is beeing allocated 150 * beeing retreived the appropriate amount of memory is beeing allocated
131 * (the caller should handle that!). 151 * (the caller should handle that!).
132 * 152 *
133 * Return values: Some PTP_RC_* code. 153 * Return values: Some PTP_RC_* code.
134 * Upon success PTPContainer* ptp contains PTP Response Phase container with 154 * Upon success PTPContainer* ptp contains PTP Response Phase container with
135 * all fields filled in. 155 * all fields filled in.
136 **/ 156 **/
137 static uint16_t 157 uint16_t
138 ptp_transaction_new (PTPParams* params, PTPContainer* ptp, 158 ptp_transaction_new (PTPParams* params, PTPContainer* ptp,
139 » » uint16_t flags, unsigned int sendlen, 159 » » uint16_t flags, uint64_t sendlen,
140 » » PTPDataHandler *handler 160 » » PTPDataHandler *handler
141 ) { 161 ) {
142 int tries; 162 int tries;
143 uint16_t cmd; 163 uint16_t cmd;
144 164
145 if ((params==NULL) || (ptp==NULL)) 165 if ((params==NULL) || (ptp==NULL))
146 return PTP_ERROR_BADPARAM; 166 return PTP_ERROR_BADPARAM;
147 167
148 cmd = ptp->Code; 168 cmd = ptp->Code;
149 ptp->Transaction_ID=params->transaction_id++; 169 ptp->Transaction_ID=params->transaction_id++;
150 ptp->SessionID=params->session_id; 170 ptp->SessionID=params->session_id;
151 /* send request */ 171 /* send request */
152 » CHECK_PTP_RC(params->sendreq_func (params, ptp)); 172 » CHECK_PTP_RC(params->sendreq_func (params, ptp, flags));
153 /* is there a dataphase? */ 173 /* is there a dataphase? */
154 switch (flags&PTP_DP_DATA_MASK) { 174 switch (flags&PTP_DP_DATA_MASK) {
155 case PTP_DP_SENDDATA: 175 case PTP_DP_SENDDATA:
156 { 176 {
157 » » » uint16_t ret; 177 » » » uint16_t ret = params->senddata_func(params, ptp, sendle n, handler);
158 » » » ret = params->senddata_func(params, ptp, 178 » » » if (ret == PTP_ERROR_CANCEL)
159 » » » » » » sendlen, handler); 179 » » » » CHECK_PTP_RC(params->cancelreq_func(params, para ms->transaction_id-1));
160 » » » if (ret == PTP_ERROR_CANCEL) { 180 » » » CHECK_PTP_RC(ret);
161 » » » » ret = params->cancelreq_func(params,
162 » » » » » » » params->transaction _id-1);
163 » » » » if (ret == PTP_RC_OK)
164 » » » » » ret = PTP_ERROR_CANCEL;
165 » » » }
166 » » » if (ret != PTP_RC_OK)
167 » » » » return ret;
168 } 181 }
169 break; 182 break;
170 case PTP_DP_GETDATA: 183 case PTP_DP_GETDATA:
171 { 184 {
172 » » » uint16_t ret; 185 » » » uint16_t ret = params->getdata_func(params, ptp, handler );
173 » » » ret = params->getdata_func(params, ptp, handler); 186 » » » if (ret == PTP_ERROR_CANCEL)
174 » » » if (ret == PTP_ERROR_CANCEL) { 187 » » » » CHECK_PTP_RC(params->cancelreq_func(params, para ms->transaction_id-1));
175 » » » » ret = params->cancelreq_func(params, 188 » » » CHECK_PTP_RC(ret);
176 » » » » » » » params->transaction _id-1);
177 » » » » if (ret == PTP_RC_OK)
178 » » » » » ret = PTP_ERROR_CANCEL;
179 » » » }
180 » » » if (ret != PTP_RC_OK)
181 » » » » return ret;
182 } 189 }
183 break; 190 break;
184 case PTP_DP_NODATA: 191 case PTP_DP_NODATA:
185 break; 192 break;
186 default: 193 default:
187 return PTP_ERROR_BADPARAM; 194 return PTP_ERROR_BADPARAM;
188 } 195 }
189 tries = 3; 196 tries = 3;
190 while (tries--) { 197 while (tries--) {
191 uint16_t ret; 198 uint16_t ret;
192 /* get response */ 199 /* get response */
193 ret = params->getresp_func(params, ptp); 200 ret = params->getresp_func(params, ptp);
194 if (ret == PTP_ERROR_RESP_EXPECTED) { 201 if (ret == PTP_ERROR_RESP_EXPECTED) {
195 ptp_debug (params,"PTP: response expected but not got, r etrying."); 202 ptp_debug (params,"PTP: response expected but not got, r etrying.");
196 tries++; 203 tries++;
197 continue; 204 continue;
198 } 205 }
199 » » if (ret != PTP_RC_OK) 206 » » CHECK_PTP_RC(ret);
200 » » » return ret; 207
201 » »
202 if (ptp->Transaction_ID < params->transaction_id-1) { 208 if (ptp->Transaction_ID < params->transaction_id-1) {
209 /* The Leica uses Transaction ID 0 on result from CloseS ession. */
210 if (cmd == PTP_OC_CloseSession)
211 break;
203 tries++; 212 tries++;
204 ptp_debug (params, 213 ptp_debug (params,
205 "PTP: Sequence number mismatch %d vs expected %d , suspecting old reply.", 214 "PTP: Sequence number mismatch %d vs expected %d , suspecting old reply.",
206 ptp->Transaction_ID, params->transaction_id-1 215 ptp->Transaction_ID, params->transaction_id-1
207 ); 216 );
208 continue; 217 continue;
209 } 218 }
210 if (ptp->Transaction_ID != params->transaction_id-1) { 219 if (ptp->Transaction_ID != params->transaction_id-1) {
211 /* try to clean up potential left overs from previous se ssion */ 220 /* try to clean up potential left overs from previous se ssion */
212 if ((cmd == PTP_OC_OpenSession) && tries) 221 if ((cmd == PTP_OC_OpenSession) && tries)
(...skipping 26 matching lines...) Expand all
239 if (priv->curoff + tocopy > priv->size) 248 if (priv->curoff + tocopy > priv->size)
240 tocopy = priv->size - priv->curoff; 249 tocopy = priv->size - priv->curoff;
241 memcpy (data, priv->data + priv->curoff, tocopy); 250 memcpy (data, priv->data + priv->curoff, tocopy);
242 priv->curoff += tocopy; 251 priv->curoff += tocopy;
243 *gotlen = tocopy; 252 *gotlen = tocopy;
244 return PTP_RC_OK; 253 return PTP_RC_OK;
245 } 254 }
246 255
247 static uint16_t 256 static uint16_t
248 memory_putfunc(PTPParams* params, void* private, 257 memory_putfunc(PTPParams* params, void* private,
249 » unsigned long sendlen, unsigned char *data, 258 » unsigned long sendlen, unsigned char *data
250 » unsigned long *putlen
251 ) { 259 ) {
252 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private; 260 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private;
253 261
254 if (priv->curoff + sendlen > priv->size) { 262 if (priv->curoff + sendlen > priv->size) {
255 priv->data = realloc (priv->data, priv->curoff+sendlen); 263 priv->data = realloc (priv->data, priv->curoff+sendlen);
256 if (!priv->data) 264 if (!priv->data)
257 return PTP_RC_GeneralError; 265 return PTP_RC_GeneralError;
258 priv->size = priv->curoff + sendlen; 266 priv->size = priv->curoff + sendlen;
259 } 267 }
260 memcpy (priv->data + priv->curoff, data, sendlen); 268 memcpy (priv->data + priv->curoff, data, sendlen);
261 priv->curoff += sendlen; 269 priv->curoff += sendlen;
262 *putlen = sendlen;
263 return PTP_RC_OK; 270 return PTP_RC_OK;
264 } 271 }
265 272
266 /* init private struct for receiving data. */ 273 /* init private struct for receiving data. */
267 static uint16_t 274 static uint16_t
268 ptp_init_recv_memory_handler(PTPDataHandler *handler) { 275 ptp_init_recv_memory_handler(PTPDataHandler *handler)
276 {
269 PTPMemHandlerPrivate* priv; 277 PTPMemHandlerPrivate* priv;
270 priv = malloc (sizeof(PTPMemHandlerPrivate)); 278 priv = malloc (sizeof(PTPMemHandlerPrivate));
271 if (!priv) 279 if (!priv)
272 return PTP_RC_GeneralError; 280 return PTP_RC_GeneralError;
273 handler->priv = priv; 281 handler->priv = priv;
274 handler->getfunc = memory_getfunc; 282 handler->getfunc = memory_getfunc;
275 handler->putfunc = memory_putfunc; 283 handler->putfunc = memory_putfunc;
276 priv->data = NULL; 284 priv->data = NULL;
277 priv->size = 0; 285 priv->size = 0;
278 priv->curoff = 0; 286 priv->curoff = 0;
(...skipping 15 matching lines...) Expand all
294 handler->getfunc = memory_getfunc; 302 handler->getfunc = memory_getfunc;
295 handler->putfunc = memory_putfunc; 303 handler->putfunc = memory_putfunc;
296 priv->data = data; 304 priv->data = data;
297 priv->size = len; 305 priv->size = len;
298 priv->curoff = 0; 306 priv->curoff = 0;
299 return PTP_RC_OK; 307 return PTP_RC_OK;
300 } 308 }
301 309
302 /* free private struct + data */ 310 /* free private struct + data */
303 static uint16_t 311 static uint16_t
304 ptp_exit_send_memory_handler (PTPDataHandler *handler) { 312 ptp_exit_send_memory_handler (PTPDataHandler *handler)
313 {
305 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv; 314 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv;
306 /* data is owned by caller */ 315 /* data is owned by caller */
307 free (priv); 316 free (priv);
308 return PTP_RC_OK; 317 return PTP_RC_OK;
309 } 318 }
310 319
311 /* hand over our internal data to caller */ 320 /* hand over our internal data to caller */
312 static uint16_t 321 static uint16_t
313 ptp_exit_recv_memory_handler (PTPDataHandler *handler, 322 ptp_exit_recv_memory_handler (PTPDataHandler *handler,
314 unsigned char **data, unsigned long *size 323 unsigned char **data, unsigned long *size
(...skipping 21 matching lines...) Expand all
336 got = read (priv->fd, data, wantlen); 345 got = read (priv->fd, data, wantlen);
337 if (got != -1) 346 if (got != -1)
338 *gotlen = got; 347 *gotlen = got;
339 else 348 else
340 return PTP_RC_GeneralError; 349 return PTP_RC_GeneralError;
341 return PTP_RC_OK; 350 return PTP_RC_OK;
342 } 351 }
343 352
344 static uint16_t 353 static uint16_t
345 fd_putfunc(PTPParams* params, void* private, 354 fd_putfunc(PTPParams* params, void* private,
346 » unsigned long sendlen, unsigned char *data, 355 » unsigned long sendlen, unsigned char *data
347 » unsigned long *putlen
348 ) { 356 ) {
349 » int» » written; 357 » ssize_t»» written;
350 PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)private; 358 PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)private;
351 359
352 written = write (priv->fd, data, sendlen); 360 written = write (priv->fd, data, sendlen);
353 » if (written != -1) 361 » if (written != sendlen)
354 » » *putlen = written; 362 » » return PTP_ERROR_IO;
355 » else
356 » » return PTP_RC_GeneralError;
357 return PTP_RC_OK; 363 return PTP_RC_OK;
358 } 364 }
359 365
360 static uint16_t 366 static uint16_t
361 ptp_init_fd_handler(PTPDataHandler *handler, int fd) { 367 ptp_init_fd_handler(PTPDataHandler *handler, int fd)
368 {
362 PTPFDHandlerPrivate* priv; 369 PTPFDHandlerPrivate* priv;
363 priv = malloc (sizeof(PTPFDHandlerPrivate)); 370 priv = malloc (sizeof(PTPFDHandlerPrivate));
364 if (!priv) 371 if (!priv)
365 return PTP_RC_GeneralError; 372 return PTP_RC_GeneralError;
366 handler->priv = priv; 373 handler->priv = priv;
367 handler->getfunc = fd_getfunc; 374 handler->getfunc = fd_getfunc;
368 handler->putfunc = fd_putfunc; 375 handler->putfunc = fd_putfunc;
369 priv->fd = fd; 376 priv->fd = fd;
370 return PTP_RC_OK; 377 return PTP_RC_OK;
371 } 378 }
372 379
373 static uint16_t 380 static uint16_t
374 ptp_exit_fd_handler (PTPDataHandler *handler) { 381 ptp_exit_fd_handler (PTPDataHandler *handler)
382 {
375 PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)handler->priv; 383 PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)handler->priv;
376 free (priv); 384 free (priv);
377 return PTP_RC_OK; 385 return PTP_RC_OK;
378 } 386 }
379 387
380 /* Old style transaction, based on memory */ 388 /* Old style transaction, based on memory */
381 static uint16_t 389 /* A note on memory management:
390 * If called with the flag PTP_DP_GETDATA, this function will internally
391 * allocate memory as much as necessary. The caller has to free the memory
392 * returned in *data. If the function returns an error, it will free any
393 * memory it might have allocated. The recvlen may be NULL. After the
394 * function returns, *data will be initialized (valid memory pointer or NULL),
395 * i.e. it is not necessary to initialize *data or *recvlen beforehand.
396 */
397 uint16_t
382 ptp_transaction (PTPParams* params, PTPContainer* ptp, 398 ptp_transaction (PTPParams* params, PTPContainer* ptp,
383 » » uint16_t flags, unsigned int sendlen, 399 » » uint16_t flags, uint64_t sendlen,
384 unsigned char **data, unsigned int *recvlen 400 unsigned char **data, unsigned int *recvlen
385 ) { 401 ) {
386 PTPDataHandler handler; 402 PTPDataHandler handler;
387 uint16_t ret; 403 uint16_t ret;
388 404
389 switch (flags & PTP_DP_DATA_MASK) { 405 switch (flags & PTP_DP_DATA_MASK) {
390 case PTP_DP_SENDDATA: 406 case PTP_DP_SENDDATA:
391 » » ptp_init_send_memory_handler (&handler, *data, sendlen); 407 » » if (!data)
408 » » » return PTP_ERROR_BADPARAM;
409 » » CHECK_PTP_RC(ptp_init_send_memory_handler (&handler, *data, send len));
392 break; 410 break;
393 case PTP_DP_GETDATA: 411 case PTP_DP_GETDATA:
394 » » ptp_init_recv_memory_handler (&handler); 412 » » if (!data)
413 » » » return PTP_ERROR_BADPARAM;
414 » » *data = NULL;
415 » » if (recvlen)
416 » » » *recvlen = 0;
417 » » CHECK_PTP_RC(ptp_init_recv_memory_handler (&handler));
395 break; 418 break;
396 default:break; 419 default:break;
397 } 420 }
398 ret = ptp_transaction_new (params, ptp, flags, sendlen, &handler); 421 ret = ptp_transaction_new (params, ptp, flags, sendlen, &handler);
399 switch (flags & PTP_DP_DATA_MASK) { 422 switch (flags & PTP_DP_DATA_MASK) {
400 case PTP_DP_SENDDATA: 423 case PTP_DP_SENDDATA:
401 ptp_exit_send_memory_handler (&handler); 424 ptp_exit_send_memory_handler (&handler);
402 break; 425 break;
403 case PTP_DP_GETDATA: { 426 case PTP_DP_GETDATA: {
404 unsigned long len; 427 unsigned long len;
405 ptp_exit_recv_memory_handler (&handler, data, &len); 428 ptp_exit_recv_memory_handler (&handler, data, &len);
429 if (ret != PTP_RC_OK) {
430 len = 0;
431 free(*data);
432 *data = NULL;
433 }
406 if (recvlen) 434 if (recvlen)
407 *recvlen = len; 435 *recvlen = len;
408 break; 436 break;
409 } 437 }
410 default:break; 438 default:break;
411 } 439 }
412 return ret; 440 return ret;
413 } 441 }
414 442
415 443
416 /** 444 /**
417 * PTP operation functions 445 * PTP operation functions
418 * 446 *
419 * all ptp_ functions should take integer parameters 447 * all ptp_ functions should take integer parameters
420 * in host byte order! 448 * in host byte order!
421 **/ 449 **/
422 450
423 451
424 /** 452 /**
425 * ptp_getdeviceinfo: 453 * ptp_getdeviceinfo:
426 * params: PTPParams* 454 * params: PTPParams*
427 * 455 *
428 * Gets device info dataset and fills deviceinfo structure. 456 * Gets device info dataset and fills deviceinfo structure.
429 * 457 *
430 * Return values: Some PTP_RC_* code. 458 * Return values: Some PTP_RC_* code.
431 **/ 459 **/
432 uint16_t 460 uint16_t
433 ptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo) 461 ptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo)
434 { 462 {
435 uint16_t ret;
436 unsigned long len;
437 PTPContainer ptp; 463 PTPContainer ptp;
438 » unsigned char*» di=NULL; 464 » unsigned char» *data;
439 » PTPDataHandler» handler; 465 » unsigned int» size;
440 466
441 » ptp_init_recv_memory_handler (&handler); 467 » PTP_CNT_INIT(ptp, PTP_OC_GetDeviceInfo);
442 » PTP_CNT_INIT(ptp); 468 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
443 » ptp.Code=PTP_OC_GetDeviceInfo; 469 » ptp_unpack_DI(params, data, deviceinfo, size);
444 » ptp.Nparam=0; 470 » free(data);
445 » len=0; 471 » return PTP_RC_OK;
446 » ret=ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler);
447 » ptp_exit_recv_memory_handler (&handler, &di, &len);
448 » if (!di) ret = PTP_RC_GeneralError;
449 » if (ret == PTP_RC_OK) ptp_unpack_DI(params, di, deviceinfo, len);
450 » free(di);
451 » return ret;
452 } 472 }
453 473
454 uint16_t 474 uint16_t
455 ptp_canon_eos_getdeviceinfo (PTPParams* params, PTPCanonEOSDeviceInfo*di) 475 ptp_canon_eos_getdeviceinfo (PTPParams* params, PTPCanonEOSDeviceInfo*di)
456 { 476 {
477 PTPContainer ptp;
478 unsigned char *data;
479 unsigned int size;
480
481 PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetDeviceInfoEx);
482 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
483 ptp_unpack_EOS_DI(params, data, di, size);
484 free (data);
485 return PTP_RC_OK;
486 }
487
488 #ifdef HAVE_LIBXML2
489 static int
490 traverse_tree (PTPParams *params, int depth, xmlNodePtr node)
491 {
492 xmlNodePtr next;
493 xmlChar *xchar;
494 int n;
495 char *xx;
496
497
498 if (!node) return 0;
499 xx = malloc (depth * 4 + 1);
500 memset (xx, ' ', depth*4);
501 xx[depth*4] = 0;
502
503 n = xmlChildElementCount (node);
504
505 next = node;
506 do {
507 fprintf(stderr,"%snode %s\n", xx,next->name);
508 fprintf(stderr,"%selements %d\n", xx,n);
509 xchar = xmlNodeGetContent (next);
510 fprintf(stderr,"%scontent %s\n", xx,xchar);
511 traverse_tree (params, depth+1,xmlFirstElementChild (next));
512 } while ((next = xmlNextElementSibling (next)));
513 free (xx);
514 return PTP_RC_OK;
515 }
516
517 static int
518 parse_9301_cmd_tree (PTPParams *params, xmlNodePtr node, PTPDeviceInfo *di)
519 {
520 xmlNodePtr next;
521 int cnt;
522
523 cnt = 0;
524 next = xmlFirstElementChild (node);
525 while (next) {
526 cnt++;
527 next = xmlNextElementSibling (next);
528 }
529 di->OperationsSupported_len = cnt;
530 di->OperationsSupported = malloc (cnt*sizeof(di->OperationsSupported[0]) );
531 cnt = 0;
532 next = xmlFirstElementChild (node);
533 while (next) {
534 unsigned int p;
535
536 sscanf((char*)next->name, "c%04x", &p);
537 ptp_debug( params, "cmd %s / 0x%04x", next->name, p);
538 di->OperationsSupported[cnt++] = p;
539 next = xmlNextElementSibling (next);
540 }
541 return PTP_RC_OK;
542 }
543
544 static int
545 parse_9301_value (PTPParams *params, const char *str, uint16_t type, PTPProperty Value *propval)
546 {
547 switch (type) {
548 case 6: { /*UINT32*/
549 unsigned int x;
550 if (!sscanf(str,"%08x", &x)) {
551 ptp_debug( params, "could not parse uint32 %s", str);
552 return PTP_RC_GeneralError;
553 }
554 ptp_debug( params, "\t%d", x);
555 propval->u32 = x;
556 break;
557 }
558 case 5: { /*INT32*/
559 int x;
560 if (!sscanf(str,"%08x", &x)) {
561 ptp_debug( params, "could not parse int32 %s", str);
562 return PTP_RC_GeneralError;
563 }
564 ptp_debug( params, "\t%d", x);
565 propval->i32 = x;
566 break;
567 }
568 case 4: { /*UINT16*/
569 unsigned int x;
570 if (!sscanf(str,"%04x", &x)) {
571 ptp_debug( params, "could not parse uint16 %s", str);
572 return PTP_RC_GeneralError;
573 }
574 ptp_debug( params, "\t%d", x);
575 propval->u16 = x;
576 break;
577 }
578 case 3: { /*INT16*/
579 int x;
580 if (!sscanf(str,"%04x", &x)) {
581 ptp_debug( params, "could not parse int16 %s", str);
582 return PTP_RC_GeneralError;
583 }
584 ptp_debug( params, "\t%d", x);
585 propval->i16 = x;
586 break;
587 }
588 case 2: { /*UINT8*/
589 unsigned int x;
590 if (!sscanf(str,"%02x", &x)) {
591 ptp_debug( params, "could not parse uint8 %s", str);
592 return PTP_RC_GeneralError;
593 }
594 ptp_debug( params, "\t%d", x);
595 propval->u8 = x;
596 break;
597 }
598 case 1: { /*INT8*/
599 int x;
600 if (!sscanf(str,"%02x", &x)) {
601 ptp_debug( params, "could not parse int8 %s", str);
602 return PTP_RC_GeneralError;
603 }
604 ptp_debug( params, "\t%d", x);
605 propval->i8 = x;
606 break;
607 }
608 case 65535: { /* string */
609 int len;
610
611 /* ascii ptp string, 1 byte length, little endian 16 bit chars * /
612 if (sscanf(str,"%02x", &len)) {
613 int i;
614 char *xstr = malloc(len+1);
615 for (i=0;i<len;i++) {
616 int xc;
617 if (sscanf(str+2+i*4,"%04x", &xc)) {
618 int cx;
619
620 cx = ((xc>>8) & 0xff) | ((xc & 0xff) << 8);
621 xstr[i] = cx;
622 }
623 xstr[len] = 0;
624 }
625 ptp_debug( params, "\t%s", xstr);
626 propval->str = xstr;
627 break;
628 }
629 ptp_debug( params, "string %s not parseable!", str);
630 return PTP_RC_GeneralError;
631 }
632 case 7: /*INT64*/
633 case 8: /*UINT64*/
634 case 9: /*INT128*/
635 case 10: /*UINT128*/
636 default:
637 ptp_debug( params, "unhandled data type %d!", type);
638 return PTP_RC_GeneralError;
639 }
640 return PTP_RC_OK;
641 }
642
643 static int
644 parse_9301_propdesc (PTPParams *params, xmlNodePtr next, PTPDevicePropDesc *dpd)
645 {
646 int type = -1;
647
648 if (!next)
649 return PTP_RC_GeneralError;
650
651 ptp_debug (params, "parse_9301_propdesc");
652 dpd->FormFlag = PTP_DPFF_None;
653 dpd->GetSet = PTP_DPGS_Get;
654 do {
655 if (!strcmp((char*)next->name,"type")) { /* propdesc.Data Type */
656 if (!sscanf((char*)xmlNodeGetContent (next), "%04x", &ty pe)) {
657 ptp_debug( params, "\ttype %s not parseable?",xm lNodeGetContent (next));
658 return 0;
659 }
660 ptp_debug( params, "type 0x%x", type);
661 dpd->DataType = type;
662 continue;
663 }
664 if (!strcmp((char*)next->name,"attribute")) { /* propdesc.GetS et */
665 int attr;
666
667 if (!sscanf((char*)xmlNodeGetContent (next), "%02x", &at tr)) {
668 ptp_debug( params, "\tattr %s not parseable",xml NodeGetContent (next));
669 return 0;
670 }
671 ptp_debug( params, "attribute 0x%x", attr);
672 dpd->GetSet = attr;
673 continue;
674 }
675 if (!strcmp((char*)next->name,"default")) { /* propdesc.Fact oryDefaultValue */
676 ptp_debug( params, "default value");
677 parse_9301_value (params, (char*)xmlNodeGetContent (next ), type, &dpd->FactoryDefaultValue);
678 continue;
679 }
680 if (!strcmp((char*)next->name,"value")) { /* propdesc.Curr entValue */
681 ptp_debug( params, "current value");
682 parse_9301_value (params, (char*)xmlNodeGetContent (next ), type, &dpd->CurrentValue);
683 continue;
684 }
685 if (!strcmp((char*)next->name,"enum")) { /* propdesc.FORM .Enum */
686 int n,i;
687 char *s;
688
689 ptp_debug( params, "enum");
690 dpd->FormFlag = PTP_DPFF_Enumeration;
691 s = (char*)xmlNodeGetContent (next);
692 n = 0;
693 do {
694 s = strchr(s,' ');
695 if (s) s++;
696 n++;
697 } while (s);
698 dpd->FORM.Enum.NumberOfValues = n;
699 dpd->FORM.Enum.SupportedValue = malloc (n * sizeof(PTPPr opertyValue));
700 s = (char*)xmlNodeGetContent (next);
701 i = 0;
702 do {
703 parse_9301_value (params, s, type, &dpd->FORM.En um.SupportedValue[i]); /* should turn ' ' into \0? */
704 i++;
705 s = strchr(s,' ');
706 if (s) s++;
707 } while (s && (i<n));
708 continue;
709 }
710 if (!strcmp((char*)next->name,"range")) { /* propdesc.FORM .Enum */
711 char *s = (char*)xmlNodeGetContent (next);
712 dpd->FormFlag = PTP_DPFF_Range;
713 ptp_debug( params, "range");
714 parse_9301_value (params, s, type, &dpd->FORM.Range.Mini mumValue); /* should turn ' ' into \0? */
715 s = strchr(s,' ');
716 if (!s) continue;
717 s++;
718 parse_9301_value (params, s, type, &dpd->FORM.Range.Maxi mumValue); /* should turn ' ' into \0? */
719 s = strchr(s,' ');
720 if (!s) continue;
721 s++;
722 parse_9301_value (params, s, type, &dpd->FORM.Range.Step Size); /* should turn ' ' into \0? */
723
724 continue;
725 }
726 ptp_debug (params, "\tpropdescvar: %s", next->name);
727 traverse_tree (params, 3, next);
728 } while ((next = xmlNextElementSibling (next)));
729 return PTP_RC_OK;
730 }
731
732 static int
733 parse_9301_prop_tree (PTPParams *params, xmlNodePtr node, PTPDeviceInfo *di)
734 {
735 xmlNodePtr next;
736 int cnt;
737 unsigned int i;
738
739 cnt = 0;
740 next = xmlFirstElementChild (node);
741 while (next) {
742 cnt++;
743 next = xmlNextElementSibling (next);
744 }
745
746 di->DevicePropertiesSupported_len = cnt;
747 di->DevicePropertiesSupported = malloc (cnt*sizeof(di->DevicePropertiesS upported[0]));
748 cnt = 0;
749 next = xmlFirstElementChild (node);
750 while (next) {
751 unsigned int p;
752 PTPDevicePropDesc dpd;
753
754 sscanf((char*)next->name, "p%04x", &p);
755 ptp_debug( params, "prop %s / 0x%04x", next->name, p);
756 parse_9301_propdesc (params, xmlFirstElementChild (next), &dpd);
757 dpd.DevicePropertyCode = p;
758 di->DevicePropertiesSupported[cnt++] = p;
759
760 /* add to cache of device propdesc */
761 for (i=0;i<params->nrofdeviceproperties;i++)
762 if (params->deviceproperties[i].desc.DevicePropertyCode == p)
763 break;
764 if (i == params->nrofdeviceproperties) {
765 params->deviceproperties = realloc(params->devicepropert ies,(i+1)*sizeof(params->deviceproperties[0]));
766 memset(&params->deviceproperties[i],0,sizeof(params->dev iceproperties[0]));
767 params->nrofdeviceproperties++;
768 } else {
769 ptp_free_devicepropdesc (&params->deviceproperties[i].de sc);
770 }
771 /* FIXME: free old entry */
772 /* we are not using dpd, so copy it directly to the cache */
773 time( &params->deviceproperties[i].timestamp);
774 params->deviceproperties[i].desc = dpd;
775
776 next = xmlNextElementSibling (next);
777 }
778 return PTP_RC_OK;
779 }
780
781 static int
782 parse_9301_event_tree (PTPParams *params, xmlNodePtr node, PTPDeviceInfo *di)
783 {
784 xmlNodePtr next;
785 int cnt;
786
787 cnt = 0;
788 next = xmlFirstElementChild (node);
789 while (next) {
790 cnt++;
791 next = xmlNextElementSibling (next);
792 }
793 di->EventsSupported_len = cnt;
794 di->EventsSupported = malloc (cnt*sizeof(di->EventsSupported[0]));
795 cnt = 0;
796 next = xmlFirstElementChild (node);
797 while (next) {
798 unsigned int p;
799
800 sscanf((char*)next->name, "e%04x", &p);
801 ptp_debug( params, "event %s / 0x%04x", next->name, p);
802 di->EventsSupported[cnt++] = p;
803 next = xmlNextElementSibling (next);
804 }
805 return PTP_RC_OK;
806 }
807
808 static int
809 parse_9301_tree (PTPParams *params, xmlNodePtr node, PTPDeviceInfo *di)
810 {
811 xmlNodePtr next;
812
813 next = xmlFirstElementChild (node);
814 while (next) {
815 if (!strcmp ((char*)next->name, "cmd")) {
816 parse_9301_cmd_tree (params, next, di);
817 next = xmlNextElementSibling (next);
818 continue;
819 }
820 if (!strcmp ((char*)next->name, "prop")) {
821 parse_9301_prop_tree (params, next, di);
822 next = xmlNextElementSibling (next);
823 continue;
824 }
825 if (!strcmp ((char*)next->name, "event")) {
826 parse_9301_event_tree (params, next, di);
827 next = xmlNextElementSibling (next);
828 continue;
829 }
830 fprintf (stderr,"9301: unhandled type %s\n", next->name);
831 next = xmlNextElementSibling (next);
832 }
833 /*traverse_tree (0, node);*/
834 return PTP_RC_OK;
835 }
836
837 static uint16_t
838 ptp_olympus_parse_output_xml(PTPParams* params, char*data, int len, xmlNodePtr * code)
839 {
840 xmlDocPtr docin;
841 xmlNodePtr docroot, output, next;
842 int result, xcode;
843
844 *code = NULL;
845
846 docin = xmlReadMemory ((char*)data, len, "http://gphoto.org/", "utf-8", 0);
847 if (!docin) return PTP_RC_GeneralError;
848 docroot = xmlDocGetRootElement (docin);
849 if (!docroot) {
850 xmlFreeDoc (docin);
851 return PTP_RC_GeneralError;
852 }
853
854 if (strcmp((char*)docroot->name,"x3c")) {
855 ptp_debug (params, "olympus: docroot is not x3c, but %s", docroo t->name);
856 xmlFreeDoc (docin);
857 return PTP_RC_GeneralError;
858 }
859 if (xmlChildElementCount(docroot) != 1) {
860 ptp_debug (params, "olympus: x3c: expected 1 child, got %ld", xm lChildElementCount(docroot));
861 xmlFreeDoc (docin);
862 return PTP_RC_GeneralError;
863 }
864 output = xmlFirstElementChild (docroot);
865 if (strcmp((char*)output->name, "output") != 0) {
866 ptp_debug (params, "olympus: x3c node: expected child 'output', but got %s", (char*)output->name);
867 xmlFreeDoc (docin);
868 return PTP_RC_GeneralError;
869 }
870 next = xmlFirstElementChild (output);
871
872 result = PTP_RC_GeneralError;
873
874 while (next) {
875 if (!strcmp((char*)next->name,"result")) {
876 xmlChar *xchar;
877
878 xchar = xmlNodeGetContent (next);
879 if (!sscanf((char*)xchar,"%04x",&result))
880 ptp_debug (params, "failed scanning result from %s", xchar);
881 ptp_debug (params, "ptp result is 0x%04x", result);
882 next = xmlNextElementSibling (next);
883 continue;
884 }
885 if (sscanf((char*)next->name,"c%x", &xcode)) {
886 ptp_debug (params, "ptp code node found %s", (char*)nex t->name);
887 *code = next;
888 next = xmlNextElementSibling (next);
889 continue;
890 }
891 ptp_debug (params, "unhandled node %s", (char*)next->name);
892 next = xmlNextElementSibling (next);
893 }
894
895 if (result != PTP_RC_OK) {
896 *code = NULL;
897 xmlFreeDoc (docin);
898 }
899 return result;
900 }
901 #endif
902
903 uint16_t
904 ptp_olympus_getdeviceinfo (PTPParams* params, PTPDeviceInfo *di)
905 {
906 #ifdef HAVE_LIBXML2
907 PTPContainer ptp;
457 uint16_t ret; 908 uint16_t ret;
909 unsigned char *data;
910 unsigned int size;
911 xmlNodePtr code;
912
913 memset (di, 0, sizeof(PTPDeviceInfo));
914
915 PTP_CNT_INIT(ptp, PTP_OC_OLYMPUS_GetDeviceInfo);
916 ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
917 /* TODO: check for error, only parse_output_xml if ret == PTP_RC_OK?
918 * where is 'data' going to be deallocated? */
919 ret = ptp_olympus_parse_output_xml(params,(char*)data,size,&code);
920 if (ret != PTP_RC_OK)
921 return ret;
922
923 ret = parse_9301_tree (params, code, di);
924
925 xmlFreeDoc(code->doc);
926 return ret;
927 #else
928 return PTP_RC_GeneralError;
929 #endif
930 }
931
932 uint16_t
933 ptp_olympus_opensession (PTPParams* params, unsigned char**data, unsigned int *l en)
934 {
458 PTPContainer ptp; 935 PTPContainer ptp;
459 » PTPDataHandler» handler; 936
460 » unsigned long» len; 937 » PTP_CNT_INIT(ptp, PTP_OC_OLYMPUS_OpenSession);
461 » unsigned char» *data; 938 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, len);
462 939 }
463 » ptp_init_recv_memory_handler (&handler); 940
464 » PTP_CNT_INIT(ptp); 941 uint16_t
465 » ptp.Code=PTP_OC_CANON_EOS_GetDeviceInfoEx; 942 ptp_olympus_getcameraid (PTPParams* params, unsigned char**data, unsigned int *l en)
466 » ptp.Nparam=0; 943 {
467 » len=0; 944 » PTPContainer» ptp;
468 » data=NULL; 945
469 » ret=ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler); 946 » PTP_CNT_INIT(ptp, PTP_OC_OLYMPUS_GetCameraID);
470 » ptp_exit_recv_memory_handler (&handler, &data, &len); 947 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, len);
471 » if (ret == PTP_RC_OK) ptp_unpack_EOS_DI(params, data, di, len);
472 » free (data);
473 » return ret;
474 } 948 }
475 949
476 /** 950 /**
477 * ptp_generic_no_data: 951 * ptp_generic_no_data:
478 * params: PTPParams* 952 * params: PTPParams*
479 * code PTP OP Code 953 * code PTP OP Code
480 * n_param count of parameters 954 * n_param count of parameters
481 * ... variable argument list ... 955 * ... variable argument list ...
482 * 956 *
483 * Emits a generic PTP command without any data transfer. 957 * Emits a generic PTP command without any data transfer.
484 * 958 *
485 * Return values: Some PTP_RC_* code. 959 * Return values: Some PTP_RC_* code.
486 **/ 960 **/
487 uint16_t 961 uint16_t
488 ptp_generic_no_data (PTPParams* params, uint16_t code, unsigned int n_param, ... ) 962 ptp_generic_no_data (PTPParams* params, uint16_t code, unsigned int n_param, ... )
489 { 963 {
490 » PTPContainer ptp; 964 » PTPContainer» ptp;
491 » va_list args; 965 » va_list»» args;
492 » int i; 966 » unsigned int» i;
493 967
494 if( n_param > 5 ) 968 if( n_param > 5 )
495 » » return PTP_RC_InvalidParameter; 969 » » return PTP_ERROR_BADPARAM;
496 970
497 » PTP_CNT_INIT(ptp); 971 » memset(&ptp, 0, sizeof(ptp));
498 ptp.Code=code; 972 ptp.Code=code;
499 ptp.Nparam=n_param; 973 ptp.Nparam=n_param;
500 974
501 va_start(args, n_param); 975 va_start(args, n_param);
502 for( i=0; i<n_param; ++i ) 976 for( i=0; i<n_param; ++i )
503 (&ptp.Param1)[i] = va_arg(args, uint32_t); 977 (&ptp.Param1)[i] = va_arg(args, uint32_t);
504 va_end(args); 978 va_end(args);
505 979
506 return ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL); 980 return ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
507 } 981 }
508 982
509 /** 983 /**
510 * ptp_opensession: 984 * ptp_opensession:
511 * params: PTPParams* 985 * params: PTPParams*
512 * session - session number 986 * session - session number
513 * 987 *
514 * Establishes a new session. 988 * Establishes a new session.
515 * 989 *
516 * Return values: Some PTP_RC_* code. 990 * Return values: Some PTP_RC_* code.
517 **/ 991 **/
518 uint16_t 992 uint16_t
519 ptp_opensession (PTPParams* params, uint32_t session) 993 ptp_opensession (PTPParams* params, uint32_t session)
520 { 994 {
521 » uint16_t ret; 995 » PTPContainer» ptp;
522 » PTPContainer ptp; 996 » uint16_t» ret;
523 997
524 ptp_debug(params,"PTP: Opening session"); 998 ptp_debug(params,"PTP: Opening session");
525 999
526 /* SessonID field of the operation dataset should always 1000 /* SessonID field of the operation dataset should always
527 be set to 0 for OpenSession request! */ 1001 be set to 0 for OpenSession request! */
528 params->session_id=0x00000000; 1002 params->session_id=0x00000000;
529 /* TransactionID should be set to 0 also! */ 1003 /* TransactionID should be set to 0 also! */
530 params->transaction_id=0x0000000; 1004 params->transaction_id=0x0000000;
531 /* zero out response packet buffer */ 1005 /* zero out response packet buffer */
532 params->response_packet = NULL; 1006 params->response_packet = NULL;
533 params->response_packet_size = 0; 1007 params->response_packet_size = 0;
534 /* no split headers */ 1008 /* no split headers */
535 params->split_header_data = 0; 1009 params->split_header_data = 0;
536 1010
537 » PTP_CNT_INIT(ptp); 1011 » PTP_CNT_INIT(ptp, PTP_OC_OpenSession, session);
538 » ptp.Code=PTP_OC_OpenSession;
539 » ptp.Param1=session;
540 » ptp.Nparam=1;
541 ret=ptp_transaction_new(params, &ptp, PTP_DP_NODATA, 0, NULL); 1012 ret=ptp_transaction_new(params, &ptp, PTP_DP_NODATA, 0, NULL);
1013 /* TODO: check for error */
542 /* now set the global session id to current session number */ 1014 /* now set the global session id to current session number */
543 params->session_id=session; 1015 params->session_id=session;
544 return ret; 1016 return ret;
545 } 1017 }
546 1018
1019 void
1020 ptp_free_devicepropvalue(uint16_t dt, PTPPropertyValue* dpd)
1021 {
1022 switch (dt) {
1023 case PTP_DTC_INT8: case PTP_DTC_UINT8:
1024 case PTP_DTC_UINT16: case PTP_DTC_INT16:
1025 case PTP_DTC_UINT32: case PTP_DTC_INT32:
1026 case PTP_DTC_UINT64: case PTP_DTC_INT64:
1027 case PTP_DTC_UINT128: case PTP_DTC_INT128:
1028 /* Nothing to free */
1029 break;
1030 case PTP_DTC_AINT8: case PTP_DTC_AUINT8:
1031 case PTP_DTC_AUINT16: case PTP_DTC_AINT16:
1032 case PTP_DTC_AUINT32: case PTP_DTC_AINT32:
1033 case PTP_DTC_AUINT64: case PTP_DTC_AINT64:
1034 case PTP_DTC_AUINT128: case PTP_DTC_AINT128:
1035 free(dpd->a.v);
1036 break;
1037 case PTP_DTC_STR:
1038 free(dpd->str);
1039 break;
1040 }
1041 }
1042
1043 void
1044 ptp_free_devicepropdesc(PTPDevicePropDesc* dpd)
1045 {
1046 uint16_t i;
1047
1048 ptp_free_devicepropvalue (dpd->DataType, &dpd->FactoryDefaultValue);
1049 ptp_free_devicepropvalue (dpd->DataType, &dpd->CurrentValue);
1050 switch (dpd->FormFlag) {
1051 case PTP_DPFF_Range:
1052 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.Minimu mValue);
1053 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.Maximu mValue);
1054 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.StepSi ze);
1055 break;
1056 case PTP_DPFF_Enumeration:
1057 if (dpd->FORM.Enum.SupportedValue) {
1058 for (i=0;i<dpd->FORM.Enum.NumberOfValues;i++)
1059 ptp_free_devicepropvalue (dpd->DataType, dpd->FO RM.Enum.SupportedValue+i);
1060 free (dpd->FORM.Enum.SupportedValue);
1061 }
1062 }
1063 dpd->DataType = PTP_DTC_UNDEF;
1064 dpd->FormFlag = PTP_DPFF_None;
1065 }
1066
1067
1068 void
1069 ptp_free_objectpropdesc(PTPObjectPropDesc* opd)
1070 {
1071 uint16_t i;
1072
1073 ptp_free_devicepropvalue (opd->DataType, &opd->FactoryDefaultValue);
1074 switch (opd->FormFlag) {
1075 case PTP_OPFF_None:
1076 break;
1077 case PTP_OPFF_Range:
1078 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.Minimu mValue);
1079 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.Maximu mValue);
1080 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.StepSi ze);
1081 break;
1082 case PTP_OPFF_Enumeration:
1083 if (opd->FORM.Enum.SupportedValue) {
1084 for (i=0;i<opd->FORM.Enum.NumberOfValues;i++)
1085 ptp_free_devicepropvalue (opd->DataType, opd->FO RM.Enum.SupportedValue+i);
1086 free (opd->FORM.Enum.SupportedValue);
1087 }
1088 break;
1089 case PTP_OPFF_DateTime:
1090 case PTP_OPFF_FixedLengthArray:
1091 case PTP_OPFF_RegularExpression:
1092 case PTP_OPFF_ByteArray:
1093 case PTP_OPFF_LongString:
1094 /* Ignore these presently, we cannot unpack them, so there is no thing to be freed. */
1095 break;
1096 default:
1097 fprintf (stderr, "Unknown OPFF type %d\n", opd->FormFlag);
1098 break;
1099 }
1100 }
1101
1102
547 /** 1103 /**
548 * ptp_free_params: 1104 * ptp_free_params:
549 * params: PTPParams* 1105 * params: PTPParams*
550 * 1106 *
551 * Frees all data within the PTPParams struct. 1107 * Frees all data within the PTPParams struct.
552 * 1108 *
553 * Return values: Some PTP_RC_* code. 1109 * Return values: Some PTP_RC_* code.
554 **/ 1110 **/
555 void 1111 void
556 ptp_free_params (PTPParams *params) { 1112 ptp_free_params (PTPParams *params)
557 » int i; 1113 {
1114 » unsigned int i;
558 1115
559 » if (params->cameraname) free (params->cameraname); 1116 » free (params->cameraname);
560 » if (params->wifi_profiles) free (params->wifi_profiles); 1117 » free (params->wifi_profiles);
561 for (i=0;i<params->nrofobjects;i++) 1118 for (i=0;i<params->nrofobjects;i++)
562 ptp_free_object (&params->objects[i]); 1119 ptp_free_object (&params->objects[i]);
563 free (params->objects); 1120 free (params->objects);
564 free (params->events); 1121 free (params->events);
565 for (i=0;i<params->nrofcanon_props;i++) { 1122 for (i=0;i<params->nrofcanon_props;i++) {
566 free (params->canon_props[i].data); 1123 free (params->canon_props[i].data);
567 ptp_free_devicepropdesc (&params->canon_props[i].dpd); 1124 ptp_free_devicepropdesc (&params->canon_props[i].dpd);
568 } 1125 }
569 free (params->canon_props); 1126 free (params->canon_props);
570 free (params->backlogentries); 1127 free (params->backlogentries);
1128
1129 for (i=0;i<params->nrofdeviceproperties;i++)
1130 ptp_free_devicepropdesc (&params->deviceproperties[i].desc);
1131 free (params->deviceproperties);
1132
571 ptp_free_DI (&params->deviceinfo); 1133 ptp_free_DI (&params->deviceinfo);
572 } 1134 }
573 1135
574 /** 1136 /**
575 * ptp_getststorageids: 1137 * ptp_getststorageids:
576 * params: PTPParams* 1138 * params: PTPParams*
577 * 1139 *
578 * Gets array of StorageIDs and fills the storageids structure. 1140 * Gets array of StorageIDs and fills the storageids structure.
579 * 1141 *
580 * Return values: Some PTP_RC_* code. 1142 * Return values: Some PTP_RC_* code.
581 **/ 1143 **/
582 uint16_t 1144 uint16_t
583 ptp_getstorageids (PTPParams* params, PTPStorageIDs* storageids) 1145 ptp_getstorageids (PTPParams* params, PTPStorageIDs* storageids)
584 { 1146 {
585 » uint16_t ret; 1147 » PTPContainer» ptp;
586 » PTPContainer ptp; 1148 » unsigned char» *data;
587 » unsigned int len; 1149 » unsigned int» size;
588 » unsigned char* sids=NULL;
589 1150
590 » PTP_CNT_INIT(ptp); 1151 » PTP_CNT_INIT(ptp, PTP_OC_GetStorageIDs);
591 » ptp.Code=PTP_OC_GetStorageIDs; 1152 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
592 » ptp.Nparam=0; 1153 » ptp_unpack_SIDs(params, data, storageids, size);
593 » len=0; 1154 » free(data);
594 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &sids, &len); 1155 » return PTP_RC_OK;
595 » if (ret == PTP_RC_OK) ptp_unpack_SIDs(params, sids, storageids, len);
596 » free(sids);
597 » return ret;
598 } 1156 }
599 1157
600 /** 1158 /**
601 * ptp_getststorageinfo: 1159 * ptp_getststorageinfo:
602 * params: PTPParams* 1160 * params: PTPParams*
603 * storageid - StorageID 1161 * storageid - StorageID
604 * 1162 *
605 * Gets StorageInfo dataset of desired storage and fills storageinfo 1163 * Gets StorageInfo dataset of desired storage and fills storageinfo
606 * structure. 1164 * structure.
607 * 1165 *
608 * Return values: Some PTP_RC_* code. 1166 * Return values: Some PTP_RC_* code.
609 **/ 1167 **/
610 uint16_t 1168 uint16_t
611 ptp_getstorageinfo (PTPParams* params, uint32_t storageid, 1169 ptp_getstorageinfo (PTPParams* params, uint32_t storageid,
612 PTPStorageInfo* storageinfo) 1170 PTPStorageInfo* storageinfo)
613 { 1171 {
614 » uint16_t ret; 1172 » PTPContainer» ptp;
615 » PTPContainer ptp; 1173 » unsigned char» *data;
616 » unsigned char* si=NULL; 1174 » unsigned int» size;
617 » unsigned int len;
618 1175
619 » PTP_CNT_INIT(ptp); 1176 » PTP_CNT_INIT(ptp, PTP_OC_GetStorageInfo, storageid);
620 » ptp.Code=PTP_OC_GetStorageInfo; 1177 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
621 » ptp.Param1=storageid; 1178 » ptp_unpack_SI(params, data, storageinfo, size);
622 » ptp.Nparam=1; 1179 » free(data);
623 » len=0; 1180 » return PTP_RC_OK;
624 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &si, &len);
625 » if (ret == PTP_RC_OK) ptp_unpack_SI(params, si, storageinfo, len);
626 » free(si);
627 » return ret;
628 } 1181 }
629 1182
630 /** 1183 /**
631 * ptp_getobjecthandles: 1184 * ptp_getobjecthandles:
632 * params: PTPParams* 1185 * params: PTPParams*
633 * storage - StorageID 1186 * storage - StorageID
634 * objectformatcode - ObjectFormatCode (optional) 1187 * objectformatcode - ObjectFormatCode (optional)
635 * associationOH - ObjectHandle of Association for 1188 * associationOH - ObjectHandle of Association for
636 * wich a list of children is desired 1189 * wich a list of children is desired
637 * (optional) 1190 * (optional)
638 * objecthandles - pointer to structute 1191 * objecthandles - pointer to structute
639 * 1192 *
640 * Fills objecthandles with structure returned by device. 1193 * Fills objecthandles with structure returned by device.
641 * 1194 *
642 * Return values: Some PTP_RC_* code. 1195 * Return values: Some PTP_RC_* code.
643 **/ 1196 **/
644 uint16_t 1197 uint16_t
645 ptp_getobjecthandles (PTPParams* params, uint32_t storage, 1198 ptp_getobjecthandles (PTPParams* params, uint32_t storage,
646 uint32_t objectformatcode, uint32_t associationOH, 1199 uint32_t objectformatcode, uint32_t associationOH,
647 PTPObjectHandles* objecthandles) 1200 PTPObjectHandles* objecthandles)
648 { 1201 {
649 » uint16_t ret; 1202 » PTPContainer» ptp;
650 » PTPContainer ptp; 1203 » uint16_t» ret;
651 » unsigned char* oh=NULL; 1204 » unsigned char» *data;
652 » unsigned int len; 1205 » unsigned int» size;
653 1206
654 » PTP_CNT_INIT(ptp); 1207 » PTP_CNT_INIT(ptp, PTP_OC_GetObjectHandles, storage, objectformatcode, as sociationOH);
655 » ptp.Code=PTP_OC_GetObjectHandles; 1208 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
656 » ptp.Param1=storage;
657 » ptp.Param2=objectformatcode;
658 » ptp.Param3=associationOH;
659 » ptp.Nparam=3;
660 » len=0;
661 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &oh, &len);
662 if (ret == PTP_RC_OK) { 1209 if (ret == PTP_RC_OK) {
663 » » ptp_unpack_OH(params, oh, objecthandles, len); 1210 » » ptp_unpack_OH(params, data, objecthandles, size);
664 } else { 1211 } else {
665 if ( (storage == 0xffffffff) && 1212 if ( (storage == 0xffffffff) &&
666 (objectformatcode == 0) && 1213 (objectformatcode == 0) &&
667 (associationOH == 0) 1214 (associationOH == 0)
668 ) { 1215 ) {
669 /* When we query all object handles on all stores and 1216 /* When we query all object handles on all stores and
670 * get an error -> just handle it as "0 handles". 1217 * get an error -> just handle it as "0 handles".
671 */ 1218 */
672 objecthandles->Handler = NULL; 1219 objecthandles->Handler = NULL;
673 objecthandles->n = 0; 1220 objecthandles->n = 0;
674 ret = PTP_RC_OK; 1221 ret = PTP_RC_OK;
675 } 1222 }
676 } 1223 }
677 » free(oh); 1224 » free(data);
678 return ret; 1225 return ret;
679 } 1226 }
680 1227
681 uint16_t 1228 uint16_t
682 ptp_getfilesystemmanifest (PTPParams* params, uint32_t storage, 1229 ptp_getfilesystemmanifest (PTPParams* params, uint32_t storage,
683 uint32_t objectformatcode, uint32_t associationOH, 1230 uint32_t objectformatcode, uint32_t associationOH,
684 unsigned char** data) 1231 unsigned char** data)
685 { 1232 {
686 uint16_t ret;
687 PTPContainer ptp; 1233 PTPContainer ptp;
688 unsigned int len;
689 1234
690 » PTP_CNT_INIT(ptp); 1235 » PTP_CNT_INIT(ptp, PTP_OC_GetFilesystemManifest, storage, objectformatcod e, associationOH);
691 » ptp.Code=PTP_OC_GetFilesystemManifest; 1236 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, NULL);
692 » ptp.Param1=storage;
693 » ptp.Param2=objectformatcode;
694 » ptp.Param3=associationOH;
695 » ptp.Nparam=3;
696 » len=0;
697 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, &len);
698 » return ret;
699 } 1237 }
700 1238
701 /** 1239 /**
702 * ptp_getnumobjects: 1240 * ptp_getnumobjects:
703 * params: PTPParams* 1241 * params: PTPParams*
704 * storage - StorageID 1242 * storage - StorageID
705 * objectformatcode - ObjectFormatCode (optional) 1243 * objectformatcode - ObjectFormatCode (optional)
706 * associationOH - ObjectHandle of Association for 1244 * associationOH - ObjectHandle of Association for
707 * wich a list of children is desired 1245 * wich a list of children is desired
708 * (optional) 1246 * (optional)
709 * numobs - pointer to uint32_t that takes number of objects 1247 * numobs - pointer to uint32_t that takes number of objects
710 * 1248 *
711 * Fills numobs with number of objects on device. 1249 * Fills numobs with number of objects on device.
712 * 1250 *
713 * Return values: Some PTP_RC_* code. 1251 * Return values: Some PTP_RC_* code.
714 **/ 1252 **/
715 uint16_t 1253 uint16_t
716 ptp_getnumobjects (PTPParams* params, uint32_t storage, 1254 ptp_getnumobjects (PTPParams* params, uint32_t storage,
717 uint32_t objectformatcode, uint32_t associationOH, 1255 uint32_t objectformatcode, uint32_t associationOH,
718 uint32_t* numobs) 1256 uint32_t* numobs)
719 { 1257 {
720 » uint16_t ret; 1258 » PTPContainer» ptp;
721 » PTPContainer ptp;
722 1259
723 » PTP_CNT_INIT(ptp); 1260 » PTP_CNT_INIT(ptp, PTP_OC_GetNumObjects, storage, objectformatcode, assoc iationOH);
724 » ptp.Code=PTP_OC_GetNumObjects; 1261 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
725 » ptp.Param1=storage; 1262 » if (ptp.Nparam >= 1)
726 » ptp.Param2=objectformatcode; 1263 » » *numobs = ptp.Param1;
727 » ptp.Param3=associationOH; 1264 » else
728 » ptp.Nparam=3; 1265 » » return PTP_RC_GeneralError;
729 » ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL); 1266 » return PTP_RC_OK;
730 » if (ret == PTP_RC_OK) {
731 » » if (ptp.Nparam >= 1)
732 » » » *numobs = ptp.Param1;
733 » » else
734 » » » ret = PTP_RC_GeneralError;
735 » }
736 » return ret;
737 } 1267 }
738 1268
739 /** 1269 /**
740 * ptp_eos_bulbstart: 1270 * ptp_eos_bulbstart:
741 * params: PTPParams* 1271 * params: PTPParams*
742 * 1272 *
743 * Starts EOS Bulb capture. 1273 * Starts EOS Bulb capture.
744 * 1274 *
745 * Return values: Some PTP_RC_* code. 1275 * Return values: Some PTP_RC_* code.
746 **/ 1276 **/
747 uint16_t 1277 uint16_t
748 ptp_canon_eos_bulbstart (PTPParams* params) 1278 ptp_canon_eos_bulbstart (PTPParams* params)
749 { 1279 {
750 » uint16_t ret; 1280 » PTPContainer» ptp;
751 » PTPContainer ptp;
752 1281
753 » PTP_CNT_INIT(ptp); 1282 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_BulbStart);
754 » ptp.Code = PTP_OC_CANON_EOS_BulbStart; 1283 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
755 » ptp.Nparam = 0; 1284 » if ((ptp.Nparam >= 1) && ((ptp.Param1 & 0x7000) == 0x2000))
756 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL); 1285 » » return ptp.Param1;
757 » if ((ret == PTP_RC_OK) && (ptp.Nparam >= 1) && ((ptp.Param1 & 0x7000) == 0x2000)) 1286 » return PTP_RC_OK;
758 » » ret = ptp.Param1;
759 » return ret;
760 } 1287 }
761 1288
762 /** 1289 /**
763 * ptp_eos_capture: 1290 * ptp_eos_capture:
764 * params: PTPParams* 1291 * params: PTPParams*
765 * uint32_t* result 1292 * uint32_t* result
766 * 1293 *
767 * This starts a EOS400D style capture. You have to use the 1294 * This starts a EOS400D style capture. You have to use the
768 * get_eos_events to find out what resulted. 1295 * get_eos_events to find out what resulted.
769 * The return value is "0" for all OK, and "1" for capture failed. (not fully co nfirmed) 1296 * The return value is "0" for all OK, and "1" for capture failed. (not fully co nfirmed)
770 * 1297 *
771 * Return values: Some PTP_RC_* code. 1298 * Return values: Some PTP_RC_* code.
772 **/ 1299 **/
773 uint16_t 1300 uint16_t
774 ptp_canon_eos_capture (PTPParams* params, uint32_t *result) 1301 ptp_canon_eos_capture (PTPParams* params, uint32_t *result)
775 { 1302 {
776 » uint16_t ret; 1303 » PTPContainer» ptp;
777 » PTPContainer ptp;
778 1304
779 » PTP_CNT_INIT(ptp); 1305 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_RemoteRelease);
780 » ptp.Code = PTP_OC_CANON_EOS_RemoteRelease;
781 » ptp.Nparam = 0;
782 *result = 0; 1306 *result = 0;
783 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL); 1307 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
784 » if ((ret == PTP_RC_OK) && (ptp.Nparam >= 1)) 1308 » if (ptp.Nparam >= 1)
785 *result = ptp.Param1; 1309 *result = ptp.Param1;
786 » return ret; 1310 » return PTP_RC_OK;
787 } 1311 }
788 1312
789 /** 1313 /**
790 * ptp_canon_eos_bulbend: 1314 * ptp_canon_eos_bulbend:
791 * params: PTPParams* 1315 * params: PTPParams*
792 * 1316 *
793 * Starts EOS Bulb capture. 1317 * Starts EOS Bulb capture.
794 * 1318 *
795 * Return values: Some PTP_RC_* code. 1319 * Return values: Some PTP_RC_* code.
796 **/ 1320 **/
797 uint16_t 1321 uint16_t
798 ptp_canon_eos_bulbend (PTPParams* params) 1322 ptp_canon_eos_bulbend (PTPParams* params)
799 { 1323 {
800 » uint16_t ret; 1324 » PTPContainer» ptp;
801 » PTPContainer ptp;
802 1325
803 » PTP_CNT_INIT(ptp); 1326 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_BulbEnd);
804 » ptp.Code = PTP_OC_CANON_EOS_BulbEnd; 1327 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
805 » ptp.Nparam = 0; 1328 » if ((ptp.Nparam >= 1) && ((ptp.Param1 & 0x7000) == 0x2000))
806 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL); 1329 » » return ptp.Param1;
807 » if ((ret == PTP_RC_OK) && (ptp.Nparam >= 1) && ((ptp.Param1 & 0x7000) == 0x2000)) 1330 » return PTP_RC_OK;
808 » » ret = ptp.Param1;
809 » return ret;
810 } 1331 }
811 1332
812 /** 1333 /**
813 * ptp_getobjectinfo: 1334 * ptp_getobjectinfo:
814 * params: PTPParams* 1335 * params: PTPParams*
815 * handle - Object handle 1336 * handle - Object handle
816 * objectinfo - pointer to objectinfo that is returned 1337 * objectinfo - pointer to objectinfo that is returned
817 * 1338 *
818 * Get objectinfo structure for handle from device. 1339 * Get objectinfo structure for handle from device.
819 * 1340 *
820 * Return values: Some PTP_RC_* code. 1341 * Return values: Some PTP_RC_* code.
821 **/ 1342 **/
822 uint16_t 1343 uint16_t
823 ptp_getobjectinfo (PTPParams* params, uint32_t handle, 1344 ptp_getobjectinfo (PTPParams* params, uint32_t handle,
824 PTPObjectInfo* objectinfo) 1345 PTPObjectInfo* objectinfo)
825 { 1346 {
826 » uint16_t ret; 1347 » PTPContainer» ptp;
827 » PTPContainer ptp; 1348 » unsigned char» *data;
828 » unsigned char* oi=NULL; 1349 » unsigned int» size;
829 » unsigned int len;
830 1350
831 » PTP_CNT_INIT(ptp); 1351 » PTP_CNT_INIT(ptp, PTP_OC_GetObjectInfo, handle);
832 » ptp.Code=PTP_OC_GetObjectInfo; 1352 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
833 » ptp.Param1=handle; 1353 » ptp_unpack_OI(params, data, objectinfo, size);
834 » ptp.Nparam=1; 1354 » free(data);
835 » len=0; 1355 » return PTP_RC_OK;
836 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &oi, &len);
837 » if (ret == PTP_RC_OK) ptp_unpack_OI(params, oi, objectinfo, len);
838 » free(oi);
839 » return ret;
840 } 1356 }
841 1357
842 /** 1358 /**
843 * ptp_getobject: 1359 * ptp_getobject:
844 * params: PTPParams* 1360 * params: PTPParams*
845 * handle - Object handle 1361 * handle - Object handle
846 * object - pointer to data area 1362 * object - pointer to data area
847 * 1363 *
848 * Get object 'handle' from device and store the data in newly 1364 * Get object 'handle' from device and store the data in newly
849 * allocated 'object'. 1365 * allocated 'object'.
850 * 1366 *
851 * Return values: Some PTP_RC_* code. 1367 * Return values: Some PTP_RC_* code.
852 **/ 1368 **/
853 uint16_t 1369 uint16_t
854 ptp_getobject (PTPParams* params, uint32_t handle, unsigned char** object) 1370 ptp_getobject (PTPParams* params, uint32_t handle, unsigned char** object)
855 { 1371 {
856 PTPContainer ptp; 1372 PTPContainer ptp;
857 unsigned int len;
858 1373
859 » PTP_CNT_INIT(ptp); 1374 » PTP_CNT_INIT(ptp, PTP_OC_GetObject, handle);
860 » ptp.Code=PTP_OC_GetObject; 1375 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, NULL);
861 » ptp.Param1=handle;
862 » ptp.Nparam=1;
863 » len=0;
864 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, &len);
865 } 1376 }
866 1377
867 /** 1378 /**
868 * ptp_getobject_to_handler: 1379 * ptp_getobject_to_handler:
869 * params: PTPParams* 1380 * params: PTPParams*
870 * handle - Object handle 1381 * handle - Object handle
871 * PTPDataHandler* - pointer datahandler 1382 * PTPDataHandler* - pointer datahandler
872 * 1383 *
873 * Get object 'handle' from device and store the data in newly 1384 * Get object 'handle' from device and store the data in newly
874 * allocated 'object'. 1385 * allocated 'object'.
875 * 1386 *
876 * Return values: Some PTP_RC_* code. 1387 * Return values: Some PTP_RC_* code.
877 **/ 1388 **/
878 uint16_t 1389 uint16_t
879 ptp_getobject_to_handler (PTPParams* params, uint32_t handle, PTPDataHandler *ha ndler) 1390 ptp_getobject_to_handler (PTPParams* params, uint32_t handle, PTPDataHandler *ha ndler)
880 { 1391 {
881 PTPContainer ptp; 1392 PTPContainer ptp;
882 1393
883 » PTP_CNT_INIT(ptp); 1394 » PTP_CNT_INIT(ptp, PTP_OC_GetObject, handle);
884 » ptp.Code=PTP_OC_GetObject;
885 » ptp.Param1=handle;
886 » ptp.Nparam=1;
887 return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler); 1395 return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler);
888 } 1396 }
889 1397
890 /** 1398 /**
891 * ptp_getobject_tofd: 1399 * ptp_getobject_tofd:
892 * params: PTPParams* 1400 * params: PTPParams*
893 * handle - Object handle 1401 * handle - Object handle
894 * fd - File descriptor to write() to 1402 * fd - File descriptor to write() to
895 * 1403 *
896 * Get object 'handle' from device and write the data to the 1404 * Get object 'handle' from device and write the data to the
897 * given file descriptor. 1405 * given file descriptor.
898 * 1406 *
899 * Return values: Some PTP_RC_* code. 1407 * Return values: Some PTP_RC_* code.
900 **/ 1408 **/
901 uint16_t 1409 uint16_t
902 ptp_getobject_tofd (PTPParams* params, uint32_t handle, int fd) 1410 ptp_getobject_tofd (PTPParams* params, uint32_t handle, int fd)
903 { 1411 {
904 PTPContainer ptp; 1412 PTPContainer ptp;
905 PTPDataHandler handler; 1413 PTPDataHandler handler;
906 uint16_t ret; 1414 uint16_t ret;
907 1415
1416 PTP_CNT_INIT(ptp, PTP_OC_GetObject, handle);
908 ptp_init_fd_handler (&handler, fd); 1417 ptp_init_fd_handler (&handler, fd);
909 PTP_CNT_INIT(ptp);
910 ptp.Code=PTP_OC_GetObject;
911 ptp.Param1=handle;
912 ptp.Nparam=1;
913 ret = ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler); 1418 ret = ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler);
914 ptp_exit_fd_handler (&handler); 1419 ptp_exit_fd_handler (&handler);
915 return ret; 1420 return ret;
916 } 1421 }
917 1422
918 /** 1423 /**
919 * ptp_getpartialobject: 1424 * ptp_getpartialobject:
920 * params: PTPParams* 1425 * params: PTPParams*
921 * handle - Object handle 1426 * handle - Object handle
922 * offset - Offset into object 1427 * offset - Offset into object
923 * maxbytes - Maximum of bytes to read 1428 * maxbytes - Maximum of bytes to read
924 * object - pointer to data area 1429 * object - pointer to data area
925 * len - pointer to returned length 1430 * len - pointer to returned length
926 * 1431 *
927 * Get object 'handle' from device and store the data in newly 1432 * Get object 'handle' from device and store the data in newly
928 * allocated 'object'. Start from offset and read at most maxbytes. 1433 * allocated 'object'. Start from offset and read at most maxbytes.
929 * 1434 *
930 * Return values: Some PTP_RC_* code. 1435 * Return values: Some PTP_RC_* code.
931 **/ 1436 **/
932 uint16_t 1437 uint16_t
933 ptp_getpartialobject (PTPParams* params, uint32_t handle, uint32_t offset, 1438 ptp_getpartialobject (PTPParams* params, uint32_t handle, uint32_t offset,
934 uint32_t maxbytes, unsigned char** object, 1439 uint32_t maxbytes, unsigned char** object,
935 uint32_t *len) 1440 uint32_t *len)
936 { 1441 {
937 PTPContainer ptp; 1442 PTPContainer ptp;
938 1443
939 » PTP_CNT_INIT(ptp); 1444 » PTP_CNT_INIT(ptp, PTP_OC_GetPartialObject, handle, offset, maxbytes);
940 » ptp.Code=PTP_OC_GetPartialObject;
941 » ptp.Param1=handle;
942 » ptp.Param2=offset;
943 » ptp.Param3=maxbytes;
944 » ptp.Nparam=3;
945 » *len=0;
946 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, len); 1445 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, len);
947 } 1446 }
948 1447
949 /** 1448 /**
1449 * ptp_getpartialobject_to_handler:
1450 * params: PTPParams*
1451 * handle - Object handle
1452 * offset - Offset into object
1453 * maxbytes - Maximum of bytes to read
1454 * handler - a ptp data handler
1455 *
1456 * Get object 'handle' from device and send the data to the
1457 * data handler. Start from offset and read at most maxbytes.
1458 *
1459 * Return values: Some PTP_RC_* code.
1460 **/
1461 uint16_t
1462 ptp_getpartialobject_to_handler (PTPParams* params, uint32_t handle, uint32_t of fset,
1463 uint32_t maxbytes, PTPDataHandler *handler)
1464 {
1465 PTPContainer ptp;
1466
1467 PTP_CNT_INIT(ptp, PTP_OC_GetPartialObject, handle, offset, maxbytes);
1468 return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler);
1469 }
1470
1471 /**
950 * ptp_getthumb: 1472 * ptp_getthumb:
951 * params: PTPParams* 1473 * params: PTPParams*
952 * handle - Object handle 1474 * handle - Object handle
953 * object - pointer to data area 1475 * object - pointer to data area
954 * 1476 *
955 * Get thumb for object 'handle' from device and store the data in newly 1477 * Get thumb for object 'handle' from device and store the data in newly
956 * allocated 'object'. 1478 * allocated 'object'.
957 * 1479 *
958 * Return values: Some PTP_RC_* code. 1480 * Return values: Some PTP_RC_* code.
959 **/ 1481 **/
960 uint16_t 1482 uint16_t
961 ptp_getthumb (PTPParams* params, uint32_t handle, unsigned char** object, unsign ed int *len) 1483 ptp_getthumb (PTPParams* params, uint32_t handle, unsigned char** object, unsign ed int *len)
962 { 1484 {
963 PTPContainer ptp; 1485 PTPContainer ptp;
964 1486
965 » PTP_CNT_INIT(ptp); 1487 » PTP_CNT_INIT(ptp, PTP_OC_GetThumb, handle);
966 » ptp.Code=PTP_OC_GetThumb;
967 » ptp.Param1=handle;
968 » ptp.Nparam=1;
969 » *len = 0;
970 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, len); 1488 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, len);
971 } 1489 }
972 1490
973 /** 1491 /**
974 * ptp_deleteobject: 1492 * ptp_deleteobject:
975 * params: PTPParams* 1493 * params: PTPParams*
976 * handle - object handle 1494 * handle - object handle
977 * ofc - object format code (optional) 1495 * ofc - object format code (optional)
978 * 1496 *
979 * Deletes desired objects. 1497 * Deletes desired objects.
980 * 1498 *
981 * Return values: Some PTP_RC_* code. 1499 * Return values: Some PTP_RC_* code.
982 **/ 1500 **/
983 uint16_t 1501 uint16_t
984 ptp_deleteobject (PTPParams* params, uint32_t handle, uint32_t ofc) 1502 ptp_deleteobject (PTPParams* params, uint32_t handle, uint32_t ofc)
985 { 1503 {
986 PTPContainer ptp; 1504 PTPContainer ptp;
987 uint16_t ret;
988 1505
989 » PTP_CNT_INIT(ptp); 1506 » PTP_CNT_INIT(ptp, PTP_OC_DeleteObject, handle, ofc);
990 » ptp.Code=PTP_OC_DeleteObject; 1507 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
991 » ptp.Param1=handle;
992 » ptp.Param2=ofc;
993 » ptp.Nparam=2;
994 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
995 » if (ret != PTP_RC_OK) {
996 » » return ret;
997 » }
998 /* If the object is cached and could be removed, cleanse cache. */ 1508 /* If the object is cached and could be removed, cleanse cache. */
999 ptp_remove_object_from_cache(params, handle); 1509 ptp_remove_object_from_cache(params, handle);
1000 return PTP_RC_OK; 1510 return PTP_RC_OK;
1001 } 1511 }
1002 1512
1003 /** 1513 /**
1004 * ptp_sendobjectinfo: 1514 * ptp_sendobjectinfo:
1005 * params: PTPParams* 1515 * params: PTPParams*
1006 * uint32_t* store - destination StorageID on Responder 1516 * uint32_t* store - destination StorageID on Responder
1007 * uint32_t* parenthandle - Parent ObjectHandle on responder 1517 * uint32_t* parenthandle - Parent ObjectHandle on responder
1008 * uint32_t* handle - see Return values 1518 * uint32_t* handle - see Return values
1009 * PTPObjectInfo* objectinfo- ObjectInfo that is to be sent 1519 * PTPObjectInfo* objectinfo- ObjectInfo that is to be sent
1010 * 1520 *
1011 * Sends ObjectInfo of file that is to be sent via SendFileObject. 1521 * Sends ObjectInfo of file that is to be sent via SendFileObject.
1012 * 1522 *
1013 * Return values: Some PTP_RC_* code. 1523 * Return values: Some PTP_RC_* code.
1014 * Upon success : uint32_t* store - Responder StorageID in which 1524 * Upon success : uint32_t* store - Responder StorageID in which
1015 * object will be stored 1525 * object will be stored
1016 * uint32_t* parenthandle- Responder Parent ObjectHandle 1526 * uint32_t* parenthandle- Responder Parent ObjectHandle
1017 * in which the object will be stored 1527 * in which the object will be stored
1018 * uint32_t* handle - Responder's reserved ObjectHandle 1528 * uint32_t* handle - Responder's reserved ObjectHandle
1019 * for the incoming object 1529 * for the incoming object
1020 **/ 1530 **/
1021 uint16_t 1531 uint16_t
1022 ptp_sendobjectinfo (PTPParams* params, uint32_t* store, 1532 ptp_sendobjectinfo (PTPParams* params, uint32_t* store,
1023 uint32_t* parenthandle, uint32_t* handle, 1533 uint32_t* parenthandle, uint32_t* handle,
1024 PTPObjectInfo* objectinfo) 1534 PTPObjectInfo* objectinfo)
1025 { 1535 {
1026 » uint16_t ret; 1536 » PTPContainer» ptp;
1027 » PTPContainer ptp; 1537 » uint16_t» ret;
1028 » unsigned char* oidata=NULL; 1538 » unsigned char» *data = NULL;
1029 » uint32_t size; 1539 » uint32_t» size;
1030 1540
1031 » PTP_CNT_INIT(ptp); 1541 » PTP_CNT_INIT(ptp, PTP_OC_SendObjectInfo, *store, *parenthandle);
1032 » ptp.Code=PTP_OC_SendObjectInfo; 1542 » size = ptp_pack_OI(params, objectinfo, &data);
1033 » ptp.Param1=*store; 1543 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
1034 » ptp.Param2=*parenthandle; 1544 » free(data);
1035 » ptp.Nparam=2;
1036 »
1037 » size=ptp_pack_OI(params, objectinfo, &oidata);
1038 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &oidata, NULL );
1039 » free(oidata);
1040 *store=ptp.Param1; 1545 *store=ptp.Param1;
1041 *parenthandle=ptp.Param2; 1546 *parenthandle=ptp.Param2;
1042 *handle=ptp.Param3; 1547 *handle=ptp.Param3;
1043 return ret; 1548 return ret;
1044 } 1549 }
1045 1550
1046 /** 1551 /**
1047 * ptp_sendobject: 1552 * ptp_sendobject:
1048 * params: PTPParams* 1553 * params: PTPParams*
1049 * char* object - contains the object that is to be sent 1554 * char* object - contains the object that is to be sent
1050 *» » uint32_t size» » - object size 1555 *» » uint64_t size» » - object size
1051 * 1556 *
1052 * Sends object to Responder. 1557 * Sends object to Responder.
1053 * 1558 *
1054 * Return values: Some PTP_RC_* code. 1559 * Return values: Some PTP_RC_* code.
1055 * 1560 *
1056 */ 1561 */
1057 uint16_t 1562 uint16_t
1058 ptp_sendobject (PTPParams* params, unsigned char* object, uint32_t size) 1563 ptp_sendobject (PTPParams* params, unsigned char* object, uint64_t size)
1059 { 1564 {
1060 PTPContainer ptp; 1565 PTPContainer ptp;
1061 1566
1062 » PTP_CNT_INIT(ptp); 1567 » PTP_CNT_INIT(ptp, PTP_OC_SendObject);
1063 » ptp.Code=PTP_OC_SendObject;
1064 » ptp.Nparam=0;
1065
1066 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NUL L); 1568 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NUL L);
1067 } 1569 }
1068 1570
1069 /** 1571 /**
1070 * ptp_sendobject_from_handler: 1572 * ptp_sendobject_from_handler:
1071 * params: PTPParams* 1573 * params: PTPParams*
1072 * PTPDataHandler* - File descriptor to read() object from 1574 * PTPDataHandler* - File descriptor to read() object from
1073 * uint32_t size - File/object size 1575 * uint64_t size - File/object size
1074 * 1576 *
1075 * Sends object from file descriptor by consecutive reads from this 1577 * Sends object from file descriptor by consecutive reads from this
1076 * descriptor. 1578 * descriptor.
1077 * 1579 *
1078 * Return values: Some PTP_RC_* code. 1580 * Return values: Some PTP_RC_* code.
1079 **/ 1581 **/
1080 uint16_t 1582 uint16_t
1081 ptp_sendobject_from_handler (PTPParams* params, PTPDataHandler *handler, uint32_ t size) 1583 ptp_sendobject_from_handler (PTPParams* params, PTPDataHandler *handler, uint64_ t size)
1082 { 1584 {
1083 » PTPContainer» ptp; 1585 » PTPContainer ptp;
1084 1586
1085 » PTP_CNT_INIT(ptp); 1587 » PTP_CNT_INIT(ptp, PTP_OC_SendObject);
1086 » ptp.Code=PTP_OC_SendObject;
1087 » ptp.Nparam=0;
1088 return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler) ; 1588 return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler) ;
1089 } 1589 }
1090 1590
1091 1591
1092 /** 1592 /**
1093 * ptp_sendobject_fromfd: 1593 * ptp_sendobject_fromfd:
1094 * params: PTPParams* 1594 * params: PTPParams*
1095 * fd - File descriptor to read() object from 1595 * fd - File descriptor to read() object from
1096 * uint32_t size - File/object size 1596 * uint64_t size - File/object size
1097 * 1597 *
1098 * Sends object from file descriptor by consecutive reads from this 1598 * Sends object from file descriptor by consecutive reads from this
1099 * descriptor. 1599 * descriptor.
1100 * 1600 *
1101 * Return values: Some PTP_RC_* code. 1601 * Return values: Some PTP_RC_* code.
1102 **/ 1602 **/
1103 uint16_t 1603 uint16_t
1104 ptp_sendobject_fromfd (PTPParams* params, int fd, uint32_t size) 1604 ptp_sendobject_fromfd (PTPParams* params, int fd, uint64_t size)
1105 { 1605 {
1106 PTPContainer ptp; 1606 PTPContainer ptp;
1107 PTPDataHandler handler; 1607 PTPDataHandler handler;
1108 uint16_t ret; 1608 uint16_t ret;
1109 1609
1610 PTP_CNT_INIT(ptp, PTP_OC_SendObject);
1110 ptp_init_fd_handler (&handler, fd); 1611 ptp_init_fd_handler (&handler, fd);
1111 PTP_CNT_INIT(ptp);
1112 ptp.Code=PTP_OC_SendObject;
1113 ptp.Nparam=0;
1114 ret = ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, &handler) ; 1612 ret = ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, &handler) ;
1115 ptp_exit_fd_handler (&handler); 1613 ptp_exit_fd_handler (&handler);
1116 return ret; 1614 return ret;
1117 } 1615 }
1118 1616
1617 #define PROPCACHE_TIMEOUT 5 /* seconds */
1119 1618
1120 uint16_t 1619 uint16_t
1121 ptp_getdevicepropdesc (PTPParams* params, uint16_t propcode, 1620 ptp_getdevicepropdesc (PTPParams* params, uint16_t propcode,
1122 PTPDevicePropDesc* devicepropertydesc) 1621 PTPDevicePropDesc* devicepropertydesc)
1123 { 1622 {
1124 » PTPContainer ptp; 1623 » PTPContainer» ptp;
1125 » uint16_t ret; 1624 » uint16_t» ret = PTP_RC_OK;
1126 » unsigned int len; 1625 » unsigned char» *data;
1127 » unsigned char* dpd=NULL; 1626 » unsigned int» size;
1128 1627
1129 » PTP_CNT_INIT(ptp); 1628 » PTP_CNT_INIT(ptp, PTP_OC_GetDevicePropDesc, propcode);
1130 » ptp.Code=PTP_OC_GetDevicePropDesc; 1629 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1131 » ptp.Param1=propcode; 1630
1132 » ptp.Nparam=1; 1631 » if (params->device_flags & DEVICE_FLAG_OLYMPUS_XML_WRAPPED) {
1133 » len=0; 1632 #ifdef HAVE_LIBXML2
1134 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpd, &len); 1633 » » xmlNodePtr» code;
1135 » if (ret == PTP_RC_OK) ptp_unpack_DPD(params, dpd, devicepropertydesc, le n); 1634
1136 » free(dpd); 1635 » » ret = ptp_olympus_parse_output_xml (params,(char*)data,size,&cod e);
1636 » » if (ret == PTP_RC_OK) {
1637 » » » int x;
1638
1639 » » » if (» (xmlChildElementCount(code) == 1) &&
1640 » » » » » (!strcmp((char*)code->name,"c1014"))
1641 » » » » » ) {
1642 » » » » code = xmlFirstElementChild (code);
1643
1644 » » » » if (» (sscanf((char*)code->name,"p%x", &x)) &&
1645 » » » » » » (x == propcode)
1646 » » » » » » ) {
1647 » » » » » ret = parse_9301_propdesc (params, xmlFi rstElementChild (code), devicepropertydesc);
1648 » » » » » xmlFreeDoc(code->doc);
1649 » » » » }
1650 » » » }
1651 » » } else {
1652 » » » ptp_debug(params,"failed to parse output xml, ret %x?", ret);
1653 » » }
1654 #endif
1655 » } else {
1656 » » ptp_unpack_DPD(params, data, devicepropertydesc, size);
1657 » }
1658 » free(data);
1137 return ret; 1659 return ret;
1138 } 1660 }
1139 1661
1140 1662
1141 uint16_t 1663 uint16_t
1142 ptp_getdevicepropvalue (PTPParams* params, uint16_t propcode, 1664 ptp_getdevicepropvalue (PTPParams* params, uint16_t propcode,
1143 PTPPropertyValue* value, uint16_t datatype) 1665 PTPPropertyValue* value, uint16_t datatype)
1144 { 1666 {
1145 » PTPContainer ptp; 1667 » PTPContainer» ptp;
1146 » uint16_t ret; 1668 » unsigned char» *data;
1147 » unsigned int len; 1669 » unsigned int» size, offset = 0;
1148 » int offset; 1670 » uint16_t» ret;
1149 » unsigned char* dpv=NULL;
1150 1671
1151 1672 » PTP_CNT_INIT(ptp, PTP_OC_GetDevicePropValue, propcode);
1152 » PTP_CNT_INIT(ptp); 1673 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1153 » ptp.Code=PTP_OC_GetDevicePropValue; 1674 » ret = ptp_unpack_DPV(params, data, &offset, size, value, datatype) ? PTP _RC_OK : PTP_RC_GeneralError;
1154 » ptp.Param1=propcode; 1675 » if (ret != PTP_RC_OK)
1155 » ptp.Nparam=1; 1676 » » ptp_debug (params, "ptp_getdevicepropvalue: unpacking DPV failed ");
1156 » len=offset=0; 1677 » free(data);
1157 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpv, &len);
1158 » if (ret == PTP_RC_OK) ptp_unpack_DPV(params, dpv, &offset, len, value, d atatype);
1159 » free(dpv);
1160 return ret; 1678 return ret;
1161 } 1679 }
1162 1680
1163 uint16_t 1681 uint16_t
1164 ptp_setdevicepropvalue (PTPParams* params, uint16_t propcode, 1682 ptp_setdevicepropvalue (PTPParams* params, uint16_t propcode,
1165 PTPPropertyValue *value, uint16_t datatype) 1683 PTPPropertyValue *value, uint16_t datatype)
1166 { 1684 {
1167 » PTPContainer ptp; 1685 » PTPContainer» ptp;
1168 » uint16_t ret; 1686 » uint16_t» ret;
1169 » uint32_t size; 1687 » unsigned char» *data = NULL;
1170 » unsigned char* dpv=NULL; 1688 » uint32_t» size;
1171 1689
1172 » PTP_CNT_INIT(ptp); 1690 » PTP_CNT_INIT(ptp, PTP_OC_SetDevicePropValue, propcode);
1173 » ptp.Code=PTP_OC_SetDevicePropValue; 1691 » size=ptp_pack_DPV(params, value, &data, datatype);
1174 » ptp.Param1=propcode; 1692 » ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
1175 » ptp.Nparam=1; 1693 » free(data);
1176 » size=ptp_pack_DPV(params, value, &dpv, datatype);
1177 » ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &dpv, NULL);
1178 » free(dpv);
1179 return ret; 1694 return ret;
1180 } 1695 }
1181 1696
1182 /** 1697 /**
1183 * ptp_ek_sendfileobjectinfo: 1698 * ptp_ek_sendfileobjectinfo:
1184 * params: PTPParams* 1699 * params: PTPParams*
1185 * uint32_t* store - destination StorageID on Responder 1700 * uint32_t* store - destination StorageID on Responder
1186 * uint32_t* parenthandle - Parent ObjectHandle on responder 1701 * uint32_t* parenthandle - Parent ObjectHandle on responder
1187 * uint32_t* handle - see Return values 1702 * uint32_t* handle - see Return values
1188 * PTPObjectInfo* objectinfo- ObjectInfo that is to be sent 1703 * PTPObjectInfo* objectinfo- ObjectInfo that is to be sent
1189 * 1704 *
1190 * Sends ObjectInfo of file that is to be sent via SendFileObject. 1705 * Sends ObjectInfo of file that is to be sent via SendFileObject.
1191 * 1706 *
1192 * Return values: Some PTP_RC_* code. 1707 * Return values: Some PTP_RC_* code.
1193 * Upon success : uint32_t* store - Responder StorageID in which 1708 * Upon success : uint32_t* store - Responder StorageID in which
1194 * object will be stored 1709 * object will be stored
1195 * uint32_t* parenthandle- Responder Parent ObjectHandle 1710 * uint32_t* parenthandle- Responder Parent ObjectHandle
1196 * in which the object will be stored 1711 * in which the object will be stored
1197 * uint32_t* handle - Responder's reserved ObjectHandle 1712 * uint32_t* handle - Responder's reserved ObjectHandle
1198 * for the incoming object 1713 * for the incoming object
1199 **/ 1714 **/
1200 uint16_t 1715 uint16_t
1201 ptp_ek_sendfileobjectinfo (PTPParams* params, uint32_t* store, 1716 ptp_ek_sendfileobjectinfo (PTPParams* params, uint32_t* store,
1202 uint32_t* parenthandle, uint32_t* handle, 1717 uint32_t* parenthandle, uint32_t* handle,
1203 PTPObjectInfo* objectinfo) 1718 PTPObjectInfo* objectinfo)
1204 { 1719 {
1205 » uint16_t ret; 1720 » PTPContainer» ptp;
1206 » PTPContainer ptp; 1721 » uint16_t» ret;
1207 » unsigned char* oidata=NULL; 1722 » unsigned char» *data = NULL;
1208 » uint32_t size; 1723 » uint32_t» size;
1209 1724
1210 » PTP_CNT_INIT(ptp); 1725 » PTP_CNT_INIT(ptp, PTP_OC_EK_SendFileObjectInfo, *store, *parenthandle);
1211 » ptp.Code=PTP_OC_EK_SendFileObjectInfo; 1726 » size=ptp_pack_OI(params, objectinfo, &data);
1212 » ptp.Param1=*store; 1727 » ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
1213 » ptp.Param2=*parenthandle; 1728 » free(data);
1214 » ptp.Nparam=2;
1215 »
1216 » size=ptp_pack_OI(params, objectinfo, &oidata);
1217 » ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &oidata, NULL);
1218 » free(oidata);
1219 *store=ptp.Param1; 1729 *store=ptp.Param1;
1220 *parenthandle=ptp.Param2; 1730 *parenthandle=ptp.Param2;
1221 *handle=ptp.Param3; 1731 *handle=ptp.Param3;
1222 return ret; 1732 return ret;
1223 } 1733 }
1224 1734
1225 /** 1735 /**
1226 * ptp_ek_getserial: 1736 * ptp_ek_getserial:
1227 * params: PTPParams* 1737 * params: PTPParams*
1228 * char** serial - contains the serial number of the came ra 1738 * char** serial - contains the serial number of the came ra
1229 * uint32_t* size - contains the string length 1739 * uint32_t* size - contains the string length
1230 * 1740 *
1231 * Gets the serial number from the device. (ptp serial) 1741 * Gets the serial number from the device. (ptp serial)
1232 * 1742 *
1233 * Return values: Some PTP_RC_* code. 1743 * Return values: Some PTP_RC_* code.
1234 * 1744 *
1235 */ 1745 */
1236 uint16_t 1746 uint16_t
1237 ptp_ek_getserial (PTPParams* params, unsigned char **data, unsigned int *size) 1747 ptp_ek_getserial (PTPParams* params, unsigned char **data, unsigned int *size)
1238 { 1748 {
1239 PTPContainer ptp; 1749 PTPContainer ptp;
1240 1750
1241 » PTP_CNT_INIT(ptp); 1751 » PTP_CNT_INIT(ptp, PTP_OC_EK_GetSerial);
1242 » ptp.Code = PTP_OC_EK_GetSerial;
1243 » ptp.Nparam = 0;
1244 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 1752 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1245 } 1753 }
1246 1754
1247 /** 1755 /**
1248 * ptp_ek_setserial: 1756 * ptp_ek_setserial:
1249 * params: PTPParams* 1757 * params: PTPParams*
1250 * char* serial - contains the new serial number 1758 * char* serial - contains the new serial number
1251 * uint32_t size - string length 1759 * uint32_t size - string length
1252 * 1760 *
1253 * Sets the serial number of the device. (ptp serial) 1761 * Sets the serial number of the device. (ptp serial)
1254 * 1762 *
1255 * Return values: Some PTP_RC_* code. 1763 * Return values: Some PTP_RC_* code.
1256 * 1764 *
1257 */ 1765 */
1258 uint16_t 1766 uint16_t
1259 ptp_ek_setserial (PTPParams* params, unsigned char *data, unsigned int size) 1767 ptp_ek_setserial (PTPParams* params, unsigned char *data, unsigned int size)
1260 { 1768 {
1261 PTPContainer ptp; 1769 PTPContainer ptp;
1262 1770
1263 » PTP_CNT_INIT(ptp); 1771 » PTP_CNT_INIT(ptp, PTP_OC_EK_SetSerial);
1264 » ptp.Code = PTP_OC_EK_SetSerial;
1265 » ptp.Nparam = 0;
1266 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ; 1772 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ;
1267 } 1773 }
1268 1774
1269 /* unclear what it does yet */ 1775 /* unclear what it does yet */
1270 uint16_t 1776 uint16_t
1271 ptp_ek_9007 (PTPParams* params, unsigned char **data, unsigned int *size) 1777 ptp_ek_9007 (PTPParams* params, unsigned char **data, unsigned int *size)
1272 { 1778 {
1273 PTPContainer ptp; 1779 PTPContainer ptp;
1274 1780
1275 » PTP_CNT_INIT(ptp); 1781 » PTP_CNT_INIT(ptp, 0x9007);
1276 » ptp.Code = 0x9007;
1277 » ptp.Nparam = 0;
1278 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 1782 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1279 } 1783 }
1280 1784
1281 /* unclear what it does yet */ 1785 /* unclear what it does yet */
1282 uint16_t 1786 uint16_t
1283 ptp_ek_9009 (PTPParams* params, uint32_t *p1, uint32_t *p2) 1787 ptp_ek_9009 (PTPParams* params, uint32_t *p1, uint32_t *p2)
1284 { 1788 {
1285 PTPContainer ptp; 1789 PTPContainer ptp;
1286 uint16_t ret;
1287 1790
1288 » PTP_CNT_INIT(ptp); 1791 » PTP_CNT_INIT(ptp, 0x9009);
1289 » ptp.Code = 0x9009; 1792 » *p1 = *p2 = 0;
1290 » ptp.Nparam = 0; 1793 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
1291 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
1292 *p1 = ptp.Param1; 1794 *p1 = ptp.Param1;
1293 *p2 = ptp.Param2; 1795 *p2 = ptp.Param2;
1294 » return ret; 1796 » return PTP_RC_OK;
1295 } 1797 }
1296 1798
1297 /* unclear yet, but I guess it returns the info from 9008 */ 1799 /* unclear yet, but I guess it returns the info from 9008 */
1298 uint16_t 1800 uint16_t
1299 ptp_ek_900c (PTPParams* params, unsigned char **data, unsigned int *size) 1801 ptp_ek_900c (PTPParams* params, unsigned char **data, unsigned int *size)
1300 { 1802 {
1301 PTPContainer ptp; 1803 PTPContainer ptp;
1302 1804
1303 » PTP_CNT_INIT(ptp); 1805 » PTP_CNT_INIT(ptp, 0x900c);
1304 » ptp.Code = 0x900c;
1305 » ptp.Nparam = 0;
1306 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 1806 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1307 /* returned data is 16bit,16bit,32bit,32bit */ 1807 /* returned data is 16bit,16bit,32bit,32bit */
1308 } 1808 }
1309 1809
1310 /** 1810 /**
1311 * ptp_ek_settext: 1811 * ptp_ek_settext:
1312 * params: PTPParams* 1812 * params: PTPParams*
1313 * PTPEKTextParams* - contains the texts to display. 1813 * PTPEKTextParams* - contains the texts to display.
1314 * 1814 *
1315 * Displays the specified texts on the TFT of the camera. 1815 * Displays the specified texts on the TFT of the camera.
1316 * 1816 *
1317 * Return values: Some PTP_RC_* code. 1817 * Return values: Some PTP_RC_* code.
1318 * 1818 *
1319 */ 1819 */
1320 uint16_t 1820 uint16_t
1321 ptp_ek_settext (PTPParams* params, PTPEKTextParams *text) 1821 ptp_ek_settext (PTPParams* params, PTPEKTextParams *text)
1322 { 1822 {
1323 » PTPContainer ptp; 1823 » PTPContainer» ptp;
1324 » uint16_t ret; 1824 » uint16_t» ret;
1325 » unsigned int size; 1825 » unsigned char» *data = 0;
1326 » unsigned char *data; 1826 » uint32_t» size;
1327 1827
1328 » PTP_CNT_INIT(ptp); 1828 » PTP_CNT_INIT(ptp, PTP_OC_EK_SetText);
1329 » ptp.Code = PTP_OC_EK_SetText;
1330 » ptp.Nparam = 0;
1331 if (0 == (size = ptp_pack_EK_text(params, text, &data))) 1829 if (0 == (size = ptp_pack_EK_text(params, text, &data)))
1332 return PTP_ERROR_BADPARAM; 1830 return PTP_ERROR_BADPARAM;
1333 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL); 1831 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
1334 free(data); 1832 free(data);
1335 return ret; 1833 return ret;
1336 } 1834 }
1337 1835
1338 /** 1836 /**
1339 * ptp_ek_sendfileobject: 1837 * ptp_ek_sendfileobject:
1340 * params: PTPParams* 1838 * params: PTPParams*
1341 * char* object - contains the object that is to be sent 1839 * char* object - contains the object that is to be sent
1342 * uint32_t size - object size 1840 * uint32_t size - object size
1343 * 1841 *
1344 * Sends object to Responder. 1842 * Sends object to Responder.
1345 * 1843 *
1346 * Return values: Some PTP_RC_* code. 1844 * Return values: Some PTP_RC_* code.
1347 * 1845 *
1348 */ 1846 */
1349 uint16_t 1847 uint16_t
1350 ptp_ek_sendfileobject (PTPParams* params, unsigned char* object, uint32_t size) 1848 ptp_ek_sendfileobject (PTPParams* params, unsigned char* object, uint32_t size)
1351 { 1849 {
1352 PTPContainer ptp; 1850 PTPContainer ptp;
1353 1851
1354 » PTP_CNT_INIT(ptp); 1852 » PTP_CNT_INIT(ptp, PTP_OC_EK_SendFileObject);
1355 » ptp.Code=PTP_OC_EK_SendFileObject;
1356 » ptp.Nparam=0;
1357
1358 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NUL L); 1853 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NUL L);
1359 } 1854 }
1360 1855
1361 /** 1856 /**
1362 * ptp_ek_sendfileobject_from_handler: 1857 * ptp_ek_sendfileobject_from_handler:
1363 * params: PTPParams* 1858 * params: PTPParams*
1364 * PTPDataHandler* handler - contains the handler of the object tha t is to be sent 1859 * PTPDataHandler* handler - contains the handler of the object tha t is to be sent
1365 * uint32_t size - object size 1860 * uint32_t size - object size
1366 * 1861 *
1367 * Sends object to Responder. 1862 * Sends object to Responder.
1368 * 1863 *
1369 * Return values: Some PTP_RC_* code. 1864 * Return values: Some PTP_RC_* code.
1370 * 1865 *
1371 */ 1866 */
1372 uint16_t 1867 uint16_t
1373 ptp_ek_sendfileobject_from_handler (PTPParams* params, PTPDataHandler*handler, u int32_t size) 1868 ptp_ek_sendfileobject_from_handler (PTPParams* params, PTPDataHandler*handler, u int32_t size)
1374 { 1869 {
1375 PTPContainer ptp; 1870 PTPContainer ptp;
1376 1871
1377 » PTP_CNT_INIT(ptp); 1872 » PTP_CNT_INIT(ptp, PTP_OC_EK_SendFileObject);
1378 » ptp.Code=PTP_OC_EK_SendFileObject;
1379 » ptp.Nparam=0;
1380 return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler) ; 1873 return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler) ;
1381 } 1874 }
1382 1875
1383 /************************************************************************* 1876 /*************************************************************************
1384 * 1877 *
1385 * Canon PTP extensions support 1878 * Canon PTP extensions support
1386 * 1879 *
1387 * (C) Nikolai Kopanygin 2003 1880 * (C) Nikolai Kopanygin 2003
1388 * 1881 *
1389 *************************************************************************/ 1882 *************************************************************************/
(...skipping 13 matching lines...) Expand all
1403 * Upon success : uint32_t* size - The object size 1896 * Upon success : uint32_t* size - The object size
1404 * uint32_t* rp2 - Still unknown return parameter 1897 * uint32_t* rp2 - Still unknown return parameter
1405 * (perhaps upper 32bit of size) 1898 * (perhaps upper 32bit of size)
1406 * 1899 *
1407 * 1900 *
1408 **/ 1901 **/
1409 uint16_t 1902 uint16_t
1410 ptp_canon_getpartialobjectinfo (PTPParams* params, uint32_t handle, uint32_t p2, 1903 ptp_canon_getpartialobjectinfo (PTPParams* params, uint32_t handle, uint32_t p2,
1411 uint32_t* size, uint32_t* rp2) 1904 uint32_t* size, uint32_t* rp2)
1412 { 1905 {
1413 » uint16_t ret; 1906 » PTPContainer» ptp;
1414 » PTPContainer ptp;
1415 1907
1416 » PTP_CNT_INIT(ptp); 1908 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetPartialObjectInfo, handle, p2);
1417 » ptp.Code=PTP_OC_CANON_GetPartialObjectInfo; 1909 » *size = *rp2 = 0;
1418 » ptp.Param1=handle; 1910 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
1419 » ptp.Param2=p2;
1420 » ptp.Nparam=2;
1421 » ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
1422 *size=ptp.Param1; 1911 *size=ptp.Param1;
1423 *rp2=ptp.Param2; 1912 *rp2=ptp.Param2;
1424 » return ret; 1913 » return PTP_RC_OK;
1425 } 1914 }
1426 1915
1427 /** 1916 /**
1428 * ptp_canon_get_mac_address: 1917 * ptp_canon_get_mac_address:
1429 * params: PTPParams* 1918 * params: PTPParams*
1430 * value 0 works. 1919 * value 0 works.
1431 * Gets the MAC address of the wireless transmitter. 1920 * Gets the MAC address of the wireless transmitter.
1432 * 1921 *
1433 * Return values: Some PTP_RC_* code. 1922 * Return values: Some PTP_RC_* code.
1434 * Upon success : unsigned char* mac - The MAC address 1923 * Upon success : unsigned char* mac - The MAC address
1435 * 1924 *
1436 **/ 1925 **/
1437 uint16_t 1926 uint16_t
1438 ptp_canon_get_mac_address (PTPParams* params, unsigned char **mac) 1927 ptp_canon_get_mac_address (PTPParams* params, unsigned char **mac)
1439 { 1928 {
1440 PTPContainer ptp; 1929 PTPContainer ptp;
1441 unsigned int size = 0;
1442 1930
1443 » PTP_CNT_INIT(ptp); 1931 PTP_CNT_INIT(ptp, PTP_OC_CANON_GetMACAddress);
1444 » ptp.Code=PTP_OC_CANON_GetMACAddress; 1932 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, mac, NULL);
1445 » ptp.Nparam=0;
1446 » *mac = NULL;
1447 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, mac, &size);
1448 } 1933 }
1449 1934
1450 /** 1935 /**
1451 * ptp_canon_get_directory: 1936 * ptp_canon_get_directory:
1452 * params: PTPParams* 1937 * params: PTPParams*
1453 1938
1454 * Gets the full directory of the camera. 1939 * Gets the full directory of the camera.
1455 * 1940 *
1456 * Return values: Some PTP_RC_* code. 1941 * Return values: Some PTP_RC_* code.
1457 * Upon success : PTPObjectHandles *handles - filled out with handle s 1942 * Upon success : PTPObjectHandles *handles - filled out with handle s
1458 * PTPObjectInfo **oinfos - allocated array of PTP Object Infos 1943 * PTPObjectInfo **oinfos - allocated array of PTP Object Infos
1459 * uint32_t **flags - allocated array of CAN ON Flags 1944 * uint32_t **flags - allocated array of CAN ON Flags
1460 * 1945 *
1461 **/ 1946 **/
1462 uint16_t 1947 uint16_t
1463 ptp_canon_get_directory (PTPParams* params, 1948 ptp_canon_get_directory (PTPParams* params,
1464 PTPObjectHandles *handles, 1949 PTPObjectHandles *handles,
1465 PTPObjectInfo **oinfos, /* size(handles->n) */ 1950 PTPObjectInfo **oinfos, /* size(handles->n) */
1466 uint32_t **flags /* size(handles->n) */ 1951 uint32_t **flags /* size(handles->n) */
1467 ) { 1952 ) {
1468 PTPContainer ptp; 1953 PTPContainer ptp;
1469 » unsigned char» *dir = NULL; 1954 » unsigned char» *data;
1470 » unsigned int» size = 0;
1471 uint16_t ret; 1955 uint16_t ret;
1472 1956
1473 » PTP_CNT_INIT(ptp); 1957 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetDirectory);
1474 » ptp.Code=PTP_OC_CANON_GetDirectory; 1958 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, NUL L));
1475 » ptp.Nparam=0; 1959 » ret = ptp_unpack_canon_directory(params, data, ptp.Param1, handles, oinf os, flags);
1476 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dir, &size); 1960 » free (data);
1477 » if (ret != PTP_RC_OK)
1478 » » return ret;
1479 » ret = ptp_unpack_canon_directory(params, dir, ptp.Param1, handles, oinfo s, flags);
1480 » free (dir);
1481 return ret; 1961 return ret;
1482 } 1962 }
1483 1963
1484 /** 1964 /**
1485 * ptp_canon_gettreeinfo: 1965 * ptp_canon_gettreeinfo:
1486 * params: PTPParams* 1966 * params: PTPParams*
1487 * uint32_t *out 1967 * uint32_t *out
1488 * 1968 *
1489 * Switches the camera display to on and lets the user 1969 * Switches the camera display to on and lets the user
1490 * select what to transfer. Sends a 0xc011 event when started 1970 * select what to transfer. Sends a 0xc011 event when started
1491 * and 0xc013 if direct transfer aborted. 1971 * and 0xc013 if direct transfer aborted.
1492 * 1972 *
1493 * Return values: Some PTP_RC_* code. 1973 * Return values: Some PTP_RC_* code.
1494 * 1974 *
1495 **/ 1975 **/
1496 uint16_t 1976 uint16_t
1497 ptp_canon_gettreeinfo (PTPParams* params, uint32_t *out) 1977 ptp_canon_gettreeinfo (PTPParams* params, uint32_t *out)
1498 { 1978 {
1499 » PTPContainer ptp; 1979 » PTPContainer» ptp;
1500 » uint16_t ret;
1501 1980
1502 » PTP_CNT_INIT(ptp); 1981 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetTreeInfo, 0xf);
1503 » ptp.Code = PTP_OC_CANON_GetTreeInfo; 1982 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
1504 » ptp.Nparam = 1; 1983 » if (ptp.Nparam > 0)
1505 » ptp.Param1 = 0xf;
1506 » ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
1507 » if ((ret == PTP_RC_OK) && (ptp.Nparam>0))
1508 *out = ptp.Param1; 1984 *out = ptp.Param1;
1509 » return ret; 1985 » return PTP_RC_OK;
1510 } 1986 }
1511 1987
1512 /** 1988 /**
1513 * ptp_canon_getpairinginfo: 1989 * ptp_canon_getpairinginfo:
1514 * params: PTPParams* 1990 * params: PTPParams*
1515 * int nr 1991 * int nr
1516 * 1992 *
1517 * Get the pairing information. 1993 * Get the pairing information.
1518 * 1994 *
1519 * Return values: Some PTP_RC_* code. 1995 * Return values: Some PTP_RC_* code.
1520 * 1996 *
1521 **/ 1997 **/
1522 uint16_t 1998 uint16_t
1523 ptp_canon_getpairinginfo (PTPParams* params, uint32_t nr, unsigned char **data, unsigned int *size) 1999 ptp_canon_getpairinginfo (PTPParams* params, uint32_t nr, unsigned char **data, unsigned int *size)
1524 { 2000 {
1525 PTPContainer ptp; 2001 PTPContainer ptp;
1526 uint16_t ret;
1527 2002
1528 » PTP_CNT_INIT(ptp); 2003 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetPairingInfo, nr);
1529 » ptp.Code = PTP_OC_CANON_GetPairingInfo; 2004 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1530 » ptp.Nparam = 1;
1531 » ptp.Param1 = nr;
1532 » *data = NULL;
1533 » *size = 0;
1534 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1535 » if (ret != PTP_RC_OK)
1536 » » return ret;
1537 » return PTP_RC_OK;
1538 } 2005 }
1539 2006
1540 /** 2007 /**
1541 * ptp_canon_get_target_handles: 2008 * ptp_canon_get_target_handles:
1542 * params: PTPParams* 2009 * params: PTPParams*
1543 * PTPCanon_directtransfer_entry **out 2010 * PTPCanon_directtransfer_entry **out
1544 * unsigned int *outsize 2011 * unsigned int *outsize
1545 * 2012 *
1546 * Retrieves direct transfer entries specifying the images to transfer 2013 * Retrieves direct transfer entries specifying the images to transfer
1547 * from the camera (to be retrieved after 0xc011 event). 2014 * from the camera (to be retrieved after 0xc011 event).
1548 * 2015 *
1549 * Return values: Some PTP_RC_* code. 2016 * Return values: Some PTP_RC_* code.
1550 * 2017 *
1551 **/ 2018 **/
1552 uint16_t 2019 uint16_t
1553 ptp_canon_gettreesize (PTPParams* params, 2020 ptp_canon_gettreesize (PTPParams* params,
1554 PTPCanon_directtransfer_entry **entries, unsigned int *cnt) 2021 PTPCanon_directtransfer_entry **entries, unsigned int *cnt)
1555 { 2022 {
1556 » PTPContainer ptp; 2023 » PTPContainer» ptp;
1557 » uint16_t ret; 2024 » uint16_t» ret = PTP_RC_OK;
1558 » unsigned char *out = NULL, *cur; 2025 » unsigned char» *data, *cur;
1559 » int i; 2026 » unsigned int» size, i;
1560 » unsigned int size; 2027
1561 » 2028 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetTreeSize);
1562 » PTP_CNT_INIT(ptp); 2029 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1563 » ptp.Code = PTP_OC_CANON_GetTreeSize; 2030 » *cnt = dtoh32a(data);
1564 » ptp.Nparam = 0;
1565 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &out, &size);
1566 » if (ret != PTP_RC_OK)
1567 » » return ret;
1568 » *cnt = dtoh32a(out);
1569 *entries = malloc(sizeof(PTPCanon_directtransfer_entry)*(*cnt)); 2031 *entries = malloc(sizeof(PTPCanon_directtransfer_entry)*(*cnt));
1570 if (!*entries) { 2032 if (!*entries) {
1571 » » free (out); 2033 » » ret = PTP_RC_GeneralError;
1572 » » return PTP_RC_GeneralError; 2034 » » goto exit;
1573 } 2035 }
1574 » cur = out+4; 2036 » cur = data+4;
1575 for (i=0;i<*cnt;i++) { 2037 for (i=0;i<*cnt;i++) {
1576 unsigned char len; 2038 unsigned char len;
1577 (*entries)[i].oid = dtoh32a(cur); 2039 (*entries)[i].oid = dtoh32a(cur);
1578 (*entries)[i].str = ptp_unpack_string(params, cur, 4, &len); 2040 (*entries)[i].str = ptp_unpack_string(params, cur, 4, &len);
1579 cur += 4+(cur[4]*2+1); 2041 cur += 4+(cur[4]*2+1);
1580 } 2042 }
1581 » free (out); 2043 exit:
1582 » return PTP_RC_OK; 2044 » free (data);
2045 » return ret;
1583 } 2046 }
1584 2047
1585 /** 2048 /**
1586 * ptp_canon_checkevent: 2049 * ptp_canon_checkevent:
1587 * params: PTPParams* 2050 * params: PTPParams*
1588 * 2051 *
1589 * The camera has a FIFO stack, in which it accumulates events. 2052 * The camera has a FIFO stack, in which it accumulates events.
1590 * Partially these events are communicated also via the USB interrupt pipe 2053 * Partially these events are communicated also via the USB interrupt pipe
1591 * according to the PTP USB specification, partially not. 2054 * according to the PTP USB specification, partially not.
1592 * This operation returns from the device a block of data, empty, 2055 * This operation returns from the device a block of data, empty,
1593 * if the event stack is empty, or filled with an event's data otherwise. 2056 * if the event stack is empty, or filled with an event's data otherwise.
1594 * The event is removed from the stack in the latter case. 2057 * The event is removed from the stack in the latter case.
1595 * The Remote Capture app sends this command to the camera all the time 2058 * The Remote Capture app sends this command to the camera all the time
1596 * of connection, filling with it the gaps between other operations. 2059 * of connection, filling with it the gaps between other operations.
1597 * 2060 *
1598 * Return values: Some PTP_RC_* code. 2061 * Return values: Some PTP_RC_* code.
1599 * Upon success : PTPUSBEventContainer* event - is filled with the event data 2062 * Upon success : PTPUSBEventContainer* event - is filled with the event data
1600 * if any 2063 * if any
1601 * int *isevent - returns 1 in case of event 2064 * int *isevent - returns 1 in case of event
1602 * or 0 otherwise 2065 * or 0 otherwise
1603 **/ 2066 **/
1604 uint16_t 2067 uint16_t
1605 ptp_canon_checkevent (PTPParams* params, PTPContainer* event, int* isevent) 2068 ptp_canon_checkevent (PTPParams* params, PTPContainer* event, int* isevent)
1606 { 2069 {
1607 » uint16_t ret; 2070 » PTPContainer» ptp;
1608 » PTPContainer ptp; 2071 » unsigned char» *data;
1609 » unsigned char *evdata = NULL; 2072 » unsigned int» size;
1610 » unsigned int len;
1611 2073
2074 PTP_CNT_INIT(ptp, PTP_OC_CANON_CheckEvent);
1612 *isevent=0; 2075 *isevent=0;
1613 » PTP_CNT_INIT(ptp); 2076 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1614 » ptp.Code=PTP_OC_CANON_CheckEvent; 2077 » if (data && size) { /* check if we had a successfull call with data */
1615 » ptp.Nparam=0; 2078 » » ptp_unpack_EC(params, data, event, size);
1616 » len=0; 2079 » » *isevent=1;
1617 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &evdata, &len); 2080 » » free(data);
1618 » if (evdata!=NULL) {
1619 » » if (ret == PTP_RC_OK) {
1620 » » ptp_unpack_EC(params, evdata, event, len);
1621 » » » *isevent=1;
1622 » }
1623 » » free(evdata);
1624 } 2081 }
1625 » return ret; 2082 » return PTP_RC_OK;
1626 } 2083 }
1627 2084
1628 uint16_t 2085 uint16_t
1629 ptp_check_event (PTPParams *params) { 2086 ptp_add_event (PTPParams *params, PTPContainer *evt)
1630 » PTPContainer» » event; 2087 {
1631 » uint16_t» » ret; 2088 » params->events = realloc(params->events, sizeof(PTPContainer)*(params->n rofevents+1));
2089 » memcpy (&params->events[params->nrofevents],evt,1*sizeof(PTPContainer));
2090 » params->nrofevents += 1;
2091 » return PTP_RC_OK;
2092 }
1632 2093
2094 uint16_t
2095 ptp_check_event (PTPParams *params)
2096 {
2097 PTPContainer event;
2098 uint16_t ret;
2099
2100 /* Method offered by Nikon DSLR, Nikon 1, and some older Nikon Coolpix P *
2101 * The Nikon Coolpix P2 however does not return anything. So if we never get
2102 * events from here, use the ptp "interrupt" method */
1633 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_NIKON) && 2103 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_NIKON) &&
1634 ptp_operation_issupported(params, PTP_OC_NIKON_CheckEvent) 2104 ptp_operation_issupported(params, PTP_OC_NIKON_CheckEvent)
1635 ) { 2105 ) {
1636 » » int evtcnt; 2106 » » unsigned int evtcnt = 0;
1637 » » PTPContainer» *xevent = NULL; 2107 » » PTPContainer *xevent = NULL;
1638 2108
1639 ret = ptp_nikon_check_event(params, &xevent, &evtcnt); 2109 ret = ptp_nikon_check_event(params, &xevent, &evtcnt);
1640 » » if (ret != PTP_RC_OK) 2110 » » if (ret != PTP_RC_OperationNotSupported)
1641 » » » return ret; 2111 » » » CHECK_PTP_RC(ret);
1642 2112
1643 if (evtcnt) { 2113 if (evtcnt) {
1644 » » » if (params->nrofevents) 2114 » » » params->events = realloc(params->events, sizeof(PTPConta iner)*(evtcnt+params->nrofevents));
1645 » » » » params->events = realloc(params->events, sizeof( PTPContainer)*(evtcnt+params->nrofevents));
1646 » » » else
1647 » » » » params->events = malloc(sizeof(PTPContainer)*evt cnt);
1648 memcpy (&params->events[params->nrofevents],xevent,evtcn t*sizeof(PTPContainer)); 2115 memcpy (&params->events[params->nrofevents],xevent,evtcn t*sizeof(PTPContainer));
1649 params->nrofevents += evtcnt; 2116 params->nrofevents += evtcnt;
1650 free (xevent); 2117 free (xevent);
2118 params->event90c7works = 1;
1651 } 2119 }
1652 » » return PTP_RC_OK; 2120 » » if (params->event90c7works)
2121 » » » return PTP_RC_OK;
2122 » » /* fall through to generic event handling */
1653 } 2123 }
1654 /* should not get here ... EOS has no normal PTP events and another queu e handling. */ 2124 /* should not get here ... EOS has no normal PTP events and another queu e handling. */
1655 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) && 2125 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) &&
1656 ptp_operation_issupported(params, PTP_OC_CANON_EOS_GetEvent) 2126 ptp_operation_issupported(params, PTP_OC_CANON_EOS_GetEvent)
1657 ) { 2127 ) {
1658 return PTP_RC_OK; 2128 return PTP_RC_OK;
1659 } 2129 }
1660 2130
1661 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) && 2131 if ( (params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) &&
1662 ptp_operation_issupported(params, PTP_OC_CANON_CheckEvent) 2132 ptp_operation_issupported(params, PTP_OC_CANON_CheckEvent)
1663 ) { 2133 ) {
1664 int isevent; 2134 int isevent;
1665 2135
1666 » » ret = ptp_canon_checkevent (params,&event,&isevent); 2136 » » CHECK_PTP_RC(ptp_canon_checkevent (params,&event,&isevent));
1667 » » if (ret!=PTP_RC_OK) 2137
1668 » » » return ret; 2138 » » if (isevent) {
1669 » » if (isevent) 2139 » » » ret = PTP_RC_OK;
1670 goto store_event; 2140 goto store_event;
2141 }
1671 /* Event Emulate Mode 0 (unset) and 1-5 get interrupt events. 6- 7 does not. */ 2142 /* Event Emulate Mode 0 (unset) and 1-5 get interrupt events. 6- 7 does not. */
1672 if (params->canon_event_mode > 5) 2143 if (params->canon_event_mode > 5)
1673 » » » return ret; 2144 » » » return PTP_RC_OK;
1674 2145
1675 /* FIXME: fallthrough or return? */ 2146 /* FIXME: fallthrough or return? */
1676 #ifdef __APPLE__ 2147 #ifdef __APPLE__
1677 /* the libusb 1 on darwin currently does not like polling 2148 /* the libusb 1 on darwin currently does not like polling
1678 * for interrupts, they have no timeout for it. 2010/08/23 2149 * for interrupts, they have no timeout for it. 2010/08/23
1679 * Check back in 2011 or so. -Marcus 2150 * Check back in 2011 or so. -Marcus
1680 */ 2151 */
1681 » » return ret; 2152 » » return PTP_RC_OK;
1682 #endif 2153 #endif
1683 } 2154 }
1684 ret = params->event_check(params,&event); 2155 ret = params->event_check(params,&event);
1685 2156
1686 store_event: 2157 store_event:
1687 if (ret == PTP_RC_OK) { 2158 if (ret == PTP_RC_OK) {
1688 ptp_debug (params, "event: nparams=0x%X, code=0x%X, trans_id=0x% X, p1=0x%X, p2=0x%X, p3=0x%X", event.Nparam,event.Code,event.Transaction_ID, eve nt.Param1, event.Param2, event.Param3); 2159 ptp_debug (params, "event: nparams=0x%X, code=0x%X, trans_id=0x% X, p1=0x%X, p2=0x%X, p3=0x%X", event.Nparam,event.Code,event.Transaction_ID, eve nt.Param1, event.Param2, event.Param3);
1689 » » if (params->nrofevents) 2160 » » ptp_add_event (params, &event);
1690 » » » params->events = realloc(params->events, sizeof(PTPConta iner)*(params->nrofevents+1)); 2161
1691 » » else 2162 » » /* handle some PTP stack internal events */
1692 » » » params->events = malloc(sizeof(PTPContainer)*1); 2163 » » switch (event.Code) {
1693 » » memcpy (&params->events[params->nrofevents],&event,1*sizeof(PTPC ontainer)); 2164 » » case PTP_EC_DevicePropChanged: {
1694 » » params->nrofevents += 1; 2165 » » » unsigned int i;
2166
2167 » » » /* mark the property for a forced refresh on the next qu ery */
2168 » » » for (i=0;i<params->nrofdeviceproperties;i++)
2169 » » » » if (params->deviceproperties[i].desc.DevicePrope rtyCode == event.Param1) {
2170 » » » » » params->deviceproperties[i].timestamp = 0;
2171 » » » » » break;
2172 » » » » }
2173 » » » break;
2174 » » }
2175 » » default: /* check if we should handle it internally too */
2176 » » » break;
2177 » » }
2178 »
1695 } 2179 }
1696 if (ret == PTP_ERROR_TIMEOUT) /* ok, just new events */ 2180 if (ret == PTP_ERROR_TIMEOUT) /* ok, just new events */
1697 ret = PTP_RC_OK; 2181 ret = PTP_RC_OK;
1698 return ret; 2182 return ret;
1699 } 2183 }
1700 2184
2185 uint16_t
2186 ptp_wait_event (PTPParams *params)
2187 {
2188 PTPContainer event;
2189 uint16_t ret;
2190
2191 ret = params->event_wait(params,&event);
2192 if (ret == PTP_RC_OK) {
2193 ptp_debug (params, "event: nparams=0x%X, code=0x%X, trans_id=0x% X, p1=0x%X, p2=0x%X, p3=0x%X", event.Nparam,event.Code,event.Transaction_ID, eve nt.Param1, event.Param2, event.Param3);
2194 ptp_add_event (params, &event);
2195
2196 /* handle some PTP stack internal events */
2197 switch (event.Code) {
2198 case PTP_EC_DevicePropChanged: {
2199 unsigned int i;
2200
2201 /* mark the property for a forced refresh on the next qu ery */
2202 for (i=0;i<params->nrofdeviceproperties;i++)
2203 if (params->deviceproperties[i].desc.DevicePrope rtyCode == event.Param1) {
2204 params->deviceproperties[i].timestamp = 0;
2205 break;
2206 }
2207 break;
2208 }
2209 default: /* check if we should handle it internally too */
2210 break;
2211 }
2212 }
2213 if (ret == PTP_ERROR_TIMEOUT) /* ok, just new events */
2214 ret = PTP_RC_OK;
2215 return ret;
2216 }
2217
2218
1701 int 2219 int
1702 ptp_get_one_event(PTPParams *params, PTPContainer *event) { 2220 ptp_get_one_event(PTPParams *params, PTPContainer *event)
2221 {
1703 if (!params->nrofevents) 2222 if (!params->nrofevents)
1704 return 0; 2223 return 0;
1705 memcpy (event, params->events, sizeof(PTPContainer)); 2224 memcpy (event, params->events, sizeof(PTPContainer));
1706 memmove (params->events, params->events+1, sizeof(PTPContainer)*(params- >nrofevents-1)); 2225 memmove (params->events, params->events+1, sizeof(PTPContainer)*(params- >nrofevents-1));
1707 /* do not realloc on shrink. */ 2226 /* do not realloc on shrink. */
1708 params->nrofevents--; 2227 params->nrofevents--;
1709 if (!params->nrofevents) { 2228 if (!params->nrofevents) {
1710 free (params->events); 2229 free (params->events);
1711 params->events = NULL; 2230 params->events = NULL;
1712 } 2231 }
1713 return 1; 2232 return 1;
1714 } 2233 }
1715 2234
1716 /** 2235 /**
1717 * ptp_canon_eos_getevent: 2236 * ptp_canon_eos_getevent:
1718 * 2237 *
1719 * This retrieves configuration status/updates/changes 2238 * This retrieves configuration status/updates/changes
1720 * on EOS cameras. It reads a datablock which has a list of variable 2239 * on EOS cameras. It reads a datablock which has a list of variable
1721 * sized structures. 2240 * sized structures.
1722 * 2241 *
1723 * params: PTPParams* 2242 * params: PTPParams*
1724 * 2243 *
1725 * Return values: Some PTP_RC_* code. 2244 * Return values: Some PTP_RC_* code.
1726 * 2245 *
1727 **/ 2246 **/
1728 uint16_t 2247 uint16_t
1729 ptp_canon_eos_getevent (PTPParams* params, PTPCanon_changes_entry **entries, int *nrofentries) 2248 ptp_canon_eos_getevent (PTPParams* params, PTPCanon_changes_entry **entries, int *nrofentries)
1730 { 2249 {
1731 » PTPContainer ptp; 2250 » PTPContainer» ptp;
1732 » uint16_t» ret; 2251 » unsigned char» *data;
1733 » unsigned int » size = 0; 2252 » unsigned int » size;
1734 » unsigned char» *data = NULL;
1735 2253
2254 PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetEvent);
1736 *nrofentries = 0; 2255 *nrofentries = 0;
1737 *entries = NULL; 2256 *entries = NULL;
1738 » PTP_CNT_INIT(ptp); 2257 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1739 » ptp.Code = PTP_OC_CANON_EOS_GetEvent; 2258 » *nrofentries = ptp_unpack_CANON_changes(params,data,size,entries);
1740 » ptp.Nparam = 0;
1741 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
1742 » if (ret != PTP_RC_OK) return ret;
1743 *nrofentries = ptp_unpack_CANON_changes(params,data,size,entries);
1744 free (data); 2259 free (data);
1745 return PTP_RC_OK; 2260 return PTP_RC_OK;
1746 } 2261 }
1747 2262
1748 uint16_t 2263 uint16_t
1749 ptp_check_eos_events (PTPParams *params) { 2264 ptp_check_eos_events (PTPParams *params)
1750 » uint16_t» » ret; 2265 {
1751 PTPCanon_changes_entry *entries = NULL, *nentries; 2266 PTPCanon_changes_entry *entries = NULL, *nentries;
1752 int nrofentries = 0; 2267 int nrofentries = 0;
1753 2268
1754 while (1) { /* call it repeatedly until the camera does not report any * / 2269 while (1) { /* call it repeatedly until the camera does not report any * /
1755 » » ret = ptp_canon_eos_getevent (params, &entries, &nrofentries); 2270 » » CHECK_PTP_RC(ptp_canon_eos_getevent (params, &entries, &nrofentr ies));
1756 » » if (ret != PTP_RC_OK)
1757 » » » return ret;
1758 if (!nrofentries) 2271 if (!nrofentries)
1759 return PTP_RC_OK; 2272 return PTP_RC_OK;
1760 2273
1761 if (params->nrofbacklogentries) { 2274 if (params->nrofbacklogentries) {
1762 nentries = realloc(params->backlogentries,sizeof(entries [0])*(params->nrofbacklogentries+nrofentries)); 2275 nentries = realloc(params->backlogentries,sizeof(entries [0])*(params->nrofbacklogentries+nrofentries));
1763 if (!nentries) 2276 if (!nentries)
1764 return PTP_RC_GeneralError; 2277 return PTP_RC_GeneralError;
1765 params->backlogentries = nentries; 2278 params->backlogentries = nentries;
1766 memcpy (nentries+params->nrofbacklogentries, entries, nr ofentries*sizeof(entries[0])); 2279 memcpy (nentries+params->nrofbacklogentries, entries, nr ofentries*sizeof(entries[0]));
1767 params->nrofbacklogentries += nrofentries; 2280 params->nrofbacklogentries += nrofentries;
1768 free (entries); 2281 free (entries);
1769 } else { 2282 } else {
1770 params->backlogentries = entries; 2283 params->backlogentries = entries;
1771 params->nrofbacklogentries = nrofentries; 2284 params->nrofbacklogentries = nrofentries;
1772 } 2285 }
1773 } 2286 }
1774 return PTP_RC_OK; 2287 return PTP_RC_OK;
1775 } 2288 }
1776 2289
1777 int 2290 int
1778 ptp_get_one_eos_event (PTPParams *params, PTPCanon_changes_entry *entry) { 2291 ptp_get_one_eos_event (PTPParams *params, PTPCanon_changes_entry *entry)
2292 {
1779 if (!params->nrofbacklogentries) 2293 if (!params->nrofbacklogentries)
1780 return 0; 2294 return 0;
1781 memcpy (entry, params->backlogentries, sizeof(*entry)); 2295 memcpy (entry, params->backlogentries, sizeof(*entry));
1782 if (params->nrofbacklogentries > 1) { 2296 if (params->nrofbacklogentries > 1) {
1783 memmove (params->backlogentries,params->backlogentries+1,sizeof( *entry)*(params->nrofbacklogentries-1)); 2297 memmove (params->backlogentries,params->backlogentries+1,sizeof( *entry)*(params->nrofbacklogentries-1));
1784 params->nrofbacklogentries--; 2298 params->nrofbacklogentries--;
1785 } else { 2299 } else {
1786 free (params->backlogentries); 2300 free (params->backlogentries);
1787 params->backlogentries = NULL; 2301 params->backlogentries = NULL;
1788 params->nrofbacklogentries = 0; 2302 params->nrofbacklogentries = 0;
1789 } 2303 }
1790 return 1; 2304 return 1;
1791 } 2305 }
1792 2306
1793 2307
1794 uint16_t 2308 uint16_t
1795 ptp_canon_eos_getdevicepropdesc (PTPParams* params, uint16_t propcode, 2309 ptp_canon_eos_getdevicepropdesc (PTPParams* params, uint16_t propcode,
1796 PTPDevicePropDesc *dpd) 2310 PTPDevicePropDesc *dpd)
1797 { 2311 {
1798 » int i; 2312 » unsigned int i;
1799 2313
1800 for (i=0;i<params->nrofcanon_props;i++) 2314 for (i=0;i<params->nrofcanon_props;i++)
1801 if (params->canon_props[i].proptype == propcode) 2315 if (params->canon_props[i].proptype == propcode)
1802 break; 2316 break;
1803 if (params->nrofcanon_props == i) 2317 if (params->nrofcanon_props == i)
1804 return PTP_RC_Undefined; 2318 return PTP_RC_Undefined;
1805 memcpy (dpd, &params->canon_props[i].dpd, sizeof (*dpd)); 2319 memcpy (dpd, &params->canon_props[i].dpd, sizeof (*dpd));
1806 if (dpd->FormFlag == PTP_DPFF_Enumeration) { 2320 if (dpd->FormFlag == PTP_DPFF_Enumeration) {
1807 /* need to duplicate the Enumeration alloc */ 2321 /* need to duplicate the Enumeration alloc */
1808 dpd->FORM.Enum.SupportedValue = malloc (sizeof (PTPPropertyValue )*dpd->FORM.Enum.NumberOfValues); 2322 dpd->FORM.Enum.SupportedValue = malloc (sizeof (PTPPropertyValue )*dpd->FORM.Enum.NumberOfValues);
1809 memcpy (dpd->FORM.Enum.SupportedValue, 2323 memcpy (dpd->FORM.Enum.SupportedValue,
1810 params->canon_props[i].dpd.FORM.Enum.SupportedValue, 2324 params->canon_props[i].dpd.FORM.Enum.SupportedValue,
1811 sizeof (PTPPropertyValue)*dpd->FORM.Enum.NumberOfValues 2325 sizeof (PTPPropertyValue)*dpd->FORM.Enum.NumberOfValues
1812 ); 2326 );
1813 } 2327 }
1814 if (dpd->DataType == PTP_DTC_STR) { 2328 if (dpd->DataType == PTP_DTC_STR) {
1815 dpd->FactoryDefaultValue.str = strdup( params->canon_props[i].dp d.FactoryDefaultValue.str ); 2329 dpd->FactoryDefaultValue.str = strdup( params->canon_props[i].dp d.FactoryDefaultValue.str );
1816 dpd->CurrentValue.str = strdup( params->canon_props[i].dpd.Curre ntValue.str ); 2330 dpd->CurrentValue.str = strdup( params->canon_props[i].dpd.Curre ntValue.str );
1817 } 2331 }
1818 2332
1819 return PTP_RC_OK; 2333 return PTP_RC_OK;
1820 } 2334 }
1821 2335
1822 2336
1823 uint16_t 2337 uint16_t
1824 ptp_canon_eos_getstorageids (PTPParams* params, PTPStorageIDs* storageids) 2338 ptp_canon_eos_getstorageids (PTPParams* params, PTPStorageIDs* storageids)
1825 { 2339 {
1826 PTPContainer ptp; 2340 PTPContainer ptp;
1827 » unsigned int» len = 0; 2341 » unsigned char» *data;
1828 » uint16_t» ret; 2342 » unsigned int» size;
1829 » unsigned char*» sids=NULL; 2343
1830 » 2344 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetStorageIDs);
1831 » PTP_CNT_INIT(ptp); 2345 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1832 » ptp.Code » = PTP_OC_CANON_EOS_GetStorageIDs; 2346 » ptp_unpack_SIDs(params, data, storageids, size);
1833 » ptp.Nparam» = 0; 2347 » free(data);
1834 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &sids, &len); 2348 » return PTP_RC_OK;
1835 » if (ret == PTP_RC_OK) ptp_unpack_SIDs(params, sids, storageids, len);
1836 » free(sids);
1837 » return ret;
1838 } 2349 }
1839 2350
1840 uint16_t 2351 uint16_t
1841 ptp_canon_eos_getstorageinfo (PTPParams* params, uint32_t p1, unsigned char **da ta, unsigned int *size) 2352 ptp_canon_eos_getstorageinfo (PTPParams* params, uint32_t p1, unsigned char **da ta, unsigned int *size)
1842 { 2353 {
1843 » PTPContainer ptp; 2354 » PTPContainer» ptp;
1844 » uint16_t» ret;
1845 2355
1846 » *size = 0; 2356 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetStorageInfo, p1);
1847 » *data = NULL; 2357 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1848 » PTP_CNT_INIT(ptp);
1849 » ptp.Code » = PTP_OC_CANON_EOS_GetStorageInfo;
1850 » ptp.Nparam» = 1;
1851 » ptp.Param1» = p1;
1852 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
1853 /* FIXME: do stuff with data */ 2358 /* FIXME: do stuff with data */
1854 return ret;
1855 } 2359 }
1856 2360
1857 uint16_t 2361 uint16_t
1858 ptp_canon_eos_getobjectinfoex ( 2362 ptp_canon_eos_getobjectinfoex (
1859 PTPParams* params, uint32_t storageid, uint32_t oid, uint32_t unk, 2363 PTPParams* params, uint32_t storageid, uint32_t oid, uint32_t unk,
1860 PTPCANONFolderEntry **entries, unsigned int *nrofentries 2364 PTPCANONFolderEntry **entries, unsigned int *nrofentries
1861 ) { 2365 ) {
1862 PTPContainer ptp; 2366 PTPContainer ptp;
1863 » unsigned int» i, size = 0; 2367 » uint16_t» ret = PTP_RC_OK;
1864 unsigned char *data, *xdata; 2368 unsigned char *data, *xdata;
1865 » uint16_t» ret; 2369 » unsigned int» size, i;
1866 2370
1867 » data = NULL; 2371 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetObjectInfoEx, storageid, oid, unk) ;
1868 » PTP_CNT_INIT(ptp); 2372 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
1869 » ptp.Code » = PTP_OC_CANON_EOS_GetObjectInfoEx; 2373 » if (!data) {
1870 » ptp.Nparam» = 3; 2374 » » *nrofentries = 0;
1871 » ptp.Param1» = storageid; 2375 » » return PTP_RC_OK;
1872 » ptp.Param2» = oid; 2376 » }
1873 » ptp.Param3» = unk;
1874 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
1875 » if (ret != PTP_RC_OK)
1876 » » return ret;
1877 2377
1878 *nrofentries = dtoh32a(data); 2378 *nrofentries = dtoh32a(data);
1879 *entries = malloc(*nrofentries * sizeof(PTPCANONFolderEntry)); 2379 *entries = malloc(*nrofentries * sizeof(PTPCANONFolderEntry));
1880 » if (!*entries) 2380 » if (!*entries) {
1881 » » return PTP_RC_GeneralError; 2381 » » ret = PTP_RC_GeneralError;
2382 » » goto exit;
2383 » }
1882 2384
1883 xdata = data+sizeof(uint32_t); 2385 xdata = data+sizeof(uint32_t);
1884 for (i=0;i<*nrofentries;i++) { 2386 for (i=0;i<*nrofentries;i++) {
1885 ptp_unpack_Canon_EOS_FE (params, &xdata[4], &((*entries)[i])); 2387 ptp_unpack_Canon_EOS_FE (params, &xdata[4], &((*entries)[i]));
1886 xdata += dtoh32a(xdata); 2388 xdata += dtoh32a(xdata);
1887 } 2389 }
1888 » return PTP_RC_OK; 2390 exit:
2391 » free (data);
2392 » return ret;
1889 } 2393 }
1890 2394
1891 /** 2395 /**
1892 * ptp_canon_eos_getpartialobject: 2396 * ptp_canon_eos_getpartialobject:
1893 * 2397 *
1894 * This retrieves a part of an PTP object which you specify as object id. 2398 * This retrieves a part of an PTP object which you specify as object id.
1895 * The id originates from 0x9116 call. 2399 * The id originates from 0x9116 call.
1896 * After finishing it, we seem to need to call ptp_canon_eos_enddirecttransfer. 2400 * After finishing it, we seem to need to call ptp_canon_eos_enddirecttransfer.
1897 * 2401 *
1898 * params: PTPParams* 2402 * params: PTPParams*
1899 * oid Object ID 2403 * oid Object ID
1900 * offset The offset where to start the data transfer 2404 * offset The offset where to start the data transfer
1901 * xsize Size in bytes of the transfer to do 2405 * xsize Size in bytes of the transfer to do
1902 * data Pointer that receives the malloc()ed memory of t he transfer. 2406 * data Pointer that receives the malloc()ed memory of t he transfer.
1903 * 2407 *
1904 * Return values: Some PTP_RC_* code. 2408 * Return values: Some PTP_RC_* code.
1905 * 2409 *
1906 */ 2410 */
1907 uint16_t 2411 uint16_t
1908 ptp_canon_eos_getpartialobject (PTPParams* params, uint32_t oid, uint32_t offset , uint32_t xsize, unsigned char**data) 2412 ptp_canon_eos_getpartialobject (PTPParams* params, uint32_t oid, uint32_t offset , uint32_t xsize, unsigned char**data)
1909 { 2413 {
1910 PTPContainer ptp; 2414 PTPContainer ptp;
1911 unsigned int size = 0;
1912 2415
1913 » *data = NULL; 2416 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetPartialObject, oid, offset, xsize) ;
1914 » PTP_CNT_INIT(ptp); 2417 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, NULL);
1915 » ptp.Code » = PTP_OC_CANON_EOS_GetPartialObject;
1916 » ptp.Nparam» = 3;
1917 » ptp.Param1» = oid;
1918 » ptp.Param2» = offset;
1919 » ptp.Param3» = xsize;
1920 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, &size);
1921 } 2418 }
1922 2419
1923 uint16_t 2420 uint16_t
1924 ptp_canon_eos_setdevicepropvalueex (PTPParams* params, unsigned char* data, unsi gned int size) 2421 ptp_canon_eos_setdevicepropvalueex (PTPParams* params, unsigned char* data, unsi gned int size)
1925 { 2422 {
1926 PTPContainer ptp; 2423 PTPContainer ptp;
1927 2424
1928 » PTP_CNT_INIT(ptp); 2425 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_SetDevicePropValueEx);
1929 » ptp.Code » = PTP_OC_CANON_EOS_SetDevicePropValueEx;
1930 » ptp.Nparam» = 0;
1931 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ; 2426 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ;
1932 } 2427 }
1933 2428
1934 #if 0 2429 #if 0
1935 uint16_t 2430 uint16_t
1936 ptp_canon_eos_setdevicepropvalue (PTPParams* params, 2431 ptp_canon_eos_setdevicepropvalue (PTPParams* params,
1937 uint16_t propcode, PTPPropertyValue *value, uint16_t datatype 2432 uint16_t propcode, PTPPropertyValue *value, uint16_t datatype
1938 ) { 2433 ) {
1939 PTPContainer ptp; 2434 PTPContainer ptp;
1940 uint16_t ret; 2435 uint16_t ret;
1941 » int » » i; 2436 » unsigned char» *data = NULL;
1942 » unsigned char» *data; 2437 » unsigned int» i, size;
1943 » unsigned int» size;
1944 2438
1945 » PTP_CNT_INIT(ptp); 2439 » PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_SetDevicePropValueEx);
1946 » ptp.Code » = PTP_OC_CANON_EOS_SetDevicePropValueEx; 2440
1947 » ptp.Nparam» = 0;
1948 for (i=0;i<params->nrofcanon_props;i++) 2441 for (i=0;i<params->nrofcanon_props;i++)
1949 if (params->canon_props[i].proptype == propcode) 2442 if (params->canon_props[i].proptype == propcode)
1950 break; 2443 break;
1951 if (params->nrofcanon_props == i) 2444 if (params->nrofcanon_props == i)
1952 return PTP_RC_Undefined; 2445 return PTP_RC_Undefined;
1953 2446
1954 switch (propcode) { 2447 switch (propcode) {
1955 case PTP_DPC_CANON_EOS_ImageFormat: 2448 case PTP_DPC_CANON_EOS_ImageFormat:
1956 case PTP_DPC_CANON_EOS_ImageFormatCF: 2449 case PTP_DPC_CANON_EOS_ImageFormatCF:
1957 case PTP_DPC_CANON_EOS_ImageFormatSD: 2450 case PTP_DPC_CANON_EOS_ImageFormatSD:
1958 case PTP_DPC_CANON_EOS_ImageFormatExtHD: 2451 case PTP_DPC_CANON_EOS_ImageFormatExtHD:
1959 /* special handling of ImageFormat properties */ 2452 /* special handling of ImageFormat properties */
1960 size = 8 + ptp_pack_EOS_ImageFormat( params, NULL, value->u16 ); 2453 size = 8 + ptp_pack_EOS_ImageFormat( params, NULL, value->u16 );
1961 data = malloc( size ); 2454 data = malloc( size );
1962 if (!data) return PTP_RC_GeneralError; 2455 if (!data) return PTP_RC_GeneralError;
1963 params->canon_props[i].dpd.CurrentValue.u16 = value->u16; 2456 params->canon_props[i].dpd.CurrentValue.u16 = value->u16;
1964 ptp_pack_EOS_ImageFormat( params, data + 8, value->u16 ); 2457 ptp_pack_EOS_ImageFormat( params, data + 8, value->u16 );
1965 break; 2458 break;
1966 case PTP_DPC_CANON_EOS_CustomFuncEx: 2459 case PTP_DPC_CANON_EOS_CustomFuncEx:
1967 /* special handling of CustomFuncEx properties */ 2460 /* special handling of CustomFuncEx properties */
1968 ptp_debug (params, "ptp2/ptp_canon_eos_setdevicepropvalue: setti ng EOS prop %x to %s",propcode,value->str); 2461 ptp_debug (params, "ptp2/ptp_canon_eos_setdevicepropvalue: setti ng EOS prop %x to %s",propcode,value->str);
1969 size = 8 + ptp_pack_EOS_CustomFuncEx( params, NULL, value->str ) ; 2462 size = 8 + ptp_pack_EOS_CustomFuncEx( params, NULL, value->str ) ;
1970 data = malloc( size ); 2463 data = malloc( size );
1971 if (!data) return PTP_RC_GeneralError; 2464 if (!data) return PTP_RC_GeneralError;
1972 params->canon_props[i].dpd.CurrentValue.str = strdup( value->str ); 2465 params->canon_props[i].dpd.CurrentValue.str = strdup( value->str );
1973 ptp_pack_EOS_CustomFuncEx( params, data + 8, value->str ); 2466 ptp_pack_EOS_CustomFuncEx( params, data + 8, value->str );
1974 break; 2467 break;
1975 default: 2468 default:
1976 if (datatype != PTP_DTC_STR) { 2469 if (datatype != PTP_DTC_STR) {
1977 » » » data = calloc(sizeof(uint32_t),3); 2470 » » » data = calloc(3,sizeof(uint32_t));
1978 if (!data) return PTP_RC_GeneralError; 2471 if (!data) return PTP_RC_GeneralError;
1979 size = sizeof(uint32_t)*3; 2472 size = sizeof(uint32_t)*3;
1980 } else { 2473 } else {
1981 size = strlen(value->str) + 1 + 8; 2474 size = strlen(value->str) + 1 + 8;
1982 » » » data = calloc(sizeof(char),size); 2475 » » » data = calloc(size,sizeof(char));
1983 if (!data) return PTP_RC_GeneralError; 2476 if (!data) return PTP_RC_GeneralError;
1984 } 2477 }
1985 switch (datatype) { 2478 switch (datatype) {
1986 case PTP_DTC_INT8: 2479 case PTP_DTC_INT8:
1987 case PTP_DTC_UINT8: 2480 case PTP_DTC_UINT8:
1988 /*fprintf (stderr, "%x -> %d\n", propcode, value->u8);*/ 2481 /*fprintf (stderr, "%x -> %d\n", propcode, value->u8);*/
1989 htod8a(&data[8], value->u8); 2482 htod8a(&data[8], value->u8);
1990 params->canon_props[i].dpd.CurrentValue.u8 = value->u8; 2483 params->canon_props[i].dpd.CurrentValue.u8 = value->u8;
1991 break; 2484 break;
1992 case PTP_DTC_UINT16: 2485 case PTP_DTC_UINT16:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 * char **block - the pointer to the block of data read 2528 * char **block - the pointer to the block of data read
2036 * uint32_t* readnum - the number of bytes read 2529 * uint32_t* readnum - the number of bytes read
2037 * 2530 *
2038 **/ 2531 **/
2039 uint16_t 2532 uint16_t
2040 ptp_canon_getpartialobject (PTPParams* params, uint32_t handle, 2533 ptp_canon_getpartialobject (PTPParams* params, uint32_t handle,
2041 uint32_t offset, uint32_t size, 2534 uint32_t offset, uint32_t size,
2042 uint32_t pos, unsigned char** block, 2535 uint32_t pos, unsigned char** block,
2043 uint32_t* readnum) 2536 uint32_t* readnum)
2044 { 2537 {
2045 » uint16_t ret; 2538 » PTPContainer» ptp;
2046 » PTPContainer ptp; 2539 » uint16_t» ret;
2047 » unsigned char *data=NULL; 2540 » unsigned char» *data;
2048 » unsigned int len;
2049 2541
2050 » PTP_CNT_INIT(ptp); 2542 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetPartialObjectEx, handle, offset, size, pos);
2051 » ptp.Code=PTP_OC_CANON_GetPartialObjectEx; 2543 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, NULL);
2052 » ptp.Param1=handle;
2053 » ptp.Param2=offset;
2054 » ptp.Param3=size;
2055 » ptp.Param4=pos;
2056 » ptp.Nparam=4;
2057 » len=0;
2058 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len);
2059 if (ret==PTP_RC_OK) { 2544 if (ret==PTP_RC_OK) {
2060 *block=data; 2545 *block=data;
2061 *readnum=ptp.Param1; 2546 *readnum=ptp.Param1;
2062 } 2547 }
2548 free (data);
2063 return ret; 2549 return ret;
2064 } 2550 }
2065 2551
2066 /** 2552 /**
2067 * ptp_canon_getviewfinderimage: 2553 * ptp_canon_getviewfinderimage:
2068 * 2554 *
2069 * This operation can be used to read the image which is currently 2555 * This operation can be used to read the image which is currently
2070 * in the camera's viewfinder. The image size is 320x240, format is JPEG. 2556 * in the camera's viewfinder. The image size is 320x240, format is JPEG.
2071 * Of course, prior to calling this operation, one must turn the viewfinder 2557 * Of course, prior to calling this operation, one must turn the viewfinder
2072 * on with the CANON_ViewfinderOn command. 2558 * on with the CANON_ViewfinderOn command.
2073 * Invoking this operation many times, one can get live video from the camera! 2559 * Invoking this operation many times, one can get live video from the camera!
2074 * 2560 *
2075 * params: PTPParams* 2561 * params: PTPParams*
2076 * 2562 *
2077 * Return values: Some PTP_RC_* code. 2563 * Return values: Some PTP_RC_* code.
2078 * char **image - the pointer to the read image 2564 * char **image - the pointer to the read image
2079 * unit32_t *size - the size of the image in bytes 2565 * unit32_t *size - the size of the image in bytes
2080 * 2566 *
2081 **/ 2567 **/
2082 uint16_t 2568 uint16_t
2083 ptp_canon_getviewfinderimage (PTPParams* params, unsigned char** image, uint32_t * size) 2569 ptp_canon_getviewfinderimage (PTPParams* params, unsigned char** image, uint32_t * size)
2084 { 2570 {
2085 » uint16_t ret; 2571 » PTPContainer» ptp;
2086 » PTPContainer ptp; 2572 » uint16_t» ret;
2087 » unsigned int len;
2088 2573
2089 » PTP_CNT_INIT(ptp); 2574 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetViewfinderImage);
2090 » ptp.Code=PTP_OC_CANON_GetViewfinderImage; 2575 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, image, NULL);
2091 » ptp.Nparam=0; 2576 » if (ret==PTP_RC_OK)
2092 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, image, &len); 2577 » » *size=ptp.Param1;
2093 » if (ret==PTP_RC_OK) *size=ptp.Param1;
2094 return ret; 2578 return ret;
2095 } 2579 }
2096 2580
2097 /** 2581 /**
2098 * ptp_canon_getchanges: 2582 * ptp_canon_getchanges:
2099 * 2583 *
2100 * This is an interesting operation, about the effect of which I am not sure. 2584 * This is an interesting operation, about the effect of which I am not sure.
2101 * This command is called every time when a device property has been changed 2585 * This command is called every time when a device property has been changed
2102 * with the SetDevicePropValue operation, and after some other operations. 2586 * with the SetDevicePropValue operation, and after some other operations.
2103 * This operation reads the array of Device Properties which have been changed 2587 * This operation reads the array of Device Properties which have been changed
2104 * by the previous operation. 2588 * by the previous operation.
2105 * Probably, this operation is even required to make those changes work. 2589 * Probably, this operation is even required to make those changes work.
2106 * 2590 *
2107 * params: PTPParams* 2591 * params: PTPParams*
2108 * 2592 *
2109 * Return values: Some PTP_RC_* code. 2593 * Return values: Some PTP_RC_* code.
2110 * uint16_t** props - the pointer to the array of changed properties 2594 * uint16_t** props - the pointer to the array of changed properties
2111 * uint32_t* propnum - the number of elements in the *props array 2595 * uint32_t* propnum - the number of elements in the *props array
2112 * 2596 *
2113 **/ 2597 **/
2114 uint16_t 2598 uint16_t
2115 ptp_canon_getchanges (PTPParams* params, uint16_t** props, uint32_t* propnum) 2599 ptp_canon_getchanges (PTPParams* params, uint16_t** props, uint32_t* propnum)
2116 { 2600 {
2117 » uint16_t ret; 2601 » PTPContainer» ptp;
2118 » PTPContainer ptp; 2602 » unsigned char» *data;
2119 » unsigned char* data=NULL; 2603 » unsigned int» size;
2120 » unsigned int len;
2121 2604
2122 » PTP_CNT_INIT(ptp); 2605 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetChanges);
2123 » ptp.Code=PTP_OC_CANON_GetChanges; 2606 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2124 » ptp.Nparam=0; 2607 » *propnum=ptp_unpack_uint16_t_array(params,data,0,size,props);
2125 » len=0;
2126 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len);
2127 » if (ret == PTP_RC_OK)
2128 » *propnum=ptp_unpack_uint16_t_array(params,data,0,props);
2129 free(data); 2608 free(data);
2130 » return ret; 2609 » return PTP_RC_OK;
2131 } 2610 }
2132 2611
2133 /** 2612 /**
2134 * ptp_canon_getobjectinfo: 2613 * ptp_canon_getobjectinfo:
2135 * 2614 *
2136 * This command reads a specified object's record in a device's filesystem, 2615 * This command reads a specified object's record in a device's filesystem,
2137 * or the records of all objects belonging to a specified folder (association). 2616 * or the records of all objects belonging to a specified folder (association).
2138 * 2617 *
2139 * params: PTPParams* 2618 * params: PTPParams*
2140 * uint32_t store - StorageID, 2619 * uint32_t store - StorageID,
(...skipping 10 matching lines...) Expand all
2151 * Return values: Some PTP_RC_* code. 2630 * Return values: Some PTP_RC_* code.
2152 * PTPCANONFolderEntry** entries - the pointer to the folder entry array 2631 * PTPCANONFolderEntry** entries - the pointer to the folder entry array
2153 * uint32_t* entnum - the number of elements of the array 2632 * uint32_t* entnum - the number of elements of the array
2154 * 2633 *
2155 **/ 2634 **/
2156 uint16_t 2635 uint16_t
2157 ptp_canon_getobjectinfo (PTPParams* params, uint32_t store, uint32_t p2, 2636 ptp_canon_getobjectinfo (PTPParams* params, uint32_t store, uint32_t p2,
2158 uint32_t parent, uint32_t handle, 2637 uint32_t parent, uint32_t handle,
2159 PTPCANONFolderEntry** entries, uint32_t* entnum) 2638 PTPCANONFolderEntry** entries, uint32_t* entnum)
2160 { 2639 {
2161 » uint16_t ret; 2640 » PTPContainer» ptp;
2162 » PTPContainer ptp; 2641 » uint16_t» ret;
2163 » unsigned char *data = NULL; 2642 » unsigned char» *data;
2164 » unsigned int len; 2643 » unsigned int» i;
2165 2644
2166 » PTP_CNT_INIT(ptp); 2645 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetObjectInfoEx, store, p2, parent, handl e);
2167 » ptp.Code=PTP_OC_CANON_GetObjectInfoEx; 2646 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, NULL);
2168 » ptp.Param1=store; 2647 » if (ret != PTP_RC_OK)
2169 » ptp.Param2=p2; 2648 » » goto exit;
2170 » ptp.Param3=parent; 2649
2171 » ptp.Param4=handle; 2650 » *entnum=ptp.Param1;
2172 » ptp.Nparam=4; 2651 » *entries=calloc(*entnum, sizeof(PTPCANONFolderEntry));
2173 » len=0; 2652 » if (*entries==NULL) {
2174 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len); 2653 » » ret=PTP_RC_GeneralError;
2175 » if (ret == PTP_RC_OK) { 2654 » » goto exit;
2176 » » int i; 2655 » }
2177 » » *entnum=ptp.Param1; 2656 » for(i=0; i<(*entnum); i++)
2178 » » *entries=calloc(*entnum, sizeof(PTPCANONFolderEntry)); 2657 » » ptp_unpack_Canon_FE(params,
2179 » » if (*entries!=NULL) { 2658 » » » » data+i*PTP_CANON_FolderEntryLen,
2180 » » » for(i=0; i<(*entnum); i++) 2659 » » » » &((*entries)[i]) );
2181 » » » » ptp_unpack_Canon_FE(params, 2660
2182 » » » » » data+i*PTP_CANON_FolderEntryLen, 2661 exit:
2183 » » » » » &((*entries)[i]) ); 2662 » free (data);
2184 » » } else {
2185 » » » ret=PTP_ERROR_IO; /* Cannot allocate memory */
2186 » » }
2187 » }
2188 » free(data);
2189 return ret; 2663 return ret;
2190 } 2664 }
2191 2665
2192 /** 2666 /**
2193 * ptp_canon_get_objecthandle_by_name: 2667 * ptp_canon_get_objecthandle_by_name:
2194 * 2668 *
2195 * This command looks up the specified object on the camera. 2669 * This command looks up the specified object on the camera.
2196 * 2670 *
2197 * Format is "A:\\PATH". 2671 * Format is "A:\\PATH".
2198 * 2672 *
2199 * The 'A' is the VolumeLabel from GetStorageInfo, 2673 * The 'A' is the VolumeLabel from GetStorageInfo,
2200 * my IXUS has "A" for the card and "V" for internal memory. 2674 * my IXUS has "A" for the card and "V" for internal memory.
2201 * 2675 *
2202 * params: PTPParams* 2676 * params: PTPParams*
2203 * char* name - path name 2677 * char* name - path name
2204 * 2678 *
2205 * Return values: Some PTP_RC_* code. 2679 * Return values: Some PTP_RC_* code.
2206 * uint32_t *oid - PTP object id. 2680 * uint32_t *oid - PTP object id.
2207 * 2681 *
2208 **/ 2682 **/
2209 uint16_t 2683 uint16_t
2210 ptp_canon_get_objecthandle_by_name (PTPParams* params, char* name, uint32_t* obj ectid) 2684 ptp_canon_get_objecthandle_by_name (PTPParams* params, char* name, uint32_t* obj ectid)
2211 { 2685 {
2212 » uint16_t ret; 2686 » PTPContainer» ptp;
2213 » PTPContainer ptp; 2687 » uint16_t» ret;
2214 » unsigned char *data = NULL; 2688 » unsigned char» *data;
2215 » uint8_t len; 2689 » uint8_t»» len = 0;
2216 2690
2217 » PTP_CNT_INIT (ptp); 2691 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetObjectHandleByName);
2218 » ptp.Code=PTP_OC_CANON_GetObjectHandleByName;
2219 » ptp.Nparam=0;
2220 » len=0;
2221 data = malloc (2*(strlen(name)+1)+2); 2692 data = malloc (2*(strlen(name)+1)+2);
2693 if (!data) return PTP_RC_GeneralError;
2222 memset (data, 0, 2*(strlen(name)+1)+2); 2694 memset (data, 0, 2*(strlen(name)+1)+2);
2223 ptp_pack_string (params, name, data, 0, &len); 2695 ptp_pack_string (params, name, data, 0, &len);
2224 ret=ptp_transaction (params, &ptp, PTP_DP_SENDDATA, (len+1)*2+1, &data, NULL); 2696 ret=ptp_transaction (params, &ptp, PTP_DP_SENDDATA, (len+1)*2+1, &data, NULL);
2225 free (data); 2697 free (data);
2226 *objectid = ptp.Param1; 2698 *objectid = ptp.Param1;
2227 return ret; 2699 return ret;
2228 } 2700 }
2229 2701
2230 /** 2702 /**
2231 * ptp_canon_get_customize_data: 2703 * ptp_canon_get_customize_data:
2232 * 2704 *
2233 * This command downloads the specified theme slot, including jpegs 2705 * This command downloads the specified theme slot, including jpegs
2234 * and wav files. 2706 * and wav files.
2235 * 2707 *
2236 * params: PTPParams* 2708 * params: PTPParams*
2237 * uint32_t themenr - nr of theme 2709 * uint32_t themenr - nr of theme
2238 * 2710 *
2239 * Return values: Some PTP_RC_* code. 2711 * Return values: Some PTP_RC_* code.
2240 * unsigned char **data - pointer to data pointer 2712 * unsigned char **data - pointer to data pointer
2241 * unsigned int *size - size of data returned 2713 * unsigned int *size - size of data returned
2242 * 2714 *
2243 **/ 2715 **/
2244 uint16_t 2716 uint16_t
2245 ptp_canon_get_customize_data (PTPParams* params, uint32_t themenr, 2717 ptp_canon_get_customize_data (PTPParams* params, uint32_t themenr,
2246 unsigned char **data, unsigned int *size) 2718 unsigned char **data, unsigned int *size)
2247 { 2719 {
2248 PTPContainer ptp; 2720 PTPContainer ptp;
2249 2721
2250 » *data = NULL; 2722 » PTP_CNT_INIT(ptp, PTP_OC_CANON_GetCustomizeData, themenr);
2723 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2724 }
2725
2726
2727 uint16_t
2728 ptp_nikon_curve_download (PTPParams* params, unsigned char **data, unsigned int *size)
2729 {
2730 » PTPContainer ptp;
2731
2732 » PTP_CNT_INIT(ptp, PTP_OC_NIKON_CurveDownload);
2733 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2734 }
2735
2736 /**
2737 * ptp_sony_sdioconnect:
2738 *
2739 * This changes modes of the camera
2740 *
2741 * params:» PTPParams*
2742 *
2743 * Return values: Some PTP_RC_* code.
2744 *
2745 **/
2746 uint16_t
2747 ptp_sony_sdioconnect (PTPParams* params, uint32_t p1, uint32_t p2, uint32_t p3)
2748 {
2749 » PTPContainer» ptp;
2750 » unsigned char» *data;
2751
2752 » PTP_CNT_INIT(ptp, PTP_OC_SONY_SDIOConnect, p1, p2, p3);
2753 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, NUL L));
2754 » free (data);
2755 » return PTP_RC_OK;
2756 }
2757 /**
2758 * ptp_sony_get_vendorpropcodes:
2759 *
2760 * This command downloads the vendor specific property codes.
2761 *
2762 * params:» PTPParams*
2763 *
2764 * Return values: Some PTP_RC_* code.
2765 * unsigned char **data - pointer to data pointer
2766 * unsigned int *size - size of data returned
2767 *
2768 **/
2769 uint16_t
2770 ptp_sony_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size)
2771 {
2772 » PTPContainer» ptp;
2773 » unsigned char» *xdata;
2774 » unsigned int » xsize, psize1 = 0, psize2 = 0;
2775 » uint16_t» *props1 = NULL,*props2 = NULL;
2776
2777 » *props = NULL;
2251 *size = 0; 2778 *size = 0;
2252 » PTP_CNT_INIT(ptp); 2779 » PTP_CNT_INIT(ptp, PTP_OC_SONY_GetSDIOGetExtDeviceInfo, 0xc8 /* unclear * /);
2253 » ptp.Code» = PTP_OC_CANON_GetCustomizeData; 2780 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &xdata, &x size));
2254 » ptp.Param1» = themenr; 2781 » if (xsize == 0) {
2255 » ptp.Nparam» = 1; 2782 » » ptp_debug (params, "No special operations sent?");
2256 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 2783 » » return PTP_RC_OK;
2257 } 2784 » }
2258 2785
2259 2786 » psize1 = ptp_unpack_uint16_t_array (params, xdata+2, 0, xsize, &props1);
2260 uint16_t 2787 » ptp_debug (params, "xsize %d, got size %d\n", xsize, psize1*2 + 2 + 4);
2261 ptp_nikon_curve_download (PTPParams* params, unsigned char **data, unsigned int *size) { 2788 » if (psize1*2 + 2 + 4 < xsize) {
2262 » PTPContainer ptp; 2789 » » psize2 = ptp_unpack_uint16_t_array(params,xdata+2+psize1*2+4, 0, xsize, &props2);
2263 » *data = NULL; 2790 » }
2264 » *size = 0; 2791 » *size = psize1+psize2;
2265 » PTP_CNT_INIT(ptp); 2792 » *props = malloc((psize1+psize2)*sizeof(uint16_t));
2266 » ptp.Code» = PTP_OC_NIKON_CurveDownload; 2793 » memcpy (*props, props1, psize1*sizeof(uint16_t));
2267 » ptp.Nparam» = 0; 2794 » memcpy ((*props)+psize1, props2, psize2*sizeof(uint16_t));
2268 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 2795 » free (props1);
2269 } 2796 » free (props2);
2270 2797 » free (xdata);
2271 /** 2798 » return PTP_RC_OK;
2272 * ptp_canon_get_vendorpropcodes: 2799 }
2800
2801 uint16_t
2802 ptp_sony_getdevicepropdesc (PTPParams* params, uint16_t propcode, PTPDevicePropD esc *dpd)
2803 {
2804 » PTPContainer» ptp;
2805 » unsigned char» *data;
2806 » unsigned int » size, len = 0;
2807 » uint16_t» ret;
2808
2809 » PTP_CNT_INIT(ptp, PTP_OC_SONY_GetDevicePropdesc, propcode);
2810 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2811 » /* first 16 bit is 0xc8 0x00, then an array of 16 bit PTP ids */
2812 » ret = ptp_unpack_Sony_DPD(params,data,dpd,size,&len) ? PTP_RC_OK : PTP_R C_GeneralError;
2813 » free (data);
2814 » return ret;
2815 }
2816
2817 uint16_t
2818 ptp_sony_getalldevicepropdesc (PTPParams* params)
2819 {
2820 » PTPContainer» » ptp;
2821 » unsigned char» » *data, *dpddata;
2822 » unsigned int» » size, readlen;
2823 » PTPDevicePropDesc» dpd;
2824
2825 » PTP_CNT_INIT(ptp, PTP_OC_SONY_GetAllDevicePropData);
2826 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2827 » dpddata = data+8; /* nr of entries 32bit, 0 32bit */
2828 » size -= 8;
2829 » while (size>0) {
2830 » » unsigned int» i;
2831 » » uint16_t» propcode;
2832
2833 » » if (!ptp_unpack_Sony_DPD (params, dpddata, &dpd, size, &readlen) )
2834 » » » break;
2835
2836 » » propcode = dpd.DevicePropertyCode;
2837
2838 » » for (i=0;i<params->nrofdeviceproperties;i++)
2839 » » » if (params->deviceproperties[i].desc.DevicePropertyCode == propcode)
2840 » » » » break;
2841
2842 » » if (i == params->nrofdeviceproperties) {
2843 » » » params->deviceproperties = realloc(params->devicepropert ies,(i+1)*sizeof(params->deviceproperties[0]));
2844 » » » memset(&params->deviceproperties[i],0,sizeof(params->dev iceproperties[0]));
2845 » » » params->nrofdeviceproperties++;
2846 » » } else {
2847 » » » ptp_free_devicepropdesc (&params->deviceproperties[i].de sc);
2848 » » }
2849 » » params->deviceproperties[i].desc = dpd;
2850 #if 0
2851 » » ptp_debug (params, "dpd.DevicePropertyCode %04x, readlen %d, get set %d", dpd.DevicePropertyCode, readlen, dpd.GetSet);
2852 » » switch (dpd.DataType) {
2853 » » case PTP_DTC_INT8:
2854 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.i8, d pd.CurrentValue.i8);
2855 » » » break;
2856 » » case PTP_DTC_UINT8:
2857 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.u8, d pd.CurrentValue.u8);
2858 » » » break;
2859 » » case PTP_DTC_UINT16:
2860 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.u16, dpd.CurrentValue.u16);
2861 » » » break;
2862 » » case PTP_DTC_INT16:
2863 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.i16, dpd.CurrentValue.i16);
2864 » » » break;
2865 » » case PTP_DTC_INT32:
2866 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.i32, dpd.CurrentValue.i32);
2867 » » » break;
2868 » » case PTP_DTC_UINT32:
2869 » » » ptp_debug (params, "value %d/%x", dpd.CurrentValue.u32, dpd.CurrentValue.u32);
2870 » » » break;
2871 » » default:
2872 » » » ptp_debug (params, "unknown type %x", dpd.DataType);
2873 » » » break;
2874 » » }
2875 #endif
2876 » » dpddata += readlen;
2877 » » size -= readlen;
2878 » }
2879 » free(data);
2880 » return PTP_RC_OK;
2881 }
2882
2883 uint16_t
2884 ptp_sony_setdevicecontrolvaluea (PTPParams* params, uint16_t propcode,
2885 » » » PTPPropertyValue *value, uint16_t datatype)
2886 {
2887 » PTPContainer» ptp;
2888 » uint16_t» ret;
2889 » unsigned char» *data;
2890 » uint32_t» size;
2891
2892 » PTP_CNT_INIT(ptp, PTP_OC_SONY_SetControlDeviceA, propcode);
2893 » size = ptp_pack_DPV(params, value, &data, datatype);
2894 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
2895 » free(data);
2896 » return ret;
2897 }
2898
2899 uint16_t
2900 ptp_sony_setdevicecontrolvalueb (PTPParams* params, uint16_t propcode,
2901 » » » PTPPropertyValue *value, uint16_t datatype)
2902 {
2903 » PTPContainer» ptp;
2904 » uint16_t» ret;
2905 » unsigned char» *data;
2906 » uint32_t» size;
2907
2908 » PTP_CNT_INIT(ptp, PTP_OC_SONY_SetControlDeviceB, propcode);
2909 » size = ptp_pack_DPV(params, value, &data , datatype);
2910 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
2911 » free(data);
2912 » return ret;
2913 }
2914
2915 uint16_t
2916 ptp_sony_9280 (PTPParams* params, uint32_t param1,
2917 » uint32_t additional, uint32_t data2, uint32_t data3, uint32_t data4, uin t8_t x, uint8_t y)
2918 {
2919 » PTPContainer» ptp;
2920 » unsigned char » buf[18];
2921 » unsigned char» *buffer;
2922
2923 » PTP_CNT_INIT(ptp, 0x9280, param1);
2924
2925 » if ((additional != 0) && (additional != 2))
2926 » » return PTP_RC_GeneralError;
2927
2928 » htod32a(&buf[0], additional);
2929 » htod32a(&buf[4], data2);
2930 » htod32a(&buf[8], data3);
2931 » htod32a(&buf[12], data4);
2932
2933 » /* only sent in the case where additional is 2 */
2934 » buf[16]= x; buf[17]= y;
2935
2936 » buffer=buf;
2937 » return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, 16+additional, &bu ffer, NULL);
2938 }
2939
2940 uint16_t
2941 ptp_sony_9281 (PTPParams* params, uint32_t param1) {
2942 » PTPContainer» ptp;
2943 » unsigned int» size = 0;
2944 » unsigned char» *buffer = NULL;
2945 » uint16_t» ret;
2946
2947 » PTP_CNT_INIT(ptp, 0x9281, param1);
2948 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &buffer, &size);
2949 » free (buffer);
2950 » return ret;
2951 }
2952
2953 /**
2954 * ptp_generic_getdevicepropdesc:
2955 *
2956 * This command gets a propertydesc.
2957 * If a vendor specific property desc query is available, it uses that.
2958 * If not, it falls back to the generic PTP getdevicepropdesc.
2959 *
2960 * params:» PTPParams*
2961 * uint16_t propcode
2962 * PTPDevicePropDesc *dpd
2963 *
2964 * Return values: Some PTP_RC_* code.
2965 *
2966 **/
2967 /* Cache time in seconds. Should perhaps be more granular... */
2968 #define CACHETIME 2
2969
2970 uint16_t
2971 ptp_generic_getdevicepropdesc (PTPParams *params, uint16_t propcode, PTPDevicePr opDesc *dpd)
2972 {
2973 » unsigned int» i;
2974 » time_t» » now;
2975
2976 » for (i=0;i<params->nrofdeviceproperties;i++)
2977 » » if (params->deviceproperties[i].desc.DevicePropertyCode == propc ode)
2978 » » » break;
2979 » if (i == params->nrofdeviceproperties) {
2980 » » params->deviceproperties = realloc(params->deviceproperties,(i+1 )*sizeof(params->deviceproperties[0]));
2981 » » memset(&params->deviceproperties[i],0,sizeof(params->deviceprope rties[0]));
2982 » » params->nrofdeviceproperties++;
2983 » }
2984
2985 » if (params->deviceproperties[i].desc.DataType != PTP_DTC_UNDEF) {
2986 » » time(&now);
2987 » » if ((now - params->deviceproperties[i].timestamp) <= CACHETIME) {
2988 » » » duplicate_DevicePropDesc(&params->deviceproperties[i].de sc, dpd);
2989 » » » return PTP_RC_OK;
2990 » » }
2991 » » /* free cached entry as we will refetch it. */
2992 » » ptp_free_devicepropdesc (&params->deviceproperties[i].desc);
2993 » }
2994
2995 » if (» (params->deviceinfo.VendorExtensionID == PTP_VENDOR_SONY) &&
2996 » » ptp_operation_issupported(params, PTP_OC_SONY_GetAllDevicePropDa ta)
2997 » ) {
2998 » » CHECK_PTP_RC(ptp_sony_getalldevicepropdesc (params));
2999
3000 » » for (i=0;i<params->nrofdeviceproperties;i++)
3001 » » » if (params->deviceproperties[i].desc.DevicePropertyCode == propcode)
3002 » » » » break;
3003 » » if (i == params->nrofdeviceproperties) {
3004 » » » ptp_debug (params, "property 0x%04x not found?\n", propc ode);
3005 » » » return PTP_RC_GeneralError;
3006 » » }
3007 » » time(&now);
3008 » » params->deviceproperties[i].timestamp = now;
3009 » » duplicate_DevicePropDesc(&params->deviceproperties[i].desc, dpd) ;
3010 » » return PTP_RC_OK;
3011 » }
3012 » if (» (params->deviceinfo.VendorExtensionID == PTP_VENDOR_SONY) &&
3013 » » ptp_operation_issupported(params, PTP_OC_SONY_GetDevicePropdesc)
3014 » ) {
3015 » » CHECK_PTP_RC(ptp_sony_getdevicepropdesc (params, propcode, &para ms->deviceproperties[i].desc));
3016
3017 » » time(&now);
3018 » » params->deviceproperties[i].timestamp = now;
3019 » » duplicate_DevicePropDesc(&params->deviceproperties[i].desc, dpd) ;
3020 » » return PTP_RC_OK;
3021 » }
3022
3023
3024 » if (ptp_operation_issupported(params, PTP_OC_GetDevicePropDesc)) {
3025 » » CHECK_PTP_RC(ptp_getdevicepropdesc (params, propcode, &params->d eviceproperties[i].desc));
3026
3027 » » time(&now);
3028 » » params->deviceproperties[i].timestamp = now;
3029 » » duplicate_DevicePropDesc(&params->deviceproperties[i].desc, dpd) ;
3030 » » return PTP_RC_OK;
3031 » }
3032
3033 » return PTP_RC_OK;
3034 }
3035
3036 /**
3037 * ptp_generic_setdevicepropvalue:
3038 *
3039 * This command sets a property value, device specific.
3040 *
3041 * params:» PTPParams*
3042 * uint16_t propcode
3043 * PTPDevicePropertyValue *value
3044 * uint16_t datatype
3045 *
3046 * Return values: Some PTP_RC_* code.
3047 *
3048 **/
3049 uint16_t
3050 ptp_generic_setdevicepropvalue (PTPParams* params, uint16_t propcode,
3051 » PTPPropertyValue *value, uint16_t datatype)
3052 {
3053 » unsigned int i;
3054
3055 » /* reset the cache entry */
3056 » for (i=0;i<params->nrofdeviceproperties;i++)
3057 » » if (params->deviceproperties[i].desc.DevicePropertyCode == propc ode)
3058 » » » break;
3059 » if (i != params->nrofdeviceproperties)
3060 » » params->deviceproperties[i].timestamp = 0;
3061
3062 » /* FIXME: change the cache? hmm */
3063 » /* this works for some methods, but not for all */
3064 » if (» (params->deviceinfo.VendorExtensionID == PTP_VENDOR_SONY) &&
3065 » » ptp_operation_issupported(params, PTP_OC_SONY_SetControlDeviceA)
3066 » )
3067 » » return ptp_sony_setdevicecontrolvaluea (params, propcode, value, datatype);
3068 » return ptp_setdevicepropvalue (params, propcode, value, datatype);
3069 }
3070
3071 /**
3072 * ptp_nikon_get_vendorpropcodes:
2273 * 3073 *
2274 * This command downloads the vendor specific property codes. 3074 * This command downloads the vendor specific property codes.
2275 * 3075 *
2276 * params: PTPParams* 3076 * params: PTPParams*
2277 * 3077 *
2278 * Return values: Some PTP_RC_* code. 3078 * Return values: Some PTP_RC_* code.
2279 * unsigned char **data - pointer to data pointer 3079 * unsigned char **data - pointer to data pointer
2280 * unsigned int *size - size of data returned 3080 * unsigned int *size - size of data returned
2281 * 3081 *
2282 **/ 3082 **/
2283 uint16_t 3083 uint16_t
2284 ptp_nikon_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size) { 3084 ptp_nikon_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size)
3085 {
2285 PTPContainer ptp; 3086 PTPContainer ptp;
2286 » uint16_t» ret; 3087 » unsigned char» *data = NULL;
2287 » unsigned char» *xdata = NULL; 3088 » unsigned int» xsize = 0;
2288 » unsigned int » xsize;
2289 3089
2290 *props = NULL; 3090 *props = NULL;
2291 *size = 0; 3091 *size = 0;
2292 » PTP_CNT_INIT(ptp); 3092 » PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetVendorPropCodes);
2293 » ptp.Code» = PTP_OC_NIKON_GetVendorPropCodes; 3093 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &xs ize));
2294 » ptp.Nparam» = 0; 3094 » *size = ptp_unpack_uint16_t_array(params,data,0,xsize,props);
2295 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &xdata, &xsize); 3095 » free (data);
2296 » if (ret == PTP_RC_OK) 3096 » return PTP_RC_OK;
2297 » *size = ptp_unpack_uint16_t_array(params,xdata,0,props);
2298 » free (xdata);
2299 » return ret;
2300 } 3097 }
2301 3098
2302 uint16_t 3099 uint16_t
2303 ptp_nikon_getfileinfoinblock ( PTPParams* params, 3100 ptp_nikon_getfileinfoinblock ( PTPParams* params,
2304 uint32_t p1, uint32_t p2, uint32_t p3, 3101 uint32_t p1, uint32_t p2, uint32_t p3,
2305 unsigned char **data, unsigned int *size 3102 unsigned char **data, unsigned int *size
2306 ) { 3103 ) {
2307 PTPContainer ptp; 3104 PTPContainer ptp;
2308 » *data = NULL; 3105
2309 » *size = 0; 3106 » PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetFileInfoInBlock, p1, p2, p3);
2310 » PTP_CNT_INIT(ptp);
2311 » ptp.Code» = PTP_OC_NIKON_GetFileInfoInBlock;
2312 » ptp.Nparam» = 3;
2313 » ptp.Param1» = p1;
2314 » ptp.Param2» = p2;
2315 » ptp.Param3» = p3;
2316 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 3107 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2317 } 3108 }
2318 3109
2319 /** 3110 /**
2320 * ptp_nikon_get_liveview_image: 3111 * ptp_nikon_get_liveview_image:
2321 * 3112 *
2322 * This command gets a LiveView image from newer Nikons DSLRs. 3113 * This command gets a LiveView image from newer Nikons DSLRs.
2323 * 3114 *
2324 * params: PTPParams* 3115 * params: PTPParams*
2325 * 3116 *
2326 * Return values: Some PTP_RC_* code. 3117 * Return values: Some PTP_RC_* code.
2327 * 3118 *
2328 **/ 3119 **/
2329 uint16_t 3120 uint16_t
2330 ptp_nikon_get_liveview_image (PTPParams* params, unsigned char **data, unsigned int *size) 3121 ptp_nikon_get_liveview_image (PTPParams* params, unsigned char **data, unsigned int *size)
2331 { 3122 {
2332 PTPContainer ptp; 3123 PTPContainer ptp;
2333 3124
2334 PTP_CNT_INIT(ptp); 3125 PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetLiveViewImg);
2335 ptp.Code=PTP_OC_NIKON_GetLiveViewImg;
2336 ptp.Nparam=0;
2337 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 3126 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2338 } 3127 }
2339 3128
2340 /** 3129 /**
2341 * ptp_nikon_get_preview_image: 3130 * ptp_nikon_get_preview_image:
2342 * 3131 *
2343 * This command gets a Preview image from newer Nikons DSLRs. 3132 * This command gets a Preview image from newer Nikons DSLRs.
2344 * 3133 *
2345 * params: PTPParams* 3134 * params: PTPParams*
2346 * 3135 *
2347 * Return values: Some PTP_RC_* code. 3136 * Return values: Some PTP_RC_* code.
2348 * 3137 *
2349 **/ 3138 **/
2350 uint16_t 3139 uint16_t
2351 ptp_nikon_get_preview_image (PTPParams* params, unsigned char **xdata, unsigned int *xsize, 3140 ptp_nikon_get_preview_image (PTPParams* params, unsigned char **xdata, unsigned int *xsize,
2352 uint32_t *handle) 3141 uint32_t *handle)
2353 { 3142 {
2354 PTPContainer» ptp; 3143 » PTPContainer» ptp;
2355 » uint16_t» ret; 3144
2356 3145 PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetPreviewImg);
2357 PTP_CNT_INIT(ptp); 3146
2358 ptp.Code=PTP_OC_NIKON_GetPreviewImg; 3147 » /* FIXME:
2359 ptp.Nparam=0; 3148 » * pdslrdashboard passes 3 parameters:
2360 ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, xdata, xsize); 3149 » * objectid, minimum size, maximum size
2361 » if (ret == PTP_RC_OK) { 3150 » */
2362 » » if (ptp.Nparam > 0) 3151 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, xdata, xsi ze));
2363 » » » *handle = ptp.Param1; 3152 » if (ptp.Nparam > 0)
2364 » } 3153 » » *handle = ptp.Param1;
2365 » return ret; 3154 » return PTP_RC_OK;
2366 } 3155 }
2367 3156
2368 /** 3157 /**
2369 * ptp_canon_eos_get_viewfinder_image: 3158 * ptp_canon_eos_get_viewfinder_image:
2370 * 3159 *
2371 * This command gets a Viewfinder image from newer Nikons DSLRs. 3160 * This command gets a Viewfinder image from newer Nikons DSLRs.
2372 * 3161 *
2373 * params: PTPParams* 3162 * params: PTPParams*
2374 * 3163 *
2375 * Return values: Some PTP_RC_* code. 3164 * Return values: Some PTP_RC_* code.
2376 * 3165 *
2377 **/ 3166 **/
2378 uint16_t 3167 uint16_t
2379 ptp_canon_eos_get_viewfinder_image (PTPParams* params, unsigned char **data, uns igned int *size) 3168 ptp_canon_eos_get_viewfinder_image (PTPParams* params, unsigned char **data, uns igned int *size)
2380 { 3169 {
2381 PTPContainer ptp; 3170 PTPContainer ptp;
2382 3171
2383 PTP_CNT_INIT(ptp); 3172 PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetViewFinderData, 0x00100000 /* from trace */);
2384 ptp.Code=PTP_OC_CANON_EOS_GetViewFinderData;
2385 ptp.Nparam=1;
2386 ptp.Param1=0x00100000; /* from trace */
2387 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 3173 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2388 } 3174 }
2389 3175
2390 uint16_t 3176 uint16_t
2391 ptp_canon_eos_get_viewfinder_image_handler (PTPParams* params, PTPDataHandler*ha ndler) 3177 ptp_canon_eos_get_viewfinder_image_handler (PTPParams* params, PTPDataHandler*ha ndler)
2392 { 3178 {
2393 PTPContainer ptp; 3179 PTPContainer ptp;
2394 3180
2395 PTP_CNT_INIT(ptp); 3181 PTP_CNT_INIT(ptp, PTP_OC_CANON_EOS_GetViewFinderData, 0x00100000 /* from trace */);
2396 ptp.Code=PTP_OC_CANON_EOS_GetViewFinderData;
2397 ptp.Nparam=1;
2398 ptp.Param1=0x00100000; /* from trace */
2399 return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler); 3182 return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler);
2400 } 3183 }
2401 3184
2402 /** 3185 /**
2403 * ptp_nikon_check_event: 3186 * ptp_nikon_check_event:
2404 * 3187 *
2405 * This command checks the event queue on the Nikon. 3188 * This command checks the event queue on the Nikon.
2406 * 3189 *
2407 * params: PTPParams* 3190 * params: PTPParams*
2408 * PTPUSBEventContainer **event - list of usb events. 3191 * PTPUSBEventContainer **event - list of usb events.
2409 * int *evtcnt - number of usb events in event structure. 3192 * int *evtcnt - number of usb events in event structure.
2410 * 3193 *
2411 * Return values: Some PTP_RC_* code. 3194 * Return values: Some PTP_RC_* code.
2412 * 3195 *
2413 **/ 3196 **/
2414 uint16_t 3197 uint16_t
2415 ptp_nikon_check_event (PTPParams* params, PTPContainer** event, int* evtcnt) 3198 ptp_nikon_check_event (PTPParams* params, PTPContainer** event, unsigned int* ev tcnt)
2416 { 3199 {
2417 PTPContainer ptp; 3200 » PTPContainer» ptp;
2418 » uint16_t ret; 3201 » unsigned char» *data;
2419 » unsigned char *data = NULL; 3202 » unsigned int» size;
2420 » unsigned int size = 0;
2421 3203
2422 » PTP_CNT_INIT(ptp); 3204 » PTP_CNT_INIT(ptp, PTP_OC_NIKON_CheckEvent);
2423 » ptp.Code=PTP_OC_NIKON_CheckEvent;
2424 » ptp.Nparam=0;
2425 *evtcnt = 0; 3205 *evtcnt = 0;
2426 » ret = ptp_transaction (params, &ptp, PTP_DP_GETDATA, 0, &data, &size); 3206 » CHECK_PTP_RC(ptp_transaction (params, &ptp, PTP_DP_GETDATA, 0, &data, &s ize));
2427 » if (ret == PTP_RC_OK) { 3207 » ptp_unpack_Nikon_EC (params, data, size, event, evtcnt);
2428 » » ptp_unpack_Nikon_EC (params, data, size, event, evtcnt); 3208 » free (data);
2429 » » free (data); 3209 » return PTP_RC_OK;
2430 » }
2431 » return ret;
2432 } 3210 }
2433 3211
2434 /** 3212 /**
2435 * ptp_nikon_getptpipinfo: 3213 * ptp_nikon_getptpipinfo:
2436 * 3214 *
2437 * This command gets the ptpip info data. 3215 * This command gets the ptpip info data.
2438 * 3216 *
2439 * params: PTPParams* 3217 * params: PTPParams*
2440 * unsigned char *data - data 3218 * unsigned char *data - data
2441 * unsigned int size - size of returned data 3219 * unsigned int size - size of returned data
2442 * 3220 *
2443 * Return values: Some PTP_RC_* code. 3221 * Return values: Some PTP_RC_* code.
2444 * 3222 *
2445 **/ 3223 **/
2446 uint16_t 3224 uint16_t
2447 ptp_nikon_getptpipinfo (PTPParams* params, unsigned char **data, unsigned int *s ize) 3225 ptp_nikon_getptpipinfo (PTPParams* params, unsigned char **data, unsigned int *s ize)
2448 { 3226 {
2449 PTPContainer ptp; 3227 PTPContainer ptp;
2450 3228
2451 PTP_CNT_INIT(ptp); 3229 PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetDevicePTPIPInfo);
2452 ptp.Code=PTP_OC_NIKON_GetDevicePTPIPInfo;
2453 ptp.Nparam=0;
2454 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size); 3230 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
2455 } 3231 }
2456 3232
2457 /** 3233 /**
2458 * ptp_nikon_getwifiprofilelist: 3234 * ptp_nikon_getwifiprofilelist:
2459 * 3235 *
2460 * This command gets the wifi profile list. 3236 * This command gets the wifi profile list.
2461 * 3237 *
2462 * params: PTPParams* 3238 * params: PTPParams*
2463 * 3239 *
2464 * Return values: Some PTP_RC_* code. 3240 * Return values: Some PTP_RC_* code.
2465 * 3241 *
2466 **/ 3242 **/
2467 uint16_t 3243 uint16_t
2468 ptp_nikon_getwifiprofilelist (PTPParams* params) 3244 ptp_nikon_getwifiprofilelist (PTPParams* params)
2469 { 3245 {
2470 PTPContainer ptp; 3246 » PTPContainer» ptp;
2471 » unsigned char* data; 3247 » uint16_t» ret;
2472 » unsigned int size; 3248 » unsigned char» *data;
2473 » unsigned int pos; 3249 » unsigned int» size, pos, profn, n;
2474 » unsigned int profn; 3250 » char» » *buffer;
2475 » unsigned int n; 3251 » uint8_t»» len;
2476 » char* buffer; 3252
2477 » uint8_t len; 3253 PTP_CNT_INIT(ptp, PTP_OC_NIKON_GetProfileAllData);
2478 »
2479 PTP_CNT_INIT(ptp);
2480 ptp.Code=PTP_OC_NIKON_GetProfileAllData;
2481 ptp.Nparam=0;
2482 » size = 0;
2483 » data = NULL;
2484 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze)); 3254 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2485 3255
2486 » if (size < 2) return PTP_RC_Undefined; /* FIXME: Add more precise error code */ 3256 » ret = PTP_RC_Undefined; /* FIXME: Add more precise error code */
3257
3258 » if (size < 2)
3259 » » goto exit;
2487 3260
2488 params->wifi_profiles_version = data[0]; 3261 params->wifi_profiles_version = data[0];
2489 params->wifi_profiles_number = data[1]; 3262 params->wifi_profiles_number = data[1];
2490 » if (params->wifi_profiles) 3263 » free(params->wifi_profiles);
2491 » » free(params->wifi_profiles);
2492 3264
2493 params->wifi_profiles = malloc(params->wifi_profiles_number*sizeof(PTPNI KONWifiProfile)); 3265 params->wifi_profiles = malloc(params->wifi_profiles_number*sizeof(PTPNI KONWifiProfile));
2494 memset(params->wifi_profiles, 0, params->wifi_profiles_number*sizeof(PTP NIKONWifiProfile)); 3266 memset(params->wifi_profiles, 0, params->wifi_profiles_number*sizeof(PTP NIKONWifiProfile));
2495 3267
2496 pos = 2; 3268 pos = 2;
2497 profn = 0; 3269 profn = 0;
2498 while (profn < params->wifi_profiles_number && pos < size) { 3270 while (profn < params->wifi_profiles_number && pos < size) {
2499 » » if (pos+6 >= size) return PTP_RC_Undefined; 3271 » » if (pos+6 >= size)
3272 » » » goto exit;
2500 params->wifi_profiles[profn].id = data[pos++]; 3273 params->wifi_profiles[profn].id = data[pos++];
2501 params->wifi_profiles[profn].valid = data[pos++]; 3274 params->wifi_profiles[profn].valid = data[pos++];
2502 3275
2503 n = dtoh32a(&data[pos]); 3276 n = dtoh32a(&data[pos]);
2504 pos += 4; 3277 pos += 4;
2505 » » if (pos+n+4 >= size) return PTP_RC_Undefined; 3278 » » if (pos+n+4 >= size)
3279 » » » goto exit;
2506 strncpy(params->wifi_profiles[profn].profile_name, (char*)&data[ pos], n); 3280 strncpy(params->wifi_profiles[profn].profile_name, (char*)&data[ pos], n);
2507 params->wifi_profiles[profn].profile_name[16] = '\0'; 3281 params->wifi_profiles[profn].profile_name[16] = '\0';
2508 pos += n; 3282 pos += n;
2509 3283
2510 params->wifi_profiles[profn].display_order = data[pos++]; 3284 params->wifi_profiles[profn].display_order = data[pos++];
2511 params->wifi_profiles[profn].device_type = data[pos++]; 3285 params->wifi_profiles[profn].device_type = data[pos++];
2512 params->wifi_profiles[profn].icon_type = data[pos++]; 3286 params->wifi_profiles[profn].icon_type = data[pos++];
2513 3287
2514 buffer = ptp_unpack_string(params, data, pos, &len); 3288 buffer = ptp_unpack_string(params, data, pos, &len);
2515 strncpy(params->wifi_profiles[profn].creation_date, buffer, size of(params->wifi_profiles[profn].creation_date)); 3289 strncpy(params->wifi_profiles[profn].creation_date, buffer, size of(params->wifi_profiles[profn].creation_date));
2516 free (buffer); 3290 free (buffer);
2517 pos += (len*2+1); 3291 pos += (len*2+1);
2518 » » if (pos+1 >= size) return PTP_RC_Undefined; 3292 » » if (pos+1 >= size)
3293 » » » goto exit;
2519 /* FIXME: check if it is really last usage date */ 3294 /* FIXME: check if it is really last usage date */
2520 buffer = ptp_unpack_string(params, data, pos, &len); 3295 buffer = ptp_unpack_string(params, data, pos, &len);
2521 strncpy(params->wifi_profiles[profn].lastusage_date, buffer, siz eof(params->wifi_profiles[profn].lastusage_date)); 3296 strncpy(params->wifi_profiles[profn].lastusage_date, buffer, siz eof(params->wifi_profiles[profn].lastusage_date));
2522 free (buffer); 3297 free (buffer);
2523 pos += (len*2+1); 3298 pos += (len*2+1);
2524 » » if (pos+5 >= size) return PTP_RC_Undefined; 3299 » » if (pos+5 >= size)
3300 » » » goto exit;
2525 3301
2526 n = dtoh32a(&data[pos]); 3302 n = dtoh32a(&data[pos]);
2527 pos += 4; 3303 pos += 4;
2528 » » if (pos+n >= size) return PTP_RC_Undefined; 3304 » » if (pos+n >= size)
3305 » » » goto exit;
2529 strncpy(params->wifi_profiles[profn].essid, (char*)&data[pos], n ); 3306 strncpy(params->wifi_profiles[profn].essid, (char*)&data[pos], n );
2530 params->wifi_profiles[profn].essid[32] = '\0'; 3307 params->wifi_profiles[profn].essid[32] = '\0';
2531 pos += n; 3308 pos += n;
2532 pos += 1; 3309 pos += 1;
2533 profn++; 3310 profn++;
2534 } 3311 }
2535 3312
2536 #if 0 3313 #if 0
2537 PTPNIKONWifiProfile test; 3314 PTPNIKONWifiProfile test;
2538 memset(&test, 0, sizeof(PTPNIKONWifiProfile)); 3315 memset(&test, 0, sizeof(PTPNIKONWifiProfile));
2539 strcpy(test.profile_name, "MyTest"); 3316 strcpy(test.profile_name, "MyTest");
2540 test.icon_type = 1; 3317 test.icon_type = 1;
2541 strcpy(test.essid, "nikon"); 3318 strcpy(test.essid, "nikon");
2542 test.ip_address = 10 + 11 << 16 + 11 << 24; 3319 test.ip_address = 10 + 11 << 16 + 11 << 24;
2543 test.subnet_mask = 24; 3320 test.subnet_mask = 24;
2544 test.access_mode = 1; 3321 test.access_mode = 1;
2545 test.wifi_channel = 1; 3322 test.wifi_channel = 1;
2546 test.key_nr = 1; 3323 test.key_nr = 1;
2547 3324
2548 ptp_nikon_writewifiprofile(params, &test); 3325 ptp_nikon_writewifiprofile(params, &test);
2549 #endif 3326 #endif
2550 3327 » /* everything went Ok */
2551 » return PTP_RC_OK; 3328 » ret = PTP_RC_OK;
3329 exit:
3330 » free (data);
3331 » return ret;
2552 } 3332 }
2553 3333
2554 /** 3334 /**
2555 * ptp_nikon_writewifiprofile: 3335 * ptp_nikon_writewifiprofile:
2556 * 3336 *
2557 * This command gets the ptpip info data. 3337 * This command gets the ptpip info data.
2558 * 3338 *
2559 * params: PTPParams* 3339 * params: PTPParams*
2560 * unsigned int profilenr - profile number 3340 * unsigned int profilenr - profile number
2561 * unsigned char *data - data 3341 * unsigned char *data - data
2562 * unsigned int size - size of returned data 3342 * unsigned int size - size of returned data
2563 * 3343 *
2564 * Return values: Some PTP_RC_* code. 3344 * Return values: Some PTP_RC_* code.
2565 * 3345 *
2566 **/ 3346 **/
2567 uint16_t 3347 uint16_t
2568 ptp_nikon_writewifiprofile (PTPParams* params, PTPNIKONWifiProfile* profile) 3348 ptp_nikon_writewifiprofile (PTPParams* params, PTPNIKONWifiProfile* profile)
2569 { 3349 {
2570 unsigned char guid[16];
2571
2572 PTPContainer ptp; 3350 PTPContainer ptp;
2573 unsigned char buffer[1024]; 3351 unsigned char buffer[1024];
2574 unsigned char* data = buffer; 3352 unsigned char* data = buffer;
2575 int size = 0; 3353 int size = 0;
2576 int i; 3354 int i;
2577 uint8_t len; 3355 uint8_t len;
2578 int profilenr = -1; 3356 int profilenr = -1;
2579 » 3357 » unsigned char guid[16];
3358
2580 ptp_nikon_getptpipguid(guid); 3359 ptp_nikon_getptpipguid(guid);
2581 3360
2582 if (!params->wifi_profiles) 3361 if (!params->wifi_profiles)
2583 CHECK_PTP_RC(ptp_nikon_getwifiprofilelist(params)); 3362 CHECK_PTP_RC(ptp_nikon_getwifiprofilelist(params));
2584 3363
2585 for (i = 0; i < params->wifi_profiles_number; i++) { 3364 for (i = 0; i < params->wifi_profiles_number; i++) {
2586 if (!params->wifi_profiles[i].valid) { 3365 if (!params->wifi_profiles[i].valid) {
2587 profilenr = params->wifi_profiles[i].id; 3366 profilenr = params->wifi_profiles[i].id;
2588 break; 3367 break;
2589 } 3368 }
(...skipping 14 matching lines...) Expand all
2604 strncpy((char*)&buffer[0x05], profile->profile_name, 16); 3383 strncpy((char*)&buffer[0x05], profile->profile_name, 16);
2605 3384
2606 buffer[0x16] = 0x00; /* Display order */ 3385 buffer[0x16] = 0x00; /* Display order */
2607 buffer[0x17] = profile->device_type; 3386 buffer[0x17] = profile->device_type;
2608 buffer[0x18] = profile->icon_type; 3387 buffer[0x18] = profile->icon_type;
2609 3388
2610 /* FIXME: Creation date: put a real date here */ 3389 /* FIXME: Creation date: put a real date here */
2611 ptp_pack_string(params, "19990909T090909", data, 0x19, &len); 3390 ptp_pack_string(params, "19990909T090909", data, 0x19, &len);
2612 3391
2613 /* IP parameters */ 3392 /* IP parameters */
2614 » *((unsigned int*)&buffer[0x3A]) = profile->ip_address; /* Do not reverse bytes */ 3393 » memcpy(&buffer[0x3A],&profile->ip_address,sizeof(profile->ip_address));
3394 » /**((unsigned int*)&buffer[0x3A]) = profile->ip_address; *//* Do not rev erse bytes */
2615 buffer[0x3E] = profile->subnet_mask; 3395 buffer[0x3E] = profile->subnet_mask;
2616 » *((unsigned int*)&buffer[0x3F]) = profile->gateway_address; /* Do not re verse bytes */ 3396 » memcpy(&buffer[0x3F],&profile->gateway_address,sizeof(profile->gateway_a ddress));
3397 » /**((unsigned int*)&buffer[0x3F]) = profile->gateway_address; */ /* Do n ot reverse bytes */
2617 buffer[0x43] = profile->address_mode; 3398 buffer[0x43] = profile->address_mode;
2618 3399
2619 /* Wifi parameters */ 3400 /* Wifi parameters */
2620 buffer[0x44] = profile->access_mode; 3401 buffer[0x44] = profile->access_mode;
2621 buffer[0x45] = profile->wifi_channel; 3402 buffer[0x45] = profile->wifi_channel;
2622 3403
2623 htod32a(&buffer[0x46], 33); /* essid */ 3404 htod32a(&buffer[0x46], 33); /* essid */
2624 /* 32 as third parameter, so there will always be a null-byte in the en d */ 3405 /* 32 as third parameter, so there will always be a null-byte in the en d */
2625 strncpy((char*)&buffer[0x4A], profile->essid, 32); 3406 strncpy((char*)&buffer[0x4A], profile->essid, 32);
2626 3407
(...skipping 11 matching lines...) Expand all
2638 htod16a(&buffer[0xC2], 5); /* (64-24)/8 = 5 */ 3419 htod16a(&buffer[0xC2], 5); /* (64-24)/8 = 5 */
2639 break; 3420 break;
2640 case 2: /* WEP 128bit */ 3421 case 2: /* WEP 128bit */
2641 htod16a(&buffer[0xC2], 13); /* (128-24)/8 = 13 */ 3422 htod16a(&buffer[0xC2], 13); /* (128-24)/8 = 13 */
2642 break; 3423 break;
2643 default: 3424 default:
2644 htod16a(&buffer[0xC2], 0); 3425 htod16a(&buffer[0xC2], 0);
2645 } 3426 }
2646 size = 0xC4; 3427 size = 0xC4;
2647 3428
2648 » PTP_CNT_INIT(ptp); 3429 » PTP_CNT_INIT(ptp, PTP_OC_NIKON_SendProfileData, profilenr);
2649 » ptp.Code=PTP_OC_NIKON_SendProfileData;
2650 » ptp.Nparam=1;
2651 » ptp.Param1=profilenr;
2652 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ; 3430 return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL) ;
2653 } 3431 }
2654 3432
2655 /** 3433 /**
2656 * ptp_mtp_getobjectpropssupported: 3434 * ptp_mtp_getobjectpropssupported:
2657 * 3435 *
2658 * This command gets the object properties possible from the device. 3436 * This command gets the object properties possible from the device.
2659 * 3437 *
2660 * params: PTPParams* 3438 * params: PTPParams*
2661 * uint ofc - object format code 3439 * uint ofc - object format code
2662 * unsigned int *propnum - number of elements in returned array 3440 * unsigned int *propnum - number of elements in returned array
2663 * uint16_t *props - array of supported properties 3441 * uint16_t *props - array of supported properties
2664 * 3442 *
2665 * Return values: Some PTP_RC_* code. 3443 * Return values: Some PTP_RC_* code.
2666 * 3444 *
2667 **/ 3445 **/
2668 uint16_t 3446 uint16_t
2669 ptp_mtp_getobjectpropssupported (PTPParams* params, uint16_t ofc, 3447 ptp_mtp_getobjectpropssupported (PTPParams* params, uint16_t ofc,
2670 uint32_t *propnum, uint16_t **props 3448 uint32_t *propnum, uint16_t **props
2671 ) { 3449 ) {
2672 PTPContainer ptp; 3450 » PTPContainer» ptp;
2673 » uint16_t ret; 3451 » unsigned char» *data = NULL;
2674 » unsigned char *data = NULL; 3452 » unsigned int» xsize = 0;
2675 » unsigned int size = 0; 3453
2676 3454 PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjectPropsSupported, ofc);
2677 PTP_CNT_INIT(ptp); 3455 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &xs ize));
2678 ptp.Code=PTP_OC_MTP_GetObjectPropsSupported; 3456 » *propnum=ptp_unpack_uint16_t_array (params, data, 0, xsize, props);
2679 ptp.Nparam = 1;
2680 ptp.Param1 = ofc;
2681 ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
2682 » if (ret == PTP_RC_OK)
2683 » *propnum=ptp_unpack_uint16_t_array(params,data,0,props);
2684 free(data); 3457 free(data);
2685 » return ret; 3458 » return PTP_RC_OK;
2686 } 3459 }
2687 3460
2688 /** 3461 /**
2689 * ptp_mtp_getobjectpropdesc: 3462 * ptp_mtp_getobjectpropdesc:
2690 * 3463 *
2691 * This command gets the object property description. 3464 * This command gets the object property description.
2692 * 3465 *
2693 * params: PTPParams* 3466 * params: PTPParams*
2694 * uint16_t opc - object property code 3467 * uint16_t opc - object property code
2695 * uint16_t ofc - object format code 3468 * uint16_t ofc - object format code
2696 * 3469 *
2697 * Return values: Some PTP_RC_* code. 3470 * Return values: Some PTP_RC_* code.
2698 * 3471 *
2699 **/ 3472 **/
2700 uint16_t 3473 uint16_t
2701 ptp_mtp_getobjectpropdesc ( 3474 ptp_mtp_getobjectpropdesc (
2702 PTPParams* params, uint16_t opc, uint16_t ofc, PTPObjectPropDesc *opd 3475 PTPParams* params, uint16_t opc, uint16_t ofc, PTPObjectPropDesc *opd
2703 ) { 3476 ) {
2704 PTPContainer ptp; 3477 » PTPContainer» ptp;
2705 » uint16_t ret; 3478 » unsigned char» *data;
2706 » unsigned char *data = NULL; 3479 » unsigned int» size;
2707 » unsigned int size = 0; 3480
2708 3481 PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjectPropDesc, opc, ofc);
2709 PTP_CNT_INIT(ptp); 3482 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2710 ptp.Code=PTP_OC_MTP_GetObjectPropDesc; 3483 » ptp_unpack_OPD (params, data, opd, size);
2711 ptp.Nparam = 2;
2712 ptp.Param1 = opc;
2713 ptp.Param2 = ofc;
2714 ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
2715 » if (ret == PTP_RC_OK)
2716 » » ptp_unpack_OPD (params, data, opd, size);
2717 free(data); 3484 free(data);
2718 » return ret; 3485 » return PTP_RC_OK;
2719 } 3486 }
2720 3487
2721 /** 3488 /**
2722 * ptp_mtp_getobjectpropvalue: 3489 * ptp_mtp_getobjectpropvalue:
2723 * 3490 *
2724 * This command gets the object properties of an object handle. 3491 * This command gets the object properties of an object handle.
2725 * 3492 *
2726 * params: PTPParams* 3493 * params: PTPParams*
2727 * uint32_t objectid - object format code 3494 * uint32_t objectid - object format code
2728 * uint16_t opc - object prop code 3495 * uint16_t opc - object prop code
2729 * 3496 *
2730 * Return values: Some PTP_RC_* code. 3497 * Return values: Some PTP_RC_* code.
2731 * 3498 *
2732 **/ 3499 **/
2733 uint16_t 3500 uint16_t
2734 ptp_mtp_getobjectpropvalue ( 3501 ptp_mtp_getobjectpropvalue (
2735 PTPParams* params, uint32_t oid, uint16_t opc, 3502 PTPParams* params, uint32_t oid, uint16_t opc,
2736 PTPPropertyValue *value, uint16_t datatype 3503 PTPPropertyValue *value, uint16_t datatype
2737 ) { 3504 ) {
2738 PTPContainer ptp; 3505 » PTPContainer» ptp;
2739 » uint16_t ret; 3506 » uint16_t» ret = PTP_RC_OK;
2740 » unsigned char *data = NULL; 3507 » unsigned char» *data;
2741 » unsigned int size = 0; 3508 » unsigned int» size, offset = 0;
2742 » int offset = 0;
2743 3509
2744 PTP_CNT_INIT(ptp); 3510 PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjectPropValue, oid, opc);
2745 ptp.Code=PTP_OC_MTP_GetObjectPropValue; 3511 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2746 ptp.Nparam = 2; 3512 if (!ptp_unpack_DPV(params, data, &offset, size, value, datatype)) {
2747 ptp.Param1 = oid; 3513 ptp_debug (params, "ptp_mtp_getobjectpropvalue: unpacking DPV fa iled");
2748 ptp.Param2 = opc; 3514 ret = PTP_RC_GeneralError;
2749 ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size); 3515 }
2750 » if (ret == PTP_RC_OK)
2751 » » ptp_unpack_DPV(params, data, &offset, size, value, datatype);
2752 free(data); 3516 free(data);
2753 return ret; 3517 return ret;
2754 } 3518 }
2755 3519
2756 /** 3520 /**
2757 * ptp_mtp_setobjectpropvalue: 3521 * ptp_mtp_setobjectpropvalue:
2758 * 3522 *
2759 * This command gets the object properties of an object handle. 3523 * This command gets the object properties of an object handle.
2760 * 3524 *
2761 * params: PTPParams* 3525 * params: PTPParams*
2762 * uint32_t objectid - object format code 3526 * uint32_t objectid - object format code
2763 * uint16_t opc - object prop code 3527 * uint16_t opc - object prop code
2764 * 3528 *
2765 * Return values: Some PTP_RC_* code. 3529 * Return values: Some PTP_RC_* code.
2766 * 3530 *
2767 **/ 3531 **/
2768 uint16_t 3532 uint16_t
2769 ptp_mtp_setobjectpropvalue ( 3533 ptp_mtp_setobjectpropvalue (
2770 PTPParams* params, uint32_t oid, uint16_t opc, 3534 PTPParams* params, uint32_t oid, uint16_t opc,
2771 PTPPropertyValue *value, uint16_t datatype 3535 PTPPropertyValue *value, uint16_t datatype
2772 ) { 3536 ) {
2773 PTPContainer ptp; 3537 » PTPContainer» ptp;
2774 » uint16_t ret; 3538 » uint16_t» ret;
2775 » unsigned char *data = NULL; 3539 » unsigned char» *data = NULL;
2776 » unsigned int size ; 3540 » uint32_t» size;
2777 3541
2778 PTP_CNT_INIT(ptp); 3542 PTP_CNT_INIT(ptp, PTP_OC_MTP_SetObjectPropValue, oid, opc);
2779 ptp.Code=PTP_OC_MTP_SetObjectPropValue;
2780 ptp.Nparam = 2;
2781 ptp.Param1 = oid;
2782 ptp.Param2 = opc;
2783 size = ptp_pack_DPV(params, value, &data, datatype); 3543 size = ptp_pack_DPV(params, value, &data, datatype);
2784 ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL); 3544 ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
2785 free(data); 3545 free(data);
2786 return ret; 3546 return ret;
2787 } 3547 }
2788 3548
2789 uint16_t 3549 uint16_t
2790 ptp_mtp_getobjectreferences (PTPParams* params, uint32_t handle, uint32_t** ohAr ray, uint32_t* arraylen) 3550 ptp_mtp_getobjectreferences (PTPParams* params, uint32_t handle, uint32_t** ohAr ray, uint32_t* arraylen)
2791 { 3551 {
2792 » PTPContainer ptp; 3552 » PTPContainer» ptp;
2793 » uint16_t ret; 3553 » unsigned char» *data;
2794 » unsigned char* dpv=NULL; 3554 » unsigned int» size;
2795 » unsigned int dpvlen = 0;
2796 3555
2797 » PTP_CNT_INIT(ptp); 3556 » PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjectReferences, handle);
2798 » ptp.Code=PTP_OC_MTP_GetObjectReferences; 3557 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data , &s ize));
2799 » ptp.Param1=handle; 3558 » /* Sandisk Sansa skips the DATA phase, but returns OK as response.
2800 » ptp.Nparam=1;
2801 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpv, &dpvlen);
2802 » if (ret == PTP_RC_OK) {
2803 » » /* Sandisk Sansa skips the DATA phase, but returns OK as respons e.
2804 * this will gives us a NULL here. Handle it. -Marcus */ 3559 * this will gives us a NULL here. Handle it. -Marcus */
2805 » » if ((dpv == NULL) || (dpvlen == 0)) { 3560 » if ((data == NULL) || (size == 0)) {
2806 » » » *arraylen = 0; 3561 » » *arraylen = 0;
2807 » » » *ohArray = NULL; 3562 » » *ohArray = NULL;
2808 » » } else { 3563 » } else {
2809 » » » *arraylen = ptp_unpack_uint32_t_array(params, dpv, 0, oh Array); 3564 » » *arraylen = ptp_unpack_uint32_t_array(params, data , 0, size, oh Array);
2810 » » }
2811 } 3565 }
2812 » free(dpv); 3566 » free(data);
2813 » return ret; 3567 » return PTP_RC_OK;
2814 } 3568 }
2815 3569
2816 uint16_t 3570 uint16_t
2817 ptp_mtp_setobjectreferences (PTPParams* params, uint32_t handle, uint32_t* ohArr ay, uint32_t arraylen) 3571 ptp_mtp_setobjectreferences (PTPParams* params, uint32_t handle, uint32_t* ohArr ay, uint32_t arraylen)
2818 { 3572 {
2819 » PTPContainer ptp; 3573 » PTPContainer» ptp;
2820 » uint16_t ret; 3574 » uint16_t» ret;
2821 » uint32_t size; 3575 » unsigned char» *data = NULL;
2822 » unsigned char* dpv=NULL; 3576 » uint32_t» size;
2823 3577
2824 » PTP_CNT_INIT(ptp); 3578 » PTP_CNT_INIT(ptp, PTP_OC_MTP_SetObjectReferences, handle);
2825 » ptp.Code = PTP_OC_MTP_SetObjectReferences; 3579 » size = ptp_pack_uint32_t_array(params, ohArray, arraylen, &data);
2826 » ptp.Param1 = handle; 3580 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
2827 » ptp.Nparam = 1; 3581 » free(data);
2828 » size = ptp_pack_uint32_t_array(params, ohArray, arraylen, &dpv);
2829 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, (unsigned cha r **)&dpv, NULL);
2830 » free(dpv);
2831 return ret; 3582 return ret;
2832 } 3583 }
2833 3584
2834 uint16_t 3585 uint16_t
2835 ptp_mtp_getobjectproplist (PTPParams* params, uint32_t handle, MTPProperties **p rops, int *nrofprops) 3586 ptp_mtp_getobjectproplist (PTPParams* params, uint32_t handle, MTPProperties **p rops, int *nrofprops)
2836 { 3587 {
2837 » uint16_t ret; 3588 » PTPContainer» ptp;
2838 » PTPContainer ptp; 3589 » unsigned char» *data;
2839 » unsigned char* opldata = NULL; 3590 » unsigned int» size;
2840 » unsigned int oplsize;
2841 3591
2842 » PTP_CNT_INIT(ptp); 3592 » PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjPropList, handle,
2843 » ptp.Code = PTP_OC_MTP_GetObjPropList; 3593 » » 0x00000000U, /* 0x00000000U should be "all formats" */
2844 » ptp.Param1 = handle; 3594 » » 0xFFFFFFFFU, /* 0xFFFFFFFFU should be "all properties" */
2845 » ptp.Param2 = 0x00000000U; /* 0x00000000U should be "all formats" */ 3595 » » 0x00000000U,
2846 » ptp.Param3 = 0xFFFFFFFFU; /* 0xFFFFFFFFU should be "all properties" */ 3596 » » 0xFFFFFFFFU /* means - return full tree below the Param1 h andle */
2847 » ptp.Param4 = 0x00000000U; 3597 » );
2848 » ptp.Param5 = 0xFFFFFFFFU; /* means - return full tree below the Param1 handle */ 3598 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2849 » ptp.Nparam = 5; 3599 » *nrofprops = ptp_unpack_OPL(params, data, props, size);
2850 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &opldata, &oplsiz e); 3600 » free(data);
2851 » if (ret == PTP_RC_OK) *nrofprops = ptp_unpack_OPL(params, opldata, props , oplsize); 3601 » return PTP_RC_OK;
2852 » if (opldata != NULL)
2853 » » free(opldata);
2854 » return ret;
2855 } 3602 }
2856 3603
2857 uint16_t 3604 uint16_t
2858 ptp_mtp_getobjectproplist_single (PTPParams* params, uint32_t handle, MTPPropert ies **props, int *nrofprops) 3605 ptp_mtp_getobjectproplist_single (PTPParams* params, uint32_t handle, MTPPropert ies **props, int *nrofprops)
2859 { 3606 {
2860 » uint16_t ret; 3607 » PTPContainer» ptp;
2861 » PTPContainer ptp; 3608 » unsigned char» *data;
2862 » unsigned char* opldata = NULL; 3609 » unsigned int» size;
2863 » unsigned int oplsize;
2864 3610
2865 » PTP_CNT_INIT(ptp); 3611 » PTP_CNT_INIT(ptp, PTP_OC_MTP_GetObjPropList, handle,
2866 » ptp.Code = PTP_OC_MTP_GetObjPropList; 3612 » » 0x00000000U, /* 0x00000000U should be "all formats" */
2867 » ptp.Param1 = handle; 3613 » » 0xFFFFFFFFU, /* 0xFFFFFFFFU should be "all properties" */
2868 » ptp.Param2 = 0x00000000U; /* 0x00000000U should be "all formats" */ 3614 » » 0x00000000U,
2869 » ptp.Param3 = 0xFFFFFFFFU; /* 0xFFFFFFFFU should be "all properties" */ 3615 » » 0x00000000U /* means - return single tree below the Param1 handle */
2870 » ptp.Param4 = 0x00000000U; 3616 » );
2871 » ptp.Param5 = 0x00000000U; /* means - return single tree below the Param 1 handle */ 3617 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &si ze));
2872 » ptp.Nparam = 5; 3618 » *nrofprops = ptp_unpack_OPL(params, data, props, size);
2873 » ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &opldata, &oplsiz e); 3619 » free(data);
2874 » if (ret == PTP_RC_OK) *nrofprops = ptp_unpack_OPL(params, opldata, props , oplsize); 3620 » return PTP_RC_OK;
2875 » if (opldata != NULL)
2876 » » free(opldata);
2877 » return ret;
2878 } 3621 }
2879 3622
2880 uint16_t 3623 uint16_t
2881 ptp_mtp_sendobjectproplist (PTPParams* params, uint32_t* store, uint32_t* parent handle, uint32_t* handle, 3624 ptp_mtp_sendobjectproplist (PTPParams* params, uint32_t* store, uint32_t* parent handle, uint32_t* handle,
2882 uint16_t objecttype, uint64_t objectsize, MTPPropert ies *props, int nrofprops) 3625 uint16_t objecttype, uint64_t objectsize, MTPPropert ies *props, int nrofprops)
2883 { 3626 {
2884 » uint16_t ret; 3627 » PTPContainer» ptp;
2885 » PTPContainer ptp; 3628 » uint16_t» ret;
2886 » unsigned char* opldata=NULL; 3629 » unsigned char» *data = NULL;
2887 » uint32_t oplsize; 3630 » uint32_t» size;
2888 3631
2889 » PTP_CNT_INIT(ptp); 3632 » PTP_CNT_INIT(ptp, PTP_OC_MTP_SendObjectPropList, *store, *parenthandle, (uint32_t) objecttype,
2890 » ptp.Code = PTP_OC_MTP_SendObjectPropList; 3633 » » (uint32_t) (objectsize >> 32), (uint32_t) (objectsize & 0xf fffffffU)
2891 » ptp.Param1 = *store; 3634 » );
2892 » ptp.Param2 = *parenthandle;
2893 » ptp.Param3 = (uint32_t) objecttype;
2894 » ptp.Param4 = (uint32_t) (objectsize >> 32);
2895 » ptp.Param5 = (uint32_t) (objectsize & 0xffffffffU);
2896 » ptp.Nparam = 5;
2897 3635
2898 /* Set object handle to 0 for a new object */ 3636 /* Set object handle to 0 for a new object */
2899 » oplsize = ptp_pack_OPL(params,props,nrofprops,&opldata); 3637 » size = ptp_pack_OPL(params,props,nrofprops,&data);
2900 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, oplsize, &opldata, NULL); 3638 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
2901 » free(opldata); 3639 » free(data);
2902 *store = ptp.Param1; 3640 *store = ptp.Param1;
2903 *parenthandle = ptp.Param2; 3641 *parenthandle = ptp.Param2;
2904 *handle = ptp.Param3; 3642 *handle = ptp.Param3;
2905 3643
2906 return ret; 3644 return ret;
2907 } 3645 }
2908 3646
2909 uint16_t 3647 uint16_t
2910 ptp_mtp_setobjectproplist (PTPParams* params, MTPProperties *props, int nrofprop s) 3648 ptp_mtp_setobjectproplist (PTPParams* params, MTPProperties *props, int nrofprop s)
2911 { 3649 {
2912 » uint16_t ret; 3650 » PTPContainer» ptp;
2913 » PTPContainer ptp; 3651 » unsigned char» *data = NULL;
2914 » unsigned char* opldata=NULL; 3652 » uint32_t» size;
2915 » uint32_t oplsize;
2916
2917 » PTP_CNT_INIT(ptp);
2918 » ptp.Code = PTP_OC_MTP_SetObjPropList;
2919 » ptp.Nparam = 0;
2920
2921 » oplsize = ptp_pack_OPL(params,props,nrofprops,&opldata);
2922 » ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, oplsize, &opldata, NULL);
2923 » free(opldata);
2924 3653
2925 » return ret; 3654 » PTP_CNT_INIT(ptp, PTP_OC_MTP_SetObjPropList);
3655 » size = ptp_pack_OPL(params,props,nrofprops,&data);
3656 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL));
3657 » free(data);
3658 » return PTP_RC_OK;
2926 } 3659 }
2927 3660
2928 uint16_t 3661 uint16_t
2929 ptp_mtpz_sendwmdrmpdapprequest (PTPParams* params, unsigned char *appcertmsg, ui nt32_t size) 3662 ptp_mtpz_sendwmdrmpdapprequest (PTPParams* params, unsigned char *appcertmsg, ui nt32_t size)
2930 { 3663 {
2931 PTPContainer ptp; 3664 PTPContainer ptp;
2932 3665
2933 » PTP_CNT_INIT(ptp); 3666 » PTP_CNT_INIT(ptp, PTP_OC_MTP_WMDRMPD_SendWMDRMPDAppRequest);
2934 » ptp.Code=PTP_OC_MTP_WMDRMPD_SendWMDRMPDAppRequest;
2935 return ptp_transaction (params, &ptp, PTP_DP_SENDDATA, size, &appcertmsg , NULL); 3667 return ptp_transaction (params, &ptp, PTP_DP_SENDDATA, size, &appcertmsg , NULL);
2936 } 3668 }
2937 3669
2938 uint16_t 3670 uint16_t
2939 ptp_mtpz_getwmdrmpdappresponse (PTPParams* params, unsigned char **response, uin t32_t *size) 3671 ptp_mtpz_getwmdrmpdappresponse (PTPParams* params, unsigned char **response, uin t32_t *size)
2940 { 3672 {
2941 PTPContainer ptp; 3673 PTPContainer ptp;
2942 3674
2943 » PTP_CNT_INIT(ptp); 3675 » PTP_CNT_INIT(ptp, PTP_OC_MTP_WMDRMPD_GetWMDRMPDAppResponse);
2944 » ptp.Code = PTP_OC_MTP_WMDRMPD_GetWMDRMPDAppResponse;
2945 *size = 0; 3676 *size = 0;
2946 *response = NULL; 3677 *response = NULL;
2947 return ptp_transaction (params, &ptp, PTP_DP_GETDATA, 0, response, size) ; 3678 return ptp_transaction (params, &ptp, PTP_DP_GETDATA, 0, response, size) ;
2948 } 3679 }
2949 3680
2950 /****** CHDK interface ******/ 3681 /****** CHDK interface ******/
2951 3682
2952 uint16_t 3683 uint16_t
2953 ptp_chdk_get_memory(PTPParams* params, int start, int num, unsigned char **buf ) 3684 ptp_chdk_get_memory(PTPParams* params, int start, int num, unsigned char **buf)
2954 { 3685 {
2955 PTPContainer ptp; 3686 PTPContainer ptp;
2956 3687
2957 » PTP_CNT_INIT(ptp); 3688 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_GetMemory, start, num);
2958 » ptp.Code=PTP_OC_CHDK;
2959 » ptp.Nparam=3;
2960 » ptp.Param1=PTP_CHDK_GetMemory;
2961 » ptp.Param2=start;
2962 » ptp.Param3=num;
2963 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, buf, NULL); 3689 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, buf, NULL);
2964 } 3690 }
2965 3691
3692 uint16_t
3693 ptp_chdk_set_memory_long(PTPParams* params, int addr, int val)
3694 {
3695 PTPContainer ptp;
3696 unsigned char *buf = (unsigned char *) &val; /* FIXME ... endianness? */
2966 3697
2967 uint16_t 3698 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_SetMemory, addr, 4);
2968 ptp_chdk_call(PTPParams* params, int *args, int size, int *ret) 3699 » return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, 4, &buf, NULL);
2969 {
2970 » uint16_t r;
2971 » PTPContainer ptp;
2972
2973 » PTP_CNT_INIT(ptp);
2974 » ptp.Code=PTP_OC_CHDK;
2975 » ptp.Nparam=1;
2976 » ptp.Param1=PTP_CHDK_CallFunction;
2977
2978 » /* FIXME: check int packing */
2979 » r=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size*sizeof(int), (unsi gned char **) &args, NULL);
2980 » if ( r == PTP_RC_OK )
2981 » » return r;
2982 » if ( ret )
2983 » » *ret = ptp.Param1;
2984 » return r;
2985 } 3700 }
2986 3701
2987 uint16_t 3702 uint16_t
2988 ptp_chdk_get_propcase(PTPParams* params, int start, int num, int* ints) 3703 ptp_chdk_download(PTPParams* params, char *remote_fn, PTPDataHandler *handler)
2989 { 3704 {
2990 PTPContainer ptp; 3705 PTPContainer ptp;
2991 3706
2992 » PTP_CNT_INIT(ptp); 3707 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_TempData, 0);
2993 » ptp.Code=PTP_OC_CHDK; 3708 » CHECK_PTP_RC (ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(remo te_fn), (unsigned char**)&remote_fn, NULL));
2994 » ptp.Nparam=3;
2995 » ptp.Param1=PTP_CHDK_GetPropCase;
2996 » ptp.Param2=start;
2997 » ptp.Param3=num;
2998 » /* FIXME: unpack ints correctly */
2999 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, (unsigned char** )ints, NULL);
3000 }
3001 3709
3002 uint16_t 3710 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_DownloadFile);
3003 ptp_chdk_get_paramdata(PTPParams* params, int start, int num, unsigned char **bu f) 3711 » return ptp_transaction_new (params, &ptp, PTP_DP_GETDATA, 0, handler);
3004 {
3005 » PTPContainer ptp;
3006
3007 » PTP_CNT_INIT(ptp);
3008 » ptp.Code=PTP_OC_CHDK;
3009 » ptp.Nparam=3;
3010 » ptp.Param1=PTP_CHDK_GetParamData;
3011 » ptp.Param2=start;
3012 » ptp.Param3=num;
3013 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, buf, NULL);
3014 } 3712 }
3015 3713
3016 #if 0 3714 #if 0
3017 int ptp_chdk_upload(char *local_fn, char *remote_fn, PTPParams* params, PTPDevic eInfo* deviceinfo) 3715 int ptp_chdk_upload(PTPParams* params, char *local_fn, char *remote_fn)
3018 { 3716 {
3019 uint16_t ret; 3717 uint16_t ret;
3020 PTPContainer ptp; 3718 PTPContainer ptp;
3021 char *buf = NULL; 3719 char *buf = NULL;
3022 FILE *f; 3720 FILE *f;
3023 int s,l; 3721 unsigned file_len,data_len,file_name_len;
3024 struct stat st_buf;
3025 3722
3026 PTP_CNT_INIT(ptp); 3723 PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_UploadFile);
3027 ptp.Code=PTP_OC_CHDK;
3028 ptp.Nparam=2;
3029 ptp.Param1=PTP_CHDK_UploadFile;
3030
3031 if (stat(local_fn, &st_buf)==0) ptp.Param2=st_buf.st_mtime-_timezone-_daylight ; else ptp.Param2=0;
3032 3724
3033 f = fopen(local_fn,"rb"); 3725 f = fopen(local_fn,"rb");
3034 if ( f == NULL ) 3726 if ( f == NULL )
3035 { 3727 {
3036 ptp_error(params,"could not open file \'%s\'",local_fn); 3728 ptp_error(params,"could not open file \'%s\'",local_fn);
3037 return 0; 3729 return 0;
3038 } 3730 }
3039 3731
3040
3041 fseek(f,0,SEEK_END); 3732 fseek(f,0,SEEK_END);
3042 s = ftell(f); 3733 file_len = ftell(f);
3043 fseek(f,0,SEEK_SET); 3734 fseek(f,0,SEEK_SET);
3044 3735
3045 l = strlen(remote_fn); 3736 file_name_len = strlen(remote_fn);
3046 buf = malloc(4+l+s); 3737 data_len = 4 + file_name_len + file_len;
3047 memcpy(buf,&l,4); 3738 buf = malloc(data_len);
3048 memcpy(buf+4,remote_fn,l); 3739 memcpy(buf,&file_name_len,4);
3049 fread(buf+4+l,1,s,f); 3740 memcpy(buf+4,remote_fn,file_name_len);
3741 fread(buf+4+file_name_len,1,file_len,f);
3050 3742
3051 fclose(f); 3743 fclose(f);
3052 3744
3053 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, 4+l+s, &buf); 3745 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, data_len, &buf, NULL);
3054 3746
3055 free(buf); 3747 free(buf);
3056 3748
3057 if ( ret != 0x2001 ) 3749 if ( ret != PTP_RC_OK )
3058 { 3750 {
3059 ptp_error(params,"unexpected return code 0x%x",ret); 3751 ptp_error(params,"unexpected return code 0x%x",ret);
3060 return 0; 3752 return 0;
3061 } 3753 }
3062 return 1; 3754 return 1;
3063 } 3755 }
3064 3756
3065 int ptp_chdk_download(char *remote_fn, char *local_fn, PTPParams* params, PTPDev iceInfo* deviceinfo)
3066 {
3067 uint16_t ret;
3068 PTPContainer ptp;
3069 char *buf = NULL;
3070 FILE *f;
3071
3072 PTP_CNT_INIT(ptp);
3073 ptp.Code=PTP_OC_CHDK;
3074 ptp.Nparam=1;
3075 ptp.Param1=PTP_CHDK_TempData;
3076 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(remote_fn), &remote_ fn);
3077 if ( ret != 0x2001 )
3078 {
3079 ptp_error(params,"unexpected return code 0x%x",ret);
3080 return 0;
3081 }
3082
3083 PTP_CNT_INIT(ptp);
3084 ptp.Code=PTP_OC_CHDK;
3085 ptp.Nparam=1;
3086 ptp.Param1=PTP_CHDK_DownloadFile;
3087
3088 ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &buf);
3089 if ( ret != 0x2001 )
3090 {
3091 ptp_error(params,"unexpected return code 0x%x",ret);
3092 return 0;
3093 }
3094
3095 f = fopen(local_fn,"wb");
3096 if ( f == NULL )
3097 {
3098 ptp_error(params,"could not open file \'%s\'",local_fn);
3099 free(buf);
3100 return 0;
3101 }
3102
3103 fwrite(buf,1,ptp.Param1,f);
3104 fclose(f);
3105
3106 free(buf);
3107
3108 return 1;
3109 }
3110 #endif 3757 #endif
3111 3758
3112 uint16_t 3759 /*
3113 ptp_chdk_exec_lua(PTPParams* params, char *script, uint32_t *ret) 3760 * Preliminary remote capture over USB code. Corresponding CHDK code is in the p tp-remote-capture-test
3114 { 3761 * This is under development and should not be included in builds for general di stribution
3115 » uint16_t r; 3762 */
3116 » PTPContainer ptp; 3763 /*
3117 3764 * isready: 0: not ready, lowest 2 bits: available image formats, 0x10000000: er ror
3118 » PTP_CNT_INIT(ptp); 3765 */
3119 » ptp.Code=PTP_OC_CHDK; 3766 uint16_t
3120 » ptp.Nparam=1; 3767 ptp_chdk_rcisready(PTPParams* params, int *isready, int *imgnum)
3121 » ptp.Param1=PTP_CHDK_ExecuteLUA; 3768 {
3122 » r=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(script)+1, (unsi gned char**)&script, NULL); 3769 » PTPContainer ptp;
3123 » if ( r != PTP_RC_OK ) 3770
3124 » » return r; 3771 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_RemoteCaptureIsReady);
3125 » *ret = ptp.Param1; 3772 » *isready = *imgnum = 0;
3126 » return r; 3773 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
3127 } 3774 » *isready=ptp.Param1;
3128 3775 » *imgnum=ptp.Param2;
3129 uint16_t 3776 » return PTP_RC_OK;
3130 ptp_chdk_get_script_output(PTPParams* params, char** scriptoutput) { 3777 }
3131 » PTPContainer ptp; 3778
3132 3779 uint16_t
3133 » PTP_CNT_INIT(ptp); 3780 ptp_chdk_rcgetchunk(PTPParams* params, int fmt, ptp_chdk_rc_chunk *chunk)
3134 » ptp.Code=PTP_OC_CHDK; 3781 {
3135 » ptp.Nparam=1; 3782 » PTPContainer ptp;
3136 » ptp.Param1=PTP_CHDK_GetScriptOutput; 3783
3137 » return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, (unsigned char * *)scriptoutput, NULL); 3784 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_RemoteCaptureGetData, fmt); //ge t chunk
3138 } 3785
3139 3786 » chunk->data = NULL;
3140 #if 0 3787 » chunk->size = 0;
3141 void ptp_chdk_opendir(char *dir, PTPParams* params, PTPDeviceInfo* deviceinfo){ 3788 » chunk->offset = 0;
3142 uint16_t ret; 3789 » chunk->last = 0;
3143 PTPContainer ptp; 3790 » // TODO should allow ptp_getdata_transaction to send chunks directly to file, or to mem
3144 3791 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &chunk->da ta, NULL));
3145 PTP_CNT_INIT(ptp); 3792 » chunk->size = ptp.Param1;
3146 ptp.Code=PTP_OC_CHDK; 3793 » chunk->last = (ptp.Param2 == 0);
3147 ptp.Nparam=1; 3794 » chunk->offset = ptp.Param3; //-1 for none
3148 ptp.Param1=PTP_CHDK_OpenDir; 3795 » return PTP_RC_OK;
3149 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(dir)+1, (char*)&dir) ; 3796 }
3150 if ( ret != 0x2001 ) 3797
3151 { 3798 uint16_t
3152 ptp_error(params,"unexpected return code 0x%x",ret); 3799 ptp_chdk_exec_lua(PTPParams* params, char *script, int flags, int *script_id, in t *status)
3153 return; 3800 {
3154 } 3801 » PTPContainer ptp;
3155 } 3802
3156 3803 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_ExecuteScript, PTP_CHDK_SL_LUA | flags);
3157 void ptp_chdk_closedir(PTPParams* params, PTPDeviceInfo* deviceinfo){ 3804 » *script_id = 0;
3158 uint16_t ret; 3805 » *status = 0;
3159 PTPContainer ptp; 3806 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(scrip t)+1, (unsigned char**)&script, NULL));
3160 3807 » *script_id = ptp.Param1;
3161 PTP_CNT_INIT(ptp); 3808 » *status = ptp.Param2;
3162 ptp.Code=PTP_OC_CHDK; 3809 » return PTP_RC_OK;
3163 ptp.Nparam=1; 3810 }
3164 ptp.Param1=PTP_CHDK_CloseDir; 3811
3165 ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL); 3812 uint16_t
3166 if ( ret != 0x2001 ) 3813 ptp_chdk_get_version(PTPParams* params, int *major, int *minor)
3167 { 3814 {
3168 ptp_error(params,"unexpected return code 0x%x",ret); 3815 » PTPContainer ptp;
3169 return; 3816
3170 } 3817 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_Version);
3171 } 3818 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
3172 3819 » *major = ptp.Param1;
3173 struct fileinfo* ptp_chdk_readdir(PTPParams* params, PTPDeviceInfo* deviceinfo){ 3820 » *minor = ptp.Param2;
3174 uint16_t ret; 3821 » return PTP_RC_OK;
3175 PTPContainer ptp; 3822 }
3176 char* buf=NULL; 3823
3177 static struct fileinfo fi; 3824 uint16_t
3178 3825 ptp_chdk_get_script_status(PTPParams* params, unsigned *status)
3179 PTP_CNT_INIT(ptp); 3826 {
3180 ptp.Code=PTP_OC_CHDK; 3827 » PTPContainer ptp;
3181 ptp.Nparam=1; 3828
3182 ptp.Param1=PTP_CHDK_ReadDir; 3829 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_ScriptStatus);
3183 ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &buf); 3830 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
3184 if ( ret != 0x2001 ) 3831 » *status = ptp.Param1;
3185 { 3832 » return PTP_RC_OK;
3186 ptp_error(params,"unexpected return code 0x%x",ret); 3833 }
3187 return NULL; 3834 uint16_t
3188 } 3835 ptp_chdk_get_script_support(PTPParams* params, unsigned *status)
3189 if (buf){ 3836 {
3190 memcpy(&fi, buf, sizeof(fi)); 3837 » PTPContainer ptp;
3191 free(buf); 3838
3192 } 3839 » PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_ScriptSupport);
3193 3840 » CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL) );
3194 return &fi; 3841 » *status = ptp.Param1;
3195 3842 » return PTP_RC_OK;
3196 } 3843 }
3197 3844
3198 void ptp_chdk_download_alt_end(PTPParams* params, PTPDeviceInfo* deviceinfo){ // internal use 3845 uint16_t
3199 uint16_t ret; 3846 ptp_chdk_write_script_msg(PTPParams* params, char *data, unsigned size, int targ et_script_id, int *status)
3200 PTPContainer ptp; 3847 {
3201 PTP_CNT_INIT(ptp); 3848 » PTPContainer ptp;
3202 ptp.Code=PTP_OC_CHDK; 3849
3203 ptp.Nparam=1; 3850 » // a zero length data phase appears to do bad things, camera stops respo nding to PTP
3204 ptp.Param1=PTP_CHDK_EndDownloadFile; 3851 » if(!size) {
3205 ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL); 3852 » » ptp_error(params,"zero length message not allowed");
3206 if ( ret != 0x2001 ) ptp_error(params,"unexpected return code 0x%x",ret); 3853 » » *status = 0;
3207 } 3854 » » return PTP_ERROR_BADPARAM;
3208
3209 int ptp_chdk_download_alt(char *remote_fn, char *local_fn, PTPParams* params, PT PDeviceInfo* deviceinfo)
3210 {
3211 uint16_t ret;
3212 PTPContainer ptp;
3213 char *buf = NULL;
3214 FILE *f;
3215
3216 PTP_CNT_INIT(ptp);
3217 ptp.Code=PTP_OC_CHDK;
3218 ptp.Nparam=1;
3219 ptp.Param1=PTP_CHDK_StartDownloadFile;
3220 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, strlen(remote_fn)+1, &remot e_fn);
3221 if ( ret != 0x2001 )
3222 {
3223 ptp_error(params,"unexpected return code 0x%x",ret);
3224 return 0;
3225 }
3226 f = fopen(local_fn,"wb");
3227 if ( f == NULL )
3228 {
3229 ptp_error(params,"could not open file \'%s\'",local_fn);
3230 return 0;
3231 }
3232
3233 while(1) {
3234 PTP_CNT_INIT(ptp);
3235 ptp.Code=PTP_OC_CHDK;
3236 ptp.Nparam=1;
3237 ptp.Param1=PTP_CHDK_ResumeDownloadFile;
3238 buf=NULL;
3239 ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &buf);
3240 if ( ret != 0x2001 )
3241 {
3242 ptp_error(params,"unexpected return code 0x%x",ret);
3243 ptp_chdk_download_alt_end(params, deviceinfo);
3244 fclose(f);
3245 return 0;
3246 }
3247
3248 if (ptp.Param1<=0){free(buf); break;}
3249 fwrite(buf, 1, ptp.Param1, f);
3250 free(buf);
3251 }
3252 fclose(f);
3253 ptp_chdk_download_alt_end(params, deviceinfo);
3254 return 1;
3255 }
3256 #endif
3257
3258 uint16_t
3259 ptp_chdk_get_video_settings(PTPParams* params, ptp_chdk_videosettings* vsettings )
3260 {
3261 » uint16_t ret;
3262 » PTPContainer ptp;
3263 » unsigned char* buf=NULL;
3264
3265 » PTP_CNT_INIT(ptp);
3266 » ptp.Code=PTP_OC_CHDK;
3267 » ptp.Nparam=1;
3268 » ptp.Param1=PTP_CHDK_GetVideoSettings;
3269 » ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &buf, NULL);
3270 » if ( ret != PTP_RC_OK )
3271 » » return ret;
3272 » if (buf) {
3273 » » /* FIXME: endian convert */
3274 » » memcpy(vsettings, buf, sizeof(ptp_chdk_videosettings));
3275 » » free(buf);
3276 } 3855 }
3856 PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_WriteScriptMsg, target_script_id );
3857 *status = 0;
3858 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, (unsig ned char**)&data, NULL));
3859 *status = ptp.Param1;
3860 return PTP_RC_OK;
3861 }
3862 uint16_t
3863 ptp_chdk_read_script_msg(PTPParams* params, ptp_chdk_script_msg **msg)
3864 {
3865 PTPContainer ptp;
3866 unsigned char *data;
3867
3868 PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_ReadScriptMsg);
3869
3870 *msg = NULL;
3871
3872 /* camera will always send data, otherwise getdata will cause problems * /
3873 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, NUL L));
3874
3875 /* for convenience, always allocate an extra byte and null it*/
3876 *msg = malloc(sizeof(ptp_chdk_script_msg) + ptp.Param4 + 1);
3877 (*msg)->type = ptp.Param1;
3878 (*msg)->subtype = ptp.Param2;
3879 (*msg)->script_id = ptp.Param3;
3880 (*msg)->size = ptp.Param4;
3881 memcpy((*msg)->data,data,(*msg)->size);
3882 (*msg)->data[(*msg)->size] = 0;
3883 free(data);
3884 return PTP_RC_OK;
3885 }
3886
3887 uint16_t
3888 ptp_chdk_get_live_data(PTPParams* params, unsigned flags, unsigned char **data, unsigned int *data_size)
3889 {
3890 PTPContainer ptp;
3891
3892 PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_GetDisplayData, flags);
3893 *data_size = 0;
3894 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, NULL ));
3895 *data_size = ptp.Param1;
3896 return PTP_RC_OK;
3897 }
3898
3899 uint16_t
3900 ptp_chdk_call_function(PTPParams* params, int *args, int size, int *ret)
3901 {
3902 PTPContainer ptp;
3903
3904 PTP_CNT_INIT(ptp, PTP_OC_CHDK, PTP_CHDK_CallFunction);
3905 CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size*sizeof( int), (unsigned char **) &args, NULL));
3906 if (ret)
3907 *ret = ptp.Param1;
3908 return PTP_RC_OK;
3909 }
3910
3911
3912
3913
3914 /**
3915 * Android MTP Extensions
3916 */
3917
3918 /**
3919 * ptp_android_getpartialobject64:
3920 * params: PTPParams*
3921 * handle - Object handle
3922 * offset - Offset into object
3923 * maxbytes - Maximum of bytes to read
3924 * object - pointer to data area
3925 * len - pointer to returned length
3926 *
3927 * Get object 'handle' from device and store the data in newly
3928 * allocated 'object'. Start from offset and read at most maxbytes.
3929 *
3930 * This is a 64bit offset version of the standard GetPartialObject.
3931 *
3932 * Return values: Some PTP_RC_* code.
3933 **/
3934 uint16_t
3935 ptp_android_getpartialobject64 (PTPParams* params, uint32_t handle, uint64_t off set,
3936 uint32_t maxbytes, unsigned char** object,
3937 uint32_t *len)
3938 {
3939 PTPContainer ptp;
3940
3941 PTP_CNT_INIT(ptp, PTP_OC_ANDROID_GetPartialObject64, handle, offset & 0x FFFFFFFF, offset >> 32, maxbytes);
3942 return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, len);
3943 }
3944
3945 uint16_t
3946 ptp_android_sendpartialobject (PTPParams* params, uint32_t handle, uint64_t offs et,
3947 unsigned char* object, uint32_t len)
3948 {
3949 PTPContainer ptp;
3950 uint16_t ret;
3951
3952 PTP_CNT_INIT(ptp, PTP_OC_ANDROID_SendPartialObject, handle, offset & 0xF FFFFFFF, offset >> 32, len);
3953
3954 /*
3955 * MtpServer.cpp is buggy: it uses write() without offset
3956 * rather than pwrite to send the data for data coming with
3957 * the header packet
3958 */
3959 params->split_header_data = 1;
3960 ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, len, &object, NULL);
3961 params->split_header_data = 0;
3962
3277 return ret; 3963 return ret;
3278 } 3964 }
3279 3965
3280 3966
3281
3282 /* Non PTP protocol functions */ 3967 /* Non PTP protocol functions */
3283 /* devinfo testing functions */ 3968 /* devinfo testing functions */
3284 3969
3285 int 3970 int
3286 ptp_event_issupported(PTPParams* params, uint16_t event) 3971 ptp_event_issupported(PTPParams* params, uint16_t event)
3287 { 3972 {
3288 » int i=0; 3973 » unsigned int i=0;
3289 3974
3290 for (;i<params->deviceinfo.EventsSupported_len;i++) { 3975 for (;i<params->deviceinfo.EventsSupported_len;i++) {
3291 if (params->deviceinfo.EventsSupported[i]==event) 3976 if (params->deviceinfo.EventsSupported[i]==event)
3292 return 1; 3977 return 1;
3293 } 3978 }
3294 return 0; 3979 return 0;
3295 } 3980 }
3296 3981
3297 3982
3298 int 3983 int
3299 ptp_property_issupported(PTPParams* params, uint16_t property) 3984 ptp_property_issupported(PTPParams* params, uint16_t property)
3300 { 3985 {
3301 » int i; 3986 » unsigned int i;
3302 3987
3303 for (i=0;i<params->deviceinfo.DevicePropertiesSupported_len;i++) 3988 for (i=0;i<params->deviceinfo.DevicePropertiesSupported_len;i++)
3304 if (params->deviceinfo.DevicePropertiesSupported[i]==property) 3989 if (params->deviceinfo.DevicePropertiesSupported[i]==property)
3305 return 1; 3990 return 1;
3306 return 0; 3991 return 0;
3307 } 3992 }
3308 3993
3309 /* ptp structures freeing functions */
3310 void
3311 ptp_free_devicepropvalue(uint16_t dt, PTPPropertyValue* dpd) {
3312 switch (dt) {
3313 case PTP_DTC_INT8: case PTP_DTC_UINT8:
3314 case PTP_DTC_UINT16: case PTP_DTC_INT16:
3315 case PTP_DTC_UINT32: case PTP_DTC_INT32:
3316 case PTP_DTC_UINT64: case PTP_DTC_INT64:
3317 case PTP_DTC_UINT128: case PTP_DTC_INT128:
3318 /* Nothing to free */
3319 break;
3320 case PTP_DTC_AINT8: case PTP_DTC_AUINT8:
3321 case PTP_DTC_AUINT16: case PTP_DTC_AINT16:
3322 case PTP_DTC_AUINT32: case PTP_DTC_AINT32:
3323 case PTP_DTC_AUINT64: case PTP_DTC_AINT64:
3324 case PTP_DTC_AUINT128: case PTP_DTC_AINT128:
3325 if (dpd->a.v)
3326 free(dpd->a.v);
3327 break;
3328 case PTP_DTC_STR:
3329 if (dpd->str)
3330 free(dpd->str);
3331 break;
3332 }
3333 }
3334
3335 void
3336 ptp_free_devicepropdesc(PTPDevicePropDesc* dpd)
3337 {
3338 uint16_t i;
3339
3340 ptp_free_devicepropvalue (dpd->DataType, &dpd->FactoryDefaultValue);
3341 ptp_free_devicepropvalue (dpd->DataType, &dpd->CurrentValue);
3342 switch (dpd->FormFlag) {
3343 case PTP_DPFF_Range:
3344 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.Minimu mValue);
3345 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.Maximu mValue);
3346 ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.StepSi ze);
3347 break;
3348 case PTP_DPFF_Enumeration:
3349 if (dpd->FORM.Enum.SupportedValue) {
3350 for (i=0;i<dpd->FORM.Enum.NumberOfValues;i++)
3351 ptp_free_devicepropvalue (dpd->DataType, dpd->FO RM.Enum.SupportedValue+i);
3352 free (dpd->FORM.Enum.SupportedValue);
3353 }
3354 }
3355 }
3356
3357 void
3358 ptp_free_objectpropdesc(PTPObjectPropDesc* opd)
3359 {
3360 uint16_t i;
3361
3362 ptp_free_devicepropvalue (opd->DataType, &opd->FactoryDefaultValue);
3363 switch (opd->FormFlag) {
3364 case PTP_OPFF_None:
3365 break;
3366 case PTP_OPFF_Range:
3367 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.Minimu mValue);
3368 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.Maximu mValue);
3369 ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.StepSi ze);
3370 break;
3371 case PTP_OPFF_Enumeration:
3372 if (opd->FORM.Enum.SupportedValue) {
3373 for (i=0;i<opd->FORM.Enum.NumberOfValues;i++)
3374 ptp_free_devicepropvalue (opd->DataType, opd->FO RM.Enum.SupportedValue+i);
3375 free (opd->FORM.Enum.SupportedValue);
3376 }
3377 break;
3378 case PTP_OPFF_DateTime:
3379 case PTP_OPFF_FixedLengthArray:
3380 case PTP_OPFF_RegularExpression:
3381 case PTP_OPFF_ByteArray:
3382 case PTP_OPFF_LongString:
3383 /* Ignore these presently, we cannot unpack them, so there is no thing to be freed. */
3384 break;
3385 default:
3386 fprintf (stderr, "Unknown OPFF type %d\n", opd->FormFlag);
3387 break;
3388 }
3389 }
3390
3391 void 3994 void
3392 ptp_free_objectinfo (PTPObjectInfo *oi) 3995 ptp_free_objectinfo (PTPObjectInfo *oi)
3393 { 3996 {
3394 if (!oi) return; 3997 if (!oi) return;
3395 free (oi->Filename); oi->Filename = NULL; 3998 free (oi->Filename); oi->Filename = NULL;
3396 free (oi->Keywords); oi->Keywords = NULL; 3999 free (oi->Keywords); oi->Keywords = NULL;
3397 } 4000 }
3398 4001
3399 void 4002 void
3400 ptp_free_object (PTPObject *ob) 4003 ptp_free_object (PTPObject *ob)
3401 { 4004 {
3402 » int i; 4005 » unsigned int i;
3403 if (!ob) return; 4006 if (!ob) return;
3404 4007
3405 ptp_free_objectinfo (&ob->oi); 4008 ptp_free_objectinfo (&ob->oi);
3406 for (i=0;i<ob->nrofmtpprops;i++) 4009 for (i=0;i<ob->nrofmtpprops;i++)
3407 ptp_destroy_object_prop(&ob->mtpprops[i]); 4010 ptp_destroy_object_prop(&ob->mtpprops[i]);
3408 ob->flags = 0; 4011 ob->flags = 0;
3409 } 4012 }
3410 4013
3411 const char * 4014 /* PTP error descriptions */
3412 ptp_strerror(uint16_t error) { 4015 static struct {
4016 » uint16_t rc;
4017 » uint16_t vendor;
4018 » const char *txt;
4019 } ptp_errors[] = {
4020 » {PTP_RC_Undefined,» » 0, N_("PTP Undefined Error")},
4021 » {PTP_RC_OK,» » » 0, N_("PTP OK!")},
4022 » {PTP_RC_GeneralError,» » 0, N_("PTP General Error")},
4023 » {PTP_RC_SessionNotOpen,»» 0, N_("PTP Session Not Open")},
4024 » {PTP_RC_InvalidTransactionID,» 0, N_("PTP Invalid Transaction ID")},
4025 » {PTP_RC_OperationNotSupported,» 0, N_("PTP Operation Not Supported")},
4026 » {PTP_RC_ParameterNotSupported,» 0, N_("PTP Parameter Not Supported")},
4027 » {PTP_RC_IncompleteTransfer,» 0, N_("PTP Incomplete Transfer")},
4028 » {PTP_RC_InvalidStorageId,» 0, N_("PTP Invalid Storage ID")},
4029 » {PTP_RC_InvalidObjectHandle,» 0, N_("PTP Invalid Object Handle")},
4030 » {PTP_RC_DevicePropNotSupported,»0, N_("PTP Device Prop Not Supported")},
4031 » {PTP_RC_InvalidObjectFormatCode,0, N_("PTP Invalid Object Format Code")} ,
4032 » {PTP_RC_StoreFull,» » 0, N_("PTP Store Full")},
4033 » {PTP_RC_ObjectWriteProtected,» 0, N_("PTP Object Write Protected")},
4034 » {PTP_RC_StoreReadOnly,» » 0, N_("PTP Store Read Only")},
4035 » {PTP_RC_AccessDenied,» » 0, N_("PTP Access Denied")},
4036 » {PTP_RC_NoThumbnailPresent,» 0, N_("PTP No Thumbnail Present")},
4037 » {PTP_RC_SelfTestFailed,»» 0, N_("PTP Self Test Failed")},
4038 » {PTP_RC_PartialDeletion,» 0, N_("PTP Partial Deletion")},
4039 » {PTP_RC_StoreNotAvailable,» 0, N_("PTP Store Not Available")},
4040 » {PTP_RC_SpecificationByFormatUnsupported, 0, N_("PTP Specification By Fo rmat Unsupported")},
4041 » {PTP_RC_NoValidObjectInfo,» 0, N_("PTP No Valid Object Info")},
4042 » {PTP_RC_InvalidCodeFormat,» 0, N_("PTP Invalid Code Format")},
4043 » {PTP_RC_UnknownVendorCode,» 0, N_("PTP Unknown Vendor Code")},
4044 » {PTP_RC_CaptureAlreadyTerminated, 0, N_("PTP Capture Already Terminated" )},
4045 » {PTP_RC_DeviceBusy,» » 0, N_("PTP Device Busy")},
4046 » {PTP_RC_InvalidParentObject,» 0, N_("PTP Invalid Parent Object")},
4047 » {PTP_RC_InvalidDevicePropFormat,0, N_("PTP Invalid Device Prop Format")} ,
4048 » {PTP_RC_InvalidDevicePropValue,»0, N_("PTP Invalid Device Prop Value")},
4049 » {PTP_RC_InvalidParameter,» 0, N_("PTP Invalid Parameter")},
4050 » {PTP_RC_SessionAlreadyOpened,» 0, N_("PTP Session Already Opened")},
4051 » {PTP_RC_TransactionCanceled,» 0, N_("PTP Transaction Canceled")},
4052 » {PTP_RC_SpecificationOfDestinationUnsupported, 0, N_("PTP Specification Of Destination Unsupported")},
3413 4053
3414 » int i; 4054 » {PTP_RC_EK_FilenameRequired,» PTP_VENDOR_EASTMAN_KODAK, N_("Filename R equired")},
3415 » /* PTP error descriptions */ 4055 » {PTP_RC_EK_FilenameConflicts,» PTP_VENDOR_EASTMAN_KODAK, N_("Filename C onflicts")},
3416 » static struct { 4056 » {PTP_RC_EK_FilenameInvalid,» PTP_VENDOR_EASTMAN_KODAK, N_("Filename I nvalid")},
3417 » » short n;
3418 » » const char *txt;
3419 » } ptp_errors[] = {
3420 » {PTP_RC_Undefined, » » N_("PTP: Undefined Error")},
3421 » {PTP_RC_OK, » » » N_("PTP: OK!")},
3422 » {PTP_RC_GeneralError, » » N_("PTP: General Error")},
3423 » {PTP_RC_SessionNotOpen, » N_("PTP: Session Not Open")},
3424 » {PTP_RC_InvalidTransactionID, » N_("PTP: Invalid Transaction ID")},
3425 » {PTP_RC_OperationNotSupported, »N_("PTP: Operation Not Supported")},
3426 » {PTP_RC_ParameterNotSupported, »N_("PTP: Parameter Not Supported")},
3427 » {PTP_RC_IncompleteTransfer, » N_("PTP: Incomplete Transfer")},
3428 » {PTP_RC_InvalidStorageId, » N_("PTP: Invalid Storage ID")},
3429 » {PTP_RC_InvalidObjectHandle, » N_("PTP: Invalid Object Handle")},
3430 » {PTP_RC_DevicePropNotSupported, N_("PTP: Device Prop Not Supported")},
3431 » {PTP_RC_InvalidObjectFormatCode, N_("PTP: Invalid Object Format Code")},
3432 » {PTP_RC_StoreFull, » » N_("PTP: Store Full")},
3433 » {PTP_RC_ObjectWriteProtected, » N_("PTP: Object Write Protected")},
3434 » {PTP_RC_StoreReadOnly, »» N_("PTP: Store Read Only")},
3435 » {PTP_RC_AccessDenied,» » N_("PTP: Access Denied")},
3436 » {PTP_RC_NoThumbnailPresent, » N_("PTP: No Thumbnail Present")},
3437 » {PTP_RC_SelfTestFailed, » N_("PTP: Self Test Failed")},
3438 » {PTP_RC_PartialDeletion, » N_("PTP: Partial Deletion")},
3439 » {PTP_RC_StoreNotAvailable, » N_("PTP: Store Not Available")},
3440 » {PTP_RC_SpecificationByFormatUnsupported,
3441 » » » » N_("PTP: Specification By Format Unsupported")},
3442 » {PTP_RC_NoValidObjectInfo, » N_("PTP: No Valid Object Info")},
3443 » {PTP_RC_InvalidCodeFormat, » N_("PTP: Invalid Code Format")},
3444 » {PTP_RC_UnknownVendorCode, » N_("PTP: Unknown Vendor Code")},
3445 » {PTP_RC_CaptureAlreadyTerminated,
3446 » » » » » N_("PTP: Capture Already Terminated")},
3447 » {PTP_RC_DeviceBusy, » » N_("PTP: Device Busy")},
3448 » {PTP_RC_InvalidParentObject, » N_("PTP: Invalid Parent Object")},
3449 » {PTP_RC_InvalidDevicePropFormat, N_("PTP: Invalid Device Prop Format")},
3450 » {PTP_RC_InvalidDevicePropValue, N_("PTP: Invalid Device Prop Value")},
3451 » {PTP_RC_InvalidParameter, » N_("PTP: Invalid Parameter")},
3452 » {PTP_RC_SessionAlreadyOpened, » N_("PTP: Session Already Opened")},
3453 » {PTP_RC_TransactionCanceled, » N_("PTP: Transaction Canceled")},
3454 » {PTP_RC_SpecificationOfDestinationUnsupported,
3455 » » » N_("PTP: Specification Of Destination Unsupported")},
3456 » {PTP_RC_EK_FilenameRequired,» N_("PTP: EK Filename Required")},
3457 » {PTP_RC_EK_FilenameConflicts,» N_("PTP: EK Filename Conflicts")},
3458 » {PTP_RC_EK_FilenameInvalid,» N_("PTP: EK Filename Invalid")},
3459 4057
3460 » {PTP_ERROR_IO,» » N_("PTP: I/O error")}, 4058 » {PTP_RC_NIKON_HardwareError,» » PTP_VENDOR_NIKON, N_("Hardware E rror")},
3461 » {PTP_ERROR_BADPARAM,» N_("PTP: Error: bad parameter")}, 4059 » {PTP_RC_NIKON_OutOfFocus,» » PTP_VENDOR_NIKON, N_("Out of Foc us")},
3462 » {PTP_ERROR_DATA_EXPECTED, N_("PTP: Protocol error, data expected")}, 4060 » {PTP_RC_NIKON_ChangeCameraModeFailed,» PTP_VENDOR_NIKON, N_("Change Cam era Mode Failed")},
3463 » {PTP_ERROR_RESP_EXPECTED, N_("PTP: Protocol error, response expected")}, 4061 » {PTP_RC_NIKON_InvalidStatus,» » PTP_VENDOR_NIKON, N_("Invalid St atus")},
3464 » {0, NULL} 4062 » {PTP_RC_NIKON_SetPropertyNotSupported,» PTP_VENDOR_NIKON, N_("Set Proper ty Not Supported")},
4063 » {PTP_RC_NIKON_WbResetError,» » PTP_VENDOR_NIKON, N_("Whitebalan ce Reset Error")},
4064 » {PTP_RC_NIKON_DustReferenceError,» PTP_VENDOR_NIKON, N_("Dust Refer ence Error")},
4065 » {PTP_RC_NIKON_ShutterSpeedBulb,»» PTP_VENDOR_NIKON, N_("Shutter Sp eed Bulb")},
4066 » {PTP_RC_NIKON_MirrorUpSequence,»» PTP_VENDOR_NIKON, N_("Mirror Up Sequence")},
4067 » {PTP_RC_NIKON_CameraModeNotAdjustFNumber, PTP_VENDOR_NIKON, N_("Camera M ode Not Adjust FNumber")},
4068 » {PTP_RC_NIKON_NotLiveView,» » PTP_VENDOR_NIKON, N_("Not in Liv eview")},
4069 » {PTP_RC_NIKON_MfDriveStepEnd,» » PTP_VENDOR_NIKON, N_("Mf Drive S tep End")},
4070 » {PTP_RC_NIKON_MfDriveStepInsufficiency,»PTP_VENDOR_NIKON, N_("Mf Drive S tep Insufficiency")},
4071 » {PTP_RC_NIKON_AdvancedTransferCancel,» PTP_VENDOR_NIKON, N_("Advanced T ransfer Cancel")},
4072
4073 » {PTP_RC_CANON_UNKNOWN_COMMAND,» PTP_VENDOR_CANON, N_("Unknown Command")} ,
4074 » {PTP_RC_CANON_OPERATION_REFUSED,PTP_VENDOR_CANON, N_("Operation Refused" )},
4075 » {PTP_RC_CANON_LENS_COVER,» PTP_VENDOR_CANON, N_("Lens Cover Present ")},
4076 » {PTP_RC_CANON_BATTERY_LOW,» PTP_VENDOR_CANON, N_("Battery Low")},
4077 » {PTP_RC_CANON_NOT_READY,» PTP_VENDOR_CANON, N_("Camera Not Ready") },
4078
4079 » {PTP_ERROR_TIMEOUT,» » 0, N_("PTP Timeout")},
4080 » {PTP_ERROR_CANCEL,» » 0, N_("PTP Cancel Request")},
4081 » {PTP_ERROR_BADPARAM,» » 0, N_("PTP Invalid Parameter")},
4082 » {PTP_ERROR_RESP_EXPECTED,» 0, N_("PTP Response Expected")},
4083 » {PTP_ERROR_DATA_EXPECTED,» 0, N_("PTP Data Expected")},
4084 » {PTP_ERROR_IO,» » » 0, N_("PTP I/O Error")},
4085 » {0, 0, NULL}
3465 }; 4086 };
3466 4087
3467 » for (i=0; ptp_errors[i].txt!=NULL; i++) 4088 const char *
3468 » » if (ptp_errors[i].n == error) 4089 ptp_strerror(uint16_t ret, uint16_t vendor)
4090 {
4091 » int i;
4092
4093 » for (i=0; ptp_errors[i].txt != NULL; i++)
4094 » » if ((ptp_errors[i].rc == ret) && ((ptp_errors[i].vendor == 0) || (ptp_errors[i].vendor == vendor)))
3469 return ptp_errors[i].txt; 4095 return ptp_errors[i].txt;
3470 return NULL; 4096 return NULL;
3471 } 4097 }
3472 4098
3473 void
3474 ptp_perror(PTPParams* params, uint16_t error) {
3475 const char *txt = ptp_strerror(error);
3476 if (txt != NULL)
3477 ptp_error(params, txt);
3478 }
3479
3480 const char* 4099 const char*
3481 ptp_get_property_description(PTPParams* params, uint16_t dpc) 4100 ptp_get_property_description(PTPParams* params, uint16_t dpc)
3482 { 4101 {
3483 int i; 4102 int i;
3484 /* Device Property descriptions */ 4103 /* Device Property descriptions */
3485 struct { 4104 struct {
3486 uint16_t dpc; 4105 uint16_t dpc;
3487 const char *txt; 4106 const char *txt;
3488 } ptp_device_properties[] = { 4107 } ptp_device_properties[] = {
3489 {PTP_DPC_Undefined, N_("Undefined PTP Property")}, 4108 {PTP_DPC_Undefined, N_("Undefined PTP Property")},
(...skipping 23 matching lines...) Expand all
3513 {PTP_DPC_DigitalZoom, N_("Digital Zoom")}, 4132 {PTP_DPC_DigitalZoom, N_("Digital Zoom")},
3514 {PTP_DPC_EffectMode, N_("Effect Mode")}, 4133 {PTP_DPC_EffectMode, N_("Effect Mode")},
3515 {PTP_DPC_BurstNumber, N_("Burst Number")}, 4134 {PTP_DPC_BurstNumber, N_("Burst Number")},
3516 {PTP_DPC_BurstInterval, N_("Burst Interval")}, 4135 {PTP_DPC_BurstInterval, N_("Burst Interval")},
3517 {PTP_DPC_TimelapseNumber, N_("Timelapse Number")}, 4136 {PTP_DPC_TimelapseNumber, N_("Timelapse Number")},
3518 {PTP_DPC_TimelapseInterval, N_("Timelapse Interval")}, 4137 {PTP_DPC_TimelapseInterval, N_("Timelapse Interval")},
3519 {PTP_DPC_FocusMeteringMode, N_("Focus Metering Mode")}, 4138 {PTP_DPC_FocusMeteringMode, N_("Focus Metering Mode")},
3520 {PTP_DPC_UploadURL, N_("Upload URL")}, 4139 {PTP_DPC_UploadURL, N_("Upload URL")},
3521 {PTP_DPC_Artist, N_("Artist")}, 4140 {PTP_DPC_Artist, N_("Artist")},
3522 {PTP_DPC_CopyrightInfo, N_("Copyright Info")}, 4141 {PTP_DPC_CopyrightInfo, N_("Copyright Info")},
4142 {PTP_DPC_SupportedStreams, N_("Supported Streams")},
4143 {PTP_DPC_EnabledStreams, N_("Enabled Streams")},
4144 {PTP_DPC_VideoFormat, N_("Video Format")},
4145 {PTP_DPC_VideoResolution, N_("Video Resolution")},
4146 {PTP_DPC_VideoQuality, N_("Video Quality")},
4147 {PTP_DPC_VideoFrameRate, N_("Video Framerate")},
4148 {PTP_DPC_VideoContrast, N_("Video Contrast")},
4149 {PTP_DPC_VideoBrightness, N_("Video Brightness")},
4150 {PTP_DPC_AudioFormat, N_("Audio Format")},
4151 {PTP_DPC_AudioBitrate, N_("Audio Bitrate")},
4152 {PTP_DPC_AudioSamplingRate, N_("Audio Samplingrate")},
4153 {PTP_DPC_AudioBitPerSample, N_("Audio Bits per sample")},
4154 {PTP_DPC_AudioVolume, N_("Audio Volume")},
3523 {0,NULL} 4155 {0,NULL}
3524 }; 4156 };
3525 struct { 4157 struct {
3526 uint16_t dpc; 4158 uint16_t dpc;
3527 const char *txt; 4159 const char *txt;
3528 } ptp_device_properties_EK[] = { 4160 } ptp_device_properties_EK[] = {
3529 {PTP_DPC_EK_ColorTemperature, N_("Color Temperature")}, 4161 {PTP_DPC_EK_ColorTemperature, N_("Color Temperature")},
3530 {PTP_DPC_EK_DateTimeStampFormat, 4162 {PTP_DPC_EK_DateTimeStampFormat,
3531 N_("Date Time Stamp Format")}, 4163 N_("Date Time Stamp Format")},
3532 {PTP_DPC_EK_BeepMode, N_("Beep Mode")}, 4164 {PTP_DPC_EK_BeepMode, N_("Beep Mode")},
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
3684 {PTP_DPC_NIKON_NonCPULensDataMaximumAperture, /* 0xD02f */ 4316 {PTP_DPC_NIKON_NonCPULensDataMaximumAperture, /* 0xD02f */
3685 N_("Lens Maximum Aperture (Non CPU)")}, 4317 N_("Lens Maximum Aperture (Non CPU)")},
3686 {PTP_DPC_NIKON_ShootingMode, /* 0xD030 */ 4318 {PTP_DPC_NIKON_ShootingMode, /* 0xD030 */
3687 N_("Shooting Mode")}, 4319 N_("Shooting Mode")},
3688 {PTP_DPC_NIKON_JPEG_Compression_Policy, /* 0xD031 */ 4320 {PTP_DPC_NIKON_JPEG_Compression_Policy, /* 0xD031 */
3689 N_("JPEG Compression Policy")}, 4321 N_("JPEG Compression Policy")},
3690 {PTP_DPC_NIKON_ColorSpace, /* 0xD032 */ 4322 {PTP_DPC_NIKON_ColorSpace, /* 0xD032 */
3691 N_("Color Space")}, 4323 N_("Color Space")},
3692 {PTP_DPC_NIKON_AutoDXCrop, /* 0xD033 */ 4324 {PTP_DPC_NIKON_AutoDXCrop, /* 0xD033 */
3693 N_("Auto DX Crop")}, 4325 N_("Auto DX Crop")},
4326 {PTP_DPC_NIKON_FlickerReduction, /* 0xD034 */
4327 N_("Flicker Reduction")},
4328 {PTP_DPC_NIKON_RemoteMode, /* 0xD035 */
4329 N_("Remote Mode")},
4330 {PTP_DPC_NIKON_VideoMode, /* 0xD036 */
4331 N_("Video Mode")},
4332 {PTP_DPC_NIKON_EffectMode, /* 0xD037 */
4333 N_("Effect Mode")},
3694 {PTP_DPC_NIKON_CSMMenuBankSelect, /* 0xD040 */ 4334 {PTP_DPC_NIKON_CSMMenuBankSelect, /* 0xD040 */
3695 "PTP_DPC_NIKON_CSMMenuBankSelect"}, 4335 "PTP_DPC_NIKON_CSMMenuBankSelect"},
3696 {PTP_DPC_NIKON_MenuBankNameA, /* 0xD041 */ 4336 {PTP_DPC_NIKON_MenuBankNameA, /* 0xD041 */
3697 N_("Menu Bank Name A")}, 4337 N_("Menu Bank Name A")},
3698 {PTP_DPC_NIKON_MenuBankNameB, /* 0xD042 */ 4338 {PTP_DPC_NIKON_MenuBankNameB, /* 0xD042 */
3699 N_("Menu Bank Name B")}, 4339 N_("Menu Bank Name B")},
3700 {PTP_DPC_NIKON_MenuBankNameC, /* 0xD043 */ 4340 {PTP_DPC_NIKON_MenuBankNameC, /* 0xD043 */
3701 N_("Menu Bank Name C")}, 4341 N_("Menu Bank Name C")},
3702 {PTP_DPC_NIKON_MenuBankNameD, /* 0xD044 */ 4342 {PTP_DPC_NIKON_MenuBankNameD, /* 0xD044 */
3703 N_("Menu Bank Name D")}, 4343 N_("Menu Bank Name D")},
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
3829 {PTP_DPC_NIKON_NoCFCard, /* 0xD08A */ 4469 {PTP_DPC_NIKON_NoCFCard, /* 0xD08A */
3830 N_("No CF Card Release")}, 4470 N_("No CF Card Release")},
3831 {PTP_DPC_NIKON_CenterButtonZoomRatio, /* 0xD08B */ 4471 {PTP_DPC_NIKON_CenterButtonZoomRatio, /* 0xD08B */
3832 N_("Center Button Zoom Ratio")}, 4472 N_("Center Button Zoom Ratio")},
3833 {PTP_DPC_NIKON_FunctionButton2, /* 0xD08C */ 4473 {PTP_DPC_NIKON_FunctionButton2, /* 0xD08C */
3834 N_("Function Button 2")}, 4474 N_("Function Button 2")},
3835 {PTP_DPC_NIKON_AFAreaPoint, /* 0xD08D */ 4475 {PTP_DPC_NIKON_AFAreaPoint, /* 0xD08D */
3836 N_("AF Area Point")}, 4476 N_("AF Area Point")},
3837 {PTP_DPC_NIKON_NormalAFOn, /* 0xD08E */ 4477 {PTP_DPC_NIKON_NormalAFOn, /* 0xD08E */
3838 N_("Normal AF On")}, 4478 N_("Normal AF On")},
4479 {PTP_DPC_NIKON_CleanImageSensor, /* 0xD08F */
4480 N_("Clean Image Sensor")},
3839 {PTP_DPC_NIKON_ImageCommentString, /* 0xD090 */ 4481 {PTP_DPC_NIKON_ImageCommentString, /* 0xD090 */
3840 N_("Image Comment String")}, 4482 N_("Image Comment String")},
3841 {PTP_DPC_NIKON_ImageCommentEnable, /* 0xD091 */ 4483 {PTP_DPC_NIKON_ImageCommentEnable, /* 0xD091 */
3842 N_("Image Comment Enable")}, 4484 N_("Image Comment Enable")},
3843 {PTP_DPC_NIKON_ImageRotation, /* 0xD092 */ 4485 {PTP_DPC_NIKON_ImageRotation, /* 0xD092 */
3844 N_("Image Rotation")}, 4486 N_("Image Rotation")},
3845 {PTP_DPC_NIKON_ManualSetLensNo, /* 0xD093 */ 4487 {PTP_DPC_NIKON_ManualSetLensNo, /* 0xD093 */
3846 N_("Manual Set Lens Number")}, 4488 N_("Manual Set Lens Number")},
3847 {PTP_DPC_NIKON_MovScreenSize, /* 0xD0A0 */ 4489 {PTP_DPC_NIKON_MovScreenSize, /* 0xD0A0 */
3848 N_("Movie Screen Size")}, 4490 N_("Movie Screen Size")},
3849 {PTP_DPC_NIKON_MovVoice, /* 0xD0A1 */ 4491 {PTP_DPC_NIKON_MovVoice, /* 0xD0A1 */
3850 N_("Movie Voice")}, 4492 N_("Movie Voice")},
4493 {PTP_DPC_NIKON_MovMicrophone, /* 0xD0A2 */
4494 N_("Movie Microphone")},
4495 {PTP_DPC_NIKON_MovFileSlot, /* 0xD0A3 */
4496 N_("Movie Card Slot")},
4497 {PTP_DPC_NIKON_ManualMovieSetting, /* 0xD0A6 */
4498 N_("Manual Movie Setting")},
4499 {PTP_DPC_NIKON_MovQuality, /* 0xD0A7 */
4500 N_("Movie Quality")},
4501 {PTP_DPC_NIKON_MonitorOffDelay, /* 0xD0B3 */
4502 N_("Monitor Off Delay")},
3851 {PTP_DPC_NIKON_Bracketing, /* 0xD0C0 */ 4503 {PTP_DPC_NIKON_Bracketing, /* 0xD0C0 */
3852 N_("Bracketing Enable")}, 4504 N_("Bracketing Enable")},
3853 {PTP_DPC_NIKON_AutoExposureBracketStep, /* 0xD0C1 */ 4505 {PTP_DPC_NIKON_AutoExposureBracketStep, /* 0xD0C1 */
3854 N_("Exposure Bracketing Step")}, 4506 N_("Exposure Bracketing Step")},
3855 {PTP_DPC_NIKON_AutoExposureBracketProgram, /* 0xD0C2 */ 4507 {PTP_DPC_NIKON_AutoExposureBracketProgram, /* 0xD0C2 */
3856 N_("Exposure Bracketing Program")}, 4508 N_("Exposure Bracketing Program")},
3857 {PTP_DPC_NIKON_AutoExposureBracketCount, /* 0xD0C3 */ 4509 {PTP_DPC_NIKON_AutoExposureBracketCount, /* 0xD0C3 */
3858 N_("Auto Exposure Bracket Count")}, 4510 N_("Auto Exposure Bracket Count")},
3859 {PTP_DPC_NIKON_WhiteBalanceBracketStep, N_("White Balance Bracke t Step")}, /* 0xD0C4 */ 4511 {PTP_DPC_NIKON_WhiteBalanceBracketStep, N_("White Balance Bracke t Step")}, /* 0xD0C4 */
3860 {PTP_DPC_NIKON_WhiteBalanceBracketProgram, N_("White Balance Bra cket Program")}, /* 0xD0C5 */ 4512 {PTP_DPC_NIKON_WhiteBalanceBracketProgram, N_("White Balance Bra cket Program")}, /* 0xD0C5 */
(...skipping 18 matching lines...) Expand all
3879 {PTP_DPC_NIKON_AutoOffMenu, /* 0xD0F3 */ 4531 {PTP_DPC_NIKON_AutoOffMenu, /* 0xD0F3 */
3880 N_("Auto Off Menu")}, 4532 N_("Auto Off Menu")},
3881 {PTP_DPC_NIKON_AutoOffInfo, /* 0xD0F4 */ 4533 {PTP_DPC_NIKON_AutoOffInfo, /* 0xD0F4 */
3882 N_("Auto Off Info")}, 4534 N_("Auto Off Info")},
3883 {PTP_DPC_NIKON_SelfTimerShootNum, /* 0xD0F5 */ 4535 {PTP_DPC_NIKON_SelfTimerShootNum, /* 0xD0F5 */
3884 N_("Self Timer Shot Number")}, 4536 N_("Self Timer Shot Number")},
3885 {PTP_DPC_NIKON_VignetteCtrl, /* 0xD0F7 */ 4537 {PTP_DPC_NIKON_VignetteCtrl, /* 0xD0F7 */
3886 N_("Vignette Control")}, 4538 N_("Vignette Control")},
3887 {PTP_DPC_NIKON_AutoDistortionControl, /* 0xD0F8 */ 4539 {PTP_DPC_NIKON_AutoDistortionControl, /* 0xD0F8 */
3888 N_("Auto Distortion Control")}, 4540 N_("Auto Distortion Control")},
4541 {PTP_DPC_NIKON_SceneMode, /* 0xD0F9 */
4542 N_("Scene Mode")},
3889 {PTP_DPC_NIKON_ExposureTime, /* 0xD100 */ 4543 {PTP_DPC_NIKON_ExposureTime, /* 0xD100 */
3890 N_("Nikon Exposure Time")}, 4544 N_("Nikon Exposure Time")},
3891 {PTP_DPC_NIKON_ACPower, N_("AC Power")}, /* 0xD101 */ 4545 {PTP_DPC_NIKON_ACPower, N_("AC Power")}, /* 0xD101 */
3892 {PTP_DPC_NIKON_WarningStatus, N_("Warning Status")},/* 0xD102 */ 4546 {PTP_DPC_NIKON_WarningStatus, N_("Warning Status")},/* 0xD102 */
3893 {PTP_DPC_NIKON_MaximumShots, /* 0xD103 */ 4547 {PTP_DPC_NIKON_MaximumShots, /* 0xD103 */
3894 N_("Maximum Shots")}, 4548 N_("Maximum Shots")},
3895 {PTP_DPC_NIKON_AFLockStatus, N_("AF Locked")},/* 0xD104 */ 4549 {PTP_DPC_NIKON_AFLockStatus, N_("AF Locked")},/* 0xD104 */
3896 {PTP_DPC_NIKON_AELockStatus, N_("AE Locked")},/* 0xD105 */ 4550 {PTP_DPC_NIKON_AELockStatus, N_("AE Locked")},/* 0xD105 */
3897 {PTP_DPC_NIKON_FVLockStatus, N_("FV Locked")},/* 0xD106 */ 4551 {PTP_DPC_NIKON_FVLockStatus, N_("FV Locked")},/* 0xD106 */
3898 {PTP_DPC_NIKON_AutofocusLCDTopMode2, /* 0xD107 */ 4552 {PTP_DPC_NIKON_AutofocusLCDTopMode2, /* 0xD107 */
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3954 {PTP_DPC_NIKON_BW_Sharpness, /* 0xD144 */ 4608 {PTP_DPC_NIKON_BW_Sharpness, /* 0xD144 */
3955 N_("BW Sharpness")}, 4609 N_("BW Sharpness")},
3956 {PTP_DPC_NIKON_BW_Contrast, /* 0xD145 */ 4610 {PTP_DPC_NIKON_BW_Contrast, /* 0xD145 */
3957 N_("BW Contrast")}, 4611 N_("BW Contrast")},
3958 {PTP_DPC_NIKON_BW_Setting_Type, /* 0xD146 */ 4612 {PTP_DPC_NIKON_BW_Setting_Type, /* 0xD146 */
3959 N_("BW Setting Type")}, 4613 N_("BW Setting Type")},
3960 {PTP_DPC_NIKON_Slot2SaveMode, /* 0xD148 */ 4614 {PTP_DPC_NIKON_Slot2SaveMode, /* 0xD148 */
3961 N_("Slot 2 Save Mode")}, 4615 N_("Slot 2 Save Mode")},
3962 {PTP_DPC_NIKON_RawBitMode, /* 0xD149 */ 4616 {PTP_DPC_NIKON_RawBitMode, /* 0xD149 */
3963 N_("Raw Bit Mode")}, 4617 N_("Raw Bit Mode")},
3964 » » {PTP_DPC_NIKON_ISOAutoTime,» » » /* 0xD14E */ 4618 » » {PTP_DPC_NIKON_ActiveDLighting,»» » /* 0xD14E */
3965 » » N_("ISO Auto Time")}, 4619 » » N_("Active D-Lighting")},
3966 {PTP_DPC_NIKON_FlourescentType, /* 0xD14F */ 4620 {PTP_DPC_NIKON_FlourescentType, /* 0xD14F */
3967 N_("Flourescent Type")}, 4621 N_("Flourescent Type")},
3968 {PTP_DPC_NIKON_TuneColourTemperature, /* 0xD150 */ 4622 {PTP_DPC_NIKON_TuneColourTemperature, /* 0xD150 */
3969 N_("Tune Colour Temperature")}, 4623 N_("Tune Colour Temperature")},
3970 {PTP_DPC_NIKON_TunePreset0, /* 0xD151 */ 4624 {PTP_DPC_NIKON_TunePreset0, /* 0xD151 */
3971 N_("Tune Preset 0")}, 4625 N_("Tune Preset 0")},
3972 {PTP_DPC_NIKON_TunePreset1, /* 0xD152 */ 4626 {PTP_DPC_NIKON_TunePreset1, /* 0xD152 */
3973 N_("Tune Preset 1")}, 4627 N_("Tune Preset 1")},
3974 {PTP_DPC_NIKON_TunePreset2, /* 0xD153 */ 4628 {PTP_DPC_NIKON_TunePreset2, /* 0xD153 */
3975 N_("Tune Preset 2")}, 4629 N_("Tune Preset 2")},
(...skipping 12 matching lines...) Expand all
3988 {PTP_DPC_NIKON_ImageReview, /* 0xD165 */ 4642 {PTP_DPC_NIKON_ImageReview, /* 0xD165 */
3989 N_("Image Review")}, 4643 N_("Image Review")},
3990 {PTP_DPC_NIKON_AFAreaIllumination, /* 0xD166 */ 4644 {PTP_DPC_NIKON_AFAreaIllumination, /* 0xD166 */
3991 N_("AF Area Illumination")}, 4645 N_("AF Area Illumination")},
3992 {PTP_DPC_NIKON_FlashMode, /* 0xD167 */ 4646 {PTP_DPC_NIKON_FlashMode, /* 0xD167 */
3993 N_("Flash Mode")}, 4647 N_("Flash Mode")},
3994 {PTP_DPC_NIKON_FlashCommanderMode, /* 0xD168 */ 4648 {PTP_DPC_NIKON_FlashCommanderMode, /* 0xD168 */
3995 N_("Flash Commander Mode")}, 4649 N_("Flash Commander Mode")},
3996 {PTP_DPC_NIKON_FlashSign, /* 0xD169 */ 4650 {PTP_DPC_NIKON_FlashSign, /* 0xD169 */
3997 N_("Flash Sign")}, 4651 N_("Flash Sign")},
3998 » » {PTP_DPC_NIKON_ISOAuto,»» » » /* 0xD16A */ 4652 » » {PTP_DPC_NIKON_ISO_Auto,» » » /* 0xD16A */
3999 N_("ISO Auto")}, 4653 N_("ISO Auto")},
4000 {PTP_DPC_NIKON_RemoteTimeout, /* 0xD16B */ 4654 {PTP_DPC_NIKON_RemoteTimeout, /* 0xD16B */
4001 N_("Remote Timeout")}, 4655 N_("Remote Timeout")},
4002 {PTP_DPC_NIKON_GridDisplay, /* 0xD16C */ 4656 {PTP_DPC_NIKON_GridDisplay, /* 0xD16C */
4003 N_("Viewfinder Grid Display")}, 4657 N_("Viewfinder Grid Display")},
4004 {PTP_DPC_NIKON_FlashModeManualPower, /* 0xD16D */ 4658 {PTP_DPC_NIKON_FlashModeManualPower, /* 0xD16D */
4005 N_("Flash Mode Manual Power")}, 4659 N_("Flash Mode Manual Power")},
4006 {PTP_DPC_NIKON_FlashModeCommanderPower, /* 0xD16E */ 4660 {PTP_DPC_NIKON_FlashModeCommanderPower, /* 0xD16E */
4007 N_("Flash Mode Commander Power")}, 4661 N_("Flash Mode Commander Power")},
4008 {PTP_DPC_NIKON_AutoFP, /* 0xD16F */ 4662 {PTP_DPC_NIKON_AutoFP, /* 0xD16F */
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4040 {PTP_DPC_NIKON_LiveViewStatus, /* 0xD1A2 */ 4694 {PTP_DPC_NIKON_LiveViewStatus, /* 0xD1A2 */
4041 N_("Live View Status")}, 4695 N_("Live View Status")},
4042 {PTP_DPC_NIKON_LiveViewImageZoomRatio, /* 0xD1A3 */ 4696 {PTP_DPC_NIKON_LiveViewImageZoomRatio, /* 0xD1A3 */
4043 N_("Live View Image Zoom Ratio")}, 4697 N_("Live View Image Zoom Ratio")},
4044 {PTP_DPC_NIKON_LiveViewProhibitCondition, /* 0xD1A4 */ 4698 {PTP_DPC_NIKON_LiveViewProhibitCondition, /* 0xD1A4 */
4045 N_("Live View Prohibit Condition")}, 4699 N_("Live View Prohibit Condition")},
4046 {PTP_DPC_NIKON_ExposureDisplayStatus, /* 0xD1B0 */ 4700 {PTP_DPC_NIKON_ExposureDisplayStatus, /* 0xD1B0 */
4047 N_("Exposure Display Status")}, 4701 N_("Exposure Display Status")},
4048 {PTP_DPC_NIKON_ExposureIndicateStatus, /* 0xD1B1 */ 4702 {PTP_DPC_NIKON_ExposureIndicateStatus, /* 0xD1B1 */
4049 N_("Exposure Indicate Status")}, 4703 N_("Exposure Indicate Status")},
4050 » » {PTP_DPC_NIKON_ExposureIndicateLightup,»» /* 0xD1B2 */ 4704 » » {PTP_DPC_NIKON_InfoDispErrStatus,» » /* 0xD1B2 */
4705 » » N_("Info Display Error Status")},
4706 » » {PTP_DPC_NIKON_ExposureIndicateLightup,»» /* 0xD1B3 */
4051 N_("Exposure Indicate Lightup")}, 4707 N_("Exposure Indicate Lightup")},
4052 {PTP_DPC_NIKON_FlashOpen, /* 0xD1C0 */ 4708 {PTP_DPC_NIKON_FlashOpen, /* 0xD1C0 */
4053 N_("Flash Open")}, 4709 N_("Flash Open")},
4054 {PTP_DPC_NIKON_FlashCharged, /* 0xD1C1 */ 4710 {PTP_DPC_NIKON_FlashCharged, /* 0xD1C1 */
4055 N_("Flash Charged")}, 4711 N_("Flash Charged")},
4056 {PTP_DPC_NIKON_FlashMRepeatValue, /* 0xD1D0 */ 4712 {PTP_DPC_NIKON_FlashMRepeatValue, /* 0xD1D0 */
4057 N_("Flash MRepeat Value")}, 4713 N_("Flash MRepeat Value")},
4058 {PTP_DPC_NIKON_FlashMRepeatCount, /* 0xD1D1 */ 4714 {PTP_DPC_NIKON_FlashMRepeatCount, /* 0xD1D1 */
4059 N_("Flash MRepeat Count")}, 4715 N_("Flash MRepeat Count")},
4060 {PTP_DPC_NIKON_FlashMRepeatInterval, /* 0xD1D2 */ 4716 {PTP_DPC_NIKON_FlashMRepeatInterval, /* 0xD1D2 */
(...skipping 15 matching lines...) Expand all
4076 {PTP_DPC_NIKON_FlashCommandBMode, /* 0xD1DA */ 4732 {PTP_DPC_NIKON_FlashCommandBMode, /* 0xD1DA */
4077 N_("Flash Command B Mode")}, 4733 N_("Flash Command B Mode")},
4078 {PTP_DPC_NIKON_FlashCommandBCompensation, /* 0xD1DB */ 4734 {PTP_DPC_NIKON_FlashCommandBCompensation, /* 0xD1DB */
4079 N_("Flash Command B Compensation")}, 4735 N_("Flash Command B Compensation")},
4080 {PTP_DPC_NIKON_FlashCommandBValue, /* 0xD1DC */ 4736 {PTP_DPC_NIKON_FlashCommandBValue, /* 0xD1DC */
4081 N_("Flash Command B Value")}, 4737 N_("Flash Command B Value")},
4082 {PTP_DPC_NIKON_ActivePicCtrlItem, /* 0xD200 */ 4738 {PTP_DPC_NIKON_ActivePicCtrlItem, /* 0xD200 */
4083 N_("Active Pic Ctrl Item")}, 4739 N_("Active Pic Ctrl Item")},
4084 {PTP_DPC_NIKON_ChangePicCtrlItem, /* 0xD201 */ 4740 {PTP_DPC_NIKON_ChangePicCtrlItem, /* 0xD201 */
4085 N_("Change Pic Ctrl Item")}, 4741 N_("Change Pic Ctrl Item")},
4742 /* nikon 1 stuff */
4743 {PTP_DPC_NIKON_1_ISO, /* 0xf002 */
4744 N_("ISO")},
4745 {PTP_DPC_NIKON_1_ImageSize, /* 0xf00a */
4746 N_("Image Size")},
4747 {PTP_DPC_NIKON_1_LongExposureNoiseReduction, /* 0xF00D */
4748 N_("Long Exposure Noise Reduction")},
4749 {PTP_DPC_NIKON_1_MovQuality, /* 0xF01C */
4750 N_("Movie Quality")},
4751 {PTP_DPC_NIKON_1_HiISONoiseReduction, /* 0xF00E */
4752 N_("High ISO Noise Reduction")},
4753 {PTP_DPC_NIKON_1_WhiteBalance, /* 0xF00C */
4754 N_("White Balance")},
4755 {PTP_DPC_NIKON_1_ImageCompression, /* 0xF009 */
4756 N_("Image Compression")},
4757 {PTP_DPC_NIKON_1_ActiveDLighting, /* 0xF00F */
4758 N_("Active D-Lighting")},
4086 {0,NULL} 4759 {0,NULL}
4087 }; 4760 };
4088 struct { 4761 struct {
4089 uint16_t dpc; 4762 uint16_t dpc;
4090 const char *txt; 4763 const char *txt;
4091 } ptp_device_properties_MTP[] = { 4764 } ptp_device_properties_MTP[] = {
4092 {PTP_DPC_MTP_SecureTime, N_("Secure Time")}, /* D101 */ 4765 {PTP_DPC_MTP_SecureTime, N_("Secure Time")}, /* D101 */
4093 {PTP_DPC_MTP_DeviceCertificate, N_("Device Certificate")}, /* D102 */ 4766 {PTP_DPC_MTP_DeviceCertificate, N_("Device Certificate")}, /* D102 */
4094 {PTP_DPC_MTP_RevocationInfo, N_("Revocation Info")}, /* D103 */ 4767 {PTP_DPC_MTP_RevocationInfo, N_("Revocation Info")}, /* D103 */
4095 {PTP_DPC_MTP_SynchronizationPartner, /* D401 */ 4768 {PTP_DPC_MTP_SynchronizationPartner, /* D401 */
(...skipping 19 matching lines...) Expand all
4115 {PTP_DPC_FUJI_ColorTemperature, N_("Color Temperature")}, /* 0xD017 */ 4788 {PTP_DPC_FUJI_ColorTemperature, N_("Color Temperature")}, /* 0xD017 */
4116 {PTP_DPC_FUJI_Quality, N_("Quality")}, /* 0xD018 */ 4789 {PTP_DPC_FUJI_Quality, N_("Quality")}, /* 0xD018 */
4117 {PTP_DPC_FUJI_Quality, N_("Release Mode")}, /* 0xD201 */ 4790 {PTP_DPC_FUJI_Quality, N_("Release Mode")}, /* 0xD201 */
4118 {PTP_DPC_FUJI_Quality, N_("Focus Areas")}, /* 0xD206 */ 4791 {PTP_DPC_FUJI_Quality, N_("Focus Areas")}, /* 0xD206 */
4119 {PTP_DPC_FUJI_Quality, N_("AE Lock")}, /* 0xD213 */ 4792 {PTP_DPC_FUJI_Quality, N_("AE Lock")}, /* 0xD213 */
4120 {PTP_DPC_FUJI_Quality, N_("Aperture")}, /* 0xD218 */ 4793 {PTP_DPC_FUJI_Quality, N_("Aperture")}, /* 0xD218 */
4121 {PTP_DPC_FUJI_Quality, N_("Shutter Speed")}, /* 0xD219 */ 4794 {PTP_DPC_FUJI_Quality, N_("Shutter Speed")}, /* 0xD219 */
4122 {0,NULL} 4795 {0,NULL}
4123 }; 4796 };
4124 4797
4798 struct {
4799 uint16_t dpc;
4800 const char *txt;
4801 } ptp_device_properties_SONY[] = {
4802 {PTP_DPC_SONY_DPCCompensation, ("DOC Compensation")}, /* 0xD20 0 */
4803 {PTP_DPC_SONY_DRangeOptimize, ("DRangeOptimize")}, /* 0xD20 1 */
4804 {PTP_DPC_SONY_ImageSize, N_("Image size")}, /* 0xD20 3 */
4805 {PTP_DPC_SONY_ShutterSpeed, N_("Shutter speed")}, /* 0xD20 D */
4806 {PTP_DPC_SONY_ColorTemp, N_("Color temperature")}, /* 0xD20 F */
4807 {PTP_DPC_SONY_CCFilter, ("CC Filter")}, /* 0xD21 0 */
4808 {PTP_DPC_SONY_AspectRatio, N_("Aspect Ratio")}, /* 0xD21 1 */
4809 {PTP_DPC_SONY_ExposeIndex, N_("Expose Index")}, /* 0xD21 6 */
4810 {PTP_DPC_SONY_PictureEffect, N_("Picture Effect")}, /* 0xD21 B */
4811 {PTP_DPC_SONY_ABFilter, N_("AB Filter")}, /* 0xD21 C */
4812 {PTP_DPC_SONY_ISO, N_("ISO")}, /* 0xD21 E */
4813 {PTP_DPC_SONY_Movie, N_("Movie")}, /* 0xD2C 8 */
4814 {PTP_DPC_SONY_StillImage, N_("Still Image")}, /* 0xD2C 7 */
4815 {0,NULL}
4816 };
4817
4818
4125 for (i=0; ptp_device_properties[i].txt!=NULL; i++) 4819 for (i=0; ptp_device_properties[i].txt!=NULL; i++)
4126 if (ptp_device_properties[i].dpc==dpc) 4820 if (ptp_device_properties[i].dpc==dpc)
4127 return (ptp_device_properties[i].txt); 4821 return (ptp_device_properties[i].txt);
4128 4822
4129 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_MICROSOFT 4823 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_MICROSOFT
4130 || params->deviceinfo.VendorExtensionID==PTP_VENDOR_MTP) 4824 || params->deviceinfo.VendorExtensionID==PTP_VENDOR_MTP)
4131 for (i=0; ptp_device_properties_MTP[i].txt!=NULL; i++) 4825 for (i=0; ptp_device_properties_MTP[i].txt!=NULL; i++)
4132 if (ptp_device_properties_MTP[i].dpc==dpc) 4826 if (ptp_device_properties_MTP[i].dpc==dpc)
4133 return (ptp_device_properties_MTP[i].txt); 4827 return (ptp_device_properties_MTP[i].txt);
4134 4828
(...skipping 10 matching lines...) Expand all
4145 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_NIKON) 4839 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_NIKON)
4146 for (i=0; ptp_device_properties_Nikon[i].txt!=NULL; i++) 4840 for (i=0; ptp_device_properties_Nikon[i].txt!=NULL; i++)
4147 if (ptp_device_properties_Nikon[i].dpc==dpc) 4841 if (ptp_device_properties_Nikon[i].dpc==dpc)
4148 return (ptp_device_properties_Nikon[i].txt); 4842 return (ptp_device_properties_Nikon[i].txt);
4149 4843
4150 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_FUJI) 4844 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_FUJI)
4151 for (i=0; ptp_device_properties_FUJI[i].txt!=NULL; i++) 4845 for (i=0; ptp_device_properties_FUJI[i].txt!=NULL; i++)
4152 if (ptp_device_properties_FUJI[i].dpc==dpc) 4846 if (ptp_device_properties_FUJI[i].dpc==dpc)
4153 return (ptp_device_properties_FUJI[i].txt); 4847 return (ptp_device_properties_FUJI[i].txt);
4154 4848
4849 if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_SONY)
4850 for (i=0; ptp_device_properties_SONY[i].txt!=NULL; i++)
4851 if (ptp_device_properties_SONY[i].dpc==dpc)
4852 return (ptp_device_properties_SONY[i].txt);
4853
4155 return NULL; 4854 return NULL;
4156 } 4855 }
4157 4856
4158 static int64_t 4857 static int64_t
4159 _value_to_num(PTPPropertyValue *data, uint16_t dt) { 4858 _value_to_num(PTPPropertyValue *data, uint16_t dt) {
4160 if (dt == PTP_DTC_STR) { 4859 if (dt == PTP_DTC_STR) {
4161 if (!data->str) 4860 if (!data->str)
4162 return 0; 4861 return 0;
4163 return atol(data->str); 4862 return atol(data->str);
4164 } 4863 }
(...skipping 29 matching lines...) Expand all
4194 return 0; 4893 return 0;
4195 } 4894 }
4196 4895
4197 #define PTP_VAL_BOOL(dpc) {dpc, 0, N_("Off")}, {dpc, 1, N_("On")} 4896 #define PTP_VAL_BOOL(dpc) {dpc, 0, N_("Off")}, {dpc, 1, N_("On")}
4198 #define PTP_VENDOR_VAL_BOOL(dpc,vendor) {dpc, vendor, 0, N_("Off")}, {dpc, vendo r, 1, N_("On")} 4897 #define PTP_VENDOR_VAL_BOOL(dpc,vendor) {dpc, vendor, 0, N_("Off")}, {dpc, vendo r, 1, N_("On")}
4199 #define PTP_VENDOR_VAL_RBOOL(dpc,vendor) {dpc, vendor, 0, N_("On")}, {dpc, vendo r, 1, N_("Off")} 4898 #define PTP_VENDOR_VAL_RBOOL(dpc,vendor) {dpc, vendor, 0, N_("On")}, {dpc, vendo r, 1, N_("Off")}
4200 #define PTP_VENDOR_VAL_YN(dpc,vendor) {dpc, vendor, 0, N_("No")}, {dpc, vendor, 1, N_("Yes")} 4899 #define PTP_VENDOR_VAL_YN(dpc,vendor) {dpc, vendor, 0, N_("No")}, {dpc, vendor, 1, N_("Yes")}
4201 4900
4202 int 4901 int
4203 ptp_render_property_value(PTPParams* params, uint16_t dpc, 4902 ptp_render_property_value(PTPParams* params, uint16_t dpc,
4204 » » » PTPDevicePropDesc *dpd, int length, char *out) 4903 » » » PTPDevicePropDesc *dpd, unsigned int length, char *out )
4205 { 4904 {
4206 » int i; 4905 » unsigned int i;
4207 int64_t kval; 4906 int64_t kval;
4208 4907
4209 struct { 4908 struct {
4210 uint16_t dpc; 4909 uint16_t dpc;
4211 uint16_t vendor; 4910 uint16_t vendor;
4212 double coef; 4911 double coef;
4213 double bias; 4912 double bias;
4214 const char *format; 4913 const char *format;
4215 } ptp_value_trans[] = { 4914 } ptp_value_trans[] = {
4216 {PTP_DPC_BatteryLevel, 0, 1.0, 0.0, "%.0f%%"}, /* 5001 */ 4915 {PTP_DPC_BatteryLevel, 0, 1.0, 0.0, "%.0f%%"}, /* 5001 */
(...skipping 10 matching lines...) Expand all
4227 /* Nikon device properties */ 4926 /* Nikon device properties */
4228 {PTP_DPC_NIKON_LightMeter, PTP_VENDOR_NIKON, 0.08333, 0.0, N_("% .1f stops")},/* D10A */ 4927 {PTP_DPC_NIKON_LightMeter, PTP_VENDOR_NIKON, 0.08333, 0.0, N_("% .1f stops")},/* D10A */
4229 {PTP_DPC_NIKON_FlashExposureCompensation, PTP_VENDOR_NIKON, 0.16 666, 0.0, N_("%.1f stops")}, /* D126 */ 4928 {PTP_DPC_NIKON_FlashExposureCompensation, PTP_VENDOR_NIKON, 0.16 666, 0.0, N_("%.1f stops")}, /* D126 */
4230 {PTP_DPC_NIKON_CenterWeightArea, PTP_VENDOR_NIKON, 2.0, 6.0, N_( "%.0f mm")},/* D059 */ 4929 {PTP_DPC_NIKON_CenterWeightArea, PTP_VENDOR_NIKON, 2.0, 6.0, N_( "%.0f mm")},/* D059 */
4231 {PTP_DPC_NIKON_FocalLengthMin, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0 f mm"}, /* D0E3 */ 4930 {PTP_DPC_NIKON_FocalLengthMin, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0 f mm"}, /* D0E3 */
4232 {PTP_DPC_NIKON_FocalLengthMax, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0 f mm"}, /* D0E4 */ 4931 {PTP_DPC_NIKON_FocalLengthMax, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0 f mm"}, /* D0E4 */
4233 {PTP_DPC_NIKON_MaxApAtMinFocalLength, PTP_VENDOR_NIKON, 0.01, 0. 0, "f/%.2g"}, /* D0E5 */ 4932 {PTP_DPC_NIKON_MaxApAtMinFocalLength, PTP_VENDOR_NIKON, 0.01, 0. 0, "f/%.2g"}, /* D0E5 */
4234 {PTP_DPC_NIKON_MaxApAtMaxFocalLength, PTP_VENDOR_NIKON, 0.01, 0. 0, "f/%.2g"}, /* D0E6 */ 4933 {PTP_DPC_NIKON_MaxApAtMaxFocalLength, PTP_VENDOR_NIKON, 0.01, 0. 0, "f/%.2g"}, /* D0E6 */
4235 {PTP_DPC_NIKON_ExternalFlashCompensation, PTP_VENDOR_NIKON, 1.0/ 6.0, 0.0,"%.0f"}, /* D124 */ 4934 {PTP_DPC_NIKON_ExternalFlashCompensation, PTP_VENDOR_NIKON, 1.0/ 6.0, 0.0,"%.0f"}, /* D124 */
4236 {PTP_DPC_NIKON_ExposureIndicateStatus, PTP_VENDOR_NIKON, 0.08333 , 0.0, N_("%.1f stops")},/* D1B1 - FIXME: check if correct. */ 4935 {PTP_DPC_NIKON_ExposureIndicateStatus, PTP_VENDOR_NIKON, 0.08333 , 0.0, N_("%.1f stops")},/* D1B1 - FIXME: check if correct. */
4936 {PTP_DPC_NIKON_AngleLevel, PTP_VENDOR_NIKON, 1.0/65536, 0.0, "%. 1f'"},/* 0xD067 */
4237 {0, 0, 0.0, 0.0, NULL} 4937 {0, 0, 0.0, 0.0, NULL}
4238 }; 4938 };
4239 4939
4240 struct { 4940 struct {
4241 uint16_t dpc; 4941 uint16_t dpc;
4242 uint16_t vendor; 4942 uint16_t vendor;
4243 int64_t key; 4943 int64_t key;
4244 char *value; 4944 char *value;
4245 } ptp_value_list[] = { 4945 } ptp_value_list[] = {
4246 {PTP_DPC_CompressionSetting, 0, 0, N_("JPEG Basic")}, /* 5004 */ 4946 {PTP_DPC_CompressionSetting, 0, 0, N_("JPEG Basic")}, /* 5004 */
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
4436 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 118, "AF Nikkor 50mm 1: 1.8 D"}, 5136 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 118, "AF Nikkor 50mm 1: 1.8 D"},
4437 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 127, "AF-S Nikkor 18-70 mm 1:3.5-4.5G ED DX"}, 5137 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 127, "AF-S Nikkor 18-70 mm 1:3.5-4.5G ED DX"},
4438 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 139, "AF-S Nikkor 18-20 0mm 1:3.5-5.6 GED DX VR"}, 5138 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 139, "AF-S Nikkor 18-20 0mm 1:3.5-5.6 GED DX VR"},
4439 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 147, "AF-S Nikkor 24-70 mm 1:2.8G ED DX"}, 5139 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 147, "AF-S Nikkor 24-70 mm 1:2.8G ED DX"},
4440 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 154, "AF-S Nikkor 18-55 mm 1:3.5-F5.6G DX VR"}, 5140 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 154, "AF-S Nikkor 18-55 mm 1:3.5-F5.6G DX VR"},
4441 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 159, "AF-S Nikkor 35mm 1:1.8G DX"}, 5141 {PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 159, "AF-S Nikkor 35mm 1:1.8G DX"},
4442 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 0, "Show ISO sen sitivity"},/* 0xD0F0 */ 5142 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 0, "Show ISO sen sitivity"},/* 0xD0F0 */
4443 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 1, "Show ISO/Eas y ISO"}, 5143 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 1, "Show ISO/Eas y ISO"},
4444 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 2, "Show frame c ount"}, 5144 {PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 2, "Show frame c ount"},
4445 5145
5146 {PTP_DPC_NIKON_RawCompression, PTP_VENDOR_NIKON, 0, N_("Lossless ")}, /* D016 */
5147 {PTP_DPC_NIKON_RawCompression, PTP_VENDOR_NIKON, 1, N_("Lossy")} ,
5148
4446 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ACPower,PTP_VENDOR_NIKON), /* D101 */ 5149 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ACPower,PTP_VENDOR_NIKON), /* D101 */
4447 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AFLockStatus,PTP_VENDOR_NIKON), /* D104 */ 5150 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AFLockStatus,PTP_VENDOR_NIKON), /* D104 */
4448 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AELockStatus,PTP_VENDOR_NIKON), /* D105 */ 5151 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AELockStatus,PTP_VENDOR_NIKON), /* D105 */
4449 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FVLockStatus,PTP_VENDOR_NIKON), /* D106 */ 5152 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FVLockStatus,PTP_VENDOR_NIKON), /* D106 */
4450 5153
4451 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 0, N_("Centre")} , /* D108 */ 5154 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 0, N_("Centre")} , /* D108 */
4452 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 1, N_("Top")}, 5155 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 1, N_("Top")},
4453 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 2, N_("Bottom")} , 5156 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 2, N_("Bottom")} ,
4454 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 3, N_("Left")}, 5157 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 3, N_("Left")},
4455 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 4, N_("Right")}, 5158 {PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 4, N_("Right")},
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
4574 5277
4575 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_LiveViewStatus,PTP_VENDOR_NIKON) , /* D1A2 */ 5278 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_LiveViewStatus,PTP_VENDOR_NIKON) , /* D1A2 */
4576 5279
4577 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureDisplayStatus,PTP_VENDOR _NIKON),/* D1B0 */ 5280 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureDisplayStatus,PTP_VENDOR _NIKON),/* D1B0 */
4578 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_InfoDispErrStatus,PTP_VENDOR_NIK ON), /* D1B2 */ 5281 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_InfoDispErrStatus,PTP_VENDOR_NIK ON), /* D1B2 */
4579 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureIndicateLightup,PTP_VEND OR_NIKON),/* D1B3 */ 5282 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureIndicateLightup,PTP_VEND OR_NIKON),/* D1B3 */
4580 5283
4581 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashOpen,PTP_VENDOR_NIKON), /* D1C0 */ 5284 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashOpen,PTP_VENDOR_NIKON), /* D1C0 */
4582 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashCharged,PTP_VENDOR_NIKON), /* D1C1 */ 5285 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashCharged,PTP_VENDOR_NIKON), /* D1C1 */
4583 5286
5287 PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ManualMovieSetting,PTP_VENDOR_NI KON), /* 0xD0A6 */
5288
5289 {PTP_DPC_NIKON_FlickerReduction, PTP_VENDOR_NIKON, 0, "50Hz"}, /* 0xD034 */
5290 {PTP_DPC_NIKON_FlickerReduction, PTP_VENDOR_NIKON, 1, "60Hz"},
5291
5292 {PTP_DPC_NIKON_RemoteMode, PTP_VENDOR_NIKON, 0, N_("Delayed Remo te")}, /* 0xD035 */
5293 {PTP_DPC_NIKON_RemoteMode, PTP_VENDOR_NIKON, 1, N_("Quick Respon se")}, /* 0xD035 */
5294 {PTP_DPC_NIKON_RemoteMode, PTP_VENDOR_NIKON, 2, N_("Remote Mirro r Up")},/* 0xD035 */
5295
5296 {PTP_DPC_NIKON_MonitorOffDelay, PTP_VENDOR_NIKON, 0, "5min"}, /* 0xD0b3 */
5297 {PTP_DPC_NIKON_MonitorOffDelay, PTP_VENDOR_NIKON, 1, "10min"}, /* 0xD0b3 */
5298 {PTP_DPC_NIKON_MonitorOffDelay, PTP_VENDOR_NIKON, 2, "15min"}, /* 0xD0b3 */
5299 {PTP_DPC_NIKON_MonitorOffDelay, PTP_VENDOR_NIKON, 3, "20min"}, /* 0xD0b3 */
5300 {PTP_DPC_NIKON_MonitorOffDelay, PTP_VENDOR_NIKON, 4, "30min"}, /* 0xD0b3 */
5301
5302
4584 /* Canon stuff */ 5303 /* Canon stuff */
4585 PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_AssistLight,PTP_VENDOR_CANON), 5304 PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_AssistLight,PTP_VENDOR_CANON),
4586 PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_RotationScene,PTP_VENDOR_CANO N), 5305 PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_RotationScene,PTP_VENDOR_CANO N),
4587 PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_BeepMode,PTP_VENDOR_CANON), 5306 PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_BeepMode,PTP_VENDOR_CANON),
4588 PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_Beep,PTP_VENDOR_CANON), 5307 PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_Beep,PTP_VENDOR_CANON),
4589 5308
4590 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 0, "0'"}, 5309 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 0, "0'"},
4591 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 3, "270'"}, 5310 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 3, "270'"},
4592 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 1, "90'"}, 5311 {PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 1, "90'"},
4593 5312
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
4937 {PTP_OFC_MTP_vCalendar1,N_("vCalendar1")}, 5656 {PTP_OFC_MTP_vCalendar1,N_("vCalendar1")},
4938 {PTP_OFC_MTP_vCalendar2,N_("vCalendar2")}, 5657 {PTP_OFC_MTP_vCalendar2,N_("vCalendar2")},
4939 {PTP_OFC_MTP_UndefinedWindowsExecutable,N_("Undefined Windows Executable ")}, 5658 {PTP_OFC_MTP_UndefinedWindowsExecutable,N_("Undefined Windows Executable ")},
4940 {PTP_OFC_MTP_MediaCast,N_("Media Cast")}, 5659 {PTP_OFC_MTP_MediaCast,N_("Media Cast")},
4941 {PTP_OFC_MTP_Section,N_("Section")}, 5660 {PTP_OFC_MTP_Section,N_("Section")},
4942 }; 5661 };
4943 5662
4944 int 5663 int
4945 ptp_render_ofc(PTPParams* params, uint16_t ofc, int spaceleft, char *txt) 5664 ptp_render_ofc(PTPParams* params, uint16_t ofc, int spaceleft, char *txt)
4946 { 5665 {
4947 » int i; 5666 » unsigned int i;
4948 » 5667
4949 if (!(ofc & 0x8000)) { 5668 if (!(ofc & 0x8000)) {
4950 for (i=0;i<sizeof(ptp_ofc_trans)/sizeof(ptp_ofc_trans[0]);i++) 5669 for (i=0;i<sizeof(ptp_ofc_trans)/sizeof(ptp_ofc_trans[0]);i++)
4951 if (ofc == ptp_ofc_trans[i].ofc) 5670 if (ofc == ptp_ofc_trans[i].ofc)
4952 return snprintf(txt, spaceleft, "%s", _(ptp_ofc_ trans[i].format)); 5671 return snprintf(txt, spaceleft, "%s", _(ptp_ofc_ trans[i].format));
4953 } else { 5672 } else {
4954 switch (params->deviceinfo.VendorExtensionID) { 5673 switch (params->deviceinfo.VendorExtensionID) {
4955 case PTP_VENDOR_EASTMAN_KODAK: 5674 case PTP_VENDOR_EASTMAN_KODAK:
4956 switch (ofc) { 5675 switch (ofc) {
4957 case PTP_OFC_EK_M3U: 5676 case PTP_OFC_EK_M3U:
4958 return snprintf (txt, spaceleft,"M3U"); 5677 return snprintf (txt, spaceleft,"M3U");
(...skipping 14 matching lines...) Expand all
4973 for (i=0;i<sizeof(ptp_ofc_mtp_trans)/sizeof(ptp_ofc_mtp_ trans[0]);i++) 5692 for (i=0;i<sizeof(ptp_ofc_mtp_trans)/sizeof(ptp_ofc_mtp_ trans[0]);i++)
4974 if (ofc == ptp_ofc_mtp_trans[i].ofc) 5693 if (ofc == ptp_ofc_mtp_trans[i].ofc)
4975 return snprintf(txt, spaceleft, "%s", _( ptp_ofc_mtp_trans[i].format)); 5694 return snprintf(txt, spaceleft, "%s", _( ptp_ofc_mtp_trans[i].format));
4976 break; 5695 break;
4977 default:break; 5696 default:break;
4978 } 5697 }
4979 } 5698 }
4980 return snprintf (txt, spaceleft,_("Unknown(%04x)"), ofc); 5699 return snprintf (txt, spaceleft,_("Unknown(%04x)"), ofc);
4981 } 5700 }
4982 5701
4983 struct { 5702 typedef struct {
4984 uint16_t opcode; 5703 uint16_t opcode;
4985 const char *name; 5704 const char *name;
4986 } ptp_opcode_trans[] = { 5705 } ptp_opcode_trans_t;
5706
5707 ptp_opcode_trans_t ptp_opcode_trans[] = {
4987 {PTP_OC_Undefined,N_("Undefined")}, 5708 {PTP_OC_Undefined,N_("Undefined")},
4988 » {PTP_OC_GetDeviceInfo,N_("get device info")}, 5709 » {PTP_OC_GetDeviceInfo,N_("Get device info")},
4989 {PTP_OC_OpenSession,N_("Open session")}, 5710 {PTP_OC_OpenSession,N_("Open session")},
4990 {PTP_OC_CloseSession,N_("Close session")}, 5711 {PTP_OC_CloseSession,N_("Close session")},
4991 {PTP_OC_GetStorageIDs,N_("Get storage IDs")}, 5712 {PTP_OC_GetStorageIDs,N_("Get storage IDs")},
4992 {PTP_OC_GetStorageInfo,N_("Get storage info")}, 5713 {PTP_OC_GetStorageInfo,N_("Get storage info")},
4993 {PTP_OC_GetNumObjects,N_("Get number of objects")}, 5714 {PTP_OC_GetNumObjects,N_("Get number of objects")},
4994 {PTP_OC_GetObjectHandles,N_("Get object handles")}, 5715 {PTP_OC_GetObjectHandles,N_("Get object handles")},
4995 {PTP_OC_GetObjectInfo,N_("Get object info")}, 5716 {PTP_OC_GetObjectInfo,N_("Get object info")},
4996 {PTP_OC_GetObject,N_("Get object")}, 5717 {PTP_OC_GetObject,N_("Get object")},
4997 {PTP_OC_GetThumb,N_("Get thumbnail")}, 5718 {PTP_OC_GetThumb,N_("Get thumbnail")},
4998 {PTP_OC_DeleteObject,N_("Delete object")}, 5719 {PTP_OC_DeleteObject,N_("Delete object")},
4999 {PTP_OC_SendObjectInfo,N_("Send object info")}, 5720 {PTP_OC_SendObjectInfo,N_("Send object info")},
5000 {PTP_OC_SendObject,N_("Send object")}, 5721 {PTP_OC_SendObject,N_("Send object")},
5001 {PTP_OC_InitiateCapture,N_("Initiate capture")}, 5722 {PTP_OC_InitiateCapture,N_("Initiate capture")},
5002 {PTP_OC_FormatStore,N_("Format storage")}, 5723 {PTP_OC_FormatStore,N_("Format storage")},
5003 {PTP_OC_ResetDevice,N_("Reset device")}, 5724 {PTP_OC_ResetDevice,N_("Reset device")},
5004 {PTP_OC_SelfTest,N_("Self test device")}, 5725 {PTP_OC_SelfTest,N_("Self test device")},
5005 {PTP_OC_SetObjectProtection,N_("Set object protection")}, 5726 {PTP_OC_SetObjectProtection,N_("Set object protection")},
5006 {PTP_OC_PowerDown,N_("Power down device")}, 5727 {PTP_OC_PowerDown,N_("Power down device")},
5007 {PTP_OC_GetDevicePropDesc,N_("Get device property description")}, 5728 {PTP_OC_GetDevicePropDesc,N_("Get device property description")},
5008 {PTP_OC_GetDevicePropValue,N_("Get device property value")}, 5729 {PTP_OC_GetDevicePropValue,N_("Get device property value")},
5009 {PTP_OC_SetDevicePropValue,N_("Set device property value")}, 5730 {PTP_OC_SetDevicePropValue,N_("Set device property value")},
5010 {PTP_OC_ResetDevicePropValue,N_("Reset device property value")}, 5731 {PTP_OC_ResetDevicePropValue,N_("Reset device property value")},
5011 {PTP_OC_TerminateOpenCapture,N_("Terminate open capture")}, 5732 {PTP_OC_TerminateOpenCapture,N_("Terminate open capture")},
5012 {PTP_OC_MoveObject,N_("Move object")}, 5733 {PTP_OC_MoveObject,N_("Move object")},
5013 {PTP_OC_CopyObject,N_("Copy object")}, 5734 {PTP_OC_CopyObject,N_("Copy object")},
5014 {PTP_OC_GetPartialObject,N_("Get partial object")}, 5735 {PTP_OC_GetPartialObject,N_("Get partial object")},
5015 » {PTP_OC_InitiateOpenCapture,N_("Initiate open capture")} 5736 » {PTP_OC_InitiateOpenCapture,N_("Initiate open capture")},
5737 » /* PTP v1.1 operation codes */
5738 » {PTP_OC_StartEnumHandles,N_("Start Enumerate Handles")},
5739 » {PTP_OC_EnumHandles,N_("Enumerate Handles")},
5740 » {PTP_OC_StopEnumHandles,N_("Stop Enumerate Handles")},
5741 » {PTP_OC_GetVendorExtensionMaps,N_("Get Vendor Extension Maps")},
5742 » {PTP_OC_GetVendorDeviceInfo,N_("Get Vendor Device Info")},
5743 » {PTP_OC_GetResizedImageObject,N_("Get Resized Image Object")},
5744 » {PTP_OC_GetFilesystemManifest,N_("Get Filesystem Manifest")},
5745 » {PTP_OC_GetStreamInfo,N_("Get Stream Info")},
5746 » {PTP_OC_GetStream,N_("Get Stream")},
5016 }; 5747 };
5017 5748
5018 struct { 5749 ptp_opcode_trans_t ptp_opcode_mtp_trans[] = {
5019 » uint16_t opcode;
5020 » const char *name;
5021 } ptp_opcode_mtp_trans[] = {
5022 {PTP_OC_MTP_GetObjectPropsSupported,N_("Get object properties supported" )}, 5750 {PTP_OC_MTP_GetObjectPropsSupported,N_("Get object properties supported" )},
5023 {PTP_OC_MTP_GetObjectPropDesc,N_("Get object property description")}, 5751 {PTP_OC_MTP_GetObjectPropDesc,N_("Get object property description")},
5024 {PTP_OC_MTP_GetObjectPropValue,N_("Get object property value")}, 5752 {PTP_OC_MTP_GetObjectPropValue,N_("Get object property value")},
5025 {PTP_OC_MTP_SetObjectPropValue,N_("Set object property value")}, 5753 {PTP_OC_MTP_SetObjectPropValue,N_("Set object property value")},
5026 {PTP_OC_MTP_GetObjPropList,N_("Get object property list")}, 5754 {PTP_OC_MTP_GetObjPropList,N_("Get object property list")},
5027 {PTP_OC_MTP_SetObjPropList,N_("Set object property list")}, 5755 {PTP_OC_MTP_SetObjPropList,N_("Set object property list")},
5028 {PTP_OC_MTP_GetInterdependendPropdesc,N_("Get interdependent property de scription")}, 5756 {PTP_OC_MTP_GetInterdependendPropdesc,N_("Get interdependent property de scription")},
5029 {PTP_OC_MTP_SendObjectPropList,N_("Send object property list")}, 5757 {PTP_OC_MTP_SendObjectPropList,N_("Send object property list")},
5030 {PTP_OC_MTP_GetObjectReferences,N_("Get object references")}, 5758 {PTP_OC_MTP_GetObjectReferences,N_("Get object references")},
5031 {PTP_OC_MTP_SetObjectReferences,N_("Set object references")}, 5759 {PTP_OC_MTP_SetObjectReferences,N_("Set object references")},
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5065 5793
5066 /* WMDRMND Extensions */ 5794 /* WMDRMND Extensions */
5067 {PTP_OC_MTP_WMDRMND_SendRegistrationRequest,N_("Send Registration Reques t")}, 5795 {PTP_OC_MTP_WMDRMND_SendRegistrationRequest,N_("Send Registration Reques t")},
5068 {PTP_OC_MTP_WMDRMND_GetRegistrationResponse,N_("Get Registration Respons e")}, 5796 {PTP_OC_MTP_WMDRMND_GetRegistrationResponse,N_("Get Registration Respons e")},
5069 {PTP_OC_MTP_WMDRMND_GetProximityChallenge,N_("Get Proximity Challenge")} , 5797 {PTP_OC_MTP_WMDRMND_GetProximityChallenge,N_("Get Proximity Challenge")} ,
5070 {PTP_OC_MTP_WMDRMND_SendProximityResponse,N_("Send Proximity Response")} , 5798 {PTP_OC_MTP_WMDRMND_SendProximityResponse,N_("Send Proximity Response")} ,
5071 {PTP_OC_MTP_WMDRMND_SendWMDRMNDLicenseRequest,N_("Send WMDRM-ND License Request")}, 5799 {PTP_OC_MTP_WMDRMND_SendWMDRMNDLicenseRequest,N_("Send WMDRM-ND License Request")},
5072 {PTP_OC_MTP_WMDRMND_GetWMDRMNDLicenseResponse,N_("Get WMDRM-ND License R esponse")}, 5800 {PTP_OC_MTP_WMDRMND_GetWMDRMNDLicenseResponse,N_("Get WMDRM-ND License R esponse")},
5073 5801
5074 /* WiFi Provisioning MTP Extension Codes (microsoft.com/WPDWCN: 1.0) */ 5802 /* WiFi Provisioning MTP Extension Codes (microsoft.com/WPDWCN: 1.0) */
5075 {PTP_OC_MTP_WPDWCN_ProcessWFCObject,N_("Process WFC Object")} 5803 {PTP_OC_MTP_WPDWCN_ProcessWFCObject,N_("Process WFC Object")},
5076 }; 5804
5077 5805 /* Android Direct I/O Extensions */
5078 int 5806 {PTP_OC_ANDROID_GetPartialObject64,N_("Get Partial Object (64bit Offset) ")},
5079 ptp_render_opcode(PTPParams* params, uint16_t opcode, int spaceleft, char *txt) 5807 {PTP_OC_ANDROID_SendPartialObject,N_("Send Partial Object")},
5808 {PTP_OC_ANDROID_TruncateObject,N_("Truncate Object")},
5809 {PTP_OC_ANDROID_BeginEditObject,N_("Begin Edit Object")},
5810 {PTP_OC_ANDROID_EndEditObject,N_("End Edit Object")},
5811 };
5812
5813 ptp_opcode_trans_t ptp_opcode_nikon_trans[] = {
5814 {PTP_OC_NIKON_GetProfileAllData,"PTP_OC_NIKON_GetProfileAllData"},
5815 {PTP_OC_NIKON_SendProfileData,"PTP_OC_NIKON_SendProfileData"},
5816 {PTP_OC_NIKON_DeleteProfile,"PTP_OC_NIKON_DeleteProfile"},
5817 {PTP_OC_NIKON_SetProfileData,"PTP_OC_NIKON_SetProfileData"},
5818 {PTP_OC_NIKON_AdvancedTransfer,"PTP_OC_NIKON_AdvancedTransfer"},
5819 {PTP_OC_NIKON_GetFileInfoInBlock,"PTP_OC_NIKON_GetFileInfoInBlock"},
5820 {PTP_OC_NIKON_Capture,"PTP_OC_NIKON_Capture"},
5821 {PTP_OC_NIKON_AfDrive,"PTP_OC_NIKON_AfDrive"},
5822 {PTP_OC_NIKON_SetControlMode,"PTP_OC_NIKON_SetControlMode"},
5823 {PTP_OC_NIKON_DelImageSDRAM,"PTP_OC_NIKON_DelImageSDRAM"},
5824 {PTP_OC_NIKON_GetLargeThumb,"PTP_OC_NIKON_GetLargeThumb"},
5825 {PTP_OC_NIKON_CurveDownload,"PTP_OC_NIKON_CurveDownload"},
5826 {PTP_OC_NIKON_CurveUpload,"PTP_OC_NIKON_CurveUpload"},
5827 {PTP_OC_NIKON_CheckEvent,"PTP_OC_NIKON_CheckEvent"},
5828 {PTP_OC_NIKON_DeviceReady,"PTP_OC_NIKON_DeviceReady"},
5829 {PTP_OC_NIKON_SetPreWBData,"PTP_OC_NIKON_SetPreWBData"},
5830 {PTP_OC_NIKON_GetVendorPropCodes,"PTP_OC_NIKON_GetVendorPropCodes"},
5831 {PTP_OC_NIKON_AfCaptureSDRAM,"PTP_OC_NIKON_AfCaptureSDRAM"},
5832 {PTP_OC_NIKON_GetPictCtrlData,"PTP_OC_NIKON_GetPictCtrlData"},
5833 {PTP_OC_NIKON_SetPictCtrlData,"PTP_OC_NIKON_SetPictCtrlData"},
5834 {PTP_OC_NIKON_DelCstPicCtrl,"PTP_OC_NIKON_DelCstPicCtrl"},
5835 {PTP_OC_NIKON_GetPicCtrlCapability,"PTP_OC_NIKON_GetPicCtrlCapability"},
5836 {PTP_OC_NIKON_GetPreviewImg,"PTP_OC_NIKON_GetPreviewImg"},
5837 {PTP_OC_NIKON_StartLiveView,"PTP_OC_NIKON_StartLiveView"},
5838 {PTP_OC_NIKON_EndLiveView,"PTP_OC_NIKON_EndLiveView"},
5839 {PTP_OC_NIKON_GetLiveViewImg,"PTP_OC_NIKON_GetLiveViewImg"},
5840 {PTP_OC_NIKON_MfDrive,"PTP_OC_NIKON_MfDrive"},
5841 {PTP_OC_NIKON_ChangeAfArea,"PTP_OC_NIKON_ChangeAfArea"},
5842 {PTP_OC_NIKON_AfDriveCancel,"PTP_OC_NIKON_AfDriveCancel"},
5843 {PTP_OC_NIKON_InitiateCaptureRecInMedia,"PTP_OC_NIKON_InitiateCaptureRec InMedia"},
5844 {PTP_OC_NIKON_GetVendorStorageIDs,"PTP_OC_NIKON_GetVendorStorageIDs"},
5845 {PTP_OC_NIKON_StartMovieRecInCard,"PTP_OC_NIKON_StartMovieRecInCard"},
5846 {PTP_OC_NIKON_EndMovieRec,"PTP_OC_NIKON_EndMovieRec"},
5847 {PTP_OC_NIKON_TerminateCapture,"PTP_OC_NIKON_TerminateCapture"},
5848 {PTP_OC_NIKON_GetDevicePTPIPInfo,"PTP_OC_NIKON_GetDevicePTPIPInfo"},
5849 {PTP_OC_NIKON_GetPartialObjectHiSpeed,"PTP_OC_NIKON_GetPartialObjectHiSp eed"},
5850 {PTP_OC_NIKON_GetDevicePropEx,"PTP_OC_NIKON_GetDevicePropEx"},
5851 };
5852
5853 ptp_opcode_trans_t ptp_opcode_canon_trans[] = {
5854 {PTP_OC_CANON_GetPartialObjectInfo,"PTP_OC_CANON_GetPartialObjectInfo"},
5855 {PTP_OC_CANON_SetObjectArchive,"PTP_OC_CANON_SetObjectArchive"},
5856 {PTP_OC_CANON_KeepDeviceOn,"PTP_OC_CANON_KeepDeviceOn"},
5857 {PTP_OC_CANON_LockDeviceUI,"PTP_OC_CANON_LockDeviceUI"},
5858 {PTP_OC_CANON_UnlockDeviceUI,"PTP_OC_CANON_UnlockDeviceUI"},
5859 {PTP_OC_CANON_GetObjectHandleByName,"PTP_OC_CANON_GetObjectHandleByName" },
5860 {PTP_OC_CANON_InitiateReleaseControl,"PTP_OC_CANON_InitiateReleaseContro l"},
5861 {PTP_OC_CANON_TerminateReleaseControl,"PTP_OC_CANON_TerminateReleaseCont rol"},
5862 {PTP_OC_CANON_TerminatePlaybackMode,"PTP_OC_CANON_TerminatePlaybackMode" },
5863 {PTP_OC_CANON_ViewfinderOn,"PTP_OC_CANON_ViewfinderOn"},
5864 {PTP_OC_CANON_ViewfinderOff,"PTP_OC_CANON_ViewfinderOff"},
5865 {PTP_OC_CANON_DoAeAfAwb,"PTP_OC_CANON_DoAeAfAwb"},
5866 {PTP_OC_CANON_GetCustomizeSpec,"PTP_OC_CANON_GetCustomizeSpec"},
5867 {PTP_OC_CANON_GetCustomizeItemInfo,"PTP_OC_CANON_GetCustomizeItemInfo"},
5868 {PTP_OC_CANON_GetCustomizeData,"PTP_OC_CANON_GetCustomizeData"},
5869 {PTP_OC_CANON_SetCustomizeData,"PTP_OC_CANON_SetCustomizeData"},
5870 {PTP_OC_CANON_GetCaptureStatus,"PTP_OC_CANON_GetCaptureStatus"},
5871 {PTP_OC_CANON_CheckEvent,"PTP_OC_CANON_CheckEvent"},
5872 {PTP_OC_CANON_FocusLock,"PTP_OC_CANON_FocusLock"},
5873 {PTP_OC_CANON_FocusUnlock,"PTP_OC_CANON_FocusUnlock"},
5874 {PTP_OC_CANON_GetLocalReleaseParam,"PTP_OC_CANON_GetLocalReleaseParam"},
5875 {PTP_OC_CANON_SetLocalReleaseParam,"PTP_OC_CANON_SetLocalReleaseParam"},
5876 {PTP_OC_CANON_AskAboutPcEvf,"PTP_OC_CANON_AskAboutPcEvf"},
5877 {PTP_OC_CANON_SendPartialObject,"PTP_OC_CANON_SendPartialObject"},
5878 {PTP_OC_CANON_InitiateCaptureInMemory,"PTP_OC_CANON_InitiateCaptureInMem ory"},
5879 {PTP_OC_CANON_GetPartialObjectEx,"PTP_OC_CANON_GetPartialObjectEx"},
5880 {PTP_OC_CANON_SetObjectTime,"PTP_OC_CANON_SetObjectTime"},
5881 {PTP_OC_CANON_GetViewfinderImage,"PTP_OC_CANON_GetViewfinderImage"},
5882 {PTP_OC_CANON_GetObjectAttributes,"PTP_OC_CANON_GetObjectAttributes"},
5883 {PTP_OC_CANON_ChangeUSBProtocol,"PTP_OC_CANON_ChangeUSBProtocol"},
5884 {PTP_OC_CANON_GetChanges,"PTP_OC_CANON_GetChanges"},
5885 {PTP_OC_CANON_GetObjectInfoEx,"PTP_OC_CANON_GetObjectInfoEx"},
5886 {PTP_OC_CANON_InitiateDirectTransfer,"PTP_OC_CANON_InitiateDirectTransfe r"},
5887 {PTP_OC_CANON_TerminateDirectTransfer ,"PTP_OC_CANON_TerminateDirectTran sfer "},
5888 {PTP_OC_CANON_SendObjectInfoByPath ,"PTP_OC_CANON_SendObjectInfoByPath " },
5889 {PTP_OC_CANON_SendObjectByPath ,"PTP_OC_CANON_SendObjectByPath "},
5890 {PTP_OC_CANON_InitiateDirectTansferEx,"PTP_OC_CANON_InitiateDirectTansfe rEx"},
5891 {PTP_OC_CANON_GetAncillaryObjectHandles,"PTP_OC_CANON_GetAncillaryObject Handles"},
5892 {PTP_OC_CANON_GetTreeInfo ,"PTP_OC_CANON_GetTreeInfo "},
5893 {PTP_OC_CANON_GetTreeSize ,"PTP_OC_CANON_GetTreeSize "},
5894 {PTP_OC_CANON_NotifyProgress ,"PTP_OC_CANON_NotifyProgress "},
5895 {PTP_OC_CANON_NotifyCancelAccepted,"PTP_OC_CANON_NotifyCancelAccepted"},
5896 {PTP_OC_CANON_902C,"PTP_OC_CANON_902C"},
5897 {PTP_OC_CANON_GetDirectory,"PTP_OC_CANON_GetDirectory"},
5898 {PTP_OC_CANON_SetPairingInfo,"PTP_OC_CANON_SetPairingInfo"},
5899 {PTP_OC_CANON_GetPairingInfo,"PTP_OC_CANON_GetPairingInfo"},
5900 {PTP_OC_CANON_DeletePairingInfo,"PTP_OC_CANON_DeletePairingInfo"},
5901 {PTP_OC_CANON_GetMACAddress,"PTP_OC_CANON_GetMACAddress"},
5902 {PTP_OC_CANON_SetDisplayMonitor,"PTP_OC_CANON_SetDisplayMonitor"},
5903 {PTP_OC_CANON_PairingComplete,"PTP_OC_CANON_PairingComplete"},
5904 {PTP_OC_CANON_GetWirelessMAXChannel,"PTP_OC_CANON_GetWirelessMAXChannel" },
5905 {PTP_OC_CANON_GetWebServiceSpec,"PTP_OC_CANON_GetWebServiceSpec"},
5906 {PTP_OC_CANON_GetWebServiceData,"PTP_OC_CANON_GetWebServiceData"},
5907 {PTP_OC_CANON_SetWebServiceData,"PTP_OC_CANON_SetWebServiceData"},
5908 {PTP_OC_CANON_GetRootCertificateSpec,"PTP_OC_CANON_GetRootCertificateSpe c"},
5909 {PTP_OC_CANON_GetRootCertificateData,"PTP_OC_CANON_GetRootCertificateDat a"},
5910 {PTP_OC_CANON_SetRootCertificateData,"PTP_OC_CANON_SetRootCertificateDat a"},
5911 {PTP_OC_CANON_EOS_GetStorageIDs,"PTP_OC_CANON_EOS_GetStorageIDs"},
5912 {PTP_OC_CANON_EOS_GetStorageInfo,"PTP_OC_CANON_EOS_GetStorageInfo"},
5913 {PTP_OC_CANON_EOS_GetObjectInfo,"PTP_OC_CANON_EOS_GetObjectInfo"},
5914 {PTP_OC_CANON_EOS_GetObject,"PTP_OC_CANON_EOS_GetObject"},
5915 {PTP_OC_CANON_EOS_DeleteObject,"PTP_OC_CANON_EOS_DeleteObject"},
5916 {PTP_OC_CANON_EOS_FormatStore,"PTP_OC_CANON_EOS_FormatStore"},
5917 {PTP_OC_CANON_EOS_GetPartialObject,"PTP_OC_CANON_EOS_GetPartialObject"},
5918 {PTP_OC_CANON_EOS_GetDeviceInfoEx,"PTP_OC_CANON_EOS_GetDeviceInfoEx"},
5919 {PTP_OC_CANON_EOS_GetObjectInfoEx,"PTP_OC_CANON_EOS_GetObjectInfoEx"},
5920 {PTP_OC_CANON_EOS_GetThumbEx,"PTP_OC_CANON_EOS_GetThumbEx"},
5921 {PTP_OC_CANON_EOS_SendPartialObject,"PTP_OC_CANON_EOS_SendPartialObject" },
5922 {PTP_OC_CANON_EOS_SetObjectAttributes,"PTP_OC_CANON_EOS_SetObjectAttribu tes"},
5923 {PTP_OC_CANON_EOS_GetObjectTime,"PTP_OC_CANON_EOS_GetObjectTime"},
5924 {PTP_OC_CANON_EOS_SetObjectTime,"PTP_OC_CANON_EOS_SetObjectTime"},
5925 {PTP_OC_CANON_EOS_RemoteRelease,"PTP_OC_CANON_EOS_RemoteRelease"},
5926 {PTP_OC_CANON_EOS_SetDevicePropValueEx,"PTP_OC_CANON_EOS_SetDevicePropVa lueEx"},
5927 {PTP_OC_CANON_EOS_GetRemoteMode,"PTP_OC_CANON_EOS_GetRemoteMode"},
5928 {PTP_OC_CANON_EOS_SetRemoteMode,"PTP_OC_CANON_EOS_SetRemoteMode"},
5929 {PTP_OC_CANON_EOS_SetEventMode,"PTP_OC_CANON_EOS_SetEventMode"},
5930 {PTP_OC_CANON_EOS_GetEvent,"PTP_OC_CANON_EOS_GetEvent"},
5931 {PTP_OC_CANON_EOS_TransferComplete,"PTP_OC_CANON_EOS_TransferComplete"},
5932 {PTP_OC_CANON_EOS_CancelTransfer,"PTP_OC_CANON_EOS_CancelTransfer"},
5933 {PTP_OC_CANON_EOS_ResetTransfer,"PTP_OC_CANON_EOS_ResetTransfer"},
5934 {PTP_OC_CANON_EOS_PCHDDCapacity,"PTP_OC_CANON_EOS_PCHDDCapacity"},
5935 {PTP_OC_CANON_EOS_SetUILock,"PTP_OC_CANON_EOS_SetUILock"},
5936 {PTP_OC_CANON_EOS_ResetUILock,"PTP_OC_CANON_EOS_ResetUILock"},
5937 {PTP_OC_CANON_EOS_KeepDeviceOn,"PTP_OC_CANON_EOS_KeepDeviceOn"},
5938 {PTP_OC_CANON_EOS_SetNullPacketMode,"PTP_OC_CANON_EOS_SetNullPacketMode" },
5939 {PTP_OC_CANON_EOS_UpdateFirmware,"PTP_OC_CANON_EOS_UpdateFirmware"},
5940 {PTP_OC_CANON_EOS_TransferCompleteDT,"PTP_OC_CANON_EOS_TransferCompleteD T"},
5941 {PTP_OC_CANON_EOS_CancelTransferDT,"PTP_OC_CANON_EOS_CancelTransferDT"},
5942 {PTP_OC_CANON_EOS_SetWftProfile,"PTP_OC_CANON_EOS_SetWftProfile"},
5943 {PTP_OC_CANON_EOS_GetWftProfile,"PTP_OC_CANON_EOS_GetWftProfile"},
5944 {PTP_OC_CANON_EOS_SetProfileToWft,"PTP_OC_CANON_EOS_SetProfileToWft"},
5945 {PTP_OC_CANON_EOS_BulbStart,"PTP_OC_CANON_EOS_BulbStart"},
5946 {PTP_OC_CANON_EOS_BulbEnd,"PTP_OC_CANON_EOS_BulbEnd"},
5947 {PTP_OC_CANON_EOS_RequestDevicePropValue,"PTP_OC_CANON_EOS_RequestDevice PropValue"},
5948 {PTP_OC_CANON_EOS_RemoteReleaseOn,"PTP_OC_CANON_EOS_RemoteReleaseOn"},
5949 {PTP_OC_CANON_EOS_RemoteReleaseOff,"PTP_OC_CANON_EOS_RemoteReleaseOff"},
5950 {PTP_OC_CANON_EOS_RegistBackgroundImage,"PTP_OC_CANON_EOS_RegistBackgrou ndImage"},
5951 {PTP_OC_CANON_EOS_ChangePhotoStudioMode,"PTP_OC_CANON_EOS_ChangePhotoStu dioMode"},
5952 {PTP_OC_CANON_EOS_GetPartialObjectEx,"PTP_OC_CANON_EOS_GetPartialObjectE x"},
5953 {PTP_OC_CANON_EOS_ResetMirrorLockupState,"PTP_OC_CANON_EOS_ResetMirrorLo ckupState"},
5954 {PTP_OC_CANON_EOS_PopupBuiltinFlash,"PTP_OC_CANON_EOS_PopupBuiltinFlash" },
5955 {PTP_OC_CANON_EOS_EndGetPartialObjectEx,"PTP_OC_CANON_EOS_EndGetPartialO bjectEx"},
5956 {PTP_OC_CANON_EOS_MovieSelectSWOn,"PTP_OC_CANON_EOS_MovieSelectSWOn"},
5957 {PTP_OC_CANON_EOS_MovieSelectSWOff,"PTP_OC_CANON_EOS_MovieSelectSWOff"},
5958 {PTP_OC_CANON_EOS_GetCTGInfo,"PTP_OC_CANON_EOS_GetCTGInfo"},
5959 {PTP_OC_CANON_EOS_GetLensAdjust,"PTP_OC_CANON_EOS_GetLensAdjust"},
5960 {PTP_OC_CANON_EOS_SetLensAdjust,"PTP_OC_CANON_EOS_SetLensAdjust"},
5961 {PTP_OC_CANON_EOS_GetMusicInfo,"PTP_OC_CANON_EOS_GetMusicInfo"},
5962 {PTP_OC_CANON_EOS_CreateHandle,"PTP_OC_CANON_EOS_CreateHandle"},
5963 {PTP_OC_CANON_EOS_SendPartialObjectEx,"PTP_OC_CANON_EOS_SendPartialObjec tEx"},
5964 {PTP_OC_CANON_EOS_EndSendPartialObjectEx,"PTP_OC_CANON_EOS_EndSendPartia lObjectEx"},
5965 {PTP_OC_CANON_EOS_SetCTGInfo,"PTP_OC_CANON_EOS_SetCTGInfo"},
5966 {PTP_OC_CANON_EOS_SetRequestOLCInfoGroup,"PTP_OC_CANON_EOS_SetRequestOLC InfoGroup"},
5967 {PTP_OC_CANON_EOS_SetRequestRollingPitchingLevel,"PTP_OC_CANON_EOS_SetRe questRollingPitchingLevel"},
5968 {PTP_OC_CANON_EOS_GetCameraSupport,"PTP_OC_CANON_EOS_GetCameraSupport"},
5969 {PTP_OC_CANON_EOS_SetRating,"PTP_OC_CANON_EOS_SetRating"},
5970 {PTP_OC_CANON_EOS_RequestInnerDevelopStart,"PTP_OC_CANON_EOS_RequestInne rDevelopStart"},
5971 {PTP_OC_CANON_EOS_RequestInnerDevelopParamChange,"PTP_OC_CANON_EOS_Reque stInnerDevelopParamChange"},
5972 {PTP_OC_CANON_EOS_RequestInnerDevelopEnd,"PTP_OC_CANON_EOS_RequestInnerD evelopEnd"},
5973 {PTP_OC_CANON_EOS_GpsLoggingDataMode,"PTP_OC_CANON_EOS_GpsLoggingDataMod e"},
5974 {PTP_OC_CANON_EOS_GetGpsLogCurrentHandle,"PTP_OC_CANON_EOS_GetGpsLogCurr entHandle"},
5975 {PTP_OC_CANON_EOS_InitiateViewfinder,"PTP_OC_CANON_EOS_InitiateViewfinde r"},
5976 {PTP_OC_CANON_EOS_TerminateViewfinder,"PTP_OC_CANON_EOS_TerminateViewfin der"},
5977 {PTP_OC_CANON_EOS_GetViewFinderData,"PTP_OC_CANON_EOS_GetViewFinderData" },
5978 {PTP_OC_CANON_EOS_DoAf,"PTP_OC_CANON_EOS_DoAf"},
5979 {PTP_OC_CANON_EOS_DriveLens,"PTP_OC_CANON_EOS_DriveLens"},
5980 {PTP_OC_CANON_EOS_DepthOfFieldPreview,"PTP_OC_CANON_EOS_DepthOfFieldPrev iew"},
5981 {PTP_OC_CANON_EOS_ClickWB,"PTP_OC_CANON_EOS_ClickWB"},
5982 {PTP_OC_CANON_EOS_Zoom,"PTP_OC_CANON_EOS_Zoom"},
5983 {PTP_OC_CANON_EOS_ZoomPosition,"PTP_OC_CANON_EOS_ZoomPosition"},
5984 {PTP_OC_CANON_EOS_SetLiveAfFrame,"PTP_OC_CANON_EOS_SetLiveAfFrame"},
5985 {PTP_OC_CANON_EOS_TouchAfPosition,"PTP_OC_CANON_EOS_TouchAfPosition"},
5986 {PTP_OC_CANON_EOS_SetLvPcFlavoreditMode,"PTP_OC_CANON_EOS_SetLvPcFlavore ditMode"},
5987 {PTP_OC_CANON_EOS_SetLvPcFlavoreditParam,"PTP_OC_CANON_EOS_SetLvPcFlavor editParam"},
5988 {PTP_OC_CANON_EOS_AfCancel,"PTP_OC_CANON_EOS_AfCancel"},
5989 {PTP_OC_CANON_EOS_SetDefaultCameraSetting,"PTP_OC_CANON_EOS_SetDefaultCa meraSetting"},
5990 {PTP_OC_CANON_EOS_GetAEData,"PTP_OC_CANON_EOS_GetAEData"},
5991 {PTP_OC_CANON_EOS_NotifyNetworkError,"PTP_OC_CANON_EOS_NotifyNetworkErro r"},
5992 {PTP_OC_CANON_EOS_AdapterTransferProgress,"PTP_OC_CANON_EOS_AdapterTrans ferProgress"},
5993 {PTP_OC_CANON_EOS_TransferComplete2,"PTP_OC_CANON_EOS_TransferComplete2" },
5994 {PTP_OC_CANON_EOS_CancelTransfer2,"PTP_OC_CANON_EOS_CancelTransfer2"},
5995 {PTP_OC_CANON_EOS_FAPIMessageTX,"PTP_OC_CANON_EOS_FAPIMessageTX"},
5996 {PTP_OC_CANON_EOS_FAPIMessageRX,"PTP_OC_CANON_EOS_FAPIMessageRX"},
5997 };
5998
5999 ptp_opcode_trans_t ptp_opcode_sony_trans[] = {
6000 {PTP_OC_SONY_SDIOConnect,"PTP_OC_SONY_SDIOConnect"},
6001 {PTP_OC_SONY_GetSDIOGetExtDeviceInfo,"PTP_OC_SONY_GetSDIOGetExtDeviceInf o"},
6002 {PTP_OC_SONY_GetDevicePropdesc,"PTP_OC_SONY_GetDevicePropdesc"},
6003 {PTP_OC_SONY_GetDevicePropertyValue,"PTP_OC_SONY_GetDevicePropertyValue" },
6004 {PTP_OC_SONY_SetControlDeviceA,"PTP_OC_SONY_SetControlDeviceA"},
6005 {PTP_OC_SONY_GetControlDeviceDesc,"PTP_OC_SONY_GetControlDeviceDesc"},
6006 {PTP_OC_SONY_SetControlDeviceB,"PTP_OC_SONY_SetControlDeviceB"},
6007 {PTP_OC_SONY_GetAllDevicePropData,"PTP_OC_SONY_GetAllDevicePropData"},
6008 };
6009
6010 const char*
6011 ptp_get_opcode_name(PTPParams* params, uint16_t opcode)
5080 { 6012 {
5081 » int i; 6013 #define RETURN_NAME_FROM_TABLE(TABLE, OPCODE) \
5082 6014 { \
5083 » if (!(opcode & 0x8000)) { 6015 » unsigned int i; \
5084 » » for (i=0;i<sizeof(ptp_opcode_trans)/sizeof(ptp_opcode_trans[0]); i++) 6016 » for (i=0; i<sizeof(TABLE)/sizeof(TABLE[0]); i++) \
5085 » » » if (opcode == ptp_opcode_trans[i].opcode) 6017 » » if (OPCODE == TABLE[i].opcode) \
5086 » » » » return snprintf(txt, spaceleft, "%s", _(ptp_opco de_trans[i].name)); 6018 » » » return _(TABLE[i].name); \
5087 » } else { 6019 » return _("Unknown PTP_OC"); \
5088 » » switch (params->deviceinfo.VendorExtensionID) { 6020 }
5089 » » case PTP_VENDOR_MICROSOFT: 6021
5090 » » case PTP_VENDOR_MTP: 6022 » if (!(opcode & 0x8000))
5091 » » » for (i=0;i<sizeof(ptp_opcode_mtp_trans)/sizeof(ptp_opcod e_mtp_trans[0]);i++) 6023 » » RETURN_NAME_FROM_TABLE(ptp_opcode_trans, opcode);
5092 » » » » if (opcode == ptp_opcode_mtp_trans[i].opcode) 6024
5093 » » » » » return snprintf(txt, spaceleft, "%s", _( ptp_opcode_mtp_trans[i].name)); 6025 » switch (params->deviceinfo.VendorExtensionID) {
5094 » » » break; 6026 » case PTP_VENDOR_MICROSOFT:
5095 » » default:break; 6027 » case PTP_VENDOR_MTP:» RETURN_NAME_FROM_TABLE(ptp_opcode_mtp_trans, opc ode);
5096 » » } 6028 » case PTP_VENDOR_NIKON:» RETURN_NAME_FROM_TABLE(ptp_opcode_nikon_trans, o pcode);
6029 » case PTP_VENDOR_CANON:» RETURN_NAME_FROM_TABLE(ptp_opcode_canon_trans, o pcode);
6030 » case PTP_VENDOR_SONY:» RETURN_NAME_FROM_TABLE(ptp_opcode_sony_trans, op code);
6031 » default:
6032 » » break;
5097 } 6033 }
5098 » return snprintf (txt, spaceleft,_("Unknown (%04x)"), opcode); 6034 #undef RETURN_NAME_FROM_TABLE
6035
6036 » return _("Unknown VendorExtensionID");
5099 } 6037 }
5100 6038
5101 6039
5102 struct { 6040 struct {
5103 uint16_t id; 6041 uint16_t id;
5104 const char *name; 6042 const char *name;
5105 } ptp_opc_trans[] = { 6043 } ptp_opc_trans[] = {
5106 {PTP_OPC_StorageID,"StorageID"}, 6044 {PTP_OPC_StorageID,"StorageID"},
5107 {PTP_OPC_ObjectFormat,"ObjectFormat"}, 6045 {PTP_OPC_ObjectFormat,"ObjectFormat"},
5108 {PTP_OPC_ProtectionStatus,"ProtectionStatus"}, 6046 {PTP_OPC_ProtectionStatus,"ProtectionStatus"},
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
5267 {PTP_OPC_VideoBitRate,"VideoBitRate"}, 6205 {PTP_OPC_VideoBitRate,"VideoBitRate"},
5268 {PTP_OPC_FramesPerThousandSeconds,"FramesPerThousandSeconds"}, 6206 {PTP_OPC_FramesPerThousandSeconds,"FramesPerThousandSeconds"},
5269 {PTP_OPC_KeyFrameDistance,"KeyFrameDistance"}, 6207 {PTP_OPC_KeyFrameDistance,"KeyFrameDistance"},
5270 {PTP_OPC_BufferSize,"BufferSize"}, 6208 {PTP_OPC_BufferSize,"BufferSize"},
5271 {PTP_OPC_EncodingQuality,"EncodingQuality"}, 6209 {PTP_OPC_EncodingQuality,"EncodingQuality"},
5272 {PTP_OPC_EncodingProfile,"EncodingProfile"}, 6210 {PTP_OPC_EncodingProfile,"EncodingProfile"},
5273 {PTP_OPC_BuyFlag,"BuyFlag"}, 6211 {PTP_OPC_BuyFlag,"BuyFlag"},
5274 }; 6212 };
5275 6213
5276 int 6214 int
5277 ptp_render_mtp_propname(uint16_t propid, int spaceleft, char *txt) { 6215 ptp_render_mtp_propname(uint16_t propid, int spaceleft, char *txt)
5278 » int i; 6216 {
6217 » unsigned int i;
5279 for (i=0;i<sizeof(ptp_opc_trans)/sizeof(ptp_opc_trans[0]);i++) 6218 for (i=0;i<sizeof(ptp_opc_trans)/sizeof(ptp_opc_trans[0]);i++)
5280 if (propid == ptp_opc_trans[i].id) 6219 if (propid == ptp_opc_trans[i].id)
5281 return snprintf(txt, spaceleft, "%s", ptp_opc_trans[i].n ame); 6220 return snprintf(txt, spaceleft, "%s", ptp_opc_trans[i].n ame);
5282 return snprintf (txt, spaceleft,"unknown(%04x)", propid); 6221 return snprintf (txt, spaceleft,"unknown(%04x)", propid);
5283 } 6222 }
5284 6223
5285 /* 6224 /*
5286 * Allocate and default-initialize a few object properties. 6225 * Allocate and default-initialize a few object properties.
5287 */ 6226 */
5288 MTPProperties * 6227 MTPProperties *
5289 ptp_get_new_object_prop_entry(MTPProperties **props, int *nrofprops) { 6228 ptp_get_new_object_prop_entry(MTPProperties **props, int *nrofprops)
6229 {
5290 MTPProperties *newprops; 6230 MTPProperties *newprops;
5291 MTPProperties *prop; 6231 MTPProperties *prop;
5292 6232
5293 » if (*props == NULL) { 6233 » newprops = realloc(*props,sizeof(MTPProperties)*(*nrofprops+1));
5294 » » newprops = malloc(sizeof(MTPProperties)*(*nrofprops+1));
5295 » } else {
5296 » » newprops = realloc(*props,sizeof(MTPProperties)*(*nrofprops+1));
5297 » }
5298 if (newprops == NULL) 6234 if (newprops == NULL)
5299 return NULL; 6235 return NULL;
5300 prop = &newprops[*nrofprops]; 6236 prop = &newprops[*nrofprops];
5301 prop->property = PTP_OPC_StorageID; /* Should be "unknown" */ 6237 prop->property = PTP_OPC_StorageID; /* Should be "unknown" */
5302 prop->datatype = PTP_DTC_UNDEF; 6238 prop->datatype = PTP_DTC_UNDEF;
5303 prop->ObjectHandle = 0x00000000U; 6239 prop->ObjectHandle = 0x00000000U;
5304 prop->propval.str = NULL; 6240 prop->propval.str = NULL;
5305 6241
5306 (*props) = newprops; 6242 (*props) = newprops;
5307 (*nrofprops)++; 6243 (*nrofprops)++;
(...skipping 27 matching lines...) Expand all
5335 free(props); 6271 free(props);
5336 } 6272 }
5337 6273
5338 /* 6274 /*
5339 * Find a certain object property in the cache, i.e. a certain metadata 6275 * Find a certain object property in the cache, i.e. a certain metadata
5340 * item for a certain object handle. 6276 * item for a certain object handle.
5341 */ 6277 */
5342 MTPProperties * 6278 MTPProperties *
5343 ptp_find_object_prop_in_cache(PTPParams *params, uint32_t const handle, uint32_t const attribute_id) 6279 ptp_find_object_prop_in_cache(PTPParams *params, uint32_t const handle, uint32_t const attribute_id)
5344 { 6280 {
5345 » int» i; 6281 » unsigned int» i;
5346 MTPProperties *prop; 6282 MTPProperties *prop;
5347 PTPObject *ob; 6283 PTPObject *ob;
5348 uint16_t ret; 6284 uint16_t ret;
5349 6285
5350 ret = ptp_object_find (params, handle, &ob); 6286 ret = ptp_object_find (params, handle, &ob);
5351 if (ret != PTP_RC_OK) 6287 if (ret != PTP_RC_OK)
5352 return NULL; 6288 return NULL;
5353 prop = ob->mtpprops; 6289 prop = ob->mtpprops;
5354 for (i=0;i<ob->nrofmtpprops;i++) { 6290 for (i=0;i<ob->nrofmtpprops;i++) {
5355 if (attribute_id == prop->property) 6291 if (attribute_id == prop->property)
5356 return prop; 6292 return prop;
5357 prop++; 6293 prop++;
5358 } 6294 }
5359 return NULL; 6295 return NULL;
5360 } 6296 }
5361 6297
5362 void 6298 uint16_t
5363 ptp_remove_object_from_cache(PTPParams *params, uint32_t handle) 6299 ptp_remove_object_from_cache(PTPParams *params, uint32_t handle)
5364 { 6300 {
5365 » int i; 6301 » unsigned int i;
5366 PTPObject *ob; 6302 PTPObject *ob;
5367 uint16_t ret;
5368 6303
5369 » ret = ptp_object_find (params, handle, &ob); 6304 » CHECK_PTP_RC(ptp_object_find (params, handle, &ob));
5370 » if (ret != PTP_RC_OK)
5371 » » return;
5372 i = ob-params->objects; 6305 i = ob-params->objects;
5373 /* remove object from object info cache */ 6306 /* remove object from object info cache */
5374 ptp_free_object (ob); 6307 ptp_free_object (ob);
5375 6308
5376 if (i < params->nrofobjects-1) 6309 if (i < params->nrofobjects-1)
5377 memmove (ob,ob+1,(params->nrofobjects-1-i)*sizeof(PTPObject)); 6310 memmove (ob,ob+1,(params->nrofobjects-1-i)*sizeof(PTPObject));
5378 params->nrofobjects--; 6311 params->nrofobjects--;
5379 /* We use less memory than before so this shouldn't fail */ 6312 /* We use less memory than before so this shouldn't fail */
5380 params->objects = realloc(params->objects, sizeof(PTPObject)*params->nro fobjects); 6313 params->objects = realloc(params->objects, sizeof(PTPObject)*params->nro fobjects);
6314 return PTP_RC_OK;
5381 } 6315 }
5382 6316
5383 static int _cmp_ob (const void *a, const void *b) { 6317 static int _cmp_ob (const void *a, const void *b)
6318 {
5384 PTPObject *oa = (PTPObject*)a; 6319 PTPObject *oa = (PTPObject*)a;
5385 PTPObject *ob = (PTPObject*)b; 6320 PTPObject *ob = (PTPObject*)b;
5386 6321
5387 return oa->oid - ob->oid; 6322 return oa->oid - ob->oid;
5388 } 6323 }
5389 6324
5390 void 6325 void
5391 ptp_objects_sort (PTPParams *params) { 6326 ptp_objects_sort (PTPParams *params)
6327 {
5392 qsort (params->objects, params->nrofobjects, sizeof(PTPObject), _cmp_ob) ; 6328 qsort (params->objects, params->nrofobjects, sizeof(PTPObject), _cmp_ob) ;
5393 } 6329 }
5394 6330
5395 /* Binary search in objects. Needs "objects" to be a sorted by objectid list! * / 6331 /* Binary search in objects. Needs "objects" to be a sorted by objectid list! * /
5396 uint16_t 6332 uint16_t
5397 ptp_object_find (PTPParams *params, uint32_t handle, PTPObject **retob) { 6333 ptp_object_find (PTPParams *params, uint32_t handle, PTPObject **retob)
6334 {
5398 PTPObject tmpob; 6335 PTPObject tmpob;
5399 6336
5400 tmpob.oid = handle; 6337 tmpob.oid = handle;
5401 *retob = bsearch (&tmpob, params->objects, params->nrofobjects, sizeof(t mpob), _cmp_ob); 6338 *retob = bsearch (&tmpob, params->objects, params->nrofobjects, sizeof(t mpob), _cmp_ob);
5402 if (!*retob) 6339 if (!*retob)
5403 return PTP_RC_GeneralError; 6340 return PTP_RC_GeneralError;
5404 return PTP_RC_OK; 6341 return PTP_RC_OK;
5405 } 6342 }
5406 6343
5407 /* Binary search in objects + insert of not found. Needs "objects" to be a sorte d by objectid list! */ 6344 /* Binary search in objects + insert of not found. Needs "objects" to be a sorte d by objectid list! */
5408 uint16_t 6345 uint16_t
5409 ptp_object_find_or_insert (PTPParams *params, uint32_t handle, PTPObject **retob ) { 6346 ptp_object_find_or_insert (PTPParams *params, uint32_t handle, PTPObject **retob )
5410 » int » » begin, end, cursor; 6347 {
5411 » int» » insertat; 6348 » unsigned int » begin, end, cursor;
6349 » unsigned int» insertat;
5412 PTPObject *newobs; 6350 PTPObject *newobs;
5413 6351
5414 if (!handle) return PTP_RC_GeneralError; 6352 if (!handle) return PTP_RC_GeneralError;
5415 *retob = NULL; 6353 *retob = NULL;
5416 if (!params->nrofobjects) { 6354 if (!params->nrofobjects) {
5417 params->objects = calloc(1,sizeof(PTPObject)); 6355 params->objects = calloc(1,sizeof(PTPObject));
5418 params->nrofobjects = 1; 6356 params->nrofobjects = 1;
5419 params->objects[0].oid = handle; 6357 params->objects[0].oid = handle;
5420 *retob = &params->objects[0]; 6358 *retob = &params->objects[0];
5421 return PTP_RC_OK; 6359 return PTP_RC_OK;
(...skipping 28 matching lines...) Expand all
5450 } else { 6388 } else {
5451 if ((end == params->nrofobjects-1) && (handle > params->objects[ end].oid)) 6389 if ((end == params->nrofobjects-1) && (handle > params->objects[ end].oid))
5452 insertat=end+1; 6390 insertat=end+1;
5453 else 6391 else
5454 insertat=begin+1; 6392 insertat=begin+1;
5455 } 6393 }
5456 /*ptp_debug (params, "inserting oid %x at [%x,%x], begin=%d, end=%d, ins ertat=%d\n", handle, params->objects[begin].oid, params->objects[end].oid, begin , end, insertat);*/ 6394 /*ptp_debug (params, "inserting oid %x at [%x,%x], begin=%d, end=%d, ins ertat=%d\n", handle, params->objects[begin].oid, params->objects[end].oid, begin , end, insertat);*/
5457 newobs = realloc (params->objects, sizeof(PTPObject)*(params->nrofobject s+1)); 6395 newobs = realloc (params->objects, sizeof(PTPObject)*(params->nrofobject s+1));
5458 if (!newobs) return PTP_RC_GeneralError; 6396 if (!newobs) return PTP_RC_GeneralError;
5459 params->objects = newobs; 6397 params->objects = newobs;
5460 » if (insertat<=params->nrofobjects) 6398 » if (insertat<params->nrofobjects)
5461 memmove (&params->objects[insertat+1],&params->objects[insertat] ,(params->nrofobjects-insertat)*sizeof(PTPObject)); 6399 memmove (&params->objects[insertat+1],&params->objects[insertat] ,(params->nrofobjects-insertat)*sizeof(PTPObject));
5462 memset(&params->objects[insertat],0,sizeof(PTPObject)); 6400 memset(&params->objects[insertat],0,sizeof(PTPObject));
5463 params->objects[insertat].oid = handle; 6401 params->objects[insertat].oid = handle;
5464 *retob = &params->objects[insertat]; 6402 *retob = &params->objects[insertat];
5465 params->nrofobjects++; 6403 params->nrofobjects++;
5466 return PTP_RC_OK; 6404 return PTP_RC_OK;
5467 } 6405 }
5468 6406
5469 uint16_t 6407 uint16_t
5470 ptp_object_want (PTPParams *params, uint32_t handle, int want, PTPObject **retob ) { 6408 ptp_object_want (PTPParams *params, uint32_t handle, unsigned int want, PTPObjec t **retob)
6409 {
5471 uint16_t ret; 6410 uint16_t ret;
5472 PTPObject *ob; 6411 PTPObject *ob;
5473 /*Camera *camera = ((PTPData *)params->data)->camera;*/ 6412 /*Camera *camera = ((PTPData *)params->data)->camera;*/
5474 6413
5475 /* If GetObjectInfo is broken, force GetPropList */ 6414 /* If GetObjectInfo is broken, force GetPropList */
5476 if (params->device_flags & DEVICE_FLAG_PROPLIST_OVERRIDES_OI) 6415 if (params->device_flags & DEVICE_FLAG_PROPLIST_OVERRIDES_OI)
5477 want |= PTPOBJECT_MTPPROPLIST_LOADED; 6416 want |= PTPOBJECT_MTPPROPLIST_LOADED;
5478 6417
5479 *retob = NULL; 6418 *retob = NULL;
5480 if (!handle) { 6419 if (!handle) {
5481 ptp_debug (params, "ptp_object_want: querying handle 0?\n"); 6420 ptp_debug (params, "ptp_object_want: querying handle 0?\n");
5482 return PTP_RC_GeneralError; 6421 return PTP_RC_GeneralError;
5483 } 6422 }
5484 » ret = ptp_object_find_or_insert (params, handle, &ob); 6423 » CHECK_PTP_RC(ptp_object_find_or_insert (params, handle, &ob));
5485 » if (ret != PTP_RC_OK)
5486 » » return PTP_RC_GeneralError;
5487 *retob = ob; 6424 *retob = ob;
5488 /* Do we have all of it already? */ 6425 /* Do we have all of it already? */
5489 if ((ob->flags & want) == want) 6426 if ((ob->flags & want) == want)
5490 return PTP_RC_OK; 6427 return PTP_RC_OK;
5491 6428
5492 #define X (PTPOBJECT_OBJECTINFO_LOADED|PTPOBJECT_STORAGEID_LOADED|PTPOBJECT_PARE NTOBJECT_LOADED) 6429 #define X (PTPOBJECT_OBJECTINFO_LOADED|PTPOBJECT_STORAGEID_LOADED|PTPOBJECT_PARE NTOBJECT_LOADED)
5493 if ((want & X) && ((ob->flags & X) != X)) { 6430 if ((want & X) && ((ob->flags & X) != X)) {
5494 uint32_t saveparent = 0; 6431 uint32_t saveparent = 0;
5495 6432
5496 /* One EOS issue, where getobjecthandles(root) returns obs witho ut root flag. */ 6433 /* One EOS issue, where getobjecthandles(root) returns obs witho ut root flag. */
5497 if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED) 6434 if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED)
5498 saveparent = ob->oi.ParentObject; 6435 saveparent = ob->oi.ParentObject;
5499 6436
5500 ret = ptp_getobjectinfo (params, handle, &ob->oi); 6437 ret = ptp_getobjectinfo (params, handle, &ob->oi);
5501 if (ret != PTP_RC_OK) { 6438 if (ret != PTP_RC_OK) {
5502 /* kill it from the internal list ... */ 6439 /* kill it from the internal list ... */
5503 ptp_remove_object_from_cache(params, handle); 6440 ptp_remove_object_from_cache(params, handle);
5504 return ret; 6441 return ret;
5505 } 6442 }
5506 if (!ob->oi.Filename) ob->oi.Filename=strdup("<none>"); 6443 if (!ob->oi.Filename) ob->oi.Filename=strdup("<none>");
5507 if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED) 6444 if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED)
5508 ob->oi.ParentObject = saveparent; 6445 ob->oi.ParentObject = saveparent;
5509 6446
5510 /* Second EOS issue, 0x20000000 has 0x20000000 as parent */ 6447 /* Second EOS issue, 0x20000000 has 0x20000000 as parent */
5511 if (ob->oi.ParentObject == handle) 6448 if (ob->oi.ParentObject == handle)
5512 ob->oi.ParentObject = 0; 6449 ob->oi.ParentObject = 0;
6450
6451 /* Read out the canon special flags */
6452 if ((params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) & &
6453 ptp_operation_issupported(params,PTP_OC_CANON_GetObjectInfoE x)) {
6454 PTPCANONFolderEntry *ents = NULL;
6455 uint32_t numents = 0;
6456
6457 ret = ptp_canon_getobjectinfo(params,
6458 ob->oi.StorageID,0,
6459 ob->oi.ParentObject,handle,
6460 &ents,&numents
6461 );
6462 if ((ret == PTP_RC_OK) && (numents >= 1))
6463 ob->canon_flags = ents[0].Flags;
6464 free (ents);
6465 }
6466
5513 ob->flags |= X; 6467 ob->flags |= X;
5514
5515 /* EOS bug, DCIM links back to itself. */
5516 } 6468 }
5517 #undef X 6469 #undef X
5518 if ( (want & PTPOBJECT_MTPPROPLIST_LOADED) && 6470 if ( (want & PTPOBJECT_MTPPROPLIST_LOADED) &&
5519 (!(ob->flags & PTPOBJECT_MTPPROPLIST_LOADED)) 6471 (!(ob->flags & PTPOBJECT_MTPPROPLIST_LOADED))
5520 ) { 6472 ) {
5521 int nrofprops = 0; 6473 int nrofprops = 0;
5522 MTPProperties *props = NULL; 6474 MTPProperties *props = NULL;
5523 6475
5524 if (params->device_flags & DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST) { 6476 if (params->device_flags & DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST) {
5525 want &= ~PTPOBJECT_MTPPROPLIST_LOADED; 6477 want &= ~PTPOBJECT_MTPPROPLIST_LOADED;
5526 goto fallback; 6478 goto fallback;
5527 } 6479 }
5528 /* Microsoft/MTP has fast directory retrieval. */ 6480 /* Microsoft/MTP has fast directory retrieval. */
5529 if (!ptp_operation_issupported(params,PTP_OC_MTP_GetObjPropList) ) { 6481 if (!ptp_operation_issupported(params,PTP_OC_MTP_GetObjPropList) ) {
5530 want &= ~PTPOBJECT_MTPPROPLIST_LOADED; 6482 want &= ~PTPOBJECT_MTPPROPLIST_LOADED;
5531 goto fallback; 6483 goto fallback;
5532 } 6484 }
5533 6485
5534 ptp_debug (params, "ptp2/mtpfast: reading mtp proplist of %08x", handle); 6486 ptp_debug (params, "ptp2/mtpfast: reading mtp proplist of %08x", handle);
5535 /* We just want this one object, not all at once. */ 6487 /* We just want this one object, not all at once. */
5536 ret = ptp_mtp_getobjectproplist_single (params, handle, &props, &nrofprops); 6488 ret = ptp_mtp_getobjectproplist_single (params, handle, &props, &nrofprops);
5537 if (ret != PTP_RC_OK) 6489 if (ret != PTP_RC_OK)
5538 goto fallback; 6490 goto fallback;
5539 ob->mtpprops = props; 6491 ob->mtpprops = props;
5540 ob->nrofmtpprops = nrofprops; 6492 ob->nrofmtpprops = nrofprops;
5541 6493
5542 /* Override the ObjectInfo data with data from properties */ 6494 /* Override the ObjectInfo data with data from properties */
5543 if (params->device_flags & DEVICE_FLAG_PROPLIST_OVERRIDES_OI) { 6495 if (params->device_flags & DEVICE_FLAG_PROPLIST_OVERRIDES_OI) {
5544 » » » int i; 6496 » » » unsigned int i;
5545 MTPProperties *prop = ob->mtpprops; 6497 MTPProperties *prop = ob->mtpprops;
5546 6498
5547 for (i=0;i<ob->nrofmtpprops;i++,prop++) { 6499 for (i=0;i<ob->nrofmtpprops;i++,prop++) {
5548 /* in case we got all subtree objects */ 6500 /* in case we got all subtree objects */
5549 if (prop->ObjectHandle != handle) continue; 6501 if (prop->ObjectHandle != handle) continue;
5550 6502
5551 switch (prop->property) { 6503 switch (prop->property) {
5552 case PTP_OPC_StorageID: 6504 case PTP_OPC_StorageID:
5553 ob->oi.StorageID = prop->propval.u32; 6505 ob->oi.StorageID = prop->propval.u32;
5554 break; 6506 break;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
5702 return PTP_RC_GeneralError; 6654 return PTP_RC_GeneralError;
5703 } 6655 }
5704 6656
5705 6657
5706 uint16_t 6658 uint16_t
5707 ptp_add_object_to_cache(PTPParams *params, uint32_t handle) 6659 ptp_add_object_to_cache(PTPParams *params, uint32_t handle)
5708 { 6660 {
5709 PTPObject *ob; 6661 PTPObject *ob;
5710 return ptp_object_want (params, handle, PTPOBJECT_OBJECTINFO_LOADED|PTPO BJECT_MTPPROPLIST_LOADED, &ob); 6662 return ptp_object_want (params, handle, PTPOBJECT_OBJECTINFO_LOADED|PTPO BJECT_MTPPROPLIST_LOADED, &ob);
5711 } 6663 }
OLDNEW
« no previous file with comments | « src/ptp.h ('k') | src/ptp-pack.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698