amarok: remove, replacement incomming

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2016-03-30 00:24:41 +00:00
parent 5287ec4ded
commit 5f39fd1101
3038 changed files with 0 additions and 430875 deletions

View file

@ -1,14 +0,0 @@
# Note: Please keep this in sync with Mainpage.dox
Bart Cerneels <bart.cerneels@kde.org>
Edward Toroshchin <edward.hades@gmail.com>
Mark Kretschmann <kretschmann@gmail.com>
Matěj Laitl <matej@laitl.cz>
Myriam Schweingruber <myriam@kde.org>
Patrick von Reth <patrick.vonreth@gmail.com>
Ralf Engels <ralf-engels@gmx.de>
Rick W. Chen <stuffcorpse@archlinux.us>
Sam Lade <sam@sentynel.com>
Sven Krohlas <sven@asbest-online.de>
Téo Mrnjavac <teo@kde.org>
Valorie Zimmerman <valorie@kde.org>

View file

@ -1,247 +0,0 @@
project(Amarok)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
message(STATUS "${CMAKE_MODULE_PATH}")
option(WITH_UTILITIES "Enable building of utilities" ON)
option(WITH_PLAYER "Enable building of main Amarok player" ON)
option(WITH_MP3Tunes "Enable mp3tunes in the Amarok player, requires multiple extra dependencies" ON)
option(WITH_IPOD "Enable iPod support in Amarok" ON)
option(WITH_MYSQL_EMBEDDED "Build the embedded database library -- highly recommended" ON)
option(WITH_PLAYGROUND "Enable building of playground scripts and applets (WARNING: some of them might have legal issues!)" OFF)
############### Taglib
set(TAGLIB_MIN_VERSION "1.7")
find_package(Taglib REQUIRED)
# Check if TagLib is built with ASF and MP4 support
include(CheckCXXSourceCompiles)
set(CMAKE_REQUIRED_INCLUDES "${TAGLIB_INCLUDES}")
set(CMAKE_REQUIRED_LIBRARIES "${TAGLIB_LIBRARIES}")
check_cxx_source_compiles("#include <asftag.h>
int main() { TagLib::ASF::Tag tag; return 0;}" TAGLIB_ASF_FOUND)
if( NOT TAGLIB_ASF_FOUND )
message(FATAL_ERROR "TagLib does not have ASF support compiled in.")
endif( NOT TAGLIB_ASF_FOUND )
check_cxx_source_compiles("#include <mp4tag.h>
int main() { TagLib::MP4::Tag tag(0, 0); return 0;}" TAGLIB_MP4_FOUND)
if( NOT TAGLIB_MP4_FOUND )
message(FATAL_ERROR "TagLib does not have MP4 support compiled in.")
endif( NOT TAGLIB_MP4_FOUND )
check_cxx_source_compiles("#include <modtag.h>
#include <modfile.h>
#include <s3mfile.h>
#include <itfile.h>
#include <xmfile.h>
using namespace TagLib;
int main() { char *s; Mod::Tag tag; Mod::File modfile(s); S3M::File s3mfile(s);
IT::File itfile(s); XM::File xmfile(s); return 0; }" TAGLIB_MOD_FOUND)
check_cxx_source_compiles("#include <opusfile.h>
int main() { char *s; TagLib::Ogg::Opus::File opusfile(s); return 0;}" TAGLIB_OPUS_FOUND)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_LIBRARIES)
set(TAGLIB-EXTRAS_MIN_VERSION "1.0")
find_package(Taglib-Extras)
set(TAGLIB_EXTRAS_FOUND ${TAGLIB-EXTRAS_FOUND}) # we need a c-compatible name for the include file
include(CheckTagLibFileName)
check_taglib_filename(COMPLEX_TAGLIB_FILENAME)
###############
# Needed to conditionally build tests and gui
if(KDE4_BUILD_TESTS)
add_definitions(-DDEBUG)
endif()
if(WITH_DESKTOP_UI)
add_definitions(-DDESKTOP_UI)
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--as-needed")
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
endif (CMAKE_COMPILER_IS_GNUCXX)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/shared
${CMAKE_CURRENT_BINARY_DIR}/shared
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") # Require C++11
# WORKAROUND for Clang bug: http://llvm.org/bugs/show_bug.cgi?id=15651
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-delayed-template-parsing")
endif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND WIN32)
include( MacroBoolTo01 )
include( MacroLibrary )
add_definitions( ${QT_DEFINITIONS} ${KDE4_DEFINITIONS} )
# QCA2 is required for the Script Updater
find_package( QCA2 )
macro_optional_find_package( LibLastFm )
set( LIBLASTFM_MIN_VERSION )
if( LIBLASTFM_FOUND )
if("${LIBLASTFM_VERSION}" VERSION_LESS "1.0.0")
set(LIBLASTFM_FOUND FALSE)
endif()
endif( LIBLASTFM_FOUND )
macro_bool_to_01( LIBLASTFM_FOUND HAVE_LIBLASTFM )
macro_optional_find_package( FFmpeg )
if( FFMPEG_FOUND )
macro_optional_find_package( LibOFA )
macro_bool_to_01( LIBOFA_FOUND HAVE_LIBOFA )
endif( FFMPEG_FOUND )
string( TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_TOLOWER )
if( CMAKE_BUILD_TYPE_TOLOWER MATCHES debug )
set( DEBUG_BUILD_TYPE ON )
add_definitions(-Wall -Wextra)
endif( CMAKE_BUILD_TYPE_TOLOWER MATCHES debug )
# this needs to be here because also code in shared/ needs config.h. This is also the
# reason why various checks are above why they belong under if( WITH_PLAYER )
configure_file( shared/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/shared/config.h )
add_subdirectory( data )
add_subdirectory( images )
add_subdirectory( shared )
if( WITH_PLAYER )
include(MacroLogFeature)
macro_log_feature( QT_QTOPENGL_FOUND "QtOpenGL" "Required for the spectrum analyzer" "http://qt-project.org" FALSE "" "" )
find_package(MySQLAmarok REQUIRED)
if( WITH_MYSQL_EMBEDDED )
set( BUILD_MYSQLE_COLLECTION TRUE )
macro_log_feature( MYSQL_EMBEDDED_FOUND "mysqld" "Embedded MySQL Libraries" "http://www.mysql.com" TRUE "" "" )
else( WITH_MYSQL_EMBEDDED )
add_definitions( "-DNO_MYSQL_EMBEDDED" )
endif( WITH_MYSQL_EMBEDDED )
macro_log_feature( MYSQL_FOUND "mysql" "MySQL Server Libraries" "http://www.mysql.com" TRUE "" "" )
# zlib is required for mysql embedded
find_package(ZLIB REQUIRED)
macro_log_feature( ZLIB_FOUND "zlib" "zlib" "" TRUE "" "" )
macro_log_feature( QCA2_FOUND "qca2" "Qt Cryptographic Architecture" "http://delta.affinix.com/qca/" FALSE "" "" )
# QJson is required for the PlaydarCollection
macro_optional_find_package(QJSON)
macro_log_feature( QJSON_FOUND "QJson" "Qt JSON Parser used for the Playdar Collection" "http://qjson.sourceforge.net/" FALSE "" "" )
# We tell users that we need 1.0.3, but we really check just >= 1.0.0. This is because
# upstream forgot to update version in lastfm/global.h, so it looks like 1.0.2. :-(
# will be fixed in liblastfm-1.0.4
set( LIBLASTFM_MIN_VERSION "1.0.3" )
macro_log_feature( LIBLASTFM_FOUND "liblastfm" "Enable Last.Fm service, including scrobbling, song submissions, and suggested song dynamic playlists"
"http://cdn.last.fm/client/liblastfm-${LIBLASTFM_MIN_VERSION}.tar.gz" FALSE ${LIBLASTFM_MIN_VERSION} "" )
macro_log_feature( FFMPEG_FOUND "ffmpeg" "Libraries and tools for handling multimedia data" "http://www.ffmpeg.org/" FALSE "0.7" "" )
if( FFMPEG_FOUND )
macro_log_feature( LIBOFA_FOUND "libofa" "Enable MusicDNS service" "http://code.google.com/p/musicip-libofa/" FALSE "0.9.x" "" )
endif( FFMPEG_FOUND )
##gpodder Service
macro_optional_find_package( Mygpo-qt 1.0.7 QUIET )
macro_log_feature( LIBMYGPO_QT_FOUND "libmygpo-qt" "Enable gpodder.net service" "http://wiki.gpodder.org/wiki/Libmygpo-qt" FALSE "1.0.7" "" )
macro_bool_to_01( LIBMYGPO_QT_FOUND HAVE_LIBMYGPOQT )
if( WITH_IPOD )
find_package(Ipod)
if( IPOD_FOUND AND NOT WIN32 )
if("${IPOD_VERSION}" VERSION_LESS "0.8.2")
set(IPOD_FOUND FALSE)
endif()
endif( IPOD_FOUND AND NOT WIN32 )
macro_log_feature( IPOD_FOUND "libgpod" "Support Apple iPod/iPad/iPhone audio devices" "http://sourceforge.net/projects/gtkpod/" FALSE ${IPOD_MIN_VERSION} "" )
macro_optional_find_package(GDKPixBuf)
macro_log_feature( GDKPIXBUF_FOUND "GDK-PixBuf" "Support for artwork on iPod audio devices via GDK-PixBuf" "http://developer.gnome.org/arch/imaging/gdkpixbuf.html" FALSE "2.0.x" "" )
endif( WITH_IPOD )
macro_optional_find_package(Mtp)
macro_log_feature( MTP_FOUND "libmtp" "Enable Support for portable media devices that use the media transfer protocol" "http://libmtp.sourceforge.net/" FALSE "1.0.0" "")
if( WITH_MP3Tunes )
find_package(CURL)
macro_log_feature( CURL_FOUND "curl" "cURL provides the necessary network libraries required by mp3tunes." "http://curl.haxx.se" FALSE "" "" )
find_package(LibXml2)
macro_log_feature( LIBXML2_FOUND "libxml2" "LibXML2 is an XML parser required by mp3tunes." "http://www.xmlsoft.org" FALSE "" "" )
macro_optional_find_package(OpenSSL)
macro_optional_find_package(Libgcrypt)
if ( OPENSSL_FOUND OR LIBGCRYPT_FOUND )
set (_mp3tunes_crypto TRUE )
else ( OPENSSL_FOUND OR LIBGCRYPT_FOUND )
message( SEND_ERROR "Building with mp3tunes support REQUIRES either OpenSSL or GNU Libgcrypt" )
endif ( OPENSSL_FOUND OR LIBGCRYPT_FOUND )
macro_log_feature( _mp3tunes_crypto "openssl or libgcrypt" "OpenSSL or GNU Libgcrypt provides cryptographic functions required by mp3tunes." "http://www.openssl.org/ or http://www.gnupg.org/download/#libgcrypt" FALSE "" "" )
find_package(Loudmouth)
macro_log_feature( LOUDMOUTH_FOUND "loudmouth" "Loudmouth is the communication backend needed by mp3tunes for syncing." "http://www.loudmouth-project.org" FALSE "" "" )
include(CheckQtGlib)
macro_log_feature(QT4_GLIB_SUPPORT "Qt4 Glib support" "Qt4 must be compiled with glib support for mp3tunes" "http://www.trolltech.com" FALSE "" "")
endif( WITH_MP3Tunes )
if( WITH_IPOD OR WITH_MP3Tunes )
find_package(GObject)
macro_log_feature( GOBJECT_FOUND "gobject" "Required by libgpod and mp3tunes." "http://www.gtk.org" FALSE "2.x" "" )
find_package(GLIB2)
macro_log_feature( GLIB2_FOUND "glib2" "Required by libgpod and mp3tunes" "http://www.gtk.org" FALSE "2.x" "")
endif( WITH_IPOD OR WITH_MP3Tunes )
find_program( CLAMZ_FOUND clamz PATH )
macro_log_feature( CLAMZ_FOUND "clamz" "Optional requirement to download songs from the Amazon MP3 store. Highly recommended on Linux, as the official downloader from Amazon is quite broken on many systems." "https://code.google.com/p/clamz/" FALSE )
find_package(PythonInterp)
macro_log_feature(PYTHONINTERP_FOUND "Python" "Required for generating the autocompletion file for the script console" "https://www.python.org" FALSE "2.x" "")
include_directories( ${KDE4_INCLUDES} )
if( KDE4_BUILD_TESTS AND NOT WIN32 )
ENABLE_TESTING()
add_subdirectory( tests )
endif( KDE4_BUILD_TESTS AND NOT WIN32 )
add_subdirectory( src )
# Also display taglib in the feature log
macro_log_feature( TAGLIB_FOUND "taglib" "Support for Audio metadata." "http://developer.kde.org/~wheeler/taglib.html" TRUE "${TAGLIB_MIN_VERSION}" "Required for tag reading" )
# following line is here (and not near TAGLIB_MOD_FOUND) because there may be no MacroLogFeature without kdelibs
macro_log_feature( TAGLIB_MOD_FOUND "taglib" "Additional support for Audio metadata of mod, s3m, it and xm files." "http://developer.kde.org/~wheeler/taglib.html" FALSE "1.8" "" )
macro_log_feature( TAGLIB_OPUS_FOUND "taglib" "Additional support for Audio metadata of opus files." "http://developer.kde.org/~wheeler/taglib.html" FALSE "1.9" "" )
endif( WITH_PLAYER )
if( WITH_UTILITIES )
set(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Base directory for executables and libraries" FORCE)
set(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" CACHE PATH "The subdirectory to the binaries prefix (default prefix/bin)" FORCE)
add_subdirectory( utilities )
endif( WITH_UTILITIES )
if( WITH_PLAYGROUND )
add_subdirectory( playground )
message(STATUS "Included playground subdirectory in configuration")
endif( WITH_PLAYGROUND )
include(CTest)

View file

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View file

@ -1,397 +0,0 @@
GNU Free Documentation License
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The "Document", below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as "you". You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject. (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification. Examples of
transparent image formats include PNG, XCF and JPG. Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".) To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled "History" in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the "History" section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications". You must delete all sections
Entitled "Endorsements".
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.

View file

@ -1,510 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations
below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must
be allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control
compilation and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least
three years, to give the same user the materials specified in
Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply, and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms
of the ordinary General Public License).
To apply these terms, attach the following notices to the library.
It is safest to attach them to the start of each source file to most
effectively convey the exclusion of warranty; and each file should
have at least the "copyright" line and a pointer to where the full
notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the library,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James
Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View file

@ -1,8 +0,0 @@
set(CTEST_PROJECT_NAME "Amarok")
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "my.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=Amarok")
set(CTEST_DROP_SITE_CDASH TRUE)

File diff suppressed because it is too large Load diff

View file

@ -1,133 +0,0 @@
****************************************************************************
* BIG FAT WARNING: *
* Media Device Framework is outdated and is going to be removed as soon as *
* we rewrite MtpCollection and AudioCdColleciton not to use it anymore. *
****************************************************************************
Media Device Framework
======================
1. Solid Interface
Solid is KDE's hardware detection library, and Amarok uses it to detect
all of the devices that it knows how to interface with. It does this
through two classes:
MediaDeviceCache(singleton) - Talks directly to Solid, gets list of all
present media devices and external hard drives, even if Amarok does not
support them.
MediaDeviceMonitor(singleton) - Talks to the MDC to see what devices are
available. Keeps track of the kind of devices that Amarok supports.
It does this by receiving and caching a single ConnectionAssistant
object from the MediaDeviceCollectionFactory of the particular device
type, so that as devices are detected, they can be tested for
compatibility with Amarok.
2. Collection/Metadata
Music-related data in Amarok is handled in Collections, themselves
consisting of metadata such as Tracks, Artists etc. The base classes
to set up collections are abstract, and several classes which provide
more media-device-specific methods are available to be subclassed. It
is some of these classes that must be subclassed to add support in
Amarok for a device. The heart of it all is MediaDeviceHandler, and
this class will be discussed in depth.
NNTS = No Need To Subclass
2.1 Connection
ConnectionAssistant - Knows how to identify that a particular device
matches the type of this CA. Can also create MediaDeviceInfo.
MediaDeviceInfo - Contains the device-specific information pertinent to
connection, such as mountpoint.
2.2 Factory/Collection
MediaDeviceCollectionFactory(NNTS) - Creates
MediaDeviceCollections. Provides ConnectionAssistant to register the
appropriate device type with the MDM.
MediaDeviceCollection - Given a MediaDeviceInfo object, connects to the
device described by creating a MediaDeviceHandler. Provides a few
other rudimentary functions.
MediaDeviceCollectionLocation(NNTS) - Receives/sends orders to add
tracks to Collection, remove them, copy them. move them. Forwards the
low-level work (the actual copying/deleting etc.) to the
MediaDeviceHandler.
MediaDeviceMeta*(NNTS) - The actual metadata a Collection consists of:
Track, Album, Artist, Genre, Composer. No need to reimplement these,
as they are standard across all devices, and the interactions
concerning them are dealt with in the MediaDeviceHandler.
2.3 Handler and Capabilities
2.3.1 Handler
MediaDeviceHandler - This is it. This is the beast that knows how to
do all the low-level tasks specific to a given device: connection,
parsing metadata, copying, deletion, changing of metadata, battery%,
device capacity, the whole lot of it. Since it is responsible for so
many pieces, and since these pieces vary greatly from device to device,
it actually relies on Capability-based classes that each know how to do
a particular job.
Capabilities are similar to Java interfaces, and provide a standard
way for the MediaDeviceHandler class to ask the many subclasses of
MediaDeviceHandler for what they are capable of, and depending on that,
will make different requests. For instance, AudioCDs cannot
be written to, so they would have no use for WriteCapability, and don't
have to implement it.
The MediaDeviceHandler has abstracted the logic so common to several
device implementations. The libraries libgpod and libmtp, for
instance, are based on a struct that is a linked list of metadata, in
particular tracks. The common way to parse the devices with these
libraries is to walk down this linked list until all metadata has been
read into the appropriate MediaDeviceMeta classes. This is exactly
what the Handler does, and the only differences are the names of the
linked list structs, and the functions called or member data read to
retrieve this data. It is these basic function calls that are then
called in the subclasses of the Capability classes, with the
top-level logic already standardized and done in the main
MediaDeviceHandler class.
Note: To see the logic hereto referred, check the MediaDeviceHandler's
calls to the Capability classes, and the order of the function calls.
This helps to understand how best to map the functions of the
Capability interface, to function calls or member-data access using the
appropriate library.
2.3.2 Capabilities
ReadCapability - Maps the necessary functions to read the structs
specific to the device, with the goal of parsing the entire device's
metadata. Can also read the device's capacity, used and total.
WriteCapability - Receives generic commands related to writing to
the device: find where to copy a new track onto the device, copy the
track, delete the track. Subclass this Capability also to provide a full
mapping onto the functions required to set the metadata on a newly
created track struct, and the higher logic of in what order to do this
is handled by the main Handler class.
ArtworkCapability - Optional. If the device supports artwork, this
provides the interface for reading/writing that artwork.
PlaylistCapability - Optional. If the device supports playlists, this
provides the interface for reading/writing playlists, parsing logic is
based again on a linked-list struct that is traversed in a standard
fashion. The subclass of this just maps to the appropriate functions
to walk the linked list.
3. Appendix/Notes
- At the time of writing, there isn't a full implementation of Solid on
Windows or Mac, which limits support of devices mainly to Linux. Also,
libraries used to interface at the low level (libgpod, libmtp) are
Linux-specific.

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 194 KiB

View file

@ -1,27 +0,0 @@
Collection Architecture
-----------------------
Collection is a container for a set of objects that collectively provider tracks to the application.
It does this by providing Meta::Base derieved objects via the QueryMaker (which every collection has).
On plugin load a CollectionFactory is registered with CollectionManager which listens to the
newCollection() signal. CollectionManager is responsible for integrating the new Collection within
the rest of the application. Collection makes user visible strings, icons and other information
available for the UI to use.
TrackProvider actually creates the Meta::Track objects using trackForUrl() which has a specially
formatted URL that is unique accross application settings. A collection has it's own URL protocol
which all uidUrl's of the collection's tracks start with.
For getting tracks according to metadata or statistical information each Collection has a QueryMaker
implementation. Any component can get an instance of this specialized QueryMaker using Collection::queryMaker().
CollectionManager has a special QueryMaker that will return results of all the registered collections
using their queryMaker(). Use this if you want a track resolved without caring about it's origin.
TrackProvider and QueryMakers can be used seperatly from the collections. In practice though you'll
find only TrackProvider getting used by Services and the filesystem browser. If needing to combinine
it with a QueryMaker you are probably creating a Collection anyway.
Also note that Collection objects don't use shared pointers so they are not especially well protected
against getting removed. Holding the pointer to a QueryMaker for a prolonged amount of time
invites problems (e.g. when the usb device is removed. We had a number of bugs for this)

View file

@ -1,34 +0,0 @@
Meta Architecture
-----------------
The meta objects (located in src/core/meta) e.g. Meta::Track and the more
often used Meta::TrackPtr represent data connected to music related objects.
There are classes for Tracks, Albums, Artists, Composers, Genres, Years and Labels.
These classes all derive from Meta::Base to facilitate their common methods (name
and sorting) and observer interaction.
[Design decision] They are not QObjects to avoid the overhead of the Qt MetaObject
support variables. Collections are potentially millions of tracks where a significant
proportion of tracks (in the case of MemoryCollections: all tracks) could at any time
be loaded in memory.
Meta::Observer is a virtual class that can be derived from by components that are
interested in changes to the tracks during application lifetime. It has
metadataChanged() methods for each of the Meta types and the ability to subscribe
to any Meta object.
KSharedPtr is used for all functions returning a pointer in the Meta classes. It strong,
reference tracking smart pointer which will only delete an object once the last reference
holding KSharedPtr goes out of scope or is deleted.
[Note] Playlists will be made part of Meta as well. They have a similar Observer
pattern but have been kept seperate because PlaylistObserver requires more functions.
Pollution of the Observer class could be avoided using a playlistChanged(enum Change,
QVariant value) type method.
[Design decision] The list of meta objects contains Tracks, Albums, Artists, Composers,
Genres, Years and Labels because these are the categories that you can sort by in
the collection view and thus have to be returned by the QueryMaker and represented
in an item in the CollectionTreeItem.

View file

@ -1,14 +0,0 @@
Playback Queue Architecture
---------------------------
Simple sequential list of upcoming tracks. The PlaybackController takes the first track on this list for playback. It does not include the currently playing track.
There are no modes (random, repeat, etc) affecting the playback order. The behavior of these modes are implemented using Playlists and playlist-tracking who change the actual content of the queue to get the same result.
A QAbstractItemModel for the PlaybackQueue is exposed as the main interface. It's possible to insert and remove rows using the default methods and drag/drop of mime-data containing meta types is supported. It's a flat QModelIndex containing only tracks. For purposes of display it can be used with proxy models such as QtGroupingProxy to group by album/artist/composer. Sorting of the queue is possible but is one undoable QAction. How the new order is determined does not matter, but use a proxy models such as QSortFilterProxyModel is suggested because of it's well known semantics and uses within Amarok.
Using extra columns and data roles the PlaybackQueueModel gives info about certain queue-only information associated with a track. An example of this is whether a track is part of a tracked playlist or if a manual user interaction locked the track at it's current place.
Playback history is not part of the PlaybackQueue. It has to be implemented separately using a PlaybackObserver.
Old Playlist Queue Manager Behavior
-----------------------------------
Select in order and press Ctrl+U to move those tracks in selection order to the top of the queue.

View file

@ -1,88 +0,0 @@
Playlist architecture
---------------------
note: this is about the media sources playlist, *not* The Playlist as the playback queue has been called for historic reasons.
A playlist is an ordered list of tracks. The creation method of this list determines the type (or category):
* When created by the user themselves and manually editable it's a User Playlist.
* A Dynamic Playlist is generated based on some statistical rules. It's an amarok specific type that also reacts to changes made in the playback queue by the user.
* A Smart Playlist is the result of a query of the Collections. It doesn't change unless it's being re-generated at startup or at the user's request.
A Radio Channel has tracks that are not or only limited determined by the user but rather come in as a "stream" (high level). Implementation can be a single HTTP/RTSP URL like icecast or a pre-selected list of stream-able URLs such as with last.fm. The implementations can allow some control over track selection with functionality like last.fm's love/ban or tag selection like spotify.
* Podcast Channels are also playlists that are generated by parsing a podcast feed (RSS or atom). They only contain tracks of the PodcastEpisode type. In amarok they are displayed separately from the other playlists but internally they use the same code such as the ItemModels, PlaylistManager and the synchronization support.
[note] The Playlist base class currently lives in the Playlists:: namespace. It is to be moved to Meta::.
Asynchronous Track Loading
--------------------------
The tracks() method will return immediately, possibly with a list of tracks that were already in memory. A call to the tracks() method might also do a triggerTrackLoad() which will start the asynchronous loading of tracks in the background. PlaylistObserver::trackAdded() will be called for each track that is added additionally to the playlist. trackRemoved() can also be called when the previous tracklist is affected.
[note] automatic loading and async depends on the implementation.
PlaylistProvider
----------------
The PlaylistProvider base class is registered with PlaylistManager so it can act as a central point to distribute playlist to other Amarok components.
Playlist loading can also be made asynchronous in the implementations. PlaylistProvider::playlistCount() can return -1 to indicate a full load is required to calculate this. After calling playlists(), which can return an empty list, playlistAdded() signals might be emitted while the asynchronous loading is going on.
PlaylistProviders can offer the UI QActions for the provider, a specific playlist or a specific track in a playlist. Playlist also has these last 2 methods which in the default implementation call the provider's implementations. It's recommended to implement playlist and track actions in the provider.
Playlist Synchronization
------------------------
It's possible to set up a link between playlists of the same category but from different PlaylistProviders. PlaylistManager will try to bring those playlists in the same state i.e. the same tracks in the same order.
The synchronization logic is implemented in SyncedPlaylist, a virtual class created with a factory pattern so other syncing algorithms can be applied at runtime. An example where this could be used: GPodderProvider's playlists are representations of the state of data on a web-service (gpodder.net). It has certain restrictions but also features that go beyond regular playlist synchronization. GPodderProvider can create a SyncedPlaylist class that specifically handles podcasts and keeps the limitations of the service and PodcastChannels in mind.
[note] currently podcast synchronization uses the special function Playlist::syncTrackStatus() which should be replaced by the above mechanism to avoid implementation-at-high-level-creep.
A SynchronizedPlaylist will appear to the higher layers as one playlist which exists on multiple PlaylistProviders. In order to display the multiple copies to the user a QItemProxyModel is used by the UI.
The synchronization algorithm uses only those functions that are also needed by the regular playlist use cases. In theory Playlist implementations don't need to think about synchronization. In practice synchronization will only properly work with fully functional PlaylistProvider and Playlist implementations, which are desirable anyway.
PlaylistBrowserModel
--------------------
PlaylistBrowserModel is the base class for ItemModels used to display the various playlist types. Although all playlist can be displayed using this base class all categories have their own specialized implementation to implement setData(), dropMimeData() and category specific actions (ex. PodcastModel::refreshPodcasts()). Not that these are usually convenience version of Provider actions.
PlaylistBrowser model requests playlist for it's category from PlaylistManager who gathers them from the providers and group Synchronized playlists together in a SyncedPlaylist. PlaylistBrowserModel is a tree with playlist on the first level and tracks as it's children. In order to have playlists grouped by origin (i.e. PlaylistProvider) the PlaylistByProvider proxy.
Playlist Tracking by PlaybackQueue
----------------------------------
The PlaybackQueue can be made to track a single playlist's state. In general this just means that all current tracks of the playlist are appended to the queue and that it will act on trackAdded() signals. However, because the playback queue only has the upcoming tracks changes to tracks that have already been played are not possible. The distinction between a playlist and the queue has to be clear to the user.
Using playlist tracking it's possible to implement all modes of the old Playlist by creating categories implementing the behavior of the modes.
User Playlists
--------------
File based: XSPFPlaylist, M3UPlaylist, PLSPlaylist
Database based: SqlPlaylist
These playlists will load tracks using MetaProxy::Track which will start a worker thread to get a real track object using CollectionManager::trackForUrl(). It depends on the implementation and contents of the file which URL is used to resolve the track.
M3U and PLS by specification require their contents to be playable URLs. For most collections the playable URL and uidUrl won't match, so these tracks won't be playable until their "real" track is resolved.
XSPF does support storing of the uidUrl (identifier tag). Amarok always writes track's uidUrl to XSPF. The current playback queue state is also saved with XSPF to a dedicated file ($KDEHOME/share/apps/amarok/current.xspf).
The playlist implementation fills the proxy tracks with any tag information it has stored. This way a recently loaded playlist has usable content while loading tracks is done asynchronously.
If the playback queue is restored with invalid (empty) tracks, XSPFPlaylist, MetaProxy and CollectionManager::trackForUrl() are to be investigated.
Dynamic Playlists
-----------------
Using a custom UI the settings for selecting tracks are configured. The Dynamic Playlist will select tracks and make them available from the tracks() method. These tracks can be displayed to the user as a preview of the settings but are mainly used in the playback queue.
Using the Selector/Bias system other components and plugins can add track selection conditions or statistical bias options to the dynamic playlist generator.
[note] current implementation does not derive from Playlists::Playlist nor does it use a PlaylistProvider. It's a mode of the playback queue, not a loadable playlist.
Smart Playlists
---------------
The basis of a Smart Playlist is a QueryMaker query and some additional limiters such as track count and total file size (useful to fill a media player). The list of tracks is not kept between sessions so a smart playlist is generated when first accessed. To avoid unneeded recalculation an active smart playlist will only be regenerated when the user requests it or when the synchronization of a playlist requires an up-to-date list.
Podcast Channels
----------------
This type is used for both the local (SQL based) PodcastProvider, some media device implementations and the gpodder web service. In the local collection the utility class PodcastReader is used to parse a podcast feed and update the PodcastChannel implementation. The base classes of PodcastMeta.cpp are used as intermediary data storage for new Channels and Episodes that have not been saved in the PodcastProvider yet.
Radio Channels
--------------
The most common form of a radio channel is a HTTP stream. This implementation listens to signals from EngineController/PlaybackController/Phonon while playing the stream and determines when a metadata change represents a real track change. It will then push append the a new track with that metadata but the same url. This will not cause a real track change but rather a transition in the PlaybackController to the new playing track. It's a seamless progression in the PlaybackQueue as well.
Services like last.fm and spotify also provider Radio Channels but it's implementation in possible user interaction is implementation specific.
Random/Shuffle Playlist
-----------------------
This is a very simple randomizing playlist that takes the current play queue and shuffles the upcoming tracks at the start of a playing track. This way the user can see the next upcoming track already and change or remove them if desired. This playlist will respect the manual changes made to the playback order and not shuffle any of the tracks queued by the user.
The shuffling of tracks should be a visual animation to make it clear what is happening and be somewhat pleasing to watch.
Old Playlist Queue Manager Behavior
-----------------------------------
Implemented in PlaybackQueue.

View file

@ -1,92 +0,0 @@
This document explains how to install Amarok 2 from git in your home directory - in an easy way :)
==================================================================================================
A detailed blog post on how to make a local build can be found here: http://blogs.fsfe.org/myriam/2009/09/26/compiling-amarok-from-git-locally-full-summary/
* If you already have Amarok installed from your distro, uninstall it to prevent setting conflicts and similar.
* Install git, the compiler and KDE 4 development packages:
In Kubuntu, Debian, and all their derivatives:
sudo aptitude install git-core build-essential kdesdk kdelibs5-dev libkonq5-dev kdebase-workspace-dev
In Archlinux:
sudo pacman -Sy git base-devel kdelibs kdebase-runtime
In Gentoo:
sudo emerge -av dev-util/git kdelibs plasma-workspace
In OpenSuSE:
sudo zypper install git
In Fedora:
sudo yum install git kdelibs-devel
* Install ccache to speed up compilation
ccache -M 2G
* Append the following to $HOME/.bashrc:
export PATH=$HOME/kde/bin:$PATH
export KDEDIR=$HOME/kde
export KDEDIRS=$KDEDIR
* Reload your edited .bashrc:
source $HOME/.bashrc
NOTE: if you are not using the bash shell, edit your proper shell config file (~/.zshrc or ~/.tcshrc or whatever it may be)
* Make KDE aware of Amarok's plugin location:
echo 'export KDEDIR=$HOME/kde' >> $HOME/.kde/env/myenv.sh
echo 'export KDEDIRS=$KDEDIR' >> $HOME/.kde/env/myenv.sh
Some distributions call the above folder $HOME/.kde4/... (OpenSuSE in particular).
* Create folders:
mkdir $HOME/kde
mkdir $HOME/kde/src
mkdir -p $HOME/kde/build/amarok
* Make sure you have all necessary dependencies
See the README file for the complete list of necessary dependencies. Make sure you have the development files of these packages.
For distribution specific requirements refer to http://community.kde.org/Amarok/Development/Development_HowTo
* Check out Amarok:
cd $HOME/kde/src
git clone git://anongit.kde.org/amarok
* Building:
cd $HOME/kde/build/amarok
cmake -DCMAKE_INSTALL_PREFIX=$HOME/kde -DCMAKE_BUILD_TYPE=debugfull $HOME/kde/src/amarok
make install
* Enabling unit tests:
If you are a regular Amarok contributor, please build with tests enabled.
Install gmock from http://code.google.com/p/googlemock/
Add the following flag to your cmake line: -DKDE4_BUILD_TESTS=ON
Once compiled, jsut run the tests with 'make test'
For more information about the test infrastructure, read the Qtestlib Manual: http://doc.trolltech.com/4.5/qtestlib-manual.html
* Updating KDE Config:
kbuildsycoca4 --noincremental
Now you are ready to run Amarok 2, by typing "amarok" in the shell :)
Please also refer to the following wiki page
http://techbase.kde.org/Getting_Started/Sources/KDE_git-tutorial
NOTE:
If you have installed MySQL Embedded in non-default location (i.e. $HOME/usr),
Amarok may fail to start with error regarding libmysqlclient library. In this
case, add the following string to your ~/.bashrc:
export LD_LIBRARY_PATH=$HOME/usr/lib/mysql:$LD_LIBRARY_PATH
where $HOME/usr is the path you've used in --prefix option.
Have fun :)

View file

@ -1,23 +0,0 @@
# --[ Close bug in bugs.kde.org as fixed ]-----------------------------|
#BUG: <bug number>
#FIXED-IN: <optional release version>
#
# --[ Add to release changelog optionally close wish in bugs.kde.org ]-|
#FEATURE: <optional bug number>
#FIXED-IN: <optional release version>
#
# --[ Copy commit message to a bug or wish in bugs.kde.org ]-----------|
#CCBUG: <bug number>
#
# --[ Copy commit message to an email address ]------------------------|
#CCMAIL: <email>
#
# --[ Close a review on git.reviewboard.kde.org as submitted ]---------|
#REVIEW: <review number>
#
# --[ Notify documentation team of user visible changes ]--------------|
#GUI:
#
# --[ Notify Commit Digest team of something interesting ]-------------|
#DIGEST:

View file

@ -1,21 +0,0 @@
The following checklist is supposed to help you make sure you don't forget anything important in a commit.
Before hacking:
* Does it fit Amarok's vision or at least not work against it?
* Who will maintain the code?
Before committing:
* Does it conform to Amarok's coding style?
* Has it been added to the changelog in case of a bug, feature or UI change?
* Does it introduce new dependencies?
* Does the diff contain only the changes you made and files you added/removed? Does it contain all of them?
* Do existing regression tests still pass?
* Does it add new strings? Is Amarok in string freeze?
* Are you pushing a big change that does not fix a bug while Amarok is in beta?
* Is there a feature request, bug report or review request associated with it? (Please close them with the commit message.)
Additionally for commits introducing new features:
* Is Amarok in feature freeze?
* Are new tests needed?
* Has it been reviewed by a usability person?
* Does user documentation exist?

View file

@ -1,69 +0,0 @@
=== Const Correctness ===
What is const correctness?
It's a programming paradigm that helps writing correct code. In C++, const
correctness comprises a set of different techniques, you can read up about them
here [1]. In this article however I only want to focus on one form of const
correctness, that is object constness.
Why should I care about const correctness?
Because it increases type safety, makes your code more easy to understand, and
it helps making your code correct.
Let's have an example, the following function:
void printStruct( MyStruct* str );
Is it save to assume that MyStruct is unchanged? Can I give it a structure
that is allocated in a read-only memory location?
We can assume this (because of the name of the function) but we can't be sure.
It get's even worse if you use a reference like this:
void printStruct( MyStruct& str );
Now you can't even see in the calling code that something might go wrong since
a line like this:
printStruct( str );
is not seen as dangerous. In C it is always a call-by-value. In C++ it isn't.
The solution is easy. Just declare the function like this:
void printStruct( const MyStruct& str );
Now nothing can go wrong. We get the benefit of a call-by-reference without
the danger.
Now one last problem. What if MyStruct is a class like this:
class MyStruct {
void print();
}
How would the compiler know that calling "print" on the const MyStruct does
not change the object?
The compiler can't. We have to tell it like this:
void print() const;
Now everything is all right. Everybody is on the same page and we don't
have to look an hour which function might have changed our variables
in some unexpected place.
A last word about payoff.
Regardless if we are just programming for fun or professionally we should
think about payoff.
Writing "const" all over the place is confusing, costs time and leads
to compile time errors.
So why the effort?
This does not really prevent many bugs. At least in my experience.
However it has one big benefit: It really helps searching bugs. Const-
correctness is really a nice thing since we are using more time searching
bugs than actually programming.
[1] http://www.parashift.com/c++-faq-lite/const-correctness.html

View file

@ -1,8 +0,0 @@
This command is mandatory for all amarok developers:
git config branch.master.rebase true
The result of this is that all "git pull" commands will do a rebase rather then a merge.
Your local commits will be rewritten (parented to origin/master). The prevents the log
to become unreadable because of all the merge commits.
Note: rebasing can be dangerous. Check before pushing if something looks fishy.

View file

@ -1,383 +0,0 @@
Hacking on Amarok
-----------------
Have a look at the community wiki for further information.
Also have a look at the requirements for Amarok here:
http://community.kde.org/Amarok/Development/Requirements
Join the irc channel.
New requirements, bugfixes and every other patch goes to the
review board.
Try not to post patches in the bugs database or the mailing list.
Please respect these guidelines when coding for Amarok, thanks!
* Where this document isn't clear, refer to Amarok code.
This C++ FAQ is a life saver in many situations, so you want to keep it handy:
http://www.parashift.com/c++-faq-lite/
Formatting
----------
* Spaces, not tabs
* Indentation is 4 spaces
* Lines should be limited to 90 characters
* Spaces between brackets and argument functions, except for template arguments
* For pointer and reference variable declarations put a space between the type
and the * or & and no space before the variable name.
* For if, else, while and similar statements put the brackets on the next line,
although brackets are not needed for single statements.
* Function and class definitions have their brackets on separate lines
* A function implementation's return type is on its own line.
* CamelCase.{cpp,h} style file names.
* Qt includes a foreach keyword which makes it very easy to iterate over all
elements of a container.
Example:
| bool
| MyClass::myMethod( QStringList list, const QString &name )
| {
| if( list.isEmpty() )
| return false;
|
| /* Define the temporary variable like this to restrict its scope
| * when you do not need it outside the loop. Let the compiler
| * optimise it. */
| foreach( const QString &string, list )
| debug() << "Current string is " << string << endl;
|
| switch( m_enumValue )
| {
| case Something:
| return true;
| case SomethingElse:
| {
| int auxiliaryVariable; // needs scoping in case construct
| break;
| }
| }
| }
Using "astyle" for auto formatting
----------------------------------
The program astyle can be used to automatically format source code, which can
be useful for badly formatted 3rd party patches.
Use it like this to get (approximately) Amarok formatting style:
"astyle -s4 -b -p -U -D -o source.cpp"
Class, Function & Variable Naming
---------------------------------
*Use CamelCase for everything.
*Local variables should start out with a lowercase letter.
*Class names are captialized
*Prefix class member variables with m_, ex. m_trackList.
*Prefix static member variables with s_, ex s_instance
*Functions are named in the Qt style. It's like Java's, without the "get"
prefix.
*A getter is variable()
*If it's a getter for a boolean, prefix with 'is', so isCondition()
*A setter is setVariable( arg ).
Includes
--------
Header includes should be listed in the following order:
- Own Header
- Amarok includes, relative to src/ (or shared/) preferably
- KDE includes, <KJob> is preferred to <kjob.h>
- Qt includes
- other includes
They should also be sorted alphabetically (case-sensitively: classes on same level before
folders), for ease of locating them. A small comment if applicable is also helpful.
Includes in a header file should be kept to the absolute minimum, as to keep compile times
low. This can be achieved by using "forward declarations" instead of includes, like
"class QListView;"
TIP:
Kate/KDevelop users can sort the headers automatically. Select the lines you want to sort,
then Tools -> Filter Selection Through Command -> "sort".
In vim the same can be achieved by marking the block, and then doing ":sort".
Example:
| #include "MySuperWidget.h"
|
| #include "EngineController.h"
| #include "core/playlists/Playlist.h"
| #include "core/support/Debug.h"
| #include "core/support/Amarok.h"
|
| #include <KDialogBase> // baseclass
| #include <KPushButton> // see function...
|
| #include <QGraphicsView>
| #include <QWidget>
Comments
--------
Comment your code. Don't comment what the code does, comment on the purpose of the code. It's
good for others reading your code, and ultimately it's good for you too.
Comments are essential when adding a strange hack, like the following example:
| /**
| * Due to xine-lib, we have to make K3Process close all fds, otherwise we get "device
| * is busy" messages. Used by AmarokProcIO and AmarokProcess, exploiting commSetupDoneC(),
| * a virtual method that happens to be called in the forked process.
| * See bug #103750 for more information.
| */
| class AmarokProcIO : public K3ProcIO
| {
| public:
| virtual int commSetupDoneC();
| };
Otherwise the comment is in the header. Use the Doxygen syntax. See: http://www.stack.nl/~dimitri/doxygen/
You should be able to write this comment and explain the what the function does.
If you can't, go back to the code and think what you really wanted to do.
If the comment is getting to complicated or confusing, go back to the code and do better.
Example:
| /**
| * Start playback.
| * @param offset Start playing at @p msec position.
| * @return True for success.
| */
| virtual bool play( uint offset = 0 ) = 0;
Header Formatting
-----------------
General rules apply here. Please keep header function definitions aligned nicely,
if possible. It helps greatly when looking through the code. Sorted methods,
either by name or by their function (ie, group all related methods together) is
great too. Access levels should be sorted in this order: public, protected, private.
| #ifndef AMAROK_QUEUEMANAGER_H
| #define AMAROK_QUEUEMANAGER_H
|
| #include <QListView>
|
| namespace MyNamespace {
| /**
| * View showing currently queued tracks.
| */
| class QueueList : public QListView
| {
| Q_OBJECT
|
| public:
| explicit QueueList( QWidget *parent, const QString ̛&name = QString() );
| ~QueueList();
|
| public slots:
| void moveSelectedUp();
| void moveSelectedDown();
|
| private:
| int m_member;
| QHash<int, QString> m_names;
| };
| } // namespace MyNamespace
|
| #endif /* AMAROK_QUEUEMANAGER_H */
Associated .cpp file could look like (skipping license):
| #define DEBUG_PREFIX "MyNamespace::QueueList" // only if you use debug(), warning()...
|
| #include "QueueList.h"
|
| using namespace MyNamespace;
|
| QueueList::QueueList( QWidget *parent, const QString ̛&name )
| : QListView( parent )
| , m_member( name.length() )
| {
| }
0 vs NULL
---------
The use of 0 to express a null pointer is preferred over the use of NULL.
0 is not a magic value, it's the defined value of the null pointer in C++.
NULL, on the other hand, is a preprocessor directive (#define) and not only is
it more typing than '0' but preprocessor directives are less elegant.
| SomeClass *instance = 0;
Const Correctness
-----------------
Try to keep your code const correct. Declare methods const if they don't mutate the object,
and use const variables. It improves safety, and also makes it easier to understand the code.
See: http://www.parashift.com/c++-faq-lite/const-correctness.html
const_correstness.txt
Example:
| bool
| MyClass::isValidFile( const QString &path ) const
| {
| const bool valid = QFile::exist( path );
| return valid;
| }
Debugging
---------
debug.h contains some handy functions for our debug console output.
Please use them instead of kDebug().
Usage:
| #include "debug.h"
|
| debug() << "Something is happening";
| warning() << "Something bad may happen";
| error() << "Something bad did happen!";
Additionally, there are some macros for debugging functions:
DEBUG_BLOCK
DEBUG_FUNC_INFO
DEBUG_LINE_INFO
DEBUG_INDENT
DEBUG_UNINDENT
AMAROK_NOTIMPLEMENTED
AMAROK_DEPRECATED
threadweaver.h has two additional macros:
DEBUG_THREAD_FUNC_INFO outputs the memory address of the current QThread or 'none'
if its the original GUI thread.
SHOULD_BE_GUI outputs a warning message if it occurs in a thread that isn't in
the original "GUI Thread", otherwise it is silent. Useful for documenting
functions and to prevent problems in the future.
Errors & Asserts
----------------
*Use Q_ASSERT where appropriate. If you don't know what an assert is, look it up now.
*Never use fatal(). There must be a better option than crashing a user's
application (its not uncommon for end-users to have debugging enabled).
*KMessageBox is fine to use to prompt the user, but do not use it to display errors
or informational messages. Instead, KDE::StatusBar has a few handy methods. Refer to
amarok/src/statusbar/statusBarBase.h
Commenting Out Code
-------------------
Don't keep commented out code. It just causes confusion and makes the source
harder to read. Remember, the last revision before your change is always
availabe in Git. Hence no need for leaving cruft in the source.
Wrong:
| myWidget->show();
| //myWidget->rise(); // what is this good for?
Correct:
| myWidget->show();
Unit Tests and API Docs
-----------------------
Amarok uses the "Jenkins" system for doing automatic nightly builds, checking for
compile errors, and visualizing Unit Tests. You can see the results here:
http://build.kde.org/view/EXTRAGEAR/job/amarok_master/
The API DOc for Amarok can be found here:
http://api.kde.org/extragear-api/multimedia-apidocs/amarok/html/index.html
Tips & Tricks
-------------
A useful service is http://lxr.kde.org. Lxr is a cross reference of the entire
KDE SVN repository. You can for instance use it to search for example code
from other applications for a given KDElibs method.
Markey's .vimrc
---------------
let ruby_no_expensive = 1
syntax on
set shiftwidth=4
set tabstop=4
set expandtab
set hlsearch
set ruler
set smartindent
set nowrap
set ignorecase
set smartcase
set title
set showtabline=2 "Makes the status bar always show, also for just one tab
autocmd FileType ruby set shiftwidth=2 tabstop=2
Git and SVN aware prompt
----------------
The following prompt shows the current git branch if sitting in a git repository.
Random crap courtesy of shell colours.
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;33m\]`git branch 2>/dev/null|cut -f2 -d\* -s`\[\033[00m\]\$ '
This is an even more colorful configuration for .bashrc that displays the
current git branch if sitting in a git repository and the current SVN revision
if sitting in an SVN checkout.
svn_prompt() {
SVNBRANCH=`svn info 2>/dev/null | grep Revision: | cut -f 2 -d " "`
if [ -n "$SVNBRANCH" ]; then
BRANCH=" (r$SVNBRANCH)";
else
BRANCH="";
fi
echo "$BRANCH"
}
export PS1='\[\e[0;32m\]\u@\h\[\e[m\] \[\e[1;34m\]\w\[\e[m\]\[\033[01;33m\]`__git_ps1`\[\e[m\]\[\e[01;35m\]`svn_prompt`\[\e[m\]\[\033[00m\] \[\e[1;32m\]\$ \[\e[m\]\[\e[1;37m\] '
Git KDE commit template
-----------------------
HACKING/commit-template should be used so commits to KDE git servers are properly formatted and using the commit keywords.
configure git to use the template using:
git config commit.template HACKING/commmit-template
Copyright
---------
To comply with the GPL, add your name, email address & the year to the top of any file
that you edit. If you bring in code or files from elsewhere, make sure its
GPL-compatible and to put the authors name, email & copyright year to the top of
those files.
Please note that it is not sufficient to write a pointer to the license (like a URL).
The complete license header needs to be written everytime.
Thanks, now have fun!
-- the Amarok developers

View file

@ -1,51 +0,0 @@
Usage of Amarok::config()
-------------------------
We provide this method for convenience, but it is important to use it properly. By
inspection, we can see that we may produce very obscure bugs in the wrong case:
| KConfig
| *config( const QString &group )
| {
| //Slightly more useful config() that allows setting the group simultaneously
| KGlobal::config()->setGroup( group );
| return KGlobal::config();
| }
Take the following example:
| void
| f1()
| {
| KConfig *config = Amarok::config( "Group 2" );
| config->writeEntry( "Group 2 Variable", true );
| }
|
| void
| doStuff()
| {
| KConfig *config = Amarok::config( "Group 1" );
| f1();
| config->writeEntry( "Group 1 Variable", true );
| }
We would expect the following results:
| [Group 1]
| Group 1 Variable = true
|
| [Group 2]
| Group 2 Variable = true
However because the config group is changed before writing the entry:
| [Group 1]
|
| [Group 2]
| Group 1 Variable = true
| Group 2 Variable = true
Which is clearly incorrect. And hard to see when your wondering why f1() is not
working. So do not store a value of Amarok::config, make it a habit to just
always call writeEntry or readEntry directly.
Correct:
| amarok::config( "Group 1" )->writeEntry( "Group 1 Variable", true );

View file

@ -1,117 +0,0 @@
TIPS FOR CORRECT MEMORY MANAGEMENT WITH C++ AND QT
==================================================
1)
Use of "Smart Pointers":
A smart pointer in C++ means (in its most simple incarnation) a
pointer that automatically sets itself to 0, when the object it points
to is being destroyed (deleted).
Advantages:
No risk of "dangling pointers". A dangling pointer is a pointer that
has been deleted, but still contains the memory address of the object
that has been destroyed. What happens if you delete this again is
called a "double-free", and almost always leads to a crash. With a
smart pointer, you can delete the object safely again, because
deleting a 0-pointer is defined as a safe (doing nothing) operation in
the C++ standard.
Example:
WRONG:
QWidget* foo = new QWidget();
delete foo;
delete foo;
<BOOOOM>
RIGHT:
QPointer<QWidget> foo = new QWidget();
delete foo;
delete foo;
<not nice, but no crash>
2)
Always make sure not to dereference a 0-pointer:
This is _the_ single most common crash cause in Amarok 2 currently.
It's easy to prevent, but unfortunately also easy to miss:
Example:
WRONG:
Meta::TrackPtr foo;
debug() << foo->prettyUrl();
<BOOOOM>
RIGHT:
Meta::TrackPtr foo;
if( foo )
debug() << foo->prettyUrl();
<no output, and no crash>
Also be aware that Amarok is multi-threaded. So somebody could
change pointers while you are looking away like here:
WRONG:
Meta::TrackPtr myTrack;
if( myTrack && myTrack->album() )
debug() << myTrack->album()->name();
<somebody could set the album to 0 just after the if>
RIGHT:
Meta::TrackPtr myTrack;
Meta::AlbumPtr myAlbum = myTrack ? myTrack->album() : 0;
if( myAlbum )
debug() << myAlbum->name();
3)
Private d-pointer classes can be used in cases where the interfaces
of a library should remain stable but the size of members and their
inner working should change.
Qt is doing it. KDE is doing it. We are also doing it in some places
for no apparent reason and no benefit.
However, if you are doing it, never, ever, use private d-pointer
classes in QObject derived subclasses:
What can happen is that you do a "delete d;" in your destructor, and
then Qt goes ahead and auto-deletes other QObject pointers contained
in the private class again, through means of its automatic deleting of
QObjects with a parent Object. -> <BOOOOM>
Read more about this topic in Michael Pyne's interesting blog article:
http://www.purinchu.net/wp/2009/02/04/another-programming-tidbit/
4)
Use Valgrind:
<Ralf disagrees. Larger projects with big libraries will have so
many dirty places that Valgrind reports too many issues.
Our own way of handling singleton objects does not help. They
just leak. Instead have a sharp look at all your instance variables.
Ensure that all are initialized in the constructor and all deleted
in the destructor.>
This is one of the most advanced memory debugging tools available,
it's free, and we even have found volunteers that run regular Valgrind
checks (both for memory access bugs and memory leaks) on Amarok trunk.
Reading the Valgrind logs correctly is a bit of an art in itself, but
I'm willing to explain this in another posting, if there is a demand.
Recommended reading on the topic of memory management is this page of
the excellent "C++ FAQ Lite":
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html

