Skip to content

Commit

Permalink
added indication of applications which was installed through winetric…
Browse files Browse the repository at this point in the history
…ks [BUG-106][BUG-111];
  • Loading branch information
brezerk committed Sep 22, 2017
1 parent 98fe6af commit bb57dd4
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 71 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
Version 1.3.6
Updated:
- added indication of applications which was installed through winetricks [BUG-106][BUG-111];
- new app settings for default desktop integration paths [BUG-106];

Version 1.3.5
Updated:
- Italian translation;
Expand Down
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Expand Up @@ -8,7 +8,7 @@ PROJECT(q4wine)

SET(CMAKE_VERBOSE_MAKEFILE ON)

SET(APP_VERSION "1.3.5")
SET(APP_VERSION "1.3.6")
SET(APP_NAME_GLOBAL "q4wine")

if(POLICY CMP0011)
Expand Down
10 changes: 10 additions & 0 deletions src/core/database/db.cpp
Expand Up @@ -266,5 +266,15 @@ bool DataBase::fixup(){
}
}
query.exec("DELETE FROM images WHERE name IS NULL");
if (!query.exec("SELECT is_installed FROM sysconfig")){
if (!query.exec("ALTER TABLE sysconfig ADD COLUMN is_installed INTEGER")){
qDebug()<<"[EE] Cannot alter sysconfig table";
return false;
}
if (!query.exec("UPDATE sysconfig SET is_installed=0")){
qDebug()<<"[EE] Cannot update sysconfig table";
return false;
}
}
return true;
}
16 changes: 9 additions & 7 deletions src/core/database/sysconfig.cpp
Expand Up @@ -68,17 +68,17 @@ QList<SysconfigItem> Sysconfig::getItems(QString provider, QString type, int sor

if (type.isEmpty()){
if (filter.isEmpty()){
sql = "SELECT id, name, icon, desc FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type IS NULL";
sql = "SELECT id, name, icon, desc, is_installed FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type IS NULL";
} else {
sql = QString("SELECT id, name, icon, desc FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type IS NULL AND name LIKE \"%%1%\"").arg(filter);
sql = QString("SELECT id, name, icon, desc, is_installed FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type IS NULL AND name LIKE \"%%1%\"").arg(filter);
}
sql.append(order);
query.prepare(sql);
} else {
if (filter.isEmpty()){
sql = "SELECT id, name, icon, desc FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type=:type";
sql = "SELECT id, name, icon, desc, is_installed FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type=:type";
} else {
sql = QString("SELECT id, name, icon, desc FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type=:type AND name LIKE \"%%1%\"").arg(filter);
sql = QString("SELECT id, name, icon, desc, is_installed FROM sysconfig WHERE provider_id=(SELECT id FROM providers WHERE name=:provider) AND type=:type AND name LIKE \"%%1%\"").arg(filter);
}
sql.append(order);
query.prepare(sql);
Expand All @@ -92,25 +92,27 @@ QList<SysconfigItem> Sysconfig::getItems(QString provider, QString type, int sor
item.name = query.value(1).toString();
item.icon = query.value(2).toString();
item.desc = query.value(3).toString();
item.is_installed = query.value(4).toBool();
items.append(item);
}
}
query.clear();
return items;
}

bool Sysconfig::add_item(QString name, QString icon, QString desc, QString type, int provider_id){
bool Sysconfig::add_item(QString name, QString icon, QString desc, QString type, int provider_id, bool is_installed){
QSqlQuery query;
if (type.isEmpty()){
query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, NULL, :desc, :provider_id);");
query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id, is_installed) VALUES(NULL, :name, :icon, NULL, :desc, :provider_id, :is_installed);");
} else {
query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, :type, :desc, :provider_id);");
query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id, is_installed) VALUES(NULL, :name, :icon, :type, :desc, :provider_id, :is_installed);");
query.bindValue(":type", type);
}
query.bindValue(":name", name);
query.bindValue(":icon", icon);
query.bindValue(":desc", desc);
query.bindValue(":provider_id", provider_id);
query.bindValue(":is_installed", (is_installed)? 1 : 0);
if (!query.exec()){
qDebug() << "Error sysconfig::add_item: " << query.lastError().text();
return false;
Expand Down
3 changes: 2 additions & 1 deletion src/core/database/sysconfig.h
Expand Up @@ -52,6 +52,7 @@ struct SysconfigItem {
QString type;
QString desc;
int provider_id;
bool is_installed;
};

class Sysconfig
Expand All @@ -65,7 +66,7 @@ class Sysconfig
QList<ProviderItem> getProviders(void) const;
QStringList getProviderSubtypes(int provider_id) const;
QList<SysconfigItem> getItems(QString provider, QString type, int sort_order, QString filter) const;
bool add_item(QString name, QString icon, QString desc, QString type, int provider_id);
bool add_item(QString name, QString icon, QString desc, QString type, int provider_id, bool is_installed);
bool drop_items(int provider_id);

bool begin();
Expand Down
160 changes: 99 additions & 61 deletions src/plugins/winetricks.cpp
Expand Up @@ -51,6 +51,40 @@ winetricks::winetricks(QString prefixName) : QWidget()
this->console_args = CoreLib->getSetting("console", "args", false).toString();
}

