/* 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. */ /* Nick Information begin: Sat Jan 17 2004 copyright: (C) 2004 by Gary Cramblitt email: garycramblitt@comcast.net */ /* The NickInfo object is a data container for information about a single nickname. It is owned by the Server object and should NOT be deleted by anything other than Server. Store a pointer to this with NickInfoPtr */ #include "nickinfo.h" #include "konversationapplication.h" #include "linkaddressbook/addressbook.h" #include "linkaddressbook/linkaddressbookui.h" #include "konversationmainwindow.h" #include "viewcontainer.h" #include "server.h" #include #include NickInfo::NickInfo(const TQString& nick, Server* server): TDEShared() { m_addressee=Konversation::Addressbook::self()->getKABCAddresseeFromNick(nick, server->getServerName(), server->getDisplayName()); m_nickname = nick; m_loweredNickname = nick.lower(); m_owningServer = server; m_away = false; m_notified = false; m_identified = false; m_printedOnline = true; if(!m_addressee.isEmpty()) Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid(), 4); connect( Konversation::Addressbook::self()->getAddressBook(), TQT_SIGNAL( addressBookChanged( AddressBook * ) ), this, TQT_SLOT( refreshAddressee() ) ); connect( Konversation::Addressbook::self(), TQT_SIGNAL(addresseesChanged()), this, TQT_SLOT(refreshAddressee())); m_changedTimer = new TQTimer( this); connect(m_changedTimer, TQT_SIGNAL( timeout()), TQT_SLOT(emitNickInfoChanged())); // reset nick color m_nickColor = 0; } NickInfo::~NickInfo() { if(!m_addressee.isEmpty()) Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid(), 1); } // Get properties of NickInfo object. TQString NickInfo::getNickname() const { return m_nickname; } TQString NickInfo::loweredNickname() const { return m_loweredNickname; } TQString NickInfo::getHostmask() const { return m_hostmask; } bool NickInfo::isAway() const { return m_away; } TQString NickInfo::getAwayMessage() const { return m_awayMessage; } TQString NickInfo::getIdentdInfo() const { return m_identdInfo; } TQString NickInfo::getVersionInfo() const { return m_versionInfo; } bool NickInfo::isNotified() const { return m_notified; } TQString NickInfo::getRealName() const { return m_realName; } TQString NickInfo::getNetServer() const { return m_netServer; } TQString NickInfo::getNetServerInfo() const { return m_netServerInfo; } TQDateTime NickInfo::getOnlineSince() const { return m_onlineSince; } uint NickInfo::getNickColor() { // do we already have a color? if(!m_nickColor) { int nickvalue = 0; for (uint index = 0; index < m_nickname.length(); index++) { nickvalue += m_nickname[index].unicode(); } m_nickColor = (nickvalue % 8) + 1; } // return color offset -1 (since we store it +1 for 0 checking) return m_nickColor-1; } bool NickInfo::isIdentified() const { return m_identified; } TQString NickInfo::getPrettyOnlineSince() const { TQString prettyOnlineSince; int daysto = m_onlineSince.date().daysTo( TQDate::currentDate()); if(daysto == 0) prettyOnlineSince = i18n("Today"); else if(daysto == 1) prettyOnlineSince = i18n("Yesterday"); else prettyOnlineSince = m_onlineSince.toString("ddd d MMMM yyyy"); //TODO - we should use TDELocale for this prettyOnlineSince += ", " + m_onlineSince.toString("h:mm ap"); return prettyOnlineSince; } // Return the Server object that owns this NickInfo object. Server* NickInfo::getServer() const { return m_owningServer; } // Set properties of NickInfo object. void NickInfo::setNickname(const TQString& newNickname) { Q_ASSERT(!newNickname.isEmpty()); if(newNickname == m_nickname) return; KABC::Addressee newaddressee = Konversation::Addressbook::self()->getKABCAddresseeFromNick(newNickname, m_owningServer->getServerName(), m_owningServer->getDisplayName()); //We now know who this person is if(m_addressee.isEmpty() && !newaddressee.isEmpty()) { //Associate the old nickname with new contact Konversation::Addressbook::self()->associateNick(newaddressee,m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName()); Konversation::Addressbook::self()->saveAddressee(newaddressee); } else if(!m_addressee.isEmpty() && newaddressee.isEmpty()) { Konversation::Addressbook::self()->associateNick(m_addressee, newNickname, m_owningServer->getServerName(), m_owningServer->getDisplayName()); Konversation::Addressbook::self()->saveAddressee(newaddressee); newaddressee = m_addressee; } m_addressee = newaddressee; m_nickname = newNickname; m_loweredNickname = newNickname.lower(); TQString realname = m_addressee.realName(); startNickInfoChangedTimer(); } void NickInfo::emitNickInfoChanged() { m_owningServer->emitNickInfoChanged(this); emit nickInfoChanged(); } void NickInfo::startNickInfoChangedTimer() { if(!m_changedTimer->isActive()) m_changedTimer->start(3000, true /*single shot*/); } void NickInfo::setHostmask(const TQString& newMask) { if (newMask.isEmpty() || newMask == m_hostmask) return; m_hostmask = newMask; startNickInfoChangedTimer(); } void NickInfo::setAway(bool state) { if(state == m_away) return; m_away = state; startNickInfoChangedTimer(); if(!m_addressee.isEmpty()) Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid()); } void NickInfo::setIdentified(bool identified) { if(identified == m_identified) return; m_identified = identified; startNickInfoChangedTimer(); } void NickInfo::setAwayMessage(const TQString& newMessage) { if(m_awayMessage == newMessage) return; m_awayMessage = newMessage; startNickInfoChangedTimer(); } void NickInfo::setIdentdInfo(const TQString& newIdentdInfo) { if(m_identdInfo == newIdentdInfo) return; m_identdInfo = newIdentdInfo; startNickInfoChangedTimer(); } void NickInfo::setVersionInfo(const TQString& newVersionInfo) { if(m_versionInfo == newVersionInfo) return; m_versionInfo = newVersionInfo; startNickInfoChangedTimer(); } void NickInfo::setNotified(bool state) { if(state == m_notified) return; m_notified = state; startNickInfoChangedTimer(); } void NickInfo::setRealName(const TQString& newRealName) { if (newRealName.isEmpty() || m_realName == newRealName) return; m_realName = newRealName; startNickInfoChangedTimer(); } void NickInfo::setNetServer(const TQString& newNetServer) { if (newNetServer.isEmpty() || m_netServer == newNetServer) return; m_netServer = newNetServer; startNickInfoChangedTimer(); } void NickInfo::setNetServerInfo(const TQString& newNetServerInfo) { if (newNetServerInfo.isEmpty() || newNetServerInfo == m_netServerInfo) return; m_netServerInfo = newNetServerInfo; startNickInfoChangedTimer(); } void NickInfo::setOnlineSince(const TQDateTime& datetime) { if (datetime.isNull() || datetime == m_onlineSince) return; m_onlineSince = datetime; startNickInfoChangedTimer(); } KABC::Addressee NickInfo::getAddressee() const { return m_addressee;} void NickInfo::refreshAddressee() { //m_addressee might not have changed, but information inside it may have. KABC::Addressee addressee=Konversation::Addressbook::self()->getKABCAddresseeFromNick(m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName()); if(!addressee.isEmpty() && addressee.uid() != m_addressee.uid()) { //This nick now belongs to a different addressee. We need to update the status for both the old and new addressees. Konversation::Addressbook::self()->emitContactPresenceChanged(addressee.uid()); } m_addressee = addressee; startNickInfoChangedTimer(); if(!m_addressee.isEmpty()) Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid()); } TQString NickInfo::tooltip() const { TQString strTooltip; TQTextStream tooltip( &strTooltip, IO_WriteOnly ); tooltip << ""; tooltip << ""; tooltipTableData(tooltip); tooltip << "
"; return strTooltip; } TQString NickInfo::getBestAddresseeName() { if(!m_addressee.formattedName().isEmpty()) { return m_addressee.formattedName(); } else if(!m_addressee.realName().isEmpty()) { return m_addressee.realName(); } else if(!getRealName().isEmpty()) { return getRealName(); } else { return getNickname(); } } void NickInfo::tooltipTableData(TQTextStream &tooltip) const { tooltip << ""; bool dirty = false; KABC::Picture photo = m_addressee.photo(); KABC::Picture logo = m_addressee.logo(); bool isimage=false; if(photo.isIntern()) { TQMimeSourceFactory::defaultFactory()->setImage( "photo", photo.data() ); tooltip << ""; dirty=true; isimage=true; } else if(!photo.url().isEmpty()) { //JOHNFLUX FIXME TODO: //Are there security problems with this? loading from an external refrence? //Assuming not. tooltip << ""; dirty=true; isimage=true; } if(logo.isIntern()) { TQMimeSourceFactory::defaultFactory()->setImage( "logo", logo.data() ); tooltip << ""; dirty=true; isimage=true; } else if(!logo.url().isEmpty()) { //JOHNFLUX FIXME TODO: //Are there security problems with this? loading from an external refrence? //Assuming not. tooltip << ""; dirty=true; isimage=true; } tooltip << "" << (isimage?"":"
"); if(!m_addressee.formattedName().isEmpty()) { tooltip << m_addressee.formattedName(); dirty = true; } else if(!m_addressee.realName().isEmpty()) { tooltip << m_addressee.realName(); dirty = true; } else if(!getRealName().isEmpty() && getRealName().lower() != loweredNickname()) { TQString escapedRealName( getRealName() ); escapedRealName.replace("<","<").replace(">",">"); tooltip << escapedRealName; dirty = true; } else { tooltip << getNickname(); //Don't set dirty if all we have is their nickname } if(m_identified) tooltip << i18n(" (identified)"); tooltip << (isimage?"":"
") << "
"; tooltip << ""; if(!m_addressee.emails().isEmpty()) { tooltip << "" << i18n("Email") << ": "; tooltip << m_addressee.emails().join(", "); tooltip << ""; dirty=true; } if(!m_addressee.organization().isEmpty()) { tooltip << "" << m_addressee.organizationLabel() << ": " << m_addressee.organization() << ""; dirty=true; } if(!m_addressee.role().isEmpty()) { tooltip << "" << m_addressee.roleLabel() << ": " << m_addressee.role() << ""; dirty=true; } KABC::PhoneNumber::List numbers = m_addressee.phoneNumbers(); for( KABC::PhoneNumber::List::ConstIterator it = numbers.begin(); it != numbers.end(); ++it) { tooltip << "" << (*it).label() << ": " << (*it).number() << ""; dirty=true; } if(!m_addressee.birthday().toString().isEmpty() ) { tooltip << "" << m_addressee.birthdayLabel() << ": " << m_addressee.birthday().toString("ddd d MMMM yyyy") << ""; dirty=true; } if(!getHostmask().isEmpty()) { tooltip << "" << i18n("Hostmask:") << " " << getHostmask() << ""; dirty=true; } if(isAway()) { tooltip << "" << i18n("Away Message:") << " "; if(!getAwayMessage().isEmpty()) tooltip << getAwayMessage(); else tooltip << i18n("(unknown)"); tooltip << ""; dirty=true; } if(!getOnlineSince().toString().isEmpty()) { tooltip << "" << i18n("Online Since:") << " " << getPrettyOnlineSince() << ""; dirty=true; } } void NickInfo::showLinkAddressbookUI() { LinkAddressbookUI *linkaddressbookui = new LinkAddressbookUI(m_owningServer->getViewContainer()->getWindow(), NULL, m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName(), m_realName); linkaddressbookui->show(); } bool NickInfo::editAddressee() const { if(m_addressee.isEmpty()) return false; Konversation::Addressbook::self()->editAddressee(m_addressee.uid()); return true; } bool NickInfo::sendEmail() const { return Konversation::Addressbook::self()->sendEmail(m_addressee); } void NickInfo::setPrintedOnline(bool printed) { m_printedOnline=printed; } bool NickInfo::getPrintedOnline() { if(this) return m_printedOnline; else return false; } #include "nickinfo.moc"