View file

@ -1,616 +0,0 @@
Warning: outdated.
Look at HACKING/amarokTables.svg and keep it up to date.
-- MySQL dump 10.13 Distrib 5.1.58, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: amarok
-- ------------------------------------------------------
-- Server version 5.1.58-1ubuntu1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `admin`
--
DROP TABLE IF EXISTS `admin`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `admin` (
`component` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`version` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `albums`
--
DROP TABLE IF EXISTS `albums`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `albums` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`artist` int(11) DEFAULT NULL,
`image` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `albums_name_artist` (`name`,`artist`),
KEY `albums_name` (`name`),
KEY `albums_artist` (`artist`),
KEY `albums_image` (`image`)
) ENGINE=MyISAM AUTO_INCREMENT=547 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `amazon`
--
DROP TABLE IF EXISTS `amazon`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `amazon` (
`asin` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`locale` varchar(2) COLLATE utf8_bin DEFAULT NULL,
`filename` varchar(33) COLLATE utf8_bin DEFAULT NULL,
`refetchdate` int(11) DEFAULT NULL,
KEY `amazon_date` (`refetchdate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `artists`
--
DROP TABLE IF EXISTS `artists`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `artists` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `artists_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=966 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `bookmark_groups`
--
DROP TABLE IF EXISTS `bookmark_groups`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `bookmark_groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`custom` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `bookmarks`
--
DROP TABLE IF EXISTS `bookmarks`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `bookmarks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`url` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`custom` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `composers`
--
DROP TABLE IF EXISTS `composers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `composers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `composers_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=268 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `devices`
--
DROP TABLE IF EXISTS `devices`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `devices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`label` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`lastmountpoint` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`uuid` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`servername` varchar(80) COLLATE utf8_bin DEFAULT NULL,
`sharename` varchar(240) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `devices_uuid` (`uuid`),
KEY `devices_type` (`type`),
KEY `devices_rshare` (`servername`,`sharename`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `directories`
--
DROP TABLE IF EXISTS `directories`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `directories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deviceid` int(11) DEFAULT NULL,
`dir` varchar(1000) COLLATE utf8_bin NOT NULL,
`changedate` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `directories_deviceid` (`deviceid`)
) ENGINE=MyISAM AUTO_INCREMENT=1051 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `genres`
--
DROP TABLE IF EXISTS `genres`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `genres` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `genres_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=132 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `images`
--
DROP TABLE IF EXISTS `images`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`path` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `images_name` (`path`)
) ENGINE=MyISAM AUTO_INCREMENT=356 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `labels`
--
DROP TABLE IF EXISTS `labels`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `labels` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`label` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `labels_label` (`label`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `lyrics`
--
DROP TABLE IF EXISTS `lyrics`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `lyrics` (
`url` int(11) NOT NULL,
`lyrics` text COLLATE utf8_bin,
PRIMARY KEY (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `magnatune_albums`
--
DROP TABLE IF EXISTS `magnatune_albums`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `magnatune_albums` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`year` int(11) DEFAULT NULL,
`artist_id` int(11) DEFAULT NULL,
`album_code` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`cover_url` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `magnatune_albums_name` (`name`),
KEY `magnatune_albums_artist_id` (`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1154 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `magnatune_artists`
--
DROP TABLE IF EXISTS `magnatune_artists`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `magnatune_artists` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`artist_page` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`photo_url` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `magnatune_artists_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=500 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `magnatune_genre`
--
DROP TABLE IF EXISTS `magnatune_genre`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `magnatune_genre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`album_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `magnatune_genre_name` (`name`),
KEY `magnatune_genre_album_id` (`album_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2783 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `magnatune_moods`
--
DROP TABLE IF EXISTS `magnatune_moods`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `magnatune_moods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`track_id` int(11) DEFAULT NULL,
`mood` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2762 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `magnatune_tracks`
--
DROP TABLE IF EXISTS `magnatune_tracks`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `magnatune_tracks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`track_number` int(11) DEFAULT NULL,
`length` int(11) DEFAULT NULL,
`album_id` int(11) DEFAULT NULL,
`artist_id` int(11) DEFAULT NULL,
`preview_lofi` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`preview_ogg` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`preview_url` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `magnatune_tracks_album_id` (`album_id`),
KEY `magnatune_tracks_artist_id` (`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=14831 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `playlist_groups`
--
DROP TABLE IF EXISTS `playlist_groups`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `playlist_groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_podchannel` (`parent_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `playlist_tracks`
--
DROP TABLE IF EXISTS `playlist_tracks`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `playlist_tracks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`playlist_id` int(11) DEFAULT NULL,
`track_num` int(11) DEFAULT NULL,
`url` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`title` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`album` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`artist` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`length` int(11) DEFAULT NULL,
`uniqueid` varchar(128) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_playlist_tracks` (`playlist_id`),
KEY `playlist_tracks_uniqueid` (`uniqueid`)
) ENGINE=MyISAM AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `playlists`
--
DROP TABLE IF EXISTS `playlists`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `playlists` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`description` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`urlid` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_playlist` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `podcastchannels`
--
DROP TABLE IF EXISTS `podcastchannels`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `podcastchannels` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` text COLLATE utf8_bin,
`title` text COLLATE utf8_bin,
`weblink` text COLLATE utf8_bin,
`image` text COLLATE utf8_bin,
`description` text COLLATE utf8_bin,
`copyright` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`directory` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`labels` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`subscribedate` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`autoscan` tinyint(1) DEFAULT NULL,
`fetchtype` int(11) DEFAULT NULL,
`haspurge` tinyint(1) DEFAULT NULL,
`purgecount` int(11) DEFAULT NULL,
`writetags` tinyint(1) DEFAULT NULL,
`filenamelayout` varchar(1024) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `url_podchannel` (`url`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `podcastepisodes`
--
DROP TABLE IF EXISTS `podcastepisodes`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `podcastepisodes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` text COLLATE utf8_bin,
`channel` int(11) DEFAULT NULL,
`localurl` text COLLATE utf8_bin,
`guid` varchar(1000) COLLATE utf8_bin DEFAULT NULL,
`title` text COLLATE utf8_bin,
`subtitle` text COLLATE utf8_bin,
`sequencenumber` int(11) DEFAULT NULL,
`description` text COLLATE utf8_bin,
`mimetype` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`pubdate` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`duration` int(11) DEFAULT NULL,
`filesize` int(11) DEFAULT NULL,
`isnew` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `url_podepisode` (`url`),
FULLTEXT KEY `localurl_podepisode` (`localurl`)
) ENGINE=MyISAM AUTO_INCREMENT=263 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `statistics`
--
DROP TABLE IF EXISTS `statistics`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `statistics` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` int(11) NOT NULL,
`createdate` int(11) DEFAULT NULL,
`accessdate` int(11) DEFAULT NULL,
`score` float DEFAULT NULL,
`rating` int(11) NOT NULL DEFAULT '0',
`playcount` int(11) NOT NULL DEFAULT '0',
`deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `statistics_url` (`url`),
KEY `statistics_createdate` (`createdate`),
KEY `statistics_accessdate` (`accessdate`),
KEY `statistics_score` (`score`),
KEY `statistics_rating` (`rating`),
KEY `statistics_playcount` (`playcount`)
) ENGINE=MyISAM AUTO_INCREMENT=6721 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `statistics_permanent`
--
DROP TABLE IF EXISTS `statistics_permanent`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `statistics_permanent` (
`url` varchar(324) COLLATE utf8_bin NOT NULL,
`firstplayed` datetime DEFAULT NULL,
`lastplayed` datetime DEFAULT NULL,
`score` float DEFAULT NULL,
`rating` int(11) DEFAULT '0',
`playcount` int(11) DEFAULT NULL,
UNIQUE KEY `stats_perm_url` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `statistics_tag`
--
DROP TABLE IF EXISTS `statistics_tag`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `statistics_tag` (
`name` varchar(108) COLLATE utf8_bin DEFAULT NULL,
`artist` varchar(108) COLLATE utf8_bin DEFAULT NULL,
`album` varchar(108) COLLATE utf8_bin DEFAULT NULL,
`firstplayed` datetime DEFAULT NULL,
`lastplayed` datetime DEFAULT NULL,
`score` float DEFAULT NULL,
`rating` int(11) DEFAULT '0',
`playcount` int(11) DEFAULT NULL,
UNIQUE KEY `stats_tag_name_artist_album` (`name`,`artist`,`album`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `tracks`
--
DROP TABLE IF EXISTS `tracks`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tracks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` int(11) DEFAULT NULL,
`artist` int(11) DEFAULT NULL,
`album` int(11) DEFAULT NULL,
`genre` int(11) DEFAULT NULL,
`composer` int(11) DEFAULT NULL,
`year` int(11) DEFAULT NULL,
`title` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`comment` text COLLATE utf8_bin,
`tracknumber` int(11) DEFAULT NULL,
`discnumber` int(11) DEFAULT NULL,
`bitrate` int(11) DEFAULT NULL,
`length` int(11) DEFAULT NULL,
`samplerate` int(11) DEFAULT NULL,
`filesize` int(11) DEFAULT NULL,
`filetype` int(11) DEFAULT NULL,
`bpm` float DEFAULT NULL,
`createdate` int(11) DEFAULT NULL,
`modifydate` int(11) DEFAULT NULL,
`albumgain` float DEFAULT NULL,
`albumpeakgain` float DEFAULT NULL,
`trackgain` float DEFAULT NULL,
`trackpeakgain` float DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tracks_url` (`url`),
KEY `tracks_id` (`id`),
KEY `tracks_artist` (`artist`),
KEY `tracks_album` (`album`),
KEY `tracks_genre` (`genre`),
KEY `tracks_composer` (`composer`),
KEY `tracks_year` (`year`),
KEY `tracks_title` (`title`),
KEY `tracks_discnumber` (`discnumber`),
KEY `tracks_createdate` (`createdate`),
KEY `tracks_length` (`length`),
KEY `tracks_bitrate` (`bitrate`),
KEY `tracks_filesize` (`filesize`)
) ENGINE=MyISAM AUTO_INCREMENT=6721 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `urls`
--
DROP TABLE IF EXISTS `urls`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `urls` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deviceid` int(11) DEFAULT NULL,
`rpath` varchar(324) COLLATE utf8_bin NOT NULL,
`directory` int(11) DEFAULT NULL,
`uniqueid` varchar(128) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniqueid` (`uniqueid`),
UNIQUE KEY `urls_id_rpath` (`deviceid`,`rpath`),
KEY `urls_uniqueid` (`uniqueid`),
KEY `urls_directory` (`directory`)
) ENGINE=MyISAM AUTO_INCREMENT=6721 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `urls_labels`
--
DROP TABLE IF EXISTS `urls_labels`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `urls_labels` (
`url` int(11) DEFAULT NULL,
`label` int(11) DEFAULT NULL,
KEY `urlslabels_url` (`url`),
KEY `urlslabels_label` (`label`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `years`
--
DROP TABLE IF EXISTS `years`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `years` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `years_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=73 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2011-12-21 12:50:14

View file

@ -1,40 +0,0 @@
QWeakPointer
====================
QWeakPointer is a guarded pointer for QObjects, so it automatically becomes 0 when
the data it points to is deleted. If you have a member variable that's a QObject
and are ever worried that it might be dangling, make it a QWeakPointer. There's
really no reason not to for variables that stick around, it adds little
overhead.
KSharedPtr
====================
Unlike QWeakPointer, KSharedPtr is dangerous and must be used carefully.
== Undercounting ==
KSharedPtr uses reference counting. When a KSharedPtr is in scope, it adds one
to the reference counter. When a KSharedPtr loses scope, it deletes one from the
reference count. When the reference count become 0 it deletes the object. So if
there were any normal pointers to that data and all the KSharedPtrs are deleted,
then the object is deleted and the normal pointers dangle. Segfaults ensue.
The solution is to just make sure that any normal pointers are temporary and
everything else is a KSharedPtr if reference counting is required for your class. Even
if the pointer is temporary, but is then handed off to some other class that
might keep it around, thats a potentional crash now or in the future.
== Reference Cycles ==
One issue with reference counting in general is the creation of a reference
cycle. If class A has a KSharedPtr<B> property and class B has a KSharedPtr<A>
property and two objects of A and B point to each other and the KSharedPtrs
loose scope, a reference cycle is created. Despite not being accessible from
anywhere in the program, the reference counter of KSharedPtr<A> and
KSharedPtr<B> will never go to 0. Memory leaks. The solution is to be careful.
== Dreaded Diamonds ==
Since the objects KSharedPtr point to must derive from QSharedData, it's not
uncommon for a "dreaded diamond" inheritance issue to arise. Basically if A and
B both inherit QSharedData and C inherits A and B, then C inherits QSharedData
twice. The solution is really easy, just add a 'virtual' keyword when A and B
inherit QSharedData. Eg class A : public virtual QSharedData. Details at:
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8

View file

@ -1,58 +0,0 @@
Preface:
======
You've probably noticed the epic struggle we've had with Amarok 2
hanging on exit. After _months_ of tinkering I've now been able to
identify and fix this issue. This document explains how to prevent
such issues in the future.
What is a static object?
=================
A static object is being initialized on program start, and will only
become instantiated once. It's conveniently used with the singleton
design pattern, e.g. in Amarok code.
Example:
static AmarokMenu s_menu;
What is so dangerous about static objects?
================================
A static object's destructor is called _after_ the QApplication
destructor has been executed. This is fine for plain old datatypes
(POD) like int, float, and pointers, as they do not have a destructor.
It's also fine for objects with a trivial destructor that does not
interfere with the rest of the program.
The danger lies in using static objects that call other parts of the
application in their destructor. This is e.g. true for most QObjects,
which rely on the QApplication being intact. If the QApplication is
destroyed before the static QObject's destructor is run, _bad_ things
can happen. To name a few: Crashing, hanging, eating live kitten, or
forcing you to use XMMS.
How can I prevent these problems?
==========================
Use K_GLOBAL_STATIC, and use qAddPostRoutine() to ensure that the
static object's destructor is called when QCoreApplication destructs.
Example:
class AmarokMenu : public QMenu
{
AmarokMenu();
};
K_GLOBAL_STATIC( AmarokMenu, s_menu )
AmarokMenu::AmarokMenu()
{
// K_GLOBAL_STATIC is cleaned up *after* Q(Core)Application is gone
// but we have to cleanup before -> use qAddPostRoutine
qAddPostRoutine( s_menu.destroy );
}
Further reading:
===========
http://api.kde.org/4.0-api/kdelibs-apidocs/kdecore/html/group__KDEMacros.html
Thanks for reading, and happy hacking :)

View file

@ -1,33 +0,0 @@
/****************************************************************************************
* Copyright (c) 2010 Foo Bar <foo@bar.com> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#include "Template.h"
#include "Debug.h"
Template::Template()
{
DEBUG_BLOCK
}
Template::~Template()
{
DEBUG_BLOCK
}
#include "moc_Template.cpp"

View file

@ -1,44 +0,0 @@
/****************************************************************************************
* Copyright (c) 2010 Foo Bar <foo@bar.com> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef AMAROK_TEMPLATE_H
#define AMAROK_TEMPLATE_H
#include <QObject>
/**
* A class for blah
*
**/
class /*AMAROK_EXPORT*/ Template : public QObject
{
Q_OBJECT
public:
Template();
~Template();
public Q_SLOTS:
protected:
private Q_SLOTS:
private:
};
#endif // end include guard

View file

@ -1,96 +0,0 @@
=== USABILITY ===
This article was originally published here:
http://amarok.kde.org/blog/archives/1132-Micro-Options,-Many-Options,-No-Options-A-practical-guide-to-help-you-decide..html
Not very long ago, Aaron wrote an article about improving our user experience, stating that
"Micro-Options Suck". Coincidentally, an article appeared on dot.kde.org only a few hours later, stating the
following: "Choice Is Not A Usability Problem".
Ardent readers will notice that there is possibly a contradiction here. In this
article I would like to explain why this is not really a contradiction, but
rather a misunderstanding. To get us started, let's make a jump back in time
(using Flux Capacitor technology):
The year is 2004. It's cold. You are alone. There is a house in the north
(called "KDE"), and a house in the south ("GNOME"). Press "n" or "s".
> n
You have entered the house of KDE. It's a big house, full of obscure items. The
sheer number of items is highly impressive, but you get confused. It is too
much. What is your next step? Press "n" or "s".
> s
You have entered the house of GNOME. This house is neat, clean, but also kind of
empty. There are very few things to play with. You get confused. What is your
next step?
> I give up. User reboots into Windows.
The gist of this little analogy:
KDE was wrong. GNOME was wrong. Also - they both were right!
This is quite obviously another contradiction. Obviously this means that Mark is
not quite right in the head! Well, you're possibly right on both accounts, but
let me explain why it actually makes sense: The truth is somewhere in
between.
KDE has historically been known for being "the nerd's desktop". Basically, we
were so proud of having our own desktop that we quickly determined that giving
everyone as much freedom as possible is ideal. After all, the competition
(Windows) did not offer this. Developer A came along, going "Hey, I have this
fancy idea. It's a bit weird, but let me show you!". Developer B was quick to
reply: "Hell yeah, why not? After all this is our own desktop. We can make all
of our dreams come true. Let's do it!"
GNOME has historically been known for being very sparse with options. They did
this for a good reason: Someone smart realized that KDE was totally going
overboard with options. Too much is too much. Let me show you a classical
example:
http://amarok.kde.org/blog/uploads/crypto_ssl.jpg
Now let me show you an example of the Dolphin settings dialog:
http://amarok.kde.org/blog/uploads/dolphin_settings.png
Dolphin has won 2009's Akademy Award for "Best Application". The above
screenshot demonstrates one of our reasons for choosing it: Peter Penz realized
what generations of GUI developers (both in KDE and GNOME) got wrong: The true
secret to getting your settings right is choosing the essential ones, while
making good choices for defaults that don't need micro-options.
Unfortunately, this is not easy, and it separates the good GUI designer from the
bad one. In fact making these choices is bloody damn hard, I kid you not. It
requires a lot of thought, experience, and taste. But in the end, you, as a
developer, are responsible for making these choices. Creating software is not
about giving the user a LEGO blocks game. If options get too complex, the users
might as well learn programming and do it all by themselves. That's because, if
you think about it, choosing an option is programming: You make the
program use one code path, or a different one. This is essentially the same as
an "if() {}; else() {};" block wrapped in GUI sugar.
To sum it up:
Before adding an option, think hard about it. Could the same be achieved with a
smarter algorithm? Often options are bad excuses for deciding between one bad
implementation and another bad one. Find a good one!
Don't try to solve the problem by removing all options. Some options are very
useful, and they are actually needed. Finding out which of these are needed is
the developer's task. It's a hard task, but it can be done.
Consider asking professionals. We have a KDE Usability team, comprised of real
experts on this topic. Among them is Celeste, a member of the KDE board. She
knows what she's talking about, and she's generally very helpful. Don't be shy,
ask them!

View file

@ -1,7 +0,0 @@
Installing Amarok
=================
Build instructions can be found at
% http://community.kde.org/Amarok/Development/Compiling
% http://techbase.kde.org/Getting_Started/Build/KDE4

View file

@ -1,5 +0,0 @@
Amarok does not have clear maintainers of all parts of the codebase. The current list of components and maintainers can be found here: http://community.kde.org/Amarok/Development/Components
You are welcome to work on any part of it provided you coordinate with others working in that part.
If you need to contact someone about a particular part it is best to contact the developer mailing list at amarok-devel@kde.org or the assignee of the corresponding component on http://bugs.kde.org directly.

View file

@ -1,46 +0,0 @@
/** @mainpage The Amarok Source Code Documentation
<p>
This is the developer online reference for the Amarok music player.
To follow or get involved with the development of Amarok,
join the <a href="https://mail.kde.org/mailman/listinfo/amarok-devel">amarok-devel mailing list</a>.
Instructions for building a development version of KDE can be found in the
<a href="http://techbase.kde.org/Getting_Started">getting started</a> section
of the <a href="http://techbase.kde.org">KDE Techbase</a>.
</p>
@maintainers
Amarok does not have clear maintainers of any part of the codebase. You are welcome to work on any part of it provided you coordinate with others working in that part. <br/>
If you need to contact someone about a particular part it is best to contact the developer mailing list at amarok-devel@kde.org or the assignee of the corresponding component on http://bugs.kde.org directly.
@authors
<!--
To update the authors list, use the following:
$ cat AUTHORS | sed 's#<#\\<#' | sed 's#>#\\><br/>#'
-->
Bart Cerneels \<bart.cerneels@kde.org\><br/>
Edward Toroshchin \<edward.hades@gmail.com\><br/>
Leo Franchi \<lfranchi@kde.org\><br/>
Mark Kretschmann \<kretschmann@kde.org\><br/>
Matěj Laitl \<matej@laitl.cz\><br/>
Myriam Schweingruber \<myriam@kde.org\><br/>
Patrick von Reth \<patrick.vonreth@gmail.com\><br/>
Ralf Engels \<ralf-engels@gmx.de\><br/>
Rick W. Chen \<stuffcorpse@archlinux.us\><br/>
Sam Lade \<sam@sentynel.com\><br/>
Sven Krohlas \<sven@asbest-online.de\><br/>
Téo Mrnjavac \<teo@kde.org\><br/>
Valorie Zimmerman \<valorie@kde.org\><br/>
@licenses
@gpl (if not stated otherwise in the source file)
*/
// DOXYGEN_NAME = Amarok
// DOXYGEN_ENABLE = YES
// vim:ts=4:sw=4:expandtab:filetype=doxygen

View file

@ -1,3 +0,0 @@
#! /bin/sh
$XGETTEXT_QT utilities/collectionscanner/CollectionScanner.cpp -o $podir/amarokcollectionscanner_qt.pot

View file

@ -1,178 +0,0 @@
Amarok - the audio player for KDE
===================================
There are many media players around these days, it's true. What's missing from most
players is a user interface that doesn't get in the way of the user. How many
buttons do you have to press for simply adding some new tracks to the playlist?
Amarok tries to be a little different, providing a simple drag and drop interface
that really makes playlist handling easy.
FEATURES
==========
* Quick and simple drag and drop playlist creation
* Music library
* Cross platform: Support for Unix, MacOS X and Windows
* Plays all audio formats known to man
* Cover art download using Last.fm services
* Automatic play-statistics generation (iRate style)
* Full lyrics download
* Learn about your music with integrated Wikipedia
* Full Last.fm support
* gpodder.net support
* Configurable on screen display for track changes
* Podcast support
* iPod support, as well as other media players
* Powerful scripting interface
* KDE integration
* Integration with multiple web sources including Magnatune, Jamendo,
Ampache, MP3tunes, and others.
--------------------------------------------------------------------------------
DEPENDENCIES
==============
Required
* KDE-Libs 4.8.4 (or newer) + KDE-Base-runtime 4.8 (oxygen-icons) (or newer)
http://www.kde.org
* Phonon backend, one of the following is strongly recommended
* phonon-gstreamer 4.6.3 (or newer)
* phonon-vlc 0.6.1 (or newer; as of 0.6.1 doesn't yet play Audio CDs, bug 313046)
* Qt 4.8.3 (or newer)
http://qt-project.org
* TagLib 1.7 (or newer)
(Metadata tagging library)
* TagLib Extras 1.0.1 (or newer)
(Support for metadata reading of additional file types)
svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib-extras
* MySQL 5.0 (or newer) Embedded: libmysqld compiled with fPIC
(In-process database support)
* QtScript Generator, Qt Bindings 0.1.0
(Qt Bindings for QtScript for Amarok's scripting system)
http://code.google.com/p/qtscriptgenerator/
http://qt.gitorious.org/qt-labs/qtscriptgenerator
* LibQCA 2.0.2 (or newer)
(Qt Cryptographic Architecture)
http://delta.affinix.com/qca/
Optional
* Taglib 1.8 for support of MOD, IT, S3M and XM files
* Taglib 1.9 for support of Opus files
http://developer.kde.org/~wheeler/taglib.html
https://github.com/taglib/taglib
* iPod support requires:
* libgpod 0.8.2 (or newer)
http://www.gtkpod.org/libgpod/
* optional iPod album artwork support requires:
* libgpod built with GDKPixBuf support enabled
* GDKPixBuf 2.0 (or newer) itself
* libmtp 1.0.0 (or newer)
(MTP device support)
http://libmtp.sourceforge.net/
* Spectrum analyzer requires:
* QtOpenGL
* Mp3tunes.com integration (including syncronization) requires:
* OpenSSL http://www.openssl.org
* libxml2 http://xmlsoft.org
* libcurl http://curl.haxx.se
* Glib2 http://www.gtk.org
* Loudmouth, the Jabber library, http://www.loudmouth-project.org/
* Qt must be compiled with Glib enabled
* Liblastfm 1.0.3 (or newer)
(For scrobbling, internet radio, and artist info)
http://cdn.last.fm/client/liblastfm-1.0.3.tar.gz
https://github.com/eartle/liblastfm
* QJson 0.7 (or newer)
(Qt JSON Parser for the Playdar Collection)
http://qjson.sourceforge.net/
* MySQL 5.0 (or newer) Server (external database support)
* MusicBrainz-based audio fingerprint tag lookup requires:
* FFmpeg 0.7.0 (or newer) - http://ffmpeg.org/
* libavcodec & libavformat specifically
* LibOFA - http://code.google.com/p/musicip-libofa/
* gpodder.net Podcast Provider & Service
* libmygpo-qt 1.0.7 (or newer)
* Transcoding requires (at runtime):
* FFmpeg 0.7.0 (or newer) - http://ffmpeg.org/
* For all supported encoders to be available in Amarok, FFmpeg needs to
support the following codecs:
* libfaac (NOT just "aac")
* alac
* flac
* libmp3lame (NOT just "mp3")
* libvorbis (NOT just "vorbis")
* wmav2
* CD support requires:
* audiocd-kio - http://www.kde.org/ (part of KDE multimedia)
* Downloading songs from Amazon works best on non Windows systems using
* clamz - https://code.google.com/p/clamz/
* The official downloader should work fine on Windows, too. But it's broken on many Linux systems.
* Building tests require:
* gmock 1.4 (or newer) - http://code.google.com/p/googlemock/
Please note that if compiling from source you also need to install -dev/-devel
versions of these packages, depending on your distribution.
--------------------------------------------------------------------------------
IMPORTANT INSTALL INSTRUCTIONS
================================
To compile from source, please refer to the INSTALL file.
Packages for popular distributions are available at http://amarok.kde.org
--------------------------------------------------------------------------------
FURTHER RESOURCES
===================
For answers to problems like "Amarok won't play any MP3s!" and "My MP3s skip
and stutter!" please visit:
http://amarok.kde.org/
--------------------------------------------------------------------------------
CONTRIBUTING
==============
If you wish to contribute to Amarok, you should build it from Git and subscribe
to the amarok AT kde.org mailing list. The IRC channel is also a place where
it's nice to be. There you can talk to other developers easily, and you can see
instant notifications of commits to the Git master repository. For instant email
notification of commits, visit http://commitfilter.kde.org/ , and http://amarok.be/fisheye
provides a slightly-less-instant overview.
More information at:
http://community.kde.org/Amarok/Development/Join
See you on IRC!
--------------------------------------------------------------------------------
WWW: http://amarok.kde.org
MAIL: amarok@kde.org
IRC: irc.freenode.net - #amarok, #amarok.de, #amarok.es, #amarok.fr

View file

@ -1,2 +0,0 @@
Open amarok bugs are listed here:
http://tinyurl.com/allamarokbugs

View file

@ -1,3 +0,0 @@
[Project]
Manager=KDevCMakeManager
Name=amarok

View file

@ -1,3 +0,0 @@
add_subdirectory(modules)

View file

@ -1,8 +0,0 @@
# install the cmake files
file(GLOB cmakeFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.cmake")
set(module_install_dir ${DATA_INSTALL_DIR}/cmake/modules )
install( FILES ${cmakeFiles} DESTINATION ${module_install_dir} )

View file

@ -1,23 +0,0 @@
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -1,14 +0,0 @@
set(CMAKE_REQUIRED_INCLUDES ${QT_INCLUDES})
set(CMAKE_REQUIRED_DEFINITIONS "")
set(CMAKE_REQUIRED_FLAGS "")
CHECK_CXX_SOURCE_COMPILES("
#include <QtCore/QtGlobal>
int main()
{
#if defined(QT_NO_GLIBASDF)
#error \"Qt was compiled with Glib disabled\"
#endif
return 0;
}"
QT4_GLIB_SUPPORT)

View file

@ -1,15 +0,0 @@
# taglib changed filenames to be a char/wchar struct on some platforms, need to check for it
macro (CHECK_TAGLIB_FILENAME TAGLIB_FILENAME_COMPLEX)
include (CheckCXXSourceCompiles)
set (CMAKE_REQUIRED_FLAGS ${TAGLIB_CFLAGS})
set (CMAKE_REQUIRED_INCLUDES ${TAGLIB_INCLUDES})
set (CMAKE_REQUIRED_LIBRARIES ${TAGLIB_LIBRARIES})
check_cxx_source_compiles(
"#include <tfile.h>
int main()
{
TagLib::FileName fileName1(\"char\");
TagLib::FileName fileName2(L\"wchar\");
return 0;
}" ${TAGLIB_FILENAME_COMPLEX})
endmacro (CHECK_TAGLIB_FILENAME)

View file

@ -1,63 +0,0 @@
# - Find GDK-PixBuf
# Find the GDK-PixBuf include directories and libraries
#
# This module defines
# GDKPIXBUF_FOUND - true if the following are found
# GDKPIXBUF_INCLUDE_DIR - GDK-PixBuf include directory
# GDKPIXBUF_LIBRARY - GDK-PixBuf library location
find_package( PkgConfig )
if( PKG_CONFIG_FOUND )
# If pkg-config finds gdk-pixbuf-2.0, this will set:
# PC_GDKPIXBUF_FOUND (to TRUE)
# PC_GDKPIXBUF_INCLUDEDIR
# PC_GDKPIXBUF_INCLUDE_DIRS
# PC_GDKPIXBUF_LIBDIR
# PC_GDKPIXBUF_LIBRARY_DIRS
# These variables are then used as hints to find_path()
# and find_library()
pkg_search_module( PC_GDKPIXBUF gdk-pixbuf-2.0 )
endif( PKG_CONFIG_FOUND )
find_path( GDKPIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h
HINTS
# Hints provided by pkg-config
${PC_GDKPIXBUF_INCLUDEDIR}
${PC_GDKPIXBUF_INCLUDEDIR}/*
${PC_GDKPIXBUF_INCLUDE_DIRS}
PATHS
# Standard include directories
/usr/include/
/sw/include/
/usr/local/include/
${KDE4_INCLUDE_DIR}
# Search all subdirs of the above
/usr/include/*
/sw/include/*
/usr/local/include/*
${KDE4_INCLUDE_DIR}/*
PATH_SUFFIXES
# Subdirectory hints
gdk-pixbuf-2.0
gtk-2.0
)
find_library( GDKPIXBUF_LIBRARY gdk_pixbuf-2.0
HINTS
# Hints provided by pkg-config
${PC_GDKPIXBUF_LIBDIR}
${PC_GDKPIXBUF_LIBRARY_DIRS}
)
include( FindPackageHandleStandardArgs )
# Sets GDKPIXBUF_FOUND to true if GDKPIXBUF_INCLUDE_DIR and
# GDKPIXBUF_LIBRARY are both set
find_package_handle_standard_args( GDKPixBuf DEFAULT_MSG
GDKPIXBUF_LIBRARY
GDKPIXBUF_INCLUDE_DIR
)
if( GDKPIXBUF_FOUND )
message( STATUS "\tInclude directory: ${GDKPIXBUF_INCLUDE_DIR}" )
endif( GDKPIXBUF_FOUND )
mark_as_advanced( GDKPIXBUF_INCLUDE_DIR GDKPIXBUF_LIBRARY )

View file

@ -1,171 +0,0 @@
# - Find Googlemock
# Find the google mock includes and the google mock libraries
# This module defines
# GOOGLEMOCK_INCLUDE_DIR, root google mock include dir
# GOOGLEMOCK_LIBRARY, the path to Google Mock library
# GOOGLEMOCK_LIBRARIES, the path to Google Mock and Google Test library
# GOOGLEMOCK_FOUND, whether Google Mock was found
#
# since google test and google mock is not supposed to be supplied pre-compiled
# we try to find the google mock sources as a fallback
find_program(GMOCK-CONFIG_EXECUTABLE NAMES gmock-config PATHS
${BIN_INSTALL_DIR}
/opt/local/bin
/usr/bin
)
if(GMOCK-CONFIG_EXECUTABLE)
exec_program(${GMOCK-CONFIG_EXECUTABLE} ARGS --includedir OUTPUT_VARIABLE GOOGLEMOCK_INCLUDE_DIR)
exec_program(${GMOCK-CONFIG_EXECUTABLE} ARGS --ldflags OUTPUT_VARIABLE GOOGLEMOCK_LDFLAGS)
exec_program(${GMOCK-CONFIG_EXECUTABLE} ARGS --libs OUTPUT_VARIABLE GOOGLEMOCK_libs_tmp)
set(GOOGLEMOCK_LIBRARIES ${GOOGLEMOCK_LDFLAGS} ${GOOGLEMOCK_libs_tmp})
if(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARIES)
set(GOOGLEMOCK_FOUND TRUE)
message(STATUS "Found libgmock: ${GOOGLEMOCK_INCLUDE_DIR}, ${GOOGLEMOCK_LIBRARIES}")
else(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARIES)
set(GOOGLEMOCK_FOUND FALSE)
if (GOOGLEMOCK_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find required package Googlemock")
endif(GOOGLEMOCK_FIND_REQUIRED)
endif(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARIES)
else(GMOCK-CONFIG_EXECUTABLE)
find_path(GOOGLEMOCK_INCLUDE_DIR NAMES gmock.h
HINTS
~/usr/include
/opt/local/include
/usr/include
/usr/local/include
/opt/kde4/include
${KDE4_INCLUDE_DIR}
PATH_SUFFIXES gmock
)
find_library( GOOGLEMOCK_LIBRARY NAMES gmock
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
find_library( GOOGLEMOCK_DEP_GTEST_LIBRARY NAMES gtest
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
# google-mock >= 1.5 requires pthread
# see: http://code.google.com/p/googlemock/source/browse/trunk/CHANGES
if( NOT WIN32 AND GOOGLEMOCK_LIBRARY )
find_library( GOOGLEMOCK_DEP_PTHREAD_LIBRARY NAMES pthread
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
endif( NOT WIN32 AND GOOGLEMOCK_LIBRARY )
# Google recommends not to distribute a pre-build libary and ubuntu is following
# this advice with libgtest 1.6.0
# However they are distributing sources, so we are looking if we at least have
# them available
if( NOT GOOGLEMOCK_DEP_GTEST_LIBRARY )
find_path( GOOGLEMOCK_SOURCES NAMES gmock
PATHS /usr/src
NO_DEFAULT_PATH
NO_CMAKE_PATH
)
# found googlemock as sources. then we also have the gtest sources since they
# are included
if( GOOGLEMOCK_SOURCES )
find_path( GOOGLEMOCK_DEP_GTEST_SOURCES NAMES gtest
PATHS "${GOOGLEMOCK_SOURCES}/gmock"
NO_DEFAULT_PATH
NO_CMAKE_PATH
)
# make sure that we use the gtest supplied with googlemock
set(GOOGLEMOCK_INCLUDE_DIR
"${GOOGLEMOCK_INCLUDE_DIR}"
"${GOOGLEMOCK_SOURCES}/gmock"
"${GOOGLEMOCK_DEP_GTEST_SOURCES}/gtest/include"
)
elseif( GOOGLEMOCK_SOURCES )
find_path( GOOGLEMOCK_DEP_GTEST_SOURCES NAMES gtest
PATHS /usr/src
NO_DEFAULT_PATH
NO_CMAKE_PATH
)
# in this case we also have to use the static google mock library
set( OLD_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set( CMAKE_FIND_LIBRARY_SUFFIXES .a)
find_library( GOOGLEMOCK_LIBRARY_STATIC NAMES gmock
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
set( CMAKE_FIND_LIBRARY_SUFFIXES ${OLD_CMAKE_FIND_LIBRARY_SUFFIXES})
endif( GOOGLEMOCK_SOURCES )
endif( NOT GOOGLEMOCK_DEP_GTEST_LIBRARY )
# -- googlemock and gtest library available
if(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARY AND GOOGLEMOCK_DEP_GTEST_LIBRARY)
set(GOOGLEMOCK_FOUND TRUE)
set(GOOGLEMOCK_LIBRARIES ${GOOGLEMOCK_LIBRARY} ${GOOGLEMOCK_DEP_GTEST_LIBRARY} ${GOOGLEMOCK_DEP_PTHREAD_LIBRARY})
message(STATUS "Found libgmock: ${GOOGLEMOCK_INCLUDE_DIR}, ${GOOGLEMOCK_LIBRARIES}")
# -- googlemock and gtest sources available
elseif(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARY AND GOOGLEMOCK_DEP_GTEST_SOURCES)
set(GOOGLEMOCK_FOUND TRUE)
set(GOOGLEMOCK_LIBRARIES ${GOOGLEMOCK_LIBRARY_STATIC} gtest)
set(GOOGLEMOCK_GTEST_SOURCES "${GOOGLEMOCK_DEP_GTEST_SOURCES}/gtest" CACHE PATH "Path to the gtest sources")
message(STATUS "Found libgmock but need to build gtest: ${GOOGLEMOCK_INCLUDE_DIR}, ${GOOGLEMOCK_LIBRARIES} ${GOOGLEMOCK_DEP_GTEST_SOURCES}")
# -- googlemock sources and gtest sources available
elseif(GOOGLEMOCK_SOURCES)
set(GOOGLEMOCK_FOUND TRUE)
set(GOOGLEMOCK_LIBRARIES gtest)
set(GOOGLEMOCK_SRCS "${GOOGLEMOCK_SOURCES}/gmock/src/gmock-all.cc" CACHE PATH "Google mock source file that needs to be added")
set(GOOGLEMOCK_SOURCES "${GOOGLEMOCK_SOURCES}/gmock" CACHE PATH "Path to the google-mock sources")
set(GOOGLEMOCK_GTEST_SOURCES "${GOOGLEMOCK_DEP_GTEST_SOURCES}/gtest" CACHE PATH "Path to the gtest sources")
message(STATUS "Found gmock and gtest but need to build both: ${GOOGLEMOCK_INCLUDE_DIR}, ${GOOGLEMOCK_DEP_GTEST_SOURCES}")
mark_as_advanced(GOOGLEMOCK_SRCS)
# -- googlemock but no gtest
else(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARY AND GOOGLEMOCK_DEP_GTEST_SOURCES)
set(GOOGLEMOCK_FOUND FALSE)
if (GOOGLEMOCK_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find required package Googlemock or gtest")
endif(GOOGLEMOCK_FIND_REQUIRED)
endif(GOOGLEMOCK_INCLUDE_DIR AND GOOGLEMOCK_LIBRARY AND GOOGLEMOCK_DEP_GTEST_LIBRARY)
endif(GMOCK-CONFIG_EXECUTABLE)
mark_as_advanced(GOOGLEMOCK_INCLUDE_DIR GOOGLEMOCK_LIBRARIES)

View file

@ -1,22 +0,0 @@
# - Find HUpnp
# HUpnp is a Universal Plug and Play (UPnP) library
# used by the UPnP collection.
# Defines:
# HUPNP_INCLUDE_DIR
# HUPNP_LIBRARIES
# HUPNP_FOUND
find_path(HUPNP_INCLUDE_DIR HUpnp HINTS ${KDE4_INCLUDE_DIR})
find_library(HUPNP_LIBRARIES HUpnp PATHS ${KDE4_LIB_DIR})
if(HUPNP_INCLUDE_DIR AND HUPNP_LIBRARIES)
set(HUPNP_FOUND TRUE)
message(STATUS "Found HUpnp")
else(HUPNP_INCLUDE_DIR and HUPNP_LIBRARIES)
set(HUPNP_FOUND FALSE)
if(HUPNP_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find required package HUpnp: <http://herqq.org>")
endif(HUPNP_FIND_REQUIRED)
endif(HUPNP_INCLUDE_DIR AND HUPNP_LIBRARIES)

View file

@ -1,24 +0,0 @@
# - Find IFP library
# Find the native IFP includes and library
# This module defines
# IFP_INCLUDE_DIR, where to find ifp.h, etc.
# IFP_LIBRARIES, libraries to link against to use IFP.
# IFP_FOUND, If false, do NOT try to use IFP.
# also defined, but NOT for general use are
# IFP_LIBRARY, where to find the IFP library.
if (IFP_INCLUDE_DIR)
# Already in cache, be silent
set(Ifp_FIND_QUIETLY TRUE)
endif (IFP_INCLUDE_DIR)
FIND_PATH(IFP_INCLUDE_DIR ifp.h
)
FIND_LIBRARY(IFP_LIBRARY ifp
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(IFP DEFAULT_MSG IFP_LIBRARY IFP_INCLUDE_DIR)
MARK_AS_ADVANCED(IFP_INCLUDE_DIR IFP_LIBRARY)

View file

@ -1,48 +0,0 @@
# - Try to find the libgpod library
# Once done this will define
#
# IPOD_FOUND - system has libgpod
# IPOD_INCLUDE_DIRS - the libgpod include directory
# IPOD_LIBRARIES - Link these to use libgpod
# IPOD_CFLAGS - Compiler switches required for using libgpod
# IPOD_VERSION - Version number of libgpod
#
if (IPOD_INCLUDE_DIRS AND IPOD_LIBRARIES)
# in cache already
SET(IPOD_FOUND TRUE)
else (IPOD_INCLUDE_DIRS AND IPOD_LIBRARIES)
if(NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
PKG_SEARCH_MODULE(IPOD libgpod-1.0)
else(NOT WIN32)
find_path(IPOD_INCLUDE_DIRS
NAMES
gpod/itdb.h
PATH_SUFFIXES gpod-1.0
)
find_library(IPOD_LIBRARIES NAMES
gpod libgpod gpod-4 libgpod-4
)
if(IPOD_INCLUDE_DIRS AND IPOD_LIBRARIES)
set(IPOD_FOUND ON)
endif(IPOD_INCLUDE_DIRS AND IPOD_LIBRARIES)
endif(NOT WIN32)
IF (IPOD_FOUND)
IF (NOT IPOD_FIND_QUIETLY)
MESSAGE(STATUS "Found libgpod-1 ${IPOD_VERSION}")
ENDIF (NOT IPOD_FIND_QUIETLY)
ELSE (IPOD_FOUND)
IF (IPOD_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find libgpod-1, check FindPkgConfig output above!")
ENDIF (IPOD_FIND_REQUIRED)
ENDIF (IPOD_FOUND)
MARK_AS_ADVANCED(IPOD_INCLUDE_DIRS)
endif (IPOD_INCLUDE_DIRS AND IPOD_LIBRARIES)

View file

@ -1,54 +0,0 @@
# - Find LibLastFM
# Find the liblastfm includes and the liblastfm libraries
# This module defines
# LIBLASTFM_FOUND, whether liblastfm was found. If it was, it further sets:
# LIBLASTFM_INCLUDE_DIR, root lastfm include dir
# LIBLASTFM_LIBRARY, the path to liblastfm
# LIBLASTFM_VERSION, version of found liblastfm as a string, e.g "0.3"
find_path(LIBLASTFM_INCLUDE_DIR NAMES global.h
HINTS
~/usr/include
/opt/local/include
/usr/include
/usr/local/include
/opt/kde4/include
${KDE4_INCLUDE_DIR}
PATH_SUFFIXES lastfm
)
find_library( LIBLASTFM_LIBRARY NAMES lastfm
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
if(LIBLASTFM_INCLUDE_DIR AND LIBLASTFM_LIBRARY)
set(LIBLASTFM_FOUND TRUE)
else(LIBLASTFM_INCLUDE_DIR AND LIBLASTFM_LIBRARY)
set(LIBLASTFM_FOUND FALSE)
endif(LIBLASTFM_INCLUDE_DIR AND LIBLASTFM_LIBRARY)
if(LIBLASTFM_FOUND)
set(regex "#define LASTFM_VERSION_STRING \"(.*)\"")
file(STRINGS "${LIBLASTFM_INCLUDE_DIR}/global.h" LIBLASTFM_VERSION REGEX ${regex})
if(${LIBLASTFM_VERSION} MATCHES ${regex})
set(LIBLASTFM_VERSION ${CMAKE_MATCH_1})
message(STATUS "Found liblastfm: ${LIBLASTFM_INCLUDE_DIR}, ${LIBLASTFM_LIBRARY}, version ${LIBLASTFM_VERSION}")
else(${LIBLASTFM_VERSION} MATCHES ${regex})
message(WARNING "Found liblastfm: ${LIBLASTFM_INCLUDE_DIR} - but failed to parse version")
set(LIBLASTFM_FOUND FALSE)
unset(LIBLASTFM_INCLUDE_DIR)
unset(LIBLASTFM_LIBRARY)
endif(${LIBLASTFM_VERSION} MATCHES ${regex})
unset(regex)
endif(LIBLASTFM_FOUND)
mark_as_advanced(LIBLASTFM_INCLUDE_DIR LIBLASTFM_LIBRARY)

View file

@ -1,34 +0,0 @@
find_path(LIBOFA_INCLUDE_DIR NAMES ofa.h
HINTS
~/usr/include
/opt/local/include
/usr/include
/usr/local/include
/opt/kde4/include
${KDE4_INCLUDE_DIR}
PATH_SUFFIXES ofa1
)
find_library(LIBOFA_LIBRARY NAMES ofa
PATHS
~/usr/lib
/opt/local/lib
/usr/lib
/usr/lib64
/usr/local/lib
/opt/kde4/lib
${KDE4_LIB_DIR}
)
if(LIBOFA_INCLUDE_DIR AND LIBOFA_LIBRARY)
set(LIBOFA_FOUND TRUE)
message(STATUS "Found libofa: ${LIBOFA_INCLUDE_DIR}, ${LIBOFA_LIBRARY}")
else(LIBOFA_INCLUDE_DIR AND LIBOFA_LIBRARY)
set(LIBOFA_FOUND FALSE)
if (LIBOFA_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find required package LibOFA")
endif(LIBOFA_FIND_REQUIRED)
endif(LIBOFA_INCLUDE_DIR AND LIBOFA_LIBRARY)
mark_as_advanced(LIBOFA_INCLUDE_DIR LIBOFA_LIBRARY)

View file

@ -1,30 +0,0 @@
# - Try to find the GNU Libgcrypt library
# Once done this will define
#
# LIBGCRYPT_FOUND - system has the Libgcrypt library
# LIBGCRYPT_LIBS - The libraries needed to use Libgcrypt
# Copyright (c) 2006, Pino Toscano, <toscano.pino@tiscali.it>
# Copyright (c) 2008, Modestas Vainius, <modestas@vainius.eu>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
include(CheckIncludeFiles)
check_include_files(gcrypt.h HAVE_GCRYPT_H)
if (HAVE_GCRYPT_H)
set(LIBGCRYPT_HEADERS_FOUND TRUE)
endif (HAVE_GCRYPT_H)
if (LIBGCRYPT_HEADERS_FOUND)
find_library(LIBGCRYPT_LIBS NAMES gcrypt )
endif (LIBGCRYPT_HEADERS_FOUND)
if (LIBGCRYPT_LIBS)
set(LIBGCRYPT_FOUND TRUE)
message(STATUS "Libgcrypt found: ${LIBGCRYPT_LIBS}")
elseif (Libgcrypt_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Libgcrypt")
endif (LIBGCRYPT_LIBS)

View file

@ -1,48 +0,0 @@
# - Find libmygpo-qt
# Find the libmygpo-qt includes and the libmygpo-qt libraries
# This module defines
# LIBMYGPO_QT_INCLUDE_DIR, root mygpo-qt include dir
# LIBMYGPO_QT_LIBRARY, the path to libmygpo-qt
# LIBMYGPO_QT_FOUND, whether libmygpo-qt was found
find_path(LIBMYGPO_QT_INCLUDE_DIR NAMES ApiRequest.h
HINTS
~/usr/include
/opt/local/include
/usr/include
/usr/local/include
/opt/kde4/include
~/kde/include
PATH_SUFFIXES mygpo-qt
)
find_library( LIBMYGPO_QT_LIBRARY NAMES mygpo-qt
PATHS
~/usr/lib
~/usr/lib64
/opt/local/lib
/opt/local/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/kde4/lib
/opt/kde4/lib64
~/kde/lib
~/kde/lib64
)
if(LIBMYGPO_QT_INCLUDE_DIR AND LIBMYGPO_QT_LIBRARY)
set(LIBMYGPO_QT_FOUND TRUE)
message(STATUS "Found libmygpo-qt: ${LIBMYGPO_QT_INCLUDE_DIR}, ${LIBMYGPO_QT_LIBRARY}")
else(LIBMYGPO_QT_INCLUDE_DIR AND LIBMYGPO_QT_LIBRARY)
set(LIBMYGPO_QT_FOUND FALSE)
if (LIBMYGPO_QT_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find required package libmygpo-qt")
endif(LIBMYGPO_QT_FIND_REQUIRED)
endif(LIBMYGPO_QT_INCLUDE_DIR AND LIBMYGPO_QT_LIBRARY)
mark_as_advanced(LIBMYGPO_QT_INCLUDE_DIR LIBMYGPO_QT_LIBRARY)

View file

@ -1,46 +0,0 @@
# - Try to find the loudmouth library
# Once done this will define
#
# LOUDMOUTH_FOUND - system has libgpod
# LOUDMOUTH_INCLUDE_DIRS - the libgpod include directory
# LOUDMOUTH_LIBRARIES - Link these to use libgpod
# LOUDMOUTH_DEFINITIONS - Compiler switches required for using libgpod
#
if (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)
# in cache already
SET(LOUDMOUTH_FOUND TRUE)
else (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)
if(NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
PKG_SEARCH_MODULE(LOUDMOUTH loudmouth-1.0)
else(NOT WIN32)
FIND_PATH(LOUDMOUTH_INCLUDE_DIRS loudmouth/loudmouth.h /usr/include/loudmouth-1.0
${_LOUDMOUTHIncDir}
)
FIND_LIBRARY(LOUDMOUTH_LIBRARIES NAMES loudmouth-1
PATHS
${_LOUDMOUTHLinkDir}
)
endif(NOT WIN32)
if (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)
SET(LOUDMOUTH_FOUND TRUE)
else (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)
SET(LOUDMOUTH_FOUND_FALSE)
endif (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Loudmouth DEFAULT_MSG LOUDMOUTH_INCLUDE_DIRS LOUDMOUTH_LIBRARIES )
MARK_AS_ADVANCED(LOUDMOUTH_INCLUDE_DIRS LOUDMOUTH_LIBRARIES)
endif (LOUDMOUTH_INCLUDE_DIRS AND LOUDMOUTH_LIBRARIES)

View file

@ -1,55 +0,0 @@
# - Try to find the libmtp library
# Once done this will define
#
# MTP_FOUND - system has libmtp
# MTP_INCLUDE_DIR - the libmtp include directory
# MTP_LIBRARIES - Link these to use libmtp
# MTP_DEFINITIONS - Compiler switches required for using libmtp
#
if (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY)
# in cache already
SET(MTP_FOUND TRUE)
else (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY)
if(NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
INCLUDE(FindPkgConfig)
pkg_check_modules(_MTP libmtp)
set(MTP_DEFINITIONS ${_MTP_CFLAGS})
endif(NOT WIN32)
FIND_PATH(MTP_INCLUDE_DIR libmtp.h
${_MTP_INCLUDE_DIRS}
)
FIND_LIBRARY(MTP_LIBRARIES NAMES mtp
PATHS
${_MTP_LIBRARY_DIRS}
)
exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --atleast-version=1.0.0 libmtp OUTPUT_VARIABLE _pkgconfigDevNull RETURN_VALUE MTP_VERSION_OKAY)
if (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY STREQUAL "0")
set(MTP_FOUND TRUE)
endif (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY STREQUAL "0")
if (MTP_FOUND)
if (NOT Mtp_FIND_QUIETLY)
message(STATUS "Found MTP: ${MTP_LIBRARIES}")
endif (NOT Mtp_FIND_QUIETLY)
else (MTP_FOUND)
if (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND NOT MTP_VERSION_OKAY STREQUAL "0")
message(STATUS "Found MTP but version requirements not met")
endif (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND NOT MTP_VERSION_OKAY STREQUAL "0")
if (Mtp_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find MTP")
endif (Mtp_FIND_REQUIRED)
endif (MTP_FOUND)
MARK_AS_ADVANCED(MTP_INCLUDE_DIR MTP_LIBRARIES MTP_VERSION_OKAY)
endif (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY)

View file

@ -1,115 +0,0 @@
# - Find MySQL / MySQL Embedded
# Find the MySQL includes and client library
# This module defines
# MYSQL_INCLUDE_DIR, where to find mysql.h
# MYSQL_LIBRARIES, the libraries needed to use MySQL.
# MYSQL_EMBEDDED_LIBRARIES, the libraries needed to use MySQL Embedded.
# MYSQL_FOUND, If false, do not try to use MySQL.
# MYSQL_EMBEDDED_FOUND, If false, do not try to use MySQL Embedded.
# Copyright (c) 2006, Jaroslaw Staniek, <js@iidea.pl>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(NOT WIN32)
find_program(MYSQLCONFIG_EXECUTABLE NAMES mysql_config mysql_config5 HINTS ${BIN_INSTALL_DIR})
endif(NOT WIN32)
find_path(MYSQL_INCLUDE_DIR mysql.h PATH_SUFFIXES mysql mysql5/mysql)
if(MYSQLCONFIG_EXECUTABLE)
exec_program(${MYSQLCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE MYSQL_CFLAGS)
exec_program(${MYSQLCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE MYSQL_LIBRARIES)
exec_program(${MYSQLCONFIG_EXECUTABLE} ARGS --libmysqld-libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE MYSQL_EMBEDDED_LIBSTEMP)
set(MYSQL_EMBEDDED_CFLAGS ${MYSQL_CFLAGS})
if(MYSQL_EMBEDDED_LIBSTEMP)
set( HAVE_MYSQL_EMBEDDED true )
endif(MYSQL_EMBEDDED_LIBSTEMP)
find_library(MYSQLD_PIC_SEPARATE
mysqld_pic
PATH_SUFFIXES mysql
)
if(MYSQLD_PIC_SEPARATE)
string(REPLACE "lmysqld" "lmysqld_pic" MYSQL_EMBEDDED_LIBRARIES ${MYSQL_EMBEDDED_LIBSTEMP})
# append link directory to variable as mysql_config is not always (since Ubuntu 12.04?)
# reporting this directory with when being called with --libs
get_filename_component(MYSQL_EMBEDDED_LIB_DIR_TMP "${MYSQLD_PIC_SEPARATE}" PATH)
set(MYSQL_EMBEDDED_LIBRARIES "${MYSQL_EMBEDDED_LIBRARIES} -L${MYSQL_EMBEDDED_LIB_DIR_TMP}")
else(MYSQLD_PIC_SEPARATE)
set(MYSQL_EMBEDDED_LIBRARIES ${MYSQL_EMBEDDED_LIBSTEMP})
endif(MYSQLD_PIC_SEPARATE)
if (UNIX)
# libmysqld wants -lpthread, but it is very likely it does not say that
# explicitly in --libmysqld-libs
find_package(Threads)
set(MYSQL_EMBEDDED_LIBRARIES "${MYSQL_EMBEDDED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}")
endif(UNIX)
else(MYSQLCONFIG_EXECUTABLE)
if(WIN32)
set(MYSQL_CLIENT_LIBRARY_NAME libmysql)
else(WIN32)
set(MYSQL_CLIENT_LIBRARY_NAME mysqlclient)
endif(WIN32)
find_library(MYSQL_LIBRARIES NAMES ${MYSQL_CLIENT_LIBRARY_NAME}
PATHS
~/usr/lib/mysql
/opt/mysql/mysql/lib
usr/mysql/lib/mysql
opt/local/lib/mysql5/mysql
opt/mysqle/lib/mysql
usr/lib/mysql
usr/lib64/mysql
usr/lib64
usr/local/lib/mysql
opt/local/lib/mysql
opt/ports/lib/mysql5/mysql
)
find_library(MYSQL_EMBEDDED_LIBRARIES NAMES mysqld_pic mysqld libmysqld
PATHS
~/usr/lib/mysql
/opt/local/lib/mysql5/mysql
/opt/mysqle/lib/mysql
/usr/lib/mysql
/usr/lib64/mysql
/usr/local/lib/mysql
/opt/mysql/lib/mysql
/opt/local/lib/mysql
/opt/ports/lib/mysql5/mysql
)
macro_push_required_vars()
set( CMAKE_REQUIRED_INCLUDES ${MYSQL_INCLUDE_DIR} )
set( CMAKE_REQUIRED_LIBRARIES ${MYSQL_EMBEDDED_LIBRARIES} )
include_directories( ${MYSQL_INCLUDE_DIR} )
check_cxx_source_compiles( "#if (defined(_WIN32) || defined(_WIN64))\n#define __LCC__\n#endif\n#include <mysql.h>\nint main() { int i = MYSQL_OPT_USE_EMBEDDED_CONNECTION; }" HAVE_MYSQL_EMBEDDED )
macro_pop_required_vars()
endif(MYSQLCONFIG_EXECUTABLE)
if(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
set(MYSQL_FOUND TRUE)
message(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}")
else(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
set(MYSQL_FOUND FALSE)
message(STATUS "MySQL not found.")
endif(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
if(MYSQL_INCLUDE_DIR AND MYSQL_EMBEDDED_LIBRARIES AND HAVE_MYSQL_EMBEDDED)
set(MYSQL_EMBEDDED_FOUND TRUE)
message(STATUS "Found MySQL Embedded: ${MYSQL_INCLUDE_DIR}, ${MYSQL_EMBEDDED_LIBRARIES}")
else(MYSQL_INCLUDE_DIR AND MYSQL_EMBEDDED_LIBRARIES AND HAVE_MYSQL_EMBEDDED)
set(MYSQL_EMBEDDED_FOUND FALSE)
message(STATUS "MySQL Embedded not found.")
endif(MYSQL_INCLUDE_DIR AND MYSQL_EMBEDDED_LIBRARIES AND HAVE_MYSQL_EMBEDDED)
mark_as_advanced(MYSQL_INCLUDE_DIR MYSQL_LIBRARIES MYSQL_EMBEDDED_LIBRARIES)

View file

@ -1,41 +0,0 @@
# - Try to find the libnjb library
# Once done this will define
#
# NJB_FOUND - system has libnjb
# NJB_INCLUDE_DIR - the libnjb include directory
# NJB_LIBRARIES - Link these to use libnjb
# NJB_DEFINITIONS - Compiler switches required for using libnjb
#
if (NJB_INCLUDE_DIR AND NJB_LIBRARIES)
# in cache already
SET(NJB_FOUND TRUE)
else (NJB_INCLUDE_DIR AND NJB_LIBRARIES)
if(NOT WIN32)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
INCLUDE(FindPkgConfig)
pkg_check_modules(_NJB libnjb)
set(NJB_DEFINITIONS ${_NJB_CFLAGS})
endif(NOT WIN32)
FIND_PATH(NJB_INCLUDE_DIR libnjb.h
${_NJB_INCLUDE_DIRS}
)
FIND_LIBRARY(NJB_LIBRARIES NAMES njb
PATHS
${_NJB_LIBRARY_DIRS}
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Njb DEFAULT_MSG NJB_INCLUDE_DIR NJB_LIBRARIES )
MARK_AS_ADVANCED(NJB_INCLUDE_DIR NJB_LIBRARIES)
endif (NJB_INCLUDE_DIR AND NJB_LIBRARIES)

View file

@ -1,44 +0,0 @@
## Ian Monroe <ian@monroe.nu> Copyright 2009
# released under public domain or:
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
include(CheckCXXSourceRuns)
if(NOT WIN32)
file( READ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/bindingstest/QtScriptBindingsTest.cpp" source )
message(STATUS "Checking if the QtScript Qt Bindings are installed.")
set(CMAKE_REQUIRED_DEFINTIONS ${QT_DEFINITIONS} ${KDE4_DEFINITIONS} )
set(CMAKE_REQUIRED_INCLUDES ${QT_QTCORE_INCLUDE_DIR} ${QT_QTSCRIPT_INCLUDE_DIR} ${KDE4_INCLUDES})
set(CMAKE_REQUIRED_LIBRARIES ${QT_QTSCRIPT_LIBRARY} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} -L${KDE4_LIB_DIR} -lkdecore -lkdeui)
message( STATUS "includes ${CMAKE_REQUIRED_INCLUDES} libraries ${CMAKE_REQUIRED_LIBRARIES}" )
CHECK_CXX_SOURCE_RUNS( "${source}" BINDINGS_RUN_RESULT)
if(BINDINGS_RUN_RESULT EQUAL 1)
message( STATUS "QtBindings found")
set(QTSCRIPTQTBINDINGS_FOUND TRUE)
else(BINDINGS_RUN_RESULT EQUAL 1)
message( STATUS "QtBindings not found. run `cd cmake/modules/bindingstest; mkdir build; cd build; cmake ..; make; ./bindingstest; echo $?` If it prints '0' then you're actually fine.")
set(QTSCRIPTQTBINDINGS_FOUND FALSE)
endif(BINDINGS_RUN_RESULT EQUAL 1)
set(CMAKE_REQUIRED_DEFINTIONS "" )
set(CMAKE_REQUIRED_INCLUDES "")
set(CMAKE_REQUIRED_LIBRARIES "")
else(NOT WIN32)
set(QTSCRIPTQTBINDINGS_FOUND TRUE)
endif(NOT WIN32)

View file

@ -1,135 +0,0 @@
# - Try to find the Taglib-Extras library
# Once done this will define
#
# TAGLIB-EXTRAS_FOUND - system has the taglib library
# TAGLIB-EXTRAS_CFLAGS - the taglib cflags
# TAGLIB-EXTRAS_LIBRARIES - The libraries needed to use taglib
# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(NOT TAGLIB-EXTRAS_MIN_VERSION)
set(TAGLIB-EXTRAS_MIN_VERSION "1.0")
endif(NOT TAGLIB-EXTRAS_MIN_VERSION)
if(NOT WIN32)
find_program(TAGLIB-EXTRASCONFIG_EXECUTABLE NAMES taglib-extras-config PATHS
${BIN_INSTALL_DIR}
)
endif(NOT WIN32)
#reset vars
set(TAGLIB-EXTRAS_LIBRARIES)
set(TAGLIB-EXTRAS_CFLAGS)
# if taglib-extras-config has been found
if(TAGLIB-EXTRASCONFIG_EXECUTABLE)
exec_program(${TAGLIB-EXTRASCONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB-EXTRAS_VERSION)
if(TAGLIB-EXTRAS_VERSION STRLESS "${TAGLIB-EXTRAS_MIN_VERSION}")
message(STATUS "TagLib-Extras version too old: version searched :${TAGLIB-EXTRAS_MIN_VERSION}, found ${TAGLIB-EXTRAS_VERSION}")
set(TAGLIB-EXTRAS_FOUND FALSE)
else(TAGLIB-EXTRAS_VERSION STRLESS "${TAGLIB-EXTRAS_MIN_VERSION}")
exec_program(${TAGLIB-EXTRASCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB-EXTRAS_LIBRARIES)
exec_program(${TAGLIB-EXTRASCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB-EXTRAS_CFLAGS)
if(TAGLIB-EXTRAS_LIBRARIES AND TAGLIB-EXTRAS_CFLAGS)
set(TAGLIB-EXTRAS_FOUND TRUE)
endif(TAGLIB-EXTRAS_LIBRARIES AND TAGLIB-EXTRAS_CFLAGS)
string(REGEX REPLACE " *-I" ";" TAGLIB-EXTRAS_INCLUDES "${TAGLIB-EXTRAS_CFLAGS}")
endif(TAGLIB-EXTRAS_VERSION STRLESS "${TAGLIB-EXTRAS_MIN_VERSION}")
mark_as_advanced(TAGLIB-EXTRAS_CFLAGS TAGLIB-EXTRAS_LIBRARIES TAGLIB-EXTRAS_INCLUDES)
else(TAGLIB-EXTRASCONFIG_EXECUTABLE)
find_path(TAGLIB-EXTRAS_INCLUDES
NAMES
tfile_helper.h
PATH_SUFFIXES taglib-extras
PATHS
${KDE4_INCLUDE_DIR}
${INCLUDE_INSTALL_DIR}
)
IF(NOT WIN32)
# on non-win32 we don't need to take care about WIN32_DEBUG_POSTFIX
FIND_LIBRARY(TAGLIB-EXTRAS_LIBRARIES tag-extras PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
ELSE(NOT WIN32)
# 1. get all possible libnames
SET(args PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
SET(newargs "")
SET(libnames_release "")
SET(libnames_debug "")
LIST(LENGTH args listCount)
# just one name
LIST(APPEND libnames_release "tag-extras")
LIST(APPEND libnames_debug "tag-extrasd")
SET(newargs ${args})
# search the release lib
FIND_LIBRARY(TAGLIB-EXTRAS_LIBRARIES_RELEASE
NAMES ${libnames_release}
${newargs}
)
# search the debug lib
FIND_LIBRARY(TAGLIB-EXTRAS_LIBRARIES_DEBUG
NAMES ${libnames_debug}
${newargs}
)
IF(TAGLIB-EXTRAS_LIBRARIES_RELEASE AND TAGLIB-EXTRAS_LIBRARIES_DEBUG)
# both libs found
SET(TAGLIB-EXTRAS_LIBRARIES optimized ${TAGLIB-EXTRAS_LIBRARIES_RELEASE}
debug ${TAGLIB-EXTRAS_LIBRARIES_DEBUG})
ELSE(TAGLIB-EXTRAS_LIBRARIES_RELEASE AND TAGLIB-EXTRAS_LIBRARIES_DEBUG)
IF(TAGLIB-EXTRAS_LIBRARIES_RELEASE)
# only release found
SET(TAGLIB-EXTRAS_LIBRARIES ${TAGLIB-EXTRAS_LIBRARIES_RELEASE})
ELSE(TAGLIB-EXTRAS_LIBRARIES_RELEASE)
# only debug (or nothing) found
SET(TAGLIB-EXTRAS_LIBRARIES ${TAGLIB-EXTRAS_LIBRARIES_DEBUG})
ENDIF(TAGLIB-EXTRAS_LIBRARIES_RELEASE)
ENDIF(TAGLIB-EXTRAS_LIBRARIES_RELEASE AND TAGLIB-EXTRAS_LIBRARIES_DEBUG)
MARK_AS_ADVANCED(TAGLIB-EXTRAS_LIBRARIES_RELEASE)
MARK_AS_ADVANCED(TAGLIB-EXTRAS_LIBRARIES_DEBUG)
ENDIF(NOT WIN32)
INCLUDE(FindPackageMessage)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Taglib-Extras DEFAULT_MSG TAGLIB-EXTRAS_INCLUDES TAGLIB-EXTRAS_LIBRARIES)
endif(TAGLIB-EXTRASCONFIG_EXECUTABLE)
if(TAGLIB-EXTRAS_FOUND)
if(NOT Taglib-Extras_FIND_QUIETLY AND TAGLIB-EXTRASCONFIG_EXECUTABLE)
message(STATUS "Taglib-Extras found: ${TAGLIB-EXTRAS_LIBRARIES}")
endif(NOT Taglib-Extras_FIND_QUIETLY AND TAGLIB-EXTRASCONFIG_EXECUTABLE)
else(TAGLIB-EXTRAS_FOUND)
if(Taglib-Extras_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Taglib-Extras")
endif(Taglib-Extras_FIND_REQUIRED)
endif(TAGLIB-EXTRAS_FOUND)

View file

@ -1,10 +0,0 @@
cmake_minimum_required (VERSION 2.6)
find_package( KDE4 REQUIRED )
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
include_directories (${QT_QTCORE_INCLUDE_DIR} ${QT_QTSCRIPT_INCLUDE_DIR} ${KDE4_INCLUDES})
add_executable (bindingstest QtScriptBindingsTest.cpp)
target_link_libraries( bindingstest ${QT_QTSCRIPT_LIBRARY} ${KDE4_KDEUI_LIBS} )

View file

@ -1,46 +0,0 @@
/*
* Copyright (C) 2009 Ian Monroe <ian@monroe.nu>
* released under public domain or:
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <QtGui/QApplication>
#include <QtScript/QScriptEngine>
#include <QtCore/QStringList>
#include <QtCore/QDebug>
#define FAIL 0xA
int main(int argc, char **argv)
{
QApplication app( argc, argv, false );
QStringList allowedBindings;
allowedBindings << "qt.core" << "qt.gui" << "qt.sql" << "qt.xml" << "qt.network";
QScriptEngine engine;
foreach( QString binding, allowedBindings )
{
QScriptValue error = engine.importExtension( binding );
if( error.isUndefined() )
{ // undefined indiciates success
continue;
}
qDebug() << "Extension" << binding << "not found:" << error.toString();
qDebug() << "Available extensions:" << engine.availableExtensions();
return FAIL;
}
return 0;
}

View file

@ -1,7 +0,0 @@
install( FILES amarok_homerc DESTINATION ${CONFIG_INSTALL_DIR} )
install( FILES amarok.notifyrc DESTINATION ${DATA_INSTALL_DIR}/amarok )
install(FILES DefaultPlaylistLayouts.xml
first_run_jingle.ogg
DESTINATION ${DATA_INSTALL_DIR}/amarok/data)

View file

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<playlist_layouts version="2.1.0">
<layout name="Default">
<single_track show_cover="true">
<row>
<element value="Title" size="0.80" bold="false" alignment="left"/>
<element value="Length" size="0.20" bold="false" alignment="right"/>
</row>
<row>
<element value="Artist" size="0.5" bold="false" italic="true" alignment="left"/>
<element value="Album" size="0.5" bold="false" alignment="right"/>
</row>
</single_track>
<group_head show_cover="true" active_indicator_row="-1">
<row>
<element value="Album" size="1" bold="true" alignment="center"/>
</row>
<row>
<element value="Album artist" size="1" bold="true" italic="true" alignment="center"/>
</row>
</group_head>
<group_body show_cover="false">
<row>
<element value="Title (with track number)" size="0.8" bold="false" alignment="left"/>
<element value="Length" size="0.2" bold="false" alignment="right"/>
</row>
</group_body>
<group_variousArtistsBody show_cover="false">
<row>
<element value="Title (with track number)" size="0.6" bold="false" alignment="left"/>
<element value="Artist" size="0" bold="false" italic="true" alignment="left"/>
<element value="Length" size="0.15" bold="false" alignment="right"/>
</row>
</group_variousArtistsBody>
</layout>
<layout name="No Grouping" group_by="None">
<single_track show_cover="true">
<row>
<element value="Title" size="0.5" bold="false" alignment="left"/>
<element value="Length" size="0.5" bold="false" alignment="right"/>
</row>
<row>
<element value="Artist" size="0.5" bold="false" italic="true" alignment="left"/>
<element value="Album" size="0.5" bold="false" alignment="right"/>
</row>
</single_track>
<group_head show_cover="false" active_indicator_row="-1">
</group_head>
<group_body show_cover="true">
<row>
<element value="Title" size="0.5" bold="false" alignment="left"/>
<element value="Length" size="0.5" bold="false" alignment="right"/>
</row>
<row>
<element value="Artist" size="0.5" bold="false" italic="true" alignment="left"/>
<element value="Album" size="0.5" bold="false" alignment="right"/>
</row>
</group_body>
</layout>
<layout name="No Grouping (Single Line)" group_by="None">
<single_track active_indicator_row="0" show_cover="false" >
<row>
<element suffix="" prefix="" size="0.5" bold="true" alignment="left" value="Title" underline="false" italic="false" />
<element suffix="" prefix="" size="0" bold="false" alignment="left" value="Artist" underline="false" italic="true" />
<element suffix="" prefix="" size="0" bold="false" alignment="right" value="Length" underline="false" italic="false" />
</row>
</single_track>
<group_head active_indicator_row="0" show_cover="false" />
<group_body active_indicator_row="0" show_cover="false" >
<row>
<element suffix="" prefix="" size="0.5" bold="true" alignment="left" value="Title" underline="false" italic="false" />
<element suffix="" prefix="" size="0" bold="false" alignment="left" value="Artist" underline="false" italic="true" />
<element suffix="" prefix="" size="0" bold="false" alignment="right" value="Length" underline="false" italic="false" />
</row>
</group_body>
</layout>
<layout name="Verbose" >
<single_track active_indicator_row="0" show_cover="true" >
<row>
<element size="0.65" bold="false" alignment="left" value="Title" italic="false" />
<element size="0.2" bold="false" alignment="center" value="Rating" italic="false" />
<element size="0.15" bold="false" alignment="right" value="Length" italic="false" />
</row>
<row>
<element size="0.5" bold="false" alignment="left" value="Artist" italic="true" />
<element size="0.5" bold="false" alignment="right" value="Album" italic="false" />
</row>
</single_track>
<group_head active_indicator_row="-1" show_cover="true" >
<row>
<element size="1" bold="true" alignment="left" value="Album" italic="false" />
</row>
<row>
<element size="0.8" bold="true" alignment="left" value="Album artist" italic="true" />
<element size="0" bold="false" alignment="right" value="Type" italic="false" />
</row>
<row>
<element size="0.43" bold="false" alignment="left" value="Genre" italic="true" />
<element size="0.57" bold="false" alignment="right" value="Group tracks" italic="false" />
</row>
<row>
<element size="0.39" bold="false" alignment="left" value="Year" italic="false" />
<element size="0" bold="false" alignment="right" value="Group length" italic="false" />
</row>
</group_head>
<group_body active_indicator_row="0" show_cover="false" >
<row>
<element size="0.7" bold="false" alignment="left" value="Title (with track number)" italic="false" />
<element size="0.15" bold="false" alignment="center" value="Rating" italic="false" />
<element size="0.15" bold="false" alignment="right" value="Length" italic="false" />
</row>
</group_body>
<group_variousArtistsBody active_indicator_row="0" show_cover="false" >
<row>
<element size="0.7" bold="false" alignment="left" value="Title (with track number)" italic="false" />
<element size="0.15" bold="false" alignment="center" value="Rating" italic="false" />
<element size="0.15" bold="false" alignment="right" value="Length" italic="false" />
</row>
<row>
<element value="Artist" prefix=" " size="0" bold="false" italic="true" alignment="left"/>
</row>
</group_variousArtistsBody>
</layout>
</playlist_layouts>

View file

@ -1,236 +0,0 @@
[Global]
IconName=amarok
Comment=Amarok
Comment[bg]=Amarok
Comment[bs]=Amarok
Comment[ca]=Amarok
Comment[ca@valencia]=Amarok
Comment[cs]=Amarok
Comment[csb]=Amarok
Comment[da]=Amarok
Comment[de]=Amarok
Comment[el]=AmaroK
Comment[en_GB]=Amarok
Comment[eo]=Amarok
Comment[es]=Amarok
Comment[et]=Amarok
Comment[eu]=Amarok
Comment[fi]=Amarok
Comment[fr]=Amarok
Comment[ga]=Amarok
Comment[gl]=Amarok
Comment[hu]=Amarok
Comment[id]=Amarok
Comment[is]=Amarok
Comment[it]=Amarok
Comment[ja]=Amarok
Comment[km]=Amarok
Comment[ko]=Amarok
Comment[lt]=Amarok
Comment[lv]=Amarok
Comment[nb]=Amarok
Comment[nds]=Amarok
Comment[nl]=Amarok
Comment[pa]=ਅਮਰੋਕ
Comment[pl]=Amarok
Comment[pt]=Amarok
Comment[pt_BR]=Amarok
Comment[ro]=Amarok
Comment[ru]=Amarok
Comment[sk]=Amarok
Comment[sl]=Amarok
Comment[sr]=Амарок
Comment[sr@ijekavian]=Амарок
Comment[sr@ijekavianlatin]=Amarok
Comment[sr@latin]=Amarok
Comment[sv]=Amarok
Comment[th]=แอมอะร็อก
Comment[tr]=Amarok
Comment[ug]=Amarok
Comment[uk]=Amarok
Comment[x-test]=xxAmarokxx
Comment[zh_CN]=Amarok
Comment[zh_TW]=Amarok 影音播放器
[Event/trackChange]
Name=Track Change
Name[bg]=Прехвърляне запис
Name[bs]=Promjena numere
Name[ca]=Canvi de peça
Name[ca@valencia]=Canvi de peça
Name[cs]=Změna skladby
Name[da]=Sporskift
Name[de]=Stückwechsel
Name[el]=Αλλαγή κομματιού
Name[en_GB]=Track Change
Name[es]=Cambio de pista
Name[et]=Pala muutumine
Name[eu]=Pistaren aldaketa
Name[fi]=Kappaleen vaihdos
Name[fr]=Changement de piste
Name[ga]=Athrú Amhráin
Name[gl]=Cambio de pista
Name[hu]=Számváltás
Name[id]=Track Berubah
Name[is]=Skipt um lag
Name[it]=Cambiamento della traccia
Name[ja]=トラック変更
Name[km]=ការ​ផ្លាស់​ប្ដូរ​បទ
Name[ko]=트랙 변경
Name[lt]=Dainos pasikeitimas
Name[lv]=Celiņa maiņa
Name[nb]=Sporbytte
Name[nds]=Stückwessel
Name[nl]=Wijziging van track
Name[pa]=ਟਰੈਕ ਬਦਲਾ
Name[pl]=Zmiana utworu
Name[pt]=Mudança de Faixa
Name[pt_BR]=Alteração de faixa
Name[ro]=Schimbare pistă
Name[ru]=Смена дорожки
Name[sk]=Zmena skladby
Name[sl]=Sprememba skladbe
Name[sr]=Промена нумере
Name[sr@ijekavian]=Промјена нумере
Name[sr@ijekavianlatin]=Promjena numere
Name[sr@latin]=Promena numere
Name[sv]=Spårändring
Name[th]=แทร็กเปลี่ยน
Name[tr]=Parça Değişimi
Name[uk]=Зміна композиції
Name[x-test]=xxTrack Changexx
Name[zh_CN]=音轨更改
Name[zh_TW]=曲目變更
Comment=Amarok changed to a new track
Comment[bg]=Amarok прехвърли към друг запис
Comment[bs]=Amarok je prešao na novu numeru
Comment[ca]=L'Amarok ha canviat a una peça nova
Comment[ca@valencia]=L'Amarok ha canviat a una peça nova
Comment[cs]=Amarok přešel na novou skladbu
Comment[da]=Amarok skiftede til et nyt spor
Comment[de]=Amarok gibt ein neues Stück wieder
Comment[el]=Το Amarok άλλαξε σε νέο κομμάτι
Comment[en_GB]=Amarok changed to a new track
Comment[es]=Amarok cambió a una nueva pista
Comment[et]=Amarok võttis ette uue pala
Comment[eu]=Amarok pista berri batera aldatu da
Comment[fi]=Amarok vaihtoi kappaletta
Comment[fr]=Amarok lit une nouvelle piste
Comment[ga]=Thosaigh Amarok amhrán nua
Comment[gl]=Amarok cambiado a unha nova pista
Comment[hu]=Az Amarok átváltott egy új számra
Comment[id]=Amarok mengubah track menjadi baru
Comment[is]=Amarok skipti yfir í nýtt lag
Comment[it]=Amarok è passato a una nuova traccia
Comment[ja]=Amarok は新しいトラックに変更されました
Comment[km]=Amarok បាន​ផ្លាស់ប្ដូរ​ទៅ​បទ​ថ្មី
Comment[ko]=Amarok에서 새 트랙을 재생함
Comment[lt]=Amarokas persijungė į naują dainą
Comment[lv]=Amarok sāka atskaņot jaunu celiņu
Comment[nb]=Amarok byttet til et nytt spor
Comment[nds]=Amarok hett na en nieg Stück wesselt
Comment[nl]=Amarok is naar een nieuwe track gegaan
Comment[pa]=ਅਮਰੋਕ ਨੇ ਨਵਾਂ ਟਰੈਕ ਬਦਲਿਆ
Comment[pl]=Utwór został zmieniony na nowy
Comment[pt]=O Amarok mudou para uma faixa nova
Comment[pt_BR]=O Amarok mudou para uma nova faixa
Comment[ro]=Amarok a trecut la altă piesă
Comment[ru]=Amarok перешёл на новую дорожку
Comment[sk]=Amarok zmenil skladbu na novú
Comment[sl]=Amarok je zamenjal skladbo
Comment[sr]=Амарок је прешао на нову нумеру
Comment[sr@ijekavian]=Амарок је прешао на нову нумеру
Comment[sr@ijekavianlatin]=Amarok je prešao na novu numeru
Comment[sr@latin]=Amarok je prešao na novu numeru
Comment[sv]=Amarok bytte till ett nytt spår
Comment[th]=แอมอะร็อกเปลี่ยนเป็นแทร็กใหม่
Comment[tr]=Amarok yeni bir parçaya geçti
Comment[uk]=Композиція у Amarok змінилася
Comment[x-test]=xxAmarok changed to a new trackxx
Comment[zh_CN]=Amarok 更改到新音轨
Comment[zh_TW]=Amarok 已變更至新的曲目
Action=Popup
[Event/message]
Name=Message
Name[bs]=Poruka
Name[ca]=Missatge
Name[ca@valencia]=Missatge
Name[cs]=Zpráva
Name[da]=Besked
Name[de]=Nachricht
Name[el]=Μήνυμα
Name[en_GB]=Message
Name[es]=Mensaje
Name[et]=Teade
Name[fi]=Viesti
Name[fr]=Message
Name[ga]=Teachtaireacht
Name[gl]=Mensaxe
Name[hu]=Üzenet
Name[id]=Pesan
Name[it]=Messaggio
Name[lt]=Pranešimas
Name[lv]=Ziņojums
Name[mr]=संदेश
Name[nb]=Melding
Name[nl]=Bericht
Name[pa]=ਸੁਨੇਹਾ
Name[pl]=Wiadomość
Name[pt]=Mensagem
Name[pt_BR]=Mensagem
Name[ro]=Mesaj
Name[ru]=Сообщение
Name[sk]=Správa
Name[sl]=Sporočilo
Name[sr]=Порука
Name[sr@ijekavian]=Порука
Name[sr@ijekavianlatin]=Poruka
Name[sr@latin]=Poruka
Name[sv]=Meddelande
Name[tr]=İleti
Name[ug]=ئۇچۇر
Name[uk]=Повідомлення
Name[x-test]=xxMessagexx
Name[zh_CN]=消息
Name[zh_TW]=訊息
Comment=Amarok issued an uncategorized text message
Comment[bs]=Amarok je izbacio nekategorizovanu tekstualnu poruku
Comment[ca]=L'Amarok ha emès un missatge de text sense categoria
Comment[ca@valencia]=L'Amarok ha emés un missatge de text sense categoria
Comment[cs]=Amarok vyvolal nezařazenou textovou zprávu
Comment[da]=Amarok udsendte en ikke-kategoriseret tekstmeddelelse
Comment[de]=Amarok hat eine nicht kategorisierte Textnachricht ausgegeben
Comment[el]=Το Amarok εξέδωσε ένα μη κατηγοριοποιημένο μήνυμα σε απλό κείμενο
Comment[en_GB]=Amarok issued an uncategorised text message
Comment[es]=Amarok emitió un mensaje de texto no clasificado
Comment[et]=Amarok andis liigitamata tekstiteate
Comment[fi]=Amarok lähetti luokittelemattoman tekstiviestin
Comment[fr]=Amarok a émis un message de texte sans catégorie
Comment[ga]=Chuir Amarok teachtaireacht téacs gan catagóir amach
Comment[gl]=Amarok enviou unha mensaxe de texto sen categoría.
Comment[hu]=Az Amarok egy kategorizálatlan szöveges üzenetet adott ki
Comment[id]=Amarok mengeluarkan pesan teks tidak berkategori
Comment[it]=Amarok ha generato un messaggio di testo non categorizzato
Comment[lt]=Amarok pateikė tekstinį pranešimą be kategorijos
Comment[lv]=Amarok izdeva teksta ziņojumu bez kategorijas
Comment[nb]=Amarok sendte en tekstmelding uten kategori
Comment[nl]=Amarok stuurde een niet gecategoriseerd tekstbericht
Comment[pl]=Amarok wystosował niekategoryzowaną wiadomość tekstową
Comment[pt]=O Amarok enviou uma mensagem de texto sem categoria
Comment[pt_BR]=O Amarok emitiu uma mensagem de texto não-categorizada
Comment[ro]=Amarok a emis un mesaj textual necategorizat
Comment[ru]=Сообщение от Amarok, не относящееся ни к какой из категорий
Comment[sk]=Amarok vydal nekategorizovanú textovú správu
Comment[sl]=Amarok je oddal nekategorizirano besedilno sporočilo
Comment[sr]=Амарок је издао општу текстуалну поруку
Comment[sr@ijekavian]=Амарок је издао општу текстуалну поруку
Comment[sr@ijekavianlatin]=Amarok je izdao opštu tekstualnu poruku
Comment[sr@latin]=Amarok je izdao opštu tekstualnu poruku
Comment[sv]=Amarok skickade ett okategoriserat textmeddelande
Comment[tr]=Amarok kategorilenmemiş bir metin iletisi oluşturdu
Comment[uk]=Програмою Amarok надіслано текстове повідомлення, що не належить до певної категорії
Comment[x-test]=xxAmarok issued an uncategorized text messagexx
Comment[zh_CN]=Amarok 发出了一条未分类文本消息
Comment[zh_TW]=Amarok 發出了一個未分類的文字訊息
Action=Popup

View file

@ -1,3 +0,0 @@
[Containment 0]
firstShowingApplet=0
plugins=currenttrack,wikipedia,lyrics

Binary file not shown.

View file

@ -1,81 +0,0 @@
add_subdirectory( icons )
########### install files ###############
install(FILES
amarok_icon.svg
ball.png
default-theme-clean.svg
dot.png
emblem-amazon.png
emblem-default.png
emblem-jamendo.png
emblem-jamendo-scalable.svgz
emblem-lastfm.png
emblem-lastfm-scalable.svg
emblem-gpodder.png
emblem-gpodder-scalable.svgz
emblem-magnatune.png
emblem-mp3tunes.png
emblem-ampache.png
emblem-ampache-scalable.svgz
emblem-scripted.png
emblem-scripted-scalable.svgz
grid.png
lastfm-default-cover.png
echonest.png
lastfm.png
loading1.png
loading2.png
mb_aicon.png
mb_licon.png
mb_ticon.png
navigation_arrows.svg
nocover.png
playlist-bookmark-16.png
playlist-layouts-22.png
playlist-sorting-16.png
pud_items.svg
smallstar.png
star.png
volume_icon.png
volume_muted_icon.png
wirl1.png
wirl2.png
service_info_loading1.png
service_info_loading2.png
service_info_loading3.png
service_info_loading4.png
service_info_loading5.png
service_info_loading6.png
service_info_loading7.png
service_info_loading8.png
service_info_loading9.png
service_info_loading10.png
service_info_loading11.png
service_info_loading12.png
hover_info_collections.png
hover_info_dynamic_playlists.png
hover_info_files.png
hover_info_internet.png
hover_info_playlists.png
hover_info_user_playlists.png
hover_info_podcasts.png
opendesktop-22.png
emblem-delicious.png
emblem-digg.png
emblem-facebook.png
emblem-identica.png
emblem-linkedin.png
emblem-myspace.png
emblem-reddit.png
emblem-stackoverflow.png
emblem-twitter.png
emblem-wikipedia.png
emblem-xing.png
DESTINATION ${DATA_INSTALL_DIR}/amarok/images
)
kde4_install_icons( ${ICON_INSTALL_DIR} )

View file

@ -1,551 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="128"
height="128"
viewBox="0 0 854.238 854.238"
overflow="visible"
enable-background="new 0 0 854.238 854.238"
xml:space="preserve"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.45.1"
sodipodi:docname="amarok_icon.svg"
sodipodi:docbase="/home/hydrogen/kde/src/amarok/src/images"
inkscape:output_extension="org.inkscape.output.svg.inkscape"><sodipodi:namedview
inkscape:window-height="688"
inkscape:window-width="1258"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:zoom="2.5708446"
inkscape:cx="168.23042"
inkscape:cy="57.765811"
inkscape:window-x="1280"
inkscape:window-y="26"
inkscape:current-layer="svg2" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs217"><radialGradient
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
id="radialGradient29545"
cx="375.21439"
cy="783.16357"
r="300.5752"
fx="375.21439"
fy="783.16357"
gradientUnits="userSpaceOnUse">
<stop
offset="0.0112"
style="stop-color:#eeeeef;stop-opacity:0.94117647;"
id="stop29547" />
<stop
offset="0.29210001"
style="stop-color:#6193cf;stop-opacity:1;"
id="stop29549" />
<stop
offset="0.45750001"
style="stop-color:#2c72c7;stop-opacity:1;"
id="stop29551" />
<stop
offset="0.6767"
style="stop-color:#0057ae;stop-opacity:1;"
id="stop29553" />
<stop
offset="0.8653"
style="stop-color:#004d9a;stop-opacity:1;"
id="stop29555" />
<stop
offset="1"
style="stop-color:#00438a;stop-opacity:1;"
id="stop29557" />
</radialGradient><linearGradient
id="linearGradient5498"><stop
style="stop-color:#eeeeee;stop-opacity:1;"
offset="0"
id="stop5500" /><stop
style="stop-color:#eeeeee;stop-opacity:0;"
offset="1"
id="stop5502" /></linearGradient><mask
id="XMLID_26_"
height="44.813"
width="93.126"
y="461.543"
x="155.705"
maskUnits="userSpaceOnUse">
<g
id="g69">
<linearGradient
y2="466.75449"
x2="200.0733"
y1="562.85791"
x1="211.7222"
gradientUnits="userSpaceOnUse"
id="XMLID_1_">
<stop
id="stop72"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop74"
style="stop-color:#000000"
offset="1" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_1_)"
id="ellipse76"
ry="59.682999"
rx="80.542"
cy="495.98801"
cx="203.617" />
</g>
</mask><mask
id="XMLID_2_"
height="127.553"
width="156.907"
y="425.034"
x="101.57"
maskUnits="userSpaceOnUse">
<g
id="g86">
<linearGradient
y2="563.47321"
x2="186.92191"
y1="397.62061"
x1="206.09081"
gradientUnits="userSpaceOnUse"
id="XMLID_3_">
<stop
id="stop89"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop91"
style="stop-color:#CBCBCB"
offset="0.1111" />
<stop
id="stop93"
style="stop-color:#969696"
offset="0.2396" />
<stop
id="stop95"
style="stop-color:#686868"
offset="0.3698" />
<stop
id="stop97"
style="stop-color:#424242"
offset="0.4991" />
<stop
id="stop99"
style="stop-color:#252525"
offset="0.6273" />
<stop
id="stop101"
style="stop-color:#111111"
offset="0.7542" />
<stop
id="stop103"
style="stop-color:#040404"
offset="0.8792" />
<stop
id="stop105"
style="stop-color:#000000"
offset="1" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_3_)"
id="ellipse107"
ry="123.604"
rx="160.94"
cy="495.62299"
cx="194.76401" />
</g>
</mask><linearGradient
gradientTransform="matrix(-1.1256295,0,0,1.1256295,1028.9091,-39.54673)"
y2="643.30768"
x2="480.12021"
y1="815.45459"
x1="429.84909"
gradientUnits="userSpaceOnUse"
id="XMLID_4_">
<stop
id="stop112"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop114"
style="stop-color:#E5EAF2"
offset="1" />
</linearGradient><linearGradient
y2="560.35498"
x2="278.14471"
y1="634.63232"
x1="220.9512"
gradientUnits="userSpaceOnUse"
id="XMLID_5_">
<stop
id="stop119"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop121"
style="stop-color:#193D6B"
offset="1" />
</linearGradient><mask
id="XMLID_10_"
height="527.73"
width="447.197"
y="217.631"
x="191.541"
maskUnits="userSpaceOnUse">
<g
id="g159">
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.931,0,0,0.9299,28.7459,21.6629)"
fy="155.23289"
fx="657.2124"
r="606.95343"
cy="155.23289"
cx="657.2124"
id="XMLID_11_">
<stop
id="stop162"
style="stop-color:#C9C9C8"
offset="0" />
<stop
id="stop164"
style="stop-color:#C4C4C4"
offset="0.0881" />
<stop
id="stop166"
style="stop-color:#B8B8B7"
offset="0.2192" />
<stop
id="stop168"
style="stop-color:#A1A0A0"
offset="0.3769" />
<stop
id="stop170"
style="stop-color:#7F7F7E"
offset="0.5556" />
<stop
id="stop172"
style="stop-color:#4F4F4E"
offset="0.7517" />
<stop
id="stop174"
style="stop-color:#121212"
offset="0.9595" />
<stop
id="stop176"
style="stop-color:#000000"
offset="1" />
</radialGradient>
<circle
style="fill:url(#XMLID_11_)"
id="circle178"
r="302.95401"
cy="444.22601"
cx="408.427" />
</g>
</mask><mask
id="XMLID_13_"
height="187.183"
width="252.506"
y="279.317"
x="243.061"
maskUnits="userSpaceOnUse">
<g
style="filter:url(#Adobe_OpacityMaskFilter_4_)"
id="g193">
<linearGradient
y2="417.81519"
x2="372.38071"
y1="266.93359"
x1="340.0488"
gradientUnits="userSpaceOnUse"
id="XMLID_14_">
<stop
id="stop196"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop198"
style="stop-color:#F8F8F8"
offset="0.0867" />
<stop
id="stop200"
style="stop-color:#E4E4E4"
offset="0.2156" />
<stop
id="stop202"
style="stop-color:#C2C2C2"
offset="0.3708" />
<stop
id="stop204"
style="stop-color:#949494"
offset="0.5465" />
<stop
id="stop206"
style="stop-color:#595959"
offset="0.7394" />
<stop
id="stop208"
style="stop-color:#151515"
offset="0.9438" />
<stop
id="stop210"
style="stop-color:#000000"
offset="0.9944" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_14_)"
id="ellipse212"
ry="183.32201"
rx="215.32401"
cy="374.28201"
cx="363.052" />
</g>
</mask><mask
id="XMLID_23_"
height="587.491"
width="576.609"
y="97.149"
x="122.963"
maskUnits="userSpaceOnUse">
<g
style="filter:url(#Adobe_OpacityMaskFilter)"
id="g31">
<radialGradient
gradientUnits="userSpaceOnUse"
fy="-20.899401"
fx="88.977501"
r="673.11609"
cy="-20.899401"
cx="88.977501"
id="XMLID_24_">
<stop
id="stop34"
style="stop-color:#FFFFFF"
offset="0.309" />
<stop
id="stop36"
style="stop-color:#000000"
offset="1" />
</radialGradient>
<ellipse
style="fill:url(#XMLID_24_)"
id="ellipse38"
ry="349.10599"
rx="512.93402"
cy="286.172"
cx="295.89499" />
</g>
</mask><radialGradient
id="XMLID_22_"
cx="622.72803"
cy="621.17328"
r="510.71881"
fx="622.72803"
fy="621.17328"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop14" />
<stop
offset="0.2814"
style="stop-color:#E6E6E6"
id="stop16" />
<stop
offset="0.7515"
style="stop-color:#C0C0C0"
id="stop18" />
<stop
offset="1"
style="stop-color:#B2B2B2"
id="stop20" />
</radialGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5498"
id="linearGradient2295"
gradientUnits="userSpaceOnUse"
x1="220.36789"
y1="756.76105"
x2="185.21225"
y2="491.06723" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5498"
id="linearGradient2298"
gradientUnits="userSpaceOnUse"
x1="247.47713"
y1="274.88394"
x2="130.31757"
y2="580.54669" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5498"
id="linearGradient2301"
gradientUnits="userSpaceOnUse"
x1="370.62177"
y1="-309.6048"
x2="370.20648"
y2="458.38397" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5498"
id="linearGradient2304"
gradientUnits="userSpaceOnUse"
x1="1508.4957"
y1="-363.42487"
x2="361.1441"
y2="630.52039" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_5_"
id="linearGradient2307"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
x1="331.49609"
y1="790.51508"
x2="409.85471"
y2="688.75092" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_5_"
id="linearGradient2310"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
x1="319.186"
y1="713.54639"
x2="373.12509"
y2="626.00598" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_5_"
id="linearGradient2313"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
x1="264.5405"
y1="704.23578"
x2="335.09619"
y2="612.60522" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_5_"
id="linearGradient2316"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
x1="237.20799"
y1="684.01898"
x2="328.18469"
y2="565.86761" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_5_"
id="linearGradient2319"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
x1="220.9512"
y1="634.63232"
x2="278.14471"
y2="560.35498" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_4_"
id="linearGradient2322"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.1256295,0,0,1.1256295,1028.9091,-39.54673)"
x1="429.84909"
y1="815.45459"
x2="480.12021"
y2="643.30768" /><radialGradient
inkscape:collect="always"
xlink:href="#radialGradient29545"
id="radialGradient2326"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)"
cx="375.21439"
cy="783.16357"
fx="375.21439"
fy="783.16357"
r="300.5752" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_22_"
id="radialGradient5267"
cx="663.91144"
cy="649.22662"
fx="663.91144"
fy="649.22662"
r="427.12018"
gradientTransform="translate(0,-4.9999861e-6)"
gradientUnits="userSpaceOnUse" /></defs>
<g
id="g2305"
inkscape:export-filename="/home/knome/Work/Amarok logo/oxygen-icon.png"
inkscape:export-xdpi="421.87378"
inkscape:export-ydpi="421.87378"><path
id="circle22"
d="M 840.16762,427.119 C 840.16762,655.12184 655.12184,840.16763 427.119,840.16763 C 199.11616,840.16763 14.070375,655.12184 14.070375,427.119 C 14.070375,199.11616 199.11616,14.070375 427.119,14.070375 C 655.12184,14.070375 840.16762,199.11616 840.16762,427.119 z "
style="fill:url(#radialGradient5267);stroke:#0057ae;stroke-width:28.14313698;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1.0" /><path
id="ellipse40"
d="M 699.57098,390.89499 C 699.57098,553.04278 570.4108,684.64099 411.267,684.64099 C 252.1232,684.64099 122.96301,553.04278 122.96301,390.89499 C 122.96301,228.7472 252.1232,97.148987 411.267,97.148987 C 570.4108,97.148987 699.57098,228.7472 699.57098,390.89499 z "
mask="url(#XMLID_23_)"
style="opacity:0.86000001;fill:#eeeeee"
transform="matrix(1.1256295,0,0,1.1256295,-41.873391,-39.54673)" /><path
id="path43"
d="M 654.69879,222.73733 C 637.51042,222.73733 604.13438,258.58412 591.62864,264.24379 C 579.11727,269.90345 480.08889,334.04295 470.70564,345.36228 C 461.3269,356.68048 448.81777,361.398 435.26745,360.45472 C 421.71824,359.51144 378.87904,359.12422 364.2875,366.67044 C 349.69259,374.21666 283.08009,435.91467 266.40051,443.46201 C 249.72318,451.00598 227.96364,454.87365 217.54031,455.8158 C 207.11698,456.7602 172.58492,491.56804 163.2028,498.17324 C 153.8218,504.7728 85.234943,531.21834 74.81274,536.87576 C 64.388285,542.53655 136.10214,632.11302 148.61126,633.99957 C 161.11813,635.88725 136.32389,645.13542 112.25793,645.13542 C 109.6082,645.13542 146.65154,742.275 272.95618,804.97144 C 382.14786,859.1705 470.12031,826.25709 513.14637,813.11199 C 543.56989,803.81767 549.0866,799.6731 550.13231,784.58066 C 551.17577,769.48934 553.06007,757.5633 555.14586,740.58543 C 557.23165,723.60981 564.52348,581.1749 591.62977,543.44605 C 618.72817,505.71608 696.19287,460.423 723.29352,455.70886 C 750.39643,450.99248 745.18589,441.56083 745.18589,433.07133 C 745.18589,424.58183 741.01543,405.71628 733.7191,402.88645 C 726.42165,400.05774 697.94997,417.05024 688.56898,418.9368 C 679.18686,420.82335 634.36542,423.65319 628.11029,414.22154 C 621.85629,404.78764 678.67695,308.57445 685.97328,297.25625 C 693.26736,285.93692 696.39548,270.84448 682.8474,254.80989 C 669.29145,238.77192 659.90933,222.73733 654.69879,222.73733 z "
style="opacity:0.22000002;fill:#323232" /><path
id="path58"
d="M 618.12146,172.83479 C 601.44751,172.83479 569.07553,211.25928 556.94237,217.3253 C 544.80921,223.39244 448.75361,292.14477 439.65402,304.27905 C 430.55444,316.41109 418.42015,321.46741 405.2773,320.4566 C 392.13445,319.44691 350.58296,319.03043 336.42817,327.1192 C 322.27113,335.2091 257.65887,401.34434 241.48132,409.43423 C 225.3049,417.52076 204.19935,421.6642 194.08782,422.67614 C 183.97854,423.68583 150.48318,460.99707 141.38359,468.07615 C 132.28401,475.15524 60.378793,506.26989 50.268389,512.33366 C 40.156859,518.4008 124.03202,603.36669 136.16518,605.38719 C 148.29834,607.4122 127.8085,653.4482 104.46407,653.4482 C 101.89313,653.4482 125.32536,729.73323 247.83775,796.93894 C 353.75161,855.03831 466.12658,829.3143 507.85929,815.22592 C 537.37105,805.2596 516.65834,799.75189 517.67141,783.57547 C 518.67997,767.3968 519.52982,746.12465 521.55258,727.9266 C 523.57646,709.72742 530.65104,557.05041 556.94124,516.60767 C 583.22807,476.16718 658.36384,427.61653 684.65291,422.56133 C 710.94312,417.50612 705.88566,407.39459 705.88566,398.29613 C 705.88566,389.19767 701.8424,368.97461 694.76332,365.94104 C 687.68648,362.90859 660.07029,381.12353 650.9707,383.14516 C 641.87111,385.16679 598.39367,388.20149 592.32541,378.09108 C 586.25939,367.97843 641.37358,264.84713 648.45154,252.71396 C 655.53063,240.57968 658.56195,224.40101 645.41685,207.21489 C 632.27737,190.02316 623.17666,172.83479 618.12146,172.83479 z "
style="fill:url(#radialGradient2326);fill-opacity:1" /><path
id="path60"
d="M 416.43229,363.42863 C 416.43229,363.42863 376.37564,357.26468 353.26309,380.37836 C 330.14941,403.49091 310.11546,454.33672 311.66095,469.74546 C 313.19968,485.15421 359.42591,417.35754 379.45423,412.73683 C 399.48706,408.11275 421.0575,374.21216 416.43229,363.42863 z "
style="fill:#ffffff" /><path
id="path116"
d="M 517.5791,576.1107 C 517.5791,576.1107 481.73456,698.13344 480.82843,700.01887 C 475.70569,710.66507 466.25715,741.5152 469.51022,751.47814 C 473.34074,763.21508 487.69814,780.27963 494.39902,788.8119 C 501.09989,797.34755 503.97137,801.61368 502.05667,804.8161 C 500.1431,808.01626 475.25431,808.01626 475.25431,808.01626 C 475.25431,808.01626 456.11073,779.21366 452.27909,768.54606 C 448.45194,757.88073 446.53612,735.47957 450.36664,728.0144 C 454.19491,720.54585 517.5791,576.1107 517.5791,576.1107 z "
style="opacity:0.18000004;fill:url(#linearGradient2322)" /><path
id="polygon123"
d="M 264.93381,598.84278 L 199.45032,655.53061 L 281.54923,606.66141 L 264.93381,598.84278 z "
style="opacity:0.2;fill:url(#linearGradient2319)" /><path
id="polygon130"
d="M 329.44139,579.29735 L 218.01983,723.9475 L 346.05568,589.06894 L 329.44139,579.29735 z "
style="opacity:0.2;fill:url(#linearGradient2316);fill-opacity:1.0" /><path
id="polygon137"
d="M 338.23818,629.14248 L 253.20588,764.01991 L 357.78474,637.93815 L 338.23818,629.14248 z "
style="opacity:0.20132015;fill:url(#linearGradient2313);fill-opacity:1.0" /><path
id="polygon144"
d="M 388.08331,623.27682 L 316.73416,790.41029 L 411.5403,628.16543 L 388.08331,623.27682 z "
style="opacity:0.2;fill:url(#linearGradient2310);fill-opacity:1.0" /><path
id="polygon151"
d="M 416.42779,667.25967 L 410.56213,819.73069 L 435.97322,669.21489 L 416.42779,667.25967 z "
style="opacity:0.2;fill:url(#linearGradient2307);fill-opacity:1.0" /><path
id="path2270"
d="M 420.91732,729.36642 C 351.30018,698.39383 288.50975,655.88934 234.26482,603.01627 C 228.17499,597.08044 226.8144,595.4965 226.8144,594.34262 C 226.8144,593.13125 228.55133,591.40592 239.05626,582.1824 C 260.44809,563.40004 265.15448,558.38692 268.80041,550.49987 C 272.52283,542.44735 280.21466,532.95491 295.21739,517.89884 C 328.33946,484.65899 388.46538,434.98491 416.82689,417.42901 C 421.75597,414.37788 424.58874,412.17246 428.48767,408.35063 C 440.85841,396.22453 460.01914,371.72167 499.93884,316.97838 C 542.43234,258.70557 556.73716,239.87049 570.88047,223.57002 C 579.4268,213.72016 585.7114,207.8731 588.1486,207.5041 C 589.18431,207.34729 590.90434,207.06941 591.9709,206.88659 C 593.03746,206.70377 594.40047,206.78803 594.99981,207.07385 C 595.59916,207.35966 596.47603,207.71632 596.94842,207.86643 C 597.85387,208.15415 615.10032,227.66836 621.45221,235.59225 C 629.06069,245.08374 629.74587,247.72667 625.93867,252.8978 C 624.51775,254.82777 623.14916,257.60325 622.0958,260.69106 C 620.28646,265.995 610.96485,284.8373 596.62206,312.18261 C 585.34543,333.68211 570.08225,364.07457 565.31216,374.52776 C 555.24252,396.59436 550.331,411.79539 551.61625,416.91622 C 552.03701,418.59268 554.5804,419.79199 561.41213,421.53535 C 577.39273,425.61339 592.16664,424.99594 605.9335,419.67469 C 608.01588,418.8698 612.90001,416.3756 616.78711,414.13203 C 628.65388,407.28274 637.59912,403.45373 648.76876,400.44235 C 654.10472,399.00376 655.37311,398.8526 662.48236,398.8081 C 669.94112,398.76141 670.43639,398.82084 672.82712,400.04901 C 674.99738,401.16392 675.39512,401.60914 675.75849,403.33033 C 676.57722,407.20845 676.72083,409.70195 676.15791,410.26491 C 675.85023,410.57255 675.59852,411.32821 675.59852,411.94417 C 675.59852,414.47076 669.52221,416.51234 652.58246,419.67732 C 634.81328,422.99725 633.95536,423.35495 621.58956,432.59958 C 593.90887,453.29357 550.84044,490.78155 535.5622,507.4802 C 528.63101,515.05579 518.00575,529.71705 503.68433,551.46683 C 471.5521,600.26572 449.29204,642.4077 443.34539,665.69842 C 442.16377,670.32635 438.83962,691.2303 435.82204,713.00897 C 433.03687,733.11041 432.91259,733.71553 431.57904,733.67009 C 430.99045,733.65005 426.19268,731.71337 420.91732,729.36642 z "
style="opacity:0.57999998;fill:url(#linearGradient2304);fill-opacity:1" /><path
id="path2476"
d="M 232.63545,457.72623 C 232.32648,456.61911 232.38894,446.89128 232.73423,442.33838 C 232.98128,439.08089 233.18774,438.00445 234.05625,435.44502 C 236.74093,427.53362 240.66616,423.12959 246.34405,421.65829 C 248.46188,421.1095 249.61118,420.54692 252.67377,418.55984 C 258.96449,414.47824 266.9936,407.70183 279.8434,395.62919 C 283.33012,392.35334 297.4753,378.44049 311.27713,364.71177 C 325.07896,350.98304 336.99177,339.3012 337.75003,338.75214 C 338.5083,338.20306 339.62503,337.62248 340.23165,337.46196 C 344.66331,336.28925 355.38062,335.72073 382.55689,335.21676 C 408.09255,334.74322 418.96719,334.25126 422.32093,333.41786 C 425.79448,332.5547 433.72051,327.86095 449.69823,317.2052 C 461.25088,309.50061 485.83784,292.50027 500.08576,282.36542 C 503.90907,279.64579 505.46448,278.68996 506.06672,278.68996 C 506.51435,278.68996 506.95729,278.56587 507.05101,278.41423 C 507.14472,278.26258 507.41122,278.13849 507.64324,278.13849 C 507.99016,278.13849 508.03868,278.42006 507.9166,279.72396 C 507.60339,283.0691 507.40571,283.75666 506.35404,285.15932 C 503.48868,288.98093 495.94139,295.14902 487.04407,300.94052 C 484.7598,302.4274 480.32374,305.63362 477.18606,308.06546 C 445.54219,332.59103 424.04481,347.10814 414.75017,350.22825 C 412.90728,350.8469 412.19408,350.93239 408.87631,350.93239 C 402.47717,350.93239 395.12723,352.3194 382.58568,355.89371 C 364.10099,361.16178 347.09763,368.07111 338.16364,373.94464 C 330.40581,379.04493 324.1723,388.83443 317.90944,405.75312 C 315.44537,412.40965 312.53953,422.24882 309.03897,435.78866 C 308.16672,439.16239 307.36897,442.05878 307.26619,442.22508 C 307.16342,442.39138 290.59105,446.05592 270.43873,450.36849 C 250.28639,454.68105 233.58513,458.27493 233.32479,458.35485 C 232.98198,458.4601 232.79187,458.28672 232.63545,457.72623 z "
style="fill:url(#linearGradient2301);fill-opacity:1" /><path
id="path5482"
d="M 137.72559,580.45986 C 137.34282,580.37465 136.58716,580.30043 136.04635,580.29491 C 133.6773,580.27075 126.95272,576.87395 119.71787,572.04689 C 111.87019,566.81093 105.56261,561.80559 98.411879,555.13967 C 96.972365,553.79776 94.464264,551.48807 92.838314,550.00703 C 88.471835,546.02972 81.735123,539.26156 79.754779,536.86241 C 76.134794,532.47692 74.197025,529.24921 73.930598,527.16116 C 73.525521,523.98649 73.539647,523.23809 74.056146,520.50727 C 74.173258,519.88813 75.704,518.55644 77.786876,517.26169 C 81.684875,514.83862 89.97768,509.21429 119.19592,489.17727 C 163.65173,458.69075 182.38099,446.29601 192.25667,440.8268 C 194.75874,439.44115 195.44804,439.28657 199.14319,439.28264 C 202.68422,439.27886 205.66402,439.59679 207.78132,440.20429 C 212.01481,441.41899 218.55894,443.9768 224.32907,446.6721 C 227.2094,448.01756 227.41617,448.14556 227.41617,448.58327 C 227.41617,449.00581 227.31681,449.08032 226.41575,449.33347 C 224.34431,449.91544 218.81508,451.7359 214.28011,453.32905 C 186.7276,463.00831 159.15855,476.3578 134.50683,491.95688 C 128.66425,495.65393 127.98593,496.15089 125.80375,498.33306 C 119.60523,504.53153 114.02491,514.21693 112.46913,521.47709 C 112.25189,522.49083 112.15177,523.69473 112.15082,525.30481 C 112.14929,527.87219 112.45637,529.2153 113.42141,530.86199 C 117.23617,537.37141 136.60237,543.51816 161.6507,546.16976 C 168.95857,546.94337 172.32439,547.12227 179.74358,547.13138 L 186.96406,547.14026 L 188.87793,546.47918 C 193.99516,544.7116 200.99731,540.71142 216.19398,530.8741 C 229.3623,522.34981 233.42675,519.86654 238.11641,517.4801 C 242.50747,515.24563 244.72611,514.58169 246.61672,514.93637 C 247.33648,515.0714 247.46896,515.47588 247.47685,517.56237 C 247.48827,520.57957 247.15877,521.72825 245.6302,523.9999 C 241.21384,530.56322 230.3452,539.48309 215.0564,549.09176 C 202.20767,557.16691 187.57399,564.6544 179.78048,567.14111 C 179.04248,567.37658 177.06305,567.88388 175.38173,568.26843 C 166.39674,570.32344 157.42239,573.5234 145.55502,578.90368 C 143.87492,579.6654 142.39182,580.22135 141.8143,580.30598 C 140.1115,580.55547 138.43805,580.61845 137.72559,580.45986 z "
style="opacity:0.7;fill:url(#linearGradient2298);fill-opacity:1" /><path
id="path6524"
d="M 168.63849,529.9315 C 168.4693,529.90931 166.27755,529.84827 163.76793,529.79586 C 159.24918,529.70149 156.41999,529.50691 152.38621,529.01309 C 143.03032,527.86773 136.79422,526.024 134.60723,523.75665 C 134.14337,523.27573 133.99029,522.70506 133.99765,521.4841 C 134.00721,519.89411 134.15346,519.274 134.8333,517.94054 C 137.71533,512.28764 146.00612,503.33611 155.76996,495.33536 C 157.91225,493.57991 161.46514,490.91334 163.30919,489.6769 L 164.6395,488.78491 L 194.83695,485.13213 L 225.03441,481.47934 L 227.0339,481.5935 C 228.89293,481.69963 230.48389,481.81725 234.5344,482.14805 C 236.40256,482.30062 236.54756,482.36826 236.3708,483.00474 C 236.31176,483.21731 236.26321,483.58448 236.26289,483.82069 C 236.26209,484.42647 235.31089,486.65231 233.98756,489.14512 C 226.84799,502.59401 212.42824,519.53378 202.83492,525.74201 C 200.0852,527.52146 198.15537,528.36324 195.67618,528.86463 C 193.14723,529.37607 189.91738,529.70056 186.3263,529.80398 C 182.79755,529.9056 169.18899,530.00371 168.63849,529.9315 z "
style="fill:url(#linearGradient2295);fill-opacity:1" /></g></svg>

Before

Width:  |  Height:  |  Size: 25 KiB

View file

@ -1,340 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="22"
height="22"
viewBox="0 0 854.238 854.238"
overflow="visible"
enable-background="new 0 0 854.238 854.238"
xml:space="preserve"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.45.1"
sodipodi:docname="amarok_icon_small.svg"
sodipodi:docbase="/home/hydrogen/kde/src/amarok/src/images"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
inkscape:export-filename="/home/me/amarok22.png"
inkscape:export-xdpi="12.643598"
inkscape:export-ydpi="12.643598"><sodipodi:namedview
inkscape:window-height="688"
inkscape:window-width="1022"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:zoom="3.7930793"
inkscape:cx="107.38014"
inkscape:cy="19.259016"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:current-layer="svg2"
width="22px"
height="22px" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs217"><mask
id="XMLID_26_"
height="44.813"
width="93.126"
y="461.543"
x="155.705"
maskUnits="userSpaceOnUse">
<g
id="g69">
<linearGradient
y2="466.75449"
x2="200.0733"
y1="562.85791"
x1="211.7222"
gradientUnits="userSpaceOnUse"
id="XMLID_1_">
<stop
id="stop72"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop74"
style="stop-color:#000000"
offset="1" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_1_)"
id="ellipse76"
ry="59.682999"
rx="80.542"
cy="495.98801"
cx="203.617"
sodipodi:cx="203.617"
sodipodi:cy="495.98801"
sodipodi:rx="80.542"
sodipodi:ry="59.682999" />
</g>
</mask><mask
id="XMLID_2_"
height="127.553"
width="156.907"
y="425.034"
x="101.57"
maskUnits="userSpaceOnUse">
<g
id="g86">
<linearGradient
y2="563.47321"
x2="186.92191"
y1="397.62061"
x1="206.09081"
gradientUnits="userSpaceOnUse"
id="XMLID_3_">
<stop
id="stop89"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop91"
style="stop-color:#CBCBCB"
offset="0.1111" />
<stop
id="stop93"
style="stop-color:#969696"
offset="0.2396" />
<stop
id="stop95"
style="stop-color:#686868"
offset="0.3698" />
<stop
id="stop97"
style="stop-color:#424242"
offset="0.4991" />
<stop
id="stop99"
style="stop-color:#252525"
offset="0.6273" />
<stop
id="stop101"
style="stop-color:#111111"
offset="0.7542" />
<stop
id="stop103"
style="stop-color:#040404"
offset="0.8792" />
<stop
id="stop105"
style="stop-color:#000000"
offset="1" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_3_)"
id="ellipse107"
ry="123.604"
rx="160.94"
cy="495.62299"
cx="194.76401"
sodipodi:cx="194.76401"
sodipodi:cy="495.62299"
sodipodi:rx="160.94"
sodipodi:ry="123.604" />
</g>
</mask><mask
id="XMLID_10_"
height="527.73"
width="447.197"
y="217.631"
x="191.541"
maskUnits="userSpaceOnUse">
<g
id="g159">
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.931,0,0,0.9299,28.7459,21.6629)"
fy="155.23289"
fx="657.2124"
r="606.95343"
cy="155.23289"
cx="657.2124"
id="XMLID_11_">
<stop
id="stop162"
style="stop-color:#C9C9C8"
offset="0" />
<stop
id="stop164"
style="stop-color:#C4C4C4"
offset="0.0881" />
<stop
id="stop166"
style="stop-color:#B8B8B7"
offset="0.2192" />
<stop
id="stop168"
style="stop-color:#A1A0A0"
offset="0.3769" />
<stop
id="stop170"
style="stop-color:#7F7F7E"
offset="0.5556" />
<stop
id="stop172"
style="stop-color:#4F4F4E"
offset="0.7517" />
<stop
id="stop174"
style="stop-color:#121212"
offset="0.9595" />
<stop
id="stop176"
style="stop-color:#000000"
offset="1" />
</radialGradient>
<circle
style="fill:url(#XMLID_11_)"
id="circle178"
r="302.95401"
cy="444.22601"
cx="408.427"
sodipodi:cx="408.427"
sodipodi:cy="444.22601"
sodipodi:rx="302.95401"
sodipodi:ry="302.95401" />
</g>
</mask><mask
id="XMLID_13_"
height="187.183"
width="252.506"
y="279.317"
x="243.061"
maskUnits="userSpaceOnUse">
<g
style="filter:url(#Adobe_OpacityMaskFilter_4_)"
id="g193">
<linearGradient
y2="417.81519"
x2="372.38071"
y1="266.93359"
x1="340.0488"
gradientUnits="userSpaceOnUse"
id="XMLID_14_">
<stop
id="stop196"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop198"
style="stop-color:#F8F8F8"
offset="0.0867" />
<stop
id="stop200"
style="stop-color:#E4E4E4"
offset="0.2156" />
<stop
id="stop202"
style="stop-color:#C2C2C2"
offset="0.3708" />
<stop
id="stop204"
style="stop-color:#949494"
offset="0.5465" />
<stop
id="stop206"
style="stop-color:#595959"
offset="0.7394" />
<stop
id="stop208"
style="stop-color:#151515"
offset="0.9438" />
<stop
id="stop210"
style="stop-color:#000000"
offset="0.9944" />
</linearGradient>
<ellipse
style="fill:url(#XMLID_14_)"
id="ellipse212"
ry="183.32201"
rx="215.32401"
cy="374.28201"
cx="363.052"
sodipodi:cx="363.052"
sodipodi:cy="374.28201"
sodipodi:rx="215.32401"
sodipodi:ry="183.32201" />
</g>
</mask><mask
id="XMLID_23_"
height="587.491"
width="576.609"
y="97.149"
x="122.963"
maskUnits="userSpaceOnUse">
<g
style="filter:url(#Adobe_OpacityMaskFilter)"
id="g31">
<radialGradient
gradientUnits="userSpaceOnUse"
fy="-20.899401"
fx="88.977501"
r="673.11609"
cy="-20.899401"
cx="88.977501"
id="XMLID_24_">
<stop
id="stop34"
style="stop-color:#FFFFFF"
offset="0.309" />
<stop
id="stop36"
style="stop-color:#000000"
offset="1" />
</radialGradient>
<ellipse
style="fill:url(#XMLID_24_)"
id="ellipse38"
ry="349.10599"
rx="512.93402"
cy="286.172"
cx="295.89499"
sodipodi:cx="295.89499"
sodipodi:cy="286.172"
sodipodi:rx="512.93402"
sodipodi:ry="349.10599" />
</g>
</mask></defs>
<g
id="g8826"
transform="translate(-9.9999999e-7,-77.04248)"><path
id="circle22"
d="M 813.31393,504.16148 C 813.31393,717.34108 640.2986,890.35641 427.119,890.35641 C 213.9394,890.35641 40.924072,717.34108 40.924072,504.16148 C 40.924072,290.98188 213.9394,117.96655 427.119,117.96655 C 640.2986,117.96655 813.31393,290.98188 813.31393,504.16148 z "
style="fill:#dddddd;fill-opacity:1;stroke:#0057ae;stroke-width:81.84814453;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><g
transform="matrix(1.0007211,0,0,1.0007211,0,77.042475)"
id="g7521"><path
style="opacity:0.22000002;fill:#323232"
d="M 642.57609,234.13404 C 627.10948,234.13404 597.07671,266.39006 585.82368,271.4828 C 574.56556,276.57553 485.45685,334.29019 477.01352,344.47566 C 468.57424,354.66011 457.31815,358.90508 445.12516,358.05629 C 432.93318,357.20749 394.38517,356.85907 381.25527,363.64938 C 368.12233,370.4397 308.1824,425.95743 293.17361,432.74876 C 278.16685,439.53704 258.58696,443.01729 249.20773,443.86506 C 239.8285,444.71487 208.75552,476.03601 200.3132,481.97956 C 191.87189,487.91805 130.15538,511.71454 120.77716,516.80526 C 111.39693,521.89901 175.92721,602.50261 187.1833,604.20019 C 198.43735,605.89878 176.12675,614.22056 154.47147,614.22056 C 152.08716,614.22056 185.41987,701.62968 299.0726,758.04583 C 397.32655,806.81577 476.48682,777.1993 515.20296,765.37094 C 542.57896,757.00763 547.54306,753.27822 548.48402,739.69759 C 549.42296,726.11797 551.11852,715.38655 552.99537,700.10935 C 554.87223,684.83418 561.43364,556.66695 585.82469,522.7174 C 610.20865,488.76684 679.91372,448.01076 704.29969,443.76883 C 728.68771,439.52489 723.99911,431.03801 723.99911,423.3989 C 723.99911,415.7598 720.2464,398.784 713.68095,396.23764 C 707.11449,393.69229 681.49481,408.98265 673.05351,410.68022 C 664.61119,412.3778 624.27951,414.92418 618.65097,406.4373 C 613.02342,397.94839 664.15237,311.37286 670.71782,301.18841 C 677.28126,291.00293 680.09603,277.4223 667.90506,262.99389 C 655.70701,248.56244 647.2647,234.13404 642.57609,234.13404 z "
id="path43" /><path
style="fill:#00316e;fill-opacity:1"
d="M 609.66271,189.23022 C 594.65899,189.23022 565.52971,223.80574 554.61192,229.26413 C 543.69414,234.72353 457.26042,296.58894 449.07233,307.50773 C 440.88426,318.4245 429.96546,322.97434 418.13913,322.06477 C 406.31279,321.15623 368.92351,320.78146 356.18661,328.05999 C 343.44767,335.33952 285.30761,394.85 270.75057,402.12953 C 256.19454,409.40603 237.20313,413.13442 228.10447,414.045 C 219.00783,414.95354 188.8677,448.52733 180.67962,454.89729 C 172.49154,461.26727 107.78906,489.26517 98.691417,494.72154 C 89.592758,500.18093 165.06615,576.6358 175.98393,578.45391 C 186.90172,580.27607 168.46434,621.70065 147.45832,621.70065 C 145.14491,621.70065 166.22994,690.34422 276.47028,750.81794 C 371.77476,803.0975 472.89314,779.95027 510.44549,767.27311 C 537.00106,758.30512 518.36314,753.34912 519.27473,738.79309 C 520.18227,724.23503 520.94698,705.09371 522.76712,688.71856 C 524.58827,672.34238 530.95419,534.95901 554.6109,498.56742 C 578.26459,462.17785 645.87402,418.49051 669.52971,413.94169 C 693.18644,409.39286 688.63559,400.2942 688.63559,392.10713 C 688.63559,383.92006 684.99734,365.72275 678.62736,362.99304 C 672.25941,360.26436 647.40954,376.65471 639.22145,378.47383 C 631.03337,380.29296 591.91105,383.02367 586.45065,373.92602 C 580.99226,364.82635 630.58567,272.0257 636.95463,261.10791 C 643.32461,250.18912 646.05228,235.63107 634.22393,220.16647 C 622.40062,204.69684 614.21153,189.23022 609.66271,189.23022 z "
id="path58" /><path
style="fill:#ffffff"
d="M 428.17672,360.73231 C 428.17672,360.73231 392.13254,355.1858 371.33517,375.98418 C 350.53679,396.78155 332.50963,442.53415 333.90031,456.39939 C 335.28491,470.26465 376.88066,409.25916 394.90275,405.10131 C 412.92889,400.94043 432.33862,370.43565 428.17672,360.73231 z "
id="path60" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 561 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 681 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 B

View file

@ -1,212 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="hi-action-view-services-lastfm-amarok.svg"
sodipodi:docbase="/home/hydrogen/kde/src/amarok/src/images/icons/svg"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg2"
height="437.00000px"
width="434.00000px"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4">
<filter
id="filter3542">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.56"
id="feGaussianBlur3544" />
</filter>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 218.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="434 : 218.5 : 1"
inkscape:persp3d-origin="217 : 145.66667 : 1"
id="perspective8187" />
<linearGradient
id="linearGradient2222">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop2224" />
<stop
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop2226" />
</linearGradient>
<linearGradient
id="linearGradient2214">
<stop
id="stop2216"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop2218"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient2204">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop2206" />
<stop
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop2208" />
</linearGradient>
<linearGradient
id="linearGradient2182">
<stop
style="stop-color:#83aef7;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop2184" />
<stop
style="stop-color:#378cdd;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop2186" />
</linearGradient>
<linearGradient
id="linearGradient2172">
<stop
id="stop2174"
offset="0.0000000"
style="stop-color:#000000;stop-opacity:0.28571430;" />
<stop
id="stop2176"
offset="1.0000000"
style="stop-color:#4c68de;stop-opacity:0.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient2116">
<stop
id="stop2118"
offset="0.0000000"
style="stop-color:#c3d5fa;stop-opacity:1.0000000;" />
<stop
id="stop2120"
offset="1.0000000"
style="stop-color:#a9c6ff;stop-opacity:0.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient2050">
<stop
id="stop2052"
offset="0.0000000"
style="stop-color:#2ba3cf;stop-opacity:1.0000000;" />
<stop
id="stop2054"
offset="1.0000000"
style="stop-color:#245aad;stop-opacity:1.0000000;" />
</linearGradient>
</defs>
<sodipodi:namedview
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-height="816"
inkscape:window-width="1272"
inkscape:current-layer="layer1"
inkscape:document-units="px"
inkscape:cy="213.2389"
inkscape:cx="302.18257"
inkscape:zoom="1.1203939"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showgrid="false" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Calque 1">
<g
transform="matrix(6.4472134,0,0,6.3914294,-2554.7512,-2519.4588)"
id="lastfm"
inkscape:export-filename="/data/kdesvn/extragear/multimedia/amarok/src/images/icons/hi16-action-view-services-lastfm-amarok.png"
inkscape:export-xdpi="22.5"
inkscape:export-ydpi="22.5">
<g
transform="matrix(0.5714284,0,0,0.6666667,401.91461,396.37974)"
id="g2796"
style="opacity:0.6;fill:#000000;fill-opacity:1;filter:url(#filter3542)">
<radialGradient
cx="52"
cy="-31"
r="136.00369"
id="radialGradient2798"
gradientUnits="userSpaceOnUse">
<stop
id="stop2800"
style="stop-color:#bbbbbb;stop-opacity:1"
offset="0" />
<stop
id="stop2802"
style="stop-color:#eeeeee;stop-opacity:1"
offset="0.30770001" />
<stop
id="stop2804"
style="stop-color:#bbbbbb;stop-opacity:1"
offset="0.78109998" />
<stop
id="stop2806"
style="stop-color:#dbdbdb;stop-opacity:1"
offset="1" />
</radialGradient>
<path
d="M -3.9999997,-6.2999997e-06 C -5.6499996,-6.2999997e-06 -6.9999996,1.3499937 -6.9999996,2.9999936 L -6.9999996,92.999994 C -6.9999996,94.649994 -5.6499996,95.999994 -3.9999997,95.999994 L 102,95.999994 C 103.65,95.999994 105,94.649994 105,92.999994 L 105,2.9999936 C 105,1.3499937 103.65,-6.2999997e-06 102,-6.2999997e-06 L -3.9999997,-6.2999997e-06 z"
id="path2808"
style="fill:#000000;fill-opacity:1" />
</g>
<path
d="M 399.62889,396.37974 C 398.68603,396.37974 397.9146,397.25401 397.9146,398.32258 L 397.9146,456.60833 C 397.9146,457.67687 398.68603,458.55113 399.62889,458.55113 L 460.20032,458.55113 C 461.14316,458.55113 461.9146,457.67687 461.9146,456.60833 L 461.9146,398.32258 C 461.9146,397.25401 461.14316,396.37974 460.20032,396.37974 L 399.62889,396.37974 z"
id="path2810"
style="fill:#9c0f0f;fill-opacity:1" />
<path
d="M 401.22288,398.20831 C 400.32965,398.20831 399.59882,399.03117 399.59882,400.03685 L 399.59882,454.89405 C 399.59882,455.89973 400.32965,456.72257 401.22288,456.72257 L 458.60635,456.72257 C 459.49956,456.72257 460.2304,455.89973 460.2304,454.89405 L 460.2304,400.03685 C 460.2304,399.03117 459.49956,398.20831 458.60635,398.20831 L 401.22288,398.20831 z"
id="path2812"
style="fill:#d11007;fill-opacity:1" />
<g
transform="matrix(2,0,0,2.0000002,215.46559,203.31906)"
id="g54198">
<rect
width="23.999941"
height="24"
x="94.970718"
y="100.06928"
id="rect54306"
style="fill:#969696;fill-opacity:0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 101.93733,104.79645 C 99.645463,104.8868 97.428753,106.09666 96.140959,108.21782 C 94.089915,111.5962 95.202292,115.96302 98.466056,118.14981 C 101.17448,119.96453 106.22304,119.10331 107.16065,116.65504 L 107.01327,114.13052 C 105.52414,117.16059 101.92815,117.81677 99.563077,116.33947 C 98.676247,115.78548 98.028694,115.00455 97.630981,114.11391 C 97.555663,114.08106 97.179969,113.01007 97.188906,112.35339 C 97.123663,111.33788 97.356766,110.2843 97.925751,109.34722 C 99.382136,106.94828 102.45415,106.19244 104.81914,107.66975 C 105.55615,108.1301 105.86051,108.25062 106.60394,109.33061 C 107.35817,110.42635 107.74044,111.43181 108.22501,113.1506 C 108.61525,114.53491 109.2147,116.00418 110.15711,117.20312 C 111.09959,118.40206 112.4662,119.34564 114.16877,119.34564 C 115.67934,119.34565 116.89239,118.93363 117.67278,118.06677 C 118.45318,117.19992 118.83537,116.03416 118.83537,114.84469 C 118.83537,113.53299 118.11738,112.44217 117.27978,111.77208 C 116.44227,111.10201 115.43739,110.79478 114.41438,110.60948 C 113.59775,110.46157 113.03535,110.19367 112.71149,109.8787 C 112.38763,109.56373 112.2058,109.19998 112.20385,108.48357 C 112.20279,108.0761 112.68029,107.29501 113.39918,106.98879 C 114.11807,106.68257 114.93234,106.67485 115.88799,107.71957 L 117.34535,106.34105 C 116.27376,105.16965 114.94794,104.73794 113.75944,104.84627 C 113.36318,104.88239 112.97766,104.98034 112.62959,105.12861 C 111.23723,105.72172 110.20228,106.98478 110.20626,108.48357 C 110.20935,109.62163 110.60129,110.64159 111.3197,111.34026 C 112.03802,112.03894 112.99618,112.41088 114.05412,112.60251 C 114.90569,112.75677 115.62393,113.02424 116.05179,113.36651 C 116.47956,113.7088 116.83771,114.05121 116.83771,114.84469 C 116.83771,115.76039 116.51101,116.34182 116.19909,116.68826 C 115.88726,117.0347 115.34371,117.31938 114.16877,117.31938 C 113.15982,117.31938 112.40681,116.82391 111.71262,115.94087 C 111.01851,115.05782 110.48186,113.79579 110.14078,112.58591 C 109.60502,110.68553 109.05424,109.42741 108.2905,108.28427 C 107.52132,107.13307 106.89765,106.47239 105.91625,105.8594 C 104.69329,105.09549 103.32758,104.75391 101.98648,104.79645 C 101.96845,104.79702 101.95537,104.79573 101.93733,104.79645 z"
id="path54308"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.27069333;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<path
d="M 400.85081,398.17974 C 400.30932,398.4604 399.90284,398.74908 399.66454,399.78344 C 399.65255,399.83547 399.62067,399.8698 399.6021,399.91708 L 399.6021,427.0464 C 424.48524,409.11744 448.4215,404.90482 460.1646,403.99316 L 460.1646,399.38252 C 459.91484,398.67662 459.51052,398.42155 459.04076,398.17974 L 400.85081,398.17974 z"
id="path2828"
style="opacity:0.2;fill:#ffffff" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show more