QStringList winetricks::get_installed() {

QStringList installed_apps;

if (!check_script())
return installed_apps;

QString infile = QString(winetricks_bin);

QProcess process;

QStringList args; // = get_command("list-installed");
args.append("-c");
args.append(get_command("list-installed").join(" "));

QString exec = "/bin/sh";

process.start(exec, args);
process.waitForFinished(-1); // will wait forever until finished

QString stdout = process.readAllStandardOutput();
QString stderr = process.readAllStandardError();

QString pkg_name;
foreach(pkg_name, stdout.split("------------------------------------------------------").last().split("\n")){
if (!pkg_name.isEmpty()){
qDebug() << pkg_name;
installed_apps.append(pkg_name);
}
}

return installed_apps;
}

void winetricks::install_winetricks() {
this->downloadwinetricks();
}
Expand Down Expand Up @@ -85,81 +119,83 @@ void winetricks::run_winetricks(QString item){
}
}

QString proxy_host = CoreLib->getSetting("network", "host", false).toString();
if (console_bin.split("/").last() == "konsole"){
args.append("/bin/sh");
args.append("-c");
}

QStringList sh_args;
sh_args.append("env");
args.append(get_command(item).join(" "));

if (!proxy_host.isEmpty()){
QString proxy_auth = CoreLib->getSetting("network", "user", false).toString();
if (!proxy_auth.isEmpty()){
QString proxy_pass = CoreLib->getSetting("network", "pass", false).toString();
proxy_auth.append(QString(":%1@").arg(proxy_pass));
}
QString proxy_var = QString("http://%1%2:%3").arg(proxy_auth).arg(proxy_host).arg(CoreLib->getSetting("network", "port", false).toString());
sh_args.append(QString("http_proxy='%1'").arg(proxy_var));
sh_args.append(QString("https_proxy='%1'").arg(proxy_var));
sh_args.append(QString("ftp_proxy='%1'").arg(proxy_var));
#ifdef DEBUG
qDebug()<<"[DD] winetricks args: "<<args;
#endif

QProcess proc;
proc.startDetached(console_bin, args, QDir::homePath());

return;
}

