Merge branch 'RetroShare:master' into tor-fix

This commit is contained in:
defnax 2024-03-05 13:05:17 +01:00 committed by GitHub
commit 46e9dfa61c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
63 changed files with 52489 additions and 64993 deletions

@ -1 +1 @@
Subproject commit 97a75f2f098babf2f6498f01ff9119aa35ce9a28 Subproject commit 353596b0ee5ea76611eb663b90bf3ab1c9f34ad7

@ -1 +1 @@
Subproject commit 78739f1eb504503b12f107109356624da49e75ef Subproject commit ac1c5f3019ff17c695758dabec0ee8e540d401e0

View file

@ -2,17 +2,14 @@
README for RetroShare README for RetroShare
======================================================================================= =======================================================================================
RetroShare web site . . . . http://retroshare.net/index.html RetroShare web site . . . . https://retroshare.cc/
Developer's blog . . . . . https://retroshareteam.wordpress.com Developer's blog . . . . . https://retroshareteam.wordpress.com
Documentation . . . . . . . https://retroshare.readthedocs.io/en/latest/ Documentation . . . . . . . https://retrosharedocs.readthedocs.io/en/latest/
Support . . . . . . . . . . http://retroshare.net/support.html
Forums . . . . . . . . . . http://retroshare.sourceforge.net/forum/
Wiki . . . . . . . . . . . https://github.com/RetroShare/documentation/wiki Wiki . . . . . . . . . . . https://github.com/RetroShare/documentation/wiki
Old developers site . . . . http://retroshare.sourceforge.net/wiki/index.php/Developers_Corner
Project site . . . . . . . https://github.com/RetroShare/RetroShare Project site . . . . . . . https://github.com/RetroShare/RetroShare
Relted projects/plugins . . https://github.com/RetroShare Related projects/plugins . .https://github.com/RetroShare
Contact: . . . . . . . . . retroshare@lunamutt.com ,defnax@users.sourceforge.net Contact: . . . . . . . . . retroshare.project@gmail.com
========================================================================================= =========================================================================================
Compiling RetroShare Compiling RetroShare
@ -22,9 +19,9 @@ Build Scripts are avaible on GIT:
https://github.com/RetroShare/RetroShare/tree/master/build_scripts https://github.com/RetroShare/RetroShare/tree/master/build_scripts
You can find here instructions howto compile RetroShare: You can find here instructions howto compile RetroShare:
https://retroshare.readthedocs.io/en/latest/developer/compilation/ https://retrosharedocs.readthedocs.io/en/latest/developer/compilation/
You can go on over to our forum or chat lobby when you have trouble with compiling: You can go on over to our forum or chat room when you have trouble with compiling:
retroshare://forum?name=Developers%20Discussions&id=8fd22bd8f99754461e7ba1ca8a727995 retroshare://forum?name=Developers%20Discussions&id=8fd22bd8f99754461e7ba1ca8a727995
retroshare://chat_room?name=Retroshare%20Devel%20%28signed%29&id=L68DB0A1E09BDA3A5 retroshare://chat_room?name=Retroshare%20Devel%20%28signed%29&id=L68DB0A1E09BDA3A5
http://retroshare.sourceforge.net/forum/

View file

@ -142,7 +142,7 @@ void AboutWidget::updateTitle()
{ {
if (tWidget == NULL) 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 else
{ {
@ -228,7 +228,7 @@ void AWidget::initImages()
#ifdef RS_ONLYHIDDENNODE #ifdef RS_ONLYHIDDENNODE
p.drawText(QPointF(10, 50), QString("%1 : %2 (With embedded Tor)").arg(tr("Retroshare version"), Rshare::retroshareVersion(true))); p.drawText(QPointF(10, 50), QString("%1 : %2 (With embedded Tor)").arg(tr("Retroshare version"), Rshare::retroshareVersion(true)));
#else #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 #endif
/* Draw Qt's version number */ /* Draw Qt's version number */
@ -936,7 +936,7 @@ void AboutWidget::on_copy_button_clicked()
{ {
QString verInfo; QString verInfo;
QString rsVerString = "RetroShare Version: "; QString rsVerString = "RetroShare Version: ";
rsVerString+=Rshare::retroshareVersion(true); rsVerString+=RsApplication::retroshareVersion(true);
verInfo+=rsVerString; verInfo+=rsVerString;
#ifdef RS_ONLYHIDDENNODE #ifdef RS_ONLYHIDDENNODE
verInfo+=" " + tr("Only Hidden Node"); verInfo+=" " + tr("Only Hidden Node");

View file

@ -143,28 +143,28 @@ ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags)
QHeaderView_setSectionResizeModeColumn(header, COLUMN_TOPIC, QHeaderView::Interactive); QHeaderView_setSectionResizeModeColumn(header, COLUMN_TOPIC, QHeaderView::Interactive);
privateSubLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER); privateSubLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER);
privateSubLobbyItem->setText(COLUMN_NAME, tr("Private Subscribed chat rooms")); privateSubLobbyItem->setText(COLUMN_NAME, tr("Private Subscribed"));
privateSubLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "1"); privateSubLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "1");
// privateLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PRIVATE)); // privateLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PRIVATE));
privateSubLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE); privateSubLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE);
ui.lobbyTreeWidget->insertTopLevelItem(0, privateSubLobbyItem); ui.lobbyTreeWidget->insertTopLevelItem(0, privateSubLobbyItem);
publicSubLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER); publicSubLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER);
publicSubLobbyItem->setText(COLUMN_NAME, tr("Public Subscribed chat rooms")); publicSubLobbyItem->setText(COLUMN_NAME, tr("Public Subscribed"));
publicSubLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "2"); publicSubLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "2");
// publicLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PUBLIC)); // publicLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PUBLIC));
publicSubLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC); publicSubLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC);
ui.lobbyTreeWidget->insertTopLevelItem(1, publicSubLobbyItem); ui.lobbyTreeWidget->insertTopLevelItem(1, publicSubLobbyItem);
privateLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER); privateLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER);
privateLobbyItem->setText(COLUMN_NAME, tr("Private chat rooms")); privateLobbyItem->setText(COLUMN_NAME, tr("Private"));
privateLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "3"); privateLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "3");
// privateLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PRIVATE)); // privateLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PRIVATE));
privateLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE); privateLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PRIVATE);
ui.lobbyTreeWidget->insertTopLevelItem(2, privateLobbyItem); ui.lobbyTreeWidget->insertTopLevelItem(2, privateLobbyItem);
publicLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER); publicLobbyItem = new RSTreeWidgetItem(compareRole, TYPE_FOLDER);
publicLobbyItem->setText(COLUMN_NAME, tr("Public chat rooms")); publicLobbyItem->setText(COLUMN_NAME, tr("Public"));
publicLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "4"); publicLobbyItem->setData(COLUMN_NAME, ROLE_SORT, "4");
// publicLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PUBLIC)); // publicLobbyItem->setIcon(COLUMN_NAME, QIcon(IMAGE_PUBLIC));
publicLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC); publicLobbyItem->setData(COLUMN_DATA, ROLE_PRIVACYLEVEL, CHAT_LOBBY_PRIVACY_LEVEL_PUBLIC);
@ -721,9 +721,9 @@ void ChatLobbyWidget::updateDisplay()
} }
} }
publicSubLobbyItem->setHidden(publicSubLobbyItem->childCount()==0); publicSubLobbyItem->setHidden(publicSubLobbyItem->childCount()==0);
publicSubLobbyItem->setText(COLUMN_NAME, tr("Public Subscribed chat rooms")+ QString(" (") + QString::number(publicSubLobbyItem->childCount())+QString(")")); publicSubLobbyItem->setText(COLUMN_NAME, tr("Public Subscribed")+ QString(" (") + QString::number(publicSubLobbyItem->childCount())+QString(")"));
privateSubLobbyItem->setHidden(privateSubLobbyItem->childCount()==0); privateSubLobbyItem->setHidden(privateSubLobbyItem->childCount()==0);
publicLobbyItem->setText(COLUMN_NAME, tr("Public chat rooms")+ " (" + QString::number(publicLobbyItem->childCount())+QString(")")); publicLobbyItem->setText(COLUMN_NAME, tr("Public")+ " (" + QString::number(publicLobbyItem->childCount())+QString(")"));
} }
void ChatLobbyWidget::createChatLobby() void ChatLobbyWidget::createChatLobby()

16
retroshare-gui/src/gui/FileTransfer/DLListDelegate.cpp Normal file → Executable file
View file

