/* 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "helper.h" namespace Helper { const QString mimeType(const QString &path){ QString retval; magic_t mc = magic_open(MAGIC_MIME_TYPE); QByteArray name = path.toUtf8(); if(mc){ magic_load(mc, 0); const char* magic_c = magic_file(mc, name.constData()); retval = QString(magic_c); magic_close(mc); } if(retval.toLower().startsWith("application/octet-stream")){ magic_t mc = magic_open(MAGIC_NONE); if(mc){ magic_load(mc, 0); const char* magic_c = magic_file(mc, name.constData()); QString desc(magic_c); magic_close(mc); if(desc.toLower().contains("mpeg sequence") || desc.toLower().contains("microsoft asf") || desc.toLower().contains("matroska data")){ retval = "video/"; } } } return retval; } const QString md5Sum(const QString &path){ QFileInfo info(path); if(!info.exists() || !info.isFile()){ return QString(); } QString retval; QCryptographicHash h(QCryptographicHash::Md5); QFile file(path); file.open(QIODevice::ReadOnly); qint64 read = 0; if(info.size() < (5 * 1024 * 1024)){ QByteArray data(4096, '\0'); do { read = file.read(data.data(), 4096); h.addData(data.data(), read); } while (read == 4096); QByteArray res = h.result(); retval = res.toHex().toLower(); }else{ QByteArray data(512, '\0'); int offset = info.size() / 3; file.seek(offset); int numBytes = 512 * 1024; int readBytes = 0; do { read = file.read(data.data(), 512); readBytes += read; h.addData(data.data(), read); } while(readBytes < numBytes); QByteArray res = h.result(); retval = res.toHex().toLower(); } return retval; } const QString moveToArchive(const QString &path, const QString &md5, bool copy){ QFileInfo info(path); if(!info.exists()){ return QString(); } QFileInfo destFile = QFileInfo(createArchivePath(path, md5)); if(destFile.exists()){ destFile = QFileInfo(createArchivePath(path, md5, true)); if(destFile.exists()){ return QString(); } } QFileInfo destDir = QFileInfo(destFile.absolutePath()); if(!destDir.exists()){ QDir::root().mkpath(destFile.absolutePath()); } bool success = false; if(copy){ success = QFile::copy(path, destFile.absoluteFilePath()); }else{ success = QFile::rename(path, destFile.absoluteFilePath()); } if(success){ return destFile.absoluteFilePath(); } return QString(); } bool removeFromArchive(const QString &fileName, const QString &md5){ QString file = createArchivePath(fileName, md5); QFileInfo info(file); if(!info.exists()){ return false; } return QFile::remove(file); } const QString createArchivePath(const QString &path, const QString &md5, bool withMd5){ QSettings s; QString archiveDir = s.value("paths/archivedir").toString(); QFileInfo info(path); QString retval; if(withMd5){ retval = QString("%1/%2/%3/%4_%5.%6").arg(archiveDir).arg(md5[0]).arg(md5[1]).arg(info.completeBaseName()).arg(md5).arg(info.suffix()); }else{ retval = QString("%1/%2/%3/%4").arg(archiveDir).arg(md5[0]).arg(md5[1]).arg(info.fileName()); } return retval; } QPair programData(const QString &prefix, const QString &preferred){ QSettings s; QString section = QString("programs_%1").arg(prefix); QHash data = s.value(QString("%1/data").arg(section)).toHash(); if(data.isEmpty()){ return QPair(); } QHash programData; if(!preferred.isEmpty()){ if(data.keys().contains(preferred)){ programData = data.value(preferred).toHash(); return qMakePair(programData.value("path").toString(), programData.value("args").toStringList()); } return QPair(); } QString defaultProg = s.value(QString("%1/default").arg(section)).toString(); if(defaultProg.isEmpty()){ return QPair(); } programData = data.value(defaultProg).toHash(); return qMakePair(programData.value("path").toString(), programData.value("args").toStringList()); } const QString durationFromSecs(qint64 secs){ int minutes = secs / 60; int hours = 0; int seconds = 0; if(minutes > 60){ hours = minutes / 60; minutes -= hours * 60; } seconds = secs - hours * 60 * 60 - minutes * 60; seconds = (seconds > 60) ? 59 : seconds; QByteArray retval(10, '\0'); ::snprintf(retval.data(), 9, "%.2d:%.2d:%.2d", hours, minutes, seconds); return retval; } QVariant bytesFromUnit(QVariant number, const QString unit){ QString u = unit.toLower(); quint64 retval = number.toULongLong(); if(u == "k"){ retval = retval * 1024; }else if(u == "m"){ retval = retval * 1024 * 1024; }else if(u == "g"){ retval = retval * 1024 * 1024 * 1024; } return retval; } const QStringList toStringList(const QList &list){ QStringList retval; foreach(QVariant v, list){ retval << v.toString(); } return retval; } const QString colorToHtml(const QColor &color){ char colString[7]; ::snprintf(colString, 7, "%0x%0x%0x", color.red(), color.green(), color.blue()); return QString::fromAscii(colString); } bool SortFileInfoList::operator ()(const QFileInfo &lhs, const QFileInfo &rhs) const { return lhs.fileName().toLower() < rhs.fileName().toLower(); } bool FileInfoListContains::operator ()(const QFileInfo &info, const QString &file) const { return info.fileName() == file; } void centerWidget(QWidget *widget){ QRect widgetRect = widget->rect(); widgetRect.moveCenter(qApp->desktop()->screenGeometry().center()); widget->move(widgetRect.topLeft()); } }