diff options
author | Linus Walleij <triad@df.lth.se> | 2006-11-29 08:56:12 +0000 |
---|---|---|
committer | Linus Walleij <triad@df.lth.se> | 2006-11-29 08:56:12 +0000 |
commit | 7beba572c57ed5afd6cf3d453190ce8a74b95fe8 (patch) | |
tree | eb125349fe5c6396cc8144dfc8f9cb027c6d9b07 | |
parent | cf42f455ba918c09e3a4087c4bafd50df69e7d30 (diff) | |
download | libmtp-7beba572c57ed5afd6cf3d453190ce8a74b95fe8.tar.gz |
Some WIN32 porting by Farooq Zaman.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | README.windows.txt | 86 | ||||
-rw-r--r-- | src/libmtp.c | 44 | ||||
-rw-r--r-- | src/libusb-glue.c | 23 |
5 files changed, 146 insertions, 19 deletions
@@ -1,3 +1,13 @@ +2006-11-29 Linus Walleij <triad@df.lth.se> + + * src/libusb-glue.c: remove some pointless #include <> + clutter, call usb_set_configuration() as needed by + Windows. + * src/libmtp.c: various fixups to enable use of Windows + <io.h> include file. + * README.windows.txt: added a quick porting guide for + MSVC by Farooq Zaman. + 2006-11-28 Linus Walleij <triad@df.lth.se> * src/libmtp.h.in: removed filetype mapping API. We can handle diff --git a/Makefile.am b/Makefile.am index 12b4e1e..a8b110e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,7 +3,7 @@ ACLOCAL_AMFLAGS=-I m4 pkgconfigdir=$(libdir)/pkgconfig pkgconfig_DATA=libmtp.pc -EXTRA_DIST=libmtp.pc libmtp.sh COPYING +EXTRA_DIST=libmtp.pc libmtp.sh COPYING README.windows.txt noinst_DATA=libmtp.usermap libmtp.rules libmtp.fdi libmtp.usermap: examples/hotplug examples/hotplug > libmtp.usermap diff --git a/README.windows.txt b/README.windows.txt new file mode 100644 index 0000000..53d2e75 --- /dev/null +++ b/README.windows.txt @@ -0,0 +1,86 @@ +This file was created by Farooq Zaman <emotional_keats2h@hotmail.com>
+as a guide to practical Windows porting of libmtp using MSVC (Microsoft
+Visual C++). Some details may have changed, e.g. the things that could be
+fixed in libmtp sources by #ifdef __WIN32__ macros have been folded back
+in. This has been tested on Windows 2000.
+
+
+libmtp.c
+========
+ 1. Include <io.h> file.
+ 2. Comment out <sys/mman.h> file.
+ 3. Line# 2115 replace "open" with "_open" and replace "S_IRWXU|S_IRGRP" with "_S_IREAD".
+ 4. Line# 2126 replace "close" with "_close".
+ 5. Line# 2283 replace "open" with "_open" and add one more closing ")" at the end of _open API.
+ 6. Line# 2294 replace "close" with "_close".
+ 7. Line# 2502 and Line# 2513 repeat steps 5 and 6.
+libmtp.h
+========
+ 1. replace <usb.h> and <stdint.h> with "usb.h" and "stdint.h" respectively.
+
+libusb-glue.c
+=============
+ 1. Comment out <getopt.h>, <unistd.h>, <utime.h> and <sys/mman.h> includes.
+ 2. Replace <usb.h> with "usb.h"
+ 3. Line# 537 Add usb_set_configuration(device_handle, dev->config->bConfigurationValue); before claiming USB interface.
+
+ptp.c
+======
+ 1. Comment out <config.h> and <unistd.h> include macro.
+ 2. Include "libmtp.h" file.
+ 3. Line# 484 remove "inline" keyword from the function.
+
+ptp.h
+=====
+ 1. replace <iconv.h> with "iconv.h".
+
+ptp-pack.c
+==========
+ 1. replace <iconv.h> with "iconv.h".
+ 2. Include "stdint.h" and "ptp.h" files. Windows C doesn't have "stdint.h" file. I took this file from Cygwin.
+ 3. Remove "inline" keyword with all the functions in this file.
+
+gphoto2-endian.h
+================
+ 1. replace <arpa/inet.h> with <winsock.h> .
+
+
+stdint.h
+========
+ 1. MSVC doesn't have stdint.h file as part of its C. Get this file from someother source(e.g Cygwin in my case). And replace "long long" with "__int64".
+
+byteswap.h
+==========
+ 1. MSVC doesn't have this file too. I created this file myself by just copying bswap_16(), bswap_32() and bswap_64() macros from Linux /usr/include/bits/byteswap.h file.
+
+
+
+Libraries
+=========
+ You will need two libraries for windows "libusb" and "libiconv".
+ 1. You can download libusb from
+ http://libusb-win32.sourceforge.net/#downloads
+ Download the Device driver version, unpack the archive and get libusb.lib and libusb0.dll files.
+ Place libusb.lib in the libs folder and libusb0.dll file in the debug folder of MSVC project.
+ Also get libusb.h file and add it to your project.
+
+ 2. You can Download libiconv-2.dll file from
+ http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=147572&release_id=356820
+ and libiconv.lib file from
+ http://gnuwin32.sourceforge.net/packages/libiconv.htm
+ Download Developer files and get libiconv.lib file.
+ Place libiconv.lib in the libs folder and libicon-2.dll in debug folder of MSVC project.
+ Also get libiconv.h file and add it to your project.
+
+
+ 3. Goto Project->settings. In the "link" tab and "General" category, add "libusb.lib" and "libiconv.lib" to
+ "Object/library modules".
+
+ 4. Change Category to Input and add your libs folder Path to "Additional Library Path".
+
+libusb filter Driver
+====================
+ You will need libusb driver for libusb to function properly.
+ Get libusb filter driver version from this link
+ http://libusb-win32.sourceforge.net/#downloads
+ Download the filter version and install it.
\ No newline at end of file diff --git a/src/libmtp.c b/src/libmtp.c index 50bf18e..72b8a5a 100644 --- a/src/libmtp.c +++ b/src/libmtp.c @@ -12,17 +12,20 @@ * The files libusb-glue.c/.h are just what they say: an * interface to libusb for the actual, physical USB traffic. */ -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/mman.h> - #include "libmtp.h" #include "unicode.h" #include "ptp.h" #include "libusb-glue.h" +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#ifdef _MSC_VER // For MSVC++ +#define USE_WINDOWS_IO_H +#include <io.h> +#endif + /* Enable enhanced MTP commands */ #define ENABLE_MTP_ENHANCED @@ -66,6 +69,7 @@ static filemap_t *filemap = NULL; */ static int register_filetype(char const * const description, LIBMTP_filetype_t const id, uint16_t const ptp_id); +static void init_filemap(); static void flush_handles(LIBMTP_mtpdevice_t *device); static uint16_t map_libmtp_type_to_ptp_type(LIBMTP_filetype_t intype); static LIBMTP_filetype_t map_ptp_type_to_libmtp_type(uint16_t intype); @@ -73,6 +77,14 @@ static int get_device_unicode_property(LIBMTP_mtpdevice_t *device, char **unicstring, uint16_t property); static void get_track_metadata(LIBMTP_mtpdevice_t *device, uint16_t objectformat, LIBMTP_track_t *track); +static int create_new_abstract_list(LIBMTP_mtpdevice_t *device, + char const * const name, + uint32_t const parenthandle, + uint16_t const objectformat, + char const * const suffix, + uint32_t * const newid, + uint32_t const * const tracks, + uint32_t const no_tracks); static MTPPropList *New_MTP_Prop_Entry(); static void Destroy_MTP_Prop_Entry(MTPPropList *prop); @@ -2034,7 +2046,11 @@ int LIBMTP_Get_File_To_File(LIBMTP_mtpdevice_t *device, uint32_t const id, // Open file #ifdef __WIN32__ +#ifdef USE_WINDOWS_IO_H + if ( (fd = _open(path, O_RDWR|O_CREAT|O_TRUNC|O_BINARY,_S_IREAD)) == -1 ) { +#else if ( (fd = open(path, O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IRWXU|S_IRGRP)) == -1 ) { +#endif #else if ( (fd = open(path, O_RDWR|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP)) == -1) { #endif @@ -2202,7 +2218,11 @@ int LIBMTP_Send_Track_From_File(LIBMTP_mtpdevice_t *device, // Open file #ifdef __WIN32__ +#ifdef USE_WINDOWS_IO_H + if ( (fd = _open(path, O_RDONLY|O_BINARY) == -1 ) { +#else if ( (fd = open(path, O_RDONLY|O_BINARY) == -1 ) { +#endif #else if ( (fd = open(path, O_RDONLY)) == -1) { #endif @@ -2213,7 +2233,11 @@ int LIBMTP_Send_Track_From_File(LIBMTP_mtpdevice_t *device, ret = LIBMTP_Send_Track_From_File_Descriptor(device, fd, metadata, callback, data, parenthandle); // Close file. +#ifdef USE_WINDOWS_IO_H + _close(fd); +#else close(fd); +#endif return ret; } @@ -2560,7 +2584,11 @@ int LIBMTP_Send_File_From_File(LIBMTP_mtpdevice_t *device, // Open file #ifdef __WIN32__ +#ifdef USE_WINDOWS_IO_H + if ( (fd = _open(path, O_RDONLY|O_BINARY) == -1 ) { +#else if ( (fd = open(path, O_RDONLY|O_BINARY) == -1 ) { +#endif #else if ( (fd = open(path, O_RDONLY)) == -1) { #endif @@ -2571,7 +2599,11 @@ int LIBMTP_Send_File_From_File(LIBMTP_mtpdevice_t *device, ret = LIBMTP_Send_File_From_File_Descriptor(device, fd, filedata, callback, data, parenthandle); // Close file. +#ifdef USE_WINDOWS_IO_H + _close(fd); +#else close(fd); +#endif return ret; } diff --git a/src/libusb-glue.c b/src/libusb-glue.c index d4c8647..403787a 100644 --- a/src/libusb-glue.c +++ b/src/libusb-glue.c @@ -9,24 +9,17 @@ * use MTP devices. Include mtp-utils.h to use any of the ptp/mtp functions. * */ +#include "libmtp.h" +#include "libusb-glue.h" +#include "util.h" #include "ptp.h" + #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <getopt.h> -#include <unistd.h> -#include <sys/types.h> -#include <utime.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/mman.h> #include <usb.h> -#include "libmtp.h" -#include "libusb-glue.h" -#include "util.h" - /* To enable debug prints, switch on this */ //#define ENABLE_USB_BULK_DEBUG @@ -559,10 +552,16 @@ static int init_ptp_usb (PTPParams* params, PTP_USB* ptp_usb, struct usb_device* */ if (ptp_usb->device_flags & DEVICE_FLAG_UNLOAD_DRIVER) { if (usb_detach_kernel_driver_np(device_handle, dev->config->interface->altsetting->bInterfaceNumber)) { - perror("usb_detach_kernel_driver_np()"); + // Totally ignore this error! + // perror("usb_detach_kernel_driver_np()"); } } #endif + // Originally only done on Windows, but shouldn't hurt. + if (usb_set_configuration(device_handle, dev->config->bConfigurationValue)) { + perror("usb_set_configuration()"); + return -1; + } if (usb_claim_interface(device_handle, dev->config->interface->altsetting->bInterfaceNumber)) { perror("usb_claim_interface()"); return -1; |