@ -102,7 +102,7 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
multi *= 1024.0; multi *= 1024.0;
} }
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_REMAINING: case COLUMN_REMAINING:
remaining = index.data().toLongLong(); remaining = index.data().toLongLong();
@ -121,7 +121,7 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
multi *= 1024.0; multi *= 1024.0;
} }
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_COMPLETED: case COLUMN_COMPLETED:
completed = index.data().toLongLong(); completed = index.data().toLongLong();
@ -140,7 +140,7 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
multi *= 1024.0; multi *= 1024.0;
} }
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_DLSPEED: case COLUMN_DLSPEED:
dlspeed = index.data().toDouble(); dlspeed = index.data().toDouble();
@ -151,7 +151,7 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
temp.sprintf("%.2f", dlspeed/1024.); temp.sprintf("%.2f", dlspeed/1024.);
temp += " KB/s"; temp += " KB/s";
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_PROGRESS: case COLUMN_PROGRESS:
{ {
@ -236,7 +236,7 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off);
pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize));
if (pixmapRect.isValid()){ if (pixmapRect.isValid()){
QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft | Qt::AlignVCenter, pixmap.size(), option.rect).topLeft();
p.setX( p.x() + pixOffset); p.setX( p.x() + pixOffset);
painter->drawPixmap(p, pixmap); painter->drawPixmap(p, pixmap);
temp = " " + temp; temp = " " + temp;
@ -247,13 +247,13 @@ void DLListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off);
pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize));
if (pixmapRect.isValid()){ if (pixmapRect.isValid()){
QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft | Qt::AlignVCenter, pixmap.size(), option.rect).topLeft();
p.setX( p.x() + pixOffset); p.setX( p.x() + pixOffset);
painter->drawPixmap(p, pixmap); painter->drawPixmap(p, pixmap);
temp = " " + temp; temp = " " + temp;
pixOffset += pixmap.size().width(); pixOffset += pixmap.size().width();
} }
painter->drawText(option.rect.translated(pixOffset, 0), Qt::AlignLeft, temp); painter->drawText(option.rect.translated(pixOffset, 0), Qt::AlignLeft | Qt::AlignVCenter, temp);
} }
break; break;
case COLUMN_LASTDL: case COLUMN_LASTDL:
@ -279,7 +279,7 @@ QSize DLListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModel
{ {
float w = QFontMetricsF(option.font).width(index.data(Qt::DisplayRole).toString()); float w = QFontMetricsF(option.font).width(index.data(Qt::DisplayRole).toString());
int S = QFontMetricsF(option.font).height() ; int S = QFontMetricsF(option.font).height()*1.5 ;
return QSize(w,S); return QSize(w,S);
} }

View file

@ -325,7 +325,7 @@ void SearchDialog::checkText(const QString& txt)
ui.searchButton->setDisabled(txt.length() < 3); ui.searchButton->setDisabled(txt.length() < 3);
ui.searchLineFrame->setProperty("valid", (txt.length() >= 3)); ui.searchLineFrame->setProperty("valid", (txt.length() >= 3));
ui.searchLineFrame->style()->unpolish(ui.searchLineFrame); ui.searchLineFrame->style()->unpolish(ui.searchLineFrame);
Rshare::refreshStyleSheet(ui.searchLineFrame, false); RsApplication::refreshStyleSheet(ui.searchLineFrame, false);
} }
void SearchDialog::initialiseFileTypeMappings() void SearchDialog::initialiseFileTypeMappings()

View file

@ -1688,12 +1688,16 @@ bool SharedFilesDialog::tree_FilterItem(const QModelIndex &index, const QString
void SharedFilesDialog::updateFontSize() void SharedFilesDialog::updateFontSize()
{ {
#if defined(Q_OS_DARWIN)
int customFontSize = Settings->valueFromGroup("File", "MinimumFontSize", 13).toInt();
#else
int customFontSize = Settings->valueFromGroup("File", "MinimumFontSize", 11).toInt(); int customFontSize = Settings->valueFromGroup("File", "MinimumFontSize", 11).toInt();
#endif
QFont newFont = ui.dirTreeView->font(); QFont newFont = ui.dirTreeView->font();
if (newFont.pointSize() != customFontSize) { if (newFont.pointSize() != customFontSize) {
newFont.setPointSize(customFontSize); newFont.setPointSize(customFontSize);
QFontMetricsF fontMetrics(newFont); QFontMetricsF fontMetrics(newFont);
int iconHeight = fontMetrics.height(); int iconHeight = fontMetrics.height()*1.5;
ui.dirTreeView->setFont(newFont); ui.dirTreeView->setFont(newFont);
ui.dirTreeView->setIconSize(QSize(iconHeight, iconHeight)); ui.dirTreeView->setIconSize(QSize(iconHeight, iconHeight));
} }

12
retroshare-gui/src/gui/FileTransfer/ULListDelegate.cpp Normal file → Executable file
View file

@ -101,7 +101,7 @@ void ULListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
multi *= 1024.0; multi *= 1024.0;
} }
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_UTRANSFERRED: case COLUMN_UTRANSFERRED:
transferred = index.data().toLongLong(); transferred = index.data().toLongLong();
@ -120,7 +120,7 @@ void ULListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
multi *= 1024.0; multi *= 1024.0;
} }
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_ULSPEED: case COLUMN_ULSPEED:
ulspeed = index.data().toDouble(); ulspeed = index.data().toDouble();
@ -131,7 +131,7 @@ void ULListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
temp.sprintf("%.2f", ulspeed/1024.); temp.sprintf("%.2f", ulspeed/1024.);
temp += " KB/s"; temp += " KB/s";
} }
painter->drawText(option.rect, Qt::AlignRight, temp); painter->drawText(option.rect, Qt::AlignRight | Qt::AlignVCenter, temp);
break; break;
case COLUMN_UPROGRESS: case COLUMN_UPROGRESS:
{ {
@ -164,10 +164,10 @@ void ULListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & opti
pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off); pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off);
pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize)); pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize));
if (pixmapRect.isValid()){ if (pixmapRect.isValid()){
QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft(); QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft | Qt::AlignVCenter, pixmap.size(), option.rect).topLeft();
painter->drawPixmap(p, pixmap); painter->drawPixmap(p, pixmap);
} }
painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft, index.data().toString()); painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft | Qt::AlignVCenter, index.data().toString());
break; break;
default: default:
painter->drawText(option.rect, Qt::AlignCenter, index.data().toString()); painter->drawText(option.rect, Qt::AlignCenter, index.data().toString());
@ -181,7 +181,7 @@ QSize ULListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModel
{ {
float w = QFontMetricsF(option.font).width(index.data(Qt::DisplayRole).toString()); float w = QFontMetricsF(option.font).width(index.data(Qt::DisplayRole).toString());
int S = QFontMetricsF(option.font).height() ; int S = QFontMetricsF(option.font).height()*1.5 ;
return QSize(w,S); return QSize(w,S);
} }

View file

@ -254,7 +254,7 @@ void GenCertDialog::initKeyList()
void GenCertDialog::mouseMoveEvent(QMouseEvent *e) 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) ; QDialog::mouseMoveEvent(e) ;
} }
@ -669,7 +669,7 @@ void GenCertDialog::genPerson()
{ {
/* complete the process */ /* complete the process */
RsInit::LoadPassword(sslPasswd); 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. // 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. // (csoler) This is really bad: we have to guess that 30 secs will be enough. I have no better way to do this.

View file

@ -421,7 +421,7 @@ void GetStartedDialog::emailSupport()
sysVersion = "Linux"; sysVersion = "Linux";
#endif #endif
#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 , sysVersion
).arg(static_cast<typename std::underlying_type<RsConfigUserLvl>::type>(userLevel)) + "\n"; ).arg(static_cast<typename std::underlying_type<RsConfigUserLvl>::type>(userLevel)) + "\n";
text += "\n"; text += "\n";

View file

@ -80,7 +80,7 @@ HelpDialog::HelpDialog(QWidget *parent) :
ui->thanks->setHtml(in.readAll()); ui->thanks->setHtml(in.readAll());
} }
ui->version->setText(Rshare::retroshareVersion(true)); ui->version->setText(RsApplication::retroshareVersion(true));
/* Add version numbers of libretroshare */ /* Add version numbers of libretroshare */
std::list<RsLibraryInfo> libraries; std::list<RsLibraryInfo> libraries;

View file

