Testing the new SyncObjects concept - looking good so far
[quassel.git] / src / common / ircuser.cpp
index af3cb3e..e42bea7 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "ircuser.h"
 #include "util.h"
 
+#include "network.h"
 #include "signalproxy.h"
 #include "ircchannel.h"
 
 #include <QTextCodec>
 #include <QDebug>
 
-IrcUser::IrcUser(const QString &hostmask, Network *network)
-  : SyncableObject(network),
+INIT_SYNCABLE_OBJECT(IrcUser)
+IrcUser::IrcUser(const QString &hostmask, Network *network) : SyncableObject(network),
     _initialized(false),
-    _nick(network->encodeServerString(nickFromMask(hostmask))),
-    _user(network->encodeServerString(userFromMask(hostmask))),
-    _host(network->encodeServerString(hostFromMask(hostmask))),
+    _nick(nickFromMask(hostmask)),
+    _user(userFromMask(hostmask)),
+    _host(hostFromMask(hostmask)),
     _realName(),
     _awayMessage(),
     _away(false),
@@ -107,39 +108,30 @@ QByteArray IrcUser::encodeString(const QString &string) const {
 //  PUBLIC SLOTS:
 // ====================
 void IrcUser::setUser(const QString &user) {
-  if(!user.isEmpty()) {
-    QByteArray newUser = network()->encodeServerString(user);
-    if(newUser != _user) {
-      _user = newUser;
-      emit userSet(user);
-    }
+  if(!user.isEmpty() && _user != user) {
+    _user = user;
+    SYNC(ARG(user));
   }
 }
 
 void IrcUser::setRealName(const QString &realName) {
-  if(!realName.isEmpty()) {
-    QByteArray newRealName = network()->encodeServerString(realName);
-    if(newRealName != _realName) {
-      _realName = newRealName;
-      emit realNameSet(realName);
-    }
+  if (!realName.isEmpty() && _realName != realName) {
+    _realName = realName;
+    SYNC(ARG(realName))
   }
 }
 
 void IrcUser::setAway(const bool &away) {
   if(away != _away) {
     _away = away;
-    emit awaySet(away);
+    SYNC(ARG(away))
   }
 }
 
 void IrcUser::setAwayMessage(const QString &awayMessage) {
-  if(!awayMessage.isEmpty()) {
-    QByteArray newAwayMessage = network()->encodeServerString(awayMessage);
-    if(newAwayMessage != _awayMessage) {
-      _awayMessage = newAwayMessage;
-      emit awayMessageSet(awayMessage);
-    }
+  if(!awayMessage.isEmpty() && _awayMessage != awayMessage) {
+    _awayMessage = awayMessage;
+    SYNC(ARG(awayMessage))
   }
 }
 
@@ -147,75 +139,69 @@ void IrcUser::setIdleTime(const QDateTime &idleTime) {
   if(idleTime.isValid() && _idleTime != idleTime) {
     _idleTime = idleTime;
     _idleTimeSet = QDateTime::currentDateTime();
-    emit idleTimeSet(idleTime);
+    SYNC(ARG(idleTime))
   }
 }
 
 void IrcUser::setLoginTime(const QDateTime &loginTime) {
   if(loginTime.isValid() && _loginTime != loginTime) {
     _loginTime = loginTime;
-    emit loginTimeSet(loginTime);
+    SYNC(ARG(loginTime))
   }
 }
 
 void IrcUser::setServer(const QString &server) {
   if(!server.isEmpty() && _server != server) {
     _server = server;
-    emit serverSet(server);
+    SYNC(ARG(server))
   }
 }
 
 void IrcUser::setIrcOperator(const QString &ircOperator) {
   if(!ircOperator.isEmpty() && _ircOperator != ircOperator) {
     _ircOperator = ircOperator;
-    emit ircOperatorSet(ircOperator);
+    SYNC(ARG(ircOperator))
   }
 }
 
 void IrcUser::setLastAwayMessage(const int &lastAwayMessage) {
   if(lastAwayMessage > _lastAwayMessage) {
     _lastAwayMessage = lastAwayMessage;
-    emit lastAwayMessageSet(lastAwayMessage);
+    SYNC(ARG(lastAwayMessage))
   }
 }
 
 void IrcUser::setHost(const QString &host) {
-  if(!host.isEmpty()) {
-    QByteArray newHost = network()->encodeServerString(host);
-    if(newHost != _host) {
-      _host = newHost;
-      emit hostSet(host);
-    }
+  if(!host.isEmpty() && _host != host) {
+    _host = host;
+    SYNC(ARG(host))
   }
 }
 
 void IrcUser::setNick(const QString &nick) {
-  if(!nick.isEmpty()) {
-    QByteArray newNick = network()->encodeServerString(nick);
-    if(newNick != _nick) {
-      _nick = newNick;
-      updateObjectName();
-      emit nickSet(nick);
-    }
+  if(!nick.isEmpty() && nick != _nick) {
+    _nick = nick;
+    updateObjectName();
+    SYNC(ARG(nick))
   }
 }
 
 void IrcUser::setWhoisServiceReply(const QString &whoisServiceReply) {
   if(!whoisServiceReply.isEmpty() && whoisServiceReply != _whoisServiceReply) {
     _whoisServiceReply = whoisServiceReply;
-    emit whoisServiceReplySet(whoisServiceReply);
+    SYNC(ARG(whoisServiceReply))
   }
 }
 
 void IrcUser::setSuserHost(const QString &suserHost) {
   if(!suserHost.isEmpty() && suserHost != _suserHost) {
     _suserHost = suserHost;
-    emit suserHostSet(suserHost);
+    SYNC(ARG(suserHost))
   }
 }
 
 void IrcUser::updateObjectName() {
-  renameObject(QString::number(network()->networkId().toInt()) + "/" + nick());
+  renameObject(QString::number(network()->networkId().toInt()) + "/" + _nick);
 }
 
 void IrcUser::updateHostmask(const QString &mask) {
@@ -233,7 +219,6 @@ void IrcUser::joinChannel(IrcChannel *channel) {
   if(!_channels.contains(channel)) {
     _channels.insert(channel);
     channel->joinIrcUsers(this);
-    connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
   }
 }
 
@@ -248,7 +233,7 @@ void IrcUser::partChannel(IrcChannel *channel) {
     channel->part(this);
     emit channelParted(channel->name());
     if(_channels.isEmpty() && !network()->isMe(this))
-      deleteLater();
+      quit();
   }
 }
 
@@ -261,19 +246,30 @@ void IrcUser::partChannel(const QString &channelname) {
   }
 }
 
+void IrcUser::quit() {
+  QList<IrcChannel *> channels = _channels.toList();
+  _channels.clear();
+  foreach(IrcChannel *channel, channels) {
+    disconnect(channel, 0, this, 0);
+    channel->part(this);
+  }
+  network()->removeIrcUser(this);
+  emit quited();
+}
+
 void IrcUser::channelDestroyed() {
   // private slot!
   IrcChannel *channel = static_cast<IrcChannel*>(sender());
   if(_channels.contains(channel)) {
     _channels.remove(channel);
-    if(_channels.isEmpty())
-      deleteLater();
+    if(_channels.isEmpty() && !network()->isMe(this))
+      quit();
   }
 }
 
 void IrcUser::setUserModes(const QString &modes) {
   _userModes = modes;
-  emit userModesSet(modes);
+  SYNC(ARG(modes))
 }
 
 void IrcUser::addUserModes(const QString &modes) {
@@ -285,7 +281,7 @@ void IrcUser::addUserModes(const QString &modes) {
       _userModes += modes[i];
   }
 
-  emit userModesAdded(modes);
+  SYNC(ARG(modes))
 }
 
 void IrcUser::removeUserModes(const QString &modes) {
@@ -295,5 +291,15 @@ void IrcUser::removeUserModes(const QString &modes) {
   for(int i = 0; i < modes.count(); i++) {
     _userModes.remove(modes[i]);
   }
-  emit userModesRemoved(modes);
+  SYNC(ARG(modes))
+}
+
+void IrcUser::setLastChannelActivity(BufferId buffer, const QDateTime &time) {
+  _lastActivity[buffer] = time;
+  emit lastChannelActivityUpdated(buffer, time);
+}
+
+void IrcUser::setLastSpokenTo(BufferId buffer, const QDateTime &time) {
+  _lastSpokenTo[buffer] = time;
+  emit lastSpokenToUpdated(buffer, time);
 }