summaryrefslogtreecommitdiff
path: root/libs/taglib/taglib/mpeg/id3v2/frames
diff options
context:
space:
mode:
Diffstat (limited to 'libs/taglib/taglib/mpeg/id3v2/frames')
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt11
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/Makefile.am31
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/Makefile.in656
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp170
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h220
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp178
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.h168
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp176
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h174
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp236
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h274
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp271
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h258
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp118
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h113
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp84
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.h79
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp162
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h157
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp192
-rw-r--r--libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h172
21 files changed, 3900 insertions, 0 deletions
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt b/libs/taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt
new file mode 100644
index 0000000000..1fb1e20868
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt
@@ -0,0 +1,11 @@
+INSTALL(FILES
+ attachedpictureframe.h
+ commentsframe.h
+ generalencapsulatedobjectframe.h
+ relativevolumeframe.h
+ textidentificationframe.h
+ uniquefileidentifierframe.h
+ unknownframe.h
+ unsynchronizedlyricsframe.h
+ urllinkframe.h
+ DESTINATION ${INCLUDE_INSTALL_DIR}/taglib)
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.am b/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.am
new file mode 100644
index 0000000000..517cd75386
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.am
@@ -0,0 +1,31 @@
+INCLUDES = \
+ -I$(top_srcdir)/taglib \
+ -I$(top_srcdir)/taglib/toolkit \
+ -I$(top_srcdir)/taglib/mpeg/id3v2 \
+ $(all_includes)
+
+noinst_LTLIBRARIES = libframes.la
+
+libframes_la_SOURCES = \
+ attachedpictureframe.cpp \
+ commentsframe.cpp \
+ generalencapsulatedobjectframe.cpp \
+ relativevolumeframe.cpp \
+ textidentificationframe.cpp \
+ uniquefileidentifierframe.cpp \
+ unknownframe.cpp \
+ unsynchronizedlyricsframe.cpp \
+ urllinkframe.cpp
+
+taglib_include_HEADERS = \
+ attachedpictureframe.h \
+ commentsframe.h \
+ generalencapsulatedobjectframe.h \
+ relativevolumeframe.h \
+ textidentificationframe.h \
+ uniquefileidentifierframe.h \
+ unknownframe.h \
+ unsynchronizedlyricsframe.h \
+ urllinkframe.h
+
+taglib_includedir = $(includedir)/taglib
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.in b/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.in
new file mode 100644
index 0000000000..9268ff5e8d
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/Makefile.in
@@ -0,0 +1,656 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# KDE tags expanded automatically by am_edit - $Revision: 483858 $
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006 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@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = taglib/mpeg/id3v2/frames
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(taglib_include_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libframes_la_LIBADD =
+am_libframes_la_OBJECTS = attachedpictureframe.lo commentsframe.lo \
+ generalencapsulatedobjectframe.lo relativevolumeframe.lo \
+ textidentificationframe.lo uniquefileidentifierframe.lo \
+ unknownframe.lo unsynchronizedlyricsframe.lo urllinkframe.lo
+#>- libframes_la_OBJECTS = $(am_libframes_la_OBJECTS)
+#>+ 7
+libframes_la_final_OBJECTS = libframes_la.all_cpp.lo
+libframes_la_nofinal_OBJECTS = attachedpictureframe.lo commentsframe.lo \
+ generalencapsulatedobjectframe.lo relativevolumeframe.lo \
+ textidentificationframe.lo uniquefileidentifierframe.lo \
+ unknownframe.lo unsynchronizedlyricsframe.lo urllinkframe.lo
+@KDE_USE_FINAL_FALSE@libframes_la_OBJECTS = $(libframes_la_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libframes_la_OBJECTS = $(libframes_la_final_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/admin/depcomp
+am__depfiles_maybe = depfiles
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 2
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+#>- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 3
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+#>- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+#>- $(LDFLAGS) -o $@
+#>+ 3
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(libframes_la_SOURCES)
+DIST_SOURCES = $(libframes_la_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(taglib_includedir)"
+taglib_includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(taglib_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 1
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTODIRS = @AUTODIRS@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GREP = @GREP@
+HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
+KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
+KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
+LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NOOPT_CFLAGS = @NOOPT_CFLAGS@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+OBJEXT = @OBJEXT@
+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@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TOPSUBDIRS = @TOPSUBDIRS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+VERSION = @VERSION@
+WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+INCLUDES = \
+ -I$(top_srcdir)/taglib \
+ -I$(top_srcdir)/taglib/toolkit \
+ -I$(top_srcdir)/taglib/mpeg/id3v2 \
+ $(all_includes)
+
+noinst_LTLIBRARIES = libframes.la
+libframes_la_SOURCES = \
+ attachedpictureframe.cpp \
+ commentsframe.cpp \
+ generalencapsulatedobjectframe.cpp \
+ relativevolumeframe.cpp \
+ textidentificationframe.cpp \
+ uniquefileidentifierframe.cpp \
+ unknownframe.cpp \
+ unsynchronizedlyricsframe.cpp \
+ urllinkframe.cpp
+
+taglib_include_HEADERS = \
+ attachedpictureframe.h \
+ commentsframe.h \
+ generalencapsulatedobjectframe.h \
+ relativevolumeframe.h \
+ textidentificationframe.h \
+ uniquefileidentifierframe.h \
+ unknownframe.h \
+ unsynchronizedlyricsframe.h \
+ urllinkframe.h
+
+taglib_includedir = $(includedir)/taglib
+#>- all: all-am
+#>+ 1
+all: docs-am all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+#>- @for dep in $?; do \
+#>- case '$(am__configure_deps)' in \
+#>- *$$dep*) \
+#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+#>- && exit 0; \
+#>- exit 1;; \
+#>- esac; \
+#>- done; \
+#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile'; \
+#>- cd $(top_srcdir) && \
+#>- $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile
+#>+ 12
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile
+ cd $(top_srcdir) && perl admin/am_edit taglib/mpeg/id3v2/frames/Makefile.in
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_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
+libframes.la: $(libframes_la_OBJECTS) $(libframes_la_DEPENDENCIES)
+ $(CXXLINK) $(libframes_la_OBJECTS) $(libframes_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attachedpictureframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentsframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalencapsulatedobjectframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relativevolumeframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textidentificationframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniquefileidentifierframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unknownframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsynchronizedlyricsframe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/urllinkframe.Plo@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-taglib_includeHEADERS: $(taglib_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(taglib_includedir)" || $(MKDIR_P) "$(DESTDIR)$(taglib_includedir)"
+ @list='$(taglib_include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(taglib_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(taglib_includedir)/$$f'"; \
+ $(taglib_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(taglib_includedir)/$$f"; \
+ done
+
+uninstall-taglib_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(taglib_include_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(taglib_includedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(taglib_includedir)/$$f"; \
+ done
+
+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: TAGS
+
+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; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+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
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ 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) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(taglib_includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+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:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+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
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+#>- clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+#>- mostlyclean-am
+#>+ 2
+clean-am: clean-bcheck clean-final clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-taglib_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+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-taglib_includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-taglib_includeHEADERS 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-taglib_includeHEADERS
+
+# 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:
+
+#>+ 2
+KDE_DIST=Makefile.in CMakeLists.txt Makefile.am
+
+#>+ 2
+docs-am:
+
+#>+ 15
+force-reedit:
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu taglib/mpeg/id3v2/frames/Makefile
+ cd $(top_srcdir) && perl admin/am_edit taglib/mpeg/id3v2/frames/Makefile.in
+
+
+#>+ 21
+clean-bcheck:
+ rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
+
+bcheck: bcheck-am
+
+bcheck-am:
+ @for i in $(taglib_include_HEADERS); do \
+ if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
+ echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
+ echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
+ echo "$$i"; \
+ if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
+ rm -f $$i.bchecktest.cc; exit 1; \
+ fi ; \
+ echo "" >> $$i.bchecktest.cc.class; \
+ perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
+ rm -f a.out; \
+ fi ; \
+ done
+
+
+#>+ 11
+libframes_la.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/attachedpictureframe.cpp $(srcdir)/commentsframe.cpp $(srcdir)/generalencapsulatedobjectframe.cpp $(srcdir)/relativevolumeframe.cpp $(srcdir)/textidentificationframe.cpp $(srcdir)/uniquefileidentifierframe.cpp $(srcdir)/unknownframe.cpp $(srcdir)/unsynchronizedlyricsframe.cpp $(srcdir)/urllinkframe.cpp
+ @echo 'creating libframes_la.all_cpp.cpp ...'; \
+ rm -f libframes_la.all_cpp.files libframes_la.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libframes_la.all_cpp.final; \
+ for file in attachedpictureframe.cpp commentsframe.cpp generalencapsulatedobjectframe.cpp relativevolumeframe.cpp textidentificationframe.cpp uniquefileidentifierframe.cpp unknownframe.cpp unsynchronizedlyricsframe.cpp urllinkframe.cpp ; do \
+ echo "#include \"$$file\"" >> libframes_la.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libframes_la.all_cpp.final; \
+ done; \
+ cat libframes_la.all_cpp.final libframes_la.all_cpp.files > libframes_la.all_cpp.cpp; \
+ rm -f libframes_la.all_cpp.final libframes_la.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libframes_la.all_cpp.cpp
+
+#>+ 3
+final:
+ $(MAKE) libframes_la_OBJECTS="$(libframes_la_final_OBJECTS)" all-am
+
+#>+ 3
+final-install:
+ $(MAKE) libframes_la_OBJECTS="$(libframes_la_final_OBJECTS)" install-am
+
+#>+ 3
+no-final:
+ $(MAKE) libframes_la_OBJECTS="$(libframes_la_nofinal_OBJECTS)" all-am
+
+#>+ 3
+no-final-install:
+ $(MAKE) libframes_la_OBJECTS="$(libframes_la_nofinal_OBJECTS)" install-am
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
+
+#>+ 3
+nmcheck:
+nmcheck-am: nmcheck
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp
new file mode 100644
index 0000000000..8a88253f5c
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp
@@ -0,0 +1,170 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include "attachedpictureframe.h"
+
+#include <tstringlist.h>
+#include <tdebug.h>
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class AttachedPictureFrame::AttachedPictureFramePrivate
+{
+public:
+ AttachedPictureFramePrivate() : textEncoding(String::Latin1),
+ type(AttachedPictureFrame::Other) {}
+
+ String::Type textEncoding;
+ String mimeType;
+ AttachedPictureFrame::Type type;
+ String description;
+ ByteVector data;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+AttachedPictureFrame::AttachedPictureFrame() : Frame("APIC")
+{
+ d = new AttachedPictureFramePrivate;
+}
+
+AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data) : Frame(data)
+{
+ d = new AttachedPictureFramePrivate;
+ setData(data);
+}
+
+AttachedPictureFrame::~AttachedPictureFrame()
+{
+ delete d;
+}
+
+String AttachedPictureFrame::toString() const
+{
+ String s = "[" + d->mimeType + "]";
+ return d->description.isEmpty() ? s : d->description + " " + s;
+}
+
+String::Type AttachedPictureFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void AttachedPictureFrame::setTextEncoding(String::Type t)
+{
+ d->textEncoding = t;
+}
+
+String AttachedPictureFrame::mimeType() const
+{
+ return d->mimeType;
+}
+
+void AttachedPictureFrame::setMimeType(const String &m)
+{
+ d->mimeType = m;
+}
+
+AttachedPictureFrame::Type AttachedPictureFrame::type() const
+{
+ return d->type;
+}
+
+void AttachedPictureFrame::setType(Type t)
+{
+ d->type = t;
+}
+
+String AttachedPictureFrame::description() const
+{
+ return d->description;
+}
+
+void AttachedPictureFrame::setDescription(const String &desc)
+{
+ d->description = desc;
+}
+
+ByteVector AttachedPictureFrame::picture() const
+{
+ return d->data;
+}
+
+void AttachedPictureFrame::setPicture(const ByteVector &p)
+{
+ d->data = p;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void AttachedPictureFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 5) {
+ debug("A picture frame must contain at least 5 bytes.");
+ return;
+ }
+
+ d->textEncoding = String::Type(data[0]);
+
+ int pos = 1;
+
+ d->mimeType = readStringField(data, String::Latin1, &pos);
+ d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++];
+ d->description = readStringField(data, d->textEncoding, &pos);
+
+ d->data = data.mid(pos);
+}
+
+ByteVector AttachedPictureFrame::renderFields() const
+{
+ ByteVector data;
+
+ String::Type encoding = checkEncoding(d->description, d->textEncoding);
+
+ data.append(char(encoding));
+ data.append(d->mimeType.data(String::Latin1));
+ data.append(textDelimiter(String::Latin1));
+ data.append(char(d->type));
+ data.append(d->description.data(encoding));
+ data.append(textDelimiter(encoding));
+ data.append(d->data);
+
+ return data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new AttachedPictureFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h
new file mode 100644
index 0000000000..bd95ed22d2
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h
@@ -0,0 +1,220 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_ATTACHEDPICTUREFRAME_H
+#define TAGLIB_ATTACHEDPICTUREFRAME_H
+
+#include <id3v2frame.h>
+#include <id3v2header.h>
+#include "taglib_export.h"
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! An ID3v2 attached picture frame implementation
+
+ /*!
+ * This is an implementation of ID3v2 attached pictures. Pictures may be
+ * included in tags, one per APIC frame (but there may be multiple APIC
+ * frames in a single tag). These pictures are usually in either JPEG or
+ * PNG format.
+ */
+
+ class TAGLIB_EXPORT AttachedPictureFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+
+ /*!
+ * This describes the function or content of the picture.
+ */
+ enum Type {
+ //! A type not enumerated below
+ Other = 0x00,
+ //! 32x32 PNG image that should be used as the file icon
+ FileIcon = 0x01,
+ //! File icon of a different size or format
+ OtherFileIcon = 0x02,
+ //! Front cover image of the album
+ FrontCover = 0x03,
+ //! Back cover image of the album
+ BackCover = 0x04,
+ //! Inside leaflet page of the album
+ LeafletPage = 0x05,
+ //! Image from the album itself
+ Media = 0x06,
+ //! Picture of the lead artist or soloist
+ LeadArtist = 0x07,
+ //! Picture of the artist or performer
+ Artist = 0x08,
+ //! Picture of the conductor
+ Conductor = 0x09,
+ //! Picture of the band or orchestra
+ Band = 0x0A,
+ //! Picture of the composer
+ Composer = 0x0B,
+ //! Picture of the lyricist or text writer
+ Lyricist = 0x0C,
+ //! Picture of the recording location or studio
+ RecordingLocation = 0x0D,
+ //! Picture of the artists during recording
+ DuringRecording = 0x0E,
+ //! Picture of the artists during performance
+ DuringPerformance = 0x0F,
+ //! Picture from a movie or video related to the track
+ MovieScreenCapture = 0x10,
+ //! Picture of a large, coloured fish
+ ColouredFish = 0x11,
+ //! Illustration related to the track
+ Illustration = 0x12,
+ //! Logo of the band or performer
+ BandLogo = 0x13,
+ //! Logo of the publisher (record company)
+ PublisherLogo = 0x14
+ };
+
+ /*!
+ * Constructs an empty picture frame. The description, content and text
+ * encoding should be set manually.
+ */
+ AttachedPictureFrame();
+
+ /*!
+ * Constructs an AttachedPicture frame based on \a data.
+ */
+ explicit AttachedPictureFrame(const ByteVector &data);
+
+ /*!
+ * Destroys the AttahcedPictureFrame instance.
+ */
+ virtual ~AttachedPictureFrame();
+
+ /*!
+ * Returns a string containing the description and mime-type
+ */
+ virtual String toString() const;
+
+ /*!
+ * Returns the text encoding used for the description.
+ *
+ * \see setTextEncoding()
+ * \see description()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Set the text encoding used for the description.
+ *
+ * \see description()
+ */
+ void setTextEncoding(String::Type t);
+
+ /*!
+ * Returns the mime type of the image. This should in most cases be
+ * "image/png" or "image/jpeg".
+ */
+ String mimeType() const;
+
+ /*!
+ * Sets the mime type of the image. This should in most cases be
+ * "image/png" or "image/jpeg".
+ */
+ void setMimeType(const String &m);
+
+ /*!
+ * Returns the type of the image.
+ *
+ * \see Type
+ * \see setType()
+ */
+ Type type() const;
+
+ /*!
+ * Sets the type for the image.
+ *
+ * \see Type
+ * \see type()
+ */
+ void setType(Type t);
+
+ /*!
+ * Returns a text description of the image.
+ *
+ * \see setDescription()
+ * \see textEncoding()
+ * \see setTextEncoding()
+ */
+
+ String description() const;
+
+ /*!
+ * Sets a textual description of the image to \a desc.
+ *
+ * \see description()
+ * \see textEncoding()
+ * \see setTextEncoding()
+ */
+
+ void setDescription(const String &desc);
+
+ /*!
+ * Returns the image data as a ByteVector.
+ *
+ * \note ByteVector has a data() method that returns a const char * which
+ * should make it easy to export this data to external programs.
+ *
+ * \see setPicture()
+ * \see mimeType()
+ */
+ ByteVector picture() const;
+
+ /*!
+ * Sets the image data to \a p. \a p should be of the type specified in
+ * this frame's mime-type specification.
+ *
+ * \see picture()
+ * \see mimeType()
+ * \see setMimeType()
+ */
+ void setPicture(const ByteVector &p);
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ AttachedPictureFrame(const ByteVector &data, Header *h);
+ AttachedPictureFrame(const AttachedPictureFrame &);
+ AttachedPictureFrame &operator=(const AttachedPictureFrame &);
+
+ class AttachedPictureFramePrivate;
+ AttachedPictureFramePrivate *d;
+ };
+ }
+}
+
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp
new file mode 100644
index 0000000000..2df176bde0
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp
@@ -0,0 +1,178 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tbytevectorlist.h>
+#include <id3v2tag.h>
+#include <tdebug.h>
+#include <tstringlist.h>
+
+#include "commentsframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class CommentsFrame::CommentsFramePrivate
+{
+public:
+ CommentsFramePrivate() : textEncoding(String::Latin1) {}
+ String::Type textEncoding;
+ ByteVector language;
+ String description;
+ String text;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+CommentsFrame::CommentsFrame(String::Type encoding) : Frame("COMM")
+{
+ d = new CommentsFramePrivate;
+ d->textEncoding = encoding;
+}
+
+CommentsFrame::CommentsFrame(const ByteVector &data) : Frame(data)
+{
+ d = new CommentsFramePrivate;
+ setData(data);
+}
+
+CommentsFrame::~CommentsFrame()
+{
+ delete d;
+}
+
+String CommentsFrame::toString() const
+{
+ return d->text;
+}
+
+ByteVector CommentsFrame::language() const
+{
+ return d->language;
+}
+
+String CommentsFrame::description() const
+{
+ return d->description;
+}
+
+String CommentsFrame::text() const
+{
+ return d->text;
+}
+
+void CommentsFrame::setLanguage(const ByteVector &languageEncoding)
+{
+ d->language = languageEncoding.mid(0, 3);
+}
+
+void CommentsFrame::setDescription(const String &s)
+{
+ d->description = s;
+}
+
+void CommentsFrame::setText(const String &s)
+{
+ d->text = s;
+}
+
+String::Type CommentsFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void CommentsFrame::setTextEncoding(String::Type encoding)
+{
+ d->textEncoding = encoding;
+}
+
+CommentsFrame *CommentsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static
+{
+ ID3v2::FrameList comments = tag->frameList("COMM");
+
+ for(ID3v2::FrameList::ConstIterator it = comments.begin();
+ it != comments.end();
+ ++it)
+ {
+ CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it);
+ if(frame && frame->description() == d)
+ return frame;
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void CommentsFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 5) {
+ debug("A comment frame must contain at least 5 bytes.");
+ return;
+ }
+
+ d->textEncoding = String::Type(data[0]);
+ d->language = data.mid(1, 3);
+
+ int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2;
+
+ ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2);
+
+ if(l.size() == 2) {
+ d->description = String(l.front(), d->textEncoding);
+ d->text = String(l.back(), d->textEncoding);
+ }
+}
+
+ByteVector CommentsFrame::renderFields() const
+{
+ ByteVector v;
+
+ String::Type encoding = d->textEncoding;
+
+ encoding = checkEncoding(d->description, encoding);
+ encoding = checkEncoding(d->text, encoding);
+
+ v.append(char(encoding));
+ v.append(d->language.size() == 3 ? d->language : "XXX");
+ v.append(d->description.data(encoding));
+ v.append(textDelimiter(encoding));
+ v.append(d->text.data(encoding));
+
+ return v;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+CommentsFrame::CommentsFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new CommentsFramePrivate();
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.h
new file mode 100644
index 0000000000..9123c739be
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/commentsframe.h
@@ -0,0 +1,168 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_COMMENTSFRAME_H
+#define TAGLIB_COMMENTSFRAME_H
+
+#include <id3v2frame.h>
+#include "taglib_export.h"
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! An implementation of ID3v2 comments
+
+ /*!
+ * This implements the ID3v2 comment format. An ID3v2 comment concists of
+ * a language encoding, a description and a single text field.
+ */
+
+ class TAGLIB_EXPORT CommentsFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Construct an empty comment frame that will use the text encoding
+ * \a encoding.
+ */
+ explicit CommentsFrame(String::Type encoding = String::Latin1);
+
+ /*!
+ * Construct a comment based on the data in \a data.
+ */
+ explicit CommentsFrame(const ByteVector &data);
+
+ /*!
+ * Destroys this CommentFrame instance.
+ */
+ virtual ~CommentsFrame();
+
+ /*!
+ * Returns the text of this comment.
+ *
+ * \see text()
+ */
+ virtual String toString() const;
+
+ /*!
+ * Returns the language encoding as a 3 byte encoding as specified by
+ * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>.
+ *
+ * \note Most taggers simply ignore this value.
+ *
+ * \see setLanguage()
+ */
+ ByteVector language() const;
+
+ /*!
+ * Returns the description of this comment.
+ *
+ * \note Most taggers simply ignore this value.
+ *
+ * \see setDescription()
+ */
+ String description() const;
+
+ /*!
+ * Returns the text of this comment.
+ *
+ * \see setText()
+ */
+ String text() const;
+
+ /*!
+ * Set the language using the 3 byte language code from
+ * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to
+ * \a languageCode.
+ *
+ * \see language()
+ */
+ void setLanguage(const ByteVector &languageCode);
+
+ /*!
+ * Sets the description of the comment to \a s.
+ *
+ * \see decription()
+ */
+ void setDescription(const String &s);
+
+ /*!
+ * Sets the text portion of the comment to \a s.
+ *
+ * \see text()
+ */
+ virtual void setText(const String &s);
+
+ /*!
+ * Returns the text encoding that will be used in rendering this frame.
+ * This defaults to the type that was either specified in the constructor
+ * or read from the frame when parsed.
+ *
+ * \see setTextEncoding()
+ * \see render()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Sets the text encoding to be used when rendering this frame to
+ * \a encoding.
+ *
+ * \see textEncoding()
+ * \see render()
+ */
+ void setTextEncoding(String::Type encoding);
+
+ /*!
+ * Comments each have a unique description. This searches for a comment
+ * frame with the decription \a d and returns a pointer to it. If no
+ * frame is found that matches the given description null is returned.
+ *
+ * \see description()
+ */
+ static CommentsFrame *findByDescription(const Tag *tag, const String &d);
+
+ protected:
+ // Reimplementations.
+
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ /*!
+ * The constructor used by the FrameFactory.
+ */
+ CommentsFrame(const ByteVector &data, Header *h);
+ CommentsFrame(const CommentsFrame &);
+ CommentsFrame &operator=(const CommentsFrame &);
+
+ class CommentsFramePrivate;
+ CommentsFramePrivate *d;
+ };
+
+ }
+}
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp
new file mode 100644
index 0000000000..58b7b63f68
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp
@@ -0,0 +1,176 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Aaron VonderHaar
+ email : avh4@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tdebug.h>
+
+#include "generalencapsulatedobjectframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate
+{
+public:
+ GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {}
+
+ String::Type textEncoding;
+ String mimeType;
+ String fileName;
+ String description;
+ ByteVector data;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : Frame("GEOB")
+{
+ d = new GeneralEncapsulatedObjectFramePrivate;
+}
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : Frame(data)
+{
+ d = new GeneralEncapsulatedObjectFramePrivate;
+ setData(data);
+}
+
+GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame()
+{
+ delete d;
+}
+
+String GeneralEncapsulatedObjectFrame::toString() const
+{
+ String text = "[" + d->mimeType + "]";
+
+ if(!d->fileName.isEmpty())
+ text += " " + d->fileName;
+
+ if(!d->description.isEmpty())
+ text += " \"" + d->description + "\"";
+
+ return text;
+}
+
+String::Type GeneralEncapsulatedObjectFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding)
+{
+ d->textEncoding = encoding;
+}
+
+String GeneralEncapsulatedObjectFrame::mimeType() const
+{
+ return d->mimeType;
+}
+
+void GeneralEncapsulatedObjectFrame::setMimeType(const String &type)
+{
+ d->mimeType = type;
+}
+
+String GeneralEncapsulatedObjectFrame::fileName() const
+{
+ return d->fileName;
+}
+
+void GeneralEncapsulatedObjectFrame::setFileName(const String &name)
+{
+ d->fileName = name;
+}
+
+String GeneralEncapsulatedObjectFrame::description() const
+{
+ return d->description;
+}
+
+void GeneralEncapsulatedObjectFrame::setDescription(const String &desc)
+{
+ d->description = desc;
+}
+
+ByteVector GeneralEncapsulatedObjectFrame::object() const
+{
+ return d->data;
+}
+
+void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data)
+{
+ d->data = data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 4) {
+ debug("An object frame must contain at least 4 bytes.");
+ return;
+ }
+
+ d->textEncoding = String::Type(data[0]);
+
+ int pos = 1;
+
+ d->mimeType = readStringField(data, String::Latin1, &pos);
+ d->fileName = readStringField(data, d->textEncoding, &pos);
+ d->description = readStringField(data, d->textEncoding, &pos);
+
+ d->data = data.mid(pos);
+}
+
+ByteVector GeneralEncapsulatedObjectFrame::renderFields() const
+{
+ ByteVector data;
+
+ data.append(char(d->textEncoding));
+ data.append(d->mimeType.data(String::Latin1));
+ data.append(textDelimiter(String::Latin1));
+ data.append(d->fileName.data(d->textEncoding));
+ data.append(textDelimiter(d->textEncoding));
+ data.append(d->description.data(d->textEncoding));
+ data.append(textDelimiter(d->textEncoding));
+ data.append(d->data);
+
+ return data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new GeneralEncapsulatedObjectFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h
new file mode 100644
index 0000000000..9b4edf5456
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h
@@ -0,0 +1,174 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Aaron VonderHaar
+ email : avh4@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H
+#define TAGLIB_GENERALENCAPSULATEDOBJECT_H
+
+#include <id3v2frame.h>
+#include <id3v2header.h>
+#include "taglib_export.h"
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! An ID3v2 general encapsulated object frame implementation
+
+ /*!
+ * This is an implementation of ID3v2 general encapsulated objects.
+ * Arbitrary binary data may be included in tags, stored in GEOB frames.
+ * There may be multiple GEOB frames in a single tag. Each GEOB it
+ * labelled with a content description (which may be blank), a required
+ * mime-type, and a file name (may be blank). The content description
+ * uniquely identifies the GEOB frame in the tag.
+ */
+
+ class TAGLIB_EXPORT GeneralEncapsulatedObjectFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+
+ /*!
+ * Constructs an empty object frame. The description, file name and text
+ * encoding should be set manually.
+ */
+ GeneralEncapsulatedObjectFrame();
+
+ /*!
+ * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data.
+ */
+ explicit GeneralEncapsulatedObjectFrame(const ByteVector &data);
+
+ /*!
+ * Destroys the GeneralEncapsulatedObjectFrame instance.
+ */
+ virtual ~GeneralEncapsulatedObjectFrame();
+
+ /*!
+ * Returns a string containing the description, file name and mime-type
+ */
+ virtual String toString() const;
+
+ /*!
+ * Returns the text encoding used for the description and file name.
+ *
+ * \see setTextEncoding()
+ * \see description()
+ * \see fileName()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Set the text encoding used for the description and file name.
+ *
+ * \see description()
+ * \see fileName()
+ */
+ void setTextEncoding(String::Type encoding);
+
+ /*!
+ * Returns the mime type of the object.
+ */
+ String mimeType() const;
+
+ /*!
+ * Sets the mime type of the object.
+ */
+ void setMimeType(const String &type);
+
+ /*!
+ * Returns the file name of the object.
+ *
+ * \see setFileName()
+ */
+ String fileName() const;
+
+ /*!
+ * Sets the file name for the object.
+ *
+ * \see fileName()
+ */
+ void setFileName(const String &name);
+
+ /*!
+ * Returns the content description of the object.
+ *
+ * \see setDescription()
+ * \see textEncoding()
+ * \see setTextEncoding()
+ */
+
+ String description() const;
+
+ /*!
+ * Sets the content description of the object to \a desc.
+ *
+ * \see description()
+ * \see textEncoding()
+ * \see setTextEncoding()
+ */
+
+ void setDescription(const String &desc);
+
+ /*!
+ * Returns the object data as a ByteVector.
+ *
+ * \note ByteVector has a data() method that returns a const char * which
+ * should make it easy to export this data to external programs.
+ *
+ * \see setObject()
+ * \see mimeType()
+ */
+ ByteVector object() const;
+
+ /*!
+ * Sets the object data to \a data. \a data should be of the type specified in
+ * this frame's mime-type specification.
+ *
+ * \see object()
+ * \see mimeType()
+ * \see setMimeType()
+ */
+ void setObject(const ByteVector &object);
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h);
+ GeneralEncapsulatedObjectFrame(const GeneralEncapsulatedObjectFrame &);
+ GeneralEncapsulatedObjectFrame &operator=(const GeneralEncapsulatedObjectFrame &);
+
+ class GeneralEncapsulatedObjectFramePrivate;
+ GeneralEncapsulatedObjectFramePrivate *d;
+ };
+ }
+}
+
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp
new file mode 100644
index 0000000000..8495197a60
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp
@@ -0,0 +1,236 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tdebug.h>
+#include <tmap.h>
+
+#include "relativevolumeframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+static inline int bitsToBytes(int i)
+{
+ return i % 8 == 0 ? i / 8 : (i - i % 8) / 8 + 1;
+}
+
+struct ChannelData
+{
+ ChannelData() : channelType(RelativeVolumeFrame::Other), volumeAdjustment(0) {}
+
+ RelativeVolumeFrame::ChannelType channelType;
+ short volumeAdjustment;
+ RelativeVolumeFrame::PeakVolume peakVolume;
+};
+
+class RelativeVolumeFrame::RelativeVolumeFramePrivate
+{
+public:
+ String identification;
+ Map<ChannelType, ChannelData> channels;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+RelativeVolumeFrame::RelativeVolumeFrame() : Frame("RVA2")
+{
+ d = new RelativeVolumeFramePrivate;
+}
+
+RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data) : Frame(data)
+{
+ d = new RelativeVolumeFramePrivate;
+ setData(data);
+}
+
+RelativeVolumeFrame::~RelativeVolumeFrame()
+{
+ delete d;
+}
+
+String RelativeVolumeFrame::toString() const
+{
+ return d->identification;
+}
+
+List<RelativeVolumeFrame::ChannelType> RelativeVolumeFrame::channels() const
+{
+ List<ChannelType> l;
+
+ Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin();
+ for(; it != d->channels.end(); ++it)
+ l.append((*it).first);
+
+ return l;
+}
+
+// deprecated
+
+RelativeVolumeFrame::ChannelType RelativeVolumeFrame::channelType() const
+{
+ return MasterVolume;
+}
+
+// deprecated
+
+void RelativeVolumeFrame::setChannelType(ChannelType)
+{
+
+}
+
+short RelativeVolumeFrame::volumeAdjustmentIndex(ChannelType type) const
+{
+ return d->channels.contains(type) ? d->channels[type].volumeAdjustment : 0;
+}
+
+short RelativeVolumeFrame::volumeAdjustmentIndex() const
+{
+ return volumeAdjustmentIndex(MasterVolume);
+}
+
+void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index, ChannelType type)
+{
+ d->channels[type].volumeAdjustment = index;
+}
+
+void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index)
+{
+ setVolumeAdjustmentIndex(index, MasterVolume);
+}
+
+float RelativeVolumeFrame::volumeAdjustment(ChannelType type) const
+{
+ return d->channels.contains(type) ? float(d->channels[type].volumeAdjustment) / float(512) : 0;
+}
+
+float RelativeVolumeFrame::volumeAdjustment() const
+{
+ return volumeAdjustment(MasterVolume);
+}
+
+void RelativeVolumeFrame::setVolumeAdjustment(float adjustment, ChannelType type)
+{
+ d->channels[type].volumeAdjustment = short(adjustment * float(512));
+}
+
+void RelativeVolumeFrame::setVolumeAdjustment(float adjustment)
+{
+ setVolumeAdjustment(adjustment, MasterVolume);
+}
+
+RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume(ChannelType type) const
+{
+ return d->channels.contains(type) ? d->channels[type].peakVolume : PeakVolume();
+}
+
+RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume() const
+{
+ return peakVolume(MasterVolume);
+}
+
+void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak, ChannelType type)
+{
+ d->channels[type].peakVolume = peak;
+}
+
+void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak)
+{
+ setPeakVolume(peak, MasterVolume);
+}
+
+String RelativeVolumeFrame::identification() const
+{
+ return d->identification;
+}
+
+void RelativeVolumeFrame::setIdentification(const String &s)
+{
+ d->identification = s;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void RelativeVolumeFrame::parseFields(const ByteVector &data)
+{
+ int pos = 0;
+ d->identification = readStringField(data, String::Latin1, &pos);
+
+ // Each channel is at least 4 bytes.
+
+ while(pos <= (int)data.size() - 4) {
+
+
+ ChannelType type = ChannelType(data[pos]);
+ pos += 1;
+
+ ChannelData &channel = d->channels[type];
+
+ channel.volumeAdjustment = data.mid(pos, 2).toShort();
+ pos += 2;
+
+ channel.peakVolume.bitsRepresentingPeak = data[pos];
+ pos += 1;
+
+ int bytes = bitsToBytes(channel.peakVolume.bitsRepresentingPeak);
+ channel.peakVolume.peakVolume = data.mid(pos, bytes);
+ pos += bytes;
+ }
+}
+
+ByteVector RelativeVolumeFrame::renderFields() const
+{
+ ByteVector data;
+
+ data.append(d->identification.data(String::Latin1));
+ data.append(textDelimiter(String::Latin1));
+
+ Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin();
+
+ for(; it != d->channels.end(); ++it) {
+ ChannelType type = (*it).first;
+ const ChannelData &channel = (*it).second;
+
+ data.append(char(type));
+ data.append(ByteVector::fromShort(channel.volumeAdjustment));
+ data.append(char(channel.peakVolume.bitsRepresentingPeak));
+ data.append(channel.peakVolume.peakVolume);
+ }
+
+ return data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new RelativeVolumeFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h
new file mode 100644
index 0000000000..f8521986bf
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h
@@ -0,0 +1,274 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_RELATIVEVOLUMEFRAME_H
+#define TAGLIB_RELATIVEVOLUMEFRAME_H
+
+#include <tlist.h>
+#include <id3v2frame.h>
+#include "taglib_export.h"
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! An ID3v2 relative volume adjustment frame implementation
+
+ /*!
+ * This is an implementation of ID3v2 relative volume adjustment. The
+ * presence of this frame makes it possible to specify an increase in volume
+ * for an audio file or specific audio tracks in that file.
+ *
+ * Multiple relative volume adjustment frames may be present in the tag
+ * each with a unique identification and describing volume adjustment for
+ * different channel types.
+ */
+
+ class TAGLIB_EXPORT RelativeVolumeFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+
+ /*!
+ * This indicates the type of volume adjustment that should be applied.
+ */
+ enum ChannelType {
+ //! A type not enumerated below
+ Other = 0x00,
+ //! The master volume for the track
+ MasterVolume = 0x01,
+ //! The front right audio channel
+ FrontRight = 0x02,
+ //! The front left audio channel
+ FrontLeft = 0x03,
+ //! The back right audio channel
+ BackRight = 0x04,
+ //! The back left audio channel
+ BackLeft = 0x05,
+ //! The front center audio channel
+ FrontCentre = 0x06,
+ //! The back center audio channel
+ BackCentre = 0x07,
+ //! The subwoofer audio channel
+ Subwoofer = 0x08
+ };
+
+ //! Struct that stores the relevant values for ID3v2 peak volume
+
+ /*!
+ * The peak volume is described as a series of bits that is padded to fill
+ * a block of bytes. These two values should always be updated in tandem.
+ */
+ struct PeakVolume
+ {
+ /*!
+ * Constructs an empty peak volume description.
+ */
+ PeakVolume() : bitsRepresentingPeak(0) {}
+ /*!
+ * The number of bits (in the range of 0 to 255) used to describe the
+ * peak volume.
+ */
+ unsigned char bitsRepresentingPeak;
+ /*!
+ * The array of bits (represented as a series of bytes) used to describe
+ * the peak volume.
+ */
+ ByteVector peakVolume;
+ };
+
+ /*!
+ * Constructs a RelativeVolumeFrame. The relevant data should be set
+ * manually.
+ */
+ RelativeVolumeFrame();
+
+ /*!
+ * Constructs a RelativeVolumeFrame based on the contents of \a data.
+ */
+ RelativeVolumeFrame(const ByteVector &data);
+
+ /*!
+ * Destroys the RelativeVolumeFrame instance.
+ */
+ virtual ~RelativeVolumeFrame();
+
+ /*!
+ * Returns the frame's identification.
+ *
+ * \see identification()
+ */
+ virtual String toString() const;
+
+ /*!
+ * Returns a list of channels with information currently in the frame.
+ */
+ List<ChannelType> channels() const;
+
+ /*!
+ * \deprecated Always returns master volume.
+ */
+ ChannelType channelType() const;
+
+ /*!
+ * \deprecated This method no longer has any effect.
+ */
+ void setChannelType(ChannelType t);
+
+ /*
+ * There was a terrible API goof here, and while this can't be changed to
+ * the way it appears below for binary compaibility reasons, let's at
+ * least pretend that it looks clean.
+ */
+
+#ifdef DOXYGEN
+
+ /*!
+ * Returns the relative volume adjustment "index". As indicated by the
+ * ID3v2 standard this is a 16-bit signed integer that reflects the
+ * decibils of adjustment when divided by 512.
+ *
+ * This defaults to returning the value for the master volume channel if
+ * available and returns 0 if the specified channel does not exist.
+ *
+ * \see setVolumeAdjustmentIndex()
+ * \see volumeAjustment()
+ */
+ short volumeAdjustmentIndex(ChannelType type = MasterVolume) const;
+
+ /*!
+ * Set the volume adjustment to \a index. As indicated by the ID3v2
+ * standard this is a 16-bit signed integer that reflects the decibils of
+ * adjustment when divided by 512.
+ *
+ * By default this sets the value for the master volume.
+ *
+ * \see volumeAdjustmentIndex()
+ * \see setVolumeAjustment()
+ */
+ void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume);
+
+ /*!
+ * Returns the relative volume adjustment in decibels.
+ *
+ * \note Because this is actually stored internally as an "index" to this
+ * value the value returned by this method may not be identical to the
+ * value set using setVolumeAdjustment().
+ *
+ * This defaults to returning the value for the master volume channel if
+ * available and returns 0 if the specified channel does not exist.
+ *
+ * \see setVolumeAdjustment()
+ * \see volumeAdjustmentIndex()
+ */
+ float volumeAdjustment(ChannelType type = MasterVolume) const;
+
+ /*!
+ * Set the relative volume adjustment in decibels to \a adjustment.
+ *
+ * By default this sets the value for the master volume.
+ *
+ * \note Because this is actually stored internally as an "index" to this
+ * value the value set by this method may not be identical to the one
+ * returned by volumeAdjustment().
+ *
+ * \see setVolumeAdjustment()
+ * \see volumeAdjustmentIndex()
+ */
+ void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume);
+
+ /*!
+ * Returns the peak volume (represented as a length and a string of bits).
+ *
+ * This defaults to returning the value for the master volume channel if
+ * available and returns 0 if the specified channel does not exist.
+ *
+ * \see setPeakVolume()
+ */
+ PeakVolume peakVolume(ChannelType type = MasterVolume) const;
+
+ /*!
+ * Sets the peak volume to \a peak.
+ *
+ * By default this sets the value for the master volume.
+ *
+ * \see peakVolume()
+ */
+ void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume);
+
+#else
+
+ // BIC: Combine each of the following pairs of functions (or maybe just
+ // rework this junk altogether).
+
+ short volumeAdjustmentIndex(ChannelType type) const;
+ short volumeAdjustmentIndex() const;
+
+ void setVolumeAdjustmentIndex(short index, ChannelType type);
+ void setVolumeAdjustmentIndex(short index);
+
+ float volumeAdjustment(ChannelType type) const;
+ float volumeAdjustment() const;
+
+ void setVolumeAdjustment(float adjustment, ChannelType type);
+ void setVolumeAdjustment(float adjustment);
+
+ PeakVolume peakVolume(ChannelType type) const;
+ PeakVolume peakVolume() const;
+
+ void setPeakVolume(const PeakVolume &peak, ChannelType type);
+ void setPeakVolume(const PeakVolume &peak);
+
+#endif
+
+ /*!
+ * Returns the identification for this frame.
+ */
+ String identification() const;
+
+ /*!
+ * Sets the identification of the frame to \a s. The string
+ * is used to identify the situation and/or device where this
+ * adjustment should apply.
+ */
+ void setIdentification(const String &s);
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ RelativeVolumeFrame(const ByteVector &data, Header *h);
+ RelativeVolumeFrame(const RelativeVolumeFrame &);
+ RelativeVolumeFrame &operator=(const RelativeVolumeFrame &);
+
+ class RelativeVolumeFramePrivate;
+ RelativeVolumeFramePrivate *d;
+ };
+
+ }
+}
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp
new file mode 100644
index 0000000000..7d3b4ff291
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp
@@ -0,0 +1,271 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tbytevectorlist.h>
+#include <id3v2tag.h>
+
+#include "textidentificationframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class TextIdentificationFrame::TextIdentificationFramePrivate
+{
+public:
+ TextIdentificationFramePrivate() : textEncoding(String::Latin1) {}
+ String::Type textEncoding;
+ StringList fieldList;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// TextIdentificationFrame public members
+////////////////////////////////////////////////////////////////////////////////
+
+TextIdentificationFrame::TextIdentificationFrame(const ByteVector &type, String::Type encoding) :
+ Frame(type)
+{
+ d = new TextIdentificationFramePrivate;
+ d->textEncoding = encoding;
+}
+
+TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data) :
+ Frame(data)
+{
+ d = new TextIdentificationFramePrivate;
+ setData(data);
+}
+
+TextIdentificationFrame::~TextIdentificationFrame()
+{
+ delete d;
+}
+
+void TextIdentificationFrame::setText(const StringList &l)
+{
+ d->fieldList = l;
+}
+
+void TextIdentificationFrame::setText(const String &s)
+{
+ d->fieldList = s;
+}
+
+String TextIdentificationFrame::toString() const
+{
+ return d->fieldList.toString();
+}
+
+StringList TextIdentificationFrame::fieldList() const
+{
+ return d->fieldList;
+}
+
+String::Type TextIdentificationFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void TextIdentificationFrame::setTextEncoding(String::Type encoding)
+{
+ d->textEncoding = encoding;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// TextIdentificationFrame protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void TextIdentificationFrame::parseFields(const ByteVector &data)
+{
+ // Don't try to parse invalid frames
+
+ if(data.size() < 2)
+ return;
+
+ // read the string data type (the first byte of the field data)
+
+ d->textEncoding = String::Type(data[0]);
+
+ // split the byte array into chunks based on the string type (two byte delimiter
+ // for unicode encodings)
+
+ int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2;
+
+ // build a small counter to strip nulls off the end of the field
+
+ int dataLength = data.size() - 1;
+
+ while(dataLength > 0 && data[dataLength] == 0)
+ dataLength--;
+
+ while(dataLength % byteAlign != 0)
+ dataLength++;
+
+ ByteVectorList l = ByteVectorList::split(data.mid(1, dataLength), textDelimiter(d->textEncoding), byteAlign);
+
+ d->fieldList.clear();
+
+ // append those split values to the list and make sure that the new string's
+ // type is the same specified for this frame
+
+ for(ByteVectorList::Iterator it = l.begin(); it != l.end(); it++) {
+ if(!(*it).isEmpty()) {
+ String s(*it, d->textEncoding);
+ d->fieldList.append(s);
+ }
+ }
+}
+
+ByteVector TextIdentificationFrame::renderFields() const
+{
+ String::Type encoding = checkEncoding(d->fieldList, d->textEncoding);
+
+ ByteVector v;
+
+ v.append(char(encoding));
+
+ for(StringList::ConstIterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) {
+
+ // Since the field list is null delimited, if this is not the first
+ // element in the list, append the appropriate delimiter for this
+ // encoding.
+
+ if(it != d->fieldList.begin())
+ v.append(textDelimiter(encoding));
+
+ v.append((*it).data(encoding));
+ }
+
+ return v;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// TextIdentificationFrame private members
+////////////////////////////////////////////////////////////////////////////////
+
+TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new TextIdentificationFramePrivate;
+ parseFields(fieldData(data));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// UserTextIdentificationFrame public members
+////////////////////////////////////////////////////////////////////////////////
+
+UserTextIdentificationFrame::UserTextIdentificationFrame(String::Type encoding) :
+ TextIdentificationFrame("TXXX", encoding),
+ d(0)
+{
+ StringList l;
+ l.append(String::null);
+ l.append(String::null);
+ setText(l);
+}
+
+
+UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data) :
+ TextIdentificationFrame(data)
+{
+ checkFields();
+}
+
+String UserTextIdentificationFrame::toString() const
+{
+ return "[" + description() + "] " + fieldList().toString();
+}
+
+String UserTextIdentificationFrame::description() const
+{
+ return !TextIdentificationFrame::fieldList().isEmpty()
+ ? TextIdentificationFrame::fieldList().front()
+ : String::null;
+}
+
+StringList UserTextIdentificationFrame::fieldList() const
+{
+ // TODO: remove this function
+
+ return TextIdentificationFrame::fieldList();
+}
+
+void UserTextIdentificationFrame::setText(const String &text)
+{
+ if(description().isEmpty())
+ setDescription(String::null);
+
+ TextIdentificationFrame::setText(StringList(description()).append(text));
+}
+
+void UserTextIdentificationFrame::setText(const StringList &fields)
+{
+ if(description().isEmpty())
+ setDescription(String::null);
+
+ TextIdentificationFrame::setText(StringList(description()).append(fields));
+}
+
+void UserTextIdentificationFrame::setDescription(const String &s)
+{
+ StringList l = fieldList();
+
+ if(l.isEmpty())
+ l.append(s);
+ else
+ l[0] = s;
+
+ TextIdentificationFrame::setText(l);
+}
+
+UserTextIdentificationFrame *UserTextIdentificationFrame::find(
+ ID3v2::Tag *tag, const String &description) // static
+{
+ FrameList l = tag->frameList("TXXX");
+ for(FrameList::Iterator it = l.begin(); it != l.end(); ++it) {
+ UserTextIdentificationFrame *f = dynamic_cast<UserTextIdentificationFrame *>(*it);
+ if(f && f->description() == description)
+ return f;
+ }
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// UserTextIdentificationFrame private members
+////////////////////////////////////////////////////////////////////////////////
+
+UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data, Header *h) :
+ TextIdentificationFrame(data, h)
+{
+ checkFields();
+}
+
+void UserTextIdentificationFrame::checkFields()
+{
+ int fields = fieldList().size();
+
+ if(fields == 0)
+ setDescription(String::null);
+ if(fields <= 1)
+ setText(String::null);
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h
new file mode 100644
index 0000000000..291cba5b8f
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h
@@ -0,0 +1,258 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_TEXTIDENTIFICATIONFRAME_H
+#define TAGLIB_TEXTIDENTIFICATIONFRAME_H
+
+#include <tstringlist.h>
+#include "taglib_export.h"
+
+#include <id3v2frame.h>
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ class Tag;
+
+ //! An ID3v2 text identification frame implementation
+
+ /*!
+ * This is an implementation of the most common type of ID3v2 frame -- text
+ * identification frames. There are a number of variations on this. Those
+ * enumerated in the ID3v2.4 standard are:
+ *
+ * <ul>
+ * <li><b>TALB</b> Album/Movie/Show title</li>
+ * <li><b>TBPM</b> BPM (beats per minute)</li>
+ * <li><b>TCOM</b> Composer</li>
+ * <li><b>TCON</b> Content type</li>
+ * <li><b>TCOP</b> Copyright message</li>
+ * <li><b>TDEN</b> Encoding time</li>
+ * <li><b>TDLY</b> Playlist delay</li>
+ * <li><b>TDOR</b> Original release time</li>
+ * <li><b>TDRC</b> Recording time</li>
+ * <li><b>TDRL</b> Release time</li>
+ * <li><b>TDTG</b> Tagging time</li>
+ * <li><b>TENC</b> Encoded by</li>
+ * <li><b>TEXT</b> Lyricist/Text writer</li>
+ * <li><b>TFLT</b> File type</li>
+ * <li><b>TIPL</b> Involved people list</li>
+ * <li><b>TIT1</b> Content group description</li>
+ * <li><b>TIT2</b> Title/songname/content description</li>
+ * <li><b>TIT3</b> Subtitle/Description refinement</li>
+ * <li><b>TKEY</b> Initial key</li>
+ * <li><b>TLAN</b> Language(s)</li>
+ * <li><b>TLEN</b> Length</li>
+ * <li><b>TMCL</b> Musician credits list</li>
+ * <li><b>TMED</b> Media type</li>
+ * <li><b>TMOO</b> Mood</li>
+ * <li><b>TOAL</b> Original album/movie/show title</li>
+ * <li><b>TOFN</b> Original filename</li>
+ * <li><b>TOLY</b> Original lyricist(s)/text writer(s)</li>
+ * <li><b>TOPE</b> Original artist(s)/performer(s)</li>
+ * <li><b>TOWN</b> File owner/licensee</li>
+ * <li><b>TPE1</b> Lead performer(s)/Soloist(s)</li>
+ * <li><b>TPE2</b> Band/orchestra/accompaniment</li>
+ * <li><b>TPE3</b> Conductor/performer refinement</li>
+ * <li><b>TPE4</b> Interpreted, remixed, or otherwise modified by</li>
+ * <li><b>TPOS</b> Part of a set</li>
+ * <li><b>TPRO</b> Produced notice</li>
+ * <li><b>TPUB</b> Publisher</li>
+ * <li><b>TRCK</b> Track number/Position in set</li>
+ * <li><b>TRSN</b> Internet radio station name</li>
+ * <li><b>TRSO</b> Internet radio station owner</li>
+ * <li><b>TSOA</b> Album sort order</li>
+ * <li><b>TSOP</b> Performer sort order</li>
+ * <li><b>TSOT</b> Title sort order</li>
+ * <li><b>TSRC</b> ISRC (international standard recording code)</li>
+ * <li><b>TSSE</b> Software/Hardware and settings used for encoding</li>
+ * <li><b>TSST</b> Set subtitle</li>
+ * </ul>
+ *
+ * The ID3v2 Frames document gives a description of each of these formats
+ * and the expected order of strings in each. ID3v2::Header::frameID() can
+ * be used to determine the frame type.
+ *
+ * \note If non-Latin1 compatible strings are used with this class, even if
+ * the text encoding is set to Latin1, the frame will be written using UTF8
+ * (with the encoding flag appropriately set in the output).
+ */
+
+ class TAGLIB_EXPORT TextIdentificationFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Construct an empty frame of type \a type. Uses \a encoding as the
+ * default text encoding.
+ *
+ * \note In this case you must specify the text encoding as it
+ * resolves the ambiguity between constructors.
+ *
+ * \note Please see the note in the class description regarding Latin1.
+ */
+ TextIdentificationFrame(const ByteVector &type, String::Type encoding);
+
+ /*!
+ * This is a dual purpose constructor. \a data can either be binary data
+ * that should be parsed or (at a minimum) the frame ID.
+ */
+ explicit TextIdentificationFrame(const ByteVector &data);
+
+ /*!
+ * Destroys this TextIdentificationFrame instance.
+ */
+ virtual ~TextIdentificationFrame();
+
+ /*!
+ * Text identification frames are a list of string fields.
+ *
+ * This function will accept either a StringList or a String (using the
+ * StringList constructor that accepts a single String).
+ *
+ * \note This will not change the text encoding of the frame even if the
+ * strings passed in are not of the same encoding. Please use
+ * setEncoding(s.type()) if you wish to change the encoding of the frame.
+ */
+ void setText(const StringList &l);
+
+ // Reimplementations.
+
+ virtual void setText(const String &s);
+ virtual String toString() const;
+
+ /*!
+ * Returns the text encoding that will be used in rendering this frame.
+ * This defaults to the type that was either specified in the constructor
+ * or read from the frame when parsed.
+ *
+ * \note Please see the note in the class description regarding Latin1.
+ *
+ * \see setTextEncoding()
+ * \see render()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Sets the text encoding to be used when rendering this frame to
+ * \a encoding.
+ *
+ * \note Please see the note in the class description regarding Latin1.
+ *
+ * \see textEncoding()
+ * \see render()
+ */
+ void setTextEncoding(String::Type encoding);
+
+ /*!
+ * Returns a list of the strings in this frame.
+ */
+ StringList fieldList() const;
+
+ protected:
+ // Reimplementations.
+
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ /*!
+ * The constructor used by the FrameFactory.
+ */
+ TextIdentificationFrame(const ByteVector &data, Header *h);
+
+ private:
+ TextIdentificationFrame(const TextIdentificationFrame &);
+ TextIdentificationFrame &operator=(const TextIdentificationFrame &);
+
+ class TextIdentificationFramePrivate;
+ TextIdentificationFramePrivate *d;
+ };
+
+ /*!
+ * This is a specialization of text identification frames that allows for
+ * user defined entries. Each entry has a description in addition to the
+ * normal list of fields that a text identification frame has.
+ *
+ * This description identifies the frame and must be unique.
+ */
+
+ //! An ID3v2 custom text identification frame implementationx
+
+ class TAGLIB_EXPORT UserTextIdentificationFrame : public TextIdentificationFrame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Constructs an empty user defined text identification frame. For this to be
+ * a useful frame both a description and text must be set.
+ */
+ explicit UserTextIdentificationFrame(String::Type encoding = String::Latin1);
+
+ /*!
+ * Creates a frame based on \a data.
+ */
+ explicit UserTextIdentificationFrame(const ByteVector &data);
+
+ virtual String toString() const;
+
+ /*!
+ * Returns the description for this frame.
+ */
+ String description() const;
+
+ /*!
+ * Sets the description of the frame to \a s. \a s must be unique. You can
+ * check for the presence of another user defined text frame of the same type
+ * using find() and testing for null.
+ */
+ void setDescription(const String &s);
+
+ StringList fieldList() const;
+ void setText(const String &text);
+ void setText(const StringList &fields);
+
+ /*!
+ * Searches for the user defined text frame with the description \a description
+ * in \a tag. This returns null if no matching frames were found.
+ */
+ static UserTextIdentificationFrame *find(Tag *tag, const String &description);
+
+ private:
+ UserTextIdentificationFrame(const ByteVector &data, Header *h);
+ UserTextIdentificationFrame(const TextIdentificationFrame &);
+ UserTextIdentificationFrame &operator=(const UserTextIdentificationFrame &);
+
+ void checkFields();
+
+ class UserTextIdentificationFramePrivate;
+ UserTextIdentificationFramePrivate *d;
+ };
+
+ }
+}
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp
new file mode 100644
index 0000000000..836982bdf1
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp
@@ -0,0 +1,118 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include <tbytevectorlist.h>
+#include <tdebug.h>
+
+#include "uniquefileidentifierframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate
+{
+public:
+ String owner;
+ ByteVector identifier;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public methods
+////////////////////////////////////////////////////////////////////////////////
+
+UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) :
+ ID3v2::Frame(data)
+{
+ d = new UniqueFileIdentifierFramePrivate;
+ setData(data);
+}
+
+UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) :
+ ID3v2::Frame("UFID")
+{
+ d = new UniqueFileIdentifierFramePrivate;
+ d->owner = owner;
+ d->identifier = id;
+}
+
+UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame()
+{
+ delete d;
+}
+
+String UniqueFileIdentifierFrame::owner() const
+{
+ return d->owner;
+}
+
+ByteVector UniqueFileIdentifierFrame::identifier() const
+{
+ return d->identifier;
+}
+
+void UniqueFileIdentifierFrame::setOwner(const String &s)
+{
+ d->owner = s;
+}
+
+void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v)
+{
+ d->identifier = v;
+}
+
+String UniqueFileIdentifierFrame::toString() const
+{
+ return String::null;
+}
+
+void UniqueFileIdentifierFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 1) {
+ debug("An UFID frame must contain at least 1 byte.");
+ return;
+ }
+
+ int pos = 0;
+ d->owner = readStringField(data, String::Latin1, &pos);
+ d->identifier = data.mid(pos);
+}
+
+ByteVector UniqueFileIdentifierFrame::renderFields() const
+{
+ ByteVector data;
+
+ data.append(d->owner.data(String::Latin1));
+ data.append(char(0));
+ data.append(d->identifier);
+
+ return data;
+}
+
+UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) :
+ Frame(h)
+{
+ d = new UniqueFileIdentifierFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h
new file mode 100644
index 0000000000..a0a66bb17d
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_UNIQUEFILEIDENTIFIERFRAME
+#define TAGLIB_UNIQUEFILEIDENTIFIERFRAME
+
+#include <id3v2frame.h>
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ /*!
+ * This is an implementation of ID3v2 unique file identifier frames. This
+ * frame is used to identify the file in an arbitrary database identified
+ * by the owner field.
+ */
+
+ //! An implementation of ID3v2 unique identifier frames
+
+ class TAGLIB_EXPORT UniqueFileIdentifierFrame : public ID3v2::Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Creates a uniqe file identifier frame based on \a data.
+ */
+ UniqueFileIdentifierFrame(const ByteVector &data);
+
+ /*!
+ * Creates a unique file identifier frame with the owner \a owner and
+ * the identification \a id.
+ */
+ UniqueFileIdentifierFrame(const String &owner, const ByteVector &id);
+
+ /*!
+ * Destroys the frame.
+ */
+ ~UniqueFileIdentifierFrame();
+
+ /*!
+ * Returns the owner for the frame; essentially this is the key for
+ * determining which identification scheme this key belongs to. This
+ * will usually either be an email address or URL for the person or tool
+ * used to create the unique identifier.
+ *
+ * \see setOwner()
+ */
+ String owner() const;
+
+ /*!
+ * Returns the unique identifier. Though sometimes this is a text string
+ * it also may be binary data and as much should be assumed when handling
+ * it.
+ */
+ ByteVector identifier() const;
+
+ /*!
+ * Sets the owner of the identification scheme to \a s.
+ *
+ * \see owner()
+ */
+ void setOwner(const String &s);
+
+ /*!
+ * Sets the unique file identifier to \a v.
+ *
+ * \see identifier()
+ */
+ void setIdentifier(const ByteVector &v);
+
+ virtual String toString() const;
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ UniqueFileIdentifierFrame(const UniqueFileIdentifierFrame &);
+ UniqueFileIdentifierFrame &operator=(UniqueFileIdentifierFrame &);
+
+ UniqueFileIdentifierFrame(const ByteVector &data, Header *h);
+
+ class UniqueFileIdentifierFramePrivate;
+ UniqueFileIdentifierFramePrivate *d;
+ };
+ }
+}
+
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp
new file mode 100644
index 0000000000..42b87c6916
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp
@@ -0,0 +1,84 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include "unknownframe.h"
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class UnknownFrame::UnknownFramePrivate
+{
+public:
+ ByteVector fieldData;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+UnknownFrame::UnknownFrame(const ByteVector &data) : Frame(data)
+{
+ d = new UnknownFramePrivate;
+ setData(data);
+}
+
+UnknownFrame::~UnknownFrame()
+{
+ delete d;
+}
+
+String UnknownFrame::toString() const
+{
+ return String::null;
+}
+
+ByteVector UnknownFrame::data() const
+{
+ return d->fieldData;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void UnknownFrame::parseFields(const ByteVector &data)
+{
+ d->fieldData = data;
+}
+
+ByteVector UnknownFrame::renderFields() const
+{
+ return d->fieldData;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+UnknownFrame::UnknownFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new UnknownFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.h
new file mode 100644
index 0000000000..164a44a00c
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/unknownframe.h
@@ -0,0 +1,79 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_UNKNOWNFRAME_H
+#define TAGLIB_UNKNOWNFRAME_H
+
+#include <id3v2frame.h>
+#include "taglib_export.h"
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! A frame type \e unknown to TagLib.
+
+ /*!
+ * This class represents a frame type not known (or more often simply
+ * unimplemented) in TagLib. This is here provide a basic API for
+ * manipulating the binary data of unknown frames and to provide a means
+ * of rendering such \e unknown frames.
+ *
+ * Please note that a cleaner way of handling frame types that TagLib
+ * does not understand is to subclass ID3v2::Frame and ID3v2::FrameFactory
+ * to have your frame type supported through the standard ID3v2 mechanism.
+ */
+
+ class TAGLIB_EXPORT UnknownFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ UnknownFrame(const ByteVector &data);
+ virtual ~UnknownFrame();
+
+ virtual String toString() const;
+
+ /*!
+ * Returns the field data (everything but the header) for this frame.
+ */
+ ByteVector data() const;
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ UnknownFrame(const ByteVector &data, Header *h);
+ UnknownFrame(const UnknownFrame &);
+ UnknownFrame &operator=(const UnknownFrame &);
+
+ class UnknownFramePrivate;
+ UnknownFramePrivate *d;
+ };
+
+ }
+}
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp
new file mode 100644
index 0000000000..4c907dd6e9
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp
@@ -0,0 +1,162 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Urs Fleisch
+ email : ufleisch@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include "unsynchronizedlyricsframe.h"
+#include <tbytevectorlist.h>
+#include <tdebug.h>
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class UnsynchronizedLyricsFrame::UnsynchronizedLyricsFramePrivate
+{
+public:
+ UnsynchronizedLyricsFramePrivate() : textEncoding(String::Latin1) {}
+ String::Type textEncoding;
+ ByteVector language;
+ String description;
+ String text;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(String::Type encoding) :
+ Frame("USLT")
+{
+ d = new UnsynchronizedLyricsFramePrivate;
+ d->textEncoding = encoding;
+}
+
+UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data) :
+ Frame(data)
+{
+ d = new UnsynchronizedLyricsFramePrivate;
+ setData(data);
+}
+
+UnsynchronizedLyricsFrame::~UnsynchronizedLyricsFrame()
+{
+ delete d;
+}
+
+String UnsynchronizedLyricsFrame::toString() const
+{
+ return d->text;
+}
+
+ByteVector UnsynchronizedLyricsFrame::language() const
+{
+ return d->language;
+}
+
+String UnsynchronizedLyricsFrame::description() const
+{
+ return d->description;
+}
+
+String UnsynchronizedLyricsFrame::text() const
+{
+ return d->text;
+}
+
+void UnsynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding)
+{
+ d->language = languageEncoding.mid(0, 3);
+}
+
+void UnsynchronizedLyricsFrame::setDescription(const String &s)
+{
+ d->description = s;
+}
+
+void UnsynchronizedLyricsFrame::setText(const String &s)
+{
+ d->text = s;
+}
+
+
+String::Type UnsynchronizedLyricsFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void UnsynchronizedLyricsFrame::setTextEncoding(String::Type encoding)
+{
+ d->textEncoding = encoding;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+void UnsynchronizedLyricsFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 5) {
+ debug("An unsynchronized lyrics frame must contain at least 5 bytes.");
+ return;
+ }
+
+ d->textEncoding = String::Type(data[0]);
+ d->language = data.mid(1, 3);
+
+ int byteAlign
+ = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2;
+
+ ByteVectorList l =
+ ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2);
+
+ if(l.size() == 2) {
+ d->description = String(l.front(), d->textEncoding);
+ d->text = String(l.back(), d->textEncoding);
+ }
+}
+
+ByteVector UnsynchronizedLyricsFrame::renderFields() const
+{
+ ByteVector v;
+
+ v.append(char(d->textEncoding));
+ v.append(d->language.size() == 3 ? d->language : "XXX");
+ v.append(d->description.data(d->textEncoding));
+ v.append(textDelimiter(d->textEncoding));
+ v.append(d->text.data(d->textEncoding));
+
+ return v;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data, Header *h)
+ : Frame(h)
+{
+ d = new UnsynchronizedLyricsFramePrivate();
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h
new file mode 100644
index 0000000000..28cc1e8c55
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h
@@ -0,0 +1,157 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Urs Fleisch
+ email : ufleisch@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H
+#define TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H
+
+#include <id3v2frame.h>
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! ID3v2 unsynchronized lyrics frame
+ /*!
+ * An implementation of ID3v2 unsynchronized lyrics.
+ */
+ class TAGLIB_EXPORT UnsynchronizedLyricsFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Construct an empty unsynchronized lyrics frame that will use the text encoding
+ * \a encoding.
+ */
+ explicit UnsynchronizedLyricsFrame(String::Type encoding = String::Latin1);
+
+ /*!
+ * Construct a unsynchronized lyrics frame based on the data in \a data.
+ */
+ explicit UnsynchronizedLyricsFrame(const ByteVector &data);
+
+ /*!
+ * Destroys this UnsynchronizedLyricsFrame instance.
+ */
+ virtual ~UnsynchronizedLyricsFrame();
+
+ /*!
+ * Returns the text of this unsynchronized lyrics frame.
+ *
+ * \see text()
+ */
+ virtual String toString() const;
+
+ /*!
+ * Returns the language encoding as a 3 byte encoding as specified by
+ * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>.
+ *
+ * \note Most taggers simply ignore this value.
+ *
+ * \see setLanguage()
+ */
+ ByteVector language() const;
+
+ /*!
+ * Returns the description of this unsynchronized lyrics frame.
+ *
+ * \note Most taggers simply ignore this value.
+ *
+ * \see setDescription()
+ */
+ String description() const;
+
+ /*!
+ * Returns the text of this unsynchronized lyrics frame.
+ *
+ * \see setText()
+ */
+ String text() const;
+
+ /*!
+ * Set the language using the 3 byte language code from
+ * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to
+ * \a languageCode.
+ *
+ * \see language()
+ */
+ void setLanguage(const ByteVector &languageCode);
+
+ /*!
+ * Sets the description of the unsynchronized lyrics frame to \a s.
+ *
+ * \see decription()
+ */
+ void setDescription(const String &s);
+
+ /*!
+ * Sets the text portion of the unsynchronized lyrics frame to \a s.
+ *
+ * \see text()
+ */
+ virtual void setText(const String &s);
+
+ /*!
+ * Returns the text encoding that will be used in rendering this frame.
+ * This defaults to the type that was either specified in the constructor
+ * or read from the frame when parsed.
+ *
+ * \see setTextEncoding()
+ * \see render()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Sets the text encoding to be used when rendering this frame to
+ * \a encoding.
+ *
+ * \see textEncoding()
+ * \see render()
+ */
+ void setTextEncoding(String::Type encoding);
+
+ protected:
+ // Reimplementations.
+
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ private:
+ /*!
+ * The constructor used by the FrameFactory.
+ */
+ UnsynchronizedLyricsFrame(const ByteVector &data, Header *h);
+ UnsynchronizedLyricsFrame(const UnsynchronizedLyricsFrame &);
+ UnsynchronizedLyricsFrame &operator=(const UnsynchronizedLyricsFrame &);
+
+ class UnsynchronizedLyricsFramePrivate;
+ UnsynchronizedLyricsFramePrivate *d;
+ };
+
+ }
+}
+#endif
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp b/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp
new file mode 100644
index 0000000000..25bdd187aa
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp
@@ -0,0 +1,192 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Urs Fleisch
+ email : ufleisch@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#include "urllinkframe.h"
+#include <tdebug.h>
+#include <tstringlist.h>
+
+using namespace TagLib;
+using namespace ID3v2;
+
+class UrlLinkFrame::UrlLinkFramePrivate
+{
+public:
+ String url;
+};
+
+class UserUrlLinkFrame::UserUrlLinkFramePrivate
+{
+public:
+ UserUrlLinkFramePrivate() : textEncoding(String::Latin1) {}
+ String::Type textEncoding;
+ String description;
+};
+
+UrlLinkFrame::UrlLinkFrame(const ByteVector &data) :
+ Frame(data)
+{
+ d = new UrlLinkFramePrivate;
+ setData(data);
+}
+
+UrlLinkFrame::~UrlLinkFrame()
+{
+ delete d;
+}
+
+void UrlLinkFrame::setUrl(const String &s)
+{
+ d->url = s;
+}
+
+String UrlLinkFrame::url() const
+{
+ return d->url;
+}
+
+void UrlLinkFrame::setText(const String &s)
+{
+ setUrl(s);
+}
+
+String UrlLinkFrame::toString() const
+{
+ return url();
+}
+
+void UrlLinkFrame::parseFields(const ByteVector &data)
+{
+ d->url = String(data);
+}
+
+ByteVector UrlLinkFrame::renderFields() const
+{
+ return d->url.data(String::Latin1);
+}
+
+UrlLinkFrame::UrlLinkFrame(const ByteVector &data, Header *h) : Frame(h)
+{
+ d = new UrlLinkFramePrivate;
+ parseFields(fieldData(data));
+}
+
+
+UserUrlLinkFrame::UserUrlLinkFrame(String::Type encoding) :
+ UrlLinkFrame("WXXX")
+{
+ d = new UserUrlLinkFramePrivate;
+ d->textEncoding = encoding;
+}
+
+UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data) :
+ UrlLinkFrame(data)
+{
+ d = new UserUrlLinkFramePrivate;
+ setData(data);
+}
+
+UserUrlLinkFrame::~UserUrlLinkFrame()
+{
+ delete d;
+}
+
+String UserUrlLinkFrame::toString() const
+{
+ return "[" + description() + "] " + url();
+}
+
+String::Type UserUrlLinkFrame::textEncoding() const
+{
+ return d->textEncoding;
+}
+
+void UserUrlLinkFrame::setTextEncoding(String::Type encoding)
+{
+ d->textEncoding = encoding;
+}
+
+String UserUrlLinkFrame::description() const
+{
+ return d->description;
+}
+
+void UserUrlLinkFrame::setDescription(const String &s)
+{
+ d->description = s;
+}
+
+void UserUrlLinkFrame::parseFields(const ByteVector &data)
+{
+ if(data.size() < 2) {
+ debug("A user URL link frame must contain at least 2 bytes.");
+ return;
+ }
+
+ int pos = 0;
+
+ d->textEncoding = String::Type(data[0]);
+ pos += 1;
+
+ if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) {
+ int offset = data.find(textDelimiter(d->textEncoding), pos);
+ if(offset < pos)
+ return;
+
+ d->description = String(data.mid(pos, offset - pos), d->textEncoding);
+ pos = offset + 1;
+ }
+ else {
+ int len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2);
+ if(len < 0)
+ return;
+
+ d->description = String(data.mid(pos, len), d->textEncoding);
+ pos += len + 2;
+ }
+
+ setUrl(String(data.mid(pos)));
+}
+
+ByteVector UserUrlLinkFrame::renderFields() const
+{
+ ByteVector v;
+
+ String::Type encoding = checkEncoding(d->description, d->textEncoding);
+
+ v.append(char(encoding));
+ v.append(d->description.data(encoding));
+ v.append(textDelimiter(encoding));
+ v.append(url().data(String::Latin1));
+
+ return v;
+}
+
+UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data, Header *h) : UrlLinkFrame(data, h)
+{
+ d = new UserUrlLinkFramePrivate;
+ parseFields(fieldData(data));
+}
diff --git a/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h b/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h
new file mode 100644
index 0000000000..649f85dea6
--- /dev/null
+++ b/libs/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h
@@ -0,0 +1,172 @@
+/***************************************************************************
+ copyright : (C) 2002 - 2008 by Scott Wheeler
+ email : wheeler@kde.org
+ copyright : (C) 2006 by Urs Fleisch
+ email : ufleisch@users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * This library is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Lesser General Public License version *
+ * 2.1 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+ * USA *
+ * *
+ * Alternatively, this file is available under the Mozilla Public *
+ * License Version 1.1. You may obtain a copy of the License at *
+ * http://www.mozilla.org/MPL/ *
+ ***************************************************************************/
+
+#ifndef TAGLIB_URLLINKFRAME_H
+#define TAGLIB_URLLINKFRAME_H
+
+#include <id3v2frame.h>
+
+namespace TagLib {
+
+ namespace ID3v2 {
+
+ //! ID3v2 URL frame
+ /*!
+ * An implementation of ID3v2 URL link frames.
+ */
+ class TAGLIB_EXPORT UrlLinkFrame : public Frame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * This is a dual purpose constructor. \a data can either be binary data
+ * that should be parsed or (at a minimum) the frame ID.
+ */
+ explicit UrlLinkFrame(const ByteVector &data);
+
+ /*!
+ * Destroys this UrlLinkFrame instance.
+ */
+ virtual ~UrlLinkFrame();
+
+ /*!
+ * Returns the URL.
+ */
+ virtual String url() const;
+
+ /*!
+ * Sets the URL to \a s.
+ */
+ virtual void setUrl(const String &s);
+
+ // Reimplementations.
+
+ virtual void setText(const String &s);
+ virtual String toString() const;
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ /*!
+ * The constructor used by the FrameFactory.
+ */
+ UrlLinkFrame(const ByteVector &data, Header *h);
+
+ private:
+ UrlLinkFrame(const UrlLinkFrame &);
+ UrlLinkFrame &operator=(const UrlLinkFrame &);
+
+ class UrlLinkFramePrivate;
+ UrlLinkFramePrivate *d;
+ };
+
+ //! ID3v2 User defined URL frame
+
+ /*!
+ * This is a specialization of URL link frames that allows for
+ * user defined entries. Each entry has a description in addition to the
+ * normal list of fields that a URL link frame has.
+ *
+ * This description identifies the frame and must be unique.
+ */
+ class TAGLIB_EXPORT UserUrlLinkFrame : public UrlLinkFrame
+ {
+ friend class FrameFactory;
+
+ public:
+ /*!
+ * Constructs an empty user defined URL link frame. For this to be
+ * a useful frame both a description and text must be set.
+ */
+ explicit UserUrlLinkFrame(String::Type encoding = String::Latin1);
+
+ /*!
+ * This is a dual purpose constructor. \a data can either be binary data
+ * that should be parsed or (at a minimum) the frame ID.
+ */
+ explicit UserUrlLinkFrame(const ByteVector &data);
+
+ /*!
+ * Destroys this UserUrlLinkFrame instance.
+ */
+ virtual ~UserUrlLinkFrame();
+
+ // Reimplementations.
+
+ virtual String toString() const;
+
+ /*!
+ * Returns the text encoding that will be used in rendering this frame.
+ * This defaults to the type that was either specified in the constructor
+ * or read from the frame when parsed.
+ *
+ * \see setTextEncoding()
+ * \see render()
+ */
+ String::Type textEncoding() const;
+
+ /*!
+ * Sets the text encoding to be used when rendering this frame to
+ * \a encoding.
+ *
+ * \see textEncoding()
+ * \see render()
+ */
+ void setTextEncoding(String::Type encoding);
+
+ /*!
+ * Returns the description for this frame.
+ */
+ String description() const;
+
+ /*!
+ * Sets the description of the frame to \a s. \a s must be unique.
+ */
+ void setDescription(const String &s);
+
+ protected:
+ virtual void parseFields(const ByteVector &data);
+ virtual ByteVector renderFields() const;
+
+ /*!
+ * The constructor used by the FrameFactory.
+ */
+ UserUrlLinkFrame(const ByteVector &data, Header *h);
+
+ private:
+ UserUrlLinkFrame(const UserUrlLinkFrame &);
+ UserUrlLinkFrame &operator=(const UserUrlLinkFrame &);
+
+ class UserUrlLinkFramePrivate;
+ UserUrlLinkFramePrivate *d;
+ };
+
+ }
+}
+#endif