{-# LINE 1 "MTP/Foreign.hsc" #-}
{-# LANGUAGE CPP, ForeignFunctionInterface, EmptyDataDecls #-}
{-# LINE 2 "MTP/Foreign.hsc" #-}

-- |
-- Module      : MTP.Foreign
-- Copyright   : (c) Joachim Fasting 2010
-- License     : LGPL
--
-- Maintainer  : Joachim Fasting <joachim.fasting@gmail.com>
-- Stability   : unstable
-- Portability : not portable
--
-- Bindings to libmtp. Foreign interface.

module MTP.Foreign where

import Foreign
import Foreign.C


{-# LINE 20 "MTP/Foreign.hsc" #-}


{-# LINE 22 "MTP/Foreign.hsc" #-}

------------------------------------------------------------------------------
-- Constants
------------------------------------------------------------------------------

-- | MTP library version.
version :: Integer
version = 134533045
{-# LINE 30 "MTP/Foreign.hsc" #-}

------------------------------------------------------------------------------
-- Types
------------------------------------------------------------------------------

-- | Filetype enumeration.
newtype FileType = FileType { unFileType :: CInt }
    deriving (Eq, Ord, Show)

wav  :: FileType
wav  = FileType 0
mp3  :: FileType
mp3  = FileType 1
wma  :: FileType
wma  = FileType 2
ogg  :: FileType
ogg  = FileType 3
audible  :: FileType
audible  = FileType 4
mp4  :: FileType
mp4  = FileType 5
undef_audio  :: FileType
undef_audio  = FileType 6
wmv  :: FileType
wmv  = FileType 7
avi  :: FileType
avi  = FileType 8
mpeg  :: FileType
mpeg  = FileType 9
asf  :: FileType
asf  = FileType 10
qt  :: FileType
qt  = FileType 11
undef_video  :: FileType
undef_video  = FileType 12
jpeg  :: FileType
jpeg  = FileType 13
jfif  :: FileType
jfif  = FileType 14
tiff  :: FileType
tiff  = FileType 15
bmp  :: FileType
bmp  = FileType 16
gif  :: FileType
gif  = FileType 17
pict  :: FileType
pict  = FileType 18
png  :: FileType
png  = FileType 19
vcalendar1  :: FileType
vcalendar1  = FileType 20
vcalendar2  :: FileType
vcalendar2  = FileType 21
vcard2  :: FileType
vcard2  = FileType 22
vcard3  :: FileType
vcard3  = FileType 23
windowsimageformat  :: FileType
windowsimageformat  = FileType 24
winexec  :: FileType
winexec  = FileType 25
text  :: FileType
text  = FileType 26
html  :: FileType
html  = FileType 27
firmware  :: FileType
firmware  = FileType 28
aac  :: FileType
aac  = FileType 29
mediacard  :: FileType
mediacard  = FileType 30
flac  :: FileType
flac  = FileType 31
mp2  :: FileType
mp2  = FileType 32
m4a  :: FileType
m4a  = FileType 33
doc  :: FileType
doc  = FileType 34
xml  :: FileType
xml  = FileType 35
xls  :: FileType
xls  = FileType 36
ppt  :: FileType
ppt  = FileType 37
mht  :: FileType
mht  = FileType 38
jp2  :: FileType
jp2  = FileType 39
jpx  :: FileType
jpx  = FileType 40
album  :: FileType
album  = FileType 41
playlist  :: FileType
playlist  = FileType 42
unknown  :: FileType
unknown  = FileType 43

{-# LINE 85 "MTP/Foreign.hsc" #-}

-- Error code enumeration.
newtype ErrorCode = ErrorCode { unErrorCode :: CInt }
    deriving (Eq, Show)

general  :: ErrorCode
general  = ErrorCode 1
noDevice  :: ErrorCode
noDevice  = ErrorCode 5
storageFull  :: ErrorCode
storageFull  = ErrorCode 6
connectionFailed  :: ErrorCode
connectionFailed  = ErrorCode 7
cancelled  :: ErrorCode
cancelled  = ErrorCode 8

{-# LINE 97 "MTP/Foreign.hsc" #-}

-- Opaque types, only passed around between C funcs, but never
-- dereferenced on the Haskell side.
data MTPDevice
data Data
data Callback

-- An intermediate structure for the LIBMTP_error_t struct.
data Error_t = Error_t
    { et_errornumber :: CInt
    , et_errortext :: CString
    , et_next :: Ptr Error_t
    }

instance Storable Error_t where
    sizeOf _ = (12)
{-# LINE 113 "MTP/Foreign.hsc" #-}
    alignment _ = 4
{-# LINE 114 "MTP/Foreign.hsc" #-}
    peek ptr = do
        en <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 116 "MTP/Foreign.hsc" #-}
        et <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 117 "MTP/Foreign.hsc" #-}
        next <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 118 "MTP/Foreign.hsc" #-}
        return $! Error_t { et_errornumber = en
                          , et_errortext = et
                          , et_next = next
                          }

-- An intermediate structure for the LIBMTP_file_t struct.
-- We need this because LIBMPT_file_t is recursive.
data File_t = File_t
    { ft_item_id :: CInt
    , ft_parent_id :: CInt
    , ft_storage_id :: CInt
    , ft_filename :: CString
    , ft_filesize :: CInt
    , ft_filetype :: CInt
    , ft_next :: Ptr File_t
    }

instance Storable File_t where
    sizeOf _ = (36)
{-# LINE 137 "MTP/Foreign.hsc" #-}
    alignment _ = 4
{-# LINE 138 "MTP/Foreign.hsc" #-}
    peek ptr = do
        fid  <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 140 "MTP/Foreign.hsc" #-}
        pid  <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 141 "MTP/Foreign.hsc" #-}
        sid  <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 142 "MTP/Foreign.hsc" #-}
        name <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 143 "MTP/Foreign.hsc" #-}
        size <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 144 "MTP/Foreign.hsc" #-}
        typ  <- (\hsc_ptr -> peekByteOff hsc_ptr 28) ptr
{-# LINE 145 "MTP/Foreign.hsc" #-}
        next <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 146 "MTP/Foreign.hsc" #-}
        return $! File_t fid pid sid name size typ next
    poke ptr ft = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (ft_item_id ft)
{-# LINE 149 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (ft_parent_id ft)
{-# LINE 150 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (ft_filename ft)
{-# LINE 151 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (ft_filesize ft)
{-# LINE 152 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr (ft_next ft)
{-# LINE 153 "MTP/Foreign.hsc" #-}

-- An intermediate structure for the LIBMTP_track_t struct.
-- We need this because LIBMTP_track_t is recursive.
data Track_t = Track_t
    { tt_item_id :: CInt
    , tt_parent_id :: CInt
    , tt_storage_id :: CInt
    , tt_title :: CString
    , tt_artist :: CString
    , tt_composer :: CString
    , tt_genre :: CString
    , tt_album :: CString
    , tt_date :: CString
    , tt_filename :: CString
    , tt_tracknumber :: CInt
    , tt_duration :: CInt
    , tt_samplerate :: CInt
    , tt_nochannels :: CInt
    , tt_wavecodec :: CInt
    , tt_bitrate :: CInt
    , tt_bitratetype :: CInt
    , tt_rating :: CInt
    , tt_usecount :: CInt
    , tt_filesize :: CInt
    , tt_filetype :: CInt
    , tt_next :: Ptr Track_t
    }

instance Storable Track_t where
    sizeOf _ = (92)
{-# LINE 183 "MTP/Foreign.hsc" #-}
    alignment _ = 4
{-# LINE 184 "MTP/Foreign.hsc" #-}
    peek ptr = do
        iid <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 186 "MTP/Foreign.hsc" #-}
        pid <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 187 "MTP/Foreign.hsc" #-}
        sid <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 188 "MTP/Foreign.hsc" #-}
        title <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 189 "MTP/Foreign.hsc" #-}
        artist <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 190 "MTP/Foreign.hsc" #-}
        composer <- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 191 "MTP/Foreign.hsc" #-}
        genre <- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 192 "MTP/Foreign.hsc" #-}
        alb <- (\hsc_ptr -> peekByteOff hsc_ptr 28) ptr
{-# LINE 193 "MTP/Foreign.hsc" #-}
        date <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 194 "MTP/Foreign.hsc" #-}
        fname <- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 195 "MTP/Foreign.hsc" #-}
        trackno <- (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 196 "MTP/Foreign.hsc" #-}
        dur <- (\hsc_ptr -> peekByteOff hsc_ptr 44) ptr
{-# LINE 197 "MTP/Foreign.hsc" #-}
        srate <- (\hsc_ptr -> peekByteOff hsc_ptr 48) ptr
{-# LINE 198 "MTP/Foreign.hsc" #-}
        chans <- (\hsc_ptr -> peekByteOff hsc_ptr 52) ptr
{-# LINE 199 "MTP/Foreign.hsc" #-}
        codec <- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr
{-# LINE 200 "MTP/Foreign.hsc" #-}
        brate <- (\hsc_ptr -> peekByteOff hsc_ptr 60) ptr
{-# LINE 201 "MTP/Foreign.hsc" #-}
        bratetype <- (\hsc_ptr -> peekByteOff hsc_ptr 64) ptr
{-# LINE 202 "MTP/Foreign.hsc" #-}
        rating <- (\hsc_ptr -> peekByteOff hsc_ptr 66) ptr
{-# LINE 203 "MTP/Foreign.hsc" #-}
        count <- (\hsc_ptr -> peekByteOff hsc_ptr 68) ptr
{-# LINE 204 "MTP/Foreign.hsc" #-}
        fsize <- (\hsc_ptr -> peekByteOff hsc_ptr 72) ptr
{-# LINE 205 "MTP/Foreign.hsc" #-}
        ftype <- (\hsc_ptr -> peekByteOff hsc_ptr 84) ptr
{-# LINE 206 "MTP/Foreign.hsc" #-}
        next <- (\hsc_ptr -> peekByteOff hsc_ptr 88) ptr
{-# LINE 207 "MTP/Foreign.hsc" #-}
        return $! Track_t iid pid sid title artist composer genre alb
                          date fname trackno dur srate chans codec brate
                          bratetype rating count fsize ftype next
    poke ptr tt = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (tt_item_id tt)
{-# LINE 212 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (tt_parent_id tt)
{-# LINE 213 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (tt_storage_id tt)
{-# LINE 214 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (tt_title tt)
{-# LINE 215 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (tt_artist tt)
{-# LINE 216 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 20) ptr (tt_composer tt)
{-# LINE 217 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr (tt_genre tt)
{-# LINE 218 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 28) ptr (tt_album tt)
{-# LINE 219 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr (tt_date tt)
{-# LINE 220 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 36) ptr (tt_filename tt)
{-# LINE 221 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) ptr (tt_tracknumber tt)
{-# LINE 222 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 44) ptr (tt_duration tt)
{-# LINE 223 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) ptr (tt_samplerate tt)
{-# LINE 224 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 52) ptr (tt_nochannels tt)
{-# LINE 225 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) ptr (tt_wavecodec tt)
{-# LINE 226 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 60) ptr (tt_bitrate tt)
{-# LINE 227 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) ptr (tt_bitratetype tt)
{-# LINE 228 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 66) ptr (tt_rating tt)
{-# LINE 229 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 68) ptr (tt_usecount tt)
{-# LINE 230 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 72) ptr (tt_filesize tt)
{-# LINE 231 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 84) ptr (tt_filetype tt)
{-# LINE 232 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 88) ptr (tt_next tt)
{-# LINE 233 "MTP/Foreign.hsc" #-}

-- An intermediate structure for the LIBMTP_folder_t struct.
-- We need this because LIBMTP_folder_t is recursive.
data Folder_t = Folder_t
    { fdt_folder_id :: CInt
    , fdt_parent_id :: CInt
    , fdt_storage_id :: CInt
    , fdt_name :: CString
    , fdt_sibling :: Ptr Folder_t
    , fdt_child :: Ptr Folder_t
    }

instance Storable Folder_t where
    sizeOf _ = (24)
{-# LINE 247 "MTP/Foreign.hsc" #-}
    alignment _ = 4
{-# LINE 248 "MTP/Foreign.hsc" #-}
    peek ptr = do
        fid <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 250 "MTP/Foreign.hsc" #-}
        pid <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 251 "MTP/Foreign.hsc" #-}
        sid <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 252 "MTP/Foreign.hsc" #-}
        name <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 253 "MTP/Foreign.hsc" #-}
        sibling <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 254 "MTP/Foreign.hsc" #-}
        child <- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 255 "MTP/Foreign.hsc" #-}
        return $! Folder_t { fdt_folder_id = fid
                           , fdt_parent_id = pid
                           , fdt_storage_id = sid
                           , fdt_name = name
                           , fdt_sibling = sibling
                           , fdt_child = child
                           }
    poke ptr fdt = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (fdt_folder_id fdt)
{-# LINE 264 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (fdt_parent_id fdt)
{-# LINE 265 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (fdt_storage_id fdt)
{-# LINE 266 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (fdt_name fdt)
{-# LINE 267 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (fdt_sibling fdt)
{-# LINE 268 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 20) ptr (fdt_child fdt)
{-# LINE 269 "MTP/Foreign.hsc" #-}

-- An intermediate structure for the LIBMTP_playlist_t struct.
-- We need this because LIBMTP_playlist_t is recursive.
data Playlist_t = Playlist_t
    { pt_playlist_id :: CInt
    , pt_parent_id :: CInt
    , pt_storage_id :: CInt
    , pt_name :: CString
    , pt_tracks :: Ptr CInt
    , pt_no_tracks :: CInt
    , pt_next :: Ptr Playlist_t
    }

instance Storable Playlist_t where
    sizeOf _ = (28)
{-# LINE 284 "MTP/Foreign.hsc" #-}
    alignment _ = 4
{-# LINE 285 "MTP/Foreign.hsc" #-}
    peek ptr = do
        plid <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 287 "MTP/Foreign.hsc" #-}
        pid <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 288 "MTP/Foreign.hsc" #-}
        sid <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 289 "MTP/Foreign.hsc" #-}
        name <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 290 "MTP/Foreign.hsc" #-}
        tracks <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 291 "MTP/Foreign.hsc" #-}
        ntracks <- (\hsc_ptr -> peekByteOff hsc_ptr 20) ptr
{-# LINE 292 "MTP/Foreign.hsc" #-}
        next <- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 293 "MTP/Foreign.hsc" #-}
        return $ Playlist_t plid pid sid name tracks ntracks next
    poke ptr pt = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (pt_playlist_id pt)
{-# LINE 296 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (pt_parent_id pt)
{-# LINE 297 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (pt_storage_id pt)
{-# LINE 298 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (pt_name pt)
{-# LINE 299 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (pt_tracks pt)
{-# LINE 300 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 20) ptr (pt_no_tracks pt)
{-# LINE 301 "MTP/Foreign.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr (pt_next pt)
{-# LINE 302 "MTP/Foreign.hsc" #-}

------------------------------------------------------------------------------
-- Foreign imports
------------------------------------------------------------------------------

foreign import ccall unsafe "LIBMTP_Init" c_init :: IO ()

foreign import ccall unsafe "LIBMTP_Get_First_Device" c_get_first_device
    :: IO (Ptr MTPDevice)

foreign import ccall unsafe "LIBMTP_Release_Device" c_release_device
    :: Ptr MTPDevice -> IO ()

foreign import ccall unsafe "LIBMTP_Reset_Device" c_reset_device
    :: Ptr MTPDevice
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Errorstack" c_get_errorstack
    :: Ptr MTPDevice
    -> IO (Ptr Error_t)

foreign import ccall unsafe "LIBMTP_Clear_Errorstack" c_clear_errorstack
    :: Ptr MTPDevice
    -> IO ()

foreign import ccall unsafe "LIBMTP_Get_Manufacturername"
    c_get_manufacturername :: Ptr MTPDevice -> IO CString

foreign import ccall unsafe "LIBMTP_Get_Modelname"
    c_get_modelname :: Ptr MTPDevice -> IO CString

foreign import ccall unsafe "LIBMTP_Get_Serialnumber"
    c_get_serialnumber :: Ptr MTPDevice -> IO CString

foreign import ccall unsafe "LIBMTP_Get_Friendlyname"
    c_get_friendlyname :: Ptr MTPDevice -> IO CString

foreign import ccall unsafe "LIBMTP_Get_Deviceversion" c_get_deviceversion
    :: Ptr MTPDevice -> IO CString

foreign import ccall unsafe "LIBMTP_Get_Batterylevel" c_get_batterylevel
    :: Ptr MTPDevice
    -> Ptr CInt
    -> Ptr CInt
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Supported_Filetypes"
    c_get_supported_filetypes :: Ptr MTPDevice
                              -> Ptr CInt
                              -> Ptr CInt
                              -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Filelisting_With_Callback" c_get_filelisting
    :: Ptr MTPDevice
    -> Ptr Callback
    -> Ptr Data
    -> IO (Ptr File_t)

foreign import ccall unsafe "LIBMTP_Track_Exists" c_track_exists
    :: Ptr MTPDevice
    -> CInt
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_File_To_File" c_get_file_to_file
    :: Ptr MTPDevice
    -> CInt
    -> CString
    -> Ptr Callback
    -> Ptr Data
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Send_File_From_File" c_send_file_from_file
    :: Ptr MTPDevice
    -> CString
    -> Ptr Callback
    -> Ptr Data
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_File_To_File_Descriptor"
    c_get_file_to_file_descriptor :: Ptr MTPDevice
                                  -> CInt
                                  -> Ptr CFile
                                  -> Ptr Callback
                                  -> Ptr Data
                                  -> IO CInt

foreign import ccall unsafe "LIBMTP_Send_File_From_File_Descriptor"
    c_send_file_from_file_descriptor :: Ptr MTPDevice
                                     -> Ptr CFile
                                     -> Ptr File_t
                                     -> Ptr Callback
                                     -> Ptr Data
                                     -> IO CInt

foreign import ccall unsafe "LIBMTP_Set_File_Name" c_set_file_name
    :: Ptr MTPDevice
    -> Ptr File_t
    -> CString
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Tracklisting_With_Callback" c_get_tracklisting
    :: Ptr MTPDevice
    -> Ptr Callback
    -> Ptr Data
    -> IO (Ptr Track_t)

foreign import ccall unsafe "LIBMTP_Get_Track_To_File" c_get_track_to_file
    :: Ptr MTPDevice
    -> CInt
    -> CString
    -> Ptr Callback
    -> Ptr Data
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Send_Track_From_File" c_send_track_from_file
    :: Ptr MTPDevice
    -> CString
    -> (Ptr Track_t)
    -> Ptr Callback
    -> Ptr Data
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Send_Track_From_File_Descriptor"
   c_send_track_from_file_descriptor :: Ptr MTPDevice
                                     -> Ptr CFile
                                     -> Ptr Track_t
                                     -> Ptr Callback
                                     -> Ptr Data
                                     -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Track_To_File_Descriptor"
   c_get_track_to_file_descriptor :: Ptr MTPDevice
                                  -> CInt
                                  -> Ptr CFile
                                  -> Ptr Callback
                                  -> Ptr Data
                                  -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Trackmetadata"
    c_get_trackmetadata :: Ptr MTPDevice
                        -> CInt
                        -> IO (Ptr Track_t)

foreign import ccall unsafe "LIBMTP_Update_Track_Metadata"
    c_update_track_metadata :: Ptr MTPDevice
                            -> Ptr Track_t
                            -> IO CInt

foreign import ccall unsafe "LIBMTP_Set_Track_Name" c_set_track_name
    :: Ptr MTPDevice
    -> Ptr Track_t
    -> CString
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Create_Folder" c_create_folder
    :: Ptr MTPDevice
    -> CString
    -> CInt
    -> CInt
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Folder_List" c_folder_list
    :: Ptr MTPDevice
    -> IO (Ptr Folder_t)

foreign import ccall unsafe "LIBMTP_Set_Folder_Name" c_set_folder_name
    :: Ptr MTPDevice
    -> Ptr Folder_t
    -> CString
    -> IO CInt

foreign import ccall unsafe "LIBMTP_Get_Playlist_List"
    c_get_playlist_list :: Ptr MTPDevice
                        -> IO (Ptr Playlist_t)

foreign import ccall unsafe "LIBMTP_Get_Playlist"
    c_get_playlist :: Ptr MTPDevice
                   -> CInt
                   -> IO (Ptr Playlist_t)

foreign import ccall unsafe "LIBMTP_Create_New_Playlist"
    c_create_new_playlist :: Ptr MTPDevice
                          -> Ptr Playlist_t
                          -> IO CInt

foreign import ccall unsafe "LIBMTP_Update_Playlist"
    c_update_playlist :: Ptr MTPDevice
                      -> Ptr Playlist_t
                      -> IO CInt

foreign import ccall unsafe "LIBMTP_Set_Playlist_Name"
    c_set_playlist_name :: Ptr MTPDevice
                        -> Ptr Playlist_t
                        -> CString
                        -> IO CInt

foreign import ccall unsafe "LIBMTP_Delete_Object"
    c_delete_object :: Ptr MTPDevice
                    -> CInt
                    -> IO CInt

foreign import ccall unsafe "LIBMTP_Set_Object_Filename"
    c_set_object_filename :: Ptr MTPDevice
                          -> CInt
                          -> CString
                          -> IO CInt