diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a4b1a8..f0d84b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,102 +1,102 @@ project( klook ) cmake_minimum_required( VERSION 3.5.1 FATAL_ERROR ) set (QT_MIN_VERSION "5.9.0") set (KF5_MIN_VERSION "5.35.0") # TODO: find an appropriate version find_package(ECM ${KF5_MIN_VERSION} REQUIRED CONFIG) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") # Yeah, everything is deprecated, we know include(FeatureSummary) include(ECMAddAppIcon) include(ECMInstallIcons) include(KDEInstallDirs) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) kde_enable_exceptions() # We actually use/handle exceptions -find_package( Qt5 ${QT_MIN_VERSION} NO_MODULE REQUIRED Core Gui Quick Qml) +find_package( Qt5 ${QT_MIN_VERSION} NO_MODULE REQUIRED Core Gui Quick Qml Multimedia) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS KDELibs4Support KIO Parts Declarative Plasma DBusAddons ) find_package(Phonon4Qt5 REQUIRED) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) add_subdirectory( icons ) set(EXIV2_MIN_VERSION "0.19") find_package(Exiv2) set( QRC_RESOURCES src/resources.qrc ) file( GLOB qml_files "${CMAKE_CURRENT_SOURCE_DIR}/src/qml/*.qml" ) set( klook_SRCS src/main.cpp src/declarativeviewer.cpp src/video.cpp src/text.cpp src/file.cpp src/listitem.cpp src/previewgenerator.cpp src/previewprovider.cpp src/filemodel.cpp src/klookapp.cpp src/audio.cpp src/mimeprovider.cpp src/kpartsdeclarativeitem.cpp src/kpartswidget.cpp src/listitemcontent.cpp src/exifimageprovider.cpp src/rotatedimage.cpp ${qml_files} ) #set_source_files_properties(src/rotatedimage.cpp PROPERTIES COMPILE_FLAGS ${KDE4_ENABLE_EXCEPTIONS}) file(GLOB ICON_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi*-apps-klook.png" ) ecm_add_app_icon(klook_SRCS ICONS ${ICON_SRCS}) add_executable( klook ${klook_SRCS} ${QRC_SOURCES} ) target_include_directories(klook SYSTEM PUBLIC ${PHONON_INCLUDE_DIR}) target_link_libraries(klook KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM ${EXIV2_LIBRARIES} KF5::Plasma ${PHONON_LIBRARY} KF5::Parts KF5::Declarative KF5::KDELibs4Support KF5::DBusAddons - Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick + Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Multimedia ) install( TARGETS klook ${INSTALL_TARGETS_DEFAULT_ARGS} ) install( FILES ${qml_files} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/ ) install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/qml/images/ DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/images ) #FIX AT SOME OTHER POINT IN TIME #Translations #if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/locale) #find_package( Msgfmt REQUIRED ) #find_package( Gettext REQUIRED ) #add_subdirectory( locale ) #endif() diff --git a/src/file.cpp b/src/file.cpp index 85eaf0a..529baa4 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -1,323 +1,311 @@ /* KLook * Copyright (c) 2011-2012 ROSA * Authors: Julia Mineeva, Evgeniy Auzhin, Sergey Borovkov. * License: GPLv3 * * 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 3, * 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. */ #include "file.h" +#include #include #include #include #include #include #include #include #include -#include #include +#include File::File(QObject* parent) : QObject(parent) , m_job(0) , m_type(Progress) , m_tempFile(0) , m_isLoaded(0) { } File::File(KUrl url, QObject* parent) : QObject(parent) , m_url(url) , m_job(0) , m_type(File::Progress) , m_tempFile(0) , m_isLoaded(0) , m_mimeJobStarted(false) , m_downloadInProgress(false) , m_isCurrent(false) { m_isLoaded = m_url.isLocalFile(); } File::~File() { stopDownload(); } KUrl File::url() const { return m_url; } void File::setUrl(QUrl url) { m_url = url; m_isLoaded = url.isLocalFile(); } File::FileType File::type() const { return m_type; } void File::setType(FileType type) { m_type = type; } QString File::mime() const { return m_mime; } void File::setMime(const QString &mime) { m_mime = mime; } void File::load() { if(type() == Progress) { if(!m_mimeJobStarted) loadType(); } else if(needDownload() && m_isCurrent) { download(); } } void File::download() { if(m_downloadInProgress) { qDebug() << "Trying to download file for the second time..."; return; } if(!m_tempFile) { m_tempFile = new QTemporaryFile(this); } if (m_tempFile->open()) { m_downloadInProgress = true; m_job = KIO::file_copy(m_url, KUrl(m_tempFile->fileName()), -1, KIO::Overwrite | KIO::HideProgressInfo); m_job->setAutoDelete(false); connect(m_job, SIGNAL(result(KJob *)), SLOT(slotDownloadResult(KJob *))); KIO::getJobTracker()->registerJob(m_job); } emit dataChanged(); } bool File::needDownload() { const FileType t = type(); if(url().isLocalFile()) return false; if(t == File::Image || t == File::Txt || t == File::Audio || t == File::Video) { return true; } return false; } bool File::isLoaded() const { return m_isLoaded; } bool File::downloadInProgress() const { return m_downloadInProgress; } void File::stopDownload() { if(m_job) { m_downloadInProgress = false; m_isLoaded = false; m_job->kill(); KIO::getJobTracker()->unregisterJob(m_job); delete m_job; m_job = 0; delete m_tempFile; m_tempFile = 0; } } QString File::tempFilePath() const { return m_tempFile ? m_tempFile->fileName() : QString(); } QString File::error() const { return m_error; } void File::slotDownloadResult(KJob *job) { m_downloadInProgress = false; if (job->error()) { setType(Error); m_error = job->errorString(); m_isLoaded = true; } else { m_isLoaded = true; } KIO::getJobTracker()->unregisterJob(job); job->deleteLater(); m_job = 0; emit dataChanged(); } void File::resultMimetypeJob(KJob *job) { if (!job->error()) { setMime(dynamic_cast(job)->mimetype()); FileType t = getFileType(mime(), url().fileName()); setType(t); // now that we know file type we can download file if necessary if(needDownload()) { if(m_isCurrent) { download(); } } else { m_isLoaded = true; } } else { setType(File::Error); m_isLoaded = true; m_error = job->errorString(); } emit dataChanged(); } void File::loadType() { if(!m_mimeJobStarted) { KIO::MimetypeJob *job = KIO::mimetype(url(), KIO::HideProgressInfo); connect(job, SIGNAL(result(KJob *)), SLOT(resultMimetypeJob(KJob*))); m_mimeJobStarted = true; } } File::FileType getFileType(const QString& mime, const QString& name) { static QList supportedImageFormats = QImageReader::supportedImageFormats(); // this method is a complete mess right now // information about supported types should not be hardcoded int delimiter = mime.indexOf('/'); File::FileType type = File::MimetypeFallback; if (delimiter != -1) { QString left = mime.left(delimiter); if (left == QLatin1String("image")) { QString right = mime.mid(delimiter + 1); if (supportedImageFormats.contains(right.toLatin1()) || right == QLatin1String("x-xpixmap") || right == QLatin1String("x-xpixmap") || right == QLatin1String("x-portable-bitmap") || right == QLatin1String("x-portable-pixmap") || right == QLatin1String("x-portable-graymap") || right == "x-xbitmap") type = File::Image; else if (supportedImageFormats.contains("svg") && (right == QLatin1String("svg+xml") || right == QLatin1String("svg+xml-compressed"))) type = File::Image; } else if (left == QLatin1String("video")) { - QString right = mime.mid(delimiter + 1); - // make a double check - for some reason isMimeTypeAvailable - // does not always correct - but documentation lists it as a - // preferred method to check it mimetype can bdecoded - if (Phonon::BackendCapabilities::isMimeTypeAvailable(mime) - || Phonon::BackendCapabilities::availableMimeTypes().contains(mime)) { + if (QMediaPlayer::hasSupport(mime) != QMultimedia::NotSupported) { type = File::Video; } - - if (type == File::MimetypeFallback) { - if (right == QLatin1String("3gpp") - || right == QLatin1String("mp4") - || right == QLatin1String("x-theora+ogg")) { - type = File::Video; - } - } } else if (left == QLatin1String("audio")) { QString right = mime.mid(delimiter + 1); if (Phonon::BackendCapabilities::isMimeTypeAvailable(mime)) { type = File::Audio; } if (type == File::MimetypeFallback) { if (right == QLatin1String("ogg") || right == QLatin1String("mpeg") || right == QLatin1String("x-speex+ogg") || right == QLatin1String("x-vorbis+ogg") || right == QLatin1String("x-flac+ogg")) { type = File::Audio; } } } else if (left == QLatin1String("text") || mime == QLatin1String("application/x-zerosize") || mime == QLatin1String("application/x-shellscript")) { type = File::Txt; } else if(mime.mid(delimiter + 1) == QLatin1String("directory")) { type = File::Directory; } } if(mime == QLatin1String("application/pdf") || mime == QLatin1String("application/vnd.oasis.opendocument.text") || mime == QLatin1String("application/x-vnd.oasis.opendocument.text") || mime == QLatin1String("application/x-chm") || mime == QLatin1String("application/x-fictionbook+xml") || mime == QLatin1String("application/xhtml+xml")) { type = File::OkularFile; } if (type == File::MimetypeFallback) { if (mime == QLatin1String("application/x-matroska") || mime == QLatin1String("application/vnd.rn-realmedia")) { type = File::Video; } else if (mime == QLatin1String("bmp")) { type = File::Image; } else if (mime == QLatin1String("application/octet-stream")) { QFileInfo fi(name); if (fi.suffix() == QLatin1String("mp3") || fi.suffix() == QLatin1String("ogg")) type = File::Audio; } } return type; }