/* 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 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 #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")){ retval = "video/"; } } return retval; } } const QString md5Sum(const QString &path){ QFileInfo info(path); if(!info.exists() || !info.isFile()){ return QString(); } using namespace CryptoPP; Weak::MD5 hash; std::string res; QString retval; if(info.size() < (5 * 1024 * 1024)){ FileSource f(qPrintable(path), true, new HashFilter(hash, new HexEncoder(new StringSink(res)))); retval = QString::fromStdString(res).toLower(); }else{ QFile file(path); file.open(QIODevice::ReadOnly); int offset = info.size() / 3; file.seek(offset); int numBytes = 512 * 1024; char *data = new char[numBytes]; int read = file.read(data, numBytes); if(read != numBytes){ delete [] data; return QString(); } StringSource s((byte*)data, numBytes, true, new HashFilter(hash, new HexEncoder(new StringSink(res)))); retval = QString::fromStdString(res).toLower(); delete [] data; } return retval; } bool moveToArchive(const QString &path, const QString &md5){ QFileInfo info(path); if(!info.exists()){ return false; } QFileInfo destFile = QFileInfo(createArchivePath(path, md5)); if(destFile.exists()){ destFile = QFileInfo(createArchivePath(path, md5, true)); if(destFile.exists()){ return false; } } return QFile::rename(path, destFile.absoluteFilePath()); } 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; } }