#include "util.h"
#include "clientauthhandler.h"
-#include <stdio.h>
-#include <stdlib.h>
+#include <cstdio>
+#include <cstdlib>
-QPointer<Client> Client::instanceptr = 0;
-
-/*** Initialization/destruction ***/
-
-bool Client::instanceExists()
-{
- return instanceptr;
-}
-
-
-Client *Client::instance()
-{
- if (!instanceptr)
- instanceptr = new Client();
- return instanceptr;
-}
-
-
-void Client::destroy()
-{
- if (instanceptr) {
- delete instanceptr->mainUi();
- instanceptr->deleteLater();
- instanceptr = 0;
- }
-}
-
-
-void Client::init(AbstractUi *ui)
-{
- instance()->_mainUi = ui;
- instance()->init();
-}
-
-
-Client::Client(QObject *parent)
- : QObject(parent),
+Client::Client(std::unique_ptr<AbstractUi> ui, QObject *parent)
+ : QObject(parent), Singleton<Client>(this),
_signalProxy(new SignalProxy(SignalProxy::Client, this)),
- _mainUi(0),
- _networkModel(0),
- _bufferModel(0),
- _bufferSyncer(0),
- _aliasManager(0),
+ _mainUi(std::move(ui)),
+ _networkModel(new NetworkModel(this)),
+ _bufferModel(new BufferModel(_networkModel)),
_backlogManager(new ClientBacklogManager(this)),
- _bufferViewManager(0),
_bufferViewOverlay(new BufferViewOverlay(this)),
- _dccConfig(0),
+ _coreInfo(new CoreInfo(this)),
_ircListHelper(new ClientIrcListHelper(this)),
- _inputHandler(0),
- _networkConfig(0),
- _ignoreListManager(0),
- _highlightRuleManager(0),
- _transferManager(0),
+ _inputHandler(new ClientUserInputHandler(this)),
_transferModel(new TransferModel(this)),
- _messageModel(0),
- _messageProcessor(0),
+ _messageModel(_mainUi->createMessageModel(this)),
+ _messageProcessor(_mainUi->createMessageProcessor(this)),
_coreAccountModel(new CoreAccountModel(this)),
- _coreConnection(new CoreConnection(this)),
- _connected(false),
- _debugLog(&_debugLogBuffer)
+ _coreConnection(new CoreConnection(this))
{
- _signalProxy->synchronize(_ircListHelper);
-}
-
-
-Client::~Client()
-{
- disconnectFromCore();
-}
-
+#ifdef EMBED_DATA
+ Q_INIT_RESOURCE(data);
+#endif
-void Client::init()
-{
- _networkModel = new NetworkModel(this);
+ connect(mainUi(), &AbstractUi::disconnectFromCore, this, &Client::disconnectFromCore);
+ connect(this, &Client::connected, mainUi(), &AbstractUi::connectedToCore);
+ connect(this, &Client::disconnected, mainUi(), &AbstractUi::disconnectedFromCore);
- connect(this, SIGNAL(networkRemoved(NetworkId)),
- _networkModel, SLOT(networkRemoved(NetworkId)));
+ connect(this, &Client::networkRemoved, _networkModel, &NetworkModel::networkRemoved);
+ connect(this, &Client::networkRemoved, _messageProcessor, &AbstractMessageProcessor::networkRemoved);
- _bufferModel = new BufferModel(_networkModel);
- _messageModel = mainUi()->createMessageModel(this);
- _messageProcessor = mainUi()->createMessageProcessor(this);
- _inputHandler = new ClientUserInputHandler(this);
+ connect(backlogManager(), &ClientBacklogManager::messagesReceived, _messageModel, &MessageModel::messagesReceived);
+ connect(coreConnection(), &CoreConnection::stateChanged, this, &Client::connectionStateChanged);
SignalProxy *p = signalProxy();
p->attachSignal(this, SIGNAL(requestKickClient(int)), SIGNAL(kickClient(int)));
p->attachSlot(SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore()));
- //connect(mainUi(), SIGNAL(connectToCore(const QVariantMap &)), this, SLOT(connectToCore(const QVariantMap &)));
- connect(mainUi(), SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore()));
- connect(this, SIGNAL(connected()), mainUi(), SLOT(connectedToCore()));
- connect(this, SIGNAL(disconnected()), mainUi(), SLOT(disconnectedFromCore()));
-
- // attach backlog manager
p->synchronize(backlogManager());
- connect(backlogManager(), SIGNAL(messagesReceived(BufferId, int)), _messageModel, SLOT(messagesReceived(BufferId, int)));
+ p->synchronize(coreInfo());
+ p->synchronize(_ircListHelper);
coreAccountModel()->load();
-
- connect(coreConnection(), SIGNAL(stateChanged(CoreConnection::ConnectionState)), SLOT(connectionStateChanged(CoreConnection::ConnectionState)));
coreConnection()->init();
}
-/*** public static methods ***/
+Client::~Client()
+{
+ disconnectFromCore();
+}
+
AbstractUi *Client::mainUi()
{
- return instance()->_mainUi;
+ return instance()->_mainUi.get();
}
}
+void Client::onDbUpgradeInProgress(bool inProgress)
+{
+ emit dbUpgradeInProgress(inProgress);
+}
+
+
+void Client::onExitRequested(int exitCode, const QString &reason)
+{
+ if (!reason.isEmpty()) {
+ qCritical() << reason;
+ emit exitRequested(reason);
+ }
+ QCoreApplication::exit(exitCode);
+}
+
+
/*** Network handling ***/
QList<NetworkId> Client::networkIds()
const Network *Client::network(NetworkId networkid)
{
if (instance()->_networks.contains(networkid)) return instance()->_networks[networkid];
- else return 0;
+ else return nullptr;
}
net->setProxy(signalProxy());
signalProxy()->synchronize(net);
networkModel()->attachNetwork(net);
- connect(net, SIGNAL(destroyed()), instance(), SLOT(networkDestroyed()));
+ connect(net, &QObject::destroyed, instance(), &Client::networkDestroyed);
instance()->_networks[net->networkId()] = net;
emit instance()->networkCreated(net->networkId());
}
qWarning() << "Creation of already existing network requested!";
return;
}
- Network *net = new Network(id, this);
+ auto *net = new Network(id, this);
addNetwork(net);
}
const Identity *Client::identity(IdentityId id)
{
if (instance()->_identities.contains(id)) return instance()->_identities[id];
- else return 0;
+ else return nullptr;
}
void Client::coreIdentityCreated(const Identity &other)
{
if (!_identities.contains(other.id())) {
- Identity *identity = new Identity(other, this);
+ auto *identity = new Identity(other, this);
_identities[other.id()] = identity;
identity->setInitialized();
signalProxy()->synchronize(identity);
// create buffersyncer
Q_ASSERT(!_bufferSyncer);
_bufferSyncer = new BufferSyncer(this);
- connect(bufferSyncer(), SIGNAL(lastSeenMsgSet(BufferId, MsgId)), _networkModel, SLOT(setLastSeenMsgId(BufferId, MsgId)));
- connect(bufferSyncer(), SIGNAL(markerLineSet(BufferId, MsgId)), _networkModel, SLOT(setMarkerLineMsgId(BufferId, MsgId)));
- connect(bufferSyncer(), SIGNAL(bufferRemoved(BufferId)), this, SLOT(bufferRemoved(BufferId)));
- connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString)));
- connect(bufferSyncer(), SIGNAL(buffersPermanentlyMerged(BufferId, BufferId)), this, SLOT(buffersPermanentlyMerged(BufferId, BufferId)));
- connect(bufferSyncer(), SIGNAL(buffersPermanentlyMerged(BufferId, BufferId)), _messageModel, SLOT(buffersPermanentlyMerged(BufferId, BufferId)));
- connect(bufferSyncer(), SIGNAL(bufferMarkedAsRead(BufferId)), SIGNAL(bufferMarkedAsRead(BufferId)));
- connect(bufferSyncer(), SIGNAL(bufferActivityChanged(BufferId, const Message::Types)), _networkModel, SLOT(bufferActivityChanged(BufferId, const Message::Types)));
- connect(bufferSyncer(), SIGNAL(highlightCountChanged(BufferId, int)), _networkModel, SLOT(highlightCountChanged(BufferId, int)));
- connect(networkModel(), SIGNAL(requestSetLastSeenMsg(BufferId, MsgId)), bufferSyncer(), SLOT(requestSetLastSeenMsg(BufferId, const MsgId &)));
+ connect(bufferSyncer(), &BufferSyncer::lastSeenMsgSet, _networkModel, &NetworkModel::setLastSeenMsgId);
+ connect(bufferSyncer(), &BufferSyncer::markerLineSet, _networkModel, &NetworkModel::setMarkerLineMsgId);
+ connect(bufferSyncer(), &BufferSyncer::bufferRemoved, this, &Client::bufferRemoved);
+ connect(bufferSyncer(), &BufferSyncer::bufferRenamed, this, &Client::bufferRenamed);
+ connect(bufferSyncer(), &BufferSyncer::buffersPermanentlyMerged, this, &Client::buffersPermanentlyMerged);
+ connect(bufferSyncer(), &BufferSyncer::buffersPermanentlyMerged, _messageModel, &MessageModel::buffersPermanentlyMerged);
+ connect(bufferSyncer(), &BufferSyncer::bufferMarkedAsRead, this, &Client::bufferMarkedAsRead);
+ connect(bufferSyncer(), &BufferSyncer::bufferActivityChanged, _networkModel, &NetworkModel::bufferActivityChanged);
+ connect(bufferSyncer(), &BufferSyncer::highlightCountChanged, _networkModel, &NetworkModel::highlightCountChanged);
+ connect(networkModel(), &NetworkModel::requestSetLastSeenMsg, bufferSyncer(), &BufferSyncer::requestSetLastSeenMsg);
SignalProxy *p = signalProxy();
p->synchronize(bufferSyncer());
// create a new BufferViewManager
Q_ASSERT(!_bufferViewManager);
_bufferViewManager = new ClientBufferViewManager(p, this);
- connect(_bufferViewManager, SIGNAL(initDone()), _bufferViewOverlay, SLOT(restore()));
+ connect(_bufferViewManager, &SyncableObject::initDone, _bufferViewOverlay, &BufferViewOverlay::restore);
// create AliasManager
Q_ASSERT(!_aliasManager);
_aliasManager = new ClientAliasManager(this);
- connect(aliasManager(), SIGNAL(initDone()), SLOT(sendBufferedUserInput()));
+ connect(aliasManager(), &SyncableObject::initDone, this, &Client::sendBufferedUserInput);
p->synchronize(aliasManager());
// create NetworkConfig
Q_ASSERT(!_highlightRuleManager);
_highlightRuleManager = new HighlightRuleManager(this);
p->synchronize(highlightRuleManager());
+ // Listen to network removed events
+ connect(this, &Client::networkRemoved,
+ _highlightRuleManager, &HighlightRuleManager::networkRemoved);
/* not ready yet
// create TransferManager and DccConfig if core supports them
*/
// trigger backlog request once all active bufferviews are initialized
- connect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(finishConnectionInitialization()));
+ connect(bufferViewOverlay(), &BufferViewOverlay::initDone, this, &Client::finishConnectionInitialization);
_connected = true;
emit connected();
// triggers this slot. But we have to make sure that we know all buffers yet.
// so we check the BufferSyncer and in case it wasn't initialized we wait for that instead
if (!bufferSyncer()->isInitialized()) {
- disconnect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(finishConnectionInitialization()));
- connect(bufferSyncer(), SIGNAL(initDone()), this, SLOT(finishConnectionInitialization()));
+ disconnect(bufferViewOverlay(), &BufferViewOverlay::initDone, this, &Client::finishConnectionInitialization);
+ connect(bufferSyncer(), &SyncableObject::initDone, this, &Client::finishConnectionInitialization);
return;
}
- disconnect(bufferViewOverlay(), SIGNAL(initDone()), this, SLOT(finishConnectionInitialization()));
- disconnect(bufferSyncer(), SIGNAL(initDone()), this, SLOT(finishConnectionInitialization()));
+ disconnect(bufferViewOverlay(), &BufferViewOverlay::initDone, this, &Client::finishConnectionInitialization);
+ disconnect(bufferSyncer(), &SyncableObject::initDone, this, &Client::finishConnectionInitialization);
requestInitialBacklog();
if (isCoreFeatureEnabled(Quassel::Feature::BufferActivitySync)) {
}
+void Client::requestLegacyCoreInfo()
+{
+ // On older cores, the CoreInfo object was only synchronized on demand. Synchronize now if
+ // needed.
+ if (isConnected() && !isCoreFeatureEnabled(Quassel::Feature::SyncedCoreInfo)) {
+ // Delete the existing core info object (it will always exist as client is single-threaded)
+ _coreInfo->deleteLater();
+ // No need to set to null when creating new one immediately after
+
+ // Create a fresh, unsynchronized CoreInfo object, emulating legacy behavior of CoreInfo not
+ // persisting
+ _coreInfo = new CoreInfo(this);
+ // Synchronize the new object
+ signalProxy()->synchronize(_coreInfo);
+
+ // Let others know signal handlers have been reset
+ emit coreInfoResynchronized();
+ }
+}
+
+
void Client::disconnectFromCore()
{
if (!coreConnection()->isConnected())
if (_bufferSyncer) {
_bufferSyncer->deleteLater();
- _bufferSyncer = 0;
+ _bufferSyncer = nullptr;
}
+ _coreInfo->reset();
+
if (_bufferViewManager) {
_bufferViewManager->deleteLater();
- _bufferViewManager = 0;
+ _bufferViewManager = nullptr;
}
_bufferViewOverlay->reset();
if (_aliasManager) {
_aliasManager->deleteLater();
- _aliasManager = 0;
+ _aliasManager = nullptr;
}
if (_ignoreListManager) {
_ignoreListManager->deleteLater();
- _ignoreListManager = 0;
+ _ignoreListManager = nullptr;
}
if (_highlightRuleManager) {
while (netIter != _networks.end()) {
Network *net = netIter.value();
emit networkRemoved(net->networkId());
- disconnect(net, SIGNAL(destroyed()), this, 0);
+ disconnect(net, &Network::destroyed, this, nullptr);
netIter = _networks.erase(netIter);
net->deleteLater();
}
if (_networkConfig) {
_networkConfig->deleteLater();
- _networkConfig = 0;
+ _networkConfig = nullptr;
}
}
void Client::networkDestroyed()
{
- Network *net = static_cast<Network *>(sender());
+ auto *net = static_cast<Network *>(sender());
QHash<NetworkId, Network *>::iterator netIter = _networks.begin();
while (netIter != _networks.end()) {
if (*netIter == net) {
{
if (id.isValid() && networkModel())
return networkModel()->markerLineMsgId(id);
- return MsgId();
+ return {};
}
}
+void Client::refreshLegacyCoreInfo()
+{
+ instance()->requestLegacyCoreInfo();
+}
+
+
void Client::changePassword(const QString &oldPassword, const QString &newPassword) {
CoreAccount account = currentCoreAccount();
account.setPassword(newPassword);
coreAccountModel()->save();
emit passwordChanged(success);
}
-
-
-#if QT_VERSION < 0x050000
-void Client::logMessage(QtMsgType type, const char *msg)
-{
- fprintf(stderr, "%s\n", msg);
- fflush(stderr);
- if (type == QtFatalMsg) {
- Quassel::logFatalMessage(msg);
- }
- else {
- QString msgString = QString("%1\n").arg(msg);
-
- //Check to see if there is an instance around, else we risk recursions
- //when calling instance() and creating new ones.
- if (!instanceExists())
- return;
-
- instance()->_debugLog << msgString;
- emit instance()->logUpdated(msgString);
- }
-}
-#else
-void Client::logMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
-{
- Q_UNUSED(context);
-
- fprintf(stderr, "%s\n", msg.toLocal8Bit().constData());
- fflush(stderr);
- if (type == QtFatalMsg) {
- Quassel::logFatalMessage(msg.toLocal8Bit().constData());
- }
- else {
- QString msgString = QString("%1\n").arg(msg);
-
- //Check to see if there is an instance around, else we risk recursions
- //when calling instance() and creating new ones.
- if (!instanceExists())
- return;
-
- instance()->_debugLog << msgString;
- emit instance()->logUpdated(msgString);
- }
-}
-#endif