From 10bb542e835c61118eca3c021a5616a07a2d0d3f Mon Sep 17 00:00:00 2001 From: Phenom Date: Tue, 1 Mar 2016 13:08:33 +0100 Subject: [PATCH] Allow only one instance for useLocalServer option activated. If exists, pass to it arguments. For now, only allow to pass RsCollection file and retroshare:// protocol. --- .../RedHat+Fedora/data/retroshare.desktop | 4 +- data/retroshare06.desktop | 3 +- libretroshare/src/retroshare/rsinit.h | 3 +- libretroshare/src/rsserver/rsinit.cc | 10 +- retroshare-gui/src/Info.plist | 48 +++ retroshare-gui/src/gui/MainWindow.cpp | 34 +++ retroshare-gui/src/gui/MainWindow.h | 5 +- .../src/gui/settings/GeneralPage.cpp | 91 +++--- .../src/gui/settings/GeneralPage.ui | 63 ++-- .../src/gui/settings/rsharesettings.cpp | 76 +++-- .../src/gui/settings/rsharesettings.h | 9 +- retroshare-gui/src/main.cpp | 40 +-- retroshare-gui/src/retroshare-gui.pro | 11 +- retroshare-gui/src/rsMacIcon.icns | Bin 0 -> 45783 bytes retroshare-gui/src/rshare.cpp | 281 ++++++++++++++---- retroshare-gui/src/rshare.h | 36 ++- retroshare-gui/src/util/EventReceiver.cpp | 173 ----------- retroshare-gui/src/util/EventReceiver.h | 60 ---- retroshare-gui/src/util/stringutil.cpp | 26 +- 19 files changed, 547 insertions(+), 426 deletions(-) create mode 100755 retroshare-gui/src/Info.plist create mode 100755 retroshare-gui/src/rsMacIcon.icns delete mode 100644 retroshare-gui/src/util/EventReceiver.cpp delete mode 100644 retroshare-gui/src/util/EventReceiver.h diff --git a/build_scripts/RedHat+Fedora/data/retroshare.desktop b/build_scripts/RedHat+Fedora/data/retroshare.desktop index 504ca9048..d5534f4d3 100644 --- a/build_scripts/RedHat+Fedora/data/retroshare.desktop +++ b/build_scripts/RedHat+Fedora/data/retroshare.desktop @@ -2,8 +2,10 @@ Version=1.0 Name=RetroShare06 Comment=Securely share files with your friends -Exec=/usr/bin/RetroShare06 +Exec=/usr/bin/RetroShare06 %U Icon=/usr/share/pixmaps/retroshare06.xpm Terminal=false Type=Application Categories=Network;P2P; +MimeType=x-scheme-handler/retroshare + diff --git a/data/retroshare06.desktop b/data/retroshare06.desktop index 2019a83c7..1df9783b2 100644 --- a/data/retroshare06.desktop +++ b/data/retroshare06.desktop @@ -3,9 +3,10 @@ Encoding=UTF-8 Version=1.0 Name=RetroShare06 Comment=Securely share files with your friends -Exec=/usr/bin/RetroShare06 +Exec=/usr/bin/RetroShare06 %U Icon=/usr/share/pixmaps/retroshare06.xpm Terminal=false Type=Application Categories=Application;Network; +MimeType=x-scheme-handler/retroshare diff --git a/libretroshare/src/retroshare/rsinit.h b/libretroshare/src/retroshare/rsinit.h index 9e5cd4bfc..1555be893 100644 --- a/libretroshare/src/retroshare/rsinit.h +++ b/libretroshare/src/retroshare/rsinit.h @@ -98,8 +98,7 @@ class RsInit * Post Login Options */ - static bool getStartMinimised() ; - static std::string getRetroShareLink(); + static bool getStartMinimised(); static int getSslPwdLen(); static bool getAutoLogin(); diff --git a/libretroshare/src/rsserver/rsinit.cc b/libretroshare/src/rsserver/rsinit.cc index 1b4b393ab..d064dabf9 100644 --- a/libretroshare/src/rsserver/rsinit.cc +++ b/libretroshare/src/rsserver/rsinit.cc @@ -128,8 +128,6 @@ class RsInitConfig std::string load_trustedpeer_file; bool udpListenerOnly; - - std::string RetroShareLink; }; static RsInitConfig *rsInitConfig = NULL; @@ -363,7 +361,8 @@ int RsInit::InitRetroShare(int argcIgnored, char **argvIgnored, bool strictCheck >> parameter('p',"port" ,rsInitConfig->port ,"port", "Set listenning port to use." ,false) >> parameter('c',"base-dir" ,opt_base_dir ,"directory", "Set base directory." ,false) >> parameter('U',"user-id" ,prefUserString ,"ID", "[User Name/GPG id/SSL id] Sets Account to Use, Useful when Autologin is enabled",false) - >> parameter('r',"link" ,rsInitConfig->RetroShareLink ,"retroshare://...", "Use a given Retroshare Link" ,false) + // by rshare 'r' "link" "Link" "Open RsLink with protocol retroshare://" + // by rshare 'f' "rsfile" "RsFile" "Open RsFile like RsCollection" #ifdef LOCALNET_TESTING >> parameter('R',"restrict-port" ,portRestrictions ,"port1-port2","Apply port restriction" ,false) #endif @@ -774,11 +773,6 @@ bool RsInit::getStartMinimised() return rsInitConfig->startMinimised; } -std::string RsInit::getRetroShareLink() -{ - return rsInitConfig->RetroShareLink; -} - int RsInit::getSslPwdLen(){ return SSLPWD_LEN; } diff --git a/retroshare-gui/src/Info.plist b/retroshare-gui/src/Info.plist new file mode 100755 index 000000000..72df6d774 --- /dev/null +++ b/retroshare-gui/src/Info.plist @@ -0,0 +1,48 @@ + + + + + NSPrincipalClass + NSApplication + CFBundleIconFile + rsMacIcon + CFBundlePackageType + APPL + CFBundleGetInfoString + RetroShare is a Free and Open Source cross-platform, Friend-2-Friends ans secure decentralised communication platform. + CFBundleSignature + ???? + CFBundleExecutable + RetroShare06 + CFBundleIdentifier + com.RetroShare06 + NSHighResolutionCapable + + CFBundleDocumentTypes + + + CFBundleTypeName + RetroShare Collection + CFBundleTypeExtensions + + rscollection + + CFBundleTypeRole + Viewer + + + NOTE + This file was generated by Qt/QMake. + CFBundleURLTypes + + + CFBundleURLName + RetroShare URL + CFBundleURLSchemes + + retroshare + + + + + diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 4a2a9d448..4fd1bebab 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -203,6 +203,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) } setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(Rshare::retroshareVersion(true)) + " - " + nameAndLocation); + connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList))); /* add url handler for RetroShare links */ QDesktopServices::setUrlHandler(RSLINK_SCHEME, this, "retroshareLinkActivated"); @@ -1095,6 +1096,12 @@ void MainWindow::doQuit() rApp->quit(); } +void MainWindow::receiveNewArgs(QStringList args) +{ + Rshare::parseArguments(args, false); + processLastArgs(); +} + void MainWindow::displayErrorMessage(int /*a*/,int /*b*/,const QString& error_msg) { QMessageBox::critical(NULL, tr("Internal Error"),error_msg) ; @@ -1433,6 +1440,33 @@ void MainWindow::retroshareLinkActivated(const QUrl &url) RetroShareLink::process(links); } +void MainWindow::openRsCollection(const QString &filename) +{ + QFileInfo qinfo(filename); + if (qinfo.exists()) { + if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { + RsCollectionFile collection; + collection.openColl(qinfo.absoluteFilePath()); + } + } +} + +void MainWindow::processLastArgs() +{ + while (!Rshare::links()->isEmpty()) { + std::cerr << "MainWindow::processLastArgs() : " << Rshare::links()->count() << std::endl; + /* Now use links from the command line, because no RetroShare was running */ + RetroShareLink link(Rshare::links()->takeFirst()); + if (link.valid()) { + retroshareLinkActivated(link.toUrl()); + } + } + while (!Rshare::files()->isEmpty()) { + /* Now use files from the command line, because no RetroShare was running */ + openRsCollection(Rshare::files()->takeFirst()); + } +} + //void MainWindow::servicePermission() //{ // ServicePermissionDialog::showYourself(); diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 897740123..b65d5992b 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -173,13 +173,16 @@ public: SysTrayStatus *sysTrayStatusInstance(); public slots: + void receiveNewArgs(QStringList args); void displayErrorMessage(int,int,const QString&) ; void postModDirectories(bool update_local); void displayDiskSpaceWarning(int loc,int size_limit_mb) ; void checkAndSetIdle(int idleTime); - void retroshareLinkActivated(const QUrl &url); void externalLinkActivated(const QUrl &url); + void retroshareLinkActivated(const QUrl &url); + void openRsCollection(const QString &filename); + void processLastArgs(); //! Go to a specific part of the control panel. void setNewPage(int page); void setCompactStatusMode(bool compact); diff --git a/retroshare-gui/src/gui/settings/GeneralPage.cpp b/retroshare-gui/src/gui/settings/GeneralPage.cpp index 3eea9c701..e3608e65c 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.cpp +++ b/retroshare-gui/src/gui/settings/GeneralPage.cpp @@ -49,18 +49,31 @@ GeneralPage::GeneralPage(QWidget * parent, Qt::WindowFlags flags) ui.chkRunRetroshareAtSystemStartupMinimized->setEnabled(false); #endif - if (Settings->canSetRetroShareProtocol() == false) { - ui.enableRetroShareProtocol->setEnabled(false); - } else { - ui.adminLabel->setEnabled(false); - ui.adminLabel->setToolTip(""); - } #else ui.chkRunRetroshareAtSystemStartup->setVisible(false); ui.chkRunRetroshareAtSystemStartupMinimized->setVisible(false); - ui.enableRetroShareProtocol->setVisible(false); + ui.registerRetroShareProtocol->setVisible(false); ui.adminLabel->setVisible(false); #endif + + if (Settings->canSetRetroShareProtocol()) { + ui.registerRetroShareProtocol->setEnabled(true); +#ifdef Q_OS_WIN + ui.adminLabel->setEnabled(true); + ui.adminLabel->setToolTip(tr("You have enough right.")); +#else + ui.desktopFileMissingLabel->setVisible(false); +#endif + } else { + ui.registerRetroShareProtocol->setEnabled(false); +#ifdef Q_OS_WIN + ui.adminLabel->setEnabled(false); + ui.adminLabel->setToolTip(tr("You don't have enough right. Run RetroShare as Admin to change this setting.")); +#else + ui.desktopFileMissingLabel->setVisible(true); +#endif + } + ui.useLocalServer->setEnabled(true); } /** Destructor */ @@ -75,42 +88,44 @@ void GeneralPage::runStartWizard() /** Saves the changes on this page */ bool GeneralPage::save(QString &/*errmsg*/) { - Settings->setStartMinimized(ui.checkStartMinimized->isChecked()); - Settings->setValue("doQuit", ui.checkQuit->isChecked()); - Settings->setCloseToTray(ui.checkCloseToTray->isChecked()); - #ifdef Q_OS_WIN - #ifndef QT_DEBUG Settings->setRunRetroshareOnBoot(ui.chkRunRetroshareAtSystemStartup->isChecked(), ui.chkRunRetroshareAtSystemStartupMinimized->isChecked()); #endif - - if (ui.enableRetroShareProtocol->isChecked() != Settings->getRetroShareProtocol()) { - if (Settings->setRetroShareProtocol(ui.enableRetroShareProtocol->isChecked()) == false) { - if (ui.enableRetroShareProtocol->isChecked()) { - QMessageBox::critical(this, tr("Error"), tr("Could not add retroshare:// as protocol.")); - } else { - QMessageBox::critical(this, tr("Error"), tr("Could not remove retroshare:// protocol.")); - } - } - } #endif - Settings->setMaxTimeBeforeIdle(ui.spinBox->value()); - - RsInit::setAutoLogin(ui.autoLogin->isChecked()); + Settings->setStartMinimized(ui.checkStartMinimized->isChecked()); if (ui.checkAdvanced->isChecked()) { - std::string opt("YES"); - rsConfig->setConfigurationOption(RS_CONFIG_ADVANCED, opt); + std::string opt("YES"); + rsConfig->setConfigurationOption(RS_CONFIG_ADVANCED, opt); } else { - std::string opt("NO"); - rsConfig->setConfigurationOption(RS_CONFIG_ADVANCED, opt); + std::string opt("NO"); + rsConfig->setConfigurationOption(RS_CONFIG_ADVANCED, opt); } + Settings->setValue("doQuit", ui.checkQuit->isChecked()); + Settings->setCloseToTray(ui.checkCloseToTray->isChecked()); + RsInit::setAutoLogin(ui.autoLogin->isChecked()); + + if (ui.registerRetroShareProtocol->isChecked() != Settings->getRetroShareProtocol()) { + QString error =""; + if (Settings->setRetroShareProtocol(ui.registerRetroShareProtocol->isChecked(), error) == false) { + if (ui.registerRetroShareProtocol->isChecked()) { + QMessageBox::critical(this, tr("Error"), tr("Could not add retroshare:// as protocol.").append("\n").append(error)); + } else { + QMessageBox::critical(this, tr("Error"), tr("Could not remove retroshare:// protocol.").append("\n").append(error)); + } + } + } + + Settings->setUseLocalServer(ui.useLocalServer->isChecked()); + + Settings->setMaxTimeBeforeIdle(ui.idleSpinBox->value()); + return true; } @@ -121,25 +136,23 @@ void GeneralPage::load() bool minimized; ui.chkRunRetroshareAtSystemStartup->setChecked(Settings->runRetroshareOnBoot(minimized)); ui.chkRunRetroshareAtSystemStartupMinimized->setChecked(minimized); - - ui.enableRetroShareProtocol->setChecked(Settings->getRetroShareProtocol()); #endif ui.checkStartMinimized->setChecked(Settings->getStartMinimized()); - ui.checkQuit->setChecked(Settings->value("doQuit", false).toBool()); - - ui.checkCloseToTray->setChecked(Settings->getCloseToTray()); - - ui.spinBox->setValue(Settings->getMaxTimeBeforeIdle()); - - ui.autoLogin->setChecked(RsInit::getAutoLogin()); bool advancedmode = false; std::string advsetting; if (rsConfig->getConfigurationOption(RS_CONFIG_ADVANCED, advsetting) && (advsetting == "YES")) { - advancedmode = true; + advancedmode = true; } ui.checkAdvanced->setChecked(advancedmode); + ui.checkQuit->setChecked(Settings->value("doQuit", false).toBool()); + ui.checkCloseToTray->setChecked(Settings->getCloseToTray()); + ui.autoLogin->setChecked(RsInit::getAutoLogin()); + ui.registerRetroShareProtocol->setChecked(Settings->getRetroShareProtocol()); + ui.useLocalServer->setChecked(Settings->getUseLocalServer()); + + ui.idleSpinBox->setValue(Settings->getMaxTimeBeforeIdle()); } diff --git a/retroshare-gui/src/gui/settings/GeneralPage.ui b/retroshare-gui/src/gui/settings/GeneralPage.ui index 11ce75905..c7f6aebff 100755 --- a/retroshare-gui/src/gui/settings/GeneralPage.ui +++ b/retroshare-gui/src/gui/settings/GeneralPage.ui @@ -10,13 +10,13 @@ 465 - + - + Startup - + 2 @@ -35,9 +35,9 @@ - + - + Qt::Horizontal @@ -65,11 +65,11 @@ - + For Advanced Users - + @@ -81,11 +81,11 @@ - + Misc - + 2 @@ -111,9 +111,9 @@ - + - + 0 @@ -121,7 +121,7 @@ - Register retroshare:// as URL protocol (Restart required) + Register retroshare:// as URL protocol @@ -143,24 +143,53 @@ + + + + When checked, this instance receives new parameters (like RsLink or RsFile) and avoid new one. + + + Use Local Server to get new arguments. + + + true + + + + + + + + 75 + true + + + + <html><head/><body><p>Install RetroShare with a package installer to get</p><p>/usr/share/applications/retroshare06.desktop</p></body></html> + + + !!!The RetroShare's desktop file is missing or wrong!!! + + + - + Idle - + - + Idle Time - + seconds @@ -176,7 +205,7 @@ - + Qt::Vertical diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index b7cf16f01..0dfc713f9 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -741,31 +741,47 @@ RshareSettings::setRunRetroshareOnBoot(bool run, bool minimized) #endif } -#if defined(Q_OS_WIN) static QString getAppPathForProtocol() { +#if defined(Q_OS_WIN) return "\"" + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + "\" -r \"%1\""; -} +#elif defined(Q_OS_LINUX) + return QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + " %U"; #endif +} /** Returns true if retroshare:// is registered as protocol */ bool RshareSettings::getRetroShareProtocol() { #if defined(Q_OS_WIN) /* Check key */ - QSettings retroshare("HKEY_CLASSES_ROOT\\retroshare", QSettings::NativeFormat); + QSettings retroshare("HKEY_CURRENT_USER\\Software\\Classes\\retroshare", QSettings::NativeFormat); if (retroshare.contains("Default")) { - /* Check profile */ - if (retroshare.value("Profile").toString().toStdString() == rsPeers->getOwnId().toStdString()) { + /* URL Protocol */ + if (retroshare.contains("URL Protocol")) { /* Check app path */ - QSettings command("HKEY_CLASSES_ROOT\\retroshare\\shell\\open\\command", QSettings::NativeFormat); + QSettings command("HKEY_CURRENT_USER\\Software\\Classes\\retroshare\\shell\\open\\command", QSettings::NativeFormat); if (command.value("Default").toString() == getAppPathForProtocol()) { return true; } } } +#elif defined(Q_OS_LINUX) + QFile desktop("/usr/share/applications/retroshare06.desktop"); + if (desktop.exists()) { + desktop.open(QIODevice::ReadOnly | QIODevice::Text); + QTextStream in(&desktop); + QStringList lines; + while(!in.atEnd()) { + lines << in.readLine(); + } + desktop.close(); + if (lines.contains("Exec=" + getAppPathForProtocol())) + if (lines.contains("MimeType=x-scheme-handler/retroshare")) + return true; + } #else - /* Platforms other than windows aren't supported yet */ + /* Platforms not supported yet */ #endif return false; } @@ -774,50 +790,72 @@ bool RshareSettings::getRetroShareProtocol() bool RshareSettings::canSetRetroShareProtocol() { #if defined(Q_OS_WIN) - QSettings retroshare("HKEY_CLASSES_ROOT\\retroshare", QSettings::NativeFormat); - return retroshare.isWritable(); + QSettings classRoot("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); + return classRoot.isWritable(); +#elif defined(Q_OS_LINUX) + return RshareSettings::getRetroShareProtocol(); #else return false; #endif } /** Register retroshare:// as protocol */ -bool RshareSettings::setRetroShareProtocol(bool value) +bool RshareSettings::setRetroShareProtocol(bool value, QString &error) { + error = ""; #if defined(Q_OS_WIN) if (value) { - QSettings retroshare("HKEY_CLASSES_ROOT\\retroshare", QSettings::NativeFormat); + QSettings retroshare("HKEY_CURRENT_USER\\Software\\Classes\\retroshare", QSettings::NativeFormat); retroshare.setValue("Default", "URL: RetroShare protocol"); QSettings::Status state = retroshare.status(); if (state == QSettings::AccessError) { + error = tr("Registry Access Error. Maybe you need Administrator right."); return false; } retroshare.setValue("URL Protocol", ""); - retroshare.setValue("Profile", QString::fromStdString(rsPeers->getOwnId().toStdString())); - QSettings command("HKEY_CLASSES_ROOT\\retroshare\\shell\\open\\command", QSettings::NativeFormat); + QSettings command("HKEY_CURRENT_USER\\Software\\Classes\\retroshare\\shell\\open\\command", QSettings::NativeFormat); command.setValue("Default", getAppPathForProtocol()); state = command.status(); } else { - QSettings retroshare("HKEY_CLASSES_ROOT", QSettings::NativeFormat); - retroshare.remove("retroshare"); + QSettings classRoot("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); + classRoot.remove("retroshare"); - QSettings::Status state = retroshare.status(); + QSettings::Status state = classRoot.status(); if (state == QSettings::AccessError) { + error = tr("Registry Access Error. Maybe you need Administrator right."); return false; } } return true; -#else - /* Platforms other than windows aren't supported yet */ +#elif defined(Q_OS_LINUX) + /* RetroShare protocol is always activated for Linux */ + Q_UNUSED(value); + return true; +#else + /* Platforms not supported yet */ Q_UNUSED(value); - return false; #endif } +/** Returns true if this instance have to run Local Server*/ +bool RshareSettings::getUseLocalServer() +{ + return value("UseLocalServer", true).toBool(); +} + +/** Sets whether to run Local Server */ +void RshareSettings::setUseLocalServer(bool value) +{ + if (value != getUseLocalServer()) { + setValue("UseLocalServer", value); + Rshare::updateLocalServer(); + } +} + /** Saving Generic Widget Size / Location */ void RshareSettings::saveWidgetInformation(QWidget *widget) diff --git a/retroshare-gui/src/gui/settings/rsharesettings.h b/retroshare-gui/src/gui/settings/rsharesettings.h index f22e89afd..52963ce92 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.h +++ b/retroshare-gui/src/gui/settings/rsharesettings.h @@ -155,8 +155,13 @@ public: bool canSetRetroShareProtocol(); /** Returns true if retroshare:// is registered as protocol */ bool getRetroShareProtocol(); - /** Register retroshare:// as protocl */ - bool setRetroShareProtocol(bool value); + /** Register retroshare:// as protocol */ + bool setRetroShareProtocol(bool value, QString &error); + + /** Returns true if this instance have to run Local Server*/ + bool getUseLocalServer(); + /** Sets whether to run Local Server */ + void setUseLocalServer(bool value); /* Get the destination log file. */ QString getLogFile(); diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index 20ee39561..2bb78ac5b 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -39,7 +39,6 @@ #include "gui/connect/ConfCertDialog.h" #include "idle/idle.h" #include "gui/common/Emoticons.h" -#include "util/EventReceiver.h" #include "gui/RetroShareLink.h" #include "gui/SoundManager.h" #include "gui/NetworkView.h" @@ -239,19 +238,9 @@ int main(int argc, char *argv[]) /* Setup The GUI Stuff */ Rshare rshare(args, argc, argv, - QString::fromUtf8(RsAccounts::ConfigDirectory().c_str())); - - std::string url = RsInit::getRetroShareLink(); - if (!url.empty()) { - /* start with RetroShare link */ - EventReceiver eventReceiver; - if (eventReceiver.sendRetroShareLink(QString::fromStdString(url))) { - return 0; - } - - /* Start RetroShare */ - } + QString::fromUtf8(RsAccounts::ConfigDirectory().c_str())); + /* Start RetroShare */ QSplashScreen splashScreen(QPixmap(":/images/logo/logo_splash.png")/* , Qt::WindowStaysOnTopHint*/); switch (initResult) { @@ -358,22 +347,7 @@ int main(int argc, char *argv[]) MainWindow *w = MainWindow::Create (); splashScreen.finish(w); - EventReceiver *eventReceiver = NULL; - if (Settings->getRetroShareProtocol()) { - /* Create event receiver */ - eventReceiver = new EventReceiver; - if (eventReceiver->start()) { - QObject::connect(eventReceiver, SIGNAL(linkReceived(const QUrl&)), w, SLOT(retroshareLinkActivated(const QUrl&))); - } - } - - if (!url.empty()) { - /* Now use link from the command line, because no RetroShare was running */ - RetroShareLink link(QString::fromStdString(url)); - if (link.valid()) { - w->retroshareLinkActivated(link.toUrl()); - } - } + w->processLastArgs(); // I'm using a signal to transfer the hashing info to the mainwindow, because Qt schedules signals properly to // avoid clashes between infos from threads. @@ -422,13 +396,7 @@ int main(int argc, char *argv[]) int ti = rshare.exec(); delete w ; - WebuiPage::checkShutdownWebui(); - - if (eventReceiver) { - /* Destroy event receiver */ - delete eventReceiver; - eventReceiver = NULL; - } + WebuiPage::checkShutdownWebui(); /* cleanup */ ChatDialog::cleanupChat(); diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 7d436eea4..f0df5b4e7 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -5,6 +5,7 @@ QT += network xml CONFIG += qt gui uic qrc resources idle bitdht CONFIG += link_prl TARGET = RetroShare06 +DEFINES += TARGET=\\\"$TARGET\\\" # Plz never commit the .pro with these flags enabled. # Use this flag when developping new features only. @@ -214,9 +215,13 @@ win32 { ##################################### MacOS ###################################### macx { - # ENABLE THIS OPTION FOR Univeral Binary BUILD. - #CONFIG += ppc x86 + # ENABLE THIS OPTION FOR Univeral Binary BUILD. + #CONFIG += ppc x86 #QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4 + QMAKE_INFO_PLIST = Info.plist + mac_icon.files = $$files($$PWD/rsMacIcon.icns) + mac_icon.path = Contents/Resources + QMAKE_BUNDLE_DATA += mac_icon CONFIG += version_detail_bash_script LIBS += -lssl -lcrypto -lz @@ -377,7 +382,6 @@ HEADERS += rshare.h \ util/PixmapMerging.h \ util/MouseEventFilter.h \ util/EventFilter.h \ - util/EventReceiver.h \ util/Widget.h \ util/RsAction.h \ util/RsUserdata.h \ @@ -727,7 +731,6 @@ SOURCES += main.cpp \ util/PixmapMerging.cpp \ util/MouseEventFilter.cpp \ util/EventFilter.cpp \ - util/EventReceiver.cpp \ util/Widget.cpp \ util/RsAction.cpp \ util/printpreview.cpp \ diff --git a/retroshare-gui/src/rsMacIcon.icns b/retroshare-gui/src/rsMacIcon.icns new file mode 100755 index 0000000000000000000000000000000000000000..df7a9aafd5dd29add8ad5fe3fb7f58630f510b04 GIT binary patch literal 45783 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 -#include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __APPLE__ +#include +#endif + #include +#include + +#include +#include +#include +#include +#include +#include #include #include #include -#include -#include "gui/settings/rsharesettings.h" -#include "gui/gxs/GxsIdDetails.h" #include "rshare.h" /* Available command-line arguments. */ -#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ -#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ +#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ +#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ #define ARG_GUISTYLESHEET "stylesheet" /**< Argument specfying GUI style. */ -#define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ -#define ARG_DATADIR "datadir" /**< Directory to use for data files. */ -#define ARG_LOGFILE "logfile" /**< Location of our logfile. */ -#define ARG_LOGLEVEL "loglevel" /**< Log verbosity. */ - +#define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ +#define ARG_DATADIR "datadir" /**< Directory to use for data files. */ +#define ARG_LOGFILE "logfile" /**< Location of our logfile. */ +#define ARG_LOGLEVEL "loglevel" /**< Log verbosity. */ +#define ARG_RSLINK_S "r" /**< Open RsLink with protocol retroshare:// */ +#define ARG_RSLINK_L "link" /**< Open RsLink with protocol retroshare:// */ +#define ARG_RSFILE_S "f" /**< Open RsFile with or without arg */ +#define ARG_RSFILE_L "rsfile" /**< Open RsFile with or without arg */ +//Other defined for server in /libretroshare/src/rsserver/rsinit.cc:351 /* Static member variables */ QMap Rshare::_args; /**< List of command-line arguments. */ QString Rshare::_style; /**< The current GUI style. */ -QString Rshare::_language; /**< The current language. */ QString Rshare::_stylesheet; /**< The current GUI stylesheet. */ +QString Rshare::_language; /**< The current language. */ QString Rshare::_dateformat; /**< The format of dates in feed items etc. */ -Log Rshare::_log; -bool Rshare::useConfigDir; -QString Rshare::configDir; +Log Rshare::_log; /**< Logs debugging messages to file or stdout. */ +QStringList Rshare::_links; /**< List of links passed by arguments. */ +QStringList Rshare::_files; /**< List of files passed by arguments. */ QDateTime Rshare::mStartupTime; +bool Rshare::useConfigDir; +QString Rshare::configDir; +QLocalServer* Rshare::localServer; /** Catches debugging messages from Qt and sends them to RetroShare's logs. If Qt * emits a QtFatalMsg, we will write the message to the log and then abort(). @@ -88,6 +104,10 @@ void qt_msg_handler(QtMsgType type, const char *msg) case QtFatalMsg: rError(QString("QtFatalMsg: %1").arg(msg)); break; +#if QT_VERSION >= QT_VERSION_CHECK (5, 5, 0) + case QtInfoMsg: + break; +#endif } if (type == QtFatalMsg) { rError("Fatal Qt error. Aborting."); @@ -102,6 +122,61 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) : QApplication(argc, argv) { mStartupTime = QDateTime::currentDateTime(); + localServer = NULL; + + //Initialize connection to LocalServer to know if other process runs. + { + QString serverName = QString(TARGET); + + if (args.isEmpty()) args.append("Empty"); + // load into shared memory + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + QDataStream out(&buffer); + out << args; + int size = buffer.size(); + + QSharedMemory newArgs; + newArgs.setKey(serverName + "_newArgs"); + if (newArgs.isAttached()) newArgs.detach(); + + if (!newArgs.create(size)) { + std::cerr << "(EE) Rshare::Rshare Unable to create shared memory segment of size:" + << size << " error:" << newArgs.errorString().toStdString() << "." << std::endl; +#ifdef Q_OS_UNIX + std::cerr << "Look with `ipcs -m` for nattch==0 segment. And remove it with `ipcrm -m 'shmid'`." << std::endl; + //No need for windows, as it removes shared segment directly even when crash. +#endif + newArgs.detach(); + ::exit(EXIT_FAILURE); + } + newArgs.lock(); + char *to = (char*)newArgs.data(); + const char *from = buffer.data().data(); + memcpy(to, from, qMin(newArgs.size(), size)); + newArgs.unlock(); + + // Connect to the Local Server of the main process to notify it + // that a new process had been started + QLocalSocket localSocket; + localSocket.connectToServer(QString(TARGET)); + + std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl; + if( localSocket.waitForConnected(100) ) + { + std::cerr << "Rshare::Rshare Connection etablished. Waiting for disconnection." << std::endl; + localSocket.waitForDisconnected(1000); + newArgs.detach(); + ::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function + } else { + newArgs.detach(); + // No main process exists + // So we start a Local Server to listen for connections from new process + localServer= new QLocalServer(); + QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); + updateLocalServer(); + } + } #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) qInstallMessageHandler(qt_msg_handler); @@ -172,6 +247,48 @@ Rshare::~Rshare() { /* Cleanup GxsIdDetails */ GxsIdDetails::cleanup(); + if (localServer) + { + localServer->close(); + delete localServer; + } +} + +/** + * @brief Executed when new instance connect command is sent to LocalServer + */ +void Rshare::slotConnectionEstablished() +{ + QLocalSocket *socket = localServer->nextPendingConnection(); + socket->close(); + delete socket; + + QSharedMemory newArgs; + newArgs.setKey(QString(TARGET) + "_newArgs"); + + if (!newArgs.attach()) + { + std::cerr << "(EE) Rshare::slotConnectionEstablished() Unable to attach to shared memory segment." + << newArgs.errorString().toStdString() << std::endl; + return; + } + + QBuffer buffer; + QDataStream in(&buffer); + QStringList args; + + newArgs.lock(); + buffer.setData((char*)newArgs.constData(), newArgs.size()); + buffer.open(QBuffer::ReadOnly); + in >> args; + newArgs.unlock(); + newArgs.detach(); + + emit newArgsReceived(args); + while (!args.empty()) + { + std::cerr << "Rshare::slotConnectionEstablished args:" << QString(args.takeFirst()).toStdString() << std::endl; + } } QString Rshare::retroshareVersion(bool withRevision) @@ -271,39 +388,62 @@ Rshare::showUsageMessageBox() bool Rshare::argNeedsValue(QString argName) { - return (argName == ARG_GUISTYLE || - argName == ARG_GUISTYLESHEET || - argName == ARG_LANGUAGE || - argName == ARG_DATADIR || - argName == ARG_LOGFILE || - argName == ARG_LOGLEVEL); - + return (argName == ARG_GUISTYLE || + argName == ARG_GUISTYLESHEET || + argName == ARG_LANGUAGE || + argName == ARG_DATADIR || + argName == ARG_LOGFILE || + argName == ARG_LOGLEVEL || + argName == ARG_RSLINK_S || + argName == ARG_RSLINK_L || + argName == ARG_RSFILE_S || + argName == ARG_RSFILE_L ); } /** Parses the list of command-line arguments for their argument names and * values. */ void -Rshare::parseArguments(QStringList args) +Rshare::parseArguments(QStringList args, bool firstRun) { - QString arg, value; + QString arg, value; - /* Loop through all command-line args/values and put them in a map */ - for (int i = 0; i < args.size(); ++i) { - /* Get the argument name and set a blank value */ - arg = args.at(i).toLower(); - value = ""; + /* Loop through all command-line args/values and put them in a map */ + for (int i = 0; i < args.size(); ++i) { + /* Get the argument name and set a blank value */ + arg = args.at(i);//.toLower(); Need Upper case for file name. + if (arg.toLower() == "empty") continue; + value = ""; - /* Check if it starts with a - or -- */ - if (arg.startsWith("-")) { - arg = arg.mid((arg.startsWith("--") ? 2 : 1)); - } - /* Check if it takes a value and there is one on the command-line */ - if (i < args.size()-1 && argNeedsValue(arg)) { - value = args.at(++i); - } - /* Place this arg/value in the map */ - _args.insert(arg, value); - } + /* Check if it starts with a - or -- */ + if (arg.startsWith("-")) { + arg = arg.mid((arg.startsWith("--") ? 2 : 1)); + /* Check if it takes a value and there is one on the command-line */ + if (i < args.size()-1 && argNeedsValue(arg.toLower())) { + value = args.at(++i); + } + } else { + /* Check if links or files without arg */ + if (arg.toLower().startsWith("retroshare://")) { + value = arg; + arg = ARG_RSLINK_L; + } else { + if (QFile(arg).exists()) { + value = arg; + arg = ARG_RSFILE_L; + } + } + } + + /* Don't send theses argument to _args map to allow multiple. */ + if (arg == ARG_RSLINK_S || arg == ARG_RSLINK_L) { + _links.append(value); + } else if (arg == ARG_RSFILE_S || arg == ARG_RSFILE_L) { + _files.append(value); + } else if (firstRun) { + /* Place this arg/value in the map only first time*/ + _args.insert(arg, value); + } + } } /** Verifies that all specified arguments were valid. */ @@ -660,6 +800,29 @@ Rshare::createShortcut(const QKeySequence &key, QWidget *sender, connect(s, SIGNAL(activated()), receiver, slot); } +#ifdef __APPLE__ +bool Rshare::event(QEvent *event) +{ + switch (event->type()) { + case QEvent::FileOpen:{ + QFileOpenEvent* fileOE = static_cast(event); + QStringList args; + if (! fileOE->file().isEmpty()) { + _files.append(fileOE->file()); + emit newArgsReceived(QStringList()); + return true; + } else if (! fileOE->url().isEmpty()) { + _links.append(fileOE->url().toString()); + emit newArgsReceived(QStringList()); + return true; + } + } + default: + return QApplication::event(event); + } +} +#endif + void Rshare::blinkTimer() { mBlink = !mBlink; @@ -706,3 +869,17 @@ bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin) return true; } + +bool Rshare::updateLocalServer() +{ + if (localServer) { + QString serverName = QString(TARGET); + if (Settings->getUseLocalServer()) { + localServer->removeServer(serverName); + localServer->listen(serverName); + return true; + } + localServer->close(); + } + return false; +} diff --git a/retroshare-gui/src/rshare.h b/retroshare-gui/src/rshare.h index 4e83b2299..cc982ba93 100644 --- a/retroshare-gui/src/rshare.h +++ b/retroshare-gui/src/rshare.h @@ -31,11 +31,13 @@ #endif #include +#include +#include #include #include -#include #include "util/log.h" + #include "retroshare/rstypes.h" /** Pointer to this RetroShare application instance. */ @@ -63,6 +65,8 @@ public: /** Return the map of command-line arguments and values. */ static QMap arguments() { return _args; } + /** Parse the list of command-line arguments. */ + static void parseArguments(QStringList args, bool firstRun = true); /** Validates that all arguments were well-formed. */ bool validateArguments(QString &errmsg); /** Prints usage information to the given text stream. */ @@ -89,8 +93,10 @@ public: static void getAvailableStyleSheets(QMap &styleSheets); /** Recalculates matching stylesheet for widget **/ static void refreshStyleSheet(QWidget *widget, bool processChildren); - + /** Load certificate */ static bool loadCertificate(const RsPeerId &accountId, bool autoLogin); + /** Start or Stop Local server to get new arguments depends setting */ + static bool updateLocalServer(); /** * Update Language, Style and StyleSheet. @@ -107,6 +113,10 @@ public: static QString style() { return _style; } /** Returns the current GUI stylesheet. */ static QString stylesheet() { return _stylesheet; } + /** Returns links passed by arguments. */ + static QStringList* links() { return &_links; } + /** Returns files passed by arguments. */ + static QStringList* files() {return &_files; } /** Returns Rshare's application startup time. */ static QDateTime startupTime(); @@ -131,7 +141,12 @@ public: * sender's context, receiver's slot will be called. */ static void createShortcut(const QKeySequence &key, QWidget *sender, QWidget *receiver, const char *slot); - + +#ifdef __APPLE__ + /**To process event from Mac system */ + bool event(QEvent *); +#endif + signals: /** Emitted when the application is running and the main event loop has * started. */ @@ -144,6 +159,8 @@ signals: void secondTick(); /** Global timer every minute */ void minuteTick(); + /** Emitted when other process is connected */ + void newArgsReceived(QStringList args); private slots: /** Called when the application's main event loop has started. This method @@ -151,27 +168,32 @@ private slots: * loop is running. */ void onEventLoopStarted(); void blinkTimer(); + /** + * @brief Called when accept new connection from new instance. + */ + void slotConnectionEstablished(); private: /** customize the date format (defaultlongformat) */ static void customizeDateFormat(); - /** Parse the list of command-line arguments. */ - void parseArguments(QStringList args); /** Returns true if the specified arguments wants a value. */ - bool argNeedsValue(QString argName); + static bool argNeedsValue(QString argName); static QMap _args; /**< List of command-line arguments. */ static QString _style; /**< The current GUI style. */ static QString _stylesheet; /**< The current GUI stylesheet. */ static QString _language; /**< The current language. */ static QString _dateformat; /**< The format for dates in feed items etc. */ - static Log _log; /**< Logs debugging messages to file or stdout. */ + static Log _log; /**< Logs debugging messages to file or stdout. */ + static QStringList _links; /**< List of links passed by arguments. */ + static QStringList _files; /**< List of files passed by arguments. */ static QDateTime mStartupTime; // startup time static bool useConfigDir; static QString configDir; bool mBlink; + static QLocalServer* localServer; }; #endif diff --git a/retroshare-gui/src/util/EventReceiver.cpp b/retroshare-gui/src/util/EventReceiver.cpp deleted file mode 100644 index 312610f35..000000000 --- a/retroshare-gui/src/util/EventReceiver.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************** - * RetroShare is distributed under the following license: - * - * Copyright (C) 2006, 2007 crypton - * - * 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 program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - ****************************************************************/ - -#include -#include -#include -#include - -#include - -#include "EventReceiver.h" -#include "gui/MainWindow.h" -#include "gui/RetroShareLink.h" - -#ifdef WINDOWS_SYS -#include -#define OP_RETROSHARELINK 12000 -#endif - -struct SharedMemoryInfo -{ -#ifdef WINDOWS_SYS - /* Store handle of the event window */ - WId wid; -#else - long dummy; -#endif -}; - -EventReceiver::EventReceiver() -{ -#ifdef WINDOWS_SYS - setWindowTitle("RetroShare EventReceiver"); -#endif - - /* Build unique name for the running instance */ - QString name = QString("RetroShare-%1::EventReceiver").arg(QCoreApplication::applicationDirPath()); - sharedMemory.setKey(name); -} - -EventReceiver::~EventReceiver() -{ - sharedMemory.detach(); -} - -bool EventReceiver::start() -{ - if (!sharedMemory.create(sizeof(SharedMemoryInfo))) { - std::cerr << "EventReceiver::start() Cannot create shared memory !" << sharedMemory.errorString().toStdString() << std::endl; - return false; - } - - bool result = true; - - if (sharedMemory.lock()) { - SharedMemoryInfo *info = (SharedMemoryInfo*) sharedMemory.data(); - if (info) { -#ifdef WINDOWS_SYS - info->wid = winId(); -#else - info->dummy = 0; -#endif - } else { - result = false; - std::cerr << "EventReceiver::start() Shared memory returns a NULL pointer!" << std::endl; - } - - sharedMemory.unlock(); - } else { - result = false; - std::cerr << "EventReceiver::start() Cannot lock shared memory !" << std::endl; - } - - return result; -} - -bool EventReceiver::sendRetroShareLink(const QString& link) -{ - if (!sharedMemory.attach()) { - /* No running instance found */ - return false; - } - - bool result = true; - - if (sharedMemory.lock()) { - SharedMemoryInfo *info = (SharedMemoryInfo*) sharedMemory.data(); - if (info) { -#ifdef WINDOWS_SYS - if (info->wid) { - QByteArray linkData(link.toUtf8()); - - COPYDATASTRUCT send; - send.dwData = OP_RETROSHARELINK; - send.cbData = link.length() * sizeof(char); - send.lpData = (void*) linkData.constData(); - - SendMessage((HWND) info->wid, WM_COPYDATA, (WPARAM) 0, (LPARAM) (PCOPYDATASTRUCT) &send); - } else { - result = false; - } -#else - Q_UNUSED(link); - - QMessageBox mb(QMessageBox::Critical, "RetroShare", QObject::tr("Start with a RetroShare link is only supported for Windows."), QMessageBox::Ok); - mb.exec(); - - result = false; -#endif - } else { - result = false; - std::cerr << "EventReceiver::sendRetroShareLink() Cannot lock shared memory !" << std::endl; - } - - sharedMemory.unlock(); - } else { - result = false; - std::cerr << "EventReceiver::start() Cannot lock shared memory !" << std::endl; - } - - sharedMemory.detach(); - - return result; -} - -#ifdef WINDOWS_SYS -bool EventReceiver::winEvent(MSG* message, long* result) -{ - if (message->message == WM_COPYDATA ) { - /* Extract the struct from lParam */ - COPYDATASTRUCT *data = (COPYDATASTRUCT*) message->lParam; - - if (data && data->dwData == OP_RETROSHARELINK) { - received(QString::fromUtf8((const char*) data->lpData, data->cbData)); - - /* Keep the event from Qt */ - *result = 0; - return true; - } - } - - /* Give the event to Qt */ - return false; -} -#endif - -void EventReceiver::received(const QString &url) -{ - RetroShareLink link(url); - if (link.valid()) { - MainWindow::raiseWindow(); - - emit linkReceived(link.toUrl()); - } -} diff --git a/retroshare-gui/src/util/EventReceiver.h b/retroshare-gui/src/util/EventReceiver.h deleted file mode 100644 index adf1b5d7b..000000000 --- a/retroshare-gui/src/util/EventReceiver.h +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************** - * RetroShare is distributed under the following license: - * - * Copyright (C) 2006,2007 crypton - * - * 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 program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - ****************************************************************/ - -#ifndef _EVENTRECEIVER_H -#define _EVENTRECEIVER_H - -#include -#include - -class QUrl; - -class EventReceiver : public -#ifdef WINDOWS_SYS - QWidget -#else - QObject -#endif -{ - Q_OBJECT - -public: - EventReceiver(); - ~EventReceiver(); - - bool start(); - bool sendRetroShareLink(const QString& link); - -signals: - void linkReceived(const QUrl& url); - -private: - void received(const QString& url); - -#ifdef WINDOWS_SYS - /* Extend QWidget with a class that will capture the WM_COPYDATA messages */ - bool winEvent (MSG* message, long* result); -#endif // WINDOWS_SYS - - QSharedMemory sharedMemory; -}; - -#endif diff --git a/retroshare-gui/src/util/stringutil.cpp b/retroshare-gui/src/util/stringutil.cpp index 5f14236ea..84df81bfa 100644 --- a/retroshare-gui/src/util/stringutil.cpp +++ b/retroshare-gui/src/util/stringutil.cpp @@ -1,7 +1,7 @@ /**************************************************************** - * This file is distributed under the following license: - * - * Copyright (c) 2008, crypton + * This file is distributed under the following license: + * + * Copyright (c) 2008, crypton * Copyright (c) 2008, Matt Edman, Justin Hipple * * This program is free software; you can redistribute it and/or @@ -28,6 +28,11 @@ #include "stringutil.h" +//#define CHAR_ARRAY_TO_STRINGLIST_DEBUG +#ifdef CHAR_ARRAY_TO_STRINGLIST_DEBUG +#include +#include +#endif /** Create a QStringList from the array of C-style strings. */ QStringList @@ -35,7 +40,20 @@ char_array_to_stringlist(char **arr, int len) { QStringList list; for (int i = 0; i < len; i++) { - list << QString(arr[i]); +#ifdef WINDOWS_SYS + list << QString::fromLatin1(arr[i]); +#else + list << QString::fromUtf8(arr[i]); +#endif + +#ifdef CHAR_ARRAY_TO_STRINGLIST_DEBUG + std::cerr << "arr[" << i << "]==" << arr[i] << std::endl; + if (QFile(arr[i]).exists()) std::cerr << "arr[i] File exists" << std::endl; + std::cerr << "QString UTF8==" << QString::fromUtf8(arr[i]).toStdString() << std::endl; + if (QFile(QString::fromUtf8(arr[i])).exists()) std::cerr << "QString UTF8 File exists" << std::endl; + std::cerr << "QString Latin1==" << QString::fromLatin1(arr[i]).toStdString() << std::endl; + if (QFile(QString::fromLatin1(arr[i])).exists()) std::cerr << "QString Latin1 File exists" << std::endl; +#endif } return list; }