@ -703,7 +703,7 @@ void IdEditDialog::updateInterface()
const QPixmap *pixmap = ui->avatarLabel->pixmap(); const QPixmap *pixmap = ui->avatarLabel->pixmap();
if (pixmap && !pixmap->isNull()) { if (pixmap && !pixmap->isNull()) {
ui->removeButton->setEnabled(true); ui->removeButton->setEnabled(true);
} else if (mEditGroup.mImage.mSize != NULL) { } else if (mEditGroup.mImage.mSize > 0) {
ui->removeButton->setEnabled(true); ui->removeButton->setEnabled(true);
} else { } else {
ui->removeButton->setEnabled(false); ui->removeButton->setEnabled(false);

View file

@ -32,6 +32,7 @@
#include <retroshare/rsplugin.h> #include <retroshare/rsplugin.h>
#include <retroshare/rsconfig.h> #include <retroshare/rsconfig.h>
#include <util/argstream.h>
#if defined(Q_OS_DARWIN) #if defined(Q_OS_DARWIN)
#include "gui/common/MacDockIconHandler.h" #include "gui/common/MacDockIconHandler.h"
@ -211,7 +212,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags)
hiddenmode = true; 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))); connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList)));
/* add url handler for RetroShare links */ /* add url handler for RetroShare links */
@ -1253,10 +1254,91 @@ void MainWindow::doQuit()
rApp->quit(); 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) void MainWindow::receiveNewArgs(QStringList args)
{ {
Rshare::parseArguments(args, false); RsInfo() << "Received new arguments from operating system call.";
processLastArgs();
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) 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.exists()) {
if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) {
RsCollection collection; RsCollection collection;
collection.openColl(qinfo.absoluteFilePath());
}
}
}
void MainWindow::processLastArgs() if(!collection.load(filename))
{ {
while (!Rshare::links()->isEmpty()) { RsErr() << "Could not open Rscollection file " << filename.toStdString();
std::cerr << "MainWindow::processLastArgs() : " << Rshare::links()->count() << std::endl; return;
/* Now use links from the command line, because no RetroShare was running */ }
RetroShareLink link(Rshare::links()->takeFirst()); collection.downloadFiles();
if (link.valid()) { //collection.openColl(qinfo.absoluteFilePath());
retroshareLinkActivated(link.toUrl());
} }
} }
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) void MainWindow::switchVisibilityStatus(StatusElement e,bool b)

View file

@ -214,7 +214,6 @@ public slots:
void externalLinkActivated(const QUrl &url); void externalLinkActivated(const QUrl &url);
void retroshareLinkActivated(const QUrl &url); void retroshareLinkActivated(const QUrl &url);
void openRsCollection(const QString &filename); void openRsCollection(const QString &filename);
void processLastArgs();
//! Go to a specific part of the control panel. //! Go to a specific part of the control panel.
void setNewPage(int page); void setNewPage(int page);
void setCompactStatusMode(bool compact); void setCompactStatusMode(bool compact);

View file

@ -41,7 +41,7 @@
PluginManager::PluginManager() PluginManager::PluginManager()
{ {
baseFolder = //qApp->applicationDirPath()+"///plugins" ; baseFolder = //qApp->applicationDirPath()+"///plugins" ;
Rshare::dataDirectory() + "/plugins" ; RsApplication::dataDirectory() + "/plugins" ;
lastError = "No error."; lastError = "No error.";
viewWidget = 0; viewWidget = 0;

View file

@ -123,7 +123,7 @@ void StartDialog::loadPerson()
rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ; rsNotify->cachePgpPassphrase(ui.password_input->text().toUtf8().constData()) ;
rsNotify->setDisableAskPassword(true); 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->setDisableAskPassword(false);
rsNotify->clearPgpPassphrase(); rsNotify->clearPgpPassphrase();

View file

@ -123,21 +123,21 @@ void WireGroupItem::setup()
void WireGroupItem::setGroupSet() void WireGroupItem::setGroupSet()
{ {
if (mGroup.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) { if (mGroup.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) {
toolButton_type->setText("Own"); toolButton_type->setText(tr("Own"));
toolButton_subscribe->setText("N/A"); toolButton_subscribe->setText(tr("N/A"));
toolButton_subscribe->setEnabled(false); toolButton_subscribe->setEnabled(false);
editButton->show(); editButton->show();
} }
else if (mGroup.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED) else if (mGroup.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED)
{ {
toolButton_type->setText("Following"); toolButton_type->setText(tr("Following"));
toolButton_subscribe->setText("Unfollow"); toolButton_subscribe->setText(tr("Unfollow"));
editButton->hide(); editButton->hide();
} }
else else
{ {
toolButton_type->setText("Other"); toolButton_type->setText(tr("Other"));
toolButton_subscribe->setText("Follow"); toolButton_subscribe->setText(tr("Follow"));
editButton->hide(); editButton->hide();
} }
} }

View file

@ -121,7 +121,7 @@ void AvatarWidget::setFrameType(FrameType type)
//refreshAvatarImage(); //refreshAvatarImage();
refreshStatus(); refreshStatus();
Rshare::refreshStyleSheet(this, false); RsApplication::refreshStyleSheet(this, false);
} }
void AvatarWidget::setId(const ChatId &id) void AvatarWidget::setId(const ChatId &id)
{ {
@ -174,7 +174,7 @@ void AvatarWidget::refreshStatus()
case NO_FRAME: case NO_FRAME:
case NORMAL_FRAME: case NORMAL_FRAME:
{ {
Rshare::refreshStyleSheet(this, false); RsApplication::refreshStyleSheet(this, false);
break; break;
} }
case STATUS_FRAME: case STATUS_FRAME:
@ -252,7 +252,7 @@ void AvatarWidget::updateStatus(int status)
mPeerState = status; mPeerState = status;
setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true); setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true);
Rshare::refreshStyleSheet(this, false); RsApplication::refreshStyleSheet(this, false);
} }
void AvatarWidget::updateAvatar(const QString &peerId) void AvatarWidget::updateAvatar(const QString &peerId)

View file

@ -127,7 +127,7 @@ FriendSelectionWidget::FriendSelectionWidget(QWidget *parent)
ui->filterLineEdit->showFilterIcon(); ui->filterLineEdit->showFilterIcon();
/* Refresh style to have the correct text color */ /* Refresh style to have the correct text color */
Rshare::refreshStyleSheet(this, false); RsApplication::refreshStyleSheet(this, false);
mEventHandlerId_identities = 0; mEventHandlerId_identities = 0;
rsEvents->registerEventsHandler( [this](std::shared_ptr<const RsEvent> event) { 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(); return item->data(COLUMN_DATA, ROLE_ID).toString().toStdString();
} }
void FriendSelectionWidget::sortByChecked(bool sort) void FriendSelectionWidget::sortByChecked(bool)
{ {
mCompareRole->clear(); mCompareRole->clear();
mCompareRole->setRole(COLUMN_NAME,ROLE_SORT_SELECTED); mCompareRole->setRole(COLUMN_NAME,ROLE_SORT_SELECTED);

View file

@ -234,8 +234,10 @@ void LineEditClear::setFilterButtonIcon(const QIcon &icon)
mFilterButton->setIcon(icon); mFilterButton->setIcon(icon);
ensurePolished(); ensurePolished();
#if !defined(Q_OS_DARWIN)
QFontMetrics fm(this->font()); QFontMetrics fm(this->font());
QSize size(fm.width("___"), fm.height()); QSize size(fm.width("___"), fm.height());
mFilterButton->setFixedSize(size); mFilterButton->setFixedSize(size);
mFilterButton->setIconSize(size); mFilterButton->setIconSize(size);
#endif
} }

View file

