/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2010 Robert Bieber * * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "projectexporter.h" #include "ui_projectexporter.h" #include "tag_table.h" #include "skin_parser.h" #include "quazipfile.h" #include #include #include #include ProjectExporter::ProjectExporter(QString path, ProjectModel* project, QWidget *parent) :QDialog(parent), ui(new Ui::ProjectExporter), zipFile(path) { ui->setupUi(this); QObject::connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(close())); if(zipFile.open(QuaZip::mdCreate)) { checkRes(project); writeZip(project->getSetting("themebase", "")); zipFile.close(); addSuccess(tr("Project exported successfully")); } else { addError(tr("Couldn't open zip file")); } } ProjectExporter::~ProjectExporter() { delete ui; } void ProjectExporter::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void ProjectExporter::closeEvent(QCloseEvent *event) { close(); event->accept(); } void ProjectExporter::close() { deleteLater(); hide(); } void ProjectExporter::writeZip(QString path, QString base) { if(base == "") base = path; if(path == "") { addError(tr("Couldn't locate project directory")); return; } QDir dir(path); /* First adding any files in the directory */ QFileInfoList files = dir.entryInfoList(QDir::Files); for(int i = 0; i < files.count(); i++) { QFileInfo current = files[i]; QString newPath = current.absoluteFilePath().replace(base, "/.rockbox"); QuaZipFile fout(&zipFile); QFile fin(current.absoluteFilePath()); fin.open(QFile::ReadOnly | QFile::Text); fout.open(QIODevice::WriteOnly, QuaZipNewInfo(newPath, current.absoluteFilePath())); fout.write(fin.readAll()); fin.close(); fout.close(); } /* Then recursively adding any directories */ QFileInfoList dirs = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for(int i = 0; i < dirs.count(); i++) { QFileInfo current = dirs[i]; writeZip(current.absoluteFilePath(), base); } } void ProjectExporter::checkRes(ProjectModel *project) { QMap settings = project->getSettings(); QMap::iterator i; for(i = settings.begin(); i != settings.end(); i++) { if(i.key() == "wps" || i.key() == "rwps" || i.key() == "sbs" || i.key() == "rsbs" || i.key() == "fms" || i.key() == "rfms") { checkWPS(project, i.value()); } else if(i.value().contains("/.rockbox") && i.key() != "configfile" && i.key() != "themebase") { QString absPath = i.value().replace("/.rockbox", settings.value("themebase")); if(QFile::exists(absPath)) { addSuccess(i.key() + tr(" found")); } else { if(i.key() == "font") { QSettings qset; qset.beginGroup("RBFont"); QString fontDir = qset.value("fontDir", "").toString(); qset.endGroup(); QString newDir = fontDir + "/" + absPath.split("/").last(); if(QFile::exists(newDir)) { addSuccess(tr("font found in font pack")); } else { addWarning(tr("font not found")); } } else { addWarning(i.key() + tr(" not found")); } } } } } void ProjectExporter::checkWPS(ProjectModel* project, QString file) { /* Set this to false if any resource checks fail */ bool check = true; QSettings settings; settings.beginGroup("RBFont"); QString fontPack = settings.value("fontDir", "").toString() + "/"; settings.endGroup(); QString fontDir = project->getSetting("themebase", "") + "/fonts/"; QString wpsName = file.split("/").last().split(".").first(); QString imDir = project->getSetting("themebase", "") + "/wps/" + wpsName + "/"; QFile fin(file.replace("/.rockbox", project->getSetting("themebase", ""))); if(!fin.open(QFile::ReadOnly | QFile::Text)) { addWarning(tr("Couldn't open ") + file.split("/").last()); } QString contents(fin.readAll()); fin.close(); skin_element* root; root = skin_parse(contents.toAscii()); if(!root) { addWarning(tr("Couldn't parse ") + file.split("/").last()); return; } /* Now we scan through the tree to check all the resources */ /* Outer loop scans through all viewports */ while(root) { skin_element* line; if(root->children_count == 0) line = 0; else line = root->children[0]; /* Next loop scans through logical lines */ while(line) { /* Innermost loop gives top-level tags */ skin_element* current; if(line->children_count == 0) current = 0; else current = line->children[0]; while(current) { if(current->type == TAG) { if(QString(current->tag->name) == "Fl") { QString font = current->params[1].data.text; if(!QFile::exists(fontDir + font) && !QFile::exists(fontPack + font)) { check = false; addWarning(font + tr(" not found")); } } else if(QString(current->tag->name) == "X") { QString backdrop = current->params[0].data.text; if(!QFile::exists(imDir + backdrop)) { check = false; addWarning(backdrop + tr(" not found")); } } else if(QString(current->tag->name) == "xl") { QString image = current->params[1].data.text; if(!QFile::exists(imDir + image)) { check = false; addWarning(image + tr(" not found")); } } } current = current->next; } line = line->next; } root = root->next; } if(check) addSuccess(file.split("/").last() + tr(" passed resource check")); else addWarning(file.split("/").last() + tr(" failed resource check")); } void ProjectExporter::addSuccess(QString text) { html += tr("") + text + tr("
"); ui->statusBox->document()->setHtml(html); } void ProjectExporter::addWarning(QString text) { html += tr("Warning: ") + text + tr("
"); ui->statusBox->document()->setHtml(html); } void ProjectExporter::addError(QString text) { html += tr("Error: ") + text + tr("
"); ui->statusBox->document()->setHtml(html); }