New patches: [Entity Time support Maciej Niedzielski **20070119201927 Reply to both urn:xmpp:time and jabber:iq:time queries. Display timezone and time based on XEP-0202 timezone information. Note: all timezone offsets are now in minutes, not hours! ] { hunk ./iris/xmpp-im/types.cpp 1700 - d->timeStamp = d->timeStamp.addSecs(timeZoneOffset * 3600); + d->timeStamp = d->timeStamp.addSecs(timeZoneOffset * 60); hunk ./iris/xmpp-im/xmpp_tasks.cpp 703 - dt = dt.addSecs(client()->timeZoneOffset() * 3600); + dt = dt.addSecs(client()->timeZoneOffset() * 60); addfile ./src/entitytimetask.cpp hunk ./src/entitytimetask.cpp 1 +/* + * entitytimetask.cpp - Entity time fetching task + * Copyright (C) 2007 Maciej Niedzielski + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include "entitytimetask.h" +#include "xmpp_xmlcommon.h" + +using namespace XMPP; + +/** + * \class EntityTimeTask + * \brief Gets entity time + * + * This task can be used to get time zone information of an entity. + */ + + +// convert [+|-]hh:mm to minutes +static Maybe stringToOffset(const QString &off) +{ + QTime t = QTime::fromString(off.mid(1), "hh:mm"); + + if (t.isValid() && off[0] == '+' || off[0] == '-') { + int m = t.hour() * 60 + t.minute(); + if (off[0] == '-') + m = -m; + return m; + } + else { + return Maybe(); + } +} + +/** + * \brief Create new task. + */ +EntityTimeTask::EntityTimeTask(Task* parent) : Task(parent) +{ +} + +/** + * \brief Queried entity's JID. + */ +const Jid & EntityTimeTask::jid() const +{ + return jid_; +} + +/** + * \brief Prepares the task to get information from JID. + */ +void EntityTimeTask::get(const Jid &jid) +{ + jid_ = jid; + iq_ = createIQ(doc(), "get", jid_.full(), id()); + QDomElement query = doc()->createElement("query"); + query.setAttribute("xmlns", "urn:xmpp:time"); + iq_.appendChild(query); +} + +void EntityTimeTask::onGo() +{ + send(iq_); +} + +bool EntityTimeTask::take(const QDomElement &x) +{ + if (!iqVerify(x, jid_, id())) + return false; + + if (x.attribute("type") == "result") { + bool found = false; + QDomElement q = queryTag(x); + QDomElement tag; + tag = findSubTag(q, "utc", &found); + if (found) + utc_ = tagContent(tag); + tag = findSubTag(q, "tzo", &found); + if (found) { + tzoString_ = tagContent(tag); + tzo_ = stringToOffset(tzoString_); + } + setSuccess(); + } + else { + setError(x); + } + + return true; +} + +/** + * \brief Timezone offset in [+|-]hh:mm format (or empty string if no data). + */ +const QString& EntityTimeTask::timezoneOffsetString() const +{ + return tzoString_; +} + +/** + * \brief Timezone offset in minutes (if available). + */ +Maybe EntityTimeTask::timezoneOffset() const +{ + return tzo_; +} addfile ./src/entitytimetask.h hunk ./src/entitytimetask.h 1 +/* + * entitytimetask.h - Entity time fetching task + * Copyright (C) 2007 Maciej Niedzielski + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef ENTITYTIMETASK_H +#define ENTITYTIMETASK_H + +#include +#include "xmpp_task.h" +#include "xmpp_jid.h" +#include "maybe.h" + +class EntityTimeTask : public XMPP::Task +{ +public: + EntityTimeTask(Task*); + + void onGo(); + bool take(const QDomElement &); + void get(const XMPP::Jid &jid); + const XMPP::Jid & jid() const; + + const QString& timezoneOffsetString() const; + Maybe timezoneOffset() const; + +private: + QDomElement iq_; + XMPP::Jid jid_; + QString utc_, tzoString_; + Maybe tzo_; +}; + +#endif hunk ./src/infodlg.cpp 43 +#include "entitytimetask.h" hunk ./src/infodlg.cpp 67 + QList timeRequested; hunk ./src/infodlg.cpp 123 + requestEntityTime(d->jid.withResource(r.name())); hunk ./src/infodlg.cpp 605 + updateStatus(); + } + } +} + +void InfoDlg::requestEntityTime(const Jid& j) +{ + d->timeRequested += j.full(); + EntityTimeTask *jet = new EntityTimeTask(d->pa->client()->rootTask()); + connect(jet, SIGNAL(finished()), SLOT(entityTimeFinished())); + jet->get(j); + jet->go(true); +} + +void InfoDlg::entityTimeFinished() +{ + EntityTimeTask *j = (EntityTimeTask *)sender(); + if(j->success()) { + foreach(UserListItem* u, d->pa->findRelevant(j->jid())) { + UserResourceList::Iterator rit = u->userResourceList().find(j->jid().resource()); + bool found = (rit == u->userResourceList().end()) ? false: true; + if(!found) + continue; + + (*rit).setTimezone(j->timezoneOffset()); + d->pa->contactProfile()->updateEntry(*u); hunk ./src/infodlg.h 61 + void entityTimeFinished(); hunk ./src/infodlg.h 81 + void requestEntityTime(const XMPP::Jid& j); hunk ./src/psiaccount.cpp 116 +#include "timeserver.h" hunk ./src/psiaccount.cpp 567 + // Time server + new TimeServer(d->client->rootTask()); + hunk ./src/src.pri 168 + $$PWD/entitytimetask.h \ + $$PWD/timeserver.h \ hunk ./src/src.pri 281 + $$PWD/entitytimetask.cpp \ + $$PWD/timeserver.cpp \ hunk ./src/systeminfo.cpp 40 - timezone_offset_ = s.toInt(); + timezone_offset_ = s.toInt() * 60; // FIX-ME: should really read the offset in minutes hunk ./src/systeminfo.cpp 147 - //GetTimeZoneInformation(&i); - //timezone_offset_ = (-i.Bias) / 60; hunk ./src/systeminfo.cpp 152 - timezone_offset_ = (-bias) / 60; + timezone_offset_ = -bias; hunk ./src/systeminfo.cpp 194 +/** + * \fn int SystemInfo::timezoneOffset() + * \brief Local timezone offset in minutes. + */ + +/** + * \fn const QString& SystemInfo::timezoneString() const + * \brief Local timezone name. + */ + addfile ./src/timeserver.cpp hunk ./src/timeserver.cpp 1 +/* + * timeserver.cpp - Entity time server + * Copyright (C) 2001, 2002, 2007 Justin Karneges, Maciej Niedzielski + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "timeserver.h" +#include "systeminfo.h" +#include "xmpp_xmlcommon.h" +#include + +using namespace XMPP; + + +/** + * \class TimeServer + * \brief Server current time + * + * This serving task answers urn:xmpp:time and jabber:iq:time queries + */ + +TimeServer::TimeServer(Task *parent) +:Task(parent) +{ +} + +TimeServer::~TimeServer() +{ +} + +bool TimeServer::take(const QDomElement &e) +{ + if (e.tagName() != "iq" || e.attribute("type") != "get") + return false; + + QString ns = queryNS(e); + if (ns == "urn:xmpp:time") { + QDomElement iq = createIQ(doc(), "result", e.attribute("from"), e.attribute("id")); + QDomElement query = doc()->createElement("query"); + query.setAttribute("xmlns", ns); + iq.appendChild(query); + + QDateTime local = QDateTime::currentDateTime(); + int off = SystemInfo::instance()->timezoneOffset(); + QTime t = QTime(0, 0).addSecs(abs(off)*60); + QString tzo = (off < 0 ? "-" : "+") + t.toString("HH:mm"); + query.appendChild(textTag(doc(), "tzo", tzo)); + query.appendChild(textTag(doc(), "utc", local.toUTC().toString(Qt::ISODate) + "Z")); + + send(iq); + return true; + } + else if (ns == "jabber:iq:time") { + QDomElement iq = createIQ(doc(), "result", e.attribute("from"), e.attribute("id")); + QDomElement query = doc()->createElement("query"); + query.setAttribute("xmlns", "jabber:iq:time"); + iq.appendChild(query); + + QDateTime local = QDateTime::currentDateTime(); + QString str = SystemInfo::instance()->timezoneString(); + query.appendChild(textTag(doc(), "utc", TS2stamp(local.toUTC()))); + query.appendChild(textTag(doc(), "tz", str)); + query.appendChild(textTag(doc(), "display", QString("%1 %2").arg(local.toString()).arg(str))); + + send(iq); + return true; + } + return false; +} addfile ./src/timeserver.h hunk ./src/timeserver.h 1 +/* + * timeserver.h - Entity time server + * Copyright (C) 2007 Maciej Niedzielski + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef TIMESERVER_H +#define TIMESERVER_H + +#include "xmpp_task.h" + +class TimeServer : public XMPP::Task +{ + Q_OBJECT +public: + TimeServer(Task *); + ~TimeServer(); + bool take(const QDomElement &); +}; + +#endif hunk ./src/userlist.cpp 106 +/** + * \brief Timezone offset in minutes (if available). + */ +Maybe UserResource::timezoneOffset() const +{ + return v_tzo; +} + +/** + * \brief Timezone offset as string (or empty string if no data). + * + * String is formatted as "UTC[+|-]h[:mm]". + */ +const QString& UserResource::timezoneOffsetString() const +{ + return v_tzoString; +} + +/** + * \brief Set timezone offset (in minutes). + */ +void UserResource::setTimezone(Maybe off) +{ + v_tzo = off; + + if (off.hasValue()) { + QTime t = QTime(0, 0).addSecs(abs(off.value())*60); + QString u = QString("UTC") + (off.value() < 0 ? "-" : "+"); + u += QString::number(t.hour()); + if (t.minute()) + u += QString(":%1").arg(t.minute()); + v_tzoString = u; + } + else + v_tzoString = ""; +} + hunk ./src/userlist.cpp 603 + // Entity Time + if (r.timezoneOffset().hasValue()) { + QDateTime dt = QDateTime::currentDateTime().toUTC().addSecs(r.timezoneOffset().value()*60); + str += QString("
") + QObject::tr("Time") + QString(": %1 (%2)").arg(dt.toString(Qt::TextDate)).arg(r.timezoneOffsetString()) + ""; + } + hunk ./src/userlist.h 33 +#include "maybe.h" hunk ./src/userlist.h 52 + Maybe timezoneOffset() const; + const QString& timezoneOffsetString() const; + void setTimezone(Maybe tzo); + hunk ./src/userlist.h 72 + Maybe v_tzo; + QString v_tzoString; } [Fix and refactor Entity Time in InfoDlg Maciej Niedzielski **20070120031716] { hunk ./src/infodlg.cpp 67 - QList timeRequested; hunk ./src/infodlg.cpp 121 - requestClientVersion(d->jid.withResource(r.name())); - requestEntityTime(d->jid.withResource(r.name())); + requestResourceInfo(d->jid.withResource(r.name())); hunk ./src/infodlg.cpp 582 -void InfoDlg::requestClientVersion(const Jid& j) +/** + * \brief Requests per-resource information. + * + * Gets information about client version and time. + */ +void InfoDlg::requestResourceInfo(const Jid& j) hunk ./src/infodlg.cpp 590 + hunk ./src/infodlg.cpp 595 + + EntityTimeTask *jet = new EntityTimeTask(d->pa->client()->rootTask()); + connect(jet, SIGNAL(finished()), SLOT(entityTimeFinished())); + jet->get(j); + jet->go(true); hunk ./src/infodlg.cpp 619 -void InfoDlg::requestEntityTime(const Jid& j) -{ - d->timeRequested += j.full(); - EntityTimeTask *jet = new EntityTimeTask(d->pa->client()->rootTask()); - connect(jet, SIGNAL(finished()), SLOT(entityTimeFinished())); - jet->get(j); - jet->go(true); -} - hunk ./src/infodlg.cpp 661 - requestClientVersion(j.withResource(r.name())); + requestResourceInfo(j.withResource(r.name())); hunk ./src/infodlg.h 80 - void requestClientVersion(const XMPP::Jid& j); - void requestEntityTime(const XMPP::Jid& j); + void requestResourceInfo(const XMPP::Jid& j); } [Use XEP-0202 temporary namespace Maciej Niedzielski **20070208161809] { hunk ./src/entitytimetask.cpp 74 - query.setAttribute("xmlns", "urn:xmpp:time"); + query.setAttribute("xmlns", "http://www.xmpp.org/extensions/xep-0202.html#ns"); hunk ./src/timeserver.cpp 33 - * This serving task answers urn:xmpp:time and jabber:iq:time queries + * This serving task answers XEP-0202 and XEP-0090 queries hunk ./src/timeserver.cpp 51 - if (ns == "urn:xmpp:time") { + if (ns == "http://www.xmpp.org/extensions/xep-0202.html#ns") { } [Updated delayed delivery (XEP-0203) Maciej Niedzielski **20070120010516] { hunk ./iris/xmpp-im/types.cpp 1484 - e.setAttribute("stamp", TS2stamp(d->timeStamp)); + e.setAttribute("stamp", TS2stamp(d->timeStamp.toUTC())); + s.appendChild(e); + + e = s.createElement("urn:xmpp:delay", "x"); + e.setAttribute("stamp", d->timeStamp.toUTC().toString(Qt::ISODate) + "Z"); hunk ./iris/xmpp-im/types.cpp 1701 - QDomElement t = root.elementsByTagNameNS("jabber:x:delay", "x").item(0).toElement(); - if(!t.isNull()) { - d->timeStamp = stamp2TS(t.attribute("stamp")); - d->timeStamp = d->timeStamp.addSecs(timeZoneOffset * 60); + QDomElement t = root.elementsByTagNameNS("urn:xmpp:delay", "x").item(0).toElement(); + if (!t.isNull()) { + d->timeStamp = QDateTime::fromString(t.attribute("stamp").left(19), Qt::ISODate).addSecs(timeZoneOffset * 60); + d->spooled = true; + } + else if (t = root.elementsByTagNameNS("jabber:x:delay", "x").item(0).toElement(), !t.isNull()) { + d->timeStamp = stamp2TS(t.attribute("stamp")).addSecs(timeZoneOffset * 60); hunk ./iris/xmpp-im/xmpp_tasks.cpp 706 + } + else if(i.tagName() == "x" && i.attribute("xmlns") == "urn:xmpp:delay") { + if(i.hasAttribute("stamp")) { + QDateTime dt = QDateTime::fromString(i.attribute("stamp").left(19), Qt::ISODate).addSecs(client()->timeZoneOffset() * 60); + p.setTimeStamp(dt); + } } [Use XEP-0203 temporary namespace Maciej Niedzielski **20070209011558] { hunk ./iris/xmpp-im/types.cpp 1487 - e = s.createElement("urn:xmpp:delay", "x"); + e = s.createElement("http://www.xmpp.org/extensions/xep-0203.html#ns", "x"); hunk ./iris/xmpp-im/types.cpp 1701 - QDomElement t = root.elementsByTagNameNS("urn:xmpp:delay", "x").item(0).toElement(); + QDomElement t = root.elementsByTagNameNS("http://www.xmpp.org/extensions/xep-0203.html#ns", "x").item(0).toElement(); hunk ./iris/xmpp-im/xmpp_tasks.cpp 707 - else if(i.tagName() == "x" && i.attribute("xmlns") == "urn:xmpp:delay") { + else if(i.tagName() == "x" && i.attribute("xmlns") == "http://www.xmpp.org/extensions/xep-0203.html#ns") { } Context: [Bring To Front and New Blank Message global shortcuts Maciej Niedzielski **20070208151313] [Disable auto-browse by default. Remko Troncon **20070208140039] [Show Hidden -> Show Hidden Contacts. Remko Troncon **20070207140047] [Default 'Show "show away/xa"' to false. Remko Troncon **20070207135851] [Reply to roster pushes. Remko Troncon **20070207112517] [Don't advertise empty hostnames for file transfer Maciej Niedzielski **20070207125626] [Disable rich text pasting in message window Maciej Niedzielski **20070206201931] [Display inline message subject in a separate line Maciej Niedzielski **20070206200127] [Enable XHTML-IM rendering in messages Maciej Niedzielski **20070206193616] [Don't invite people to a MUC if they are already there. Remko Troncon **20070206151054] [Add drag functionality to MUC dialog. Remko Troncon **20070206145853] [Fixing 'Add' button in MUC config dialog. Remko Troncon **20070206142956] [Removing some obsolete code. Remko Troncon **20070205131835] [Added a Google FT dialog. Remko Troncon **20070205122919] [Fixed some XML namespace problems with libjingle. Remko Troncon **20070205103134] [Forgot 2 class declarations. Remko Troncon **20070205101157] [Initial work on Google FT support. Remko Troncon **20070204153530] [Separating Google FT from Jingle. Remko Troncon **20070204105034] [More flexible libjingle compilation. Remko Troncon **20070203201432] [Making the tip dialog bigger. Remko Troncon **20070203203643] [Add missing library to XMMS plugin. Remko Troncon **20070203161332] [Fixed compilation warning on Linux. Michail Pishchagin **20070202201441] [Fixed QCA-SASL issue where the authzid was always set. Remko Troncon **20070202155936] [Join two lines in advanced options. Remko Troncon **20070202012231] [Some visual tweaks in the toolbar dialog. Remko Troncon **20070202011819] [Make more room in the toolbar dialog. Remko Troncon **20070202010534] [Clarified 'Unable to bind port' message. Remko Troncon **20070202004805] [Make about dialog parentless. Remko Troncon **20070202003224] [Avoid compilation warning. Remko Troncon **20070202001336] [Fancifying the tip of the day. Remko Troncon **20070202000723] [Disable gnupg again. Remko Troncon **20070201174210] [Fix disabled 'add' button in MUC config dialog. Remko Troncon **20070201173036] [Avoid broadcasting tune information when WinAmp scrolls. Remko Troncon **20070201102418 Thanks to michalj. ] [Fix simplesasl challenge parser Maciej Niedzielski **20070206120831] [(Don't) sort groups in MUC window Maciej Niedzielski **20070201163554] [Do not present error message when unable to fetch the server list. Remko Troncon **20070131202025] [Updated README. Remko Troncon **20070131190050] [Fix tab order in account registration dialog. Remko Troncon **20070131184220] [Make registration URIs clickable (and selectable). Remko Troncon **20070131182626] [Move the account registration dialog back to the first step upon disconnect. Remko Troncon **20070131121609] [Fix segfault when enabling/disabling accounts. Remko Troncon **20070131103630] [Fixing the crash when using tabs and trying to close a chat with a recently incoming message. Kevin Smith **20070131094422] [Workaround for servers that do not send a response to an unregister request. Remko Troncon **20070131093531] [Inform the user of his JID after registration. Remko Troncon **20070130212800] [Make Search button the default button of Search Dialog Maciej Niedzielski **20070201012915] [Handle TLS when registering account. Remko Troncon **20070130205346] [Disabling of SSL is not necessary for account registration. Remko Troncon **20070130202653] [Some aesthetic changes to the regdlg. Remko Troncon **20070130201354] [Allow to retrieve the list of XMPP servers that support in-band registration. Remko Troncon **20070130192240] [Close connection when the user cancels registration. Remko Troncon **20070130181246] [Implemented in-band registration (XEP-0077). Remko Troncon **20070130171858 Refactored registration dialog in the process. ] [Add instructions to XDataWidget. Remko Troncon **20070130153427] [Removed UI compilation warning. Remko Troncon **20070130115852] [Removed some warnings from .qc modules. Remko Troncon **20070130115709] [Move 'User says' chat option to hidden options. Remko Troncon **20070130102356] [Set 'Notify when auth received' to false by default. Remko Troncon **20070130101601] [Fixed Prev/Next tab comments. Remko Troncon **20070130100908] [Updated .desktop file to most recent version. Remko Troncon **20070130095632 Alphabetized translations. Thanks to Cliff Dugal. ] [Added more tab-switching shortcuts for Windows users. Michail Pishchagin **20070129175036] [Refactored main window position restoring code. Michail Pishchagin **20070129173038] [Make auto-copy work also when selecting by double clicking Maciej Niedzielski **20070128145937] [Get the next/previous tabs the right way around in the config file Kevin Smith **20070126201231] [Change ContactView shortcuts without restart Maciej Niedzielski **20070126111028] [Stanza error handling improvements Maciej Niedzielski **20070125151126] [Fixed tooltips in DiscoDlg. Michail Pishchagin **20070118175228] [Use XMPP::Status::* constants instead of STATUS_*. Michail Pishchagin **20070110151520] [Removed outdated iconsets/emoticons/README file. Michail Pishchagin **20070109163008] [OptionsTabIconset* are now able to list embedded iconsets; Embedded default emoticons iconset. Michail Pishchagin **20070109162511] [IconsetSelect wouldn't assert when it doesn't have any iconsets. Michail Pishchagin **20070109161707] [Another qt3to4 patch (thanks again Stigger) Kevin Smith **20070109105500] [Converting some classes using Qt3support to Qt4 proper (Thanks to Stigger) Kevin Smith **20070109102145] [Added QSize to optionstree types. Remko Troncon **20070108203340] [GlobalAccel is now obsolete and removed from repository. Michail Pishchagin **20070108170202] [Global shortcuts. Michail Pishchagin **20070108065657 Thanks to Machekku. ] [Sort room roster in groupchats. Michail Pishchagin **20070107212236] [Gracefully resize columns in DiscoDlg. Michail Pishchagin **20061225004401] [Don't crash in GroupChatDlg when trying to perform an action on user who quit the room. Michail Pishchagin **20061224231038 Thanks to Dion. ] [Use hostname when using HTTP connect proxy (FS#579). Remko Troncon **20061223102350 Warning: this means that no SRV lookups are done anymore when a HTTP CONNECT PROXY is used. A slightly better detection mechanism will be implemented later. ] [Do not sign presence sent to MUC rooms (FS#606). Remko Troncon **20061220123454] [Fixed empty window appearing on OS X (FS#605). Remko Troncon **20061217201724] [Fix segfault on OS X due to double delete. Remko Troncon **20061217200303] [Added Q_OBJECT macro to TranslationManager. Remko Troncon **20061217104147] [Removing Q3CString from Jid. Remko Troncon **20061215224858] [Tightening include in jid.cpp. Remko Troncon **20061215222713] [Completed XEP-0004 (Data forms) support. Remko Troncon **20061214140351 We now support data forms in messages (thanks to Roelof Naude) ] [Reply to invalid disco#info requests. Remko Troncon **20061214123701] [Added shortcuts icon. Remko Troncon **20061214115800] [Forgot closing #warning. Remko Troncon **20061214085033] [Removed MainWin::setInfo(). Michail Pishchagin **20061213161941] [Cleaning up some more singletons. Remko Troncon **20061213144209] [Clean up the default menubar. Remko Troncon **20061213143809] [Clean up the shortcutmanager upon exit. Remko Troncon **20061213141827] [Include language_name in the translations. Remko Troncon **20061213134432] [Fixed the SyncThread::call() method. Michail Pishchagin **20061213124029] [Chop off encoding from XML language string. Remko Troncon **20061213085832] [Added stream language setting. Remko Troncon **20061212232131] [Moved translation operations into TranslationManager. Remko Troncon **20061212222831] [Moving XData to iris. Remko Troncon **20061212144557] [Fixed compilation warnings when compiling in release mode. Michail Pishchagin **20061212100730] [Don't issue warning when deleting of pointer to incomplete type, when compiling moc_tabdlg.cpp. Michail Pishchagin **20061208085153] [Remove dependency on image plugins. Remko Troncon **20061207102450] [Fix double 'overwrite file' check. Remko Troncon **20061206215847 Thanks to machekku. ] [HttpAuthRequest refactoring. Remko Troncon **20061206203535] [Allow empty http auth requests. Remko Troncon **20061206200908 Thanks to Machekku. ] [Don't show http auth confirmation when iq type is not get. Remko Troncon **20061206195927 Thanks to machekku. ] [Shortcuts options tab fix. Remko Troncon **20061206195426] [Reply to privacy list pushes. Remko Troncon **20061206194718] [Fix error replies to server. Remko Troncon **20061206194712] [Privacy list refactoring. Remko Troncon **20061206192411] [Filter text nodes in privacy lists. Remko Troncon **20061206191808] [Don't use relative paths in Psi project files. Michail Pishchagin **20061206162140] [Fixed menubar on non-osx platforms. Remko Troncon **20061206130833] [Fixed disappearing menubar on OS X. Remko Troncon **20061205194734] [Reset status messages when going offline. Remko Troncon **20061204133046] [Last Activity (XEP-0012) for offline users. Remko Troncon **20061204131343] [Disable 'Publish tune' if no PEP is available (FS#594). Remko Troncon **20061203150921] [Some PsiContactList refactoring. Remko Troncon **20061203133749] [Fix illegal nick change handling (FS#596). Remko Troncon **20061203123229] [Uncheck legacy ssl probe if disabled. Remko Troncon **20061129191140] [Some xmpptest tweaks. Remko Troncon **20061129191102] [Remove obsolete widgets. Remko Troncon **20061128175136] [Keep account JID bare. Remko Troncon **20061128140200] [Finished authzid support. Remko Troncon **20061128125911] [Encode domain names before passing them to SASL. Remko Troncon **20061128104108] [Fix overriding of realms in simplesasl. Remko Troncon **20061128104041] [Compilation fix. Remko Troncon **20061128092442] [Encode internationalized domain names. Remko Troncon **20061128091835] [Reworked SSL/TLS account settings. Remko Troncon **20061127221100] [We don't need PsiCon::mainWin() around anymore. Michail Pishchagin **20061126210629] [Removed dependencies on MainWin. Michail Pishchagin **20061126194557] [Fix httpconnect.cpp newline detection bug. Remko Troncon **20061126181911 Thanks to michalj. ] [but lets make it statuschangeless in MUC by default Kevin Smith **20061126124231] [Show status changes in MUC (thanks dion) Kevin Smith **20061126123852] [OptionsTab Shortcuts (Thanks Ephraim) Kevin Smith **20061126120715] [temporary add options.ui.contactlist.temp-no-roster-animation option to workaround extrem CPU usage of animated roaster icons Martin H. **20060730215542] [Auto-copy fix Maciej Niedzielski **20061106222750] [Report reason when people leave a MUC (Thanks Dion) Kevin Smith **20061126102314] [IconToolButton will display text if it doesn't have an icon. Michail Pishchagin **20061125185504] [options.tip.* -> options.ui.tip.*. Michail Pishchagin **20061125184705] [Icon -> PsiIcon. Michail Pishchagin **20061125173226] [Windows Vista detection support Kevin Smith **20061122230043] [Three doxygen comments from Textshell Kevin Smith **20061122221724] [(ClassName *)PsiAccount::dialogFind("ClassName") -> PsiAccount::findDialog(). Michail Pishchagin **20061122132956] [Two null XMPP::Jids are equal. Michail Pishchagin **20061122120403] [Correctly ignore WinAmp header warnings. Michail Pishchagin **20061120145252] [Suppress more warnings. Michail Pishchagin **20061120140823] [Suppress compilation warnings. Michail Pishchagin **20061120140034] [Conditional plugin compilation. Remko Troncon **20061120140852] [Fix to BookmarkManager (thanks Ephraim) Kevin Smith **20061119195128] [Make window flashing optional (options.xml) Kevin Smith **20061119152845] [Don't needlessly expand LineEdit vertically in ChatDlg. Michail Pishchagin **20061113125127] [New Alertable class to simplify alert icon plumbing. Michail Pishchagin **20061114213929] [Strip unnecessary data from the manifest file. Michail Pishchagin **20061108164138] [Compile-in image format plugins on Windows. Michail Pishchagin **20061108160706] [Ephraim's fix correction for the gcdialog Kevin Smith **20061107165709] [AvatarFactory ensures that all avatars are square in size. Michail Pishchagin **20061107160555] [Moved function to create transparent QPixmaps to separate file. Michail Pishchagin **20061107160210] [Changed animation groupbox to combobox. Michail Pishchagin **20061106163452 Thanks to Martin H. ] [Visual Styles Manifest (for Windows) Maciej Niedzielski **20061018203842 Enables Windows Visual Styles in Psi. Now all common dialogs (file open, file save) will use visual styles, too. ] [Fixed splitter resizing in chats and groupchats. Michail Pishchagin **20061106151310 Thanks to Ephraim. ] [Added Q_OBJECT macro to aboutdlg. Remko Troncon **20061104145551] [Fixed sort order in groupchat dialog. Remko Troncon **20061103220932] [Do not add a body to MUC topic changes. Remko Troncon **20061103170842] [More Aspell UTF-8 support. Remko Troncon **20061102211848] [Added Mac OS X spell checking support. Remko Troncon **20061102203818] [Use UTF-8 in the ASpellChecker. Remko Troncon **20061102182805] [Fix statusdlg signal slot. Remko Troncon **20061101003800] [Added support for JEP-70. Remko Troncon **20061031193236 Thanks to Machekku. ] [Added more ignore rules to the boring file. Michail Pishchagin **20061030100120] [Tab drag and drop Kevin Smith **20061026100810] [Disable 'check spelling' option when no spell checker is available. Remko Troncon **20061026095747 Thanks to Ephraim. ] [Added XMPP::Status constructor. Remko Troncon **20061026095152] [Fix shortcuts in event dialog. Remko Troncon **20061026085820] [Remove unwanted whitespace from error stanza. Remko Troncon **20061026075059 Thanks to Machekku. ] [Fixed typo in shortcut manager. Remko Troncon **20061026074154] [Fixed warning fix. Remko Troncon **20061025213440] [Fix compilation warning. Remko Troncon **20061025172832] [Make sure that there is at least one shortcut to send chat messages. Remko Troncon **20061025154932] [Workaround for shortcut segfault. Remko Troncon **20061025154348] [Remove the shortcut for clearing the chatlog. Remko Troncon **20061025153546] [Start rewriting Tab widgets Kevin Smith **20061025150151] [Narrowing includes down. Remko Troncon **20061025134832] [Split off some common classes from im.h. Remko Troncon **20061025134244] [Make resourceMenu use XMPP::Status. Remko Troncon **20061025121333] [Make status presets use XMPP::Status. Remko Troncon **20061025120452] [Removed redundant type field from XMPP::Status. Remko Troncon **20061025114556] [Added XMPP::Status::type() function and Type enum for safer programming. Michail Pishchagin **20061025105450] [Refactored BlockTransportPopupList class a little. Michail Pishchagin **20061025082210] [mac builds should be devel, not beta3 Kevin Smith **20061025094954] [Use QDesktopServices::openUrl instead of our hand coded way. Remko Troncon **20061025094241] [Enable new tray icon by default on all platforms. Remko Troncon **20061024214146] [Add shadow around tray icon on X11. Remko Troncon **20061024192121] [More tray icon code. Remko Troncon **20061024190541] [Some more tray menu refactoring. Remko Troncon **20061024184654] [Fixed trayicon slot mismatch. Remko Troncon **20061024181846] [Use QSystemTrayIcon on Mac OS X. Remko Troncon **20061024180330] [Renamed MTray to PsiTrayIcon, and put it in a separate file. Remko Troncon **20061024161054] [Use QSyntaxHighlighter for spell checking. Remko Troncon **20061024154309 Fixes highlighting issues. ] [Do not set mask while the pixmap is being painted on. Michail Pishchagin **20061024141610] [Extracted AccountLabel to separate file. Michail Pishchagin **20061024120956] [Disabling qca-gnupg. Michail Pishchagin **20061024120537] [Refactored PsiCon::accountList() -> PsiContactList::accounts(). Michail Pishchagin **20061024112623 To be more precise: accountList(false) -> PsiContactList::accounts() and accountList(true) -> PsiContactList::enabledAccounts(). ] [Moved PsiAccountList to the separate PsiContactList class. Michail Pishchagin **20061024102058] [Added more valgrind suppressions (tested on Kubuntu Dapper). Michail Pishchagin **20061024100830] [Workaround for 100% CPU usage on connection error. Remko Troncon **20061024084520] [Migrating tip of the day. Remko Troncon **20061023185050] [Moved text utilities to TextUtil. Remko Troncon **20061023121846] [Fixed X11 compilation issues. Remko Troncon **20061023115501] [Some more common.h reordering. Remko Troncon **20061023113057] [Moving some things out of common.cpp. Remko Troncon **20061023111734] [Moved global PsiIconset instance into PsiIconset. Remko Troncon **20061023094755] [Cleanups in common.h. Remko Troncon **20061023085345] [Remove dependency on Psi from aspellchecker. Remko Troncon **20061023082646] [Aspell fix. Remko Troncon **20061023075215] [Some src.pri cleanups. Remko Troncon **20061022213649] [More portable way of linking against static jingle. Remko Troncon **20061022212611] [More portable way of linking against a static qca. Remko Troncon **20061022212124] [Tightening includes. Remko Troncon **20061022204405] [Copied BSocket from ambrosia. Remko Troncon **20061022200658] [Removed Q3CStrings. Remko Troncon **20061022200025] [Split off AboutDlg. Remko Troncon **20061022185351] [Fixed segfault on linux in getHomeDir(). Remko Troncon **20061022152235] [Migrate global shortcut options to new options system. Remko Troncon **20061021213722] [More common.h cleanups. Remko Troncon **20061021210021] [Some more common.h cleanups. Remko Troncon **20061021201149] [Fixed windows building of QCA. Remko Troncon **20061021201442] [Moved application information out of common.h into ApplicationInfo. Remko Troncon **20061021191231] [Added Mac OS X support in SystemInfo. Remko Troncon **20061021173553] [Sorting Ad-Hoc commands. Remko Troncon **20061021172941 Thanks to Norman Rasmussen. ] [Added missing includes to systeminfo. Remko Troncon **20061021172045] [Added busywidget to ad-hoc command dialog. Remko Troncon **20061021171745 Thanks to Norman Rasmussen. ] [Added extra include to systeminfo. Remko Troncon **20061021171133] [Moved system information methods from common.h to SystemInfo. Remko Troncon **20061021163132] [Removed obsolete string functions from common.h Remko Troncon **20061021150533] [Added registrationdlg to darcs. Remko Troncon **20061021143528] [Moved StretchWidget from common.h. Remko Troncon **20061021143301] [Splitting up servicesdlg into searchdlg and registrationdlg. Remko Troncon **20061021142021] [Removing some qt3support dependencies. Remko Troncon **20061021135310] [Ported all Q3FileDialogs. Remko Troncon **20061021134311] [Refactoring + Qt4-proper port of SSLCertDlg. Remko Troncon **20061021130542] [Clear keypad modifier from key events. Remko Troncon **20061021112448] [Added workaround to force VS2005/VC8 to link. Remko Troncon **20061021104201 Thanks to Norman Rasmussen. ] [Migration of 'enter sends message' to new shortcut system. Remko Troncon **20061021093801] [Updated README. Remko Troncon **20061020160227] [Make (group)chatdlg respect shortcuts. Remko Troncon **20061020141504] [Fixed compilation problems. Remko Troncon **20061020144525] [Removed roster opacity from common.h. Remko Troncon **20061020135341] [Removed 'enter sends message' option from the UI. Remko Troncon *-20061019184833] [TAG 20061020 Remko Troncon **20061020124531] Patch bundle hash: 367efd15893bf6cec970e51e759b9c73ba66c5f3