@ -117,7 +117,7 @@ HelpBrowser::~HelpBrowser()
QString QString
HelpBrowser::language() HelpBrowser::language()
{ {
QString lang = Rshare::language(); QString lang = RsApplication::language();
if (!QDir(":/help/" + lang).exists()) if (!QDir(":/help/" + lang).exists())
lang = "en"; lang = "en";
return lang; return lang;

View file

@ -54,7 +54,7 @@ HelpTextBrowser::loadResource(int type, const QUrl &name)
/* Fall back to English if there is no translation of the specified help /* Fall back to English if there is no translation of the specified help
* page in the current language. */ * page in the current language. */
if (!name.path().contains("/")) { if (!name.path().contains("/")) {
QString language = Rshare::language(); QString language = RsApplication::language();
if (!QDir(":/help/" + language).exists()) if (!QDir(":/help/" + language).exists())
language = "en"; language = "en";
helpPath += language + "/"; helpPath += language + "/";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before After
Before After

View file

@ -2,25 +2,28 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" id="svg4155"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4823"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xml:space="preserve" xml:space="preserve"
width="80" width="80"
height="80" height="80"
viewBox="0 0 80 80" viewBox="0 0 80 80"
sodipodi:docname="invite.svg"><metadata sodipodi:docname="invite.svg"
id="metadata4829"><rdf:RDF><cc:Work inkscape:export-filename="C:\Users\ProBook\Documents\GitHub\RetroShare\retroshare-gui\src\gui\icons\png\invite.png"
inkscape:export-xdpi="153.60001"
inkscape:export-ydpi="153.60001"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs4827" /><sodipodi:namedview id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff" pagecolor="#ffffff"
bordercolor="#666666" bordercolor="#666666"
borderopacity="1" borderopacity="1"
@ -29,46 +32,31 @@
guidetolerance="10" guidetolerance="10"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-width="1920" inkscape:window-width="1366"
inkscape:window-height="1009" inkscape:window-height="705"
id="namedview4825" id="namedview4157"
showgrid="false" showgrid="false"
showguides="true" inkscape:zoom="2.559375"
inkscape:guide-bbox="true" inkscape:cx="34.188034"
inkscape:zoom="1.475" inkscape:cy="69.352868"
inkscape:cx="-155.33838" inkscape:window-x="-8"
inkscape:cy="28.585876" inkscape:window-y="-8"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="g4831" /><g inkscape:current-layer="layer1"
id="g4831" inkscape:pagecheckerboard="0" /><g
id="g4163"
inkscape:groupmode="layer" inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX" inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path transform="matrix(1.25,0,0,-1.25,0,80)"
style="display:inline"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
id="path4835" id="path4167"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /></g><g
sodipodi:nodetypes="csasccsassc" inkscape:groupmode="layer"
d="m 33.346398,27.138373 c 2.012782,2.397011 3.817716,9.137224 3.780729,13.03223 -0.04053,4.268676 -4.147427,7.833723 -7.844104,7.839587 -3.89323,0.0062 -8.134746,-3.432459 -8.287329,-8.230168 C 20.876209,36.02303 22.815244,29.25428 24.970657,27.344578 24.73295,25.80496 23.829344,23.960201 21.144182,22.793431 19.6943,22.163465 15.581718,20.946417 15.626371,18.600543 c 0.04851,-2.548391 8.793599,-4.303905 13.521842,-4.28593 4.621336,0.01757 13.160147,1.682212 13.183878,4.289387 0.01639,1.800667 -5.45021,3.369885 -6.656712,4.623374 -1.535253,1.595043 -2.168834,3.07356 -2.328981,3.910999 z" id="layer1"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none" inkscape:label="forground"
id="use4155" style="display:inline"><path
inkscape:connector-curvature="0" /><path style="fill:#f9f9f9;stroke-width:0.115097"
inkscape:connector-curvature="0" d="m 16.369227,64.730725 c -2.410081,-0.519492 -4.393567,-2.486625 -4.89547,-4.855106 -0.230292,-1.086748 -0.232509,-8.437472 -0.0031,-10.160706 0.544804,-4.091726 2.311934,-7.6619 5.240845,-10.588196 0.729631,-0.728977 1.620855,-1.524992 1.9805,-1.768921 l 0.653899,-0.443506 0.870488,0.635708 c 1.713047,1.251025 4.034249,2.2608 6.317223,2.748136 1.666706,0.355784 4.587773,0.356708 6.248914,0.0019 2.717698,-0.580353 4.507782,-1.407765 7.126351,-3.293936 0.472315,-0.340212 5.163656,4.356013 4.822871,4.827896 -1.873071,2.593626 -2.716501,4.411741 -3.283366,7.077697 -0.3636,1.710005 -0.366662,4.607965 -0.0066,6.294485 0.619445,2.901855 2.005028,5.663034 3.887193,7.746366 0.407391,0.450932 0.415297,0.475502 0.20546,0.638472 -0.545416,0.423596 -2.110246,1.093106 -2.807926,1.201366 -0.471223,0.07313 -5.349087,0.113024 -13.178634,0.107808 -10.202918,-0.0067 -12.564565,-0.03718 -13.178629,-0.169543 z m 39.420806,0.0498 c -4.989364,-0.623224 -9.270985,-4.31662 -10.693102,-9.224051 -1.670749,-5.765402 1.045758,-12.068253 6.384936,-14.81436 2.550296,-1.311698 5.092938,-1.744661 7.818632,-1.331366 2.790409,0.423106 5.148972,1.616342 7.149858,3.617227 6.209256,6.209257 4.488252,16.634919 -3.383501,20.496904 -2.348935,1.152418 -4.765258,1.569365 -7.276823,1.255646 z M 58.3181,57.212066 c 0.613555,-0.348996 0.802549,-0.844473 0.85019,-2.228919 l 0.04257,-1.237296 1.224561,-4.6e-4 c 1.026113,-3.45e-4 1.286453,-0.03817 1.60646,-0.233264 0.506112,-0.308566 0.877263,-1.129212 0.76979,-1.702082 -0.199788,-1.064967 -0.953807,-1.510795 -2.561627,-1.514613 l -1.064649,-0.0025 -0.0026,-1.064649 c -0.0038,-1.607821 -0.449645,-2.36184 -1.514612,-2.561627 -0.572871,-0.107472 -1.393515,0.263677 -1.702082,0.769789 -0.195498,0.320659 -0.232903,0.580298 -0.233265,1.619192 l -4.25e-4,1.237295 h -1.12656 c -0.940194,0 -1.211113,0.04284 -1.637501,0.258969 -0.911823,0.462175 -1.238494,1.559926 -0.71455,2.401192 0.397339,0.637989 0.639056,0.729347 2.09747,0.792756 l 1.323618,0.05755 0.05755,1.323619 c 0.06014,1.383222 0.154758,1.663359 0.68795,2.036821 0.579138,0.405644 1.239785,0.422433 1.897665,0.04823 z M 28.051598,37.042095 C 23.062233,36.418873 18.780612,32.725476 17.358495,27.818044 15.67366,22.00403 18.44977,15.656315 23.867225,12.935506 c 2.497687,-1.254414 5.02093,-1.66863 7.694839,-1.263188 2.790408,0.423107 5.148971,1.616342 7.149857,3.617228 6.209256,6.209257 4.488253,16.634919 -3.3835,20.496904 -2.348935,1.152417 -4.765259,1.569364 -7.276823,1.255645 z"
id="path4839" id="path1478" /></g></svg>
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 33.346398,28.617307 c 2.012782,2.397011 3.817716,9.137224 3.780729,13.03223 -0.04053,4.268677 -4.147427,7.833723 -7.844104,7.839587 -3.89323,0.0062 -8.134746,-3.432459 -8.287329,-8.230168 -0.119485,-3.756992 1.81955,-10.525742 3.974963,-12.435444 -0.237707,-1.539618 -1.141313,-3.384377 -3.826475,-4.551147 -1.449882,-0.629966 -5.562464,-1.847014 -5.517811,-4.192888 0.04851,-2.54839 8.793599,-4.303905 13.521842,-4.28593 4.621336,0.01757 13.160147,1.682212 13.183878,4.289387 0.01639,1.800667 -5.45021,3.369885 -6.656712,4.623374 -1.535253,1.595044 -2.168834,3.07356 -2.328981,3.910999 z"
sodipodi:nodetypes="csasccsassc" /><path
inkscape:connector-curvature="0"
id="path5440"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
d="m 46.384917,23.38757 c -1.021112,0 -1.848668,0.827556 -1.848668,1.848667 l 0,3.697335 -3.697335,0 c -1.021112,0 -1.848668,0.827556 -1.848668,1.848668 0,1.021112 0.827556,1.848668 1.848668,1.848668 l 3.697335,0 0,3.697335 c 0,1.021111 0.827556,1.848668 1.848668,1.848668 1.021111,0 1.848667,-0.827557 1.848667,-1.848668 l 0,-3.697335 3.697336,0 c 1.021111,0 1.848667,-0.827556 1.848667,-1.848668 0,-1.021112 -0.827556,-1.848668 -1.848667,-1.848668 l -3.697336,0 0,-3.697335 c 0,-1.021111 -0.827556,-1.848667 -1.848667,-1.848667" /><path
inkscape:connector-curvature="0"
id="path5452"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 53.779587,32.010539 c 0,-1.021111 -0.827556,-1.848667 -1.848667,-1.848667 l -11.092006,0 c -1.021112,0 -1.848668,0.827556 -1.848668,1.848667 0,1.021112 0.827556,1.848668 1.848668,1.848668 l 11.092006,0 c 1.021111,0 1.848667,-0.827556 1.848667,-1.848668" /><path
inkscape:connector-curvature="0"
id="path5456"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 46.384917,24.615869 c -1.021112,0 -1.848668,0.827556 -1.848668,1.848667 l 0,11.092006 c 0,1.021112 0.827556,1.848668 1.848668,1.848668 1.021111,0 1.848667,-0.827556 1.848667,-1.848668 l 0,-11.092006 c 0,-1.021111 -0.827556,-1.848667 -1.848667,-1.848667" /></g></svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before After
Before After

View file

@ -45,13 +45,13 @@ ProfileWidget::ProfileWidget(QWidget *parent, Qt::WindowFlags flags)
connect(ui.CopyCertButton,SIGNAL(clicked()), this, SLOT(copyCert())); connect(ui.CopyCertButton,SIGNAL(clicked()), this, SLOT(copyCert()));
connect(ui.profile_Button,SIGNAL(clicked()), this, SLOT(profilemanager())); 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*/ ) void ProfileWidget::showEvent ( QShowEvent * /*event*/ )
{ {
/* set retroshare version */ /* set retroshare version */
ui.version->setText(Rshare::retroshareVersion(true)); ui.version->setText(RsApplication::retroshareVersion(true));
RsPeerDetails detail; RsPeerDetails detail;
if (rsPeers->getPeerDetails(rsPeers->getOwnId(),detail)) if (rsPeers->getPeerDetails(rsPeers->getOwnId(),detail))

View file

@ -84,7 +84,7 @@ AppearancePage::AppearancePage(QWidget * parent, Qt::WindowFlags flags)
} }
QMap<QString, QString> styleSheets; QMap<QString, QString> styleSheets;
Rshare::getAvailableStyleSheets(styleSheets); RsApplication::getAvailableStyleSheets(styleSheets);
foreach (QString name, styleSheets.keys()) { foreach (QString name, styleSheets.keys()) {
ui.cmboStyleSheet->addItem(name, styleSheets[name]); ui.cmboStyleSheet->addItem(name, styleSheets[name]);
@ -136,7 +136,7 @@ void AppearancePage::updateInterfaceStyle()
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
#endif #endif
Rshare::setStyle(ui.cmboStyle->currentText()); RsApplication::setStyle(ui.cmboStyle->currentText());
Settings->setInterfaceStyle(ui.cmboStyle->currentText()); Settings->setInterfaceStyle(ui.cmboStyle->currentText());
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
@ -152,7 +152,7 @@ void AppearancePage::loadStyleSheet(int index)
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
#endif #endif
Rshare::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString()); RsApplication::loadStyleSheet(ui.cmboStyleSheet->itemData(index).toString());
#ifndef QT_NO_CURSOR #ifndef QT_NO_CURSOR
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
#endif #endif
@ -251,7 +251,7 @@ void AppearancePage::updateCmboToolButtonSize()
// NotifyQt::getInstance()->notifySettingsChanged(); // 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 */ /** Loads the settings for this page */
void AppearancePage::load() void AppearancePage::load()
@ -259,7 +259,7 @@ void AppearancePage::load()
int index = ui.cmboLanguage->findData(Settings->getLanguageCode()); int index = ui.cmboLanguage->findData(Settings->getLanguageCode());
whileBlocking(ui.cmboLanguage)->setCurrentIndex(index); whileBlocking(ui.cmboLanguage)->setCurrentIndex(index);
index = ui.cmboStyle->findData(Rshare::style().toLower()); index = ui.cmboStyle->findData(RsApplication::style().toLower());
whileBlocking(ui.cmboStyle)->setCurrentIndex(index); whileBlocking(ui.cmboStyle)->setCurrentIndex(index);
index = ui.cmboStyleSheet->findData(Settings->getSheetName()); index = ui.cmboStyleSheet->findData(Settings->getSheetName());

View file

@ -66,7 +66,7 @@ CryptoPage::CryptoPage(QWidget * parent, Qt::WindowFlags flags)
ui.retroshareId_content_LB->hide(); ui.retroshareId_content_LB->hide();
ui.stackPageCertificate->hide(); ui.stackPageCertificate->hide();
ui.onlinesince->setText(DateTime::formatLongDateTime(Rshare::startupTime())); ui.onlinesince->setText(DateTime::formatLongDateTime(RsApplication::startupTime()));
} }
#ifdef UNUSED_CODE #ifdef UNUSED_CODE
@ -111,7 +111,7 @@ void CryptoPage::showEvent ( QShowEvent * /*event*/ )
ui.retroshareId_content_LB->setText(QString::fromUtf8(invite.c_str())); ui.retroshareId_content_LB->setText(QString::fromUtf8(invite.c_str()));
/* set retroshare version */ /* set retroshare version */
ui.version->setText(Rshare::retroshareVersion(true)); ui.version->setText(RsApplication::retroshareVersion(true));
std::list<RsPgpId> ids; std::list<RsPgpId> ids;
ids.clear(); ids.clear();

View file

@ -146,10 +146,10 @@
<item row="5" column="0"> <item row="5" column="0">
<widget class="QCheckBox" name="useLocalServer"> <widget class="QCheckBox" name="useLocalServer">
<property name="toolTip"> <property name="toolTip">
<string>When checked, this instance receives new parameters (like RsLink or RsFile) and avoid new one.</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When checked, this retroshare instance will accept calls by your operating system to open Retroshare collection files, and download links.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>Use Local Server to get new arguments.</string> <string>Accept operating systems calls</string>
</property> </property>
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>

View file

@ -204,7 +204,11 @@ void TransferPage::load()
whileBlocking(ui.suffixesIgnoreList_LE)->setText( ignore_suffixes_string ); whileBlocking(ui.suffixesIgnoreList_LE)->setText( ignore_suffixes_string );
Settings->beginGroup(QString("File")); Settings->beginGroup(QString("File"));
#if defined(Q_OS_DARWIN)
whileBlocking(ui.minimumFontSize_SB)->setValue( Settings->value("MinimumFontSize", 13 ).toInt());
#else
whileBlocking(ui.minimumFontSize_SB)->setValue( Settings->value("MinimumFontSize", 11 ).toInt()); whileBlocking(ui.minimumFontSize_SB)->setValue( Settings->value("MinimumFontSize", 11 ).toInt());
#endif
Settings->endGroup(); Settings->endGroup();
} }

