[Rhythmbox-devel] MTP support to rhythmbox
- From: Peter Grundström <peter grundstrom gmail com>
- To: rhythmbox-devel gnome org
- Subject: [Rhythmbox-devel] MTP support to rhythmbox
- Date: Thu, 15 Jun 2006 13:35:08 +0200
(it seams like my first attempt to send this to the mailing-list was
unsuccessful, hopefully it'll go better this time.)
Hello all,
I thought I'd share with you the result of my hacking the last days. The
attached patch adds support for handling MTP (Microsoft Transfer
Protocol) to rhythmbox. I'm not the one who talked about MTP-support a
couple of moth ago, that was Steve Fox, but I've talked to him and he
hadn't had the time to work on it, but I have :). But since this is my
first contribution to rhythmbox, or anything for that part, I probably
should introduce myself.
My name is Peter Grundström, petgru/pete on irc, I'm 18 years old and I
live in Sweden. I've been a user of opensource (linux/gnome/rhythmbox
you name it) for quite some time now. The last year or so I've started
to develop some useful programming skills. This is my first, but
hopefully not my last, "major" contribution to any opensource project.
So, back to the thing you probably are more interested in :) The patch
adds basic mtp-device handling to rhythmbox. Setup the device, List the
songs, Transfer songs and delete songs. It's built in the same way as
the ipod support, one mtp-plugin and a mtp-source. It's still not
perfect in any way, but it works.
What it doesn't do / TODO:
* You cant play the songs on the device. (the device never gets mounted,
you only access it through the library libmtp.)
* you have to run rhythmbox as root, since the libmtp requires
root-privileges to access the device through libusb. This should
probably be fixed with something like a udev-rule (in libmtp i presume).
* the device has to be attached when you start rhythmbox, and the only
way to detach it is to close rhythmbox.
* I was working with that last thing, but I couldn't get the popup to
work, it only says "Couldn't get menu widget for /MTPSourcePopup".
Someone who is more experienced with rhythmbox maybe can figure out why.
* It is a little delay when you close rythmbox which makes rhythmbox
look like it hanged, and the "rhythmbox does not respond" dialog
appears. No idea how to fix that.
* test it.
* find and fix the bugs
(I'm subscribed to the mailing-list, so no need to reply extra to me)
diff -u -r1.246 configure.ac
--- configure.ac 11 Jun 2006 11:12:24 -0000 1.246
+++ configure.ac 12 Jun 2006 21:57:42 -0000
@@ -121,6 +121,26 @@
fi
AM_CONDITIONAL(USE_IPOD, test x"$use_ipod" = xyes)
+dnl mtp support
+
+AC_ARG_WITH(mtp,
+ AC_HELP_STRING([--with-mtp],
+ [Enable MTP support]),,
+ with_mtp=auto)
+if test "x$with_mtp" != "xno"; then
+
+ PKG_CHECK_MODULES(MTP, libmtp, have_libmtp=yes, have_libmtp=no)
+ if test "x$have_libmtp" = "xno" -a "x$with_mtp" = "xyes"; then
+ AC_MSG_ERROR([MTP explicitly requested but libmtp couldn't be found])
+ fi
+ if test "x$have_libmtp" = "xyes"; then
+ use_mtp=yes
+ AC_SUBST(MTP_CFLAGS)
+ AC_SUBST(MTP_LIBS)
+ fi
+fi
+AM_CONDITIONAL(USE_MTP, test x"$use_mtp" = xyes)
+
dnl Database
AC_ARG_WITH(database,
AC_HELP_STRING([--with-database=tree|libgda],
@@ -917,6 +937,7 @@
plugins/sample/Makefile
plugins/audioscrobbler/Makefile
plugins/ipod/Makefile
+plugins/mtp/Makefile
plugins/lirc/Makefile
plugins/lyrics/Makefile
plugins/sample-python/Makefile
@@ -988,6 +1009,11 @@
AC_MSG_NOTICE([** iPod integration enabled])
else
AC_MSG_NOTICE([ iPod integration disabled])
+fi
+if test x"$use_mtp" = xyes; then
+ AC_MSG_NOTICE([** MTP integration enabled])
+else
+ AC_MSG_NOTICE([ MTP integration disabled])
fi
if test x"$enable_daap" = xyes; then
AC_MSG_NOTICE([** DAAP (music sharing) support is enabled])
diff -u -r1.8 Makefile.am
--- plugins/Makefile.am 25 May 2006 07:20:47 -0000 1.8
+++ plugins/Makefile.am 12 Jun 2006 21:57:42 -0000
@@ -24,6 +24,10 @@
SUBDIRS += ipod
endif
+if USE_MTP
+SUBDIRS += mtp
+endif
+
noinst_LTLIBRARIES = librbplugins.la
librbplugins_la_SOURCES = \
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ plugins/mtp/Makefile.in 2006-06-12 23:19:18.000000000 +0200
@@ -0,0 +1,723 @@
+# Makefile.in generated by automake 1.7.9 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AVAHI_CFLAGS = @AVAHI_CFLAGS@
+AVAHI_LIBS = @AVAHI_LIBS@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_CFLAGS = @CHECK_CFLAGS@
+CHECK_LIBS = @CHECK_LIBS@
+CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DATADIRNAME = @DATADIRNAME@
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_GLIB_BIN = @DBUS_GLIB_BIN@
+DBUS_LIBS = @DBUS_LIBS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOC_USER_FORMATS = @DOC_USER_FORMATS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_GTK_DOC_FALSE = @ENABLE_GTK_DOC_FALSE@
+ENABLE_GTK_DOC_TRUE = @ENABLE_GTK_DOC_TRUE@
+ENABLE_PYTHON_FALSE = @ENABLE_PYTHON_FALSE@
+ENABLE_PYTHON_TRUE = @ENABLE_PYTHON_TRUE@
+ENABLE_SK_FALSE = @ENABLE_SK_FALSE@
+ENABLE_SK_TRUE = @ENABLE_SK_TRUE@
+ENABLE_TRACK_TRANSFER_FALSE = @ENABLE_TRACK_TRANSFER_FALSE@
+ENABLE_TRACK_TRANSFER_TRUE = @ENABLE_TRACK_TRANSFER_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GCONFTOOL = @GCONFTOOL@
+GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@
+GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GDA_CFLAGS = @GDA_CFLAGS@
+GDA_LIBS = @GDA_LIBS@
+GDU_MODULE_VERSION_CHECK_CFLAGS = @GDU_MODULE_VERSION_CHECK_CFLAGS@
+GDU_MODULE_VERSION_CHECK_LIBS = @GDU_MODULE_VERSION_CHECK_LIBS@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOME_MEDIA_PROFILES_CFLAGS = @GNOME_MEDIA_PROFILES_CFLAGS@
+GNOME_MEDIA_PROFILES_LIBS = @GNOME_MEDIA_PROFILES_LIBS@
+GSTREAMER_0_10_CFLAGS = @GSTREAMER_0_10_CFLAGS@
+GSTREAMER_0_10_LIBS = @GSTREAMER_0_10_LIBS@
+GSTREAMER_0_8_CFLAGS = @GSTREAMER_0_8_CFLAGS@
+GSTREAMER_0_8_LIBS = @GSTREAMER_0_8_LIBS@
+GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE_LIBTOOL_FALSE@
+GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@
+HAL_CFLAGS = @HAL_CFLAGS@
+HAL_LIBS = @HAL_LIBS@
+HAVE_CHECK_FALSE = @HAVE_CHECK_FALSE@
+HAVE_CHECK_TRUE = @HAVE_CHECK_TRUE@
+HAVE_HAL_0_2_FALSE = @HAVE_HAL_0_2_FALSE@
+HAVE_HAL_0_2_TRUE = @HAVE_HAL_0_2_TRUE@
+HAVE_HAL_0_5_FALSE = @HAVE_HAL_0_5_FALSE@
+HAVE_HAL_0_5_TRUE = @HAVE_HAL_0_5_TRUE@
+HAVE_HAL_FALSE = @HAVE_HAL_FALSE@
+HAVE_HAL_TRUE = @HAVE_HAL_TRUE@
+HAVE_LINUX_CDROM_FALSE = @HAVE_LINUX_CDROM_FALSE@
+HAVE_LINUX_CDROM_TRUE = @HAVE_LINUX_CDROM_TRUE@
+HAVE_MUSICBRAINZ_FALSE = @HAVE_MUSICBRAINZ_FALSE@
+HAVE_MUSICBRAINZ_TRUE = @HAVE_MUSICBRAINZ_TRUE@
+HELP_DIR = @HELP_DIR@
+HOWL_CFLAGS = @HOWL_CFLAGS@
+HOWL_LIBS = @HOWL_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_ICONV = @INTLTOOL_ICONV@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_MSGFMT = @INTLTOOL_MSGFMT@
+INTLTOOL_MSGMERGE = @INTLTOOL_MSGMERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XGETTEXT = @INTLTOOL_XGETTEXT@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+IPOD_CFLAGS = @IPOD_CFLAGS@
+IPOD_LIBS = @IPOD_LIBS@
+IPOD_PHONE_CFLAGS = @IPOD_PHONE_CFLAGS@
+IPOD_PHONE_LIBS = @IPOD_PHONE_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBNAUTILUS_BURN_CFLAGS = @LIBNAUTILUS_BURN_CFLAGS@
+LIBNAUTILUS_BURN_LIBS = @LIBNAUTILUS_BURN_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBSEXY_CFLAGS = @LIBSEXY_CFLAGS@
+LIBSEXY_LIBS = @LIBSEXY_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MDNS_CFLAGS = @MDNS_CFLAGS@
+MDNS_LIBS = @MDNS_LIBS@
+MKDTEMP_MISSING_FALSE = @MKDTEMP_MISSING_FALSE@
+MKDTEMP_MISSING_TRUE = @MKDTEMP_MISSING_TRUE@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MTP_CFLAGS = @MTP_CFLAGS@
+MTP_LIBS = @MTP_LIBS@
+MUSICBRAINZ_CFLAGS = @MUSICBRAINZ_CFLAGS@
+MUSICBRAINZ_LIBS = @MUSICBRAINZ_LIBS@
+NOTIFY_CFLAGS = @NOTIFY_CFLAGS@
+NOTIFY_LIBS = @NOTIFY_LIBS@
+NO_STRICT_ALIASING_CFLAGS = @NO_STRICT_ALIASING_CFLAGS@
+OBJEXT = @OBJEXT@
+OMF_DIR = @OMF_DIR@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+PLUGIN_LIBTOOL_FLAGS = @PLUGIN_LIBTOOL_FLAGS@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYGTK_H2DEF = @PYGTK_H2DEF@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_LIB_LOC = @PYTHON_LIB_LOC@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RB_CLIENT_CFLAGS = @RB_CLIENT_CFLAGS@
+RB_CLIENT_LIBS = @RB_CLIENT_LIBS@
+RHYTHMBOX_CFLAGS = @RHYTHMBOX_CFLAGS@
+RHYTHMBOX_LIBS = @RHYTHMBOX_LIBS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOUNDSYSTEM_DEPS = @SOUNDSYSTEM_DEPS@
+SOUP_CFLAGS = @SOUP_CFLAGS@
+SOUP_LIBS = @SOUP_LIBS@
+STRIP = @STRIP@
+TOTEM_PLPARSER_CFLAGS = @TOTEM_PLPARSER_CFLAGS@
+TOTEM_PLPARSER_LIBS = @TOTEM_PLPARSER_LIBS@
+USE_AVAHI_FALSE = @USE_AVAHI_FALSE@
+USE_AVAHI_TRUE = @USE_AVAHI_TRUE@
+USE_DAAP_FALSE = @USE_DAAP_FALSE@
+USE_DAAP_TRUE = @USE_DAAP_TRUE@
+USE_GDADB_FALSE = @USE_GDADB_FALSE@
+USE_GDADB_TRUE = @USE_GDADB_TRUE@
+USE_GSTREAMER_0_10_FALSE = @USE_GSTREAMER_0_10_FALSE@
+USE_GSTREAMER_0_10_TRUE = @USE_GSTREAMER_0_10_TRUE@
+USE_GSTREAMER_0_8_FALSE = @USE_GSTREAMER_0_8_FALSE@
+USE_GSTREAMER_0_8_TRUE = @USE_GSTREAMER_0_8_TRUE@
+USE_HOWL_FALSE = @USE_HOWL_FALSE@
+USE_HOWL_TRUE = @USE_HOWL_TRUE@
+USE_IPOD_FALSE = @USE_IPOD_FALSE@
+USE_IPOD_TRUE = @USE_IPOD_TRUE@
+USE_LIBSOUP_FALSE = @USE_LIBSOUP_FALSE@
+USE_LIBSOUP_TRUE = @USE_LIBSOUP_TRUE@
+USE_MTP_FALSE = @USE_MTP_FALSE@
+USE_MTP_TRUE = @USE_MTP_TRUE@
+USE_NLS = @USE_NLS@
+USE_NOTIFY_FALSE = @USE_NOTIFY_FALSE@
+USE_NOTIFY_TRUE = @USE_NOTIFY_TRUE@
+USE_TREEDB_FALSE = @USE_TREEDB_FALSE@
+USE_TREEDB_TRUE = @USE_TREEDB_TRUE@
+VERSION = @VERSION@
+WITH_AUDIOSCROBBLER_FALSE = @WITH_AUDIOSCROBBLER_FALSE@
+WITH_AUDIOSCROBBLER_TRUE = @WITH_AUDIOSCROBBLER_TRUE@
+WITH_DBUS_FALSE = @WITH_DBUS_FALSE@
+WITH_DBUS_TRUE = @WITH_DBUS_TRUE@
+WITH_INTERNAL_LIBSEXY_FALSE = @WITH_INTERNAL_LIBSEXY_FALSE@
+WITH_INTERNAL_LIBSEXY_TRUE = @WITH_INTERNAL_LIBSEXY_TRUE@
+WITH_LIRC_FALSE = @WITH_LIRC_FALSE@
+WITH_LIRC_TRUE = @WITH_LIRC_TRUE@
+WITH_METADATA_HELPER_FALSE = @WITH_METADATA_HELPER_FALSE@
+WITH_METADATA_HELPER_TRUE = @WITH_METADATA_HELPER_TRUE@
+WITH_OLD_DBUS_FALSE = @WITH_OLD_DBUS_FALSE@
+WITH_OLD_DBUS_TRUE = @WITH_OLD_DBUS_TRUE@
+WNOERROR_CFLAGS = @WNOERROR_CFLAGS@
+XGETTEXT = @XGETTEXT@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+plugindir = $(PLUGINDIR)
+plugin_LTLIBRARIES = libmtpdevice.la
+
+libmtpdevice_la_SOURCES = \
+ rb-mtp-plugin.c \
+ $(top_srcdir)/sources/rb-mtp-source.c \
+ $(top_srcdir)/sources/rb-mtp-source.h
+
+
+libmtpdevice_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
+libmtpdevice_la_LIBADD = \
+ $(top_builddir)/lib/librb.la \
+ $(HAL_LIBS) \
+ $(MTP_LIBS)
+
+
+INCLUDES = \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+ -DG_LOG_DOMAIN=\"Rhythmbox\" \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/metadata \
+ -I$(top_srcdir)/player \
+ -I$(top_srcdir)/rhythmdb \
+ -I$(top_srcdir)/widgets \
+ -I$(top_srcdir)/sources \
+ -I$(top_srcdir)/iradio \
+ -I$(top_srcdir)/podcast \
+ -I$(top_srcdir)/plugins \
+ -I$(top_srcdir)/shell \
+ -DPIXMAP_DIR=\""$(datadir)/pixmaps"\" \
+ -DSHARE_DIR=\"$(pkgdatadir)\" \
+ -DDATADIR=\""$(datadir)"\" \
+ $(RHYTHMBOX_CFLAGS) \
+ $(WARN_CFLAGS) \
+ $(HAL_CFLAGS) \
+ $(MTP_CFLAGS) \
+ -D_XOPEN_SOURCE -D_BSD_SOURCE
+
+
+plugin_in_files = mtpdevice.rb-plugin.desktop.in
+
+plugin_DATA = $(plugin_in_files:.rb-plugin.desktop.in=.rb-plugin)
+
+EXTRA_DIST = $(plugin_in_files)
+
+CLEANFILES = $(plugin_DATA)
+DISTCLEANFILES = $(plugin_DATA)
+subdir = plugins/mtp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+
+libmtpdevice_la_DEPENDENCIES = $(top_builddir)/lib/librb.la
+am_libmtpdevice_la_OBJECTS = rb-mtp-plugin.lo rb-mtp-source.lo
+libmtpdevice_la_OBJECTS = $(am_libmtpdevice_la_OBJECTS)
+
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+ AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/rb-mtp-plugin.Plo \
+ AMDEP_TRUE@ ./$(DEPDIR)/rb-mtp-source.Plo
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
+ $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(libmtpdevice_la_SOURCES)
+DATA = $(plugin_DATA)
+
+DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
+SOURCES = $(libmtpdevice_la_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plugins/mtp/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+pluginLTLIBRARIES_INSTALL = $(INSTALL)
+install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(plugindir)
+ @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(plugindir)/$$f"; \
+ $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(plugindir)/$$f; \
+ else :; fi; \
+ done
+
+uninstall-pluginLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
+ p="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/$$p"; \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/$$p; \
+ done
+
+clean-pluginLTLIBRARIES:
+ -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES)
+ @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" = "$$p" && dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libmtpdevice.la: $(libmtpdevice_la_OBJECTS) $(libmtpdevice_la_DEPENDENCIES)
+ $(LINK) -rpath $(plugindir) $(libmtpdevice_la_LDFLAGS) $(libmtpdevice_la_OBJECTS) $(libmtpdevice_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/rb-mtp-plugin Plo am__quote@
+ AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/rb-mtp-source Plo am__quote@
+
+.c.o:
+ am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+ am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
+
+.c.obj:
+ am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+ am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+
+.c.lo:
+ am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+ am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+rb-mtp-source.o: $(top_srcdir)/sources/rb-mtp-source.c
+ am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rb-mtp-source.o -MD -MP -MF "$(DEPDIR)/rb-mtp-source.Tpo" \
+ am__fastdepCC_TRUE@ -c -o rb-mtp-source.o `test -f '$(top_srcdir)/sources/rb-mtp-source.c' || echo '$(srcdir)/'`$(top_srcdir)/sources/rb-mtp-source.c; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rb-mtp-source.Tpo" "$(DEPDIR)/rb-mtp-source.Po"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/rb-mtp-source.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/sources/rb-mtp-source.c' object='rb-mtp-source.o' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/rb-mtp-source.Po' tmpdepfile='$(DEPDIR)/rb-mtp-source.TPo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rb-mtp-source.o `test -f '$(top_srcdir)/sources/rb-mtp-source.c' || echo '$(srcdir)/'`$(top_srcdir)/sources/rb-mtp-source.c
+
+rb-mtp-source.obj: $(top_srcdir)/sources/rb-mtp-source.c
+ am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rb-mtp-source.obj -MD -MP -MF "$(DEPDIR)/rb-mtp-source.Tpo" \
+ am__fastdepCC_TRUE@ -c -o rb-mtp-source.obj `if test -f '$(top_srcdir)/sources/rb-mtp-source.c'; then $(CYGPATH_W) '$(top_srcdir)/sources/rb-mtp-source.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/sources/rb-mtp-source.c'; fi`; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rb-mtp-source.Tpo" "$(DEPDIR)/rb-mtp-source.Po"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/rb-mtp-source.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/sources/rb-mtp-source.c' object='rb-mtp-source.obj' libtool=no @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/rb-mtp-source.Po' tmpdepfile='$(DEPDIR)/rb-mtp-source.TPo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rb-mtp-source.obj `if test -f '$(top_srcdir)/sources/rb-mtp-source.c'; then $(CYGPATH_W) '$(top_srcdir)/sources/rb-mtp-source.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/sources/rb-mtp-source.c'; fi`
+
+rb-mtp-source.lo: $(top_srcdir)/sources/rb-mtp-source.c
+ am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rb-mtp-source.lo -MD -MP -MF "$(DEPDIR)/rb-mtp-source.Tpo" \
+ am__fastdepCC_TRUE@ -c -o rb-mtp-source.lo `test -f '$(top_srcdir)/sources/rb-mtp-source.c' || echo '$(srcdir)/'`$(top_srcdir)/sources/rb-mtp-source.c; \
+ am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rb-mtp-source.Tpo" "$(DEPDIR)/rb-mtp-source.Plo"; \
+ am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/rb-mtp-source.Tpo"; exit 1; \
+ am__fastdepCC_TRUE@ fi
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/sources/rb-mtp-source.c' object='rb-mtp-source.lo' libtool=yes @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/rb-mtp-source.Plo' tmpdepfile='$(DEPDIR)/rb-mtp-source.TPlo' @AMDEPBACKSLASH@
+ AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rb-mtp-source.lo `test -f '$(top_srcdir)/sources/rb-mtp-source.c' || echo '$(srcdir)/'`$(top_srcdir)/sources/rb-mtp-source.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+pluginDATA_INSTALL = $(INSTALL_DATA)
+install-pluginDATA: $(plugin_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(plugindir)
+ @list='$(plugin_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(pluginDATA_INSTALL) $$d$$p $(DESTDIR)$(plugindir)/$$f"; \
+ $(pluginDATA_INSTALL) $$d$$p $(DESTDIR)$(plugindir)/$$f; \
+ done
+
+uninstall-pluginDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(plugin_DATA)'; for p in $$list; do \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " rm -f $(DESTDIR)$(plugindir)/$$f"; \
+ rm -f $(DESTDIR)$(plugindir)/$$f; \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(plugindir) $(DESTDIR)$(plugindir)
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f $(CONFIG_CLEAN_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pluginDATA install-pluginLTLIBRARIES
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pluginDATA \
+ uninstall-pluginLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-pluginLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pluginDATA install-pluginLTLIBRARIES install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pluginDATA uninstall-pluginLTLIBRARIES
+
+
+%.rb-plugin: %.rb-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ plugins/mtp/Makefile.am 2006-06-10 23:33:27.000000000 +0200
@@ -0,0 +1,47 @@
+plugindir = $(PLUGINDIR)
+plugin_LTLIBRARIES = libmtpdevice.la
+
+libmtpdevice_la_SOURCES = \
+ rb-mtp-plugin.c \
+ $(top_srcdir)/sources/rb-mtp-source.c \
+ $(top_srcdir)/sources/rb-mtp-source.h
+
+libmtpdevice_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
+libmtpdevice_la_LIBADD = \
+ $(top_builddir)/lib/librb.la \
+ $(HAL_LIBS) \
+ $(MTP_LIBS)
+
+INCLUDES = \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+ -DG_LOG_DOMAIN=\"Rhythmbox\" \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/metadata \
+ -I$(top_srcdir)/player \
+ -I$(top_srcdir)/rhythmdb \
+ -I$(top_srcdir)/widgets \
+ -I$(top_srcdir)/sources \
+ -I$(top_srcdir)/iradio \
+ -I$(top_srcdir)/podcast \
+ -I$(top_srcdir)/plugins \
+ -I$(top_srcdir)/shell \
+ -DPIXMAP_DIR=\""$(datadir)/pixmaps"\" \
+ -DSHARE_DIR=\"$(pkgdatadir)\" \
+ -DDATADIR=\""$(datadir)"\" \
+ $(RHYTHMBOX_CFLAGS) \
+ $(WARN_CFLAGS) \
+ $(HAL_CFLAGS) \
+ $(MTP_CFLAGS) \
+ -D_XOPEN_SOURCE -D_BSD_SOURCE
+
+plugin_in_files = mtpdevice.rb-plugin.desktop.in
+
+%.rb-plugin: %.rb-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
+
+plugin_DATA = $(plugin_in_files:.rb-plugin.desktop.in=.rb-plugin)
+
+EXTRA_DIST = $(plugin_in_files)
+
+CLEANFILES = $(plugin_DATA)
+DISTCLEANFILES = $(plugin_DATA)
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ plugins/mtp/mtpdevice.rb-plugin.desktop.in 2006-06-10 23:32:49.000000000 +0200
@@ -0,0 +1,8 @@
+[RB Plugin]
+Module=mtpdevice
+IAge=1
+_Name=MTP Support
+_Description=Adds mtp support to Rhythmbox so that it can show an mtp-device content
+Authors=Peter Grundström
+Copyright=(C) 2006 Peter Grundström
+Website=http://www.rhythmbox.org
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ plugins/mtp/rb-mtp-plugin.c 2006-06-12 23:11:27.000000000 +0200
@@ -0,0 +1,209 @@
+/*
+ * rb-ipod-plugin.c
+ *
+ * Copyright (C) 2006 James Livingston <jrl ids org au>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n-lib.h>
+#include <gmodule.h>
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <libmtp.h>
+
+#include "rb-source.h"
+#include "rb-mtp-source.h"
+#include "rb-plugin.h"
+#include "rb-debug.h"
+#include "rb-file-helpers.h"
+#include "rb-util.h"
+#include "rb-shell.h"
+
+
+#define RB_TYPE_MTP_PLUGIN (rb_mtp_plugin_get_type ())
+#define RB_MTP_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_MTP_PLUGIN, RBMtpPlugin))
+#define RB_MTP_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_IPOD_PLUGIN, RBMtpPluginClass))
+#define RB_IS_MTP_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_MTP_PLUGIN))
+#define RB_IS_MTP_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_MTP_PLUGIN))
+#define RB_MTP_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_MTP_PLUGIN, RBMtpPluginClass))
+
+typedef struct
+{
+ RBPlugin parent;
+
+ RBShell *shell;
+ GtkActionGroup *action_group;
+ guint ui_merge_id;
+
+ GList *mtp_sources;
+} RBMtpPlugin;
+
+typedef struct
+{
+ RBPluginClass parent_class;
+} RBMtpPluginClass;
+
+
+G_MODULE_EXPORT GType register_rb_plugin (GTypeModule *module);
+GType rb_mtp_plugin_get_type (void) G_GNUC_CONST;
+
+static void rb_mtp_plugin_init (RBMtpPlugin *plugin);
+static void rb_mtp_plugin_finalize (GObject *object);
+static void impl_activate (RBPlugin *plugin, RBShell *shell);
+static void impl_deactivate (RBPlugin *plugin, RBShell *shell);
+
+static RBSource * create_source_cb (RBMtpPlugin *plugin,LIBMTP_mtpdevice_t *device);
+
+static void rb_mtp_plugin_eject (GtkAction *action,
+ RBMtpPlugin *plugin);
+
+RB_PLUGIN_REGISTER(RBMtpPlugin, rb_mtp_plugin)
+
+static GtkActionEntry rb_mtp_plugin_actions [] =
+{
+ { "MTPSourceEject", NULL, N_("_Eject"), NULL,
+ N_("Eject MTP-device"),
+ G_CALLBACK (rb_mtp_plugin_eject) }
+};
+
+static void
+rb_mtp_plugin_class_init (RBMtpPluginClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ RBPluginClass *plugin_class = RB_PLUGIN_CLASS (klass);
+
+ object_class->finalize = rb_mtp_plugin_finalize;
+
+ plugin_class->activate = impl_activate;
+ plugin_class->deactivate = impl_deactivate;
+
+ /* register types used by the plugin */
+ RB_PLUGIN_REGISTER_TYPE(rb_mtp_source);
+}
+
+static void
+rb_mtp_plugin_init (RBMtpPlugin *plugin)
+{
+ rb_debug ("RBMtpPlugin initialising");
+ LIBMTP_Init();
+}
+
+static void
+rb_mtp_plugin_finalize (GObject *object)
+{
+ /*RBIpodPlugin *plugin = RB_IPOD_PLUGIN (object);*/
+
+ rb_debug ("RBMtpPlugin finalising");
+
+ G_OBJECT_CLASS (rb_mtp_plugin_parent_class)->finalize (object);
+}
+
+static void
+impl_activate (RBPlugin *bplugin,
+ RBShell *shell)
+{
+ RBMtpPlugin *plugin = RB_MTP_PLUGIN (bplugin);
+ GtkUIManager *uimanager = NULL;
+
+ plugin->shell = shell;
+
+ g_object_get (G_OBJECT (shell),
+ "ui-manager", &uimanager,
+ NULL);
+
+ //ui
+
+ plugin->action_group = gtk_action_group_new ("MTPActions");
+ gtk_action_group_set_translation_domain (plugin->action_group,
+ GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (plugin->action_group,
+ rb_mtp_plugin_actions, G_N_ELEMENTS (rb_mtp_plugin_actions),
+ plugin);
+ gtk_ui_manager_insert_action_group (uimanager, plugin->action_group, 0);
+ plugin->ui_merge_id = gtk_ui_manager_add_ui_from_file (uimanager,
+ rb_file ("mtp-ui.xml"),
+ NULL);
+
+ //device detection
+
+ uint16_t vid;
+ uint16_t pid;
+
+ int ret = LIBMTP_Detect_Descriptor(&vid, &pid);
+ if (ret > 0) {
+ rb_debug ("DETECTED MTP DEVICE WITH VID:%04x, PID:%04X\n", vid, pid);
+ LIBMTP_mtpdevice_t *device = LIBMTP_Get_First_Device();
+ create_source_cb(plugin,device);
+ }
+
+ g_object_unref (G_OBJECT (uimanager));
+}
+
+static void
+impl_deactivate (RBPlugin *bplugin,
+ RBShell *shell)
+{
+ RBMtpPlugin *plugin = RB_MTP_PLUGIN (bplugin);
+ GtkUIManager *uimanager = NULL;
+
+ g_object_get (G_OBJECT (shell),
+ "ui-manager", &uimanager,
+ NULL);
+
+ gtk_ui_manager_remove_ui (uimanager, plugin->ui_merge_id);
+ gtk_ui_manager_remove_action_group (uimanager, plugin->action_group);
+
+ g_list_foreach (plugin->mtp_sources, (GFunc)rb_source_delete_thyself, NULL);
+ g_list_free (plugin->mtp_sources);
+ plugin->mtp_sources = NULL;
+
+ g_object_unref (G_OBJECT (uimanager));
+}
+
+static void
+rb_mtp_plugin_source_deleted (RBmtpSource *source, RBMtpPlugin *plugin)
+{
+ plugin->mtp_sources = g_list_remove (plugin->mtp_sources, source);
+}
+
+static RBSource *
+create_source_cb (RBMtpPlugin *plugin, LIBMTP_mtpdevice_t *device)
+{
+ RBSource *source;
+ source = RB_SOURCE (rb_mtp_source_new (plugin->shell,device));
+
+ rb_shell_append_source (plugin->shell, source, NULL);
+ plugin->mtp_sources = g_list_prepend (plugin->mtp_sources, source);
+
+ g_signal_connect_object (G_OBJECT (source),
+ "deleted", G_CALLBACK (rb_mtp_plugin_source_deleted),
+ plugin, 0);
+
+ return source;
+}
+
+static void
+rb_mtp_plugin_eject (GtkAction *action,
+ RBMtpPlugin *plugin)
+{
+ g_object_unref(plugin);
+}
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ sources/rb-mtp-source.h 2006-06-12 01:05:07.000000000 +0200
@@ -0,0 +1,55 @@
+/*
+ * arch-tag: Header for mtp source object
+ *
+ * Copyright (C) 2006 Peter Grundström <pete openfestis org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#ifndef __RB_MTP_SOURCE_H
+#define __RB_MTP_SOURCE_H
+
+#include "rb-shell.h"
+#include "rb-browser-source.h"
+#include "rhythmdb.h"
+#include <libmtp.h>
+
+G_BEGIN_DECLS
+
+#define RB_TYPE_MTP_SOURCE (rb_mtp_source_get_type ())
+#define RB_MTP_SOURCE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), RB_TYPE_MTP_SOURCE, RBmtpSource))
+#define RB_MTP_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), RB_TYPE_MTP_SOURCE, RBmtpSourceClass))
+#define RB_IS_MTP_SOURCE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), RB_TYPE_MTP_SOURCE))
+#define RB_IS_MTP_SOURCE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_MTP_SOURCE))
+#define RB_MTP_SOURCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_MTP_SOURCE, RBmtpSourceClass))
+
+typedef struct
+{
+ RBBrowserSource parent;
+} RBmtpSource;
+
+typedef struct
+{
+ RBBrowserSourceClass parent;
+} RBmtpSourceClass;
+
+RBBrowserSource * rb_mtp_source_new (RBShell *shell,LIBMTP_mtpdevice_t *device);
+GType rb_mtp_source_get_type (void);
+GType rb_mtp_source_register_type (GTypeModule *module);
+
+G_END_DECLS
+
+#endif /* __RB_MTP_SOURCE_H */
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ sources/rb-mtp-source.c 2006-06-12 23:11:54.000000000 +0200
@@ -0,0 +1,546 @@
+/*
+ * arch-tag: Implementation of mtp source object
+ *
+ * Copyright (C) 2006 Peter Grundström <pete openfestis org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <config.h>
+
+
+#include <gtk/gtktreeview.h>
+#include <string.h>
+#include "rhythmdb.h"
+#include <libgnome/gnome-i18n.h>
+#include <libgnomevfs/gnome-vfs-utils.h>
+#include <libgnomevfs/gnome-vfs-volume.h>
+#include <libgnomevfs/gnome-vfs-volume-monitor.h>
+#include "eel-gconf-extensions.h"
+#include "rb-mtp-source.h"
+#include "rb-debug.h"
+#include "rb-file-helpers.h"
+#include "rb-plugin.h"
+#include "rb-static-playlist-source.h"
+#include "rb-util.h"
+#include "rb-refstring.h"
+#include "rhythmdb.h"
+
+static GObject *rb_mtp_source_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties);
+static void rb_mtp_source_dispose (GObject *object);
+
+static GObject *rb_mtp_source_constructor (GType type, guint n_construct_properties,
+ GObjectConstructParam *construct_properties);
+static void rb_mtp_source_dispose (GObject *object);
+
+static void rb_mtp_load_songs (RBmtpSource*);
+static void impl_delete_thyself (RBSource *source);
+static void impl_move_to_trash (RBSource *asource);
+static void impl_paste (RBSource *source, GList *entries);
+static gboolean impl_receive_drag (RBSource *source, GtkSelectionData *data);
+static gboolean impl_show_popup (RBSource *source);
+
+typedef struct
+{
+ LIBMTP_mtpdevice_t *device;
+ GHashTable *entry_map;
+} RBmtpSourcePrivate;
+
+
+RB_PLUGIN_DEFINE_TYPE(RBmtpSource,
+ rb_mtp_source,
+ RB_TYPE_BROWSER_SOURCE)
+
+#define MTP_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_MTP_SOURCE, RBmtpSourcePrivate))
+
+static void
+rb_mtp_source_class_init (RBmtpSourceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ RBSourceClass *source_class = RB_SOURCE_CLASS (klass);
+
+ object_class->constructor = rb_mtp_source_constructor;
+ object_class->dispose = rb_mtp_source_dispose;
+
+ source_class->impl_show_popup = impl_show_popup;
+ source_class->impl_delete_thyself = impl_delete_thyself;
+ source_class->impl_can_move_to_trash = (RBSourceFeatureFunc) rb_true_function;
+ source_class->impl_move_to_trash = impl_move_to_trash;
+ source_class->impl_can_paste = (RBSourceFeatureFunc) rb_true_function;
+ source_class->impl_paste = impl_paste;
+ source_class->impl_receive_drag = impl_receive_drag;
+
+ source_class->impl_can_rename = (RBSourceFeatureFunc) rb_true_function;
+
+ g_type_class_add_private (klass, sizeof (RBmtpSourcePrivate));
+}
+
+static void
+rb_mtp_source_init (RBmtpSource *source)
+{
+ g_message("source init");
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+ priv = G_TYPE_INSTANCE_GET_PRIVATE (source,
+ RB_TYPE_MTP_SOURCE,
+ RBmtpSourcePrivate);
+}
+
+static GObject *
+rb_mtp_source_constructor (GType type, guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ RBmtpSource *source;
+ RBEntryView *songs;
+ RBmtpSourcePrivate *priv;
+
+ source = RB_MTP_SOURCE (G_OBJECT_CLASS (rb_mtp_source_parent_class)->
+ constructor (type, n_construct_properties, construct_properties));
+ priv = MTP_SOURCE_GET_PRIVATE (source);
+
+ songs = rb_source_get_entry_view (RB_SOURCE (source));
+ rb_entry_view_append_column (songs, RB_ENTRY_VIEW_COL_RATING, FALSE);
+ rb_entry_view_append_column (songs, RB_ENTRY_VIEW_COL_TITLE, TRUE);
+
+ gint size;
+ GtkIconTheme *theme;
+ GdkPixbuf *pixbuf;
+
+ theme = gtk_icon_theme_get_default ();
+ gtk_icon_size_lookup (GTK_ICON_SIZE_LARGE_TOOLBAR, &size, NULL);
+ pixbuf = gtk_icon_theme_load_icon (theme, "multimedia-player", size, 0, NULL);
+
+ rb_source_set_pixbuf (RB_SOURCE (source), pixbuf);
+ g_object_unref (pixbuf);
+
+ return G_OBJECT (source);
+}
+
+static void
+rb_mtp_source_dispose (GObject *object)
+{
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (object);
+
+ if (priv->entry_map) {
+ g_hash_table_destroy (priv->entry_map);
+ priv->entry_map = NULL;
+ }
+
+ G_OBJECT_CLASS (rb_mtp_source_parent_class)->dispose (object);
+}
+
+RBBrowserSource *
+rb_mtp_source_new (RBShell *shell, LIBMTP_mtpdevice_t *device)
+{
+ RBmtpSource *source;
+ RhythmDBEntryType entry_type;
+
+ entry_type = rhythmdb_entry_register_type (NULL);
+
+ source = RB_MTP_SOURCE (g_object_new (RB_TYPE_MTP_SOURCE,
+ "entry-type", entry_type,
+ "shell",shell,
+ "visibility", TRUE,
+ "sourcelist-group", RB_SOURCELIST_GROUP_REMOVABLE,
+ NULL));
+
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+ priv->device = device;
+
+ rb_mtp_load_songs (source);
+
+ rb_shell_register_entry_type_for_source (shell, RB_SOURCE(source), entry_type);
+
+ return RB_BROWSER_SOURCE (source);
+}
+
+static void
+entry_set_string_prop (RhythmDB *db, RhythmDBEntry *entry,
+ RhythmDBPropType propid, const char *str)
+{
+ GValue value = {0,};
+
+ if (!str)
+ str = _("Unknown");
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_static_string (&value, str);
+ rhythmdb_entry_set_uninserted (RHYTHMDB (db), entry, propid, &value);
+ g_value_unset (&value);
+}
+
+static void
+add_mtp_song_to_db (RBmtpSource *source, RhythmDB *db, LIBMTP_track_t *song)
+{
+ RhythmDBEntry *entry;
+ RhythmDBEntryType entry_type;
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+
+ /* Set URI */
+ g_object_get (G_OBJECT (source), "entry-type", &entry_type,
+ NULL);
+
+ entry = rhythmdb_entry_new (RHYTHMDB (db), entry_type, song->filename);
+
+ if (entry == NULL) {
+ rb_debug ("cannot create entry %s", song->filename);
+ return;
+ }
+
+ /* Set track number */
+ if (song->tracknumber != 0) {
+ GValue value = {0, };
+ g_value_init (&value, G_TYPE_ULONG);
+ g_value_set_ulong (&value, song->tracknumber);
+ rhythmdb_entry_set_uninserted (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_TRACK_NUMBER,
+ &value);
+ g_value_unset (&value);
+ }
+
+ /* Set length */
+ if (song->duration != 0) {
+ GValue value = {0, };
+ g_value_init (&value, G_TYPE_ULONG);
+ g_value_set_ulong (&value, song->duration/1000);
+ rhythmdb_entry_set_uninserted (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_DURATION,
+ &value);
+ g_value_unset (&value);
+ }
+
+ /* Set file size */
+ if (song->filesize != 0) {
+ GValue value = {0, };
+ g_value_init (&value, G_TYPE_UINT64);
+ g_value_set_uint64 (&value, song->filesize);
+ rhythmdb_entry_set_uninserted (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_FILE_SIZE,
+ &value);
+ g_value_unset (&value);
+ }
+
+ /* Set title */
+ entry_set_string_prop (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_TITLE, song->title);
+
+ /* Set album, artist and genre from MTP */
+ entry_set_string_prop (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_ARTIST, song->artist);
+
+ entry_set_string_prop (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_ALBUM, song->album);
+
+ entry_set_string_prop (RHYTHMDB (db), entry,
+ RHYTHMDB_PROP_GENRE, song->genre);
+
+
+ g_hash_table_insert (priv->entry_map, entry, song);
+
+ rhythmdb_commit (RHYTHMDB (db));
+}
+
+static gboolean
+load_mtp_db_idle_cb (RBmtpSource* source)
+{
+ RBShell *shell;
+ RhythmDB *db;
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+
+ g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+ g_object_get (G_OBJECT (shell), "db", &db, NULL);
+ g_object_unref (G_OBJECT (shell));
+
+ g_assert (db != NULL);
+
+ LIBMTP_track_t *tracks = LIBMTP_Get_Tracklisting(priv->device);
+ if (tracks == NULL) {
+ rb_debug("No tracks.\n");
+ } else {
+ LIBMTP_track_t *track,*tmp;
+ for (track = tracks; track != NULL; track = track->next) {
+ add_mtp_song_to_db (source, db, track);
+ tmp = track;
+ }
+ }
+
+ g_object_unref (G_OBJECT (db));
+ return FALSE;
+}
+
+static void
+rb_mtp_load_songs (RBmtpSource *source)
+{
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+ RBShell *shell;
+
+ g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+ g_object_unref (G_OBJECT (shell));
+
+ priv->entry_map = g_hash_table_new (g_direct_hash, g_direct_equal);
+ if ((priv->device != NULL) && (priv->entry_map != NULL)) {
+ /* FIXME: we could set a different icon depending on the iPod
+ * model
+ */
+ char* name = LIBMTP_Get_Ownername(priv->device);
+ g_object_set (RB_SOURCE (source),
+ "name", name,
+ NULL);
+ free(name);
+ g_idle_add ((GSourceFunc)load_mtp_db_idle_cb, source);
+ }
+}
+
+static void
+impl_delete_thyself (RBSource *source)
+{
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+
+ LIBMTP_track_t *tracks = LIBMTP_Get_Tracklisting(priv->device);
+ if (tracks == NULL) {
+ rb_debug("No tracks.\n");
+ } else {
+ LIBMTP_track_t *track,*tmp;
+ for (track = tracks; track != NULL; track = track->next) {
+ tmp = track;
+ LIBMTP_destroy_track_t(tmp);
+ }
+ }
+
+ LIBMTP_Release_Device(priv->device);
+ priv->device = NULL;
+
+ RB_SOURCE_CLASS (rb_mtp_source_parent_class)->impl_delete_thyself (source);
+}
+
+//track transfer
+
+static void dump_trackinfo(LIBMTP_track_t *track)
+{
+ g_message("Track ID: %d\n", track->item_id);
+ if (track->title != NULL)
+ g_message(" Title: %s\n", track->title);
+ if (track->artist != NULL)
+ g_message(" Artist: %s\n", track->artist);
+ if (track->genre != NULL)
+ g_message(" Genre: %s\n", track->genre);
+ if (track->album != NULL)
+ g_message(" Album: %s\n", track->album);
+ if (track->date != NULL)
+ g_message(" Date: %s\n", track->date);
+ if (track->filename != NULL)
+ g_message(" Origfilename: %s\n", track->filename);
+ g_message(" Track number: %d\n", track->tracknumber);
+ g_message(" Duration: %d milliseconds\n", track->duration);
+ g_message(" File size %llu bytes\n", track->filesize);
+ g_message(" Filetype: %s\n", LIBMTP_Get_Filetype_Description(track->filetype));
+}
+
+static char *
+gdate_to_char (GDate* date)
+{
+ char tmp[80];
+ snprintf(tmp, sizeof(tmp)-1, "%2i%2i%2iT0000.0", g_date_get_year(date),g_date_get_month(date),g_date_get_day(date));
+ tmp[sizeof(tmp)-1] = '\0';
+ return strdup(tmp);
+}
+
+static LIBMTP_track_t *
+add_song_to_mtp (LIBMTP_mtpdevice_t *device, RhythmDBEntry *entry)
+{
+ LIBMTP_track_t *trackmeta = LIBMTP_new_track_t();
+
+ const char *mimetype = rhythmdb_entry_get_string(entry,RHYTHMDB_PROP_MIMETYPE);
+ rb_debug("Sending track:\n");
+ rb_debug("Codec: %s\n", mimetype);
+
+ if (!strcasecmp(mimetype,"audio/mpeg") || !strcasecmp(mimetype,"application/x-id3")) {
+ trackmeta->filetype = LIBMTP_FILETYPE_MP3;
+ } else if (!strcasecmp(mimetype,"audio/x-wav")) {
+ trackmeta->filetype = LIBMTP_FILETYPE_WAV;
+ } else if (!strcasecmp(mimetype,"application/ogg")) {
+ trackmeta->filetype = LIBMTP_FILETYPE_OGG;
+ } else if (!strcasecmp(mimetype,"audio/mp4")) {
+ trackmeta->filetype = LIBMTP_FILETYPE_MP4;
+ } else if (!strcasecmp(mimetype,"audio/x-ms-wma") || !strcasecmp(mimetype,"audio/x-ms-asf")) {
+ trackmeta->filetype = LIBMTP_FILETYPE_WMA;
+ } else {
+ g_debug("Not a valid codec: \"%s\"\n", mimetype);
+ g_debug("Supported formats: MP3, WAV, OGG, MP4, WMA\n");
+ }
+
+ trackmeta->title = rhythmdb_entry_dup_string(entry,RHYTHMDB_PROP_TITLE);
+ trackmeta->album = rhythmdb_entry_dup_string(entry,RHYTHMDB_PROP_ALBUM);
+ trackmeta->artist = rhythmdb_entry_dup_string(entry,RHYTHMDB_PROP_ARTIST);
+ trackmeta->genre = rhythmdb_entry_dup_string(entry,RHYTHMDB_PROP_GENRE);
+ trackmeta->filename = gnome_vfs_get_local_path_from_uri (rhythmdb_entry_get_string(entry,RHYTHMDB_PROP_LOCATION));
+ GDate d;
+ g_date_set_julian(&d,rhythmdb_entry_get_ulong(entry,RHYTHMDB_PROP_DATE));
+ trackmeta->date = gdate_to_char(&d);
+ trackmeta->tracknumber = rhythmdb_entry_get_ulong(entry,RHYTHMDB_PROP_TRACK_NUMBER);
+ trackmeta->duration = rhythmdb_entry_get_ulong(entry,RHYTHMDB_PROP_DURATION) * 1000;
+ trackmeta->filesize = rhythmdb_entry_get_uint64(entry,RHYTHMDB_PROP_FILE_SIZE);
+
+ g_message("Sending track...\n");
+ dump_trackinfo(trackmeta);
+ LIBMTP_Send_Track_From_File(device, trackmeta->filename, trackmeta, NULL, NULL, 0);
+ g_message("\n");
+
+ g_message("New track ID: %d\n", trackmeta->item_id);
+
+ //LIBMTP_destroy_track_t(trackmeta);
+ return trackmeta;
+}
+
+static void
+impl_paste (RBSource *source, GList *entries)
+{
+ GList *l;
+ RBShell *shell;
+ RhythmDB *db;
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (source);
+
+ g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+ g_object_get (G_OBJECT (shell), "db", &db, NULL);
+ g_object_unref (G_OBJECT (shell));
+
+ for (l = entries; l != NULL; l = l->next) {
+ RhythmDBEntry *entry;
+ RhythmDBEntryType entry_type;
+
+ entry = (RhythmDBEntry *)l->data;
+ entry_type = rhythmdb_entry_get_entry_type (entry);
+
+ if (entry_type == RHYTHMDB_ENTRY_TYPE_IRADIO_STATION ||
+ entry_type == RHYTHMDB_ENTRY_TYPE_PODCAST_FEED )
+ continue;
+
+ LIBMTP_track_t *song = add_song_to_mtp(priv->device,entry);
+
+ add_mtp_song_to_db(RB_MTP_SOURCE(source),db,song);
+ }
+}
+
+static gboolean
+impl_receive_drag (RBSource *asource, GtkSelectionData *data)
+{
+ RBBrowserSource *source = RB_BROWSER_SOURCE (asource);
+ GList *list, *i;
+ GList *entries = NULL;
+ RBShell *shell;
+ RhythmDB *db;
+
+ rb_debug ("parsing uri list");
+ list = rb_uri_list_parse ((const char *) data->data);
+
+ g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+ g_object_get (G_OBJECT (shell), "db", &db, NULL);
+ g_object_unref (G_OBJECT (shell));
+
+ for (i = list; i != NULL; i = g_list_next (i)) {
+ if (i->data != NULL) {
+ char *uri = i->data;
+ RhythmDBEntry *entry;
+
+ entry = rhythmdb_entry_lookup_by_location (db, uri);
+
+ if (entry == NULL) {
+ /* add to the library */
+ g_print ("Where does that come from?\n");
+ } else {
+ /* add to list of entries to copy */
+ entries = g_list_prepend (entries, entry);
+ }
+
+ g_free (uri);
+ }
+ }
+ g_object_unref (db);
+ g_list_free (list);
+
+ if (entries) {
+ entries = g_list_reverse (entries);
+ if (rb_source_can_paste (asource))
+ rb_source_paste (asource, entries);
+ g_list_free (entries);
+ }
+
+ return TRUE;
+}
+
+static void
+remove_track_from_db (LIBMTP_mtpdevice_t *device, LIBMTP_track_t *track)
+{
+ //GList *it;
+
+ //for (it = track->itdb->playlists; it != NULL; it = it->next) {
+ // itdb_playlist_remove_track ((Itdb_Playlist *)it->data, track);
+ //}
+ g_print ("DELETE TRACK");
+ //dump_trackinfo(track);
+ g_print("id: %i", track->item_id);
+
+ LIBMTP_Delete_File(device, track->item_id);
+}
+
+static void
+impl_move_to_trash (RBSource *asource)
+{
+ GList *sel, *tem;
+ RBEntryView *songs;
+ RBShell *shell;
+ RhythmDB *db;
+ RBmtpSourcePrivate *priv = MTP_SOURCE_GET_PRIVATE (asource);
+ RBmtpSource *source = RB_MTP_SOURCE (asource);
+ LIBMTP_mtpdevice_t *device = priv->device;
+
+ g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+ g_object_get (G_OBJECT (shell), "db", &db, NULL);
+ g_object_unref (G_OBJECT (shell));
+
+ songs = rb_source_get_entry_view (RB_SOURCE (asource));
+ sel = rb_entry_view_get_selected_entries (songs);
+ for (tem = sel; tem != NULL; tem = tem->next) {
+ RhythmDBEntry *entry;
+ const gchar *uri;
+ LIBMTP_track_t *track;
+
+ entry = (RhythmDBEntry *)tem->data;
+ uri = rhythmdb_entry_get_string (entry,
+ RHYTHMDB_PROP_LOCATION);
+ track = g_hash_table_lookup (priv->entry_map, entry);
+ if (track == NULL) {
+ g_warning ("Couldn't find track on mtp-device! (%s)", uri);
+ continue;
+ }
+
+ remove_track_from_db (device,track);
+ g_hash_table_remove (priv->entry_map, entry);
+ rhythmdb_entry_move_to_trash (db, entry);
+ rhythmdb_commit (db);
+ }
+
+ g_list_free (sel);
+}
+
+static gboolean
+impl_show_popup (RBSource *source)
+{
+ _rb_source_show_popup (RB_SOURCE (source), "/MTPSourcePopup");
+ return TRUE;
+}
+
--- /dev/null 2006-05-22 16:25:23.000000000 +0200
+++ data/ui/mtp-ui.xml 2006-06-12 19:49:07.000000000 +0200
@@ -0,0 +1,5 @@
+<ui>
+ <popup name="MTPSourcePopup">
+ <menuitem name="MTPSrcPopupEject" action="MTPSourceEject"/>
+ </popup>
+</ui>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]