aboutsummaryrefslogblamecommitdiff
path: root/src/skinreader.cpp
blob: 64e0aacc90acfc7a0173f52baf563f61737528e2 (plain) (tree)















































































































































                                                                                                            
/***************************************************************************
 *   Copyright (C) 2006 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 <QDir>
#include <QList>
#include <QFileInfo>
#include <QProcess>
#include <QByteArray>
#include <QFile>

#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("skins");
}


SkinReader::~SkinReader()
{}

void SkinReader::updateCache()
{
    QDir dir(QDir::homePath() +"/.qmmp/skins");
    dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    QFileInfoList f = dir.entryInfoList();
    //clear removed skins from cache
    QDir cache_dir(QDir::homePath() +"/.qmmp/cache/skins");
    cache_dir.setFilter(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);
    QFileInfoList d = cache_dir.entryInfoList();

    foreach(QFileInfo dirInfo, d)
    {
        bool del = TRUE;
        foreach(QFileInfo fileInfo, f)
        {
            if (fileInfo.baseName () == dirInfo.fileName ())
            {
                del = FALSE;
                break;
            }
        }
        if (del)
        {
            qDebug("SkinReader: deleting %s from cache",
                   qPrintable(dirInfo.fileName ()));

            cache_dir.cd(dirInfo.fileName ());
            cache_dir.setFilter(QDir::Files | QDir::Hidden);
            QFileInfoList removeList = cache_dir.entryInfoList();
            foreach(QFileInfo to_remove, removeList)
            cache_dir.remove(to_remove.fileName ());
            cache_dir.cdUp();
            cache_dir.rmdir(dirInfo.fileName ());
        }
    }
    //add new skins to cache
    foreach(QFileInfo fileInfo, f)
    {
        bool create = TRUE;
        foreach(QFileInfo dirInfo, d)
        {
            if (fileInfo.baseName () == dirInfo.fileName ())
            {
                create = FALSE;
                break;
            }
        }
        if (create)
        {
            qDebug("SkinReader: adding %s to cache",
                   qPrintable(fileInfo.fileName ()));
            cache_dir.mkdir(fileInfo.baseName ());
            QString name = fileInfo.fileName ().toLower();

            if (name.endsWith(".tgz") || name.endsWith(".tar.gz"))
                untar(fileInfo.filePath (), cache_dir.absolutePath ()+"/"+
                      fileInfo.baseName ());
            if (name.endsWith(".zip") || name.endsWith(".wsz"))
                unzip(fileInfo.filePath (), cache_dir.absolutePath ()+"/"+
                      fileInfo.baseName ());
        }
    }
}

void SkinReader::untar(const QString &from, const QString &to)
{
    QByteArray array;
    QStringList args;
    //list archive
    args << "tf" <<from;
    m_process->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();
        args << "xvfk" << from << "-O" << str;
        m_process->start("tar", args);
        m_process->waitForFinished();
        array = m_process->readAllStandardOutput ();
        QString name = str.right(str.size() - str.indexOf("/",Qt::CaseInsensitive) - 1).trimmed().toLower();

        QFile file(to+"/"+name);
        file.open(QIODevice::WriteOnly);
        file.write(array);
        file.close();
    }
}

void SkinReader::unzip(const QString &from, const QString &to)
{
    QStringList args;
    args << "-j" << "-o" << "-d" << to << from;
    m_process->start("unzip", args);
    m_process->waitForFinished();
}