QStringList winetricks::get_command(QString item){
QStringList sh_args;
QString proxy_host = CoreLib->getSetting("network", "host", false).toString();
sh_args.append("env");

if (!proxy_host.isEmpty()){
QString proxy_auth = CoreLib->getSetting("network", "user", false).toString();
if (!proxy_auth.isEmpty()){
QString proxy_pass = CoreLib->getSetting("network", "pass", false).toString();
proxy_auth.append(QString(":%1@").arg(proxy_pass));
}
QString proxy_var = QString("http://%1%2:%3").arg(proxy_auth).arg(proxy_host).arg(CoreLib->getSetting("network", "port", false).toString());
sh_args.append(QString("http_proxy='%1'").arg(proxy_var));
sh_args.append(QString("https_proxy='%1'").arg(proxy_var));
sh_args.append(QString("ftp_proxy='%1'").arg(proxy_var));
}

QHash<QString, QString> prefix_info = db_prefix.getByName(this->prefix_name);
QHash<QString, QString> prefix_info = db_prefix.getByName(this->prefix_name);

sh_args << QString("WINEPREFIX='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("path")));
sh_args << QString("WINEPREFIX='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("path")));

if (!prefix_info.value("server").isEmpty()){
sh_args << QString("WINE='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("bin")));
if (!prefix_info.value("libs").isEmpty())
sh_args << QString("WINEDLLPATH='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("libs")));
sh_args << QString("WINELOADER='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("loader")));
sh_args << QString("WINESERVER='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("server")));
} else {
QString prefixDllPath;
Version vers;
vers.id_ = prefix_info.value("version_id");
if (vers.load()){
if (prefix_info.value("arch") == "win32"){
if (!prefix_info.value("server").isEmpty()){
sh_args << QString("WINE='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("bin")));
if (!prefix_info.value("libs").isEmpty())
sh_args << QString("WINEDLLPATH='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("libs")));
sh_args << QString("WINELOADER='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("loader")));
sh_args << QString("WINESERVER='%1'").arg(CoreLib->getStrictEscapeString(prefix_info.value("server")));
} else {
QString prefixDllPath;
Version vers;
vers.id_ = prefix_info.value("version_id");
if (vers.load()){
if (prefix_info.value("arch") == "win32"){
prefixDllPath = vers.wine_dllpath32_;
} else if (prefix_info.value("arch") == "win64"){
prefixDllPath = vers.wine_dllpath64_;
} else {
if (vers.wine_dllpath64_.isEmpty()){
prefixDllPath = vers.wine_dllpath32_;
} else if (prefix_info.value("arch") == "win64"){
prefixDllPath = vers.wine_dllpath64_;
} else {
if (vers.wine_dllpath64_.isEmpty()){
prefixDllPath = vers.wine_dllpath32_;
} else {
prefixDllPath = vers.wine_dllpath64_;
}
prefixDllPath = vers.wine_dllpath64_;
}
sh_args << QString("WINE='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_exec_));
if (!prefixDllPath.isEmpty())
sh_args << QString("WINEDLLPATH='%1'").arg(CoreLib->getStrictEscapeString(prefixDllPath));
sh_args << QString("WINELOADER='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_loader_));
sh_args << QString("WINESERVER='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_server_));
}
sh_args << QString("WINE='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_exec_));
if (!prefixDllPath.isEmpty())
sh_args << QString("WINEDLLPATH='%1'").arg(CoreLib->getStrictEscapeString(prefixDllPath));
sh_args << QString("WINELOADER='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_loader_));
sh_args << QString("WINESERVER='%1'").arg(CoreLib->getStrictEscapeString(vers.wine_server_));
}
}


if (!prefix_info.value("arch").isEmpty())
sh_args << QString("WINEARCH='%1'").arg(prefix_info.value("arch"));


sh_args.append(CoreLib->getWhichOut("sh"));
sh_args.append("-c");
sh_args.append(QString("\"%1 --no-isolate %2\"").arg(this->winetricks_bin).arg(item));

if (console_bin.split("/").last() == "konsole"){
args.append("/bin/sh");
args.append("-c");
}

args.append(sh_args.join(" "));

#ifdef DEBUG
qDebug()<<"[DD] winetricks args: "<<args;
#endif
if (!prefix_info.value("arch").isEmpty())
sh_args << QString("WINEARCH='%1'").arg(prefix_info.value("arch"));

QProcess proc;
proc.startDetached(console_bin, args, QDir::homePath());

return;
sh_args.append(CoreLib->getWhichOut("sh"));
sh_args.append("-c");
sh_args.append(QString("\"%1 --no-isolate %2\"").arg(this->winetricks_bin).arg(item));
return sh_args;
}

void winetricks::downloadwinetricks () {
Expand Down Expand Up @@ -313,6 +349,8 @@ bool winetricks::parse() {
file.close();
pd->setValue(10);

QStringList installed_apps = this->get_installed();

db_sysconfig.begin();

int all_verbs = metadata.size();
Expand All @@ -330,7 +368,7 @@ bool winetricks::parse() {
desc += " [downloadable]"; // TODO: "cached" flag
pd->setValue(90 * added_verb / all_verbs + 10);
pd->setLabelText(tr("Adding verb: %1").arg(name));
db_sysconfig.add_item(verb["name"], "application-x-ms-dos-executable", desc, verb["category"], D_PROVIDER_WINETRICKS);
db_sysconfig.add_item(verb["name"], "application-x-ms-dos-executable", desc, verb["category"], D_PROVIDER_WINETRICKS, installed_apps.contains(verb["name"]));
added_verb++;
QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents, 100);
}
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/winetricks.h
Expand Up @@ -50,7 +50,9 @@ class winetricks : public QWidget{
public:
explicit winetricks(QString prefix_name);
void run_winetricks(QString item);
QStringList get_installed();
void install_winetricks();
QStringList get_command(QString item);
bool parse();

private:
Expand Down
7 changes: 6 additions & 1 deletion src/q4wine-gui/widgets/prefixconfigwidget.cpp
Expand Up @@ -264,6 +264,7 @@ void PrefixConfigWidget::get_icons(){
this->listWidget.get()->clear();

QIcon defIcon = CoreLib->loadIcon("application-x-executable-script");
QIcon defIconInstalled = CoreLib->loadIcon("application-x-ms-dos-executable");

QList<SysconfigItem> items = db_sysconfig.getItems(this->provider, this->subtype, this->sort_order, this->searchField->text());
std::auto_ptr<QListWidgetItem> iconItem;
Expand Down Expand Up @@ -302,7 +303,11 @@ void PrefixConfigWidget::get_icons(){
} else {
iconItem->setText(items.at(i).name);
iconItem->setToolTip(items.at(i).desc);
iconItem->setIcon(defIcon);
if (items.at(i).is_installed) {
iconItem->setIcon(defIconInstalled);
} else {
iconItem->setIcon(defIcon);
}
}
iconItem.release();
}
Expand Down

0 comments on commit bb57dd4

Please sign in to comment.