13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* ptp.c
23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
33aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2001-2004 Mariusz Woloszyn <emsi@ipartners.pl>
43aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2003-2009 Marcus Meissner <marcus@jet.franken.de>
53aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2006-2008 Linus Walleij <triad@df.lth.se>
63aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2007 Tero Saarni <tero.saarni@gmail.com>
73aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
83aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is free software; you can redistribute it and/or
93aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * modify it under the terms of the GNU Lesser General Public
103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License as published by the Free Software Foundation; either
113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * version 2 of the License, or (at your option) any later version.
123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is distributed in the hope that it will be useful,
143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of
153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Lesser General Public License for more details.
173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * You should have received a copy of the GNU Lesser General Public
193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License along with this library; if not, write to the
203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Boston, MA 02111-1307, USA.
223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define _BSD_SOURCE
253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "config.h"
263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "ptp.h"
273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdlib.h>
293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdarg.h>
303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdio.h>
313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <string.h>
323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <unistd.h>
333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#ifdef ENABLE_NLS
353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  include <libintl.h>
363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  undef _
373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define _(String) dgettext (PACKAGE, String)
383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  ifdef gettext_noop
393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#    define N_(String) gettext_noop (String)
403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  else
413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#    define N_(String) (String)
423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  endif
433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#else
443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define textdomain(String) (String)
453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define gettext(String) (String)
463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define dgettext(Domain,Message) (Message)
473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define dcgettext(Domain,Message,Type) (Message)
483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define bindtextdomain(Domain,Directory) (Domain)
493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define _(String) (String)
503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#  define N_(String) (String)
513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif
523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define CHECK_PTP_RC(result)	{uint16_t r=(result); if (r!=PTP_RC_OK) return r;}
543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_CNT_INIT(cnt) {memset(&cnt,0,sizeof(cnt));}
563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t ptp_exit_recv_memory_handler (PTPDataHandler*,unsigned char**,unsigned long*);
583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t ptp_init_recv_memory_handler(PTPDataHandler*);
593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t ptp_init_send_memory_handler(PTPDataHandler*,unsigned char*,unsigned long len);
603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t ptp_exit_send_memory_handler (PTPDataHandler *handler);
613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic void
633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_debug (PTPParams *params, const char *format, ...)
643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_list args;
663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_start (args, format);
683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        if (params->debug_func!=NULL)
693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev                params->debug_func (params->data, format, args);
703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        else
713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{
723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev                vfprintf (stderr, format, args);
733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fprintf (stderr,"\n");
743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fflush (stderr);
753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_end (args);
773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic void
803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_error (PTPParams *params, const char *format, ...)
813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_list args;
833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_start (args, format);
853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        if (params->error_func!=NULL)
863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev                params->error_func (params->data, format, args);
873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        else
883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{
893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev                vfprintf (stderr, format, args);
903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fprintf (stderr,"\n");
913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fflush (stderr);
923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        va_end (args);
943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Pack / unpack functions */
973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "ptp-pack.c"
993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* major PTP functions */
1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Transaction data phase description */
1033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_DP_NODATA		0x0000	/* no data phase */
1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_DP_SENDDATA		0x0001	/* sending data */
1053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_DP_GETDATA		0x0002	/* receiving data */
1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_DP_DATA_MASK	0x00ff	/* data phase mask */
1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
1093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_transaction:
1103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
1113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		PTPContainer* ptp	- general ptp container
1123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		uint16_t flags		- lower 8 bits - data phase description
1133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		unsigned int sendlen	- senddata phase data length
1143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		char** data		- send or receive data buffer pointer
1153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		int* recvlen		- receive data length
1163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
1173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Performs PTP transaction. ptp is a PTPContainer with appropriate fields
1183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * filled in (i.e. operation code and parameters). It's up to caller to do
1193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * so.
1203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The flags decide thether the transaction has a data phase and what is its
1213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * direction (send or receive).
1223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * If transaction is sending data the sendlen should contain its length in
1233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * bytes, otherwise it's ignored.
1243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The data should contain an address of a pointer to data going to be sent
1253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * or is filled with such a pointer address if data are received depending
1263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * od dataphase direction (send or received) or is beeing ignored (no
1273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * dataphase).
1283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The memory for a pointer should be preserved by the caller, if data are
1293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * beeing retreived the appropriate amount of memory is beeing allocated
1303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * (the caller should handle that!).
1313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
1323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
1333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success PTPContainer* ptp contains PTP Response Phase container with
1343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * all fields filled in.
1353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
1363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
1373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_transaction_new (PTPParams* params, PTPContainer* ptp,
1383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t flags, unsigned int sendlen,
1393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTPDataHandler *handler
1403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
1413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int tries;
1423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((params==NULL) || (ptp==NULL))
1443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_ERROR_BADPARAM;
1453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp->Transaction_ID=params->transaction_id++;
1473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp->SessionID=params->session_id;
1483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* send request */
1493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	CHECK_PTP_RC(params->sendreq_func (params, ptp));
1503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* is there a dataphase? */
1513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (flags&PTP_DP_DATA_MASK) {
1523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_SENDDATA:
1533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{
1543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint16_t ret;
1553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ret = params->senddata_func(params, ptp,
1563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev						    sendlen, handler);
1573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ret == PTP_ERROR_CANCEL) {
1583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ret = params->cancelreq_func(params,
1593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev							     params->transaction_id-1);
1603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (ret == PTP_RC_OK)
1613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ret = PTP_ERROR_CANCEL;
1623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
1633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ret != PTP_RC_OK)
1643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return ret;
1653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
1663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
1673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_GETDATA:
1683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{
1693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint16_t ret;
1703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ret = params->getdata_func(params, ptp, handler);
1713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ret == PTP_ERROR_CANCEL) {
1723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ret = params->cancelreq_func(params,
1733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev							     params->transaction_id-1);
1743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (ret == PTP_RC_OK)
1753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ret = PTP_ERROR_CANCEL;
1763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
1773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ret != PTP_RC_OK)
1783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return ret;
1793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
1803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
1813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_NODATA:
1823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
1833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:
1843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_ERROR_BADPARAM;
1853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
1863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	tries = 3;
1873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	while (1) {
1883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* get response */
1893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		CHECK_PTP_RC(params->getresp_func(params, ptp));
1903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ptp->Transaction_ID != params->transaction_id-1) {
1913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/* try to clean up potential left overs from previous session */
1923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if ((ptp->Code == PTP_OC_OpenSession) && tries--)
1933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				continue;
1943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ptp_error (params,
1953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				"PTP: Sequence number mismatch %d vs expected %d.",
1963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp->Transaction_ID, params->transaction_id-1
1973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			);
1983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return PTP_ERROR_BADPARAM;
1993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
2003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
2013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
2023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp->Code;
2033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* memory data get/put handler */
2063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevtypedef struct {
2073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*data;
2083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned long	size, curoff;
2093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} PTPMemHandlerPrivate;
2103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmemory_getfunc(PTPParams* params, void* private,
2133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long wantlen, unsigned char *data,
2143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long *gotlen
2153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
2163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private;
2173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned long tocopy = wantlen;
2183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (priv->curoff + tocopy > priv->size)
2203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		tocopy = priv->size - priv->curoff;
2213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memcpy (data, priv->data + priv->curoff, tocopy);
2223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->curoff += tocopy;
2233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*gotlen = tocopy;
2243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmemory_putfunc(PTPParams* params, void* private,
2293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long sendlen, unsigned char *data,
2303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long *putlen
2313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
2323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private;
2333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (priv->curoff + sendlen > priv->size) {
2353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		priv->data = realloc (priv->data, priv->curoff+sendlen);
2363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		priv->size = priv->curoff + sendlen;
2373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
2383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memcpy (priv->data + priv->curoff, data, sendlen);
2393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->curoff += sendlen;
2403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*putlen = sendlen;
2413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* init private struct for receiving data. */
2453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_init_recv_memory_handler(PTPDataHandler *handler) {
2473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv;
2483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv = malloc (sizeof(PTPMemHandlerPrivate));
2493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->priv = priv;
2503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->getfunc = memory_getfunc;
2513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->putfunc = memory_putfunc;
2523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->data = NULL;
2533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->size = 0;
2543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->curoff = 0;
2553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* init private struct and put data in for sending data.
2593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * data is still owned by caller.
2603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
2613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_init_send_memory_handler(PTPDataHandler *handler,
2633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data, unsigned long len
2643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
2653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv;
2663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv = malloc (sizeof(PTPMemHandlerPrivate));
2673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!priv)
2683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
2693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->priv = priv;
2703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->getfunc = memory_getfunc;
2713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->putfunc = memory_putfunc;
2723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->data = data;
2733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->size = len;
2743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->curoff = 0;
2753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* free private struct + data */
2793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_exit_send_memory_handler (PTPDataHandler *handler) {
2813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv;
2823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* data is owned by caller */
2833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (priv);
2843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* hand over our internal data to caller */
2883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
2893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_exit_recv_memory_handler (PTPDataHandler *handler,
2903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char **data, unsigned long *size
2913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
2923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv;
2933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = priv->data;
2943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = priv->size;
2953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (priv);
2963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
2973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
2983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
2993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* fd data get/put handler */
3003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevtypedef struct {
3013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int fd;
3023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} PTPFDHandlerPrivate;
3033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
3053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfd_getfunc(PTPParams* params, void* private,
3063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long wantlen, unsigned char *data,
3073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long *gotlen
3083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
3093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)private;
3103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int		got;
3113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	got = read (priv->fd, data, wantlen);
3133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (got != -1)
3143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*gotlen = got;
3153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	else
3163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
3173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
3183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
3193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
3213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfd_putfunc(PTPParams* params, void* private,
3223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long sendlen, unsigned char *data,
3233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	       unsigned long *putlen
3243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
3253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int		written;
3263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)private;
3273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	written = write (priv->fd, data, sendlen);
3293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (written != -1)
3303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*putlen = written;
3313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	else
3323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
3333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
3343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
3353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
3373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_init_fd_handler(PTPDataHandler *handler, int fd) {
3383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPFDHandlerPrivate* priv;
3393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv = malloc (sizeof(PTPFDHandlerPrivate));
3403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->priv = priv;
3413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->getfunc = fd_getfunc;
3423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	handler->putfunc = fd_putfunc;
3433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	priv->fd = fd;
3443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
3453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
3463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
3483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_exit_fd_handler (PTPDataHandler *handler) {
3493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPFDHandlerPrivate* priv = (PTPFDHandlerPrivate*)handler->priv;
3503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (priv);
3513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
3523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
3533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Old style transaction, based on memory */
3553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic uint16_t
3563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_transaction (PTPParams* params, PTPContainer* ptp,
3573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t flags, unsigned int sendlen,
3583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		unsigned char **data, unsigned int *recvlen
3593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
3603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDataHandler	handler;
3613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
3623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (flags & PTP_DP_DATA_MASK) {
3643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_SENDDATA:
3653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_init_send_memory_handler (&handler, *data, sendlen);
3663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
3673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_GETDATA:
3683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_init_recv_memory_handler (&handler);
3693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
3703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:break;
3713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
3723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction_new (params, ptp, flags, sendlen, &handler);
3733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (flags & PTP_DP_DATA_MASK) {
3743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_SENDDATA:
3753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_exit_send_memory_handler (&handler);
3763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
3773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DP_GETDATA: {
3783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		unsigned long len;
3793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_exit_recv_memory_handler (&handler, data, &len);
3803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (recvlen)
3813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*recvlen = len;
3823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
3833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
3843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:break;
3853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
3863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
3873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
3883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
3913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * PTP operation functions
3923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
3933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * all ptp_ functions should take integer parameters
3943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * in host byte order!
3953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
3963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
3983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
3993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getdeviceinfo:
4003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
4013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets device info dataset and fills deviceinfo structure.
4033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
4053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
4063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
4073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo)
4083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
4093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t 	ret;
4103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned long	len;
4113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
4123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char*	di=NULL;
4133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDataHandler	handler;
4143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_init_recv_memory_handler (&handler);
4163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
4173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetDeviceInfo;
4183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
4193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
4203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler);
4213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_exit_recv_memory_handler (&handler, &di, &len);
4223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!di) ret = PTP_RC_GeneralError;
4233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_DI(params, di, deviceinfo, len);
4243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(di);
4253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
4263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
4273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
4293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getdeviceinfo (PTPParams* params, PTPCanonEOSDeviceInfo*di)
4303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
4313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t 	ret;
4323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
4333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDataHandler	handler;
4343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned long	len;
4353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*data;
4363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_init_recv_memory_handler (&handler);
4383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
4393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_EOS_GetDeviceInfoEx;
4403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
4413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
4423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	data=NULL;
4433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler);
4443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_exit_recv_memory_handler (&handler, &data, &len);
4453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_EOS_DI(params, data, di, len);
4463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (data);
4473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
4483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
4493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
4513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_generic_no_data:
4523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
4533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		code	PTP OP Code
4543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		n_param	count of parameters
4553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		... variable argument list ...
4563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Emits a generic PTP command without any data transfer.
4583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
4603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
4613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
4623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_generic_no_data (PTPParams* params, uint16_t code, unsigned int n_param, ...)
4633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
4643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
4653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	va_list args;
4663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
4673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if( n_param > 5 )
4693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_InvalidParameter;
4703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
4723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=code;
4733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=n_param;
4743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	va_start(args, n_param);
4763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for( i=0; i<n_param; ++i )
4773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		(&ptp.Param1)[i] = va_arg(args, uint32_t);
4783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	va_end(args);
4793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
4813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
4823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
4843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_opensession:
4853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
4863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		session			- session number
4873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Establishes a new session.
4893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
4903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
4913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
4923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
4933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_opensession (PTPParams* params, uint32_t session)
4943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
4953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
4963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
4973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
4983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_debug(params,"PTP: Opening session");
4993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* SessonID field of the operation dataset should always
5013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	   be set to 0 for OpenSession request! */
5023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->session_id=0x00000000;
5033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* TransactionID should be set to 0 also! */
5043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->transaction_id=0x0000000;
5053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* zero out response packet buffer */
5063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->response_packet = NULL;
5073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->response_packet_size = 0;
5083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* no split headers */
5093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->split_header_data = 0;
5103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
5123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_OpenSession;
5133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=session;
5143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
5153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction_new(params, &ptp, PTP_DP_NODATA, 0, NULL);
5163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* now set the global session id to current session number */
5173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->session_id=session;
5183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
5193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
5203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
5223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_free_params:
5233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
5243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Frees all data within the PTPParams struct.
5263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
5283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
5293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
5303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_params (PTPParams *params) {
5313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
5323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->cameraname) free (params->cameraname);
5343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->wifi_profiles) free (params->wifi_profiles);
5353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<params->nrofobjects;i++)
5363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_object (&params->objects[i]);
5373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (params->objects);
5383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_DI (&params->deviceinfo);
5393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
5403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
5423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getststorageids:
5433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
5443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets array of StorageIDs and fills the storageids structure.
5463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
5483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
5493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
5503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getstorageids (PTPParams* params, PTPStorageIDs* storageids)
5513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
5523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
5533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
5543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
5553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* sids=NULL;
5563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
5583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetStorageIDs;
5593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
5603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
5613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &sids, &len);
5623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_SIDs(params, sids, storageids, len);
5633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(sids);
5643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
5653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
5663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
5683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getststorageinfo:
5693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
5703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		storageid		- StorageID
5713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets StorageInfo dataset of desired storage and fills storageinfo
5733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * structure.
5743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
5753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
5763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
5773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
5783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getstorageinfo (PTPParams* params, uint32_t storageid,
5793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPStorageInfo* storageinfo)
5803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
5813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
5823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
5833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* si=NULL;
5843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
5853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
5873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetStorageInfo;
5883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=storageid;
5893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
5903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
5913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &si, &len);
5923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_SI(params, si, storageinfo, len);
5933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(si);
5943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
5953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
5963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
5973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
5983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getobjecthandles:
5993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
6003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		storage			- StorageID
6013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		objectformatcode	- ObjectFormatCode (optional)
6023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		associationOH		- ObjectHandle of Association for
6033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  wich a list of children is desired
6043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  (optional)
6053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		objecthandles		- pointer to structute
6063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Fills objecthandles with structure returned by device.
6083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
6103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
6113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
6123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getobjecthandles (PTPParams* params, uint32_t storage,
6133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t objectformatcode, uint32_t associationOH,
6143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPObjectHandles* objecthandles)
6153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
6163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
6173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
6183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* oh=NULL;
6193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
6203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
6213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
6223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetObjectHandles;
6233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=storage;
6243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=objectformatcode;
6253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3=associationOH;
6263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=3;
6273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
6283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &oh, &len);
6293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
6303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_unpack_OH(params, oh, objecthandles, len);
6313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
6323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (	(storage == 0xffffffff) &&
6333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			(objectformatcode == 0) &&
6343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			(associationOH == 0)
6353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		) {
6363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/* When we query all object handles on all stores and
6373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			 * get an error -> just handle it as "0 handles".
6383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			 */
6393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			objecthandles->Handler = NULL;
6403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			objecthandles->n = 0;
6413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ret = PTP_RC_OK;
6423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
6433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
6443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(oh);
6453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
6463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
6473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
6483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
6493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getnumobjects:
6503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
6513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		storage			- StorageID
6523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		objectformatcode	- ObjectFormatCode (optional)
6533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		associationOH		- ObjectHandle of Association for
6543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  wich a list of children is desired
6553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  (optional)
6563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		numobs			- pointer to uint32_t that takes number of objects
6573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Fills numobs with number of objects on device.
6593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
6613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
6623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
6633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getnumobjects (PTPParams* params, uint32_t storage,
6643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t objectformatcode, uint32_t associationOH,
6653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t* numobs)
6663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
6673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
6683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
6693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int len;
6703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
6713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
6723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetNumObjects;
6733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=storage;
6743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=objectformatcode;
6753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3=associationOH;
6763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=3;
6773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
6783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
6793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
6803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ptp.Nparam >= 1)
6813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*numobs = ptp.Param1;
6823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		else
6833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ret = PTP_RC_GeneralError;
6843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
6853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
6863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
6873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
6883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
6893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getobjectinfo:
6903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
6913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
6923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		objectinfo		- pointer to objectinfo that is returned
6933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get objectinfo structure for handle from device.
6953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
6963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
6973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
6983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
6993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getobjectinfo (PTPParams* params, uint32_t handle,
7003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPObjectInfo* objectinfo)
7013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
7023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
7033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
7043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* oi=NULL;
7053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
7063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
7083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetObjectInfo;
7093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
7103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
7113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
7123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &oi, &len);
7133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_OI(params, oi, objectinfo, len);
7143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(oi);
7153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
7163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
7173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
7193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getobject:
7203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
7213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
7223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		object			- pointer to data area
7233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get object 'handle' from device and store the data in newly
7253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * allocated 'object'.
7263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
7283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
7293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
7303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getobject (PTPParams* params, uint32_t handle, unsigned char** object)
7313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
7323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
7333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
7343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
7363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetObject;
7373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
7383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
7393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
7403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, &len);
7413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
7423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
7443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getobject_to_handler:
7453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
7463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
7473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPDataHandler*		- pointer datahandler
7483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get object 'handle' from device and store the data in newly
7503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * allocated 'object'.
7513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
7533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
7543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
7553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getobject_to_handler (PTPParams* params, uint32_t handle, PTPDataHandler *handler)
7563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
7573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
7583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
7603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetObject;
7613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
7623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
7633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, handler);
7643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
7653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
7673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getobject_tofd:
7683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
7693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
7703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		fd                      - File descriptor to write() to
7713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get object 'handle' from device and write the data to the
7733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * given file descriptor.
7743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
7753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
7763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
7773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
7783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getobject_tofd (PTPParams* params, uint32_t handle, int fd)
7793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
7803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
7813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDataHandler	handler;
7823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
7833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_init_fd_handler (&handler, fd);
7853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
7863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetObject;
7873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
7883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
7893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction_new(params, &ptp, PTP_DP_GETDATA, 0, &handler);
7903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_exit_fd_handler (&handler);
7913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
7923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
7933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
7943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
7953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getpartialobject:
7963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
7973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
7983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		offset			- Offset into object
7993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		maxbytes		- Maximum of bytes to read
8003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		object			- pointer to data area
8013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get object 'handle' from device and store the data in newly
8033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * allocated 'object'. Start from offset and read at most maxbytes.
8043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
8063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
8073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
8083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getpartialobject (PTPParams* params, uint32_t handle, uint32_t offset,
8093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t maxbytes, unsigned char** object)
8103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
8113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
8123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
8133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
8153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetPartialObject;
8163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
8173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=offset;
8183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3=maxbytes;
8193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=3;
8203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
8213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, &len);
8223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
8233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
8253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_getthumb:
8263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
8273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- Object handle
8283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		object			- pointer to data area
8293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get thumb for object 'handle' from device and store the data in newly
8313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * allocated 'object'.
8323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
8343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
8353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
8363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getthumb (PTPParams* params, uint32_t handle, unsigned char** object)
8373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
8383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
8393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
8403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
8423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetThumb;
8433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
8443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
8453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, object, &len);
8463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
8473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
8493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_deleteobject:
8503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
8513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		handle			- object handle
8523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		ofc			- object format code (optional)
8533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Deletes desired objects.
8553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
8573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
8583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
8593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_deleteobject (PTPParams* params, uint32_t handle, uint32_t ofc)
8603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
8613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
8623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
8633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
8653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_DeleteObject;
8663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
8673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=ofc;
8683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=2;
8693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
8703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK) {
8713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return ret;
8723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
8733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* If the object is cached and could be removed, cleanse cache. */
8743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_remove_object_from_cache(params, handle);
8753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
8763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
8773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
8783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
8793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_sendobjectinfo:
8803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
8813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t* store		- destination StorageID on Responder
8823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t* parenthandle 	- Parent ObjectHandle on responder
8833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		uint32_t* handle	- see Return values
8843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPObjectInfo* objectinfo- ObjectInfo that is to be sent
8853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends ObjectInfo of file that is to be sent via SendFileObject.
8873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
8883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
8893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : uint32_t* store	- Responder StorageID in which
8903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  object will be stored
8913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		  uint32_t* parenthandle- Responder Parent ObjectHandle
8923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  in which the object will be stored
8933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		  uint32_t* handle	- Responder's reserved ObjectHandle
8943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  for the incoming object
8953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
8963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
8973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_sendobjectinfo (PTPParams* params, uint32_t* store,
8983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t* parenthandle, uint32_t* handle,
8993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPObjectInfo* objectinfo)
9003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
9013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
9023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
9033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* oidata=NULL;
9043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t size;
9053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
9073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_SendObjectInfo;
9083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=*store;
9093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=*parenthandle;
9103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=2;
9113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size=ptp_pack_OI(params, objectinfo, &oidata);
9133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &oidata, NULL);
9143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(oidata);
9153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*store=ptp.Param1;
9163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*parenthandle=ptp.Param2;
9173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*handle=ptp.Param3;
9183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
9193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
9203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
9223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_sendobject:
9233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
9243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		char*	object		- contains the object that is to be sent
9253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t size		- object size
9263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends object to Responder.
9283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
9303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
9323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
9333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_sendobject (PTPParams* params, unsigned char* object, uint32_t size)
9343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
9353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
9363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
9383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_SendObject;
9393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
9403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NULL);
9423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
9433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
9453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_sendobject_from_handler:
9463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
9473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPDataHandler*         - File descriptor to read() object from
9483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              uint32_t size           - File/object size
9493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends object from file descriptor by consecutive reads from this
9513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * descriptor.
9523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
9543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
9553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
9563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_sendobject_from_handler (PTPParams* params, PTPDataHandler *handler, uint32_t size)
9573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
9583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
9593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
9613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_SendObject;
9623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
9633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler);
9643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
9653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
9683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_sendobject_fromfd:
9693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
9703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		fd                      - File descriptor to read() object from
9713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              uint32_t size           - File/object size
9723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends object from file descriptor by consecutive reads from this
9743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * descriptor.
9753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
9763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
9773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
9783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
9793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_sendobject_fromfd (PTPParams* params, int fd, uint32_t size)
9803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
9813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
9823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDataHandler	handler;
9833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
9843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_init_fd_handler (&handler, fd);
9863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
9873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_SendObject;
9883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
9893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, &handler);
9903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_exit_fd_handler (&handler);
9913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
9923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
9933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
9953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
9963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getdevicepropdesc (PTPParams* params, uint16_t propcode,
9973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPDevicePropDesc* devicepropertydesc)
9983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
9993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
10003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
10013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
10023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* dpd=NULL;
10033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
10053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetDevicePropDesc;
10063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=propcode;
10073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
10083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
10093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpd, &len);
10103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_DPD(params, dpd, devicepropertydesc, len);
10113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(dpd);
10123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
10133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
10143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
10173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_getdevicepropvalue (PTPParams* params, uint16_t propcode,
10183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPPropertyValue* value, uint16_t datatype)
10193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
10203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
10213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
10223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
10233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int offset;
10243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* dpv=NULL;
10253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
10283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_GetDevicePropValue;
10293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=propcode;
10303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
10313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=offset=0;
10323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpv, &len);
10333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_DPV(params, dpv, &offset, len, value, datatype);
10343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(dpv);
10353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
10363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
10373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
10393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_setdevicepropvalue (PTPParams* params, uint16_t propcode,
10403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPPropertyValue *value, uint16_t datatype)
10413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
10423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
10433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
10443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t size;
10453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* dpv=NULL;
10463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
10483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_SetDevicePropValue;
10493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=propcode;
10503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
10513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size=ptp_pack_DPV(params, value, &dpv, datatype);
10523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &dpv, NULL);
10533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(dpv);
10543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
10553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
10563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
10583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_sendfileobjectinfo:
10593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
10603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t* store		- destination StorageID on Responder
10613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t* parenthandle 	- Parent ObjectHandle on responder
10623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		uint32_t* handle	- see Return values
10633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPObjectInfo* objectinfo- ObjectInfo that is to be sent
10643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
10653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends ObjectInfo of file that is to be sent via SendFileObject.
10663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
10673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
10683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : uint32_t* store	- Responder StorageID in which
10693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  object will be stored
10703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		  uint32_t* parenthandle- Responder Parent ObjectHandle
10713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  in which the object will be stored
10723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		  uint32_t* handle	- Responder's reserved ObjectHandle
10733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  for the incoming object
10743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
10753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
10763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_sendfileobjectinfo (PTPParams* params, uint32_t* store,
10773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t* parenthandle, uint32_t* handle,
10783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			PTPObjectInfo* objectinfo)
10793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
10803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
10813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
10823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* oidata=NULL;
10833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t size;
10843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
10863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_EK_SendFileObjectInfo;
10873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=*store;
10883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=*parenthandle;
10893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=2;
10903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
10913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size=ptp_pack_OI(params, objectinfo, &oidata);
10923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &oidata, NULL);
10933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(oidata);
10943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*store=ptp.Param1;
10953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*parenthandle=ptp.Param2;
10963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*handle=ptp.Param3;
10973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
10983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
10993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
11013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_getserial:
11023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
11033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		char**	serial		- contains the serial number of the camera
11043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t* size		- contains the string length
11053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets the serial number from the device. (ptp serial)
11073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
11093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
11113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_getserial (PTPParams* params, unsigned char **data, unsigned int *size)
11133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
11153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
11173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_EK_GetSerial;
11183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
11193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
11203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
11213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
11233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_setserial:
11243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
11253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		char*	serial		- contains the new serial number
11263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t size		- string length
11273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sets the serial number of the device. (ptp serial)
11293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
11313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
11333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_setserial (PTPParams* params, unsigned char *data, unsigned int size)
11353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
11373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
11393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_EK_SetSerial;
11403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
11413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
11423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
11433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* unclear what it does yet */
11453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_9007 (PTPParams* params, unsigned char **data, unsigned int *size)
11473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
11493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
11513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = 0x9007;
11523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
11533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
11543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
11553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* unclear what it does yet */
11573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_9009 (PTPParams* params, uint32_t *p1, uint32_t *p2)
11593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
11613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
11623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
11643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = 0x9009;
11653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
11663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
11673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*p1 = ptp.Param1;
11683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*p2 = ptp.Param2;
11693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
11703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
11713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* unclear yet, but I guess it returns the info from 9008 */
11733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_900c (PTPParams* params, unsigned char **data, unsigned int *size)
11753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
11773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
11793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = 0x900c;
11803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
11813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
11823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* returned data is 16bit,16bit,32bit,32bit */
11833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
11843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
11853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
11863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_settext:
11873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
11883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPEKTextParams*	- contains the texts to display.
11893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Displays the specified texts on the TFT of the camera.
11913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
11933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
11943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
11953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
11963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_settext (PTPParams* params, PTPEKTextParams *text)
11973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
11983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
11993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
12003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size;
12013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data;
12023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
12043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_EK_SetText;
12053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
12063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (0 == (size = ptp_pack_EK_text(params, text, &data)))
12073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_ERROR_BADPARAM;
12083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
12093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
12103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
12113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
12123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
12143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_sendfileobject:
12153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
12163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		char*	object		- contains the object that is to be sent
12173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t size		- object size
12183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends object to Responder.
12203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
12223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
12243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
12253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_sendfileobject (PTPParams* params, unsigned char* object, uint32_t size)
12263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
12273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
12283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
12303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_EK_SendFileObject;
12313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
12323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &object, NULL);
12343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
12353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
12373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_ek_sendfileobject_from_handler:
12383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
12393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		PTPDataHandler*	handler	- contains the handler of the object that is to be sent
12403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t size		- object size
12413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Sends object to Responder.
12433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
12453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
12473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
12483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_ek_sendfileobject_from_handler (PTPParams* params, PTPDataHandler*handler, uint32_t size)
12493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
12503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
12513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
12533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_EK_SendFileObject;
12543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
12553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction_new(params, &ptp, PTP_DP_SENDDATA, size, handler);
12563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
12573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/*************************************************************************
12593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Canon PTP extensions support
12613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * (C) Nikolai Kopanygin 2003
12633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *************************************************************************/
12653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
12683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getpartialobjectinfo:
12693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
12703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t handle		- ObjectHandle
12713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		uint32_t p2 		- Not fully understood parameter
12723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  0 - returns full size
12733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  1 - returns thumbnail size (or EXIF?)
12743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets form the responder the size of the specified object.
12763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
12783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : uint32_t* size	- The object size
12793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		  uint32_t* rp2		- Still unknown return parameter
12803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                                        (perhaps upper 32bit of size)
12813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
12833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
12843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
12853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getpartialobjectinfo (PTPParams* params, uint32_t handle, uint32_t p2,
12863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			uint32_t* size, uint32_t* rp2)
12873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
12883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
12893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
12903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
12913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
12923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetPartialObjectInfo;
12933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
12943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=p2;
12953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=2;
12963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
12973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size=ptp.Param1;
12983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*rp2=ptp.Param2;
12993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
13003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
13013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
13033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_mac_address:
13043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
13053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *					  value 0 works.
13063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets the MAC address of the wireless transmitter.
13073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
13093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : unsigned char* mac	- The MAC address
13103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
13123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
13133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_get_mac_address (PTPParams* params, unsigned char **mac)
13143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
13153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
13163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size = 0;
13173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
13193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetMACAddress;
13203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
13213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*mac = NULL;
13223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, mac, &size);
13233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
13243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
13263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_directory:
13273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
13283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Gets the full directory of the camera.
13303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
13323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : PTPObjectHandles        *handles	- filled out with handles
13333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		  PTPObjectInfo           **oinfos	- allocated array of PTP Object Infos
13343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		  uint32_t                **flags	- allocated array of CANON Flags
13353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
13373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
13383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_get_directory (PTPParams* params,
13393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObjectHandles	*handles,
13403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObjectInfo		**oinfos,	/* size(handles->n) */
13413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t		**flags		/* size(handles->n) */
13423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
13433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
13443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*dir = NULL;
13453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int	size = 0;
13463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
13473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
13493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetDirectory;
13503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
13513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dir, &size);
13523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
13533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return ret;
13543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_unpack_canon_directory(params, dir, ptp.Param1, handles, oinfos, flags);
13553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (dir);
13563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
13573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
13583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
13603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_gettreeinfo:
13613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
13623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              uint32_t *out
13633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Switches the camera display to on and lets the user
13653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * select what to transfer. Sends a 0xc011 event when started
13663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * and 0xc013 if direct transfer aborted.
13673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
13693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
13713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
13723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_gettreeinfo (PTPParams* params, uint32_t *out)
13733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
13743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
13753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
13763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
13783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_CANON_GetTreeInfo;
13793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 1;
13803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1 = 0xf;
13813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_NODATA, 0, NULL, NULL);
13823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((ret == PTP_RC_OK) && (ptp.Nparam>0))
13833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*out = ptp.Param1;
13843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
13853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
13863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
13873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
13883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getpairinginfo:
13893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
13903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              int nr
13913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Get the pairing information.
13933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
13953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
13963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
13973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
13983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getpairinginfo (PTPParams* params, uint32_t nr, unsigned char **data, unsigned int *size)
13993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
14003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
14013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
14023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
14043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_CANON_GetPairingInfo;
14053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 1;
14063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1 = nr;
14073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = NULL;
14083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = 0;
14093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
14103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
14113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return ret;
14123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
14133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
14143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
14163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_target_handles:
14173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
14183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              PTPCanon_directtransfer_entry **out
14193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *              unsigned int *outsize
14203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
14213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Retrieves direct transfer entries specifying the images to transfer
14223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * from the camera (to be retrieved after 0xc011 event).
14233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
14243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
14253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
14263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
14273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
14283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_gettreesize (PTPParams* params,
14293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPCanon_directtransfer_entry **entries, unsigned int *cnt)
14303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
14313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
14323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
14333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *out = NULL, *cur;
14343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
14353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size;
14363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
14383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_CANON_GetTreeSize;
14393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
14403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &out, &size);
14413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
14423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return ret;
14433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*cnt = dtoh32a(out);
14443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*entries = malloc(sizeof(PTPCanon_directtransfer_entry)*(*cnt));
14453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	cur = out+4;
14463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<*cnt;i++) {
14473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		unsigned char len;
14483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		(*entries)[i].oid = dtoh32a(cur);
14493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		(*entries)[i].str = ptp_unpack_string(params, cur, 4, &len);
14503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		cur += 4+(cur[4]*2+1);
14513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
14523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (out);
14533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
14543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
14553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
14573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_checkevent:
14583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
14593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
14603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The camera has a FIFO stack, in which it accumulates events.
14613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Partially these events are communicated also via the USB interrupt pipe
14623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * according to the PTP USB specification, partially not.
14633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This operation returns from the device a block of data, empty,
14643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * if the event stack is empty, or filled with an event's data otherwise.
14653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The event is removed from the stack in the latter case.
14663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The Remote Capture app sends this command to the camera all the time
14673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * of connection, filling with it the gaps between other operations.
14683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
14693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
14703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Upon success : PTPUSBEventContainer* event	- is filled with the event data
14713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *						  if any
14723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                int *isevent			- returns 1 in case of event
14733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *						  or 0 otherwise
14743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
14753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
14763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_checkevent (PTPParams* params, PTPContainer* event, int* isevent)
14773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
14783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
14793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
14803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *evdata = NULL;
14813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
14823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*isevent=0;
14843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
14853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_CheckEvent;
14863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
14873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
14883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &evdata, &len);
14893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (evdata!=NULL) {
14903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ret == PTP_RC_OK) {
14913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        		ptp_unpack_EC(params, evdata, event, len);
14923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    			*isevent=1;
14933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        	}
14943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free(evdata);
14953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
14963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
14973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
14983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
14993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
15003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_check_event (PTPParams *params) {
15013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer		event;
15023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t		ret;
15033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (	(params->deviceinfo.VendorExtensionID == PTP_VENDOR_NIKON) &&
15053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_operation_issupported(params, PTP_OC_NIKON_CheckEvent)
15063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	) {
15073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int evtcnt;
15083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTPContainer	*xevent = NULL;
15093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ret = ptp_nikon_check_event(params, &xevent, &evtcnt);
15113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ret != PTP_RC_OK)
15123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return ret;
15133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (evtcnt) {
15153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (params->nrofevents)
15163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				params->events = realloc(params->events, sizeof(PTPContainer)*(evtcnt+params->nrofevents));
15173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			else
15183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				params->events = malloc(sizeof(PTPContainer)*evtcnt);
15193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			memcpy (&params->events[params->nrofevents],xevent,evtcnt*sizeof(PTPContainer));
15203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->nrofevents += evtcnt;
15213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free (xevent);
15223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
15233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
15243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
15253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (	(params->deviceinfo.VendorExtensionID == PTP_VENDOR_CANON) &&
15263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_operation_issupported(params, PTP_OC_CANON_CheckEvent)
15273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	) {
15283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int isevent;
15293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ret = ptp_canon_checkevent (params,&event,&isevent);
15313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ret!=PTP_RC_OK)
15323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return ret;
15333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (isevent)
15343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			goto store_event;
15353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* FIXME: fallthrough or return? */
15363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
15373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = params->event_check(params,&event);
15383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstore_event:
15403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
15413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		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, event.Param1, event.Param2, event.Param3);
15423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->nrofevents)
15433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->events = realloc(params->events, sizeof(PTPContainer)*(params->nrofevents+1));
15443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		else
15453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->events = malloc(sizeof(PTPContainer)*1);
15463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		memcpy (&params->events[params->nrofevents],&event,1*sizeof(PTPContainer));
15473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->nrofevents += 1;
15483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
15493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_ERROR_TIMEOUT) /* ok, just new events */
15503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ret = PTP_RC_OK;
15513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
15523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
15533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
15553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_get_one_event(PTPParams *params, PTPContainer *event) {
15563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!params->nrofevents)
15573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return 0;
15583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memcpy (event, params->events, sizeof(PTPContainer));
15593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memmove (params->events, params->events+1, sizeof(PTPContainer)*(params->nrofevents-1));
15603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* do not realloc on shrink. */
15613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->nrofevents--;
15623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 1;
15633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
15643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
15663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_eos_getevent:
15673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
15683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This retrieves configuration status/updates/changes
15693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * on EOS cameras. It reads a datablock which has a list of variable
15703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * sized structures.
15713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
15723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
15733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
15743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
15753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
15763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
15773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
15783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getevent (PTPParams* params, PTPCanon_changes_entry **entries, int *nrofentries)
15793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
15803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
15813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
15823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int 	size = 0;
15833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*data = NULL;
15843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*nrofentries = 0;
15863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*entries = NULL;
15873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
15883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code = PTP_OC_CANON_EOS_GetEvent;
15893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
15903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
15913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK) return ret;
15923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        *nrofentries = ptp_unpack_CANON_changes(params,data,size,entries);
15933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
15943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
15953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
15963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
15973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getdevicepropdesc (PTPParams* params, uint16_t propcode,
15983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPDevicePropDesc *dpd)
15993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
16003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
16013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<params->nrofcanon_props;i++)
16033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->canon_props[i].proptype == propcode)
16043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
16053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->nrofcanon_props == i)
16063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_Undefined;
16073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memcpy (dpd, &params->canon_props[i].dpd, sizeof (*dpd));
16083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (dpd->FormFlag == PTP_DPFF_Enumeration) {
16093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* need to duplicate the Enumeration alloc */
16103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		dpd->FORM.Enum.SupportedValue = malloc (sizeof (PTPPropertyValue)*dpd->FORM.Enum.NumberOfValues);
16113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		memcpy (dpd->FORM.Enum.SupportedValue,
16123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->canon_props[i].dpd.FORM.Enum.SupportedValue,
16133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			sizeof (PTPPropertyValue)*dpd->FORM.Enum.NumberOfValues
16143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		);
16153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
16163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (dpd->DataType == PTP_DTC_STR) {
16173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		dpd->FactoryDefaultValue.str = strdup( params->canon_props[i].dpd.FactoryDefaultValue.str );
16183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		dpd->CurrentValue.str = strdup( params->canon_props[i].dpd.CurrentValue.str );
16193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
16203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
16223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
16233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
16263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getstorageids (PTPParams* params, PTPStorageIDs* storageids)
16273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
16283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
16293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int	len = 0;
16303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
16313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char*	sids=NULL;
16323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
16343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code 	= PTP_OC_CANON_EOS_GetStorageIDs;
16353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 0;
16363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &sids, &len);
16373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) ptp_unpack_SIDs(params, sids, storageids, len);
16383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(sids);
16393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
16403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
16413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
16433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getstorageinfo (PTPParams* params, uint32_t p1)
16443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
16453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
16463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*data = NULL;
16473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int	size = 0;
16483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
16493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
16513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code 	= PTP_OC_CANON_EOS_GetStorageInfo;
16523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 1;
16533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1	= p1;
16543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
16553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* FIXME: do stuff with data */
16563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
16573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
16583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
16603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_eos_getpartialobject:
16613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
16623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This retrieves a part of an PTP object which you specify as object id.
16633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The id originates from 0x9116 call.
16643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * After finishing it, we seem to need to call ptp_canon_eos_enddirecttransfer.
16653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
16663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
16673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		oid		Object ID
16683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 		offset		The offset where to start the data transfer
16693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		xsize		Size in bytes of the transfer to do
16703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *		data		Pointer that receives the malloc()ed memory of the transfer.
16713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
16723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
16733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
16743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
16753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
16763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_getpartialobject (PTPParams* params, uint32_t oid, uint32_t offset, uint32_t xsize, unsigned char**data)
16773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
16783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
16793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int	size = 0;
16803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = NULL;
16823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
16833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code 	= PTP_OC_CANON_EOS_GetPartialObject;
16843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 3;
16853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1	= oid;
16863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2	= offset;
16873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3	= xsize;
16883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, &size);
16893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
16903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
16923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_setdevicepropvalueex (PTPParams* params, unsigned char* data, unsigned int size)
16933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
16943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
16953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
16963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
16973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code 	= PTP_OC_CANON_EOS_SetDevicePropValueEx;
16983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 0;
16993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
17003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
17013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
17033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_setdevicepropvalue (PTPParams* params,
17043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t propcode, PTPPropertyValue *value, uint16_t datatype
17053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
17063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
17073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
17083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int 		i;
17093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*data;
17103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int	size;
17113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
17133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code 	= PTP_OC_CANON_EOS_SetDevicePropValueEx;
17143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 0;
17153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<params->nrofcanon_props;i++)
17163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->canon_props[i].proptype == propcode)
17173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
17183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->nrofcanon_props == i)
17193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_Undefined;
17203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (propcode) {
17223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPC_CANON_EOS_ImageFormat:
17233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPC_CANON_EOS_ImageFormatCF:
17243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPC_CANON_EOS_ImageFormatSD:
17253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPC_CANON_EOS_ImageFormatExtHD:
17263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* special handling of ImageFormat properties */
17273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		size = 8 + ptp_pack_EOS_ImageFormat( params, NULL, value->u16 );
17283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		data = malloc( size );
17293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->canon_props[i].dpd.CurrentValue.u16 = value->u16;
17303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_pack_EOS_ImageFormat( params, data + 8, value->u16 );
17313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
17323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:
17333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (datatype != PTP_DTC_STR) {
17343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			data = calloc(sizeof(uint32_t),3);
17353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			size = sizeof(uint32_t)*3;
17363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		} else {
17373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			size = strlen(value->str) + 1 + 8;
17383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			data = calloc(sizeof(char),size);
17393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
17403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		switch (datatype) {
17413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT8:
17423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/*fprintf (stderr, "%x -> %d\n", propcode, value->u8);*/
17433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			htod8a(&data[8], value->u8);
17443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->canon_props[i].dpd.CurrentValue.u8 = value->u8;
17453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
17463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT16:
17473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/*fprintf (stderr, "%x -> %d\n", propcode, value->u16);*/
17483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			htod16a(&data[8], value->u16);
17493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->canon_props[i].dpd.CurrentValue.u16 = value->u16;
17503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
17513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT32:
17523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/*fprintf (stderr, "%x -> %d\n", propcode, value->u32);*/
17533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			htod32a(&data[8], value->u32);
17543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->canon_props[i].dpd.CurrentValue.u32 = value->u32;
17553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
17563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_STR:
17573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			strcpy((char*)data + 8, value->str);
17583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free (params->canon_props[i].dpd.CurrentValue.str);
17593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			params->canon_props[i].dpd.CurrentValue.str = strdup(value->str);
17603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
17613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
17623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
17633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	htod32a(&data[0], size);
17653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	htod32a(&data[4], propcode);
17663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
17683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (data);
17693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
17703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
17713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
17723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
17733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getpartialobject:
17743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
17753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This operation is used to read from the device a data
17763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * block of an object from a specified offset.
17773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
17783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
17793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t handle - the handle of the requested object
17803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t offset - the offset in bytes from the beginning of the object
17813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t size - the requested size of data block to read
17823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t pos - 1 for the first block, 2 - for a block in the middle,
17833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                  3 - for the last block
17843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
17853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
17863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      char **block - the pointer to the block of data read
17873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t* readnum - the number of bytes read
17883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
17893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
17903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
17913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getpartialobject (PTPParams* params, uint32_t handle,
17923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				uint32_t offset, uint32_t size,
17933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				uint32_t pos, unsigned char** block,
17943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				uint32_t* readnum)
17953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
17963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
17973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
17983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data=NULL;
17993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
18003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
18023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetPartialObjectEx;
18033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
18043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=offset;
18053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3=size;
18063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param4=pos;
18073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=4;
18083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
18093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len);
18103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret==PTP_RC_OK) {
18113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*block=data;
18123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*readnum=ptp.Param1;
18133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
18143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
18153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
18163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
18183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getviewfinderimage:
18193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This operation can be used to read the image which is currently
18213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * in the camera's viewfinder. The image size is 320x240, format is JPEG.
18223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Of course, prior to calling this operation, one must turn the viewfinder
18233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * on with the CANON_ViewfinderOn command.
18243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Invoking this operation many times, one can get live video from the camera!
18253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
18273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
18293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      char **image - the pointer to the read image
18303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      unit32_t *size - the size of the image in bytes
18313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
18333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
18343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getviewfinderimage (PTPParams* params, unsigned char** image, uint32_t* size)
18353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
18363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
18373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
18383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
18393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
18413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetViewfinderImage;
18423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
18433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, image, &len);
18443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret==PTP_RC_OK) *size=ptp.Param1;
18453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
18463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
18473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
18493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getchanges:
18503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This is an interesting operation, about the effect of which I am not sure.
18523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command is called every time when a device property has been changed
18533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * with the SetDevicePropValue operation, and after some other operations.
18543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This operation reads the array of Device Properties which have been changed
18553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * by the previous operation.
18563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Probably, this operation is even required to make those changes work.
18573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
18593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
18613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint16_t** props - the pointer to the array of changed properties
18623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t* propnum - the number of elements in the *props array
18633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
18653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
18663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getchanges (PTPParams* params, uint16_t** props, uint32_t* propnum)
18673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
18683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
18693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
18703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* data=NULL;
18713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
18723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
18743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetChanges;
18753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
18763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
18773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len);
18783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK)
18793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        	*propnum=ptp_unpack_uint16_t_array(params,data,0,props);
18803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
18813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
18823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
18833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
18843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
18853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_getobjectinfo:
18863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command reads a specified object's record in a device's filesystem,
18883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * or the records of all objects belonging to a specified folder (association).
18893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
18903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
18913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t store - StorageID,
18923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t p2 - Yet unknown (0 value works OK)
18933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t parent - Parent Object Handle
18943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # If Parent Object Handle is 0xffffffff,
18953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # the Parent Object is the top level folder.
18963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t handle - Object Handle
18973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # If Object Handle is 0, the records of all objects
18983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # belonging to the Parent Object are read.
18993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # If Object Handle is not 0, only the record of this
19003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *                      # Object is read.
19013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
19033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      PTPCANONFolderEntry** entries - the pointer to the folder entry array
19043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t* entnum - the number of elements of the array
19053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
19073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
19083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_getobjectinfo (PTPParams* params, uint32_t store, uint32_t p2,
19093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			    uint32_t parent, uint32_t handle,
19103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			    PTPCANONFolderEntry** entries, uint32_t* entnum)
19113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
19123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
19133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
19143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
19153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int len;
19163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
19173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
19183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetObjectInfoEx;
19193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=store;
19203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2=p2;
19213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3=parent;
19223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param4=handle;
19233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=4;
19243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
19253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &len);
19263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
19273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int i;
19283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*entnum=ptp.Param1;
19293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*entries=calloc(*entnum, sizeof(PTPCANONFolderEntry));
19303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (*entries!=NULL) {
19313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for(i=0; i<(*entnum); i++)
19323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_unpack_Canon_FE(params,
19333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					data+i*PTP_CANON_FolderEntryLen,
19343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					&((*entries)[i]) );
19353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		} else {
19363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ret=PTP_ERROR_IO; /* Cannot allocate memory */
19373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
19383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
19393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
19403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
19413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
19423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
19433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
19443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_objecthandle_by_name:
19453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command looks up the specified object on the camera.
19473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Format is "A:\\PATH".
19493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * The 'A' is the VolumeLabel from GetStorageInfo,
19513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * my IXUS has "A" for the card and "V" for internal memory.
19523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
19543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      char* name - path name
19553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
19573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t *oid - PTP object id.
19583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
19603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
19613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_get_objecthandle_by_name (PTPParams* params, char* name, uint32_t* objectid)
19623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
19633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
19643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
19653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
19663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint8_t len;
19673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
19683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT (ptp);
19693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_CANON_GetObjectHandleByName;
19703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
19713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	len=0;
19723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	data = malloc (2*(strlen(name)+1)+2);
19733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memset (data, 0, 2*(strlen(name)+1)+2);
19743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_pack_string (params, name, data, 0, &len);
19753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction (params, &ptp, PTP_DP_SENDDATA, (len+1)*2+1, &data, NULL);
19763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free (data);
19773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*objectid = ptp.Param1;
19783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
19793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
19803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
19813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
19823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_customize_data:
19833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command downloads the specified theme slot, including jpegs
19853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * and wav files.
19863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
19883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      uint32_t themenr - nr of theme
19893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
19913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      unsigned char **data - pointer to data pointer
19923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      unsigned int  *size - size of data returned
19933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
19943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
19953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
19963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_get_customize_data (PTPParams* params, uint32_t themenr,
19973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		unsigned char **data, unsigned int *size)
19983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
19993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
20003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = NULL;
20023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = 0;
20033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
20043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code	= PTP_OC_CANON_GetCustomizeData;
20053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1	= themenr;
20063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 1;
20073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
20083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
20093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
20123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_curve_download (PTPParams* params, unsigned char **data, unsigned int *size) {
20133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
20143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = NULL;
20153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = 0;
20163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
20173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code	= PTP_OC_NIKON_CurveDownload;
20183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 0;
20193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
20203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
20213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
20233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_get_vendorpropcodes:
20243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command downloads the vendor specific property codes.
20263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
20283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
20303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      unsigned char **data - pointer to data pointer
20313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      unsigned int  *size - size of data returned
20323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
20343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
20353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size) {
20363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer	ptp;
20373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
20383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char	*xdata;
20393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int 	xsize;
20403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*props = NULL;
20423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = 0;
20433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
20443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code	= PTP_OC_NIKON_GetVendorPropCodes;
20453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 0;
20463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &xdata, &xsize);
20473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK)
20483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        	*size = ptp_unpack_uint16_t_array(params,xdata,0,props);
20493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
20503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
20513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
20533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_getfileinfoinblock ( PTPParams* params,
20543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t p1, uint32_t p2, uint32_t p3,
20553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char **data, unsigned int *size
20563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
20573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
20583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*data = NULL;
20593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*size = 0;
20603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
20613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code	= PTP_OC_NIKON_GetFileInfoInBlock;
20623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam	= 3;
20633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1	= p1;
20643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2	= p2;
20653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3	= p3;
20663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
20673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
20683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
20703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_get_liveview_image:
20713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets a LiveView image from newer Nikons DSLRs.
20733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
20753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
20773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
20793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
20803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_get_liveview_image (PTPParams* params, unsigned char **data, unsigned int *size)
20813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
20823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
20833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
20853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_NIKON_GetLiveViewImg;
20863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam=0;
20873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
20883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
20893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
20903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
20913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_get_preview_image:
20923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets a Preview image from newer Nikons DSLRs.
20943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
20963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
20983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
20993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
21003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
21013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_get_preview_image (PTPParams* params, unsigned char **xdata, unsigned int *xsize,
21023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t *handle)
21033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
21043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer	ptp;
21053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
21063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
21083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_NIKON_GetPreviewImg;
21093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam=0;
21103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, xdata, xsize);
21113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
21123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ptp.Nparam > 0)
21133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*handle = ptp.Param1;
21143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
21153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
21163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
21173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
21193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_canon_eos_get_viewfinder_image:
21203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets a Viewfinder image from newer Nikons DSLRs.
21223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
21243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
21263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
21283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
21293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_canon_eos_get_viewfinder_image (PTPParams* params, unsigned char **data, unsigned int *size)
21303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
21313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
21323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
21343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_CANON_EOS_GetViewFinderData;
21353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam=1;
21363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param1=0x00100000; /* from trace */
21373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
21383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
21393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
21413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_check_event:
21423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command checks the event queue on the Nikon.
21443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
21463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *      PTPUSBEventContainer **event - list of usb events.
21473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	int *evtcnt - number of usb events in event structure.
21483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
21503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
21523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
21533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_check_event (PTPParams* params, PTPContainer** event, int* evtcnt)
21543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
21553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
21563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
21573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
21583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size = 0;
21593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
21613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_NIKON_CheckEvent;
21623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=0;
21633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*evtcnt = 0;
21643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction (params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
21653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
21663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_unpack_Nikon_EC (params, data, size, event, evtcnt);
21673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free (data);
21683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
21693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
21703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
21713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
21733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_getptpipinfo:
21743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the ptpip info data.
21763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
21783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned char *data	- data
21793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned int size	- size of returned data
21803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
21823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
21843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
21853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_getptpipinfo (PTPParams* params, unsigned char **data, unsigned int *size)
21863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
21873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
21883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
21903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_NIKON_GetDevicePTPIPInfo;
21913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam=0;
21923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        return ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, data, size);
21933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
21943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
21953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
21963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_getwifiprofilelist:
21973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
21983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the wifi profile list.
21993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
22003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
22013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
22023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
22033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
22043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
22053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
22063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_getwifiprofilelist (PTPParams* params)
22073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
22083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
22093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* data;
22103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size;
22113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int pos;
22123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int profn;
22133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int n;
22143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	char* buffer;
22153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint8_t len;
22163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
22183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_NIKON_GetProfileAllData;
22193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam=0;
22203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size = 0;
22213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	data = NULL;
22223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	CHECK_PTP_RC(ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size));
22233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (size < 2) return PTP_RC_Undefined; /* FIXME: Add more precise error code */
22253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->wifi_profiles_version = data[0];
22273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->wifi_profiles_number = data[1];
22283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->wifi_profiles)
22293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free(params->wifi_profiles);
22303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->wifi_profiles = malloc(params->wifi_profiles_number*sizeof(PTPNIKONWifiProfile));
22323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memset(params->wifi_profiles, 0, params->wifi_profiles_number*sizeof(PTPNIKONWifiProfile));
22333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	pos = 2;
22353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	profn = 0;
22363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	while (profn < params->wifi_profiles_number && pos < size) {
22373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (pos+6 >= size) return PTP_RC_Undefined;
22383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].id = data[pos++];
22393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].valid = data[pos++];
22403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		n = dtoh32a(&data[pos]);
22423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += 4;
22433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (pos+n+4 >= size) return PTP_RC_Undefined;
22443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		strncpy(params->wifi_profiles[profn].profile_name, (char*)&data[pos], n);
22453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].profile_name[16] = '\0';
22463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += n;
22473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].display_order = data[pos++];
22493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].device_type = data[pos++];
22503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].icon_type = data[pos++];
22513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		buffer = ptp_unpack_string(params, data, pos, &len);
22533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		strncpy(params->wifi_profiles[profn].creation_date, buffer, sizeof(params->wifi_profiles[profn].creation_date));
22543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free (buffer);
22553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += (len*2+1);
22563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (pos+1 >= size) return PTP_RC_Undefined;
22573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* FIXME: check if it is really last usage date */
22583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		buffer = ptp_unpack_string(params, data, pos, &len);
22593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		strncpy(params->wifi_profiles[profn].lastusage_date, buffer, sizeof(params->wifi_profiles[profn].lastusage_date));
22603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free (buffer);
22613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += (len*2+1);
22623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (pos+5 >= size) return PTP_RC_Undefined;
22633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		n = dtoh32a(&data[pos]);
22653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += 4;
22663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (pos+n >= size) return PTP_RC_Undefined;
22673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		strncpy(params->wifi_profiles[profn].essid, (char*)&data[pos], n);
22683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->wifi_profiles[profn].essid[32] = '\0';
22693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += n;
22703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		pos += 1;
22713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		profn++;
22723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
22733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#if 0
22753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPNIKONWifiProfile test;
22763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memset(&test, 0, sizeof(PTPNIKONWifiProfile));
22773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	strcpy(test.profile_name, "MyTest");
22783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.icon_type = 1;
22793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	strcpy(test.essid, "nikon");
22803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.ip_address = 10 + 11 << 16 + 11 << 24;
22813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.subnet_mask = 24;
22823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.access_mode = 1;
22833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.wifi_channel = 1;
22843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	test.key_nr = 1;
22853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_nikon_writewifiprofile(params, &test);
22873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif
22883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
22903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
22913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
22923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
22933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_nikon_writewifiprofile:
22943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
22953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the ptpip info data.
22963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
22973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
22983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned int profilenr	- profile number
22993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned char *data	- data
23003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned int size	- size of returned data
23013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
23023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
23033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
23043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
23053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
23063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_nikon_writewifiprofile (PTPParams* params, PTPNIKONWifiProfile* profile)
23073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
23083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char guid[16];
23093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
23113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char buffer[1024];
23123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* data = buffer;
23133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int size = 0;
23143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
23153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint8_t len;
23163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int profilenr = -1;
23173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_nikon_getptpipguid(guid);
23193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!params->wifi_profiles)
23213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		CHECK_PTP_RC(ptp_nikon_getwifiprofilelist(params));
23223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i = 0; i < params->wifi_profiles_number; i++) {
23243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (!params->wifi_profiles[i].valid) {
23253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			profilenr = params->wifi_profiles[i].id;
23263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
23273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
23283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
23293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (profilenr == -1) {
23313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* No free profile! */
23323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_StoreFull;
23333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
23343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memset(buffer, 0, 1024);
23363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x00] = 0x64; /* Version */
23383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* Profile name */
23403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	htod32a(&buffer[0x01], 17);
23413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* 16 as third parameter, so there will always be a null-byte in the end */
23423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	strncpy((char*)&buffer[0x05], profile->profile_name, 16);
23433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x16] = 0x00; /* Display order */
23453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x17] = profile->device_type;
23463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x18] = profile->icon_type;
23473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* FIXME: Creation date: put a real date here */
23493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_pack_string(params, "19990909T090909", data, 0x19, &len);
23503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* IP parameters */
23523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*((unsigned int*)&buffer[0x3A]) = profile->ip_address; /* Do not reverse bytes */
23533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x3E] = profile->subnet_mask;
23543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*((unsigned int*)&buffer[0x3F]) = profile->gateway_address; /* Do not reverse bytes */
23553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x43] = profile->address_mode;
23563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* Wifi parameters */
23583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x44] = profile->access_mode;
23593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x45] = profile->wifi_channel;
23603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	htod32a(&buffer[0x46], 33); /* essid */
23623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	 /* 32 as third parameter, so there will always be a null-byte in the end */
23633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	strncpy((char*)&buffer[0x4A], profile->essid, 32);
23643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x6B] = profile->authentification;
23663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0x6C] = profile->encryption;
23673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	htod32a(&buffer[0x6D], 64);
23683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i = 0; i < 64; i++) {
23693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		buffer[0x71+i] = profile->key[i];
23703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
23713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	buffer[0xB1] = profile->key_nr;
23723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memcpy(&buffer[0xB2], guid, 16);
23733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch(profile->encryption) {
23753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case 1: /* WEP 64bit */
23763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		htod16a(&buffer[0xC2], 5); /* (64-24)/8 = 5 */
23773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
23783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case 2: /* WEP 128bit */
23793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		htod16a(&buffer[0xC2], 13); /* (128-24)/8 = 13 */
23803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
23813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:
23823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		htod16a(&buffer[0xC2], 0);
23833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
23843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size = 0xC4;
23853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
23873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_NIKON_SendProfileData;
23883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
23893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=profilenr;
23903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
23913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
23923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
23933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
23943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_mtp_getobjectpropssupported:
23953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
23963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the object properties possible from the device.
23973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
23983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
23993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint ofc		- object format code
24003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	unsigned int *propnum	- number of elements in returned array
24013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint16_t *props		- array of supported properties
24023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
24043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
24063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
24073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_getobjectpropssupported (PTPParams* params, uint16_t ofc,
24083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 uint32_t *propnum, uint16_t **props
24093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
24103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
24113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
24123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
24133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size = 0;
24143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
24163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_MTP_GetObjectPropsSupported;
24173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam = 1;
24183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param1 = ofc;
24193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
24203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK)
24213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        	*propnum=ptp_unpack_uint16_t_array(params,data,0,props);
24223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
24233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
24243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
24253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
24273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_mtp_getobjectpropdesc:
24283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the object property description.
24303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
24323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint16_t opc	- object property code
24333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint16_t ofc	- object format code
24343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
24363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
24383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
24393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_getobjectpropdesc (
24403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPParams* params, uint16_t opc, uint16_t ofc, PTPObjectPropDesc *opd
24413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
24423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
24433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
24443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
24453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size = 0;
24463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
24483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_MTP_GetObjectPropDesc;
24493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam = 2;
24503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param1 = opc;
24513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param2 = ofc;
24523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
24533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK)
24543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_unpack_OPD (params, data, opd, size);
24553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
24563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
24573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
24583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
24603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_mtp_getobjectpropvalue:
24613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the object properties of an object handle.
24633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
24653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint32_t objectid	- object format code
24663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint16_t opc		- object prop code
24673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
24693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
24713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
24723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_getobjectpropvalue (
24733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPParams* params, uint32_t oid, uint16_t opc,
24743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPPropertyValue *value, uint16_t datatype
24753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
24763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
24773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
24783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
24793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size = 0;
24803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int offset = 0;
24813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
24833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_MTP_GetObjectPropValue;
24843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam = 2;
24853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param1 = oid;
24863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param2 = opc;
24873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &data, &size);
24883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK)
24893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_unpack_DPV(params, data, &offset, size, value, datatype);
24903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
24913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
24923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
24933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
24943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
24953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * ptp_mtp_setobjectpropvalue:
24963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This command gets the object properties of an object handle.
24983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
24993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * params:	PTPParams*
25003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint32_t objectid	- object format code
25013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *	uint16_t opc		- object prop code
25023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
25033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Return values: Some PTP_RC_* code.
25043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
25053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev **/
25063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
25073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_setobjectpropvalue (
25083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPParams* params, uint32_t oid, uint16_t opc,
25093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPPropertyValue *value, uint16_t datatype
25103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev) {
25113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTPContainer ptp;
25123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
25133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char *data = NULL;
25143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int size ;
25153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        PTP_CNT_INIT(ptp);
25173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Code=PTP_OC_MTP_SetObjectPropValue;
25183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Nparam = 2;
25193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param1 = oid;
25203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ptp.Param2 = opc;
25213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size = ptp_pack_DPV(params, value, &data, datatype);
25223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, &data, NULL);
25233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(data);
25243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
25253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
25263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
25283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_getobjectreferences (PTPParams* params, uint32_t handle, uint32_t** ohArray, uint32_t* arraylen)
25293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
25303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
25313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
25323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* dpv=NULL;
25333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int dpvlen = 0;
25343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
25363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code=PTP_OC_MTP_GetObjectReferences;
25373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1=handle;
25383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam=1;
25393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &dpv, &dpvlen);
25403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) {
25413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Sandisk Sansa skips the DATA phase, but returns OK as response.
25423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 * this will gives us a NULL here. Handle it. -Marcus */
25433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if ((dpv == NULL) || (dpvlen == 0)) {
25443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*arraylen = 0;
25453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*ohArray = NULL;
25463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		} else {
25473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*arraylen = ptp_unpack_uint32_t_array(params, dpv, 0, ohArray);
25483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
25493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
25503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(dpv);
25513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
25523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
25533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
25553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_setobjectreferences (PTPParams* params, uint32_t handle, uint32_t* ohArray, uint32_t arraylen)
25563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
25573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
25583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
25593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t size;
25603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* dpv=NULL;
25613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
25633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code   = PTP_OC_MTP_SetObjectReferences;
25643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1 = handle;
25653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 1;
25663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	size = ptp_pack_uint32_t_array(params, ohArray, arraylen, &dpv);
25673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, size, (unsigned char **)&dpv, NULL);
25683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(dpv);
25693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
25703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
25713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
25733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_getobjectproplist (PTPParams* params, uint32_t handle, MTPProperties **props, int *nrofprops)
25743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
25753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
25763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
25773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* opldata = NULL;
25783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned int oplsize;
25793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
25813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code = PTP_OC_MTP_GetObjPropList;
25823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1 = handle;
25833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2 = 0x00000000U;  /* 0x00000000U should be "all formats" */
25843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3 = 0xFFFFFFFFU;  /* 0xFFFFFFFFU should be "all properties" */
25853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param4 = 0x00000000U;
25863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param5 = 0x00000000U;
25873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 5;
25883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &opldata, &oplsize);
25893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret == PTP_RC_OK) *nrofprops = ptp_unpack_OPL(params, opldata, props, oplsize);
25903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (opldata != NULL)
25913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		free(opldata);
25923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
25933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
25943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
25953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
25963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_sendobjectproplist (PTPParams* params, uint32_t* store, uint32_t* parenthandle, uint32_t* handle,
25973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			    uint16_t objecttype, uint64_t objectsize, MTPProperties *props, int nrofprops)
25983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
25993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
26003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
26013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* opldata=NULL;
26023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t oplsize;
26033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
26053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code = PTP_OC_MTP_SendObjectPropList;
26063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param1 = *store;
26073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param2 = *parenthandle;
26083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param3 = (uint32_t) objecttype;
26093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param4 = (uint32_t) (objectsize >> 32);
26103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Param5 = (uint32_t) (objectsize & 0xffffffffU);
26113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 5;
26123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* Set object handle to 0 for a new object */
26143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	oplsize = ptp_pack_OPL(params,props,nrofprops,&opldata);
26153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, oplsize, &opldata, NULL);
26163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(opldata);
26173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*store = ptp.Param1;
26183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*parenthandle = ptp.Param2;
26193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*handle = ptp.Param3;
26203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
26223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
26233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
26253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_mtp_setobjectproplist (PTPParams* params, MTPProperties *props, int nrofprops)
26263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
26273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ret;
26283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPContainer ptp;
26293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	unsigned char* opldata=NULL;
26303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint32_t oplsize;
26313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTP_CNT_INIT(ptp);
26333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Code = PTP_OC_MTP_SetObjPropList;
26343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp.Nparam = 0;
26353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	oplsize = ptp_pack_OPL(params,props,nrofprops,&opldata);
26373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_transaction(params, &ptp, PTP_DP_SENDDATA, oplsize, &opldata, NULL);
26383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	free(opldata);
26393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ret;
26413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
26423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Non PTP protocol functions */
26443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* devinfo testing functions */
26453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
26473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_operation_issupported(PTPParams* params, uint16_t operation)
26483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
26493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i=0;
26503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (;i<params->deviceinfo.OperationsSupported_len;i++) {
26523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->deviceinfo.OperationsSupported[i]==operation)
26533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 1;
26543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
26553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 0;
26563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
26573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
26603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_event_issupported(PTPParams* params, uint16_t event)
26613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
26623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i=0;
26633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (;i<params->deviceinfo.EventsSupported_len;i++) {
26653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->deviceinfo.EventsSupported[i]==event)
26663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 1;
26673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
26683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 0;
26693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
26703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
26733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_property_issupported(PTPParams* params, uint16_t property)
26743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
26753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
26763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<params->deviceinfo.DevicePropertiesSupported_len;i++)
26783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->deviceinfo.DevicePropertiesSupported[i]==property)
26793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 1;
26803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 0;
26813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
26823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
26833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* ptp structures freeing functions */
26843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
26853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_devicepropvalue(uint16_t dt, PTPPropertyValue* dpd) {
26863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (dt) {
26873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_INT8:	case PTP_DTC_UINT8:
26883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_UINT16:	case PTP_DTC_INT16:
26893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_UINT32:	case PTP_DTC_INT32:
26903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_UINT64:	case PTP_DTC_INT64:
26913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_UINT128:	case PTP_DTC_INT128:
26923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Nothing to free */
26933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
26943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_AINT8:	case PTP_DTC_AUINT8:
26953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_AUINT16:	case PTP_DTC_AINT16:
26963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_AUINT32:	case PTP_DTC_AINT32:
26973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_AUINT64:	case PTP_DTC_AINT64:
26983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_AUINT128:	case PTP_DTC_AINT128:
26993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (dpd->a.v)
27003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free(dpd->a.v);
27013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DTC_STR:
27033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (dpd->str)
27043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free(dpd->str);
27053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
27073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
27083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
27103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_devicepropdesc(PTPDevicePropDesc* dpd)
27113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
27123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t i;
27133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_devicepropvalue (dpd->DataType, &dpd->FactoryDefaultValue);
27153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_devicepropvalue (dpd->DataType, &dpd->CurrentValue);
27163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (dpd->FormFlag) {
27173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPFF_Range:
27183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.MinimumValue);
27193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.MaximumValue);
27203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (dpd->DataType, &dpd->FORM.Range.StepSize);
27213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_DPFF_Enumeration:
27233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (dpd->FORM.Enum.SupportedValue) {
27243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for (i=0;i<dpd->FORM.Enum.NumberOfValues;i++)
27253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_free_devicepropvalue (dpd->DataType, dpd->FORM.Enum.SupportedValue+i);
27263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free (dpd->FORM.Enum.SupportedValue);
27273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
27283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
27293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
27303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
27323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_objectpropdesc(PTPObjectPropDesc* opd)
27333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
27343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t i;
27353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_devicepropvalue (opd->DataType, &opd->FactoryDefaultValue);
27373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	switch (opd->FormFlag) {
27383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_None:
27393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_Range:
27413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.MinimumValue);
27423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.MaximumValue);
27433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_free_devicepropvalue (opd->DataType, &opd->FORM.Range.StepSize);
27443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_Enumeration:
27463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (opd->FORM.Enum.SupportedValue) {
27473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for (i=0;i<opd->FORM.Enum.NumberOfValues;i++)
27483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_free_devicepropvalue (opd->DataType, opd->FORM.Enum.SupportedValue+i);
27493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			free (opd->FORM.Enum.SupportedValue);
27503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
27513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_DateTime:
27533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_FixedLengthArray:
27543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_RegularExpression:
27553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_ByteArray:
27563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	case PTP_OPFF_LongString:
27573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Ignore these presently, we cannot unpack them, so there is nothing to be freed. */
27583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	default:
27603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fprintf (stderr, "Unknown OPFF type %d\n", opd->FormFlag);
27613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		break;
27623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
27633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
27643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
27663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_objectinfo (PTPObjectInfo *oi)
27673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
27683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!oi) return;
27693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        free (oi->Filename); oi->Filename = NULL;
27703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        free (oi->Keywords); oi->Keywords = NULL;
27713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
27723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
27743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_free_object (PTPObject *ob)
27753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
27763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
27773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!ob) return;
27783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_objectinfo (&ob->oi);
27803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<ob->nrofmtpprops;i++)
27813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_destroy_object_prop(&ob->mtpprops[i]);
27823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ob->flags = 0;
27833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
27843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
27863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_perror(PTPParams* params, uint16_t error) {
27873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
27883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
27893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* PTP error descriptions */
27903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	static struct {
27913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		short n;
27923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
27933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_errors[] = {
27943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_Undefined, 		N_("PTP: Undefined Error")},
27953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_OK, 			N_("PTP: OK!")},
27963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_GeneralError, 		N_("PTP: General Error")},
27973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_SessionNotOpen, 	N_("PTP: Session Not Open")},
27983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidTransactionID, 	N_("PTP: Invalid Transaction ID")},
27993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_OperationNotSupported, 	N_("PTP: Operation Not Supported")},
28003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_ParameterNotSupported, 	N_("PTP: Parameter Not Supported")},
28013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_IncompleteTransfer, 	N_("PTP: Incomplete Transfer")},
28023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidStorageId, 	N_("PTP: Invalid Storage ID")},
28033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidObjectHandle, 	N_("PTP: Invalid Object Handle")},
28043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_DevicePropNotSupported, N_("PTP: Device Prop Not Supported")},
28053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidObjectFormatCode, N_("PTP: Invalid Object Format Code")},
28063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_StoreFull, 		N_("PTP: Store Full")},
28073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_ObjectWriteProtected, 	N_("PTP: Object Write Protected")},
28083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_StoreReadOnly, 		N_("PTP: Store Read Only")},
28093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_AccessDenied,		N_("PTP: Access Denied")},
28103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_NoThumbnailPresent, 	N_("PTP: No Thumbnail Present")},
28113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_SelfTestFailed, 	N_("PTP: Self Test Failed")},
28123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_PartialDeletion, 	N_("PTP: Partial Deletion")},
28133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_StoreNotAvailable, 	N_("PTP: Store Not Available")},
28143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_SpecificationByFormatUnsupported,
28153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				N_("PTP: Specification By Format Unsupported")},
28163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_NoValidObjectInfo, 	N_("PTP: No Valid Object Info")},
28173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidCodeFormat, 	N_("PTP: Invalid Code Format")},
28183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_UnknownVendorCode, 	N_("PTP: Unknown Vendor Code")},
28193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_CaptureAlreadyTerminated,
28203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					N_("PTP: Capture Already Terminated")},
28213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_DeviceBusy, 		N_("PTP: Device Busy")},
28223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidParentObject, 	N_("PTP: Invalid Parent Object")},
28233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidDevicePropFormat, N_("PTP: Invalid Device Prop Format")},
28243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidDevicePropValue, N_("PTP: Invalid Device Prop Value")},
28253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_InvalidParameter, 	N_("PTP: Invalid Parameter")},
28263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_SessionAlreadyOpened, 	N_("PTP: Session Already Opened")},
28273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_TransactionCanceled, 	N_("PTP: Transaction Canceled")},
28283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_SpecificationOfDestinationUnsupported,
28293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			N_("PTP: Specification Of Destination Unsupported")},
28303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_EK_FilenameRequired,	N_("PTP: EK Filename Required")},
28313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_EK_FilenameConflicts,	N_("PTP: EK Filename Conflicts")},
28323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_RC_EK_FilenameInvalid,	N_("PTP: EK Filename Invalid")},
28333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
28343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_ERROR_IO,		  N_("PTP: I/O error")},
28353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_ERROR_BADPARAM,	  N_("PTP: Error: bad parameter")},
28363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_ERROR_DATA_EXPECTED, N_("PTP: Protocol error, data expected")},
28373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_ERROR_RESP_EXPECTED, N_("PTP: Protocol error, response expected")},
28383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{0, NULL}
28393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
28403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
28413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0; ptp_errors[i].txt!=NULL; i++)
28423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ptp_errors[i].n == error)
28433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ptp_error(params, ptp_errors[i].txt);
28443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
28453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
28463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevconst char*
28473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_get_property_description(PTPParams* params, uint16_t dpc)
28483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
28493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
28503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* Device Property descriptions */
28513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
28523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
28533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
28543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_device_properties[] = {
28553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_Undefined,		N_("Undefined PTP Property")},
28563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_BatteryLevel,		N_("Battery Level")},
28573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FunctionalMode,	N_("Functional Mode")},
28583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ImageSize,		N_("Image Size")},
28593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting,	N_("Compression Setting")},
28603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance,		N_("White Balance")},
28613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_RGBGain,		N_("RGB Gain")},
28623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FNumber,		N_("F-Number")},
28633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocalLength,		N_("Focal Length")},
28643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusDistance,		N_("Focus Distance")},
28653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode,		N_("Focus Mode")},
28663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureMeteringMode,	N_("Exposure Metering Mode")},
28673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode,		N_("Flash Mode")},
28683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureTime,		N_("Exposure Time")},
28693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode,	N_("Exposure Program Mode")},
28703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureIndex,
28713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					N_("Exposure Index (film speed ISO)")},
28723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureBiasCompensation,
28733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					N_("Exposure Bias Compensation")},
28743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_DateTime,		N_("Date & Time")},
28753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CaptureDelay,		N_("Pre-Capture Delay")},
28763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode,	N_("Still Capture Mode")},
28773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_Contrast,		N_("Contrast")},
28783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_Sharpness,		N_("Sharpness")},
28793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_DigitalZoom,		N_("Digital Zoom")},
28803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EffectMode,		N_("Effect Mode")},
28813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_BurstNumber,		N_("Burst Number")},
28823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_BurstInterval,		N_("Burst Interval")},
28833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_TimelapseNumber,	N_("Timelapse Number")},
28843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_TimelapseInterval,	N_("Timelapse Interval")},
28853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode,	N_("Focus Metering Mode")},
28863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_UploadURL,		N_("Upload URL")},
28873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_Artist,		N_("Artist")},
28883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CopyrightInfo,		N_("Copyright Info")},
28893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0,NULL}
28903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
28913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
28923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
28933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
28943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_device_properties_EK[] = {
28953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_ColorTemperature,	N_("Color Temperature")},
28963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_DateTimeStampFormat,
28973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					N_("Date Time Stamp Format")},
28983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_BeepMode,		N_("Beep Mode")},
28993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_VideoOut,		N_("Video Out")},
29003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_PowerSaving,	N_("Power Saving")},
29013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_EK_UI_Language,	N_("UI Language")},
29023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0,NULL}
29033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
29043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
29053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
29063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
29073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
29083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_device_properties_Canon[] = {
29093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BeepMode,	N_("Beep Mode")},
29103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind,	N_("Battery Type")},
29113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus,	N_("Battery Mode")},
29123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_UILockType,	N_("UILockType")},
29133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraMode,	N_("Camera Mode")},
29143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality,	N_("Image Quality")},
29153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FullViewFileFormat,	N_("Full View File Format")},
29163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize,	N_("Image Size")},
29173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SelfTime,	N_("Self Time")},
29183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode,	N_("Flash Mode")},
29193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Beep,		N_("Beep")},
29203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode,	N_("Shooting Mode")},
29213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode,	N_("Image Mode")},
29223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode,	N_("Drive Mode")},
29233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoom,		N_("Zoom")},
29243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode,	N_("Metering Mode")},
29253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance,	N_("AF Distance")},
29263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint,	N_("Focusing Point")},
29273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance,	N_("White Balance")},
29283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SlowShutterSetting,	N_("Slow Shutter Setting")},
29293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode,		N_("AF Mode")},
29303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageStabilization,		N_("Image Stabilization")},
29313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast,	N_("Contrast")},
29323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain,	N_("Color Gain")},
29333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness,	N_("Sharpness")},
29343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sensitivity,	N_("Sensitivity")},
29353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ParameterSet,	N_("Parameter Set")},
29363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed,	N_("ISO Speed")},
29373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Aperture,	N_("Aperture")},
29383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShutterSpeed,	N_("Shutter Speed")},
29393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ExpCompensation,	N_("Exposure Compensation")},
29403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashCompensation,	N_("Flash Compensation")},
29413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AEBExposureCompensation,	N_("AEB Exposure Compensation")},
29423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AvOpen,		N_("Av Open")},
29433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AvMax,		N_("Av Max")},
29443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocalLength,	N_("Focal Length")},
29453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocalLengthTele,	N_("Focal Length Tele")},
29463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocalLengthWide,	N_("Focal Length Wide")},
29473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocalLengthDenominator,	N_("Focal Length Denominator")},
29483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CaptureTransferMode,	N_("Capture Transfer Mode")},
29493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Zoom,		N_("Zoom")},
29503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_NamePrefix,	N_("Name Prefix")},
29513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SizeQualityMode,	N_("Size Quality Mode")},
29523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SupportedThumbSize,	N_("Supported Thumb Size")},
29533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SizeOfOutputDataFromCamera,	N_("Size of Output Data from Camera")},
29543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SizeOfInputDataToCamera,		N_("Size of Input Data to Camera")},
29553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RemoteAPIVersion,N_("Remote API Version")},
29563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FirmwareVersion,	N_("Firmware Version")},
29573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraModel,	N_("Camera Model")},
29583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOwner,	N_("Camera Owner")},
29593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_UnixTime,	N_("UNIX Time")},
29603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraBodyID,	N_("Camera Body ID")},
29613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOutput,	N_("Camera Output")},
29623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DispAv,		N_("Disp Av")},
29633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AvOpenApex,	N_("Av Open Apex")},
29643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DZoomMagnification,	N_("Digital Zoom Magnification")},
29653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MlSpotPos,	N_("Ml Spot Position")},
29663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DispAvMax,	N_("Disp Av Max")},
29673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AvMaxApex,	N_("Av Max Apex")},
29683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoomStartPosition,	N_("EZoom Start Position")},
29693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocalLengthOfTele,	N_("Focal Length Tele")},
29703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoomSizeOfTele,	N_("EZoom Size of Tele")},
29713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect,	N_("Photo Effect")},
29723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AssistLight,	N_("Assist Light")},
29733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashQuantityCount,	N_("Flash Quantity Count")},
29743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RotationAngle,	N_("Rotation Angle")},
29753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RotationScene,	N_("Rotation Scene")},
29763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EventEmulateMode,N_("Event Emulate Mode")},
29773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DPOFVersion,	N_("DPOF Version")},
29783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_TypeOfSupportedSlideShow,	N_("Type of Slideshow")},
29793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AverageFilesizes,N_("Average Filesizes")},
29803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ModelID,		N_("Model ID")},
29813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0,NULL}
29823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
29833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
29843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
29853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
29863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
29873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_device_properties_Nikon[] = {
29883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingBank, 			/* 0xD010 */
29893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Bank")},
29903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingBankNameA,		/* 0xD011 */
29913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Bank Name A")},
29923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingBankNameB,		/* 0xD012 */
29933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Bank Name B")},
29943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingBankNameC,		/* 0xD013 */
29953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Bank Name C")},
29963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingBankNameD,		/* 0xD014 */
29973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Bank Name D")},
29983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ResetBank0,			/* 0xD015 */
29993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Reset Bank 0")},
30003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RawCompression,			/* 0xD016 */
30013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Raw Compression")},
30023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceAutoBias,		/* 0xD017 */
30033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto White Balance Bias")},
30043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceTungstenBias,	/* 0xD018 */
30053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tungsten White Balance Bias")},
30063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceFluorescentBias,	/* 0xD019 */
30073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Fluorescent White Balance Bias")},
30083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceDaylightBias,	/* 0xD01a */
30093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Daylight White Balance Bias")},
30103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceFlashBias,		/* 0xD01b */
30113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash White Balance Bias")},
30123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceCloudyBias,		/* 0xD01c */
30133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Cloudy White Balance Bias")},
30143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceShadeBias,		/* 0xD01d */
30153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shady White Balance Bias")},
30163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceColorTemperature,	/* 0xD01e */
30173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Colour Temperature")},
30183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetNo,		/* 0xD01f */
30193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Number")},
30203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetName0,		/* 0xD020 */
30213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Name 0")},
30223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetName1,		/* 0xD021 */
30233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Name 1")},
30243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetName2,		/* 0xD022 */
30253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Name 2")},
30263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetName3,		/* 0xD023 */
30273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Name 3")},
30283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetName4,		/* 0xD024 */
30293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Name 4")},
30303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetVal0,		/* 0xD025 */
30313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Value 0")},
30323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetVal1,		/* 0xD026 */
30333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Value 1")},
30343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetVal2,		/* 0xD027 */
30353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Value 2")},
30363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetVal3,		/* 0xD028 */
30373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Value 3")},
30383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalancePresetVal4,		/* 0xD029 */
30393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("White Balance Preset Value 4")},
30403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening,			/* 0xD02a */
30413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Sharpening")},
30423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation,		/* 0xD02b */
30433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tone Compensation")},
30443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ColorModel,			/* 0xD02c */
30453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Color Model")},
30463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_HueAdjustment,			/* 0xD02d */
30473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Hue Adjustment")},
30483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NonCPULensDataFocalLength,	/* 0xD02e */
30493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Lens Focal Length (Non CPU)")},
30503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NonCPULensDataMaximumAperture,	/* 0xD02f */
30513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Lens Maximum Aperture (Non CPU)")},
30523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ShootingMode,			/* 0xD030 */
30533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Mode")},
30543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_JPEG_Compression_Policy,		/* 0xD031 */
30553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("JPEG Compression Policy")},
30563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ColorSpace,			/* 0xD032 */
30573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Color Space")},
30583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoDXCrop,			/* 0xD033 */
30593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto DX Crop")},
30603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CSMMenuBankSelect,		/* 0xD040 */
30613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_CSMMenuBankSelect"},
30623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MenuBankNameA,			/* 0xD041 */
30633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Menu Bank Name A")},
30643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MenuBankNameB,			/* 0xD042 */
30653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Menu Bank Name B")},
30663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MenuBankNameC,			/* 0xD043 */
30673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Menu Bank Name C")},
30683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MenuBankNameD,			/* 0xD044 */
30693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Menu Bank Name D")},
30703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ResetBank,			/* 0xD045 */
30713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Reset Menu Bank")},
30723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_A1AFCModePriority,		/* 0xD048 */
30733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_A1AFCModePriority"},
30743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_A2AFSModePriority,		/* 0xD049 */
30753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_A2AFSModePriority"},
30763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_A3GroupDynamicAF,		/* 0xD04a */
30773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_A3GroupDynamicAF"},
30783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_A4AFActivation,			/* 0xD04b */
30793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_A4AFActivation"},
30803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusAreaIllumManualFocus,	/* 0xD04c */
30813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_FocusAreaIllumManualFocus"},
30823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusAreaIllumContinuous,	/* 0xD04d */
30833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_FocusAreaIllumContinuous"},
30843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusAreaIllumWhenSelected,	/* 0xD04e */
30853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_FocusAreaIllumWhenSelected"},
30863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusAreaWrap,			/* 0xD04f */
30873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Focus Area Wrap")},
30883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_VerticalAFON,			/* 0xD050 */
30893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Vertical AF On")},
30903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFLockOn,			/* 0xD051 */
30913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF Lock On")},
30923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusAreaZone,			/* 0xD052 */
30933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Focus Area Zone")},
30943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EnableCopyright,			/* 0xD053 */
30953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Enable Copyright")},
30963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,				/* 0xD054 */
30973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto ISO")},
30983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EVISOStep,			/* 0xD055 */
30993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure ISO Step")},
31003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EVStep,				/* 0xD056 */
31013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Step")},
31023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EVStepExposureComp,		/* 0xD057 */
31033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Compensation (EV)")},
31043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureCompensation,		/* 0xD058 */
31053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Compensation")},
31063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CenterWeightArea,		/* 0xD059 */
31073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Centre Weight Area")},
31083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureBaseMatrix,		/* 0xD05A */
31093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Base Matrix")},
31103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureBaseCenter,		/* 0xD05B */
31113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Base Center")},
31123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureBaseSpot,		/* 0xD05C */
31133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Base Spot")},
31143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewAF,			/* 0xD05D */
31153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View AF")},
31163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELockMode,			/* 0xD05E */
31173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Lock")},
31183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode,			/* 0xD05F */
31193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Focus Lock")},
31203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff,			/* 0xD062 */
31213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Meter Off Time")},
31223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimer,			/* 0xD063 */
31233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Self Timer Delay")},
31243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff,			/* 0xD064 */
31253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("LCD Off Time")},
31263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImgConfTime,			/* 0xD065 */
31273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Img Conf Time")},
31283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AngleLevel,			/* 0xD067 */
31293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Angle Level")},
31303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_D1ShootingSpeed,			/* 0xD068 */
31313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Shooting Speed")},
31323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_D2MaximumShots,			/* 0xD069 */
31333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Maximum Shots")},
31343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_D3ExpDelayMode,			/* 0xD06A */
31353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure delay mode")},
31363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LongExposureNoiseReduction,	/* 0xD06B */
31373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Long Exposure Noise Reduction")},
31383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FileNumberSequence,		/* 0xD06C */
31393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("File Number Sequencing")},
31403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ControlPanelFinderRearControl,	/* 0xD06D */
31413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_ControlPanelFinderRearControl"},
31423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ControlPanelFinderViewfinder,	/* 0xD06E */
31433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 "PTP_DPC_NIKON_ControlPanelFinderViewfinder"},
31443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_D7Illumination,			/* 0xD06F */
31453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("LCD Illumination")},
31463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NrHighISO,			/* 0xD070 */
31473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("High ISO noise reduction")},
31483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SHSET_CH_GUID_DISP,		/* 0xD071 */
31493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("On screen tips")},
31503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ArtistName,			/* 0xD072 */
31513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Artist Name")},
31523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CopyrightInfo,			/* 0xD073 */
31533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Copyright Information")},
31543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashSyncSpeed,			/* 0xD074 */
31553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Sync. Speed")},
31563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed,		/* 0xD075 */
31573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Shutter Speed")},
31583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_E3AAFlashMode,			/* 0xD076 */
31593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Mode")},
31603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_E4ModelingFlash,			/* 0xD077 */
31613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Modeling Flash")},
31623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketSet,			/* 0xD078 */
31633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Bracket Set")},
31643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_E6ManualModeBracketing,		/* 0xD079 */
31653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Manual Mode Bracketing")},
31663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketOrder,			/* 0xD07A */
31673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Bracket Order")},
31683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_E8AutoBracketSelection,		/* 0xD07B */
31693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Bracket Selection")},
31703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketingSet, N_("NIKON Auto Bracketing Set")},	/* 0xD07C */
31713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F1CenterButtonShootingMode,	/* 0xD080 */
31723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Center Button Shooting Mode")},
31733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CenterButtonPlaybackMode,	/* 0xD081 */
31743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Center Button Playback Mode")},
31753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F2Multiselector,			/* 0xD082 */
31763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Multiselector")},
31773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F3PhotoInfoPlayback,		/* 0xD083 */
31783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Photo Info. Playback")},
31793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F4AssignFuncButton,		/* 0xD084 */
31803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Assign Func. Button")},
31813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F5CustomizeCommDials,		/* 0xD085 */
31823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Customise Command Dials")},
31833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ReverseCommandDial,		/* 0xD086 */
31843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Reverse Command Dial")},
31853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ApertureSetting,			/* 0xD087 */
31863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Aperture Setting")},
31873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MenusAndPlayback,		/* 0xD088 */
31883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Menus and Playback")},
31893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F6ButtonsAndDials,		/* 0xD089 */
31903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Buttons and Dials")},
31913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NoCFCard,			/* 0xD08A */
31923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("No CF Card Release")},
31933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CenterButtonZoomRatio,		/* 0xD08B */
31943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Center Button Zoom Ratio")},
31953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FunctionButton2,			/* 0xD08C */
31963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Function Button 2")},
31973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAreaPoint,			/* 0xD08D */
31983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF Area Point")},
31993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NormalAFOn,			/* 0xD08E */
32003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Normal AF On")},
32013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageCommentString,		/* 0xD090 */
32023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Image Comment String")},
32033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageCommentEnable,		/* 0xD091 */
32043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Image Comment Enable")},
32053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageRotation,			/* 0xD092 */
32063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Image Rotation")},
32073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ManualSetLensNo,			/* 0xD093 */
32083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Manual Set Lens Number")},
32093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MovScreenSize,			/* 0xD0A0 */
32103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Movie Screen Size")},
32113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MovVoice,			/* 0xD0A1 */
32123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Movie Voice")},
32133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Bracketing,			/* 0xD0C0 */
32143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Bracketing Enable")},
32153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoExposureBracketStep,		/* 0xD0C1 */
32163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Bracketing Step")},
32173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoExposureBracketProgram,	/* 0xD0C2 */
32183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Bracketing Program")},
32193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoExposureBracketCount,	/* 0xD0C3 */
32203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Exposure Bracket Count")},
32213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceBracketStep, N_("White Balance Bracket Step")}, /* 0xD0C4 */
32223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WhiteBalanceBracketProgram, N_("White Balance Bracket Program")}, /* 0xD0C5 */
32233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID,				/* 0xD0E0 */
32243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Lens ID")},
32253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensSort,			/* 0xD0E1 */
32263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Lens Sort")},
32273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensType,			/* 0xD0E2 */
32283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Lens Type")},
32293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocalLengthMin,			/* 0xD0E3 */
32303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Min. Focal Length")},
32313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocalLengthMax,			/* 0xD0E4 */
32323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Max. Focal Length")},
32333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MaxApAtMinFocalLength,		/* 0xD0E5 */
32343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Max. Aperture at Min. Focal Length")},
32353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MaxApAtMaxFocalLength,		/* 0xD0E6 */
32363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Max. Aperture at Max. Focal Length")},
32373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FinderISODisp,			/* 0xD0F0 */
32383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Finder ISO Display")},
32393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoOffPhoto,			/* 0xD0F2 */
32403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Off Photo")},
32413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoOffMenu,			/* 0xD0F3 */
32423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Off Menu")},
32433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoOffInfo,			/* 0xD0F4 */
32443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto Off Info")},
32453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimerShootNum,		/* 0xD0F5 */
32463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Self Timer Shot Number")},
32473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_VignetteCtrl,			/* 0xD0F7 */
32483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Vignette Control")},
32493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureTime,			/* 0xD100 */
32503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Nikon Exposure Time")},
32513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ACPower, N_("AC Power")},	/* 0xD101 */
32523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WarningStatus, N_("Warning Status")},/* 0xD102 */
32533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MaximumShots,			/* 0xD103 */
32543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Maximum Shots")},
32553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFLockStatus, N_("AF Locked")},/* 0xD104 */
32563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELockStatus, N_("AE Locked")},/* 0xD105 */
32573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FVLockStatus, N_("FV Locked")},/* 0xD106 */
32583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusLCDTopMode2,		/* 0xD107 */
32593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF LCD Top Mode 2")},
32603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea,			/* 0xD108 */
32613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Active AF Sensor")},
32623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlexibleProgram,			/* 0xD109 */
32633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flexible Program")},
32643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LightMeter,			/* 0xD10A */
32653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Meter")},
32663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RecordingMedia,			/* 0xD10B */
32673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Recording Media")},
32683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_USBSpeed,			/* 0xD10C */
32693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("USB Speed")},
32703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CCDNumber,			/* 0xD10D */
32713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("CCD Serial Number")},
32723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CameraOrientation,		/* 0xD10E */
32733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Camera Orientation")},
32743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_GroupPtnType,			/* 0xD10F */
32753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Group PTN Type")},
32763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FNumberLock,			/* 0xD110 */
32773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("FNumber Lock")},
32783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureApertureLock,		/* 0xD111 */
32793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Aperture Lock")},
32803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TVLockSetting,			/* 0xD112 */
32813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("TV Lock Setting")},
32823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AVLockSetting,			/* 0xD113 */
32833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AV Lock Setting")},
32843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_IllumSetting,			/* 0xD114 */
32853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Illum Setting")},
32863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocusPointBright,		/* 0xD115 */
32873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Focus Point Bright")},
32883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashAttached,		/* 0xD120 */
32893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Attached")},
32903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashStatus,		/* 0xD121 */
32913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Status")},
32923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashSort,		/* 0xD122 */
32933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Sort")},
32943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashMode,		/* 0xD123 */
32953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Mode")},
32963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashCompensation,	/* 0xD124 */
32973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Compensation")},
32983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_NewExternalFlashMode,		/* 0xD125 */
32993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("External Flash Mode")},
33003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashExposureCompensation,	/* 0xD126 */
33013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Exposure Compensation")},
33023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage,			/* 0xD140 */
33033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Optimize Image")},
33043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Saturation,			/* 0xD142 */
33053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Saturation")},
33063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BW_FillerEffect,			/* 0xD143 */
33073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("BW Filler Effect")},
33083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BW_Sharpness,			/* 0xD144 */
33093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("BW Sharpness")},
33103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BW_Contrast,			/* 0xD145 */
33113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("BW Contrast")},
33123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BW_Setting_Type,			/* 0xD146 */
33133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("BW Setting Type")},
33143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Slot2SaveMode,			/* 0xD148 */
33153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Slot 2 Save Mode")},
33163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RawBitMode,			/* 0xD149 */
33173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Raw Bit Mode")},
33183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoTime,			/* 0xD14E */
33193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("ISO Auto Time")},
33203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlourescentType,			/* 0xD14F */
33213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flourescent Type")},
33223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TuneColourTemperature,		/* 0xD150 */
33233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Colour Temperature")},
33243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TunePreset0,			/* 0xD151 */
33253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Preset 0")},
33263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TunePreset1,			/* 0xD152 */
33273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Preset 1")},
33283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TunePreset2,			/* 0xD153 */
33293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Preset 2")},
33303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TunePreset3,			/* 0xD154 */
33313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Preset 3")},
33323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_TunePreset4,			/* 0xD155 */
33333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Tune Preset 4")},
33343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BeepOff,				/* 0xD160 */
33353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF Beep Mode")},
33363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode,			/* 0xD161 */
33373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Autofocus Mode")},
33383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAssist,			/* 0xD163 */
33393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF Assist Lamp")},
33403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode,			/* 0xD164 */
33413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto ISO P/A/DVP Setting")},
33423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageReview,			/* 0xD165 */
33433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Image Review")},
33443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAreaIllumination,		/* 0xD166 */
33453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AF Area Illumination")},
33463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMode,			/* 0xD167 */
33473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Mode")},
33483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommanderMode,	 	/* 0xD168 */
33493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Commander Mode")},
33503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashSign,			/* 0xD169 */
33513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Sign")},
33523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,				/* 0xD16A */
33533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("ISO Auto")},
33543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RemoteTimeout,			/* 0xD16B */
33553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Remote Timeout")},
33563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_GridDisplay,			/* 0xD16C */
33573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Viewfinder Grid Display")},
33583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower,		/* 0xD16D */
33593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Mode Manual Power")},
33603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower,		/* 0xD16E */
33613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Mode Commander Power")},
33623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutoFP,				/* 0xD16F */
33633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Auto FP")},
33643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CSMMenu,				/* 0xD180 */
33653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("CSM Menu")},
33663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_WarningDisplay,			/* 0xD181 */
33673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Warning Display")},
33683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BatteryCellKind,			/* 0xD182 */
33693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Battery Cell Kind")},
33703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit,			/* 0xD183 */
33713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("ISO Auto High Limit")},
33723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_DynamicAFArea,			/* 0xD184 */
33733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Dynamic AF Area")},
33743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ContinuousSpeedHigh,		/* 0xD186 */
33753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Continuous Speed High")},
33763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_InfoDispSetting,			/* 0xD187 */
33773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Info Disp Setting")},
33783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PreviewButton,			/* 0xD189 */
33793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Preview Button")},
33803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PreviewButton2,			/* 0xD18A */
33813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Preview Button 2")},
33823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AEAFLockButton2,			/* 0xD18B */
33833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("AEAF Lock Button 2")},
33843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_IndicatorDisp,			/* 0xD18D */
33853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Indicator Display")},
33863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CellKindPriority,		/* 0xD18E */
33873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Cell Kind Priority")},
33883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketingFramesAndSteps,	/* 0xD190 */
33893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Bracketing Frames and Steps")},
33903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewMode,			/* 0xD1A0 */
33913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View Mode")},
33923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewDriveMode,		/* 0xD1A1 */
33933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View Drive Mode")},
33943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewStatus,			/* 0xD1A2 */
33953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View Status")},
33963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewImageZoomRatio,		/* 0xD1A3 */
33973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View Image Zoom Ratio")},
33983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LiveViewProhibitCondition,	/* 0xD1A4 */
33993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Live View Prohibit Condition")},
34003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureDisplayStatus,		/* 0xD1B0 */
34013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Display Status")},
34023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureIndicateStatus,		/* 0xD1B1 */
34033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Indicate Status")},
34043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureIndicateLightup,		/* 0xD1B2 */
34053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Exposure Indicate Lightup")},
34063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashOpen,			/* 0xD1C0 */
34073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Open")},
34083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCharged,			/* 0xD1C1 */
34093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Charged")},
34103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMRepeatValue,		/* 0xD1D0 */
34113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash MRepeat Value")},
34123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMRepeatCount,		/* 0xD1D1 */
34133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash MRepeat Count")},
34143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMRepeatInterval,		/* 0xD1D2 */
34153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash MRepeat Interval")},
34163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandChannel,		/* 0xD1D3 */
34173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command Channel")},
34183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandSelfMode,		/* 0xD1D4 */
34193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command Self Mode")},
34203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandSelfCompensation,	/* 0xD1D5 */
34213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command Self Compensation")},
34223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandSelfValue,		/* 0xD1D6 */
34233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command Self Value")},
34243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandAMode,		/* 0xD1D7 */
34253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command A Mode")},
34263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandACompensation,	/* 0xD1D8 */
34273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command A Compensation")},
34283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandAValue,		/* 0xD1D9 */
34293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command A Value")},
34303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandBMode,		/* 0xD1DA */
34313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command B Mode")},
34323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandBCompensation,	/* 0xD1DB */
34333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command B Compensation")},
34343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommandBValue,		/* 0xD1DC */
34353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Flash Command B Value")},
34363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ActivePicCtrlItem,		/* 0xD200 */
34373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Active Pic Ctrl Item")},
34383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ChangePicCtrlItem,		/* 0xD201 */
34393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Change Pic Ctrl Item")},
34403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0,NULL}
34413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
34423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        struct {
34433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
34443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *txt;
34453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        } ptp_device_properties_MTP[] = {
34463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_SecureTime,        N_("Secure Time")},		/* D101 */
34473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_DeviceCertificate, N_("Device Certificate")},	/* D102 */
34483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_RevocationInfo,    N_("Revocation Info")},		/* D103 */
34493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_SynchronizationPartner,				/* D401 */
34503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Synchronization Partner")},
34513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_DeviceFriendlyName,				/* D402 */
34523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Friendly Device Name")},
34533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_VolumeLevel,       N_("Volume Level")},		/* D403 */
34543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_DeviceIcon,        N_("Device Icon")},		/* D405 */
34553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_SessionInitiatorInfo,	N_("Session Initiator Info")},/* D406 */
34563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PerceivedDeviceType,	N_("Perceived Device Type")},/* D407 */
34573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PlaybackRate,      N_("Playback Rate")},		/* D410 */
34583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PlaybackObject,    N_("Playback Object")},		/* D411 */
34593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PlaybackContainerIndex,				/* D412 */
34603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		 N_("Playback Container Index")},
34613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PlaybackPosition,  N_("Playback Position")},	/* D413 */
34623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_MTP_PlaysForSureID,    N_("PlaysForSure ID")},		/* D131 (?) */
34633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0,NULL}
34643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        };
34653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0; ptp_device_properties[i].txt!=NULL; i++)
34673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ptp_device_properties[i].dpc==dpc)
34683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return (ptp_device_properties[i].txt);
34693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_MICROSOFT
34713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    || params->deviceinfo.VendorExtensionID==PTP_VENDOR_MTP)
34723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0; ptp_device_properties_MTP[i].txt!=NULL; i++)
34733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ptp_device_properties_MTP[i].dpc==dpc)
34743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return (ptp_device_properties_MTP[i].txt);
34753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_EASTMAN_KODAK)
34773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0; ptp_device_properties_EK[i].txt!=NULL; i++)
34783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ptp_device_properties_EK[i].dpc==dpc)
34793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return (ptp_device_properties_EK[i].txt);
34803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_CANON)
34823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0; ptp_device_properties_Canon[i].txt!=NULL; i++)
34833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ptp_device_properties_Canon[i].dpc==dpc)
34843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return (ptp_device_properties_Canon[i].txt);
34853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_NIKON)
34873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0; ptp_device_properties_Nikon[i].txt!=NULL; i++)
34883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ptp_device_properties_Nikon[i].dpc==dpc)
34893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return (ptp_device_properties_Nikon[i].txt);
34903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return NULL;
34923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
34933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
34943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic int64_t
34953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev_value_to_num(PTPPropertyValue *data, uint16_t dt) {
34963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (dt == PTP_DTC_STR) {
34973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (!data->str)
34983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 0;
34993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return atol(data->str);
35003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
35013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (dt & PTP_DTC_ARRAY_MASK) {
35023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return 0;
35033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
35043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		switch (dt) {
35053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UNDEF:
35063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 0;
35073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_INT8:
35083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->i8;
35093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT8:
35103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->u8;
35113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_INT16:
35123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->i16;
35133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT16:
35143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->u16;
35153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_INT32:
35163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->i32;
35173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DTC_UINT32:
35183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return data->u32;
35193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/*
35203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_DTC_INT64
35213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_DTC_UINT64
35223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_DTC_INT128
35233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_DTC_UINT128
35243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*/
35253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		default:
35263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return 0;
35273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
35283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
35293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 0;
35313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
35323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_VAL_BOOL(dpc) {dpc, 0, N_("Off")}, {dpc, 1, N_("On")}
35343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_VENDOR_VAL_BOOL(dpc,vendor) {dpc, vendor, 0, N_("Off")}, {dpc, vendor, 1, N_("On")}
35353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_VENDOR_VAL_RBOOL(dpc,vendor) {dpc, vendor, 0, N_("On")}, {dpc, vendor, 1, N_("Off")}
35363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define PTP_VENDOR_VAL_YN(dpc,vendor) {dpc, vendor, 0, N_("No")}, {dpc, vendor, 1, N_("Yes")}
35373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
35393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_render_property_value(PTPParams* params, uint16_t dpc,
35403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			  PTPDevicePropDesc *dpd, int length, char *out)
35413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
35423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
35433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int64_t	kval;
35443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
35463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
35473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t vendor;
35483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		double coef;
35493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		double bias;
35503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		const char *format;
35513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_value_trans[] = {
35523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_BatteryLevel, 0, 1.0, 0.0, "%.0f%%"},		/* 5001 */
35533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FNumber, 0, 0.01, 0.0, "f/%.2g"},		/* 5007 */
35543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocalLength, 0, 0.01, 0.0, "%.0f mm"},		/* 5008 */
35553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusDistance, 0, 0.01, 0.0, "%.0f mm"},	/* 5009 */
35563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureTime, 0, 0.00001, 0.0, "%.2g sec"},	/* 500D */
35573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureIndex, 0, 1.0, 0.0, "ISO %.0f"},	/* 500F */
35583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureBiasCompensation, 0, 0.001, 0.0, N_("%.1f stops")},/* 5010 */
35593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_DigitalZoom, 0, 0.1, 0.0, "%.1f"},		/* 5016 */
35603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Nikon device properties */
35623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LightMeter, PTP_VENDOR_NIKON, 0.08333, 0.0, N_("%.1f stops")},/* D10A */
35633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashExposureCompensation, PTP_VENDOR_NIKON, 0.16666, 0.0, N_("%.1f stops")}, /* D126 */
35643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CenterWeightArea, PTP_VENDOR_NIKON, 2.0, 6.0, N_("%.0f mm")},/* D059 */
35653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocalLengthMin, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0f mm"}, /* D0E3 */
35663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FocalLengthMax, PTP_VENDOR_NIKON, 0.01, 0.0, "%.0f mm"}, /* D0E4 */
35673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MaxApAtMinFocalLength, PTP_VENDOR_NIKON, 0.01, 0.0, "f/%.2g"}, /* D0E5 */
35683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MaxApAtMaxFocalLength, PTP_VENDOR_NIKON, 0.01, 0.0, "f/%.2g"}, /* D0E6 */
35693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExternalFlashCompensation, PTP_VENDOR_NIKON, 1.0/6.0, 0.0,"%.0f"}, /* D124 */
35703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ExposureIndicateStatus, PTP_VENDOR_NIKON, 0.08333, 0.0, N_("%.1f stops")},/* D1B1 - FIXME: check if correct. */
35713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0, 0, 0.0, 0.0, NULL}
35723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
35733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
35743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	struct {
35753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t dpc;
35763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint16_t vendor;
35773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int64_t key;
35783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		char *value;
35793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} ptp_value_list[] = {
35803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting, 0, 0, N_("JPEG Basic")},	/* 5004 */
35813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting, 0, 1, N_("JPEG Norm")},
35823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting, 0, 2, N_("JPEG Fine")},
35833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting, 0, 4, N_("RAW")},
35843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CompressionSetting, 0, 5, N_("RAW + JPEG Basic")},
35853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 1, N_("Manual")},
35863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 2, N_("Automatic")},		/* 5005 */
35873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 3, N_("One-push Automatic")},
35883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 4, N_("Daylight")},
35893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 5, N_("Fluorescent")},
35903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 6, N_("Incandescent")},
35913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, 0, 7, N_("Flash")},
35923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, PTP_VENDOR_NIKON, 32784, N_("Cloudy")},
35933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, PTP_VENDOR_NIKON, 32785, N_("Shade")},
35943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, PTP_VENDOR_NIKON, 32786, N_("Color Temperature")},
35953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_WhiteBalance, PTP_VENDOR_NIKON, 32787, N_("Preset")},
35963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, 0, 1, N_("Manual Focus")},		/* 500A */
35973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, 0, 2, N_("Automatic")},
35983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, 0, 3, N_("Automatic Macro (close-up)")},
35993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, PTP_VENDOR_NIKON, 32784, "AF-S"},
36003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, PTP_VENDOR_NIKON, 32785, "AF-C"},
36013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMode, PTP_VENDOR_NIKON, 32786, "AF-A"},
36023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureMeteringMode, 0, 1, N_("Average")},	/* 500B */
36033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureMeteringMode, 0, 2, N_("Center Weighted Average")},
36043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureMeteringMode, 0, 3, N_("Multi-spot")},
36053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureMeteringMode, 0, 4, N_("Center-spot")},
36063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 0, N_("Undefined")},		/* 500C */
36073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 1, N_("Automatic flash")},
36083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 2, N_("Flash off")},
36093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 3, N_("Fill flash")},
36103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 4, N_("Automatic Red-eye Reduction")},
36113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 5, N_("Red-eye fill flash")},
36123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, 0, 6, N_("External sync")},
36133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, PTP_VENDOR_NIKON, 32784, N_("Default")},
36143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, PTP_VENDOR_NIKON, 32785, N_("Slow Sync")},
36153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, PTP_VENDOR_NIKON, 32786, N_("Rear Curtain Sync + Slow Sync")},
36163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FlashMode, PTP_VENDOR_NIKON, 32787, N_("Red-eye Reduction + Slow Sync")},
36173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, 0, 1, "M"},		/* 500E */
36183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, 0, 3, "A"},
36193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, 0, 4, "S"},
36203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, 0, 2, "P"},
36213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32784, N_("Auto")},
36223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32785, N_("Portrait")},
36233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32786, N_("Landscape")},
36243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32787, N_("Macro")},
36253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32788, N_("Sports")},
36263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32790, N_("Night Landscape")},
36273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_ExposureProgramMode, PTP_VENDOR_NIKON, 32789, N_("Night Portrait")},
36283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, 0, 1, N_("Single Shot")},	/* 5013 */
36293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, 0, 2, N_("Power Wind")},
36303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, 0, 3, N_("Timelapse")},
36313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, PTP_VENDOR_NIKON, 32784, N_("Continuous Low Speed")},
36323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, PTP_VENDOR_NIKON, 32785, N_("Timer")},
36333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, PTP_VENDOR_NIKON, 32787, N_("Remote")},
36343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, PTP_VENDOR_NIKON, 32787, N_("Mirror Up")},
36353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_StillCaptureMode, PTP_VENDOR_NIKON, 32788, N_("Timer + Remote")},
36363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode, 0, 1, N_("Centre-spot")},	/* 501C */
36373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode, 0, 2, N_("Multi-spot")},
36383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode, PTP_VENDOR_NIKON, 32784, N_("Single Area")},
36393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode, PTP_VENDOR_NIKON, 32785, N_("Closest Subject")},
36403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_FocusMeteringMode, PTP_VENDOR_NIKON, 32786, N_("Group Dynamic")},
36413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Nikon specific device properties */
36443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 0, N_("Auto")},	/* D02A */
36453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 1, N_("Normal")},
36463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 2, N_("Low")},
36473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 3, N_("Medium Low")},
36483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 4, N_("Medium high")},
36493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 5, N_("High")},
36503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ImageSharpening, PTP_VENDOR_NIKON, 6, N_("None")},
36513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 0, N_("Auto")},	/* D02B */
36533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 1, N_("Normal")},
36543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 2, N_("Low contrast")},
36553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 3, N_("Medium Low")},
36563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 4, N_("Medium High")},
36573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 5, N_("High control")},
36583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ToneCompensation, PTP_VENDOR_NIKON, 6, N_("Custom")},
36593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ColorModel, PTP_VENDOR_NIKON, 0, "sRGB"},		/* D02C */
36613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ColorModel, PTP_VENDOR_NIKON, 1, "AdobeRGB"},
36623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ColorModel, PTP_VENDOR_NIKON, 2, "sRGB"},
36633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_AutoDXCrop,PTP_VENDOR_NIKON),	   	/* D033 */
36653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_FocusAreaWrap,PTP_VENDOR_NIKON),   	/* D04F */
36673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_EnableCopyright,PTP_VENDOR_NIKON),   	/* D053 */
36693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_ISOAuto,PTP_VENDOR_NIKON),	   	/* D054 */
36703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* FIXME! this is not ISO Auto (which is a bool) Perhaps ISO Auto Time?*/
36723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 0, "1/125"},			/* D054 */
36733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 1, "1/60"},
36743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 2, "1/30"},
36753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 3, "1/15"},
36763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 4, "1/8"},
36773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 5, "1/4"},
36783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 6, "1/2"},
36793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 7, "1"},
36803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 8, "2"},
36813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 9, "4"},
36823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 10, "8"},
36833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 11, "15"},
36843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAuto,	PTP_VENDOR_NIKON, 12, "30"},
36853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EVStep, PTP_VENDOR_NIKON, 0, "1/3"},			/* D056 */
36873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_EVStep, PTP_VENDOR_NIKON, 1, "1/2"},
36883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_ExposureCompensation,PTP_VENDOR_NIKON),/*D058 */
36903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_AELockMode,PTP_VENDOR_NIKON),    	/* D05E */
36913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 0, N_("AE/AF Lock")},	/* D05F */
36933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 1, N_("AF Lock only")},
36943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 2, N_("AE Lock only")},
36953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 3, N_("AF Lock Hold")},
36963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 4, N_("AF On")},
36973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AELAFLMode, PTP_VENDOR_NIKON, 5, N_("Flash Lock")},
36983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
36993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 0, N_("4 seconds")},		/* D062 */
37003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 1, N_("6 seconds")},
37013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 2, N_("8 seconds")},
37023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 3, N_("16 seconds")},
37033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 4, N_("30 minutes")},
37043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MeterOff, PTP_VENDOR_NIKON, 5, N_("30 seconds")},
37053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimer, PTP_VENDOR_NIKON, 0, N_("2 seconds")},	/* D063 */
37073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimer, PTP_VENDOR_NIKON, 1, N_("5 seconds")},
37083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimer, PTP_VENDOR_NIKON, 2, N_("10 seconds")},
37093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_SelfTimer, PTP_VENDOR_NIKON, 3, N_("20 seconds")},
37103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 0, N_("10 seconds")},	/* D064 */
37123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 1, N_("20 seconds")},
37133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 2, N_("1 minute")},
37143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 3, N_("5 minutes")},
37153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 4, N_("10 minutes")},
37163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_MonitorOff, PTP_VENDOR_NIKON, 5, N_("5 seconds")}, /* d80 observed */
37173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_D3ExpDelayMode,PTP_VENDOR_NIKON),	/* D06A */
37193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_LongExposureNoiseReduction,PTP_VENDOR_NIKON),	/* D06B */
37203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_FileNumberSequence,PTP_VENDOR_NIKON),	/* D06C */
37213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_D7Illumination,PTP_VENDOR_NIKON),	/* D06F */
37223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_SHSET_CH_GUID_DISP,PTP_VENDOR_NIKON),	/* D071 */
37243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 0, "1/60s"},		/* D075 */
37263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 1, "1/30s"},
37273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 2, "1/15s"},
37283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 3, "1/8s"},
37293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 4, "1/4s"},
37303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 5, "1/2s"},
37313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 6, "1s"},
37323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 7, "2s"},
37333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 8, "4s"},
37343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 9, "8s"},
37353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 10, "15s"},
37363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashShutterSpeed, PTP_VENDOR_NIKON, 11, "30s"},
37373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_E4ModelingFlash,PTP_VENDOR_NIKON),	/* D077 */
37393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketSet, PTP_VENDOR_NIKON, 0, N_("AE & Flash")},	/* D078 */
37413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketSet, PTP_VENDOR_NIKON, 1, N_("AE only")},
37423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketSet, PTP_VENDOR_NIKON, 2, N_("Flash only")},
37433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketSet, PTP_VENDOR_NIKON, 3, N_("WB bracketing")},
37443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketOrder, PTP_VENDOR_NIKON, 0, N_("MTR > Under")},	/* D07A */
37463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BracketOrder, PTP_VENDOR_NIKON, 1, N_("Under > MTR")},
37473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F1CenterButtonShootingMode, PTP_VENDOR_NIKON, 0, N_("Reset focus point to center")}, /* D080 */
37493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F1CenterButtonShootingMode, PTP_VENDOR_NIKON, 1, N_("Highlight active focus point")},
37503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_F1CenterButtonShootingMode, PTP_VENDOR_NIKON, 2, N_("Unused")},
37513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_F3PhotoInfoPlayback,PTP_VENDOR_NIKON),/* D083 */
37533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_F5CustomizeCommDials,PTP_VENDOR_NIKON),/* D085 */
37543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_ReverseCommandDial,PTP_VENDOR_NIKON),	/* D086 */
37553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_F6ButtonsAndDials,PTP_VENDOR_NIKON),	/* D089 */
37563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_NoCFCard,PTP_VENDOR_NIKON),		/* D08A */
37573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_AFAreaPoint,PTP_VENDOR_NIKON),	/* D08D */
37583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_ImageCommentEnable,PTP_VENDOR_NIKON),	/* D091 */
37603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_ImageRotation,PTP_VENDOR_NIKON),	/* D092 */
37613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_MovVoice,PTP_VENDOR_NIKON),		/* D0A1 */
37633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_Bracketing,PTP_VENDOR_NIKON),		/* D0C0 */
37653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 0, N_("Unknown")},		/* D0E0 */
37673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 38, "Sigma 70-300mm 1:4-5.6 D APO Macro"},
37683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 83, "AF Nikkor 80-200mm 1:2.8 D ED"},
37693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 118, "AF Nikkor 50mm 1:1.8 D"},
37703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 127, "AF-S Nikkor 18-70mm 1:3.5-4.5G ED DX"},
37713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 139, "AF-S Nikkor 18-200mm 1:3.5-5.6 GED DX VR"},
37723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 147, "AF-S Nikkor 24-70mm 1:2.8G ED DX"},
37733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_LensID, PTP_VENDOR_NIKON, 154, "AF-S Nikkor 18-55mm 1:3.5-F5.6G DX VR"},
37743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 0, "Show ISO sensitivity"},/* 0xD0F0 */
37753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 1, "Show ISO/Easy ISO"},
37763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FinderISODisp, PTP_VENDOR_NIKON, 2, "Show frame count"},
37773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ACPower,PTP_VENDOR_NIKON),		/* D101 */
37793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AFLockStatus,PTP_VENDOR_NIKON),		/* D104 */
37803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AELockStatus,PTP_VENDOR_NIKON),		/* D105 */
37813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FVLockStatus,PTP_VENDOR_NIKON),		/* D106 */
37823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 0, N_("Centre")},	/* D108 */
37843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 1, N_("Top")},
37853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 2, N_("Bottom")},
37863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 3, N_("Left")},
37873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusArea, PTP_VENDOR_NIKON, 4, N_("Right")},
37883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RecordingMedia, PTP_VENDOR_NIKON, 0, N_("Card")},	/* D10B */
37903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RecordingMedia, PTP_VENDOR_NIKON, 1, N_("SDRam")},
37913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_USBSpeed, PTP_VENDOR_NIKON, 0, N_("USB 1.1")},		/* D10C */
37933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_USBSpeed, PTP_VENDOR_NIKON, 1, N_("USB 2.0")},
37943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
37953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CameraOrientation, PTP_VENDOR_NIKON, 0, "0'"},		/* D10E */
37963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CameraOrientation, PTP_VENDOR_NIKON, 1, "270'"},
37973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CameraOrientation, PTP_VENDOR_NIKON, 2, "90'"},
37983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_CameraOrientation, PTP_VENDOR_NIKON, 3, "180'"},
37993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FNumberLock,PTP_VENDOR_NIKON),		/* D110 */
38013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureApertureLock,PTP_VENDOR_NIKON),	/* D111 */
38023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_TVLockSetting,PTP_VENDOR_NIKON),	/* D112 */
38033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_AVLockSetting,PTP_VENDOR_NIKON),	/* D113 */
38043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_IllumSetting,PTP_VENDOR_NIKON,0,N_("LCD Backlight")},	/* D114 */
38063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_IllumSetting,PTP_VENDOR_NIKON,1,N_("LCD Backlight and Info Display")},
38073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExternalFlashAttached,PTP_VENDOR_NIKON),/* D120 */
38093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExternalFlashStatus,PTP_VENDOR_NIKON),	/* D121 */
38103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 0, N_("Normal")},	/* D140 */
38123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 1, N_("Vivid")},
38133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 2, N_("Sharper")},
38143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 3, N_("Softer")},
38153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 4, N_("Direct Print")},
38163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 5, N_("Portrait")},
38173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 6, N_("Landscape")},
38183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_OptimizeImage, PTP_VENDOR_NIKON, 7, N_("Custom")},
38193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Saturation, PTP_VENDOR_NIKON, 0, N_("Normal")},		/* D142 */
38213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Saturation, PTP_VENDOR_NIKON, 1, N_("Moderate")},
38223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_Saturation, PTP_VENDOR_NIKON, 2, N_("Enhanced")},
38233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_BeepOff,PTP_VENDOR_NIKON),		/* D160 */
38253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode, PTP_VENDOR_NIKON, 0, N_("AF-S")},	 	/* D161 */
38273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode, PTP_VENDOR_NIKON, 1, N_("AF-C")},
38283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode, PTP_VENDOR_NIKON, 2, N_("AF-A")},
38293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode, PTP_VENDOR_NIKON, 3, N_("MF (fixed)")},
38303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AutofocusMode, PTP_VENDOR_NIKON, 4, N_("MF (selection)")},
38313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_AFAssist,PTP_VENDOR_NIKON),   	/* D163 */
38333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 0,  "1/125"},		/* D164 */
38353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 1,  "1/60"},
38363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 2,  "1/30"},
38373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 3,  "1/15"},
38383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 4,  "1/8"},
38393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 5,  "1/4"},
38403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 6,  "1/2"},
38413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 7,  "1"},
38423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 8,  "2"},
38433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 9,  "4"},
38443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 10, "8"},
38453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 11, "15"},
38463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_PADVPMode, PTP_VENDOR_NIKON, 12, "30"},
38473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_ImageReview,PTP_VENDOR_NIKON),	/* D165 */
38493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAreaIllumination, PTP_VENDOR_NIKON, 0, N_("Auto")},	/* D166 */
38513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAreaIllumination, PTP_VENDOR_NIKON, 1, N_("Off")},
38523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_AFAreaIllumination, PTP_VENDOR_NIKON, 2, N_("On")},
38533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMode, PTP_VENDOR_NIKON, 0, "iTTL"},			/* D167 */
38553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMode, PTP_VENDOR_NIKON, 1, N_("Manual")},
38563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashMode, PTP_VENDOR_NIKON, 2, N_("Commander")},
38573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommanderMode, PTP_VENDOR_NIKON, 0, N_("TTL")},	/* D168 */
38593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommanderMode, PTP_VENDOR_NIKON, 1, N_("Auto Aperture")},
38603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashCommanderMode, PTP_VENDOR_NIKON, 2, N_("Full Manual")},
38613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_NIKON_FlashSign,PTP_VENDOR_NIKON),		/* D169 */
38633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RemoteTimeout, PTP_VENDOR_NIKON, 0, N_("1 min")},	/* D16B */
38653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RemoteTimeout, PTP_VENDOR_NIKON, 1, N_("5 mins")},
38663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RemoteTimeout, PTP_VENDOR_NIKON, 2, N_("10 mins")},
38673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_RemoteTimeout, PTP_VENDOR_NIKON, 3, N_("15 mins")},
38683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_NIKON_GridDisplay,PTP_VENDOR_NIKON),	/* D16C */
38703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower, PTP_VENDOR_NIKON, 0, N_("Full")},	/* D16D */
38723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower, PTP_VENDOR_NIKON, 1, "1/2"},
38733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower, PTP_VENDOR_NIKON, 2, "1/4"},
38743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower, PTP_VENDOR_NIKON, 3, "1/8"},
38753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeManualPower, PTP_VENDOR_NIKON, 4, "1/16"},
38763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 0, N_("Full")},/* D16E */
38783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 1, "1/2"},
38793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 2, "1/4"},
38803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 3, "1/8"},
38813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 4, "1/16"},
38823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 5, "1/32"},
38833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 6, "1/64"},
38843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_FlashModeCommanderPower, PTP_VENDOR_NIKON, 7, "1/128"},
38853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_CSMMenu,PTP_VENDOR_NIKON),		/* D180 */
38873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_WarningDisplay,PTP_VENDOR_NIKON),	/* D181 */
38883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BatteryCellKind, PTP_VENDOR_NIKON, 0, "LR6 (AA alkaline)"},/* D182 */
38903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BatteryCellKind, PTP_VENDOR_NIKON, 1, "HR6 (AA Ni-Mh)"},
38913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BatteryCellKind, PTP_VENDOR_NIKON, 2, "FR6 (AA Lithium)"},
38923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_BatteryCellKind, PTP_VENDOR_NIKON, 3, "ZR6 (AA Ni-Mn)"},
38933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
38943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit, PTP_VENDOR_NIKON, 0, "400"},		/* D183 */
38953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit, PTP_VENDOR_NIKON, 1, "800"},
38963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit, PTP_VENDOR_NIKON, 2, "1600"},
38973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit, PTP_VENDOR_NIKON, 3, "3200"},
38983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_ISOAutoHiLimit, PTP_VENDOR_NIKON, 4, "Hi 1"},
38993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_InfoDispSetting, PTP_VENDOR_NIKON, 0, N_("Auto")},	/* 0xD187 */
39013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_InfoDispSetting, PTP_VENDOR_NIKON, 1, N_("Dark on light")},
39023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_NIKON_InfoDispSetting, PTP_VENDOR_NIKON, 2, N_("Light on dark")},
39033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_IndicatorDisp,PTP_VENDOR_NIKON),	/* D18D */
39053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_LiveViewStatus,PTP_VENDOR_NIKON),	/* D1A2 */
39073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureDisplayStatus,PTP_VENDOR_NIKON),/* D1B0 */
39093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_InfoDispErrStatus,PTP_VENDOR_NIKON),	/* D1B2 */
39103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_ExposureIndicateLightup,PTP_VENDOR_NIKON),/* D1B3 */
39113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashOpen,PTP_VENDOR_NIKON),		/* D1C0 */
39133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_YN(PTP_DPC_NIKON_FlashCharged,PTP_VENDOR_NIKON),		/* D1C1 */
39143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Canon stuff */
39163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_AssistLight,PTP_VENDOR_CANON),
39173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_RotationScene,PTP_VENDOR_CANON),
39183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_RBOOL(PTP_DPC_CANON_BeepMode,PTP_VENDOR_CANON),
39193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_Beep,PTP_VENDOR_CANON),
39203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 0, "0'"},
39223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 3, "270'"},
39233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_RotationAngle, PTP_VENDOR_CANON, 1, "90'"},
39243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 0, N_("Unknown")},
39263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 1, N_("AC")},
39273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 2, N_("Lithium Ion")},
39283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 3, N_("Nickel hydride")},
39293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 4, N_("Nickel cadmium")},
39303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryKind, PTP_VENDOR_CANON, 5, N_("Alkalium manganese")},
39313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus, PTP_VENDOR_CANON, 0, N_("Undefined")},
39333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus, PTP_VENDOR_CANON, 1, N_("Normal")},
39343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus, PTP_VENDOR_CANON, 2, N_("Warning Level 1")},
39353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus, PTP_VENDOR_CANON, 3, N_("Emergency")},
39363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_BatteryStatus, PTP_VENDOR_CANON, 4, N_("Warning Level 0")},
39373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 0, N_("Undefined")},
39393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 1, N_("Economy")},
39403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 2, N_("Normal")},
39413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 3, N_("Fine")},
39423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 4, N_("Lossless")},
39433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageQuality, PTP_VENDOR_CANON, 5, N_("SuperFine")},
39443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FullViewFileFormat, PTP_VENDOR_CANON, 0, N_("Undefined")},
39463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FullViewFileFormat, PTP_VENDOR_CANON, 1, N_("JPEG")},
39473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FullViewFileFormat, PTP_VENDOR_CANON, 2, N_("CRW")},
39483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize, PTP_VENDOR_CANON, 0, N_("Large")},
39503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize, PTP_VENDOR_CANON, 1, N_("Medium 1")},
39513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize, PTP_VENDOR_CANON, 2, N_("Small")},
39523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize, PTP_VENDOR_CANON, 3, N_("Medium 2")},
39533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageSize, PTP_VENDOR_CANON, 7, N_("Medium 3")},
39543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SelfTime, PTP_VENDOR_CANON, 0,   N_("Not used")},
39563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SelfTime, PTP_VENDOR_CANON, 100, N_("10 seconds")},
39573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SelfTime, PTP_VENDOR_CANON, 20,  N_("2 seconds")},
39583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 0,  N_("Off")},
39603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 1,  N_("Auto")},
39613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 2,  N_("On")},
39623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 3,  N_("Red Eye Suppression")},
39633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 4,  N_("Low Speed Synchronization")},
39643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 5,  N_("Auto + Red Eye Suppression")},
39653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FlashMode, PTP_VENDOR_CANON, 6,  N_("On + Red Eye Suppression")},
39663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 0,  N_("Auto")},
39683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 1,  N_("P")},
39693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 2,  N_("Tv")},
39703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 3,  N_("Av")},
39713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 4,  N_("M")},
39723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 5,  N_("A_DEP")},
39733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 6,  N_("M_DEP")},
39743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ShootingMode, PTP_VENDOR_CANON, 7,  N_("Bulb")},
39753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* more actually */
39763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 0,  N_("Auto")},
39783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 1,  N_("Manual")},
39793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 2,  N_("Distant View")},
39803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 3,  N_("High-Speed Shutter")},
39813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 4,  N_("Low-Speed Shutter")},
39823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 5,  N_("Night View")},
39833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 6,  N_("Grayscale")},
39843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 7,  N_("Sepia")},
39853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 8,  N_("Portrait")},
39863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 9,  N_("Sports")},
39873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 10,  N_("Macro")},
39883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 11,  N_("Monochrome")},
39893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 12,  N_("Pan Focus")},
39903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 13,  N_("Neutral")},
39913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ImageMode, PTP_VENDOR_CANON, 14,  N_("Soft")},
39923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode, PTP_VENDOR_CANON, 0,  N_("Single-Frame Shooting")},
39943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode, PTP_VENDOR_CANON, 1,  N_("Continuous Shooting")},
39953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode, PTP_VENDOR_CANON, 2,  N_("Timer (Single) Shooting")},
39963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode, PTP_VENDOR_CANON, 4,  N_("Continuous Low-speed Shooting")},
39973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_DriveMode, PTP_VENDOR_CANON, 5,  N_("Continuous High-speed Shooting")},
39983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
39993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoom, PTP_VENDOR_CANON, 0,  N_("Off")},
40003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoom, PTP_VENDOR_CANON, 1,  N_("2x")},
40013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoom, PTP_VENDOR_CANON, 2,  N_("4x")},
40023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_EZoom, PTP_VENDOR_CANON, 3,  N_("Smooth")},
40033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 0,  N_("Center-weighted Metering")},
40053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 1,  N_("Spot Metering")},
40063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 2,  N_("Average Metering")},
40073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 3,  N_("Evaluative Metering")},
40083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 4,  N_("Partial Metering")},
40093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 5,  N_("Center-weighted Average Metering")},
40103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 6,  N_("Spot Metering Interlocked with AF Frame")},
40113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MeteringMode, PTP_VENDOR_CANON, 7,  N_("Multi-Spot Metering")},
40123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 0,  N_("Manual")},
40143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 1,  N_("Auto")},
40153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 2,  N_("Unknown")},
40163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 3,  N_("Zone Focus (Close-up)")},
40173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 4,  N_("Zone Focus (Very Close)")},
40183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 5,  N_("Zone Focus (Close)")},
40193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 6,  N_("Zone Focus (Medium)")},
40203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFDistance, PTP_VENDOR_CANON, 7,  N_("Zone Focus (Far)")},
40213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0,  N_("Invalid")},
40233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x1000,  N_("Focusing Point on Center Only, Manual")},
40243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x1001,  N_("Focusing Point on Center Only, Auto")},
40253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x3000,  N_("Multiple Focusing Points (No Specification), Manual")},
40263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x3001,  N_("Multiple Focusing Points, Auto")},
40273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x3002,  N_("Multiple Focusing Points (Right)")},
40283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x3003,  N_("Multiple Focusing Points (Center)")},
40293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_FocusingPoint, PTP_VENDOR_CANON, 0x3004,  N_("Multiple Focusing Points (Left)")},
40303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 0,  N_("Auto")},
40323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 1,  N_("Daylight")},
40333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 2,  N_("Cloudy")},
40343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 3,  N_("Tungsten")},
40353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 4,  N_("Fluorescent")},
40363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 6,  N_("Preset")},
40373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 7,  N_("Fluorescent H")},
40383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 9,  N_("Color Temperature")},
40393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 10,  N_("Custom Whitebalance PC-1")},
40403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 11,  N_("Custom Whitebalance PC-2")},
40413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 12,  N_("Custom Whitebalance PC-3")},
40423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 13,  N_("Missing Number")},
40433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_WhiteBalance, PTP_VENDOR_CANON, 14,  N_("Fluorescent H")}, /* dup? */
40443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SlowShutterSetting, PTP_VENDOR_CANON, 0,  N_("Off")},
40463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SlowShutterSetting, PTP_VENDOR_CANON, 1,  N_("Night View")},
40473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SlowShutterSetting, PTP_VENDOR_CANON, 2,  N_("On")},
40483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_SlowShutterSetting, PTP_VENDOR_CANON, 3,  N_("Low-speed shutter function not available")},
40493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode, PTP_VENDOR_CANON, 0,  N_("Single Shot")},
40513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode, PTP_VENDOR_CANON, 1,  N_("AI Servo")},
40523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode, PTP_VENDOR_CANON, 2,  N_("AI Focus")},
40533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode, PTP_VENDOR_CANON, 3,  N_("Manual")},
40543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_AFMode, PTP_VENDOR_CANON, 4,  N_("Continuous")},
40553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTP_VENDOR_VAL_BOOL(PTP_DPC_CANON_ImageStabilization,PTP_VENDOR_CANON),
40573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast, PTP_VENDOR_CANON, -2,  N_("Low 2")},
40593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast, PTP_VENDOR_CANON, -1,  N_("Low")},
40603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast, PTP_VENDOR_CANON, 0,  N_("Standard")},
40613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast, PTP_VENDOR_CANON, 1,  N_("High")},
40623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Contrast, PTP_VENDOR_CANON, 2,  N_("High 2")},
40633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain, PTP_VENDOR_CANON, -2,  N_("Low 2")},
40653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain, PTP_VENDOR_CANON, -1,  N_("Low")},
40663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain, PTP_VENDOR_CANON, 0,  N_("Standard")},
40673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain, PTP_VENDOR_CANON, 1,  N_("High")},
40683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ColorGain, PTP_VENDOR_CANON, 2,  N_("High 2")},
40693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness, PTP_VENDOR_CANON, -2,  N_("Low 2")},
40713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness, PTP_VENDOR_CANON, -1,  N_("Low")},
40723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness, PTP_VENDOR_CANON, 0,  N_("Standard")},
40733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness, PTP_VENDOR_CANON, 1,  N_("High")},
40743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sharpness, PTP_VENDOR_CANON, 2,  N_("High 2")},
40753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sensitivity, PTP_VENDOR_CANON, 0,  N_("Standard")},
40773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sensitivity, PTP_VENDOR_CANON, 1,  N_("Upper 1")},
40783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_Sensitivity, PTP_VENDOR_CANON, 2,  N_("Upper 2")},
40793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ParameterSet, PTP_VENDOR_CANON, 0x08,  N_("Standard Development Parameters")},
40813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ParameterSet, PTP_VENDOR_CANON, 0x10,  N_("Development Parameters 1")},
40823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ParameterSet, PTP_VENDOR_CANON, 0x20,  N_("Development Parameters 2")},
40833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ParameterSet, PTP_VENDOR_CANON, 0x40,  N_("Development Parameters 3")},
40843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x00,  N_("Auto")},
40863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x28,  "6"},
40873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x30,  "12"},
40883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x38,  "25"},
40893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x40,  "50"},
40903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x43,  "64"},
40913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x48,  "100"},
40923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x50,  "200"},
40933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x58,  "400"},
40943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x60,  "800"},
40953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x68,  "1600"},
40963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x70,  "3200"},
40973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_ISOSpeed, PTP_VENDOR_CANON, 0x78,  "6400"},
40983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
40993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd01d - PTP_DPC_CANON_Aperture */
41003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd01e - PTP_DPC_CANON_ShutterSpeed */
41013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd01f - PTP_DPC_CANON_ExpCompensation */
41023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd020 - PTP_DPC_CANON_FlashCompensation */
41033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd021 - PTP_DPC_CANON_AEBExposureCompensation */
41043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd023 - PTP_DPC_CANON_AvOpen */
41053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* 0xd024 - PTP_DPC_CANON_AvMax */
41063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOutput, PTP_VENDOR_CANON, 0,  N_("Undefined")},
41083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOutput, PTP_VENDOR_CANON, 1,  N_("LCD")},
41093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOutput, PTP_VENDOR_CANON, 2,  N_("Video OUT")},
41103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_CameraOutput, PTP_VENDOR_CANON, 3,  N_("Off")},
41113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MlSpotPos, PTP_VENDOR_CANON, 0, N_("MlSpotPosCenter")},
41133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_MlSpotPos, PTP_VENDOR_CANON, 1, N_("MlSpotPosAfLink")},
41143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 0, N_("Off")},
41163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 1, N_("Vivid")},
41173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 2, N_("Neutral")},
41183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 3, N_("Soft")},
41193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 4, N_("Sepia")},
41203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{PTP_DPC_CANON_PhotoEffect, PTP_VENDOR_CANON, 5, N_("Monochrome")},
41213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		{0, 0, 0, NULL}
41233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	};
41243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0; ptp_value_trans[i].dpc!=0; i++) {
41253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if ((ptp_value_trans[i].dpc == dpc) &&
41263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			(((ptp_value_trans[i].dpc & 0xf000) == 0x5000) ||
41273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		         (ptp_value_trans[i].vendor == params->deviceinfo.VendorExtensionID))
41283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		) {
41293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			double value = _value_to_num(&(dpd->CurrentValue), dpd->DataType);
41303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return snprintf(out, length,
41323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				_(ptp_value_trans[i].format),
41333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				value * ptp_value_trans[i].coef +
41343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_value_trans[i].bias);
41353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
41363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
41373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	kval = _value_to_num(&(dpd->CurrentValue), dpd->DataType);
41393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0; ptp_value_list[i].dpc!=0; i++) {
41403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if ((ptp_value_list[i].dpc == dpc) &&
41413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			(((ptp_value_list[i].dpc & 0xf000) == 0x5000) ||
41423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		          (ptp_value_list[i].vendor == params->deviceinfo.VendorExtensionID)) &&
41433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    (ptp_value_list[i].key==kval)
41443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		) {
41453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return snprintf(out, length, "%s", _(ptp_value_list[i].value));
41463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
41473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
41483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->deviceinfo.VendorExtensionID==PTP_VENDOR_MICROSOFT
41493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    || params->deviceinfo.VendorExtensionID==PTP_VENDOR_MTP) {
41503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		switch (dpc) {
41513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DPC_MTP_SynchronizationPartner:
41523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DPC_MTP_DeviceFriendlyName:
41533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return snprintf(out, length, "%s", dpd->CurrentValue.str);
41543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DPC_MTP_SecureTime:
41553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_DPC_MTP_DeviceCertificate: {
41563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/* FIXME: Convert to use unicode demux functions */
41573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for (i=0;(i<dpd->CurrentValue.a.count) && (i<length);i++)
41583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				out[i] = dpd->CurrentValue.a.v[i].u16;
41593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (	dpd->CurrentValue.a.count &&
41603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				(dpd->CurrentValue.a.count < length)) {
41613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				out[dpd->CurrentValue.a.count-1] = 0;
41623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return dpd->CurrentValue.a.count-1;
41633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			} else {
41643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				out[length-1] = 0;
41653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return length;
41663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
41673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
41683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
41693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		default:
41703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
41713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
41723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
41733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return 0;
41753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
41763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
41773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstruct {
41783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ofc;
41793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	const char *format;
41803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} ptp_ofc_trans[] = {
41813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Undefined,"Undefined Type"},
41823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Defined,"Defined Type"},
41833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Association,"Association/Directory"},
41843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Script,"Script"},
41853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Executable,"Executable"},
41863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_Text,"Text"},
41873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_HTML,"HTML"},
41883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_DPOF,"DPOF"},
41893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_AIFF,"AIFF"},
41903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_WAV,"MS Wave"},
41913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MP3,"MP3"},
41923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_AVI,"MS AVI"},
41933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MPEG,"MPEG"},
41943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_ASF,"ASF"},
41953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_QT,"Apple Quicktime"},
41963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_EXIF_JPEG,"JPEG"},
41973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_TIFF_EP,"TIFF EP"},
41983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_FlashPix,"FlashPix"},
41993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_BMP,"BMP"},
42003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_CIFF,"CIFF"},
42013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_GIF,"GIF"},
42023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_JFIF,"JFIF"},
42033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_PCD,"PCD"},
42043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_PICT,"PICT"},
42053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_PNG,"PNG"},
42063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_TIFF,"TIFF"},
42073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_TIFF_IT,"TIFF_IT"},
42083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_JP2,"JP2"},
42093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_JPX,"JPX"},
42103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_DNG,"DNG"},
42113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
42123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
42133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstruct {
42143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t ofc;
42153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	const char *format;
42163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} ptp_ofc_mtp_trans[] = {
42173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MediaCard,N_("Media Card")},
42183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MediaCardGroup,N_("Media Card Group")},
42193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_Encounter,N_("Encounter")},
42203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_EncounterBox,N_("Encounter Box")},
42213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_M4A,N_("M4A")},
42223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_Firmware,N_("Firmware")},
42233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_WindowsImageFormat,N_("Windows Image Format")},
42243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedAudio,N_("Undefined Audio")},
42253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_WMA,"WMA"},
42263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_OGG,"OGG"},
42273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AAC,"AAC"},
42283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AudibleCodec,N_("Audible.com Codec")},
42293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_FLAC,"FLAC"},
42303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedVideo,N_("Undefined Video")},
42313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_WMV,"WMV"},
42323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MP4,"MP4"},
42333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MP2,"MP2"},
42343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_3GP,"3GP"},
42353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedCollection,N_("Undefined Collection")},
42363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractMultimediaAlbum,N_("Abstract Multimedia Album")},
42373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractImageAlbum,N_("Abstract Image Album")},
42383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractAudioAlbum,N_("Abstract Audio Album")},
42393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractVideoAlbum,N_("Abstract Video Album")},
42403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractAudioVideoPlaylist,N_("Abstract Audio Video Playlist")},
42413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractContactGroup,N_("Abstract Contact Group")},
42423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractMessageFolder,N_("Abstract Message Folder")},
42433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractChapteredProduction,N_("Abstract Chaptered Production")},
42443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractAudioPlaylist,N_("Abstract Audio Playlist")},
42453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractVideoPlaylist,N_("Abstract Video Playlist")},
42463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractMediacast,N_("Abstract Mediacast")},
42473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_WPLPlaylist,N_("WPL Playlist")},
42483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_M3UPlaylist,N_("M3U Playlist")},
42493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MPLPlaylist,N_("MPL Playlist")},
42503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_ASXPlaylist,N_("ASX Playlist")},
42513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_PLSPlaylist,N_("PLS Playlist")},
42523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedDocument,N_("Undefined Document")},
42533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractDocument,N_("Abstract Document")},
42543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_XMLDocument,N_("XMLDocument")},
42553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MSWordDocument,N_("Microsoft Word Document")},
42563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MHTCompiledHTMLDocument,N_("MHT Compiled HTML Document")},
42573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MSExcelSpreadsheetXLS,N_("Microsoft Excel Spreadsheet (.xls)")},
42583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MSPowerpointPresentationPPT,N_("Microsoft Powerpoint (.ppt)")},
42593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedMessage,N_("Undefined Message")},
42603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractMessage,N_("Abstract Message")},
42613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedContact,N_("Undefined Contact")},
42623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractContact,N_("Abstract Contact")},
42633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_vCard2,N_("vCard2")},
42643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_vCard3,N_("vCard3")},
42653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedCalendarItem,N_("Undefined Calendar Item")},
42663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_AbstractCalendarItem,N_("Abstract Calendar Item")},
42673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_vCalendar1,N_("vCalendar1")},
42683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_vCalendar2,N_("vCalendar2")},
42693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_UndefinedWindowsExecutable,N_("Undefined Windows Executable")},
42703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_MediaCast,N_("Media Cast")},
42713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OFC_MTP_Section,N_("Section")},
42723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
42733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
42743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
42753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_render_ofc(PTPParams* params, uint16_t ofc, int spaceleft, char *txt)
42763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
42773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
42783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
42793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!(ofc & 0x8000)) {
42803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0;i<sizeof(ptp_ofc_trans)/sizeof(ptp_ofc_trans[0]);i++)
42813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (ofc == ptp_ofc_trans[i].ofc)
42823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return snprintf(txt, spaceleft, "%s", _(ptp_ofc_trans[i].format));
42833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
42843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		switch (params->deviceinfo.VendorExtensionID) {
42853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_EASTMAN_KODAK:
42863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			switch (ofc) {
42873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OFC_EK_M3U:
42883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return snprintf (txt, spaceleft,"M3U");
42893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			default:
42903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
42913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
42923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
42933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_CANON:
42943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			switch (ofc) {
42953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OFC_CANON_CRW:
42963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return snprintf (txt, spaceleft,"CRW");
42973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			default:
42983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
42993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
43003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
43013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_MICROSOFT:
43023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_MTP:
43033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for (i=0;i<sizeof(ptp_ofc_mtp_trans)/sizeof(ptp_ofc_mtp_trans[0]);i++)
43043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (ofc == ptp_ofc_mtp_trans[i].ofc)
43053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					return snprintf(txt, spaceleft, "%s", _(ptp_ofc_mtp_trans[i].format));
43063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
43073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		default:break;
43083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
43093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
43103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return snprintf (txt, spaceleft,_("Unknown(%04x)"), ofc);
43113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
43123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstruct {
43143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t opcode;
43153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	const char *name;
43163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} ptp_opcode_trans[] = {
43173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_Undefined,N_("Undefined")},
43183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetDeviceInfo,N_("get device info")},
43193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_OpenSession,N_("Open session")},
43203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_CloseSession,N_("Close session")},
43213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetStorageIDs,N_("Get storage IDs")},
43223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetStorageInfo,N_("Get storage info")},
43233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetNumObjects,N_("Get number of objects")},
43243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetObjectHandles,N_("Get object handles")},
43253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetObjectInfo,N_("Get object info")},
43263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetObject,N_("Get object")},
43273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetThumb,N_("Get thumbnail")},
43283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_DeleteObject,N_("Delete object")},
43293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_SendObjectInfo,N_("Send object info")},
43303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_SendObject,N_("Send object")},
43313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_InitiateCapture,N_("Initiate capture")},
43323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_FormatStore,N_("Format storage")},
43333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_ResetDevice,N_("Reset device")},
43343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_SelfTest,N_("Self test device")},
43353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_SetObjectProtection,N_("Set object protection")},
43363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_PowerDown,N_("Power down device")},
43373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetDevicePropDesc,N_("Get device property description")},
43383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetDevicePropValue,N_("Get device property value")},
43393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_SetDevicePropValue,N_("Set device property value")},
43403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_ResetDevicePropValue,N_("Reset device property value")},
43413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_TerminateOpenCapture,N_("Terminate open capture")},
43423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MoveObject,N_("Move object")},
43433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_CopyObject,N_("Copy object")},
43443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_GetPartialObject,N_("Get partial object")},
43453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_InitiateOpenCapture,N_("Initiate open capture")}
43463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
43473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstruct {
43493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t opcode;
43503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	const char *name;
43513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} ptp_opcode_mtp_trans[] = {
43523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetObjectPropsSupported,N_("Get object properties supported")},
43533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetObjectPropDesc,N_("Get object property description")},
43543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetObjectPropValue,N_("Get object property value")},
43553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_SetObjectPropValue,N_("Set object property value")},
43563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetObjPropList,N_("Get object property list")},
43573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_SetObjPropList,N_("Set object property list")},
43583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetInterdependendPropdesc,N_("Get interdependent property description")},
43593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_SendObjectPropList,N_("Send object property list")},
43603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_GetObjectReferences,N_("Get object references")},
43613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_SetObjectReferences,N_("Set object references")},
43623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_UpdateDeviceFirmware,N_("Update device firmware")},
43633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_Skip,N_("Skip to next position in playlist")},
43643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* WMDRMPD Extensions */
43663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetSecureTimeChallenge,N_("Get secure time challenge")},
43673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetSecureTimeResponse,N_("Get secure time response")},
43683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SetLicenseResponse,N_("Set license response")},
43693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetSyncList,N_("Get sync list")},
43703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SendMeterChallengeQuery,N_("Send meter challenge query")},
43713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetMeterChallenge,N_("Get meter challenge")},
43723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SetMeterResponse,N_("Get meter response")},
43733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_CleanDataStore,N_("Clean data store")},
43743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetLicenseState,N_("Get license state")},
43753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SendWMDRMPDCommand,N_("Send WMDRM-PD Command")},
43763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SendWMDRMPDRequest,N_("Send WMDRM-PD Request")},
43773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* WMPPD Extensions */
43793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMPPD_ReportAddedDeletedItems,N_("Report Added/Deleted Items")},
43803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMPPD_ReportAcquiredItems,N_("Report Acquired Items")},
43813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMPPD_PlaylistObjectPref,N_("Get transferable playlist types")},
43823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* WMDRMPD Extensions... these have no identifiers associated with them */
43843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_SendWMDRMPDAppRequest,N_("Send WMDRM-PD Application Request")},
43853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_GetWMDRMPDAppResponse,N_("Get WMDRM-PD Application Response")},
43863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_EnableTrustedFilesOperations,N_("Enable trusted file operations")},
43873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_DisableTrustedFilesOperations,N_("Disable trusted file operations")},
43883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMPD_EndTrustedAppSession,N_("End trusted application session")},
43893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* AAVT Extensions */
43913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_AAVT_OpenMediaSession,N_("Open Media Session")},
43923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_AAVT_CloseMediaSession,N_("Close Media Session")},
43933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_AAVT_GetNextDataBlock,N_("Get Next Data Block")},
43943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_AAVT_SetCurrentTimePosition,N_("Set Current Time Position")},
43953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
43963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* WMDRMND Extensions */
43973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_SendRegistrationRequest,N_("Send Registration Request")},
43983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_GetRegistrationResponse,N_("Get Registration Response")},
43993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_GetProximityChallenge,N_("Get Proximity Challenge")},
44003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_SendProximityResponse,N_("Send Proximity Response")},
44013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_SendWMDRMNDLicenseRequest,N_("Send WMDRM-ND License Request")},
44023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WMDRMND_GetWMDRMNDLicenseResponse,N_("Get WMDRM-ND License Response")},
44033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
44043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* WiFi Provisioning MTP Extension Codes (microsoft.com/WPDWCN: 1.0) */
44053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OC_MTP_WPDWCN_ProcessWFCObject,N_("Process WFC Object")}
44063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
44073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
44083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
44093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_render_opcode(PTPParams* params, uint16_t opcode, int spaceleft, char *txt)
44103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
44113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
44123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
44133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!(opcode & 0x8000)) {
44143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (i=0;i<sizeof(ptp_opcode_trans)/sizeof(ptp_opcode_trans[0]);i++)
44153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if (opcode == ptp_opcode_trans[i].opcode)
44163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				return snprintf(txt, spaceleft, "%s", _(ptp_opcode_trans[i].name));
44173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
44183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		switch (params->deviceinfo.VendorExtensionID) {
44193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_MICROSOFT:
44203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		case PTP_VENDOR_MTP:
44213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			for (i=0;i<sizeof(ptp_opcode_mtp_trans)/sizeof(ptp_opcode_mtp_trans[0]);i++)
44223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (opcode == ptp_opcode_mtp_trans[i].opcode)
44233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					return snprintf(txt, spaceleft, "%s", _(ptp_opcode_mtp_trans[i].name));
44243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
44253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		default:break;
44263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
44273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
44283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return snprintf (txt, spaceleft,_("Unknown (%04x)"), opcode);
44293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
44303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
44313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
44323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstruct {
44333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t id;
44343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	const char *name;
44353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} ptp_opc_trans[] = {
44363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_StorageID,"StorageID"},
44373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ObjectFormat,"ObjectFormat"},
44383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ProtectionStatus,"ProtectionStatus"},
44393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ObjectSize,"ObjectSize"},
44403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AssociationType,"AssociationType"},
44413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AssociationDesc,"AssociationDesc"},
44423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ObjectFileName,"ObjectFileName"},
44433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DateCreated,"DateCreated"},
44443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DateModified,"DateModified"},
44453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Keywords,"Keywords"},
44463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ParentObject,"ParentObject"},
44473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AllowedFolderContents,"AllowedFolderContents"},
44483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Hidden,"Hidden"},
44493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SystemObject,"SystemObject"},
44503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PersistantUniqueObjectIdentifier,"PersistantUniqueObjectIdentifier"},
44513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SyncID,"SyncID"},
44523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PropertyBag,"PropertyBag"},
44533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Name,"Name"},
44543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_CreatedBy,"CreatedBy"},
44553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Artist,"Artist"},
44563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DateAuthored,"DateAuthored"},
44573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Description,"Description"},
44583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_URLReference,"URLReference"},
44593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_LanguageLocale,"LanguageLocale"},
44603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_CopyrightInformation,"CopyrightInformation"},
44613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Source,"Source"},
44623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_OriginLocation,"OriginLocation"},
44633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DateAdded,"DateAdded"},
44643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_NonConsumable,"NonConsumable"},
44653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_CorruptOrUnplayable,"CorruptOrUnplayable"},
44663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ProducerSerialNumber,"ProducerSerialNumber"},
44673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleFormat,"RepresentativeSampleFormat"},
44683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleSize,"RepresentativeSampleSize"},
44693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleHeight,"RepresentativeSampleHeight"},
44703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleWidth,"RepresentativeSampleWidth"},
44713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleDuration,"RepresentativeSampleDuration"},
44723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_RepresentativeSampleData,"RepresentativeSampleData"},
44733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Width,"Width"},
44743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Height,"Height"},
44753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Duration,"Duration"},
44763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Rating,"Rating"},
44773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Track,"Track"},
44783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Genre,"Genre"},
44793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Credits,"Credits"},
44803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Lyrics,"Lyrics"},
44813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SubscriptionContentID,"SubscriptionContentID"},
44823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ProducedBy,"ProducedBy"},
44833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_UseCount,"UseCount"},
44843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SkipCount,"SkipCount"},
44853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_LastAccessed,"LastAccessed"},
44863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ParentalRating,"ParentalRating"},
44873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MetaGenre,"MetaGenre"},
44883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Composer,"Composer"},
44893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EffectiveRating,"EffectiveRating"},
44903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Subtitle,"Subtitle"},
44913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_OriginalReleaseDate,"OriginalReleaseDate"},
44923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AlbumName,"AlbumName"},
44933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AlbumArtist,"AlbumArtist"},
44943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Mood,"Mood"},
44953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DRMStatus,"DRMStatus"},
44963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SubDescription,"SubDescription"},
44973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_IsCropped,"IsCropped"},
44983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_IsColorCorrected,"IsColorCorrected"},
44993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ImageBitDepth,"ImageBitDepth"},
45003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Fnumber,"Fnumber"},
45013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ExposureTime,"ExposureTime"},
45023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ExposureIndex,"ExposureIndex"},
45033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_DisplayName,"DisplayName"},
45043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_BodyText,"BodyText"},
45053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Subject,"Subject"},
45063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Priority,"Priority"},
45073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_GivenName,"GivenName"},
45083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MiddleNames,"MiddleNames"},
45093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_FamilyName,"FamilyName"},
45103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
45113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Prefix,"Prefix"},
45123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Suffix,"Suffix"},
45133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneticGivenName,"PhoneticGivenName"},
45143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneticFamilyName,"PhoneticFamilyName"},
45153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailPrimary,"EmailPrimary"},
45163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailPersonal1,"EmailPersonal1"},
45173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailPersonal2,"EmailPersonal2"},
45183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailBusiness1,"EmailBusiness1"},
45193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailBusiness2,"EmailBusiness2"},
45203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EmailOthers,"EmailOthers"},
45213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberPrimary,"PhoneNumberPrimary"},
45223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberPersonal,"PhoneNumberPersonal"},
45233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberPersonal2,"PhoneNumberPersonal2"},
45243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberBusiness,"PhoneNumberBusiness"},
45253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberBusiness2,"PhoneNumberBusiness2"},
45263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberMobile,"PhoneNumberMobile"},
45273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberMobile2,"PhoneNumberMobile2"},
45283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_FaxNumberPrimary,"FaxNumberPrimary"},
45293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_FaxNumberPersonal,"FaxNumberPersonal"},
45303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_FaxNumberBusiness,"FaxNumberBusiness"},
45313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PagerNumber,"PagerNumber"},
45323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneNumberOthers,"PhoneNumberOthers"},
45333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PrimaryWebAddress,"PrimaryWebAddress"},
45343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PersonalWebAddress,"PersonalWebAddress"},
45353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_BusinessWebAddress,"BusinessWebAddress"},
45363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_InstantMessengerAddress,"InstantMessengerAddress"},
45373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_InstantMessengerAddress2,"InstantMessengerAddress2"},
45383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_InstantMessengerAddress3,"InstantMessengerAddress3"},
45393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFull,"PostalAddressPersonalFull"},
45403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullLine1,"PostalAddressPersonalFullLine1"},
45413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullLine2,"PostalAddressPersonalFullLine2"},
45423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullCity,"PostalAddressPersonalFullCity"},
45433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullRegion,"PostalAddressPersonalFullRegion"},
45443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullPostalCode,"PostalAddressPersonalFullPostalCode"},
45453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressPersonalFullCountry,"PostalAddressPersonalFullCountry"},
45463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessFull,"PostalAddressBusinessFull"},
45473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessLine1,"PostalAddressBusinessLine1"},
45483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessLine2,"PostalAddressBusinessLine2"},
45493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessCity,"PostalAddressBusinessCity"},
45503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessRegion,"PostalAddressBusinessRegion"},
45513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessPostalCode,"PostalAddressBusinessPostalCode"},
45523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressBusinessCountry,"PostalAddressBusinessCountry"},
45533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherFull,"PostalAddressOtherFull"},
45543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherLine1,"PostalAddressOtherLine1"},
45553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherLine2,"PostalAddressOtherLine2"},
45563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherCity,"PostalAddressOtherCity"},
45573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherRegion,"PostalAddressOtherRegion"},
45583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherPostalCode,"PostalAddressOtherPostalCode"},
45593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PostalAddressOtherCountry,"PostalAddressOtherCountry"},
45603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_OrganizationName,"OrganizationName"},
45613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_PhoneticOrganizationName,"PhoneticOrganizationName"},
45623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Role,"Role"},
45633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Birthdate,"Birthdate"},
45643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageTo,"MessageTo"},
45653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageCC,"MessageCC"},
45663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageBCC,"MessageBCC"},
45673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageRead,"MessageRead"},
45683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageReceivedTime,"MessageReceivedTime"},
45693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MessageSender,"MessageSender"},
45703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityBeginTime,"ActivityBeginTime"},
45713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityEndTime,"ActivityEndTime"},
45723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityLocation,"ActivityLocation"},
45733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityRequiredAttendees,"ActivityRequiredAttendees"},
45743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityOptionalAttendees,"ActivityOptionalAttendees"},
45753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityResources,"ActivityResources"},
45763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ActivityAccepted,"ActivityAccepted"},
45773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Owner,"Owner"},
45783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Editor,"Editor"},
45793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_Webmaster,"Webmaster"},
45803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_URLSource,"URLSource"},
45813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_URLDestination,"URLDestination"},
45823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_TimeBookmark,"TimeBookmark"},
45833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ObjectBookmark,"ObjectBookmark"},
45843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ByteBookmark,"ByteBookmark"},
45853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_LastBuildDate,"LastBuildDate"},
45863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_TimetoLive,"TimetoLive"},
45873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_MediaGUID,"MediaGUID"},
45883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_TotalBitRate,"TotalBitRate"},
45893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_BitRateType,"BitRateType"},
45903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_SampleRate,"SampleRate"},
45913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_NumberOfChannels,"NumberOfChannels"},
45923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AudioBitDepth,"AudioBitDepth"},
45933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_ScanDepth,"ScanDepth"},
45943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AudioWAVECodec,"AudioWAVECodec"},
45953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_AudioBitRate,"AudioBitRate"},
45963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_VideoFourCCCodec,"VideoFourCCCodec"},
45973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_VideoBitRate,"VideoBitRate"},
45983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_FramesPerThousandSeconds,"FramesPerThousandSeconds"},
45993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_KeyFrameDistance,"KeyFrameDistance"},
46003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_BufferSize,"BufferSize"},
46013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EncodingQuality,"EncodingQuality"},
46023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_EncodingProfile,"EncodingProfile"},
46033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	{PTP_OPC_BuyFlag,"BuyFlag"},
46043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev};
46053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint
46073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_render_mtp_propname(uint16_t propid, int spaceleft, char *txt) {
46083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
46093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<sizeof(ptp_opc_trans)/sizeof(ptp_opc_trans[0]);i++)
46103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (propid == ptp_opc_trans[i].id)
46113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return snprintf(txt, spaceleft, "%s", ptp_opc_trans[i].name);
46123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return snprintf (txt, spaceleft,"unknown(%04x)", propid);
46133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
46143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/*
46163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Allocate and default-initialize a few object properties.
46173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
46183aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevMTPProperties *
46193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_get_new_object_prop_entry(MTPProperties **props, int *nrofprops) {
46203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	MTPProperties *newprops;
46213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	MTPProperties *prop;
46223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (*props == NULL) {
46243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		newprops = malloc(sizeof(MTPProperties)*(*nrofprops+1));
46253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
46263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		newprops = realloc(*props,sizeof(MTPProperties)*(*nrofprops+1));
46273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
46283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (newprops == NULL)
46293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return NULL;
46303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop = &newprops[*nrofprops];
46313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop->property = PTP_OPC_StorageID; /* Should be "unknown" */
46323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop->datatype = PTP_DTC_UNDEF;
46333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop->ObjectHandle = 0x00000000U;
46343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop->propval.str = NULL;
46353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	(*props) = newprops;
46373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	(*nrofprops)++;
46383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return prop;
46393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
46403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
46423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_destroy_object_prop(MTPProperties *prop)
46433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
46443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if (!prop)
46453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    return;
46463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if (prop->datatype == PTP_DTC_STR && prop->propval.str != NULL)
46483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    free(prop->propval.str);
46493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  else if ((prop->datatype == PTP_DTC_AINT8 || prop->datatype == PTP_DTC_AINT16 ||
46503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev            prop->datatype == PTP_DTC_AINT32 || prop->datatype == PTP_DTC_AINT64 || prop->datatype == PTP_DTC_AINT128 ||
46513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev            prop->datatype == PTP_DTC_AUINT8 || prop->datatype == PTP_DTC_AUINT16 ||
46523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev            prop->datatype == PTP_DTC_AUINT32 || prop->datatype == PTP_DTC_AUINT64 || prop->datatype ==  PTP_DTC_AUINT128)
46533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev            && prop->propval.a.v != NULL)
46543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    free(prop->propval.a.v);
46553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
46563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
46583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_destroy_object_prop_list(MTPProperties *props, int nrofprops)
46593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
46603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  int i;
46613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  MTPProperties *prop = props;
46623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  for (i=0;i<nrofprops;i++,prop++)
46643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    ptp_destroy_object_prop(prop);
46653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  free(props);
46663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
46673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/*
46693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Find a certain object property in the cache, i.e. a certain metadata
46703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * item for a certain object handle.
46713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
46723aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevMTPProperties *
46733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_find_object_prop_in_cache(PTPParams *params, uint32_t const handle, uint32_t const attribute_id)
46743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
46753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int	i;
46763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	MTPProperties	*prop;
46773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject	*ob;
46783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
46793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_object_find (params, handle, &ob);
46813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
46823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return NULL;
46833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	prop = ob->mtpprops;
46843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	for (i=0;i<ob->nrofmtpprops;i++) {
46853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (attribute_id == prop->property)
46863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return prop;
46873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		prop++;
46883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
46893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return NULL;
46903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
46913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
46933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_remove_object_from_cache(PTPParams *params, uint32_t handle)
46943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
46953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int i;
46963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject	*ob;
46973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
46983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
46993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_object_find (params, handle, &ob);
47003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
47013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return;
47023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	i = ob-params->objects;
47033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* remove object from object info cache */
47043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_free_object (ob);
47053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (i < params->nrofobjects-1)
47073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		memmove (ob,ob+1,(params->nrofobjects-1-i)*sizeof(PTPObject));
47083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->nrofobjects--;
47093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* We use less memory than before so this shouldn't fail */
47103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->objects = realloc(params->objects, sizeof(PTPObject)*params->nrofobjects);
47113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
47123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic int _cmp_ob (const void *a, const void *b) {
47143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject *oa = (PTPObject*)a;
47153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject *ob = (PTPObject*)b;
47163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return oa->oid - ob->oid;
47183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
47193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid
47213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_objects_sort (PTPParams *params) {
47223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	qsort (params->objects, params->nrofobjects, sizeof(PTPObject), _cmp_ob);
47233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
47243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Binary search in objects. Needs "objects" to be a sorted by objectid list!  */
47263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
47273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_object_find (PTPParams *params, uint32_t handle, PTPObject **retob) {
47283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject	tmpob;
47293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	tmpob.oid = handle;
47313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*retob = bsearch (&tmpob, params->objects, params->nrofobjects, sizeof(tmpob), _cmp_ob);
47323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!*retob)
47333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
47343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
47353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
47363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* Binary search in objects + insert of not found. Needs "objects" to be a sorted by objectid list!  */
47383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
47393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_object_find_or_insert (PTPParams *params, uint32_t handle, PTPObject **retob) {
47403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int 		begin, end, cursor;
47413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	int		insertat;
47423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject	*newobs;
47433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!handle) return PTP_RC_GeneralError;
47453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*retob = NULL;
47463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!params->nrofobjects) {
47473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->objects = calloc(1,sizeof(PTPObject));
47483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->nrofobjects = 1;
47493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		params->objects[0].oid = handle;
47503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*retob = &params->objects[0];
47513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
47523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
47533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	begin = 0;
47543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	end = params->nrofobjects-1;
47553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/*ptp_debug (params, "searching %08x, total=%d", handle, params->nrofobjects);*/
47563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	while (1) {
47573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		cursor = (end-begin)/2+begin;
47583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/*ptp_debug (params, "ob %d: %08x [%d-%d]", cursor, params->objects[cursor].oid, begin, end);*/
47593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->objects[cursor].oid == handle) {
47603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			*retob = &params->objects[cursor];
47613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return PTP_RC_OK;
47623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
47633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->objects[cursor].oid < handle)
47643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			begin = cursor;
47653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		else
47663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			end = cursor;
47673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if ((end - begin) <= 1)
47683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			break;
47693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
47703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->objects[begin].oid == handle) {
47713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*retob = &params->objects[begin];
47723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
47733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
47743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (params->objects[end].oid == handle) {
47753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		*retob = &params->objects[end];
47763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
47773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
47783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((begin == 0) && (handle < params->objects[0].oid)) {
47793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		insertat=begin;
47803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	} else {
47813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if ((end == params->nrofobjects-1) && (handle > params->objects[end].oid))
47823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			insertat=end+1;
47833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		else
47843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			insertat=begin+1;
47853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
47863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/*ptp_debug (params, "inserting oid %x at [%x,%x], begin=%d, end=%d, insertat=%d\n", handle, params->objects[begin].oid, params->objects[end].oid, begin, end, insertat);*/
47873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	newobs = realloc (params->objects, sizeof(PTPObject)*(params->nrofobjects+1));
47883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!newobs) return PTP_RC_GeneralError;
47893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->objects = newobs;
47903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (insertat<=params->nrofobjects)
47913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		memmove (&params->objects[insertat+1],&params->objects[insertat],(params->nrofobjects-insertat)*sizeof(PTPObject));
47923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	memset(&params->objects[insertat],0,sizeof(PTPObject));
47933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->objects[insertat].oid = handle;
47943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*retob = &params->objects[insertat];
47953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	params->nrofobjects++;
47963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_OK;
47973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
47983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
47993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
48003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_object_want (PTPParams *params, uint32_t handle, int want, PTPObject **retob) {
48013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	uint16_t	ret;
48023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject	*ob;
48033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	//Camera 		*camera = ((PTPData *)params->data)->camera;
48043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*retob = NULL;
48063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (!handle) {
48073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_debug (params, "ptp_object_want: querying handle 0?\n");
48083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
48093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
48103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ret = ptp_object_find_or_insert (params, handle, &ob);
48113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (ret != PTP_RC_OK)
48123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_GeneralError;
48133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	*retob = ob;
48143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	/* Do we have all of it already? */
48153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((ob->flags & want) == want)
48163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
48173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#define X (PTPOBJECT_OBJECTINFO_LOADED|PTPOBJECT_STORAGEID_LOADED|PTPOBJECT_PARENTOBJECT_LOADED)
48193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((want & X) && ((ob->flags & X) != X)) {
48203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		uint32_t	saveparent = 0;
48213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* One EOS issue, where getobjecthandles(root) returns obs without root flag. */
48233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED)
48243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			saveparent = ob->oi.ParentObject;
48253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ret = ptp_getobjectinfo (params, handle, &ob->oi);
48273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ret != PTP_RC_OK)
48283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			return ret;
48293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (!ob->oi.Filename) ob->oi.Filename=strdup("<none>");
48303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ob->flags & PTPOBJECT_PARENTOBJECT_LOADED)
48313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ob->oi.ParentObject = saveparent;
48323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Second EOS issue, 0x20000000 has 0x20000000 as parent */
48343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ob->oi.ParentObject == handle)
48353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			ob->oi.ParentObject = 0;
48363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ob->flags |= X;
48373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* EOS bug, DCIM links back to itself. */
48393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
48403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#undef X
48413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if (	(want & PTPOBJECT_MTPPROPLIST_LOADED) &&
48423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		(!(ob->flags & PTPOBJECT_MTPPROPLIST_LOADED))
48433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	) {
48443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int		nrofprops = 0;
48453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		MTPProperties 	*props = NULL;
48463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (params->device_flags & DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST) {
48483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			want &= ~PTPOBJECT_MTPPROPLIST_LOADED;
48493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			goto fallback;
48503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
48513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* Microsoft/MTP has fast directory retrieval. */
48533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (!ptp_operation_issupported(params,PTP_OC_MTP_GetObjPropList)) {
48543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			want &= ~PTPOBJECT_MTPPROPLIST_LOADED;
48553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			goto fallback;
48563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
48573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ptp_debug (params, "ptp2/mtpfast: reading mtp proplist of %08x", handle);
48593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ret = ptp_mtp_getobjectproplist (params, handle, &props, &nrofprops);
48603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (ret != PTP_RC_OK)
48613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			goto fallback;
48623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ob->mtpprops = props;
48633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ob->nrofmtpprops = nrofprops;
48643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#if 0
48663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		MTPProperties 	*xpl;
48673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		int j;
48683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		PTPObjectInfo	oinfo;
48693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
48703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		memset (&oinfo,0,sizeof(oinfo));
48713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		/* hmm, not necessary ... only if we would use it */
48723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		for (j=0;j<nrofprops;j++) {
48733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			xpl = &props[j];
48743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			switch (xpl->property) {
48753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_ParentObject:
48763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_UINT32) {
48773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: parentobject has type 0x%x???", xpl->datatype);
48783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
48793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
48803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.ParentObject = xpl->propval.u32;
48813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: parent 0x%x", xpl->propval.u32);
48823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
48833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_ObjectFormat:
48843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_UINT16) {
48853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: objectformat has type 0x%x???", xpl->datatype);
48863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
48873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
48883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.ObjectFormat = xpl->propval.u16;
48893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: ofc 0x%x", xpl->propval.u16);
48903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
48913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_ObjectSize:
48923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				switch (xpl->datatype) {
48933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				case PTP_DTC_UINT32:
48943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					oinfo.ObjectCompressedSize = xpl->propval.u32;
48953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
48963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				case PTP_DTC_UINT64:
48973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					oinfo.ObjectCompressedSize = xpl->propval.u64;
48983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
48993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				default:
49003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: objectsize has type 0x%x???", xpl->datatype);
49013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: objectsize %u", xpl->propval.u32);
49043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_StorageID:
49063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_UINT32) {
49073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: storageid has type 0x%x???", xpl->datatype);
49083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.StorageID = xpl->propval.u32;
49113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: storageid 0x%x", xpl->propval.u32);
49123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_ProtectionStatus:/*UINT16*/
49143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_UINT16) {
49153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: protectionstatus has type 0x%x???", xpl->datatype);
49163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.ProtectionStatus = xpl->propval.u16;
49193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: protection 0x%x", xpl->propval.u16);
49203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_ObjectFileName:
49223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_STR) {
49233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: filename has type 0x%x???", xpl->datatype);
49243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->propval.str) {
49273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: filename %s", xpl->propval.str);
49283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					oinfo.Filename = strdup(xpl->propval.str);
49293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				} else {
49303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					oinfo.Filename = NULL;
49313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_DateCreated:
49343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_STR) {
49353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: datecreated has type 0x%x???", xpl->datatype);
49363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: capturedate %s", xpl->propval.str);
49393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.CaptureDate = ptp_unpack_PTPTIME (xpl->propval.str);
49403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			case PTP_OPC_DateModified:
49423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if (xpl->datatype != PTP_DTC_STR) {
49433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast: datemodified has type 0x%x???", xpl->datatype);
49443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					break;
49453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				}
49463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				ptp_debug (params, "ptp2/mtpfast: moddate %s", xpl->propval.str);
49473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				oinfo.ModificationDate = ptp_unpack_PTPTIME (xpl->propval.str);
49483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			default:
49503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				if ((xpl->property & 0xfff0) == 0xdc00)
49513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev					ptp_debug (params, "ptp2/mtpfast:case %x type %x unhandled", xpl->property, xpl->datatype);
49523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev				break;
49533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			}
49543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		}
49553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if (!oinfo.Filename)
49563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			/* i have one such file on my Creative */
49573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			oinfo.Filename = strdup("<null>");
49583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif
49593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		ob->flags |= PTPOBJECT_MTPPROPLIST_LOADED;
49603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfallback:	;
49613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	}
49623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if ((ob->flags & want) == want)
49633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		return PTP_RC_OK;
49643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	ptp_debug (params, "ptp_object_want: oid 0x%08x, want flags %x, have only %x?", handle, want, ob->flags);
49653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return PTP_RC_GeneralError;
49663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
49673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
49683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
49693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevuint16_t
49703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevptp_add_object_to_cache(PTPParams *params, uint32_t handle)
49713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
49723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	PTPObject *ob;
49733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	return ptp_object_want (params, handle, PTPOBJECT_OBJECTINFO_LOADED|PTPOBJECT_MTPPROPLIST_LOADED, &ob);
49743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
4975