/**
 * \file libmtp.h
 *
 * Interface to the Media Transfer Protocol library.
 *
 * <code>
 * #include <libmtp.h>
 * </code>
 */
#ifndef LIBMTP_H_INCLUSION_GUARD
#define LIBMTP_H_INCLUSION_GUARD

#define LIBMTP_VERSION @VERSION@

/* This handles MSVC pecularities */
#ifdef _MSC_VER
#include <windows.h>
#define __WIN32__
#define snprintf _snprintf
#define ssize_t SSIZE_T
#endif

#include <stdio.h>
#include <usb.h>
#include <sys/types.h>
#include "ptp.h"

#ifdef __WIN32__
/*
 * Windows specific code, types that do not exist in Windows
 * sys/types.h
 */
typedef char int8_t;
typedef unsigned char uint8_t;
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
#endif

/**
 * @defgroup types libnjb global type definitions
 * @{
 */
typedef enum {
  LIBMTP_CODEC_WAV,
  LIBMTP_CODEC_MP3,
  LIBMTP_CODEC_WMA,
  LIBMTP_CODEC_UNKNOWN
} LIBMTP_codec_t;
typedef struct LIBMTP_mtpdevice_struct LIBMTP_mtpdevice_t; /**< @see LIBMTP_mtpdevice_struct */
typedef struct LIBMTP_track_struct LIBMTP_track_t; /**< @see LIBMTP_mtptrack_t */
/** @} */

/**
 * Internal USB struct (TODO: discard for device struct?)
 */
typedef struct _PTP_USB PTP_USB;
struct _PTP_USB {
	usb_dev_handle* handle;
	int inep;
	int outep;
	int intep;
};

/**
 * Main MTP device object struct
 */
struct LIBMTP_mtpdevice_struct {
  uint8_t interface_number;      /**< Interface number of this device */
  PTPParams *params;             /**< Parameters for this device */
  PTP_USB *ptp_usb;              /**< USB device for this device */
  unsigned storage_id;           /**< The storage ID for this device */
  uint8_t maximum_battery_level; /**< The maximum battery level for this device */
};

/**
 * MTP track struct
 */
struct LIBMTP_track_struct {
  uint32_t item_id; /**< Unique item ID */
  char *title; /**< Track title */
  char *artist; /**< Name of recording artist */
  char *genre; /**< Genre name for track */
  char *album; /**< Album name for track */
  char *date; /**< Date of original recording as a string */
  char *filename; /**< Original filename of this track */
  uint16_t tracknumber; /**< Track number (in sequence on recording) */
  uint32_t duration; /**< Duration in milliseconds */
  uint64_t filesize; /**< Size of track file in bytes */
  LIBMTP_codec_t codec; /**< Codec used for the current track */
  LIBMTP_track_t *next; /**< Next track in list or NULL if last track */
};

/* Make functions available for C++ */
#ifdef __cplusplus
extern "C" {
#endif

/** 
 * The callback type definition. Notice that a progress percentage ratio
 * is easy to calculate by dividing <code>sent</code> by 
 * <code>total</code>.
 * @param sent the number of bytes sent so far
 * @param total the total number of bytes to send
 * @param buf intermediate buffer
 * @param len intermediate buffer length
 * @param data a user-defined dereferencable pointer
 * @return if anything else than 0 is returned, the current transfer will be
 *         interrupted.
 */
typedef int LIBMTP_progressfunc_t (uint64_t const sent, uint64_t const total,
                uint8_t const * const buf, uint32_t const len, void const * const data);

/**
 * @defgroup internals The libmtp internal state manipulation API.
 * @{
 */
void LIBMTP_Init(void);
/**
 * @}
 * @defgroup basic The basic device management API.
 * @{
 */
LIBMTP_mtpdevice_t *LIBMTP_Get_First_Device(void);
void LIBMTP_Release_Device(LIBMTP_mtpdevice_t*);
char *LIBMTP_Get_Ownername(LIBMTP_mtpdevice_t*);
int LIBMTP_Get_Storageinfo(LIBMTP_mtpdevice_t *, uint64_t * const, 
			uint64_t * const, char ** const storage_description, 
			char ** const volume_label);
int LIBMTP_Get_Batterylevel(LIBMTP_mtpdevice_t *, 
			    uint8_t * const, 
			    uint8_t * const);
/**
 * @}
 * @defgroup tracks The track management API.
 * @{
 */
LIBMTP_track_t *LIBMTP_new_track_t(void);
void LIBMTP_destroy_track_t(LIBMTP_track_t*);
LIBMTP_track_t *LIBMTP_Get_Tracklisting(LIBMTP_mtpdevice_t*);
int LIBMTP_Get_Track_To_File(LIBMTP_mtpdevice_t*, uint32_t, char const * const, 
			LIBMTP_progressfunc_t const * const, void const * const);
int LIBMTP_Get_Track_To_File_Descriptor(LIBMTP_mtpdevice_t*, uint32_t const, int const, 
			LIBMTP_progressfunc_t const * const, void const * const);
int LIBMTP_Send_Track_From_File(LIBMTP_mtpdevice_t *, 
			 char const * const, LIBMTP_track_t * const,
                         LIBMTP_progressfunc_t const * const,
			 void const * const);
int LIBMTP_Send_Track_From_File_Descriptor(LIBMTP_mtpdevice_t *, 
			 int const, LIBMTP_track_t * const,
                         LIBMTP_progressfunc_t const * const,
			 void const * const);
int LIBMTP_Update_Track_Metadata(LIBMTP_mtpdevice_t *, 
			LIBMTP_track_t const * const);
int LIBMTP_Delete_Track(LIBMTP_mtpdevice_t *, uint32_t);
/** @} */
/* End of C++ exports */
#ifdef __cplusplus
}
#endif

#endif /* LIBMTP_H_INCLUSION_GUARD */

