mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-02 18:44:53 -05:00
Merge pull request #2844 from csoler/v0.6-Params2
Cleaned up command line parameter handling (to be used with #143)
This commit is contained in:
commit
80a5705aea
@ -142,7 +142,7 @@ void AboutWidget::updateTitle()
|
||||
{
|
||||
if (tWidget == NULL)
|
||||
{
|
||||
setWindowTitle(QString("%1 %2").arg(tr("About RetroShare"), Rshare::retroshareVersion(true)));
|
||||
setWindowTitle(QString("%1 %2").arg(tr("About RetroShare"), RsApplication::retroshareVersion(true)));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -228,7 +228,7 @@ void AWidget::initImages()
|
||||
#ifdef RS_ONLYHIDDENNODE
|
||||
p.drawText(QPointF(10, 50), QString("%1 : %2 (With embedded Tor)").arg(tr("Retroshare version"), Rshare::retroshareVersion(true)));
|
||||
#else
|
||||
p.drawText(QPointF(10, 50), QString("%1 : %2").arg(tr("Retroshare version"), Rshare::retroshareVersion(true)));
|
||||
p.drawText(QPointF(10, 50), QString("%1 : %2").arg(tr("Retroshare version"), RsApplication::retroshareVersion(true)));
|
||||
#endif
|
||||
|
||||
/* Draw Qt's version number */
|
||||
@ -936,7 +936,7 @@ void AboutWidget::on_copy_button_clicked()
|
||||
{
|
||||
QString verInfo;
|
||||
QString rsVerString = "RetroShare Version: ";
|
||||
rsVerString+=Rshare::retroshareVersion(true);
|
||||
rsVerString+=RsApplication::retroshareVersion(true);
|
||||
verInfo+=rsVerString;
|
||||
#ifdef RS_ONLYHIDDENNODE
|
||||
verInfo+=" " + tr("Only Hidden Node");
|
||||
|
@ -325,7 +325,7 @@ void SearchDialog::checkText(const QString& txt)
|
||||
ui.searchButton->setDisabled(txt.length() < 3);
|
||||
ui.searchLineFrame->setProperty("valid", (txt.length() >= 3));
|
||||
ui.searchLineFrame->style()->unpolish(ui.searchLineFrame);
|
||||
Rshare::refreshStyleSheet(ui.searchLineFrame, false);
|
||||
RsApplication::refreshStyleSheet(ui.searchLineFrame, false);
|
||||
}
|
||||
|
||||
void SearchDialog::initialiseFileTypeMappings()
|
||||
|
@ -251,7 +251,7 @@ void GenCertDialog::initKeyList()
|
||||
|
||||
void GenCertDialog::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
std::cerr << "Mouse : " << e->x() << ", " << e->y() << std::endl;
|
||||
//std::cerr << "Mouse : " << e->x() << ", " << e->y() << std::endl;
|
||||
|
||||
QDialog::mouseMoveEvent(e) ;
|
||||
}
|
||||
@ -649,7 +649,7 @@ void GenCertDialog::genPerson()
|
||||
{
|
||||
/* complete the process */
|
||||
RsInit::LoadPassword(sslPasswd);
|
||||
if (Rshare::loadCertificate(sslId, false)) {
|
||||
if (RsApplication::loadCertificate(sslId, false)) {
|
||||
|
||||
// Normally we should clear the cached passphrase as soon as possible. However,some other GUI components may still need it at start.
|
||||
// (csoler) This is really bad: we have to guess that 30 secs will be enough. I have no better way to do this.
|
||||
|
@ -421,7 +421,7 @@ void GetStartedDialog::emailSupport()
|
||||
sysVersion = "Linux";
|
||||
#endif
|
||||
#endif
|
||||
text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(Rshare::retroshareVersion(true)
|
||||
text += QString("My RetroShare Configuration is: (%1, %2, %3)").arg(RsApplication::retroshareVersion(true)
|
||||
, sysVersion
|
||||
).arg(static_cast<typename std::underlying_type<RsConfigUserLvl>::type>(userLevel)) + "\n";
|
||||
text += "\n";
|
||||
|
@ -80,7 +80,7 @@ HelpDialog::HelpDialog(QWidget *parent) :
|
||||
ui->thanks->setHtml(in.readAll());
|
||||
}
|
||||
|
||||
ui->version->setText(Rshare::retroshareVersion(true));
|
||||
ui->version->setText(RsApplication::retroshareVersion(true));
|
||||
|
||||
/* Add version numbers of libretroshare */
|
||||
std::list<RsLibraryInfo> libraries;
|
||||
|
@ -703,7 +703,7 @@ void IdEditDialog::updateInterface()
|
||||
const QPixmap *pixmap = ui->avatarLabel->pixmap();
|
||||
if (pixmap && !pixmap->isNull()) {
|
||||
ui->removeButton->setEnabled(true);
|
||||
} else if (mEditGroup.mImage.mSize != NULL) {
|
||||
} else if (mEditGroup.mImage.mSize > 0) {
|
||||
ui->removeButton->setEnabled(true);
|
||||
} else {
|
||||
ui->removeButton->setEnabled(false);
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include <retroshare/rsplugin.h>
|
||||
#include <retroshare/rsconfig.h>
|
||||
#include <util/argstream.h>
|
||||
|
||||
#if defined(Q_OS_DARWIN)
|
||||
#include "gui/common/MacDockIconHandler.h"
|
||||
@ -211,7 +212,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags)
|
||||
hiddenmode = true;
|
||||
}
|
||||
|
||||
setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(Rshare::retroshareVersion(true)) + " - " + nameAndLocation);
|
||||
setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(RsApplication::retroshareVersion(true)) + " - " + nameAndLocation);
|
||||
connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList)));
|
||||
|
||||
/* add url handler for RetroShare links */
|
||||
@ -1253,10 +1254,91 @@ void MainWindow::doQuit()
|
||||
rApp->quit();
|
||||
}
|
||||
|
||||
// This method parses arguments passed by the operating system. All arguments
|
||||
// except -r, -f, -o and lists of rscollection files and rslinks are discarded.
|
||||
//
|
||||
void MainWindow::receiveNewArgs(QStringList args)
|
||||
{
|
||||
Rshare::parseArguments(args, false);
|
||||
processLastArgs();
|
||||
RsInfo() << "Received new arguments from operating system call.";
|
||||
|
||||
std::string argstring = RsApplication::applicationFilePath().toStdString() ;
|
||||
|
||||
for(auto l:args)
|
||||
argstring += " " + l.toStdString();
|
||||
|
||||
// This class does all the job at once: validate arguments, and parses them.
|
||||
|
||||
std::vector<std::string> links_and_files;
|
||||
|
||||
argstream as(argstring.c_str());
|
||||
|
||||
QString omValues = QString(";full;noturtle;gaming;minimal;");
|
||||
std::string opModeStr;
|
||||
std::string retroshare_link_url;
|
||||
std::string rscollection_file;
|
||||
|
||||
as >> parameter('r',"rslink",retroshare_link_url,"Retroshare:// link","Retroshare link to open in Downloads " ,false)
|
||||
>> parameter('f',"rsfile",rscollection_file,"file","File to open " ,false)
|
||||
>> parameter('o',"opmode",opModeStr,"opmode","Set mode (Full, NoTurtle, Gaming, Minimal) " ,false)
|
||||
>> values<std::string>(back_inserter(links_and_files),"links and files");
|
||||
|
||||
if(!as.isOk())
|
||||
{
|
||||
RsErr() << "Error while parsing arguments:" ;
|
||||
RsErr() << as.errorLog() ;
|
||||
return;
|
||||
}
|
||||
if(!opModeStr.empty() && omValues.contains(";"+QString::fromStdString(opModeStr).toLower()+";"))
|
||||
{
|
||||
QString opmode = QString::fromStdString(opModeStr).toLower();
|
||||
//RsApplication::setOpMode(opModeStr.toLower()); // Do we need this??
|
||||
|
||||
RsInfo() << "Setting new operating mode to \"" << opmode.toStdString() << "\"";
|
||||
|
||||
if (opmode == "noturtle")
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::NOTURTLE) - 1);
|
||||
else if (opmode == "gaming")
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::GAMING) - 1);
|
||||
else if (opmode == "minimal")
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::MINIMAL) - 1);
|
||||
else if (opmode != "")
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::FULL) - 1);
|
||||
|
||||
opModeStatus->setOpMode();
|
||||
}
|
||||
|
||||
// Sort all collected arguments into rscollection files and retroshare links, accordingly
|
||||
|
||||
QStringList rscollection_files;
|
||||
QList<RetroShareLink> rslinks;
|
||||
|
||||
auto sort = [&](const QString s) {
|
||||
|
||||
if(QFile(s).exists() && s.endsWith(".rscollection"))
|
||||
rscollection_files.append(QString::fromUtf8(rscollection_file.c_str()));
|
||||
else if(s.startsWith("retroshare://"))
|
||||
{
|
||||
RetroShareLink link(s);
|
||||
|
||||
if(link.valid())
|
||||
rslinks.push_back(link);
|
||||
}
|
||||
};
|
||||
|
||||
sort(QString::fromUtf8(rscollection_file.c_str()));
|
||||
sort(QString::fromUtf8(retroshare_link_url.c_str()));
|
||||
|
||||
for(auto s:links_and_files)
|
||||
sort(QString::fromUtf8(s.c_str()));
|
||||
|
||||
// Now handle links and rscollection files.
|
||||
|
||||
for(auto file:rscollection_files)
|
||||
if(file.endsWith(".rscollection"))
|
||||
openRsCollection(file);
|
||||
|
||||
for(auto link:rslinks)
|
||||
retroshareLinkActivated(link.toUrl());
|
||||
}
|
||||
|
||||
void MainWindow::displayErrorMessage(int /*a*/,int /*b*/,const QString& error_msg)
|
||||
@ -1626,42 +1708,16 @@ void MainWindow::openRsCollection(const QString &filename)
|
||||
if (qinfo.exists()) {
|
||||
if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) {
|
||||
RsCollection collection;
|
||||
collection.openColl(qinfo.absoluteFilePath());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::processLastArgs()
|
||||
if(!collection.load(filename))
|
||||
{
|
||||
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());
|
||||
RsErr() << "Could not open Rscollection file " << filename.toStdString();
|
||||
return;
|
||||
}
|
||||
collection.downloadFiles();
|
||||
//collection.openColl(qinfo.absoluteFilePath());
|
||||
}
|
||||
}
|
||||
while (!Rshare::files()->isEmpty()) {
|
||||
/* Now use files from the command line, because no RetroShare was running */
|
||||
openRsCollection(Rshare::files()->takeFirst());
|
||||
}
|
||||
/* Handle the -opmode options. */
|
||||
if (opModeStatus) {
|
||||
QString opmode = Rshare::opmode().toLower();
|
||||
if (opmode == "noturtle") {
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::NOTURTLE) - 1);
|
||||
} else if (opmode == "gaming") {
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::GAMING) - 1);
|
||||
} else if (opmode == "minimal") {
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::MINIMAL) - 1);
|
||||
} else if (opmode != "") {
|
||||
opModeStatus->setCurrentIndex(static_cast<typename std::underlying_type<RsOpMode>::type>(RsOpMode::FULL) - 1);
|
||||
}
|
||||
opModeStatus->setOpMode();
|
||||
} else {
|
||||
std::cerr << "ERR: MainWindow::processLastArgs opModeStatus is not initialized.";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::switchVisibilityStatus(StatusElement e,bool b)
|
||||
|
@ -214,7 +214,6 @@ public slots:
|
||||
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);
|
||||
|
@ -41,7 +41,7 @@
|
||||
PluginManager::PluginManager()
|
||||
{
|
||||
baseFolder = //qApp->applicationDirPath()+"///plugins" ;
|
||||
Rshare::dataDirectory() + "/plugins" ;
|
||||
RsApplication::dataDirectory() + "/plugins" ;
|
||||
lastError = "No error.";
|
||||
|
||||
viewWidget = 0;
|
||||
|
@ -123,7 +123,7 @@ void StartDialog::loadPerson()
|
||||
rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ;
|
||||
rsNotify->setDisableAskPassword(true);
|
||||
|
||||
bool res = Rshare::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ;
|
||||
bool res = RsApplication::loadCertificate(accountId, ui.autologin_checkbox->isChecked()) ;
|
||||
|
||||
rsNotify->setDisableAskPassword(false);
|
||||
rsNotify->clearPgpPassphrase();
|
||||
|
@ -121,7 +121,7 @@ void AvatarWidget::setFrameType(FrameType type)
|
||||
|
||||
//refreshAvatarImage();
|
||||
refreshStatus();
|
||||
Rshare::refreshStyleSheet(this, false);
|
||||
RsApplication::refreshStyleSheet(this, false);
|
||||
}
|
||||
void AvatarWidget::setId(const ChatId &id)
|
||||
{
|
||||
@ -174,7 +174,7 @@ void AvatarWidget::refreshStatus()
|
||||
case NO_FRAME:
|
||||
case NORMAL_FRAME:
|
||||
{
|
||||
Rshare::refreshStyleSheet(this, false);
|
||||
RsApplication::refreshStyleSheet(this, false);
|
||||
break;
|
||||
}
|
||||
case STATUS_FRAME:
|
||||
@ -252,7 +252,7 @@ void AvatarWidget::updateStatus(int status)
|
||||
mPeerState = status;
|
||||
|
||||
setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true);
|
||||
Rshare::refreshStyleSheet(this, false);
|
||||
RsApplication::refreshStyleSheet(this, false);
|
||||
}
|
||||
|
||||
void AvatarWidget::updateAvatar(const QString &peerId)
|
||||
|
@ -127,7 +127,7 @@ FriendSelectionWidget::FriendSelectionWidget(QWidget *parent)
|
||||
ui->filterLineEdit->showFilterIcon();
|
||||
|
||||
/* Refresh style to have the correct text color */
|
||||
Rshare::refreshStyleSheet(this, false);
|
||||
RsApplication::refreshStyleSheet(this, false);
|
||||
|
||||
mEventHandlerId_identities = 0;
|
||||
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) {
|
||||
@ -1225,7 +1225,7 @@ std::string FriendSelectionWidget::idFromItem(QTreeWidgetItem *item)
|
||||
return item->data(COLUMN_DATA, ROLE_ID).toString().toStdString();
|
||||
}
|
||||
|
||||
void FriendSelectionWidget::sortByChecked(bool sort)
|
||||
void FriendSelectionWidget::sortByChecked(bool)
|
||||
{
|
||||
mCompareRole->clear();
|
||||
mCompareRole->setRole(COLUMN_NAME,ROLE_SORT_SELECTED);
|
||||
|
@ -117,7 +117,7 @@ HelpBrowser::~HelpBrowser()
|
||||
QString
|
||||
HelpBrowser::language()
|
||||
{
|
||||
QString lang = Rshare::language();
|
||||
QString lang = RsApplication::language();
|
||||
if (!QDir(":/help/" + lang).exists())
|
||||
lang = "en";
|
||||
return lang;
|
||||
|
@ -54,7 +54,7 @@ HelpTextBrowser::loadResource(int type, const QUrl &name)
|
||||
/* Fall back to English if there is no translation of the specified help
|
||||
* page in the current language. */
|
||||
if (!name.path().contains("/")) {
|
||||
QString language = Rshare::language();
|
||||
QString language = RsApplication::language();
|
||||
if (!QDir(":/help/" + language).exists())
|
||||
language = "en";
|
||||
helpPath += language + "/";
|
||||
|
@ -45,13 +45,13 @@ ProfileWidget::ProfileWidget(QWidget *parent, Qt::WindowFlags flags)
|
||||
connect(ui.CopyCertButton,SIGNAL(clicked()), this, SLOT(copyCert()));
|
||||
connect(ui.profile_Button,SIGNAL(clicked()), this, SLOT(profilemanager()));
|
||||
|
||||
ui.onLineSince->setText(DateTime::formatLongDateTime(Rshare::startupTime()));
|
||||
ui.onLineSince->setText(DateTime::formatLongDateTime(RsApplication::startupTime()));
|
||||
}
|
||||
|
||||
void ProfileWidget::showEvent ( QShowEvent * /*event*/ )
|
||||
{
|
||||
/* set retroshare version */
|
||||
ui.version->setText(Rshare::retroshareVersion(true));
|
||||
ui.version->setText(RsApplication::retroshareVersion(true));
|
||||
|
||||
RsPeerDetails detail;
|
||||
if (rsPeers->getPeerDetails(rsPeers->getOwnId(),detail))
|
||||
|
@ -84,7 +84,7 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags)
|
||||
}
|
||||
|
||||
QMap<QString, QString> styleSheets;
|
||||
Rshare::getAvailableStyleSheets(styleSheets);
|
||||
RsApplication::getAvailableStyleSheets(styleSheets);
|
||||
|
||||
foreach (QString name, styleSheets.keys()) {
|
||||
ui.cmboStyleSheet->addItem(name, styleSheets[name]);
|
||||
@ -136,7 +136,7 @@ void AppearancePage::updateInterfaceStyle()
|
||||
#ifndef QT_NO_CURSOR
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
#endif
|
||||
Rshare::setStyle(ui.cmboStyle->currentText());
|
||||
RsApplication::setStyle(ui.cmboStyle->currentText());
|
||||
Settings->setInterfaceStyle(ui.cmboStyle->currentText());
|
||||
#ifndef QT_NO_CURSOR
|
||||
QApplication::restoreOverrideCursor();
|
||||
@ -152,7 +152,7 @@ void AppearancePage::loadStyleSheet(int index)
|
||||
#ifndef QT_NO_CURSOR
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
#endif
|
||||
Rshare::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString());
|
||||
RsApplication::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString());
|
||||
#ifndef QT_NO_CURSOR
|
||||
QApplication::restoreOverrideCursor();
|
||||
#endif
|
||||
@ -251,7 +251,7 @@ void AppearancePage::updateCmboToolButtonSize()
|
||||
// NotifyQt::getInstance()->notifySettingsChanged();
|
||||
// }
|
||||
|
||||
void AppearancePage::updateStyle() { Rshare::setStyle(ui.cmboStyle->currentText()); }
|
||||
void AppearancePage::updateStyle() { RsApplication::setStyle(ui.cmboStyle->currentText()); }
|
||||
|
||||
/** Loads the settings for this page */
|
||||
void AppearancePage::load()
|
||||
@ -259,7 +259,7 @@ void AppearancePage::load()
|
||||
int index = ui.cmboLanguage->findData(Settings->getLanguageCode());
|
||||
whileBlocking(ui.cmboLanguage)->setCurrentIndex(index);
|
||||
|
||||
index = ui.cmboStyle->findData(Rshare::style().toLower());
|
||||
index = ui.cmboStyle->findData(RsApplication::style().toLower());
|
||||
whileBlocking(ui.cmboStyle)->setCurrentIndex(index);
|
||||
|
||||
index = ui.cmboStyleSheet->findData(Settings->getSheetName());
|
||||
|
@ -66,7 +66,7 @@ CryptoPage::CryptoPage(QWidget * parent, Qt::WindowFlags flags)
|
||||
ui.retroshareId_content_LB->hide();
|
||||
ui.stackPageCertificate->hide();
|
||||
|
||||
ui.onlinesince->setText(DateTime::formatLongDateTime(Rshare::startupTime()));
|
||||
ui.onlinesince->setText(DateTime::formatLongDateTime(RsApplication::startupTime()));
|
||||
}
|
||||
|
||||
#ifdef UNUSED_CODE
|
||||
@ -111,7 +111,7 @@ void CryptoPage::showEvent ( QShowEvent * /*event*/ )
|
||||
ui.retroshareId_content_LB->setText(QString::fromUtf8(invite.c_str()));
|
||||
|
||||
/* set retroshare version */
|
||||
ui.version->setText(Rshare::retroshareVersion(true));
|
||||
ui.version->setText(RsApplication::retroshareVersion(true));
|
||||
|
||||
std::list<RsPgpId> ids;
|
||||
ids.clear();
|
||||
|
@ -146,10 +146,10 @@
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="useLocalServer">
|
||||
<property name="toolTip">
|
||||
<string>When checked, this instance receives new parameters (like RsLink or RsFile) and avoid new one.</string>
|
||||
<string><html><head/><body><p>When checked, this retroshare instance will accept calls by your operating system to open Retroshare collection files, and download links.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use Local Server to get new arguments.</string>
|
||||
<string>Accept operating systems calls</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
|
@ -910,7 +910,7 @@ void RshareSettings::setUseLocalServer(bool value)
|
||||
{
|
||||
if (value != getUseLocalServer()) {
|
||||
setValue("UseLocalServer", value);
|
||||
Rshare::updateLocalServer();
|
||||
RsApplication::updateLocalServer();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,10 @@ CrashStackTrace gCrashStackTrace;
|
||||
#include <QObject>
|
||||
#include <QMessageBox>
|
||||
#include <QSplashScreen>
|
||||
#include <QMessageBox>
|
||||
#include <QBuffer>
|
||||
#include <QSharedMemory>
|
||||
#include <QLocalSocket>
|
||||
|
||||
#include <rshare.h>
|
||||
#include "gui/common/FilesDefs.h"
|
||||
@ -106,6 +110,134 @@ __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
|
||||
#include "gui/notifyqt.h"
|
||||
#include <unistd.h>
|
||||
|
||||
static void showHelp(const argstream& as)
|
||||
{
|
||||
RsInfo() << "\n" <<
|
||||
"+================================================================+\n"
|
||||
"| o---o o |\n"
|
||||
"| \\ / - Retroshare GUI - / \\ |\n"
|
||||
"| o o---o |\n"
|
||||
"+================================================================+"
|
||||
<< std::endl ;
|
||||
|
||||
std::cerr << as.usage(false) << std::endl;
|
||||
|
||||
char *argv[1];
|
||||
int argc=0;
|
||||
QApplication dummyApp (argc, argv); // needed for QMessageBox
|
||||
QMessageBox box;
|
||||
QString text = QString::fromUtf8(as.usage(false,false).c_str());
|
||||
QFont font("Courier New",10,50,false);
|
||||
font.setStyleHint(QFont::TypeWriter,QFont::PreferMatch);
|
||||
font.setStyle(QFont::StyleNormal);
|
||||
font.setBold(true);
|
||||
box.setFont(font);
|
||||
box.setInformativeText(text);
|
||||
box.setWindowTitle(QObject::tr("Retroshare commandline arguments"));
|
||||
|
||||
// now compute the size of text and set the size of the box. For the record, this doesn't work...
|
||||
box.setBaseSize( QSize(QFontMetricsF(font).width(text),QFontMetricsF(font).height()*text.count('\n')) );
|
||||
box.exec();
|
||||
}
|
||||
|
||||
static bool notifyRunningInstance()
|
||||
{
|
||||
// Connect to the Local Server of the main process to notify it
|
||||
// that a new process had been started
|
||||
|
||||
RsInfo() << "Trying to contact running instance through socket \"" << TARGET << "\"";
|
||||
QLocalSocket localSocket;
|
||||
localSocket.connectToServer(QString(TARGET));
|
||||
#ifdef DEBUG
|
||||
std::cerr << "RsApplication::RsApplication waitForConnected to other instance." << std::endl;
|
||||
#endif
|
||||
if( localSocket.waitForConnected(100) )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "RsApplication::RsApplication Connection etablished. Waiting for disconnection." << std::endl;
|
||||
#endif
|
||||
localSocket.waitForDisconnected(1000);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "RsApplication::RsApplication failed to connect to other instance." << std::endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void sendArgsToRunningInstance(const QStringList& args)
|
||||
{
|
||||
QString serverName = QString(TARGET);
|
||||
|
||||
// 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) RsApplication::RsApplication 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();
|
||||
|
||||
std::cerr << "RsApplication::RsApplication waitForConnected to other instance." << std::endl;
|
||||
if(notifyRunningInstance())
|
||||
{
|
||||
newArgs.detach();
|
||||
std::cerr << "RsApplication::RsApplication Arguments was sended." << std::endl
|
||||
<< " To disable it, in Options - General - Misc," << std::endl
|
||||
<< " uncheck \"Use Local Server to get new Arguments\"." << std::endl;
|
||||
::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function
|
||||
}
|
||||
else
|
||||
std::cerr << "RsApplication::RsApplication failed to connect to other instance." << std::endl;
|
||||
newArgs.detach();
|
||||
}
|
||||
|
||||
static bool setLanguage(const std::string& language)
|
||||
{
|
||||
if(!language.empty())
|
||||
{
|
||||
if(!LanguageSupport::translate(QString::fromStdString(language)))
|
||||
{
|
||||
RsErr() << "Language \"" << language << "\" is not supported." ;
|
||||
|
||||
QString s;
|
||||
for(QString ss:LanguageSupport::languageCodes())
|
||||
s += ss + ", " ;
|
||||
|
||||
RsErr() << "Possible choices are: " << s.toStdString();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LanguageSupport::translate(LanguageSupport::defaultLanguageCode());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void displayWarningAboutDSAKeys()
|
||||
{
|
||||
std::map<std::string,std::vector<std::string> > unsupported_keys;
|
||||
@ -209,17 +341,6 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
Q_INIT_RESOURCE(images);
|
||||
Q_INIT_RESOURCE(icons);
|
||||
|
||||
// Loop through all command-line args/values to get help wanted before RsInit exit.
|
||||
for (int i = 0; i < args.size(); ++i) {
|
||||
QString arg;
|
||||
/* Get the argument name and set a blank value */
|
||||
arg = args.at(i);
|
||||
if ((arg.toLower() == "-h") || (arg.toLower() == "--help")) {
|
||||
QApplication dummyApp (argc, argv); // needed for QMessageBox
|
||||
Rshare::showUsageMessageBox();
|
||||
}
|
||||
}
|
||||
|
||||
// This is needed to allocate rsNotify, so that it can be used to ask for PGP passphrase
|
||||
//
|
||||
RsControl::earlyInitNotificationSystem() ;
|
||||
@ -230,21 +351,32 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
/* RetroShare Core Objects */
|
||||
RsInit::InitRsConfig();
|
||||
|
||||
RsConfigOptions conf;
|
||||
RsGUIConfigOptions conf;
|
||||
|
||||
std::string rslink,rsfile;
|
||||
std::list<std::string> links_and_files;
|
||||
std::string loglevel="off";
|
||||
std::string logfilename,language,guistyle,guistylesheetfile;
|
||||
|
||||
argstream as(argc,argv);
|
||||
as >> option('s',"stderr" ,conf.outStderr ,"output to stderr instead of log file." )
|
||||
>> option('u',"udp" ,conf.udpListenerOnly,"Only listen to UDP." )
|
||||
>> parameter('c',"base-dir" ,conf.optBaseDir ,"directory", "Set base directory." ,false)
|
||||
>> parameter('l',"log-file" ,conf.logfname ,"logfile" ,"Set Log filename." ,false)
|
||||
>> parameter('d',"debug-level" ,conf.debugLevel ,"level" ,"Set debug level." ,false)
|
||||
>> parameter('i',"ip-address" ,conf.forcedInetAddress,"nnn.nnn.nnn.nnn", "Force IP address to use (if cannot be detected)." ,false)
|
||||
>> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port to use." ,false)
|
||||
>> parameter('o',"opmode" ,conf.opModeStr ,"opmode" ,"Set Operating mode (Full, NoTurtle, Gaming, Minimal)." ,false)
|
||||
>> parameter('t',"opmode" ,conf.userSuppliedTorExecutable,"tor" ,"supply full tor eecutable path." ,false);
|
||||
as >> option( 's',"stderr" ,conf.outStderr ,"output to stderr instead of log file " )
|
||||
>> option( 'u',"udp" ,conf.udpListenerOnly ,"Only listen to UDP " )
|
||||
>> option( 'R',"reset" ,conf.optResetParams ,"reset retroshare parameters " )
|
||||
>> parameter('c',"base-dir" ,conf.optBaseDir ,"directory" ,"Set base directory " ,false)
|
||||
>> parameter('l',"log-file" ,logfilename ,"logfile" ,"Set Log filename " ,false)
|
||||
>> parameter('d',"debug-level" ,loglevel ,"level (debug,info,notice,warn,error,off)","Set debug level " ,false)
|
||||
>> parameter('i',"ip-address" ,conf.forcedInetAddress ,"nnn.nnn.nnn.nnn" ,"Force IP address " ,false)
|
||||
>> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port " ,false)
|
||||
>> parameter('o',"opmode" ,conf.opModeStr ,"opmode (Full, NoTurtle, Gaming, Minimal)","Set mode" ,false)
|
||||
>> parameter('t',"tor" ,conf.userSuppliedTorExecutable,"path" ,"supply full tor executable path " ,false)
|
||||
>> parameter('g',"style" ,guistyle ,"style (fusion,windows,gtk2,breeze)" ,"set GUI style" ,false)
|
||||
>> parameter('k',"style" ,guistylesheetfile ,"file" ,"gui stylesheet file" ,false)
|
||||
>> parameter('L',"lang" ,language ,"langage (fr,cn,...)" ,"set language" ,false)
|
||||
>> parameter('r',"link" ,rslink ,"retroshare link" ,"retroshare link to open (passed to running server)" ,false)
|
||||
>> parameter('f',"rsfile" ,rsfile ,"rsfile" ,"rscollection file to open (passed to running server)" ,false);
|
||||
#ifdef RS_JSONAPI
|
||||
as >> parameter('J', "jsonApiPort" ,conf.jsonApiPort ,"jsonApiPort" ,"Enable JSON API on the specified port" ,false)
|
||||
>> parameter('P', "jsonApiBindAddress", conf.jsonApiBindAddress, "jsonApiBindAddress", "JSON API Bind Address.", false);
|
||||
>> parameter('P', "jsonApiBindAddress",conf.jsonApiBindAddress ,"jsonApiBindAddress" ,"JSON API Bind Address " ,false);
|
||||
#endif // ifdef RS_JSONAPI
|
||||
|
||||
#ifdef LOCALNET_TESTING
|
||||
@ -254,6 +386,45 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
#ifdef RS_AUTOLOGIN
|
||||
as >> option('a',"auto-login" ,conf.autoLogin ,"AutoLogin (Windows Only) + StartMinimised");
|
||||
#endif // ifdef RS_AUTOLOGIN
|
||||
as >> values<std::string>(std::back_inserter(links_and_files),"links and rscollection files")
|
||||
>> help('h',"help",QObject::tr("Display this help").toStdString().c_str());
|
||||
|
||||
if(!as.isOk())
|
||||
{
|
||||
std::cerr << "Incorrect arguments." << std::endl;
|
||||
std::cerr << as.usage() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
conf.logFileName = QString::fromStdString(logfilename);
|
||||
conf.logLevel = QString::fromStdString(loglevel); // these will be checked when used in RsApplication
|
||||
conf.guiStyle = QString::fromStdString(guistyle); // these will be checked when used in RsApplication
|
||||
conf.guiStyleSheetFile = QString::fromUtf8(guistylesheetfile.c_str());// these will be checked when used in RsApplication
|
||||
|
||||
if(as.helpRequested())
|
||||
{
|
||||
showHelp(as);
|
||||
return 0;
|
||||
}
|
||||
// Look for parameters to be transmitted to running server
|
||||
|
||||
if((!rslink.empty() || !rsfile.empty() || !links_and_files.empty() || !conf.opModeStr.empty()) && notifyRunningInstance())
|
||||
{
|
||||
QStringList args;
|
||||
RsErr() << "Sending rscollection files, retroshare links and opmode parameters to the runnning retroshare server." ;
|
||||
|
||||
if(!rslink.empty()) { args.push_back("-l"); args.push_back(QString::fromUtf8(rslink.c_str())); }
|
||||
if(!rsfile.empty()) { args.push_back("-f"); args.push_back(QString::fromUtf8(rsfile.c_str())); }
|
||||
|
||||
for(auto s:links_and_files)
|
||||
args.push_back(QString::fromUtf8(s.c_str()));
|
||||
|
||||
if(!conf.opModeStr.empty()) { args.push_back("-o"); args.push_back(QString::fromStdString(conf.opModeStr)); }
|
||||
|
||||
sendArgsToRunningInstance(args);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Now start RS login system
|
||||
|
||||
conf.main_executable_path = argv[0];
|
||||
|
||||
@ -263,7 +434,9 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
{
|
||||
QApplication dummyApp (argc, argv); // needed for QMessageBox
|
||||
/* Translate into the desired language */
|
||||
LanguageSupport::translate(LanguageSupport::defaultLanguageCode());
|
||||
|
||||
if(!setLanguage(language))
|
||||
return 1;
|
||||
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(QObject::tr("This version of RetroShare is using OpenPGP-SDK. As a side effect, it's not using the system shared PGP keyring, but has it's own keyring shared by all RetroShare instances. <br><br>You do not appear to have such a keyring, although PGP keys are mentioned by existing RetroShare accounts, probably because you just changed to this new version of the software."));
|
||||
@ -294,7 +467,9 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
/* Error occured */
|
||||
QApplication dummyApp (argc, argv); // needed for QMessageBox
|
||||
/* Translate into the desired language */
|
||||
LanguageSupport::translate(LanguageSupport::defaultLanguageCode());
|
||||
|
||||
if(!setLanguage(language))
|
||||
return 1;
|
||||
|
||||
displayWarningAboutDSAKeys();
|
||||
|
||||
@ -322,8 +497,15 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
in this case it can be use only for default values */
|
||||
RshareSettings::Create ();
|
||||
|
||||
if(LanguageSupport::isValidLanguageCode(QString::fromStdString(language)))
|
||||
conf.language = QString::fromStdString(language);
|
||||
|
||||
/* Setup The GUI Stuff */
|
||||
Rshare rshare(args, argc, argv, QString::fromUtf8(RsAccounts::ConfigDirectory().c_str()));
|
||||
//Rshare rshare(args, argc, argv, QString::fromUtf8(RsAccounts::ConfigDirectory().c_str()));
|
||||
RsApplication rshare(conf);
|
||||
|
||||
if(!setLanguage(language))
|
||||
return 1;
|
||||
|
||||
/* Start RetroShare */
|
||||
QString sDefaultGXSIdToCreate = "";
|
||||
@ -371,7 +553,11 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
RsAccounts::GetPreferredAccountId(preferredId);
|
||||
|
||||
// true: note auto-login is active
|
||||
Rshare::loadCertificate(preferredId, true);
|
||||
if(!RsApplication::loadCertificate(preferredId, true))
|
||||
{
|
||||
RsErr() << "Retroshare auto-login startup failed." ;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -383,7 +569,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
|
||||
/* recreate global settings object, now with correct path, specific to the selected node */
|
||||
RshareSettings::Create(true);
|
||||
Rshare::resetLanguageAndStyle();
|
||||
RsApplication::resetLanguageAndStyle();
|
||||
|
||||
SoundManager::create();
|
||||
|
||||
@ -402,7 +588,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
|
||||
std::string tor_hidden_service_dir = RsAccounts::AccountDirectory() + "/hidden_service/" ;
|
||||
|
||||
RsTor::setTorDataDirectory(Rshare::dataDirectory().toStdString() + "/tor/");
|
||||
RsTor::setTorDataDirectory(RsApplication::dataDirectory().toStdString() + "/tor/");
|
||||
RsTor::setHiddenServiceDirectory(tor_hidden_service_dir); // re-set it, because now it's changed to the specific location that is run
|
||||
|
||||
RsDirUtil::checkCreateDirectory(std::string(tor_hidden_service_dir)) ;
|
||||
@ -485,7 +671,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
rsPeers->setProxyServer(RS_HIDDEN_TYPE_TOR, proxy_server_address,proxy_server_port) ;
|
||||
}
|
||||
|
||||
Rshare::initPlugins();
|
||||
RsApplication::initPlugins();
|
||||
|
||||
splashScreen.showMessage(rshare.translate("SplashScreen", "Create interface"), Qt::AlignHCenter | Qt::AlignBottom);
|
||||
QCoreApplication::processEvents(); // forces splashscreen to show up
|
||||
@ -507,7 +693,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
* only on the first run - as the user might want to change it ;)
|
||||
*/
|
||||
QString osx_style("cleanlooks");
|
||||
Rshare::setStyle(osx_style);
|
||||
RsApplication::setStyle(osx_style);
|
||||
Settings->setInterfaceStyle(osx_style);
|
||||
#endif
|
||||
|
||||
@ -523,8 +709,6 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
||||
MainWindow *w = MainWindow::Create ();
|
||||
splashScreen.finish(w);
|
||||
|
||||
w->processLastArgs();
|
||||
|
||||
if (!sDefaultGXSIdToCreate.isEmpty()) {
|
||||
RsIdentityParameters params;
|
||||
params.nickname = sDefaultGXSIdToCreate.toUtf8().constData();
|
||||
|
@ -50,55 +50,22 @@
|
||||
#include <lang/languagesupport.h>
|
||||
#include <util/stringutil.h>
|
||||
|
||||
#include <util/argstream.h>
|
||||
#include <retroshare/rsinit.h>
|
||||
#include <retroshare/rsversion.h>
|
||||
#include <retroshare/rsplugin.h>
|
||||
|
||||
#include "rshare.h"
|
||||
|
||||
/* Available command-line arguments. */
|
||||
#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_GUISTYLE "style" /**< Argument specfying GUI style. */
|
||||
#define ARG_GUISTYLESHEET "stylesheet" /**< Argument specfying GUI style. */
|
||||
#define ARG_LANGUAGE "lang" /**< Argument specifying language. */
|
||||
#define ARG_OPMODE_S "o" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */
|
||||
#define ARG_OPMODE_L "opmode" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */
|
||||
#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
|
||||
#ifdef __APPLE__
|
||||
QStringList RsApplication::_links; /**< List of links passed by arguments. */
|
||||
QStringList RsApplication::_files; /**< List of files passed by arguments. */
|
||||
#endif
|
||||
|
||||
// The arguments here can be send to a running instance.
|
||||
// If the command line contains arguments not listed here, we have to start a new instance.
|
||||
// For example, the user wants to start a second instance using --base-dir arg of libretroshare.
|
||||
static const char* const forwardableArgs[] = {
|
||||
ARG_OPMODE_S,
|
||||
ARG_OPMODE_L,
|
||||
ARG_RSLINK_S,
|
||||
ARG_RSLINK_L,
|
||||
ARG_RSFILE_S,
|
||||
ARG_RSFILE_L,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Static member variables */
|
||||
QMap<QString, QString> Rshare::_args; /**< List of command-line arguments. */
|
||||
Log Rshare::_log; /**< Logs debugging messages to file or stdout. */
|
||||
QString Rshare::_style; /**< The current GUI style. */
|
||||
QString Rshare::_stylesheet; /**< The current GUI stylesheet. */
|
||||
QString Rshare::_language; /**< The current language. */
|
||||
QString Rshare::_dateformat; /**< The format of dates in feed items etc. */
|
||||
QString Rshare::_opmode; /**< The operating mode passed by args. */
|
||||
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;
|
||||
Log RsApplication::log_output; /**< Logs debugging messages to file or stdout. */
|
||||
RsGUIConfigOptions RsApplication::options;
|
||||
QDateTime RsApplication::mStartupTime;
|
||||
QLocalServer* RsApplication::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().
|
||||
@ -133,127 +100,30 @@ void qt_msg_handler(QtMsgType type, const char *msg)
|
||||
}
|
||||
}
|
||||
|
||||
static bool notifyRunningInstance()
|
||||
{
|
||||
// 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));
|
||||
#ifdef DEBUG
|
||||
std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl;
|
||||
#endif
|
||||
if( localSocket.waitForConnected(100) )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "Rshare::Rshare Connection etablished. Waiting for disconnection." << std::endl;
|
||||
#endif
|
||||
localSocket.waitForDisconnected(1000);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Constructor. Parses the command-line arguments, resets Rshare's
|
||||
/** Constructor. Parses the command-line arguments, resets RsApplication's
|
||||
* configuration (if requested), and sets up the GUI style and language
|
||||
* translation. */
|
||||
Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir)
|
||||
: QApplication(argc, argv)
|
||||
* translation.
|
||||
* the const_cast below is truely horrible, but it allows to hide these unused argc/argv
|
||||
* when initing RsApplication
|
||||
*/
|
||||
|
||||
RsApplication::RsApplication(const RsGUIConfigOptions& conf)
|
||||
: QApplication(const_cast<RsGUIConfigOptions*>(&conf)->argc,const_cast<RsGUIConfigOptions*>(&conf)->argv)
|
||||
{
|
||||
mStartupTime = QDateTime::currentDateTime();
|
||||
localServer = NULL;
|
||||
options = conf;
|
||||
|
||||
//Initialize connection to LocalServer to know if other process runs.
|
||||
{
|
||||
QString serverName = QString(TARGET);
|
||||
|
||||
// check if another instance is running
|
||||
bool haveRunningInstance = notifyRunningInstance();
|
||||
|
||||
bool sendArgsToRunningInstance = haveRunningInstance;
|
||||
if(args.empty())
|
||||
sendArgsToRunningInstance = false;
|
||||
// if we find non-forwardable args, start a new instance
|
||||
for(int iCurs = 0; iCurs < args.size(); ++iCurs)
|
||||
{
|
||||
const char* const* argit = forwardableArgs;
|
||||
bool found = false;
|
||||
while(*argit && iCurs < args.size())
|
||||
{
|
||||
if(args.value(iCurs) == "-"+QString(*argit) || args.value(iCurs) == "--"+QString(*argit))
|
||||
{
|
||||
found = true;
|
||||
if(argNeedsValue(*argit))
|
||||
iCurs++;
|
||||
}
|
||||
argit++;
|
||||
}
|
||||
if(!found)
|
||||
sendArgsToRunningInstance = false;
|
||||
}
|
||||
|
||||
if (sendArgsToRunningInstance) {
|
||||
// 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();
|
||||
|
||||
std::cerr << "Rshare::Rshare waitForConnected to other instance." << std::endl;
|
||||
if(notifyRunningInstance())
|
||||
{
|
||||
newArgs.detach();
|
||||
std::cerr << "Rshare::Rshare Arguments was sended." << std::endl
|
||||
<< " To disable it, in Options - General - Misc," << std::endl
|
||||
<< " uncheck \"Use Local Server to get new Arguments\"." << std::endl;
|
||||
::exit(EXIT_SUCCESS); // Terminate the program using STDLib's exit function
|
||||
}
|
||||
else
|
||||
std::cerr << "Rshare::Rshare failed to connect to other instance." << std::endl;
|
||||
newArgs.detach();
|
||||
}
|
||||
|
||||
if(!haveRunningInstance)
|
||||
{
|
||||
// No main process exists
|
||||
// Or started without arguments
|
||||
// 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();
|
||||
|
||||
// clear out any old arguments (race condition?)
|
||||
QSharedMemory newArgs;
|
||||
newArgs.setKey(QString(TARGET) + "_newArgs");
|
||||
if(newArgs.attach(QSharedMemory::ReadWrite))
|
||||
newArgs.detach();
|
||||
}
|
||||
}
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0)
|
||||
qInstallMessageHandler(qt_msg_handler);
|
||||
@ -279,32 +149,22 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir)
|
||||
connect(timer, SIGNAL(timeout()), this, SIGNAL(minuteTick()));
|
||||
timer->start();
|
||||
|
||||
/* Read in all our command-line arguments. */
|
||||
parseArguments(args);
|
||||
|
||||
/* Check if we're supposed to reset our config before proceeding. */
|
||||
if (_args.contains(ARG_RESET)) {
|
||||
if (options.optResetParams)
|
||||
{
|
||||
RsInfo() << "Resetting Retroshare config parameters, as requested (option -R)";
|
||||
Settings->reset();
|
||||
}
|
||||
|
||||
/* Handle the -loglevel and -logfile options. */
|
||||
if (_args.contains(ARG_LOGFILE))
|
||||
_log.open(_args.value(ARG_LOGFILE));
|
||||
if (_args.contains(ARG_LOGLEVEL)) {
|
||||
_log.setLogLevel(Log::stringToLogLevel(
|
||||
_args.value(ARG_LOGLEVEL)));
|
||||
if (!_args.contains(ARG_LOGFILE))
|
||||
_log.open(stdout);
|
||||
}
|
||||
if (!_args.contains(ARG_LOGLEVEL) &&
|
||||
!_args.contains(ARG_LOGFILE))
|
||||
_log.setLogLevel(Log::Off);
|
||||
|
||||
/* config directory */
|
||||
useConfigDir = false;
|
||||
if (dir != "")
|
||||
if (options.logLevel != "Off")
|
||||
{
|
||||
setConfigDirectory(dir);
|
||||
if (!options.logFileName.isNull())
|
||||
log_output.open(options.logFileName);
|
||||
else
|
||||
log_output.open(stdout);
|
||||
|
||||
log_output.setLogLevel(Log::stringToLogLevel(options.logLevel));
|
||||
}
|
||||
|
||||
/** Initialize support for language translations. */
|
||||
@ -320,7 +180,7 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir)
|
||||
}
|
||||
|
||||
/** Destructor */
|
||||
Rshare::~Rshare()
|
||||
RsApplication::~RsApplication()
|
||||
{
|
||||
/* Cleanup GxsIdDetails */
|
||||
GxsIdDetails::cleanup();
|
||||
@ -334,7 +194,7 @@ Rshare::~Rshare()
|
||||
/**
|
||||
* @brief Executed when new instance connect command is sent to LocalServer
|
||||
*/
|
||||
void Rshare::slotConnectionEstablished()
|
||||
void RsApplication::slotConnectionEstablished()
|
||||
{
|
||||
QSharedMemory newArgs;
|
||||
newArgs.setKey(QString(TARGET) + "_newArgs");
|
||||
@ -346,7 +206,7 @@ void Rshare::slotConnectionEstablished()
|
||||
/* this is not an error. It just means we were notified to check
|
||||
newArgs, but none had been set yet.
|
||||
TODO: implement separate ping/take messages
|
||||
std::cerr << "(EE) Rshare::slotConnectionEstablished() Unable to attach to shared memory segment."
|
||||
std::cerr << "(EE) RsApplication::slotConnectionEstablished() Unable to attach to shared memory segment."
|
||||
<< newArgs.errorString().toStdString() << std::endl;
|
||||
*/
|
||||
socket->close();
|
||||
@ -357,6 +217,11 @@ void Rshare::slotConnectionEstablished()
|
||||
socket->close();
|
||||
delete socket;
|
||||
|
||||
if(newArgs.error())
|
||||
{
|
||||
RsErr() << "Something when wrong in receiving arguments from operating system: " << newArgs.errorString().toStdString() ;
|
||||
return ;
|
||||
}
|
||||
QBuffer buffer;
|
||||
QDataStream in(&buffer);
|
||||
QStringList args;
|
||||
@ -371,22 +236,22 @@ void Rshare::slotConnectionEstablished()
|
||||
emit newArgsReceived(args);
|
||||
while (!args.empty())
|
||||
{
|
||||
std::cerr << "Rshare::slotConnectionEstablished args:" << QString(args.takeFirst()).toStdString() << std::endl;
|
||||
std::cerr << "RsApplication::slotConnectionEstablished args:" << QString(args.takeFirst()).toStdString() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
QString Rshare::retroshareVersion(bool) { return RS_HUMAN_READABLE_VERSION; }
|
||||
QString RsApplication::retroshareVersion(bool) { return RS_HUMAN_READABLE_VERSION; }
|
||||
|
||||
/** Enters the main event loop and waits until exit() is called. The signal
|
||||
* running() will be emitted when the event loop has started. */
|
||||
int
|
||||
Rshare::run()
|
||||
RsApplication::run()
|
||||
{
|
||||
QTimer::singleShot(0, rApp, SLOT(onEventLoopStarted()));
|
||||
return rApp->exec();
|
||||
}
|
||||
|
||||
QDateTime Rshare::startupTime()
|
||||
QDateTime RsApplication::startupTime()
|
||||
{
|
||||
return mStartupTime;
|
||||
}
|
||||
@ -395,203 +260,17 @@ QDateTime Rshare::startupTime()
|
||||
* will emit the running() signal to indicate that the application's event
|
||||
* loop is running. */
|
||||
void
|
||||
Rshare::onEventLoopStarted()
|
||||
RsApplication::onEventLoopStarted()
|
||||
{
|
||||
emit running();
|
||||
}
|
||||
|
||||
/** Display usage information regarding command-line arguments. */
|
||||
/*void
|
||||
Rshare::printUsage(QString errmsg)
|
||||
{
|
||||
QTextStream out(stdout);*/
|
||||
|
||||
/* If there was an error message, print it out. */
|
||||
/*if (!errmsg.isEmpty()) {
|
||||
out << "** " << errmsg << " **" << endl << endl;
|
||||
}*/
|
||||
|
||||
/* Now print the application usage */
|
||||
//out << "Usage: " << endl;
|
||||
//out << "\t" << qApp->arguments().at(0) << " [options]" << endl;
|
||||
|
||||
/* And available options */
|
||||
//out << endl << "Available Options:" << endl;
|
||||
//out << "\t-"ARG_RESET"\t\tResets ALL stored Rshare settings." << endl;
|
||||
//out << "\t-"ARG_DATADIR"\tSets the directory Rshare uses for data files"<< endl;
|
||||
//out << "\t-"ARG_GUISTYLE"\t\tSets Rshare's interface style." << endl;
|
||||
//out << "\t-"ARG_GUISTYLESHEET"\t\tSets Rshare's stylesheet." << endl;
|
||||
//out << "\t\t\t[" << QStyleFactory::keys().join("|") << "]" << endl;
|
||||
//out << "\t-"ARG_LANGUAGE"\t\tSets Rshare's language." << endl;
|
||||
//out << "\t\t\t[" << LanguageSupport::languageCodes().join("|") << "]" << endl;
|
||||
//}
|
||||
|
||||
/** Displays usage information for command-line args. */
|
||||
void
|
||||
Rshare::showUsageMessageBox()
|
||||
{
|
||||
QString usage;
|
||||
QTextStream out(&usage);
|
||||
|
||||
out << "Available Options:" << endl;
|
||||
out << "<table>";
|
||||
//out << trow(tcol("-"ARG_HELP) +
|
||||
// tcol(tr("Displays this usage message and exits.")));
|
||||
out << trow(tcol("-" ARG_RESET) +
|
||||
tcol(tr("Resets ALL stored RetroShare settings.")));
|
||||
out << trow(tcol("-" ARG_DATADIR" <dir>") +
|
||||
tcol(tr("Sets the directory RetroShare uses for data files.")));
|
||||
out << trow(tcol("-" ARG_LOGFILE" <" + tr("filename") + ">") +
|
||||
tcol(tr("Sets the name and location of RetroShare's logfile.")));
|
||||
out << trow(tcol("-" ARG_LOGLEVEL" <" + tr("level") + ">") +
|
||||
tcol(tr("Sets the verbosity of RetroShare's logging.") +
|
||||
"<br>[" + Log::logLevels().join("|") +"]"));
|
||||
out << trow(tcol("-" ARG_GUISTYLE" <" + tr("style") +">") +
|
||||
tcol(tr("Sets RetroShare's interface style.") +
|
||||
"<br>[" + QStyleFactory::keys().join("|") + "]"));
|
||||
out << trow(tcol("-" ARG_GUISTYLESHEET" <" + tr("stylesheet") + ">") +
|
||||
tcol(tr("Sets RetroShare's interface stylesheets.")));
|
||||
out << trow(tcol("-" ARG_LANGUAGE" <" + tr("language") + ">") +
|
||||
tcol(tr("Sets RetroShare's language.") +
|
||||
"<br>[" + LanguageSupport::languageCodes().join("|") + "]"));
|
||||
out << trow(tcol("--" ARG_OPMODE_L" <" + tr("opmode") + ">") +
|
||||
tcol(tr("Sets RetroShare's operating mode.") +
|
||||
"<br>[full|noturtle|gaming|minimal]"));
|
||||
out << trow(tcol("-" ARG_RSLINK_L" <" + tr("RsLinkURL") + ">") +
|
||||
tcol(tr("Open RsLink with protocol retroshare://")));
|
||||
out << trow(tcol("-" ARG_RSFILE_L" <" + tr("filename") + ">") +
|
||||
tcol(tr("Open RsFile with or without arg.")));
|
||||
out << "</table>";
|
||||
|
||||
VMessageBox::information(0,
|
||||
tr("RetroShare GUI Usage Information"), usage, VMessageBox::Ok);
|
||||
}
|
||||
|
||||
/** Returns true if the specified argument expects a value. */
|
||||
bool
|
||||
Rshare::argNeedsValue(const QString &argName)
|
||||
{
|
||||
return (
|
||||
argName == ARG_DATADIR ||
|
||||
argName == ARG_LOGFILE ||
|
||||
argName == ARG_LOGLEVEL ||
|
||||
argName == ARG_GUISTYLE ||
|
||||
argName == ARG_GUISTYLESHEET ||
|
||||
argName == ARG_LANGUAGE ||
|
||||
argName == ARG_OPMODE_S ||
|
||||
argName == ARG_OPMODE_L ||
|
||||
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, bool firstRun)
|
||||
{
|
||||
QString arg, argl, value;
|
||||
|
||||
/* Loop through all command-line args/values and put them in a map */
|
||||
for (int iCurs = 0; iCurs < args.size(); ++iCurs) {
|
||||
/* Get the argument name and set a blank value */
|
||||
arg = args.at(iCurs);//.toLower(); Need Upper case for file name.
|
||||
argl = arg.toLower();
|
||||
if (argl == "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 (iCurs < args.size()-1 && argNeedsValue(arg)) {
|
||||
value = args.at(++iCurs);
|
||||
}
|
||||
} else {
|
||||
/* Check if links or files without arg */
|
||||
if (argl.startsWith("retroshare://")) {
|
||||
value = arg;
|
||||
arg = ARG_RSLINK_L;
|
||||
} else {
|
||||
if (QFile(arg).exists()) {
|
||||
value = arg;
|
||||
arg = ARG_RSFILE_L;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* handle opmode that could be change while running.*/
|
||||
QString omValue = QString(value).prepend(";").append(";").toLower();
|
||||
QString omValues = QString(";full;noturtle;gaming;minimal;");
|
||||
if ((arg == ARG_OPMODE_S || arg == ARG_OPMODE_L )
|
||||
&& omValues.contains(omValue)) {
|
||||
_opmode = value;
|
||||
}
|
||||
|
||||
/* 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. */
|
||||
bool
|
||||
Rshare::validateArguments(QString &errmsg)
|
||||
{
|
||||
/* Check for a writable log file */
|
||||
if (_args.contains(ARG_LOGFILE) && !_log.isOpen()) {
|
||||
errmsg = tr("Unable to open log file '%1': %2")
|
||||
.arg( _args.value(ARG_LOGFILE)
|
||||
, _log.errorString());
|
||||
return false;
|
||||
}
|
||||
/* Check for a valid log level */
|
||||
if (_args.contains(ARG_LOGLEVEL) &&
|
||||
!Log::logLevels().contains(_args.value(ARG_LOGLEVEL))) {
|
||||
errmsg = tr("Invalid log level specified:")+" " + _args.value(ARG_LOGLEVEL);
|
||||
return false;
|
||||
}
|
||||
/* Check for a valid GUI style */
|
||||
if (_args.contains(ARG_GUISTYLE) &&
|
||||
!QStyleFactory::keys().contains(_args.value(ARG_GUISTYLE),
|
||||
Qt::CaseInsensitive)) {
|
||||
errmsg = tr("Invalid GUI style specified:")+" " + _args.value(ARG_GUISTYLE);
|
||||
return false;
|
||||
}
|
||||
/* Check for a language that Retroshare recognizes. */
|
||||
if (_args.contains(ARG_LANGUAGE) &&
|
||||
!LanguageSupport::isValidLanguageCode(_args.value(ARG_LANGUAGE))) {
|
||||
errmsg = tr("Invalid language code specified:")+" " + _args.value(ARG_LANGUAGE);
|
||||
return false;
|
||||
}
|
||||
/* Check for an opmode that Retroshare recognizes. */
|
||||
if (_args.contains(ARG_OPMODE_S) &&
|
||||
!QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_S)).prepend(";").append(";").toLower())) {
|
||||
errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_S);
|
||||
return false;
|
||||
}
|
||||
/* Check for an opmode that Retroshare recognizes. */
|
||||
if (_args.contains(ARG_OPMODE_L) &&
|
||||
!QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_L)).prepend(";").append(";").toLower())) {
|
||||
errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_L);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Sets the translation RetroShare will use. If one was specified on the
|
||||
* command-line, we will use that. Otherwise, we'll check to see if one was
|
||||
* saved previously. If not, we'll default to one appropriate for the system
|
||||
* locale. */
|
||||
bool
|
||||
Rshare::setLanguage(QString languageCode)
|
||||
RsApplication::setLanguage(QString languageCode)
|
||||
{
|
||||
/* If the language code is empty, use the previously-saved setting */
|
||||
if (languageCode.isEmpty()) {
|
||||
@ -599,7 +278,7 @@ Rshare::setLanguage(QString languageCode)
|
||||
}
|
||||
/* Translate into the desired language */
|
||||
if (LanguageSupport::translate(languageCode)) {
|
||||
_language = languageCode;
|
||||
options.language = languageCode;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -610,7 +289,7 @@ Rshare::setLanguage(QString languageCode)
|
||||
* saved previously. If not, we'll default to the system
|
||||
* locale. */
|
||||
bool
|
||||
Rshare::setLocale(QString languageCode)
|
||||
RsApplication::setLocale(QString languageCode)
|
||||
{
|
||||
bool retVal = false;
|
||||
/* If the language code is empty, use the previously-saved setting */
|
||||
@ -626,20 +305,20 @@ Rshare::setLocale(QString languageCode)
|
||||
}
|
||||
|
||||
/** customize date format for feeds etc. */
|
||||
void Rshare::customizeDateFormat()
|
||||
void RsApplication::customizeDateFormat()
|
||||
{
|
||||
QLocale locale = QLocale(); // set to default locale
|
||||
/* get long date format without weekday */
|
||||
_dateformat = locale.dateFormat(QLocale::LongFormat);
|
||||
_dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), "");
|
||||
_dateformat.replace(QRegExp(",* *dddd"), "");
|
||||
_dateformat = _dateformat.trimmed();
|
||||
options.dateformat = locale.dateFormat(QLocale::LongFormat);
|
||||
options.dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), "");
|
||||
options.dateformat.replace(QRegExp(",* *dddd"), "");
|
||||
options.dateformat = options.dateformat.trimmed();
|
||||
}
|
||||
|
||||
/** Get custom date format (defaultlongformat) */
|
||||
QString Rshare::customDateFormat()
|
||||
QString RsApplication::customDateFormat()
|
||||
{
|
||||
return _dateformat;
|
||||
return options.dateformat;
|
||||
}
|
||||
|
||||
/** Sets the GUI style RetroShare will use. If one was specified on the
|
||||
@ -647,49 +326,50 @@ QString Rshare::customDateFormat()
|
||||
* saved previously. If not, we'll default to one appropriate for the
|
||||
* operating system. */
|
||||
bool
|
||||
Rshare::setStyle(QString styleKey)
|
||||
RsApplication::setStyle(QString styleKey)
|
||||
{
|
||||
/* If no style was specified, use the previously-saved setting */
|
||||
if (styleKey.isEmpty()) {
|
||||
styleKey = Settings->getInterfaceStyle();
|
||||
}
|
||||
/* Apply the specified GUI style */
|
||||
if (QApplication::setStyle(styleKey)) {
|
||||
_style = styleKey;
|
||||
if (QApplication::setStyle(styleKey))
|
||||
{
|
||||
options.guiStyle = styleKey;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
Rshare::setSheet(QString sheet)
|
||||
RsApplication::setSheet(QString sheet)
|
||||
{
|
||||
/* If no stylesheet was specified, use the previously-saved setting */
|
||||
if (sheet.isEmpty()) {
|
||||
sheet = Settings->getSheetName();
|
||||
}
|
||||
/* Apply the specified GUI stylesheet */
|
||||
_stylesheet = sheet;
|
||||
options.guiStyleSheetFile = sheet;
|
||||
|
||||
/* load the StyleSheet*/
|
||||
loadStyleSheet(_stylesheet);
|
||||
loadStyleSheet(options.guiStyleSheetFile);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Rshare::resetLanguageAndStyle()
|
||||
void RsApplication::resetLanguageAndStyle()
|
||||
{
|
||||
/** Translate the GUI to the appropriate language. */
|
||||
setLanguage(_args.value(ARG_LANGUAGE));
|
||||
setLanguage(options.language);
|
||||
|
||||
/** Set the locale appropriately. */
|
||||
setLocale(_args.value(ARG_LANGUAGE));
|
||||
setLocale(options.language);
|
||||
|
||||
/** Set the GUI style appropriately. */
|
||||
setStyle(_args.value(ARG_GUISTYLE));
|
||||
setStyle(options.guiStyle);
|
||||
|
||||
/** Set the GUI stylesheet appropriately. */
|
||||
setSheet(_args.value(ARG_GUISTYLESHEET));
|
||||
setSheet(options.guiStyleSheetFile);
|
||||
}
|
||||
|
||||
// RetroShare:
|
||||
@ -714,7 +394,7 @@ void Rshare::resetLanguageAndStyle()
|
||||
// Language depended stylesheet
|
||||
// <Internal|External>_<locale>.lqss
|
||||
|
||||
void Rshare::loadStyleSheet(const QString &sheetName)
|
||||
void RsApplication::loadStyleSheet(const QString &sheetName)
|
||||
{
|
||||
QString locale = QLocale().name();
|
||||
QString styleSheet;
|
||||
@ -785,7 +465,7 @@ void Rshare::loadStyleSheet(const QString &sheetName)
|
||||
}
|
||||
|
||||
/** get list of available stylesheets **/
|
||||
void Rshare::getAvailableStyleSheets(QMap<QString, QString> &styleSheets)
|
||||
void RsApplication::getAvailableStyleSheets(QMap<QString, QString> &styleSheets)
|
||||
{
|
||||
QFileInfoList fileInfoList = QDir(":/qss/stylesheet/").entryInfoList(QStringList("*.qss"));
|
||||
QFileInfo fileInfo;
|
||||
@ -813,7 +493,7 @@ void Rshare::getAvailableStyleSheets(QMap<QString, QString> &styleSheets)
|
||||
}
|
||||
}
|
||||
|
||||
void Rshare::refreshStyleSheet(QWidget *widget, bool processChildren)
|
||||
void RsApplication::refreshStyleSheet(QWidget *widget, bool processChildren)
|
||||
{
|
||||
if (widget != NULL) {
|
||||
// force widget to recalculate valid style
|
||||
@ -839,40 +519,35 @@ void Rshare::refreshStyleSheet(QWidget *widget, bool processChildren)
|
||||
}
|
||||
|
||||
/** Initialize plugins. */
|
||||
void Rshare::initPlugins()
|
||||
void RsApplication::initPlugins()
|
||||
{
|
||||
loadStyleSheet(_stylesheet);
|
||||
LanguageSupport::translatePlugins(_language);
|
||||
loadStyleSheet(options.guiStyleSheetFile);
|
||||
LanguageSupport::translatePlugins(options.language);
|
||||
}
|
||||
|
||||
/** Returns the directory RetroShare uses for its data files. */
|
||||
QString
|
||||
Rshare::dataDirectory()
|
||||
QString RsApplication::dataDirectory()
|
||||
{
|
||||
if (useConfigDir)
|
||||
{
|
||||
return configDir;
|
||||
}
|
||||
else if (_args.contains(ARG_DATADIR)) {
|
||||
return _args.value(ARG_DATADIR);
|
||||
}
|
||||
if(!options.optBaseDir.empty())
|
||||
return QString::fromUtf8(options.optBaseDir.c_str());
|
||||
else
|
||||
return defaultDataDirectory();
|
||||
}
|
||||
|
||||
/** Returns the default location of RetroShare's data directory. */
|
||||
QString
|
||||
Rshare::defaultDataDirectory()
|
||||
RsApplication::defaultDataDirectory()
|
||||
{
|
||||
#if defined(Q_OS_WIN)
|
||||
return (win32_app_data_folder() + "\\RetroShare");
|
||||
#else
|
||||
return (QDir::homePath() + "/.RetroShare");
|
||||
return (QDir::homePath() + "/.retroshare");
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Creates Rshare's data directory, if it doesn't already exist. */
|
||||
/** Creates RsApplication's data directory, if it doesn't already exist. */
|
||||
bool
|
||||
Rshare::createDataDirectory(QString *errmsg)
|
||||
RsApplication::createDataDirectory(QString *errmsg)
|
||||
{
|
||||
QDir datadir(dataDirectory());
|
||||
if (!datadir.exists()) {
|
||||
@ -885,33 +560,29 @@ Rshare::createDataDirectory(QString *errmsg)
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Set Rshare's data directory - externally */
|
||||
bool Rshare::setConfigDirectory(const QString& dir)
|
||||
/** Set RsApplication's data directory - externally */
|
||||
bool RsApplication::setConfigDirectory(const QString& dir)
|
||||
{
|
||||
useConfigDir = true;
|
||||
configDir = dir;
|
||||
options.optBaseDir = std::string(dir.toUtf8());
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Writes <b>msg</b> with severity <b>level</b> to RetroShare's log. */
|
||||
Log::LogMessage
|
||||
Rshare::log(Log::LogLevel level, QString msg)
|
||||
Log::LogMessage RsApplication::log(Log::LogLevel level, QString msg)
|
||||
{
|
||||
return _log.log(level, msg);
|
||||
return log_output.log(level, msg);
|
||||
}
|
||||
|
||||
/** Creates and binds a shortcut such that when <b>key</b> is pressed in
|
||||
* <b>sender</b>'s context, <b>receiver</b>'s <b>slot</b> will be called. */
|
||||
void
|
||||
Rshare::createShortcut(const QKeySequence &key, QWidget *sender,
|
||||
QWidget *receiver, const char *slot)
|
||||
void RsApplication::createShortcut(const QKeySequence &key, QWidget *sender, QWidget *receiver, const char *slot)
|
||||
{
|
||||
QShortcut *s = new QShortcut(key, sender);
|
||||
connect(s, SIGNAL(activated()), receiver, slot);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
bool Rshare::event(QEvent *event)
|
||||
bool RsApplication::event(QEvent *event)
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::FileOpen:{
|
||||
@ -933,7 +604,7 @@ bool Rshare::event(QEvent *event)
|
||||
}
|
||||
#endif
|
||||
|
||||
void Rshare::blinkTimer()
|
||||
void RsApplication::blinkTimer()
|
||||
{
|
||||
mBlink = !mBlink;
|
||||
emit blink(mBlink);
|
||||
@ -944,7 +615,7 @@ void Rshare::blinkTimer()
|
||||
}
|
||||
}
|
||||
|
||||
bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin)
|
||||
bool RsApplication::loadCertificate(const RsPeerId &accountId, bool autoLogin)
|
||||
{
|
||||
if (!RsAccounts::SelectAccount(accountId))
|
||||
{
|
||||
@ -985,14 +656,14 @@ bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin)
|
||||
// QObject::tr("Login Failure"),
|
||||
// QObject::tr("Maybe password is wrong") );
|
||||
return false;
|
||||
default: std::cerr << "Rshare::loadCertificate() unexpected switch value " << retVal << std::endl;
|
||||
default: std::cerr << "RsApplication::loadCertificate() unexpected switch value " << retVal << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Rshare::updateLocalServer()
|
||||
bool RsApplication::updateLocalServer()
|
||||
{
|
||||
if (localServer) {
|
||||
QString serverName = QString(TARGET);
|
||||
|
@ -36,9 +36,10 @@
|
||||
#include "util/log.h"
|
||||
|
||||
#include "retroshare/rstypes.h"
|
||||
#include "retroshare/rsinit.h"
|
||||
|
||||
/** Pointer to this RetroShare application instance. */
|
||||
#define rApp (static_cast<Rshare *>(qApp))
|
||||
#define rApp (static_cast<RsApplication *>(qApp))
|
||||
|
||||
#define rDebug(fmt) (rApp->log(Log::Debug, (fmt)))
|
||||
#define rInfo(fmt) (rApp->log(Log::Info, (fmt)))
|
||||
@ -46,33 +47,40 @@
|
||||
#define rWarn(fmt) (rApp->log(Log::Warn, (fmt)))
|
||||
#define rError(fmt) (rApp->log(Log::Error, (fmt)))
|
||||
|
||||
struct RsGUIConfigOptions: public RsConfigOptions
|
||||
{
|
||||
RsGUIConfigOptions()
|
||||
: optResetParams(false), logLevel("Off"), argc(0)
|
||||
{}
|
||||
|
||||
class Rshare : public QApplication
|
||||
bool optResetParams; // reset all GUI parameters
|
||||
|
||||
QString dateformat; // The format for dates in feed items etc.
|
||||
QString language; // The current language.
|
||||
|
||||
QString logFileName; // output filename for log
|
||||
QString logLevel; // severity threshold for log output
|
||||
|
||||
QString guiStyle; // CSS Style for the GUI
|
||||
QString guiStyleSheetFile; // CSS Style for the GUI
|
||||
|
||||
int argc ; // stores argc parameter. Only used by the creator of QApplication
|
||||
char *argv[1] ; // stores argv parameter. Only used by the creator of QApplication
|
||||
};
|
||||
|
||||
class RsApplication : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
/** Constructor. */
|
||||
Rshare(QStringList args, int &argc, char **argv, const QString &dir);
|
||||
RsApplication(const RsGUIConfigOptions& conf);
|
||||
/** Destructor. */
|
||||
~Rshare();
|
||||
~RsApplication();
|
||||
|
||||
/** Return the version info */
|
||||
static QString retroshareVersion(bool=true);
|
||||
|
||||
/** Return the map of command-line arguments and values. */
|
||||
static QMap<QString, QString> 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. */
|
||||
//void printUsage(QString errmsg = QString());
|
||||
/** Displays usage information for command-line args. */
|
||||
static void showUsageMessageBox();
|
||||
/** Returns true if the user wants to see usage information. */
|
||||
static bool showUsage();
|
||||
|
||||
/** Sets the current language. */
|
||||
static bool setLanguage(QString languageCode = QString());
|
||||
/** Sets the current locale. */
|
||||
@ -105,17 +113,22 @@ public:
|
||||
static void initPlugins();
|
||||
|
||||
/** Returns the current GUI style. */
|
||||
static QString style() { return _style; }
|
||||
static QString style() { return options.guiStyle; }
|
||||
/** Returns the current GUI stylesheet. */
|
||||
static QString stylesheet() { return _stylesheet; }
|
||||
static QString stylesheet() { return options.guiStyleSheetFile; }
|
||||
/** Returns the current language. */
|
||||
static QString language() { return _language; }
|
||||
/** Returns the operating mode. */
|
||||
static QString opmode() { return _opmode; }
|
||||
static QString language() { return options.language; }
|
||||
|
||||
/** Sets/Returns the operating mode. */
|
||||
static void setOpMode(const QString& op ) { options.opModeStr = op.toStdString(); }
|
||||
static QString opmode() { return QString::fromStdString(options.opModeStr); }
|
||||
|
||||
#ifdef __APPLE__
|
||||
/** Returns links passed by arguments. */
|
||||
static QStringList* links() { return &_links; }
|
||||
/** Returns files passed by arguments. */
|
||||
static QStringList* files() {return &_files; }
|
||||
#endif
|
||||
/** Returns Rshare's application startup time. */
|
||||
static QDateTime startupTime();
|
||||
|
||||
@ -176,24 +189,20 @@ private:
|
||||
/** customize the date format (defaultlongformat) */
|
||||
static void customizeDateFormat();
|
||||
|
||||
#ifdef TO_REMOVE
|
||||
/** Returns true if the specified arguments wants a value. */
|
||||
static bool argNeedsValue(const QString &argName);
|
||||
#endif
|
||||
|
||||
static QMap<QString, QString> _args; /**< List of command-line arguments. */
|
||||
static Log _log; /**< Logs debugging messages to file or stdout. */
|
||||
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 QString _opmode; /**< The operating mode passed by args. */
|
||||
#ifdef __APPLE__
|
||||
static QStringList _links; /**< List of links passed by arguments. */
|
||||
static QStringList _files; /**< List of files passed by arguments. */
|
||||
#endif
|
||||
static QDateTime mStartupTime; // startup time
|
||||
|
||||
static bool useConfigDir;
|
||||
static QString configDir;
|
||||
bool mBlink;
|
||||
static QLocalServer* localServer;
|
||||
static RsGUIConfigOptions options;
|
||||
static Log log_output;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -30,7 +30,7 @@ QString DateTime::formatLongDate(time_t dateValue)
|
||||
|
||||
QString DateTime::formatLongDate(const QDate &dateValue)
|
||||
{
|
||||
QString customDateFormat = Rshare::customDateFormat();
|
||||
QString customDateFormat = RsApplication::customDateFormat();
|
||||
|
||||
if (customDateFormat.isEmpty()) {
|
||||
return dateValue.toString(Qt::ISODate);
|
||||
|
Loading…
x
Reference in New Issue
Block a user