bool MainWindow::createSocket(){ serverSoket.reset(new QLocalServer(this)); #ifdef DEBUG qDebug()<<"[ii] Creating Q4Wine socket"; #endif QString soketFile = QString("/tmp/q4wine-%1.sock").arg(getuid()); #ifdef DEBUG qDebug()<<"[ii] Socket file name:"<<soketFile; #endif if (QFile(soketFile).exists()){ QMessageBox msgBox; msgBox.setText(tr("Socket file \"%1\" already exists!").arg(soketFile)); msgBox.setInformativeText(tr("It seems that another instance of Q4Wine is running, or Q4Wine was shutdown incorrectly. Do you wish to remove the socket file?")); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Ok){ QFile(soketFile).remove(); } else { exit(255); } } if (!serverSoket->listen(soketFile)){ QTextStream QErr(stderr); QErr<<"[EE] Cannot create Q4Wine socket: "<<serverSoket->errorString()<<endl; exit(255); } connect (serverSoket.get(), SIGNAL(newConnection()), this, SLOT(newConnection())); return true; }
DataBase::DataBase(QObject * parent): QObject(parent){ QTextStream QErr(stderr); #ifdef DEBUG qDebug()<<"[ii] Init database engine"; qDebug()<<"[ii] Loading QSQLITE driver..."; #endif if (!QSqlDatabase::drivers().contains("QSQLITE")){ QErr<<"[EE] "<<tr("Critical error")<<" : "<<"Unable to load database SQLITE driver. You need to compile qt-sql with sqlite database support"<<endl; return; } QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); #ifdef DEBUG qDebug()<<"[ii] Loading database file: "<<QString("%1/.config/%2/db/generic.dat").arg(QDir::homePath()).arg(APP_SHORT_NAME); #endif db.setDatabaseName(QString("%1/.config/%2/db/generic.dat").arg(QDir::homePath()).arg(APP_SHORT_NAME)); if (!db.open()){ QErr<<"[EE] "<<tr("Critical error")<<" : "<<tr("Can not open database file: %1/.config/%2/db/generic.dat ; Error is: %3").arg(QDir::homePath()).arg(APP_SHORT_NAME).arg(db.lastError().text())<<endl; return; } return; }
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTextStream QErr(stderr); //! This is need for libq4wine-core.so import; typedef void *CoreLibPrototype (bool); CoreLibPrototype *CoreLibClassPointer; std::auto_ptr<corelib> CoreLib; QLibrary libq4wine; // Loading libq4wine-core.so #ifdef RELEASE libq4wine.setFileName(_CORELIB_PATH_); #else libq4wine.setFileName(QString("%1/q4wine-lib/libq4wine-core").arg(QString::fromUtf8(APP_BUILD))); #endif if (!libq4wine.load()){ libq4wine.load(); } // Getting corelib calss pointer CoreLibClassPointer = (CoreLibPrototype *) libq4wine.resolve("createCoreLib"); CoreLib.reset((corelib *)CoreLibClassPointer(false)); if (!CoreLib.get()){ QErr<<"[EE] Cannot load shared library."<<endl; return -1; } DataBase db; if (!db.checkDb()){ QErr<<"[EE] Cannot initialize database engine."<<endl; return -1; } QTranslator qtt; #ifdef RELEASE #ifdef _OS_DARWIN_ QString i18nPath = QString("%1/%2.app/Contents/i18n").arg(QDir::currentPath()).arg(APP_SHORT_NAME); #else QString i18nPath = QString("%1/share/%2/i18n").arg(QString::fromUtf8(APP_PREF)).arg(APP_SHORT_NAME); #endif #else QString i18nPath = QString("%1/i18n").arg(QString::fromUtf8(APP_BUILD)); #endif qtt.load(CoreLib->getTranslationLang(), i18nPath); app.installTranslator(&qtt); if (!CoreLib->isConfigured()){ QErr<<"[EE] App is not configured! Rerun wizard, or delete Q4Wine broken config files."<<endl; return -1; } QTextStream Qcout(stdout); WineObject wineObject; if (argc==1){ app.arguments().append("-h"); argc++; } for (int i=1; i<argc; i++){ qDebug()<<app.arguments().at(i); if ((app.arguments().at(1)=="--version") or (app.arguments().at(1)=="-v")){ Qcout<<QString("%1-helper %2").arg(APP_SHORT_NAME).arg(APP_VERS)<<endl; Qcout<<QString("Copyright (C) 2008-2016 by Alexey S. Malakhov <*****@*****.**>")<<endl; Qcout<<QString("License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.")<<endl; Qcout<<QObject::tr("This is free software: you are free to change and redistribute it.")<<endl; Qcout<<QObject::tr("There is NO WARRANTY, to the extent permitted by law.")<<endl; CoreLib->getBuildFlags(); Qcout<<QObject::tr("Author: %1.").arg("Alexey S. Malakhov")<<endl; return 0; } else if (app.arguments().at(i)=="--prefix"){ i++; if (i<argc) wineObject.setPrefix(app.arguments().at(i)); } else if (app.arguments().at(i)=="--wine-debug"){ i++; if (i<argc) wineObject.setProgramDebug(app.arguments().at(i)); } else if (app.arguments().at(i)=="--console"){ i++; if (i<argc) wineObject.setUseConsole(app.arguments().at(i).toInt()); } else if (app.arguments().at(i)=="--display"){ i++; if (i<argc) wineObject.setProgramDisplay(app.arguments().at(i)); } else if (app.arguments().at(i)=="--nice"){ i++; if (i<argc) wineObject.setProgramNice(app.arguments().at(i).toInt()); } else if (app.arguments().at(i)=="--desktop"){ i++; if (i<argc) wineObject.setProgramDesktop(app.arguments().at(i)); } else if (app.arguments().at(i)=="--program-bin") { i++; if (i<argc) wineObject.setProgramBinary(app.arguments().at(i)); } else if (app.arguments().at(i)=="--program-args") { i++; if (i<argc) wineObject.setProgramArgs(app.arguments().at(i)); } else if (app.arguments().at(i)=="--wrkdir") { i++; if (i<argc) wineObject.setProgramWrkdir(app.arguments().at(i)); } else if (app.arguments().at(i)=="--program-lang") { i++; if (i<argc) wineObject.setProgramLang(app.arguments().at(i)); } else if (app.arguments().at(i)=="--override") { i++; if (i<argc) wineObject.setProgramOverride(app.arguments().at(i)); } else if (app.arguments().at(i)=="--prerun") { i++; if (i<argc) wineObject.setPreRun(app.arguments().at(i)); } else if (app.arguments().at(i)=="--postrun") { i++; if (i<argc) wineObject.setPostRun(app.arguments().at(i)); } else { Qcout<<QObject::tr("Usage:")<<endl; Qcout<<QObject::tr(" %1-helper [KEYs]...").arg(APP_SHORT_NAME)<<endl; Qcout<<QObject::tr("Console utility for Q4Wine which helps to handle Wine application exit status and its stdout/stderr output logging.")<<endl<<endl; Qcout<<QObject::tr("KEYs list:")<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --prefix"<<QObject::tr("sets the current prefix name")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --wine-debug"<<QObject::tr("sets WINEDEBUG variable")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --console"<<QObject::tr("run with output in console")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --display"<<QObject::tr("sets DISPLAY variable")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --nice"<<QObject::tr("sets program niceness")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --desktop"<<QObject::tr("sets program virtual desktop resolution")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --program-bin"<<QObject::tr("sets program binary")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --program-args"<<QObject::tr("sets program args")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --wrkdir"<<QObject::tr("sets program working directory")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --program-lang"<<QObject::tr("sets program LANG variable")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --override"<<QObject::tr("sets WINEDLLOVERRIDES variable")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --prerun"<<QObject::tr("execute script before program run")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" --postrun"<<QObject::tr("execute script after program run")<<qSetFieldWidth(0)<<endl; Qcout<<endl; Qcout<<QObject::tr("Report %1 bugs to %2").arg(APP_SHORT_NAME).arg(APP_BUG_EMAIL)<<endl; Qcout<<QObject::tr("%1 homepage: <%2>").arg(APP_SHORT_NAME).arg(APP_WEBSITE)<<endl; Qcout<<QObject::tr("General help using GNU software: <http://www.gnu.org/gethelp/>")<<endl; return 0; } } return wineObject.run(); }
int WineObject::runSys(){ if (!this->useConsole){ int ret = this->runScript(this->prerun_script); if ( ret != 0){ return 255; } } QString env = this->createEnvString(); QString stdout, app_stdout; QTextCodec *codec = QTextCodec::codecForName(CoreLib->getLocale().toAscii()); FILE *fp; int status; char path[PATH_MAX]; QString run_string=this->prefixRunString; /* * We need to trim wrk dir path from binary path */ this->programBinary = this->programBinary.replace(this->programWrkDir, "").replace("/", ""); if (this->useConsole){ // If we gona use console output, so exec program is program specificed at CONSOLE global variable run_string.replace("%CONSOLE_BIN%", CoreLib->getSetting("console", "bin").toString()); run_string.replace("%CONSOLE_ARGS%", CoreLib->getSetting("console", "args", false).toString()); } else { run_string.replace("%CONSOLE_BIN%", ""); run_string.replace("%CONSOLE_ARGS%", ""); } if (!env.isEmpty()){ run_string.replace("%ENV_BIN%", "env"); run_string.replace("%ENV_ARGS%", env); } else { run_string.replace("%ENV_BIN%", ""); run_string.replace("%ENV_ARGS%", ""); } if (!this->programWrkDir.isEmpty()){ run_string.replace("%WORK_DIR%", QString("cd \'%1\' &&").arg(this->programWrkDir)); } else { run_string.replace("%WORK_DIR%", ""); } if (this->programNice != 0){ run_string.replace("%SET_NICE%", QString("%1 -n %2").arg(CoreLib->getSetting("system", "nice", false).toString()).arg(this->programNice)); } else { run_string.replace("%SET_NICE%", ""); } if (this->programBinary=="wineserver"){ run_string.replace("%WINE_BIN%", QString(" '%1server' ").arg(this->prefixBinary)); } else { run_string.replace("%WINE_BIN%", QString(" '%1' ").arg(this->prefixBinary)); } if (!this->programDesktop.isEmpty()){ QString deskname = this->programBinaryName; deskname.replace(" ", "."); deskname.replace("&", "."); deskname.replace("!", "."); deskname.replace("$", "."); deskname.replace("*", "."); deskname.replace("(", "."); deskname.replace(")", "."); deskname.replace("[", "."); deskname.replace("]", "."); deskname.replace(";", "."); deskname.replace("'", "."); deskname.replace("\"", "."); deskname.replace("|", "."); deskname.replace("`", "."); deskname.replace("\\", "."); deskname.replace("/", "."); deskname.replace(">", "."); deskname.replace("<", "."); run_string.replace("%VIRTUAL_DESKTOP%", QString(" explorer.exe /desktop=%1,%2 ").arg(deskname).arg(this->programDesktop)); } else { run_string.replace("%VIRTUAL_DESKTOP%", ""); } if (this->programBinary=="wineserver"){ run_string.replace("%PROGRAM_BIN%", ""); run_string.replace("%PROGRAM_ARGS%", programArgs); } else { run_string.replace("%PROGRAM_BIN%", QString("\'%1\'").arg(this->programBinary)); run_string.replace("%PROGRAM_ARGS%", programArgs); } #ifdef DEBUG qDebug()<<"Template string: "<<this->prefixRunString; qDebug()<<"Exec string : "<<run_string; #endif stdout.append("Exec string:"); fp = popen(codec->fromUnicode(run_string).data(), "r"); if (fp == NULL){ this->sendMessage(QString("error/%1/%2").arg(this->programBinaryName).arg(this->prefixName)); } else { if (this->useConsole){ this->sendMessage(QString("console/%1/%2").arg(this->programBinaryName).arg(this->prefixName)); } else { this->sendMessage(QString("start/%1/%2").arg(this->programBinaryName).arg(this->prefixName)); } stdout.append("\n"); stdout.append(run_string.trimmed()); stdout.append("\n"); } /* Handle error */; while (fgets(path, PATH_MAX, fp) != NULL){ app_stdout.append(codec->toUnicode(path)); } status = pclose(fp); if (!this->useConsole){ int ret = this->runScript(this->postrun_script); if (ret != 0) return ret; } stdout.append("Exit code:"); stdout.append("\n"); stdout.append(QString("%1").arg(status)); stdout.append("\n"); stdout.append("App STDOUT and STDERR output:"); stdout.append("\n"); stdout.append(app_stdout); if (!this->useConsole){ if (logEnabled){ uint date = QDateTime::currentDateTime ().toTime_t(); db_logging.addLogRecord(this->prefixId, this->programBinaryName, status, stdout, date); } this->sendMessage(QString("finish/%1/%2/%3").arg(this->programBinaryName).arg(this->prefixName).arg(status)); } else { if (status!=0){ if (this->logEnabled){ uint date = QDateTime::currentDateTime ().toTime_t(); db_logging.addLogRecord(this->prefixId, this->programBinaryName, status, stdout, date); } this->sendMessage(QString("console_error/%1/%2").arg(this->programBinaryName).arg(this->prefixName)); } } if (status>0){ QTextStream QErr(stderr); QErr<<stdout; status=-1; } return status; }
int main(int argc, char *argv[]) { QtSingleApplication app(argc, argv); QTextStream QErr(stderr); QString exec_binary; if (app.arguments().count()>2){ if ((app.arguments().at(1)=="--binary") or (app.arguments().at(1)=="-b")){ exec_binary = app.arguments().at(2); if (app.sendMessage(exec_binary)) return 0; } } if (app.sendMessage("")) return 0; //! This is need for libq4wine-core.so import; typedef void *CoreLibPrototype (bool); CoreLibPrototype *CoreLibClassPointer; std::auto_ptr<corelib> CoreLib; QLibrary libq4wine; // Loading libq4wine-core.so libq4wine.setFileName("libq4wine-core"); if (!libq4wine.load()){ libq4wine.load(); } // Getting corelib calss pointer CoreLibClassPointer = (CoreLibPrototype *) libq4wine.resolve("createCoreLib"); CoreLib.reset((corelib *)CoreLibClassPointer(true)); if (!CoreLib.get()){ QErr<<"[EE] Can't load shared library."<<endl; return -1; } QTranslator qtt; #ifdef RELEASE QString i18nPath = QString("%1/share/%2/i18n").arg(APP_PREF).arg(APP_SHORT_NAME); #else QString i18nPath = QString("%1/i18n").arg(APP_BUILD); #endif qtt.load(CoreLib->getTranslationLang(), i18nPath); app.installTranslator(&qtt); if (!CoreLib->checkDirs()){ return -1; } DataBase db; if (!db.checkDb()){ QErr<<"[EE] Can't init database engine."<<endl; return -1; } if (!CoreLib->isConfigured()){ Wizard firstSetupWizard(1); if (firstSetupWizard.exec()==QDialog::Rejected){ QErr<<"[EE] App not configured! Re run wizard, or delete q4wine broken config files."<<endl; return -1; } } QTextStream Qcout(stdout); int result, startState=0; if (app.arguments().count()>1){ if ((app.arguments().at(1)=="--version") or (app.arguments().at(1)=="-v")){ Qcout<<QString("%1 %2").arg(APP_SHORT_NAME).arg(APP_VERS)<<endl; Qcout<<QString("(Copyright (C) 2008-2009, brezblock core team.")<<endl; Qcout<<QString("License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.")<<endl; Qcout<<QObject::tr("This is free software: you are free to change and redistribute it.")<<endl; Qcout<<QObject::tr("There is NO WARRANTY, to the extent permitted by law.")<<endl; CoreLib->getBuildFlags(); Qcout<<QObject::tr("Author: %1.").arg("Malakhov Alexey aka John Brezerk")<<endl; return 0; } else if ((app.arguments().at(1)=="--minimize") or (app.arguments().at(1)=="-m")) { startState = 1; } else if ((app.arguments().at(1)=="--binary") or (app.arguments().at(1)=="-b")) { //startState = 1; } else { Qcout<<QObject::tr("Usage:")<<endl; Qcout<<QString(" %1 -b <unix_path_to_windown_binary>").arg(APP_SHORT_NAME)<<endl; Qcout<<QObject::tr(" %1 [KEY]...").arg(APP_SHORT_NAME)<<endl; Qcout<<QObject::tr("GUI utility for wine applications and prefixes management.")<<endl<<endl; Qcout<<QObject::tr("KEYs list:")<<endl; Qcout<<qSetFieldWidth(25)<<left<<" -h, --help"<<QObject::tr("display this help and exit")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" -v, --version"<<QObject::tr("output version information and exit")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" -b, --binary"<<QObject::tr("Open q4wine run dialog for windows binary")<<qSetFieldWidth(0)<<endl; Qcout<<qSetFieldWidth(25)<<left<<" -m, --minimize"<<QObject::tr("minimize %1 main window on startup").arg(APP_SHORT_NAME)<<qSetFieldWidth(0)<<endl; Qcout<<endl; Qcout<<QObject::tr("Report %1 bugs to %2").arg(APP_SHORT_NAME).arg(APP_BUG_EMAIL)<<endl; Qcout<<QObject::tr("%1 homepage: <%2>").arg(APP_SHORT_NAME).arg(APP_WEBSITTE)<<endl; Qcout<<QObject::tr("General help using GNU software: <http://www.gnu.org/gethelp/>")<<endl; return 0; } } MainWindow mainWin(startState, exec_binary); app.setActivationWindow(&mainWin); QObject::connect(&app, SIGNAL(messageReceived(const QString&)), &mainWin, SLOT(messageReceived(const QString&))); result = app.exec(); db.close(); return result; }
bool DataBase::checkDb(){ /* * Checking database tables. * If not exists, we try to create them. */ QTextStream QErr(stderr); QStringList tables; tables << "prefix" << "dir" << "icon" << "images" << "last_run_icon" << "logging" << "providers" << "sysconfig"; QSqlDatabase db = QSqlDatabase::database(); if (!db.isValid()){ QErr<<"[EE] "<<tr("No database loaded. Aborting..."); return false; } QSqlQuery query; for (int i=0; i<tables.size(); ++i){ QString table=tables.at(i); #ifdef DEBUG qDebug()<<"[ii] Check for table: "<<table; #endif if (db.record(table).isEmpty()){ if (table == "prefix"){ if(!query.exec("CREATE TABLE prefix (wine_dllpath TEXT, wine_loader TEXT, wine_server TEXT, wine_exec TEXT, cdrom_mount TEXT, id INTEGER PRIMARY KEY, name TEXT, path TEXT, version TEXT);")) return false; // Creating default prefix reccord query.prepare("INSERT INTO prefix(id, name) VALUES(NULL, :name);"); query.bindValue(":name", "Default"); if (!query.exec()) return false; query.clear(); } else if (table == "dir"){ if(!query.exec("CREATE TABLE dir (id INTEGER PRIMARY KEY, name TEXT, prefix_id NUMERIC);")) return false; } else if (table == "icon"){ if(!query.exec("CREATE TABLE icon (wrkdir TEXT, override TEXT, winedebug TEXT, useconsole NUMERIC, display TEXT, cmdargs TEXT, exec TEXT, icon_path TEXT, desc TEXT, desktop TEXT, nice TEXT, dir_id NUMERIC, id INTEGER PRIMARY KEY, name TEXT, prefix_id NUMERIC);")) return false; } else if (table == "images"){ if(!query.exec("CREATE TABLE images (id INTEGER PRIMARY KEY, name TEXT, path TEXT);")) return false; } else if (table == "last_run_icon"){ if(!query.exec("CREATE TABLE last_run_icon (wrkdir TEXT, override TEXT, winedebug TEXT, useconsole NUMERIC, display TEXT, cmdargs TEXT, exec TEXT, desktop TEXT, nice TEXT, id INTEGER PRIMARY KEY);")) return false; } else if (table == "logging"){ if(!query.exec("CREATE TABLE logging (id INTEGER PRIMARY KEY, name TEXT, exit NUMERIC, stdout TEXT, prefix_id NUMERIC, date NUMERIC);")) return false; } else if (table == "providers"){ if(!query.exec("CREATE TABLE providers (id INTEGER PRIMARY KEY, name TEXT, icon TEXT);")) return false; query.prepare("INSERT INTO providers(id, name, icon) VALUES(NULL, :name, :icon);"); query.bindValue(":name", "System"); query.bindValue(":icon", "wine.png"); if (!query.exec()) return false; query.bindValue(":name", "Winetricks"); query.bindValue(":icon", "regedit.png"); if (!query.exec()) return false; } else if (table == "sysconfig"){ if(!query.exec("CREATE TABLE sysconfig (id INTEGER PRIMARY KEY, name TEXT, type TEXT, icon TEXT, desc TEXT, provider_id INTEGER);")) return false; // System items query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, NULL, :desc, 1);"); query.bindValue(":name", "%CREATE_FAKE%"); query.bindValue(":icon", "fakedrive-new.png"); query.bindValue(":desc", "%CREATE_FAKE_DESC%"); if (!query.exec()) return false; query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, NULL, :desc, 1);"); query.bindValue(":name", "%UPDATE_FAKE%"); query.bindValue(":icon", "fakedrive-update.png"); query.bindValue(":desc", "%UPDATE_FAKE_DESC%"); if (!query.exec()) return false; // Wintricks base query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, NULL, :desc, 2);"); query.bindValue(":name", "%INSTALL_WINETRICKS%"); query.bindValue(":icon", "winetricks-install.png"); query.bindValue(":desc", "%UPDATE_WINETRICKS_DESC%"); if (!query.exec()) return false; query.prepare("INSERT INTO sysconfig(id, name, icon, type, desc, provider_id) VALUES(NULL, :name, :icon, NULL, :desc, 2);"); query.bindValue(":name", "%REFRESH_WINETRICKS%"); query.bindValue(":icon", "folder-downloads.png"); query.bindValue(":desc", "%REFRESH_WINETRICKS_DESC%"); if (!query.exec()) return false; } } } return fixup(); }