/**************************************************************** * This file is distributed under the following license: * * Copyright (c) 2006-2007, crypton * Copyright (c) 2006, Matt Edman, Justin Hipple * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. ****************************************************************/ #include #include #include #include #include #include #include #include "rsharesettings.h" #include "gui/MainWindow.h" #include #include #if defined(Q_OS_WIN) #include #endif /* Retroshare's Settings */ #define SETTING_LANGUAGE "LanguageCode" #define SETTING_STYLE "InterfaceStyle" #define SETTING_SHEETNAME "SheetName" #define SETTING_PAGEBUTTONLOC "PageButtonLocation" #define SETTING_ACTIONBUTTONLOC "ActionButtonLocation" #define SETTING_TOOLBUTTONSTYLE "ToolButtonStyle" #define SETTING_TOOLBUTTONSIZE "ToolButtonSize" #define SETTING_LISTITEMICONSIZE "ListItemIconSize" #define SETTING_DATA_DIRECTORY "DataDirectory" #define SETTING_BWGRAPH_FILTER "StatisticDialog/BWLineFilter" #define SETTING_BWGRAPH_OPACITY "StatisticDialog/Opacity" #define SETTING_BWGRAPH_ALWAYS_ON_TOP "StatisticDialog/AlwaysOnTop" #define SETTING_NEWSFEED_FLAGS "NewsFeedFlags" #define SETTING_CHAT_FLAGS "ChatFlags" #define SETTING_NOTIFY_FLAGS "NotifyFlags" #define SETTING_CHAT_AVATAR "ChatAvatar" /* Default Retroshare Settings */ #define DEFAULT_OPACITY 100 #if defined(Q_OS_WIN) #define STARTUP_REG_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Run" #define RETROSHARE_REG_KEY "RetroShare" #endif /* Default bandwidth graph settings */ #define DEFAULT_BWGRAPH_FILTER (BWGRAPH_SEND|BWGRAPH_REC) #define DEFAULT_BWGRAPH_ALWAYS_ON_TOP false /* values for ToolButtonStyle */ #define SETTING_VALUE_TOOLBUTTONSTYLE_ICONONLY 1 #define SETTING_VALUE_TOOLBUTTONSTYLE_TEXTONLY 2 #define SETTING_VALUE_TOOLBUTTONSTYLE_TEXTBESIDEICON 3 #define SETTING_VALUE_TOOLBUTTONSTYLE_TEXTUNDERICON 4 // the one and only global settings object RshareSettings *Settings = NULL; /*static*/ void RshareSettings::Create(bool forceCreateNew) { if (Settings && (forceCreateNew || Settings->m_bValid == false)) { // recreate with correct path delete (Settings); Settings = NULL; } if (Settings == NULL) { Settings = new RshareSettings (); } } /** Default Constructor */ RshareSettings::RshareSettings() { m_maxTimeBeforeIdle = -1; initSettings(); } void RshareSettings::initSettings() { #ifdef Q_OS_LINUX // use GTK as default style on linux setDefault(SETTING_STYLE, "GTK+"); #else #if defined(Q_OS_MAC) setDefault(SETTING_STYLE, "macintosh (aqua)"); #else static QStringList styles = QStyleFactory::keys(); #if defined(Q_OS_WIN) if (styles.contains("windowsvista", Qt::CaseInsensitive)) setDefault(SETTING_STYLE, "windowsvista"); else if (styles.contains("windowsxp", Qt::CaseInsensitive)) setDefault(SETTING_STYLE, "windowsxp"); else #endif { if (styles.contains("cleanlooks", Qt::CaseInsensitive)) setDefault(SETTING_STYLE, "cleanlooks"); else setDefault(SETTING_STYLE, "plastique"); } #endif #endif setDefault(SETTING_LANGUAGE, LanguageSupport::defaultLanguageCode()); setDefault(SETTING_SHEETNAME, ":Standard"); /* defaults here are not ideal.... but dusent matter */ uint defChat = RS_CHAT_OPEN; // This is not default... RS_CHAT_FOCUS. uint defNotify = (RS_POPUP_CONNECT | RS_POPUP_MSG); uint defNewsFeed = (RS_FEED_TYPE_MSG | RS_FEED_TYPE_FILES | RS_FEED_TYPE_SECURITY | RS_FEED_TYPE_SECURITY_IP); setDefault(SETTING_NEWSFEED_FLAGS, defNewsFeed); setDefault(SETTING_CHAT_FLAGS, defChat); setDefault(SETTING_NOTIFY_FLAGS, defNotify); setDefault("DisplayTrayGroupChat", true); setDefault("AddFeedsAtEnd", false); } /** Gets the currently preferred language code for Rshare. */ QString RshareSettings::getLanguageCode() { return value(SETTING_LANGUAGE).toString(); } /** Sets the preferred language code. */ void RshareSettings::setLanguageCode(QString languageCode) { setValue(SETTING_LANGUAGE, languageCode); } /** Gets the interface style key (e.g., "windows", "motif", etc.) */ QString RshareSettings::getInterfaceStyle() { return value(SETTING_STYLE).toString(); } /** Sets the interface style key. */ void RshareSettings::setInterfaceStyle(QString styleKey) { setValue(SETTING_STYLE, styleKey); } /** Gets the sheetname.*/ QString RshareSettings::getSheetName() { return value(SETTING_SHEETNAME).toString(); } /** Sets the sheetname.*/ void RshareSettings::setSheetName(QString sheet) { setValue(SETTING_SHEETNAME, sheet); } /** Gets the page button Location.*/ bool RshareSettings::getPageButtonLoc() { return value(SETTING_PAGEBUTTONLOC, true).toBool(); } /** Sets the page button Location.*/ void RshareSettings::setPageButtonLoc(bool onToolBar) { setValue(SETTING_PAGEBUTTONLOC, onToolBar); } /** Gets the action button Location.*/ bool RshareSettings::getActionButtonLoc() { return value(SETTING_ACTIONBUTTONLOC, true).toBool(); } /** Sets the action button Location.*/ void RshareSettings::setActionButtonLoc(bool onToolBar) { setValue(SETTING_ACTIONBUTTONLOC, onToolBar); } /** Gets the tool button's style.*/ Qt::ToolButtonStyle RshareSettings::getToolButtonStyle() { int intValue=value(SETTING_TOOLBUTTONSTYLE, SETTING_VALUE_TOOLBUTTONSTYLE_TEXTUNDERICON).toInt(); switch (intValue) { case SETTING_VALUE_TOOLBUTTONSTYLE_ICONONLY: return Qt::ToolButtonIconOnly; case SETTING_VALUE_TOOLBUTTONSTYLE_TEXTONLY: return Qt::ToolButtonTextOnly; case SETTING_VALUE_TOOLBUTTONSTYLE_TEXTBESIDEICON: return Qt::ToolButtonTextBesideIcon; case SETTING_VALUE_TOOLBUTTONSTYLE_TEXTUNDERICON: default: return Qt::ToolButtonTextUnderIcon; } } /** Sets the tool button's style.*/ void RshareSettings::setToolButtonStyle(Qt::ToolButtonStyle style) { switch (style) { case Qt::ToolButtonIconOnly: setValue(SETTING_TOOLBUTTONSTYLE, SETTING_VALUE_TOOLBUTTONSTYLE_ICONONLY); break; case Qt::ToolButtonTextOnly: setValue(SETTING_TOOLBUTTONSTYLE, SETTING_VALUE_TOOLBUTTONSTYLE_TEXTONLY); break; case Qt::ToolButtonTextBesideIcon: setValue(SETTING_TOOLBUTTONSTYLE, SETTING_VALUE_TOOLBUTTONSTYLE_TEXTBESIDEICON); break; case Qt::ToolButtonTextUnderIcon: default: setValue(SETTING_TOOLBUTTONSTYLE, SETTING_VALUE_TOOLBUTTONSTYLE_TEXTUNDERICON); } } int RshareSettings::computeBestIconSize(int n_sizes,int *sizes,int recommended_size) { float default_size = QFontMetricsF(QWidget().font()).height()/16.0 * recommended_size ; float closest_ratio_dist = 10000.0f ; int best_default_size = sizes[0] ; for(int i=0;irun is set to true, then RetroShare will run on system boot. */ void RshareSettings::setRunRetroshareOnBoot(bool run, bool minimized) { #if defined(Q_OS_WIN) if (run) { QString value = "\"" + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + "\""; if (minimized) { value += " -m"; } win32_registry_set_key_value(STARTUP_REG_KEY, RETROSHARE_REG_KEY, value); } else { win32_registry_remove_key(STARTUP_REG_KEY, RETROSHARE_REG_KEY); } #else /* Platforms othe rthan windows aren't supported yet */ Q_UNUSED(run); Q_UNUSED(minimized); #endif } static QString getAppPathForProtocol() { #if defined(Q_OS_WIN) return "\"" + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + "\" -r \"%1\""; #elif defined(Q_OS_LINUX) return QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + " %U"; #endif } /** Returns true if retroshare:// is registered as protocol */ bool RshareSettings::getRetroShareProtocol() { #if defined(Q_OS_WIN) /* Check key */ QSettings retroshare("HKEY_CURRENT_USER\\Software\\Classes\\retroshare", QSettings::NativeFormat); if (retroshare.contains("Default")) { /* URL Protocol */ if (retroshare.contains("URL Protocol")) { /* Check app path */ QSettings command("HKEY_CURRENT_USER\\Software\\Classes\\retroshare\\shell\\open\\command", QSettings::NativeFormat); if (command.value("Default").toString() == getAppPathForProtocol()) { return true; } } } #elif defined(Q_OS_LINUX) QFile desktop("/usr/share/applications/RetroShare06.desktop"); if (desktop.exists()) { desktop.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream in(&desktop); QStringList lines; while(!in.atEnd()) { lines << in.readLine(); } desktop.close(); if (lines.contains("Exec=" + getAppPathForProtocol())) if (lines.contains("MimeType=x-scheme-handler/retroshare")) return true; } #else /* Platforms not supported yet */ #endif return false; } /** Returns true if the user can set retroshare as protocol */ bool RshareSettings::canSetRetroShareProtocol() { #if defined(Q_OS_WIN) QSettings classRoot("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); return classRoot.isWritable(); #elif defined(Q_OS_LINUX) return RshareSettings::getRetroShareProtocol(); #else return false; #endif } /** Register retroshare:// as protocol */ bool RshareSettings::setRetroShareProtocol(bool value, QString &error) { error = ""; #if defined(Q_OS_WIN) if (value) { QSettings retroshare("HKEY_CURRENT_USER\\Software\\Classes\\retroshare", QSettings::NativeFormat); retroshare.setValue("Default", "URL: RetroShare protocol"); QSettings::Status state = retroshare.status(); if (state == QSettings::AccessError) { error = tr("Registry Access Error. Maybe you need Administrator right."); return false; } retroshare.setValue("URL Protocol", ""); QSettings command("HKEY_CURRENT_USER\\Software\\Classes\\retroshare\\shell\\open\\command", QSettings::NativeFormat); command.setValue("Default", getAppPathForProtocol()); state = command.status(); } else { QSettings classRoot("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); classRoot.remove("retroshare"); QSettings::Status state = classRoot.status(); if (state == QSettings::AccessError) { error = tr("Registry Access Error. Maybe you need Administrator right."); return false; } } return true; #elif defined(Q_OS_LINUX) /* RetroShare protocol is always activated for Linux */ Q_UNUSED(value); return true; #else /* Platforms not supported yet */ Q_UNUSED(value); return false; #endif } /** Returns true if this instance have to run Local Server*/ bool RshareSettings::getUseLocalServer() { return value("UseLocalServer", true).toBool(); } /** Sets whether to run Local Server */ void RshareSettings::setUseLocalServer(bool value) { if (value != getUseLocalServer()) { setValue("UseLocalServer", value); Rshare::updateLocalServer(); } } /** Saving Generic Widget Size / Location */ void RshareSettings::saveWidgetInformation(QWidget *widget) { beginGroup("widgetInformation"); beginGroup(widget->objectName()); setValue("size", widget->size()); setValue("pos", widget->pos()); endGroup(); endGroup(); } void RshareSettings::saveWidgetInformation(QMainWindow *widget, QToolBar *toolBar) { beginGroup("widgetInformation"); beginGroup(widget->objectName()); setValue("toolBarArea", widget->toolBarArea(toolBar)); endGroup(); endGroup(); saveWidgetInformation(widget); } void RshareSettings::loadWidgetInformation(QWidget *widget) { beginGroup("widgetInformation"); beginGroup(widget->objectName()); widget->resize(value("size", widget->size()).toSize()); widget->move(value("pos", QPoint(200, 200)).toPoint()); endGroup(); endGroup(); } void RshareSettings::loadWidgetInformation(QMainWindow *widget, QToolBar *toolBar) { beginGroup("widgetInformation"); beginGroup(widget->objectName()); widget->addToolBar((Qt::ToolBarArea) value("toolBarArea", Qt::TopToolBarArea).toInt(), toolBar); endGroup(); endGroup(); loadWidgetInformation(widget); } /* MainWindow */ int RshareSettings::getLastPageInMainWindow () { return valueFromGroup("MainWindow", "LastPage", MainWindow::Network).toInt(); } void RshareSettings::setLastPageInMainWindow (int value) { setValueToGroup("MainWindow", "LastPage", value); } uint RshareSettings::getStatusBarFlags() { /* Default = All but disc status */ return valueFromGroup("MainWindow", "StatusBarFlags", 0xFFFFFFFF ^ STATUSBAR_DISC).toUInt(); } void RshareSettings::setStatusBarFlags(uint flags) { setValueToGroup("MainWindow", "StatusBarFlags", flags); } void RshareSettings::setStatusBarFlag(uint flag, bool enable) { uint flags = getStatusBarFlags(); if (enable) { flags |= flag; } else { flags &= ~flag; } setStatusBarFlags(flags); } /* Message */ bool RshareSettings::getMsgSetToReadOnActivate () { return valueFromGroup("Message", "SetMsgToReadOnActivate", true).toBool(); } void RshareSettings::setMsgSetToReadOnActivate (bool value) { setValueToGroup("Message", "SetMsgToReadOnActivate", value); } bool RshareSettings::getMsgLoadEmbeddedImages() { return valueFromGroup("Message", "LoadEmbeddedImages", false).toBool(); } void RshareSettings::setMsgLoadEmbeddedImages(bool value) { setValueToGroup("Message", "LoadEmbeddedImages", value); } RshareSettings::enumMsgOpen RshareSettings::getMsgOpen() { enumMsgOpen value = (enumMsgOpen) valueFromGroup("Message", "msgOpen", MSG_OPEN_TAB).toInt(); switch (value) { case MSG_OPEN_TAB: case MSG_OPEN_WINDOW: return value; } return MSG_OPEN_TAB; } void RshareSettings::setMsgOpen(enumMsgOpen value) { switch (value) { case MSG_OPEN_TAB: case MSG_OPEN_WINDOW: break; default: value = MSG_OPEN_TAB; } setValueToGroup("Message", "msgOpen", value); } /* Forum */ bool RshareSettings::getForumMsgSetToReadOnActivate () { return valueFromGroup("Forum", "SetMsgToReadOnActivate", true).toBool(); } void RshareSettings::setForumMsgSetToReadOnActivate(bool value) { setValueToGroup("Forum", "SetMsgToReadOnActivate", value); } bool RshareSettings::getForumExpandNewMessages() { return valueFromGroup("Forum", "ExpandNewMessages", true).toBool(); } void RshareSettings::setForumExpandNewMessages(bool value) { setValueToGroup("Forum", "ExpandNewMessages", value); } bool RshareSettings::getForumLoadEmbeddedImages() { return valueFromGroup("Forum", "LoadEmbeddedImages", false).toBool(); } void RshareSettings::setForumLoadEmbeddedImages(bool value) { setValueToGroup("Forum", "LoadEmbeddedImages", value); } /* Channel */ bool RshareSettings::getChannelLoadThread() { return valueFromGroup("Channel", "LoadThread", true).toBool(); } void RshareSettings::setChannelLoadThread(bool value) { setValueToGroup("Channel", "LoadThread", value); } /* GroupFrame settings */ static QString groupFrameSettingsTypeToString(GroupFrameSettings::Type type) { switch (type) { case GroupFrameSettings::Nothing: return ""; case GroupFrameSettings::Forum: return "Forum"; case GroupFrameSettings::Channel: return "Channel"; case GroupFrameSettings::Posted: return "Posted"; } return ""; } bool RshareSettings::getGroupFrameSettings(GroupFrameSettings::Type type, GroupFrameSettings &groupFrameSettings) { QString group = groupFrameSettingsTypeToString(type); if (group.isEmpty()) { return false; } groupFrameSettings.mOpenAllInNewTab = valueFromGroup(group, "OpenAllInNewTab", false).toBool(); groupFrameSettings.mHideTabBarWithOneTab = valueFromGroup(group, "HideTabBarWithOneTab", true).toBool(); return true; } void RshareSettings::setGroupFrameSettings(GroupFrameSettings::Type type, const GroupFrameSettings &groupFrameSettings) { QString group = groupFrameSettingsTypeToString(type); if (group.isEmpty()) { return; } setValueToGroup(group, "OpenAllInNewTab", groupFrameSettings.mOpenAllInNewTab); setValueToGroup(group, "HideTabBarWithOneTab", groupFrameSettings.mHideTabBarWithOneTab); } /* time before idle */ uint RshareSettings::getMaxTimeBeforeIdle() { if (m_maxTimeBeforeIdle == -1) { m_maxTimeBeforeIdle = value("maxTimeBeforeIdle", 300).toUInt(); } return m_maxTimeBeforeIdle; } void RshareSettings::setMaxTimeBeforeIdle(uint nValue) { m_maxTimeBeforeIdle = nValue; setValue("maxTimeBeforeIdle", nValue); } bool RshareSettings::getWebinterfaceEnabled() { return valueFromGroup("Webinterface", "enabled", false).toBool(); } void RshareSettings::setWebinterfaceEnabled(bool enabled) { setValueToGroup("Webinterface", "enabled", enabled); } uint16_t RshareSettings::getWebinterfacePort() { return valueFromGroup("Webinterface", "port", 9090).toUInt(); } void RshareSettings::setWebinterfacePort(uint16_t port) { setValueToGroup("Webinterface", "port", port); } bool RshareSettings::getWebinterfaceAllowAllIps() { return valueFromGroup("Webinterface", "allowAllIps", false).toBool(); } void RshareSettings::setWebinterfaceAllowAllIps(bool allow_all) { setValueToGroup("Webinterface", "allowAllIps", allow_all); }