View file

@ -910,7 +910,7 @@ void RshareSettings::setUseLocalServer(bool value)
{ {
if (value != getUseLocalServer()) { if (value != getUseLocalServer()) {
setValue("UseLocalServer", value); setValue("UseLocalServer", value);
Rshare::updateLocalServer(); RsApplication::updateLocalServer();
} }
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,10 @@ CrashStackTrace gCrashStackTrace;
#include <QObject> #include <QObject>
#include <QMessageBox> #include <QMessageBox>
#include <QSplashScreen> #include <QSplashScreen>
#include <QMessageBox>
#include <QBuffer>
#include <QSharedMemory>
#include <QLocalSocket>
#include <rshare.h> #include <rshare.h>
#include "gui/common/FilesDefs.h" #include "gui/common/FilesDefs.h"
@ -106,6 +110,134 @@ __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
#include "gui/notifyqt.h" #include "gui/notifyqt.h"
#include <unistd.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() static void displayWarningAboutDSAKeys()
{ {
std::map<std::string,std::vector<std::string> > unsupported_keys; 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(images);
Q_INIT_RESOURCE(icons); 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 // This is needed to allocate rsNotify, so that it can be used to ask for PGP passphrase
// //
RsControl::earlyInitNotificationSystem() ; RsControl::earlyInitNotificationSystem() ;
@ -230,30 +351,80 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
/* RetroShare Core Objects */ /* RetroShare Core Objects */
RsInit::InitRsConfig(); 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); argstream as(argc,argv);
as >> option('s',"stderr" ,conf.outStderr ,"output to stderr instead of log file." ) as >> option( 's',"stderr" ,conf.outStderr ,"output to stderr instead of log file " )
>> option('u',"udp" ,conf.udpListenerOnly,"Only listen to UDP." ) >> option( 'u',"udp" ,conf.udpListenerOnly ,"Only listen to UDP " )
>> parameter('c',"base-dir" ,conf.optBaseDir ,"directory", "Set base directory." ,false) >> option( 'R',"reset" ,conf.optResetParams ,"reset retroshare parameters " )
>> parameter('l',"log-file" ,conf.logfname ,"logfile" ,"Set Log filename." ,false) >> parameter('c',"base-dir" ,conf.optBaseDir ,"directory" ,"Set base directory " ,false)
>> parameter('d',"debug-level" ,conf.debugLevel ,"level" ,"Set debug level." ,false) >> parameter('l',"log-file" ,logfilename ,"logfile" ,"Set Log filename " ,false)
>> parameter('i',"ip-address" ,conf.forcedInetAddress,"nnn.nnn.nnn.nnn", "Force IP address to use (if cannot be detected)." ,false) >> parameter('d',"debug-level" ,loglevel ,"level (debug,info,notice,warn,error,off)","Set debug level " ,false)
>> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port to use." ,false) >> parameter('i',"ip-address" ,conf.forcedInetAddress ,"nnn.nnn.nnn.nnn" ,"Force IP address " ,false)
>> parameter('o',"opmode" ,conf.opModeStr ,"opmode" ,"Set Operating mode (Full, NoTurtle, Gaming, Minimal)." ,false) >> parameter('p',"port" ,conf.forcedPort ,"port" ,"Set listenning port " ,false)
>> parameter('t',"opmode" ,conf.userSuppliedTorExecutable,"tor" ,"supply full tor eecutable path." ,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 #ifdef RS_JSONAPI
as >> parameter('J', "jsonApiPort", conf.jsonApiPort, "jsonApiPort", "Enable JSON API on the specified port", false ) 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 #endif // ifdef RS_JSONAPI
#ifdef LOCALNET_TESTING #ifdef LOCALNET_TESTING
as >> parameter('R',"restrict-port" ,portRestrictions ,"port1-port2","Apply port restriction" ,false); as >> parameter('R',"restrict-port" ,portRestrictions ,"port1-port2","Apply port restriction " ,false);
#endif // ifdef LOCALNET_TESTING #endif // ifdef LOCALNET_TESTING
#ifdef RS_AUTOLOGIN #ifdef RS_AUTOLOGIN
as >> option('a',"auto-login" ,conf.autoLogin ,"AutoLogin (Windows Only) + StartMinimised"); as >> option('a',"auto-login" ,conf.autoLogin ,"AutoLogin (Windows Only) + StartMinimised");
#endif // ifdef RS_AUTOLOGIN #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]; conf.main_executable_path = argv[0];
@ -263,7 +434,9 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
{ {
QApplication dummyApp (argc, argv); // needed for QMessageBox QApplication dummyApp (argc, argv); // needed for QMessageBox
/* Translate into the desired language */ /* Translate into the desired language */
LanguageSupport::translate(LanguageSupport::defaultLanguageCode());
if(!setLanguage(language))
return 1;
QMessageBox msgBox; 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.")); 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 */ /* Error occured */
QApplication dummyApp (argc, argv); // needed for QMessageBox QApplication dummyApp (argc, argv); // needed for QMessageBox
/* Translate into the desired language */ /* Translate into the desired language */
LanguageSupport::translate(LanguageSupport::defaultLanguageCode());
if(!setLanguage(language))
return 1;
displayWarningAboutDSAKeys(); displayWarningAboutDSAKeys();
@ -322,8 +497,15 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
in this case it can be use only for default values */ in this case it can be use only for default values */
RshareSettings::Create (); RshareSettings::Create ();
if(LanguageSupport::isValidLanguageCode(QString::fromStdString(language)))
conf.language = QString::fromStdString(language);
/* Setup The GUI Stuff */ /* 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 */ /* Start RetroShare */
QString sDefaultGXSIdToCreate = ""; QString sDefaultGXSIdToCreate = "";
@ -371,7 +553,11 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
RsAccounts::GetPreferredAccountId(preferredId); RsAccounts::GetPreferredAccountId(preferredId);
// true: note auto-login is active // true: note auto-login is active
Rshare::loadCertificate(preferredId, true); if(!RsApplication::loadCertificate(preferredId, true))
{
RsErr() << "Retroshare auto-login startup failed." ;
return 1;
}
} }
break; break;
default: default:
@ -383,7 +569,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
/* recreate global settings object, now with correct path, specific to the selected node */ /* recreate global settings object, now with correct path, specific to the selected node */
RshareSettings::Create(true); RshareSettings::Create(true);
Rshare::resetLanguageAndStyle(); RsApplication::resetLanguageAndStyle();
SoundManager::create(); SoundManager::create();
@ -402,7 +588,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
std::string tor_hidden_service_dir = RsAccounts::AccountDirectory() + "/hidden_service/" ; 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 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)) ; 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) ; 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); splashScreen.showMessage(rshare.translate("SplashScreen", "Create interface"), Qt::AlignHCenter | Qt::AlignBottom);
QCoreApplication::processEvents(); // forces splashscreen to show up 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 ;) * only on the first run - as the user might want to change it ;)
*/ */
QString osx_style("cleanlooks"); QString osx_style("cleanlooks");
Rshare::setStyle(osx_style); RsApplication::setStyle(osx_style);
Settings->setInterfaceStyle(osx_style); Settings->setInterfaceStyle(osx_style);
#endif #endif
@ -523,8 +709,6 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
MainWindow *w = MainWindow::Create (); MainWindow *w = MainWindow::Create ();
splashScreen.finish(w); splashScreen.finish(w);
w->processLastArgs();
if (!sDefaultGXSIdToCreate.isEmpty()) { if (!sDefaultGXSIdToCreate.isEmpty()) {
RsIdentityParameters params; RsIdentityParameters params;
params.nickname = sDefaultGXSIdToCreate.toUtf8().constData(); params.nickname = sDefaultGXSIdToCreate.toUtf8().constData();

View file

@ -50,55 +50,22 @@
#include <lang/languagesupport.h> #include <lang/languagesupport.h>
#include <util/stringutil.h> #include <util/stringutil.h>
#include <util/argstream.h>
#include <retroshare/rsinit.h> #include <retroshare/rsinit.h>
#include <retroshare/rsversion.h> #include <retroshare/rsversion.h>
#include <retroshare/rsplugin.h> #include <retroshare/rsplugin.h>
#include "rshare.h" #include "rshare.h"
/* Available command-line arguments. */ #ifdef __APPLE__
#define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ QStringList RsApplication::_links; /**< List of links passed by arguments. */
#define ARG_DATADIR "datadir" /**< Directory to use for data files. */ QStringList RsApplication::_files; /**< List of files passed by arguments. */
#define ARG_LOGFILE "logfile" /**< Location of our logfile. */ #endif
#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
// The arguments here can be send to a running instance. Log RsApplication::log_output; /**< Logs debugging messages to file or stdout. */
// If the command line contains arguments not listed here, we have to start a new instance. RsGUIConfigOptions RsApplication::options;
// For example, the user wants to start a second instance using --base-dir arg of libretroshare. QDateTime RsApplication::mStartupTime;
static const char* const forwardableArgs[] = { QLocalServer* RsApplication::localServer;
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;
/** Catches debugging messages from Qt and sends them to RetroShare's logs. If Qt /** 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(). * 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() /** Constructor. Parses the command-line arguments, resets RsApplication's
{
// 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
* configuration (if requested), and sets up the GUI style and language * configuration (if requested), and sets up the GUI style and language
* translation. */ * translation.
Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir) * the const_cast below is truely horrible, but it allows to hide these unused argc/argv
: QApplication(argc, argv) * when initing RsApplication
*/
RsApplication::RsApplication(const RsGUIConfigOptions& conf)
: QApplication(const_cast<RsGUIConfigOptions*>(&conf)->argc,const_cast<RsGUIConfigOptions*>(&conf)->argv)
{ {
mStartupTime = QDateTime::currentDateTime(); mStartupTime = QDateTime::currentDateTime();
localServer = NULL; 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 // So we start a Local Server to listen for connections from new process
localServer= new QLocalServer(); localServer= new QLocalServer();
QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished())); QObject::connect(localServer, SIGNAL(newConnection()), this, SLOT(slotConnectionEstablished()));
updateLocalServer(); updateLocalServer();
// clear out any old arguments (race condition?) // clear out any old arguments (race condition?)
QSharedMemory newArgs; QSharedMemory newArgs;
newArgs.setKey(QString(TARGET) + "_newArgs"); newArgs.setKey(QString(TARGET) + "_newArgs");
if(newArgs.attach(QSharedMemory::ReadWrite)) if(newArgs.attach(QSharedMemory::ReadWrite))
newArgs.detach(); newArgs.detach();
}
}
#if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0)
qInstallMessageHandler(qt_msg_handler); 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())); connect(timer, SIGNAL(timeout()), this, SIGNAL(minuteTick()));
timer->start(); timer->start();
/* Read in all our command-line arguments. */
parseArguments(args);
/* Check if we're supposed to reset our config before proceeding. */ /* 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(); Settings->reset();
} }
/* Handle the -loglevel and -logfile options. */ /* Handle the -loglevel and -logfile options. */
if (_args.contains(ARG_LOGFILE)) if (options.logLevel != "Off")
_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 != "")
{ {
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. */ /** Initialize support for language translations. */
@ -320,7 +180,7 @@ Rshare::Rshare(QStringList args, int &argc, char **argv, const QString &dir)
} }
/** Destructor */ /** Destructor */
Rshare::~Rshare() RsApplication::~RsApplication()
{ {
/* Cleanup GxsIdDetails */ /* Cleanup GxsIdDetails */
GxsIdDetails::cleanup(); GxsIdDetails::cleanup();
@ -334,7 +194,7 @@ Rshare::~Rshare()
/** /**
* @brief Executed when new instance connect command is sent to LocalServer * @brief Executed when new instance connect command is sent to LocalServer
*/ */
void Rshare::slotConnectionEstablished() void RsApplication::slotConnectionEstablished()
{ {
QSharedMemory newArgs; QSharedMemory newArgs;
newArgs.setKey(QString(TARGET) + "_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 /* this is not an error. It just means we were notified to check
newArgs, but none had been set yet. newArgs, but none had been set yet.
TODO: implement separate ping/take messages 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; << newArgs.errorString().toStdString() << std::endl;
*/ */
socket->close(); socket->close();
@ -357,6 +217,11 @@ void Rshare::slotConnectionEstablished()
socket->close(); socket->close();
delete socket; delete socket;
if(newArgs.error())
{
RsErr() << "Something when wrong in receiving arguments from operating system: " << newArgs.errorString().toStdString() ;
return ;
}
QBuffer buffer; QBuffer buffer;
QDataStream in(&buffer); QDataStream in(&buffer);
QStringList args; QStringList args;
@ -371,22 +236,22 @@ void Rshare::slotConnectionEstablished()
emit newArgsReceived(args); emit newArgsReceived(args);
while (!args.empty()) 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 /** Enters the main event loop and waits until exit() is called. The signal
* running() will be emitted when the event loop has started. */ * running() will be emitted when the event loop has started. */
int int
Rshare::run() RsApplication::run()
{ {
QTimer::singleShot(0, rApp, SLOT(onEventLoopStarted())); QTimer::singleShot(0, rApp, SLOT(onEventLoopStarted()));
return rApp->exec(); return rApp->exec();
} }
QDateTime Rshare::startupTime() QDateTime RsApplication::startupTime()
{ {
return mStartupTime; return mStartupTime;
} }
@ -395,203 +260,17 @@ QDateTime Rshare::startupTime()
* will emit the running() signal to indicate that the application's event * will emit the running() signal to indicate that the application's event
* loop is running. */ * loop is running. */
void void
Rshare::onEventLoopStarted() RsApplication::onEventLoopStarted()
{ {
emit running(); 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" &lt;dir&gt;") +
tcol(tr("Sets the directory RetroShare uses for data files.")));
out << trow(tcol("-" ARG_LOGFILE" &lt;" + tr("filename") + "&gt;") +
tcol(tr("Sets the name and location of RetroShare's logfile.")));
out << trow(tcol("-" ARG_LOGLEVEL" &lt;" + tr("level") + "&gt;") +
tcol(tr("Sets the verbosity of RetroShare's logging.") +
"<br>[" + Log::logLevels().join("|") +"]"));
out << trow(tcol("-" ARG_GUISTYLE" &lt;" + tr("style") +"&gt;") +
tcol(tr("Sets RetroShare's interface style.") +
"<br>[" + QStyleFactory::keys().join("|") + "]"));
out << trow(tcol("-" ARG_GUISTYLESHEET" &lt;" + tr("stylesheet") + "&gt;") +
tcol(tr("Sets RetroShare's interface stylesheets.")));
out << trow(tcol("-" ARG_LANGUAGE" &lt;" + tr("language") + "&gt;") +
tcol(tr("Sets RetroShare's language.") +
"<br>[" + LanguageSupport::languageCodes().join("|") + "]"));
out << trow(tcol("--" ARG_OPMODE_L" &lt;" + tr("opmode") + "&gt;") +
tcol(tr("Sets RetroShare's operating mode.") +
"<br>[full|noturtle|gaming|minimal]"));
out << trow(tcol("-" ARG_RSLINK_L" &lt;" + tr("RsLinkURL") + "&gt;") +
tcol(tr("Open RsLink with protocol retroshare://")));
out << trow(tcol("-" ARG_RSFILE_L" &lt;" + tr("filename") + "&gt;") +
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 /** 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 * 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 * saved previously. If not, we'll default to one appropriate for the system
* locale. */ * locale. */
bool bool
Rshare::setLanguage(QString languageCode) RsApplication::setLanguage(QString languageCode)
{ {
/* If the language code is empty, use the previously-saved setting */ /* If the language code is empty, use the previously-saved setting */
if (languageCode.isEmpty()) { if (languageCode.isEmpty()) {
@ -599,7 +278,7 @@ Rshare::setLanguage(QString languageCode)
} }
/* Translate into the desired language */ /* Translate into the desired language */
if (LanguageSupport::translate(languageCode)) { if (LanguageSupport::translate(languageCode)) {
_language = languageCode; options.language = languageCode;
return true; return true;
} }
return false; return false;
@ -610,7 +289,7 @@ Rshare::setLanguage(QString languageCode)
* saved previously. If not, we'll default to the system * saved previously. If not, we'll default to the system
* locale. */ * locale. */
bool bool
Rshare::setLocale(QString languageCode) RsApplication::setLocale(QString languageCode)
{ {
bool retVal = false; bool retVal = false;
/* If the language code is empty, use the previously-saved setting */ /* 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. */ /** customize date format for feeds etc. */
void Rshare::customizeDateFormat() void RsApplication::customizeDateFormat()
{ {
QLocale locale = QLocale(); // set to default locale QLocale locale = QLocale(); // set to default locale
/* get long date format without weekday */ /* get long date format without weekday */
_dateformat = locale.dateFormat(QLocale::LongFormat); options.dateformat = locale.dateFormat(QLocale::LongFormat);
_dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), ""); options.dateformat.replace(QRegExp("^dddd,*[^ ]* *('[^']+' )*"), "");
_dateformat.replace(QRegExp(",* *dddd"), ""); options.dateformat.replace(QRegExp(",* *dddd"), "");
_dateformat = _dateformat.trimmed(); options.dateformat = options.dateformat.trimmed();
} }
/** Get custom date format (defaultlongformat) */ /** 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 /** 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 * saved previously. If not, we'll default to one appropriate for the
* operating system. */ * operating system. */
bool bool
Rshare::setStyle(QString styleKey) RsApplication::setStyle(QString styleKey)
{ {
/* If no style was specified, use the previously-saved setting */ /* If no style was specified, use the previously-saved setting */
if (styleKey.isEmpty()) { if (styleKey.isEmpty()) {
styleKey = Settings->getInterfaceStyle(); styleKey = Settings->getInterfaceStyle();
} }
/* Apply the specified GUI style */ /* Apply the specified GUI style */
if (QApplication::setStyle(styleKey)) { if (QApplication::setStyle(styleKey))
_style = styleKey; {
options.guiStyle = styleKey;
return true; return true;
} }
return false; return false;
} }
bool bool
Rshare::setSheet(QString sheet) RsApplication::setSheet(QString sheet)
{ {
/* If no stylesheet was specified, use the previously-saved setting */ /* If no stylesheet was specified, use the previously-saved setting */
if (sheet.isEmpty()) { if (sheet.isEmpty()) {
sheet = Settings->getSheetName(); sheet = Settings->getSheetName();
} }
/* Apply the specified GUI stylesheet */ /* Apply the specified GUI stylesheet */
_stylesheet = sheet; options.guiStyleSheetFile = sheet;
/* load the StyleSheet*/ /* load the StyleSheet*/
loadStyleSheet(_stylesheet); loadStyleSheet(options.guiStyleSheetFile);
return true; return true;
} }
void Rshare::resetLanguageAndStyle() void RsApplication::resetLanguageAndStyle()
{ {
/** Translate the GUI to the appropriate language. */ /** Translate the GUI to the appropriate language. */
setLanguage(_args.value(ARG_LANGUAGE)); setLanguage(options.language);
/** Set the locale appropriately. */ /** Set the locale appropriately. */
setLocale(_args.value(ARG_LANGUAGE)); setLocale(options.language);
/** Set the GUI style appropriately. */ /** Set the GUI style appropriately. */
setStyle(_args.value(ARG_GUISTYLE)); setStyle(options.guiStyle);
/** Set the GUI stylesheet appropriately. */ /** Set the GUI stylesheet appropriately. */
setSheet(_args.value(ARG_GUISTYLESHEET)); setSheet(options.guiStyleSheetFile);
} }
// RetroShare: // RetroShare:
@ -714,7 +394,7 @@ void Rshare::resetLanguageAndStyle()
// Language depended stylesheet // Language depended stylesheet
// <Internal|External>_<locale>.lqss // <Internal|External>_<locale>.lqss
void Rshare::loadStyleSheet(const QString &sheetName) void RsApplication::loadStyleSheet(const QString &sheetName)
{ {
QString locale = QLocale().name(); QString locale = QLocale().name();
QString styleSheet; QString styleSheet;
@ -785,7 +465,7 @@ void Rshare::loadStyleSheet(const QString &sheetName)
} }
/** get list of available stylesheets **/ /** 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")); QFileInfoList fileInfoList = QDir(":/qss/stylesheet/").entryInfoList(QStringList("*.qss"));
QFileInfo fileInfo; 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) { if (widget != NULL) {
// force widget to recalculate valid style // force widget to recalculate valid style
@ -839,40 +519,35 @@ void Rshare::refreshStyleSheet(QWidget *widget, bool processChildren)
} }
/** Initialize plugins. */ /** Initialize plugins. */
void Rshare::initPlugins() void RsApplication::initPlugins()
{ {
loadStyleSheet(_stylesheet); loadStyleSheet(options.guiStyleSheetFile);
LanguageSupport::translatePlugins(_language); LanguageSupport::translatePlugins(options.language);
} }
/** Returns the directory RetroShare uses for its data files. */ /** Returns the directory RetroShare uses for its data files. */
QString QString RsApplication::dataDirectory()
Rshare::dataDirectory()
{ {
if (useConfigDir) if(!options.optBaseDir.empty())
{ return QString::fromUtf8(options.optBaseDir.c_str());
return configDir; else
}
else if (_args.contains(ARG_DATADIR)) {
return _args.value(ARG_DATADIR);
}
return defaultDataDirectory(); return defaultDataDirectory();
} }
/** Returns the default location of RetroShare's data directory. */ /** Returns the default location of RetroShare's data directory. */
QString QString
Rshare::defaultDataDirectory() RsApplication::defaultDataDirectory()
{ {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
return (win32_app_data_folder() + "\\RetroShare"); return (win32_app_data_folder() + "\\RetroShare");
#else #else
return (QDir::homePath() + "/.RetroShare"); return (QDir::homePath() + "/.retroshare");
#endif #endif
} }
/** Creates Rshare's data directory, if it doesn't already exist. */ /** Creates RsApplication's data directory, if it doesn't already exist. */
bool bool
Rshare::createDataDirectory(QString *errmsg) RsApplication::createDataDirectory(QString *errmsg)
{ {
QDir datadir(dataDirectory()); QDir datadir(dataDirectory());
if (!datadir.exists()) { if (!datadir.exists()) {
@ -885,33 +560,29 @@ Rshare::createDataDirectory(QString *errmsg)
return true; return true;
} }
/** Set Rshare's data directory - externally */ /** Set RsApplication's data directory - externally */
bool Rshare::setConfigDirectory(const QString& dir) bool RsApplication::setConfigDirectory(const QString& dir)
{ {
useConfigDir = true; options.optBaseDir = std::string(dir.toUtf8());
configDir = dir;
return true; return true;
} }
/** Writes <b>msg</b> with severity <b>level</b> to RetroShare's log. */ /** Writes <b>msg</b> with severity <b>level</b> to RetroShare's log. */
Log::LogMessage Log::LogMessage RsApplication::log(Log::LogLevel level, QString msg)
Rshare::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 /** 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. */ * <b>sender</b>'s context, <b>receiver</b>'s <b>slot</b> will be called. */
void void RsApplication::createShortcut(const QKeySequence &key, QWidget *sender, QWidget *receiver, const char *slot)
Rshare::createShortcut(const QKeySequence &key, QWidget *sender,
QWidget *receiver, const char *slot)
{ {
QShortcut *s = new QShortcut(key, sender); QShortcut *s = new QShortcut(key, sender);
connect(s, SIGNAL(activated()), receiver, slot); connect(s, SIGNAL(activated()), receiver, slot);
} }
#ifdef __APPLE__ #ifdef __APPLE__
bool Rshare::event(QEvent *event) bool RsApplication::event(QEvent *event)
{ {
switch (event->type()) { switch (event->type()) {
case QEvent::FileOpen:{ case QEvent::FileOpen:{
@ -933,7 +604,7 @@ bool Rshare::event(QEvent *event)
} }
#endif #endif
void Rshare::blinkTimer() void RsApplication::blinkTimer()
{ {
mBlink = !mBlink; mBlink = !mBlink;
emit blink(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)) if (!RsAccounts::SelectAccount(accountId))
{ {
@ -985,14 +656,14 @@ bool Rshare::loadCertificate(const RsPeerId &accountId, bool autoLogin)
// QObject::tr("Login Failure"), // QObject::tr("Login Failure"),
// QObject::tr("Maybe password is wrong") ); // QObject::tr("Maybe password is wrong") );
return false; 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 false;
} }
return true; return true;
} }
bool Rshare::updateLocalServer() bool RsApplication::updateLocalServer()
{ {
if (localServer) { if (localServer) {
QString serverName = QString(TARGET); QString serverName = QString(TARGET);

View file

@ -36,9 +36,10 @@
#include "util/log.h" #include "util/log.h"
#include "retroshare/rstypes.h" #include "retroshare/rstypes.h"
#include "retroshare/rsinit.h"
/** Pointer to this RetroShare application instance. */ /** 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 rDebug(fmt) (rApp->log(Log::Debug, (fmt)))
#define rInfo(fmt) (rApp->log(Log::Info, (fmt))) #define rInfo(fmt) (rApp->log(Log::Info, (fmt)))
@ -46,33 +47,40 @@
#define rWarn(fmt) (rApp->log(Log::Warn, (fmt))) #define rWarn(fmt) (rApp->log(Log::Warn, (fmt)))
#define rError(fmt) (rApp->log(Log::Error, (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 Q_OBJECT
public: public:
/** Constructor. */ /** Constructor. */
Rshare(QStringList args, int &argc, char **argv, const QString &dir); RsApplication(const RsGUIConfigOptions& conf);
/** Destructor. */ /** Destructor. */
~Rshare(); ~RsApplication();
/** Return the version info */ /** Return the version info */
static QString retroshareVersion(bool=true); 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. */ /** Sets the current language. */
static bool setLanguage(QString languageCode = QString()); static bool setLanguage(QString languageCode = QString());
/** Sets the current locale. */ /** Sets the current locale. */
@ -105,17 +113,22 @@ public:
static void initPlugins(); static void initPlugins();
/** Returns the current GUI style. */ /** Returns the current GUI style. */
static QString style() { return _style; } static QString style() { return options.guiStyle; }
/** Returns the current GUI stylesheet. */ /** Returns the current GUI stylesheet. */
static QString stylesheet() { return _stylesheet; } static QString stylesheet() { return options.guiStyleSheetFile; }
/** Returns the current language. */ /** Returns the current language. */
static QString language() { return _language; } static QString language() { return options.language; }
/** Returns the operating mode. */
static QString opmode() { return _opmode; } /** 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. */ /** Returns links passed by arguments. */
static QStringList* links() { return &_links; } static QStringList* links() { return &_links; }
/** Returns files passed by arguments. */ /** Returns files passed by arguments. */
static QStringList* files() {return &_files; } static QStringList* files() {return &_files; }
#endif
/** Returns Rshare's application startup time. */ /** Returns Rshare's application startup time. */
static QDateTime startupTime(); static QDateTime startupTime();
@ -176,24 +189,20 @@ private:
/** customize the date format (defaultlongformat) */ /** customize the date format (defaultlongformat) */
static void customizeDateFormat(); static void customizeDateFormat();
#ifdef TO_REMOVE
/** Returns true if the specified arguments wants a value. */ /** Returns true if the specified arguments wants a value. */
static bool argNeedsValue(const QString &argName); static bool argNeedsValue(const QString &argName);
#endif
static QMap<QString, QString> _args; /**< List of command-line arguments. */ #ifdef __APPLE__
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. */
static QStringList _links; /**< List of links passed by arguments. */ static QStringList _links; /**< List of links passed by arguments. */
static QStringList _files; /**< List of files passed by arguments. */ static QStringList _files; /**< List of files passed by arguments. */
#endif
static QDateTime mStartupTime; // startup time static QDateTime mStartupTime; // startup time
static bool useConfigDir;
static QString configDir;
bool mBlink; bool mBlink;
static QLocalServer* localServer; static QLocalServer* localServer;
static RsGUIConfigOptions options;
static Log log_output;
}; };
#endif #endif

View file

@ -30,7 +30,7 @@ QString DateTime::formatLongDate(time_t dateValue)
QString DateTime::formatLongDate(const QDate &dateValue) QString DateTime::formatLongDate(const QDate &dateValue)
{ {
QString customDateFormat = Rshare::customDateFormat(); QString customDateFormat = RsApplication::customDateFormat();
if (customDateFormat.isEmpty()) { if (customDateFormat.isEmpty()) {
return dateValue.toString(Qt::ISODate); return dateValue.toString(Qt::ISODate);

@ -1 +1 @@
Subproject commit dae0c13ef78aee59a4f1f9e1cdb0127b5e27d256 Subproject commit ba0de17f41914f1be6754db5bc5b4507b0deaafd