/*************************************************************************** * Copyright (C) 2008 by Ilya Kotov * * forkotov02@hotmail.ru * * * * 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., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include "skinreader.h" SkinReader::SkinReader(QObject *parent) : QObject(parent) { m_process = new QProcess(this); //create cache dir QDir dir(QDir::homePath() +"/.qmmp/"); dir.mkdir("cache"); dir.cd("cache"); dir.mkdir("thumbs"); dir.mkdir("skin"); } SkinReader::~SkinReader() {} void SkinReader::generateThumbs() { m_previewMap.clear(); QDir dir(QDir::homePath() +"/.qmmp/skins"); dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList f = dir.entryInfoList(); dir.setPath(qApp->applicationDirPath()+"/../share/qmmp/skins"); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); f << dir.entryInfoList(); QDir cache_dir(QDir::homePath() +"/.qmmp/cache/thumbs"); cache_dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList d = cache_dir.entryInfoList(); //clear removed skins from cache foreach(QFileInfo thumbFile, d) { bool del = TRUE; foreach(QFileInfo fileInfo, f) { if (fileInfo.baseName () == thumbFile.baseName ()) { del = FALSE; break; } } if (del) { qDebug("SkinReader: deleting %s from cache", qPrintable(thumbFile.fileName ())); cache_dir.remove(thumbFile.fileName ()); } } //add new skins to cache foreach(QFileInfo fileInfo, f) { bool create = TRUE; foreach(QFileInfo thumbInfo, d) { if (fileInfo.baseName () == thumbInfo.baseName ()) { create = FALSE; break; } } if (create) { qDebug("SkinReader: adding %s to cache", qPrintable(fileInfo.fileName ())); QString name = fileInfo.fileName ().toLower(); if (name.endsWith(".tgz") || name.endsWith(".tar.gz") || name.endsWith(".tar.bz2")) untar(fileInfo.filePath (), cache_dir.absolutePath (), TRUE); if (name.endsWith(".zip") || name.endsWith(".wsz")) unzip(fileInfo.filePath (), cache_dir.absolutePath (), TRUE); } } //add thumbs to map d = cache_dir.entryInfoList(); foreach(QFileInfo fileInfo, f) { foreach(QFileInfo thumbInfo, d) { if (fileInfo.baseName () == thumbInfo.baseName ()) { m_previewMap.insert(fileInfo.absoluteFilePath (), thumbInfo.absoluteFilePath ()); break; } } } } void SkinReader::unpackSkin(const QString &path) { //remove old skin QDir dir(QDir::homePath() +"/.qmmp/cache/skin"); dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList f = dir.entryInfoList(); foreach(QFileInfo file, f) dir.remove(file.fileName()); //unpack if (path.endsWith(".tgz") || path.endsWith(".tar.gz") || path.endsWith(".tar.bz2")) untar(path, QDir::homePath() +"/.qmmp/cache/skin", FALSE); if (path.endsWith(".zip") || path.endsWith(".wsz")) unzip(path, QDir::homePath() +"/.qmmp/cache/skin", FALSE); } const QStringList SkinReader::skins() { return m_previewMap.keys(); } const QPixmap SkinReader::getPreview(const QString &skinPath) { return QPixmap(m_previewMap.value(skinPath)); } void SkinReader::untar(const QString &from, const QString &to, bool preview) { QByteArray array; QStringList args; //list archive args << "tf" <start("tar", args); m_process->waitForFinished(); array = m_process->readAllStandardOutput (); QString str = QString(array); QStringList outputList = str.split("\n", QString::SkipEmptyParts); foreach(QString str, outputList) { str = str.trimmed(); args.clear(); if (!preview || (str.contains("/main.", Qt::CaseInsensitive) || str.startsWith("main.", Qt::CaseInsensitive))) { args << "xvfk" << from << "-O" << str; m_process->start("tar", args); m_process->waitForFinished(); array = m_process->readAllStandardOutput (); QString name; if (preview) name = from.section('/',-1) + (".") + str.section('.', -1); else name = str.contains('/') ? str.section('/',-1).toLower() : str.toLower(); QFile file(to+"/"+name); file.open(QIODevice::WriteOnly); file.write(array); file.close(); } } } void SkinReader::unzip(const QString &from, const QString &to, bool preview) { QStringList args; if (preview) { args << "-C" << "-j" << "-o" << "-d" << to << from << "main.*" << "*/main.*"; m_process->start("unzip", args); m_process->waitForFinished(); QDir dir(to); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList fileList = dir.entryInfoList(); foreach(QFileInfo thumbInfo, fileList) { if (thumbInfo.fileName().startsWith("main.", Qt::CaseInsensitive)) { dir.rename(thumbInfo.fileName(), from.section('/', -1) + "." + thumbInfo.suffix ()); } } } else { args << "-j" << "-o" << "-d" << to << from; m_process->start("unzip", args); m_process->waitForFinished(); } }