parent
ff26edf406
commit
2c67f751ab
@ -1,113 +0,0 @@
|
|||||||
Index: iris/xmpp-im/xmpp_tasks.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.h (revision 419672)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.h (working copy)
|
|
||||||
@@ -195,6 +195,29 @@
|
|
||||||
Private *d;
|
|
||||||
};
|
|
||||||
|
|
||||||
+ class JT_GetLastActivity : public Task
|
|
||||||
+ {
|
|
||||||
+ Q_OBJECT
|
|
||||||
+ public:
|
|
||||||
+ JT_GetLastActivity(Task *);
|
|
||||||
+ ~JT_GetLastActivity();
|
|
||||||
+
|
|
||||||
+ void get(const Jid &);
|
|
||||||
+
|
|
||||||
+ int seconds() const;
|
|
||||||
+ const QString &message() const;
|
|
||||||
+
|
|
||||||
+ void onGo();
|
|
||||||
+ bool take(const QDomElement &x);
|
|
||||||
+
|
|
||||||
+ private:
|
|
||||||
+ class Private;
|
|
||||||
+ Private *d;
|
|
||||||
+
|
|
||||||
+ QDomElement iq;
|
|
||||||
+ Jid jid;
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
class JT_GetServices : public Task
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Index: iris/xmpp-im/xmpp_tasks.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.cpp (revision 419672)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.cpp (working copy)
|
|
||||||
@@ -773,6 +773,74 @@
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
+// JT_GetLastActivity
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
+class JT_GetLastActivity::Private
|
|
||||||
+{
|
|
||||||
+public:
|
|
||||||
+ Private() {}
|
|
||||||
+
|
|
||||||
+ int seconds;
|
|
||||||
+ QString message;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+JT_GetLastActivity::JT_GetLastActivity(Task *parent)
|
|
||||||
+:Task(parent)
|
|
||||||
+{
|
|
||||||
+ d = new Private;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+JT_GetLastActivity::~JT_GetLastActivity()
|
|
||||||
+{
|
|
||||||
+ delete d;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_GetLastActivity::get(const Jid &j)
|
|
||||||
+{
|
|
||||||
+ jid = j;
|
|
||||||
+ iq = createIQ(doc(), "get", jid.full(), id());
|
|
||||||
+ QDomElement query = doc()->createElement("query");
|
|
||||||
+ query.setAttribute("xmlns", "jabber:iq:last");
|
|
||||||
+ iq.appendChild(query);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int JT_GetLastActivity::seconds() const
|
|
||||||
+{
|
|
||||||
+ return d->seconds;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+const QString &JT_GetLastActivity::message() const
|
|
||||||
+{
|
|
||||||
+ return d->message;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_GetLastActivity::onGo()
|
|
||||||
+{
|
|
||||||
+ send(iq);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool JT_GetLastActivity::take(const QDomElement &x)
|
|
||||||
+{
|
|
||||||
+ if(!iqVerify(x, jid, id()))
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ if(x.attribute("type") == "result") {
|
|
||||||
+ QDomElement q = queryTag(x);
|
|
||||||
+
|
|
||||||
+ d->message = q.text();
|
|
||||||
+ bool ok;
|
|
||||||
+ d->seconds = q.attribute("seconds").toInt(&ok);
|
|
||||||
+
|
|
||||||
+ setSuccess(ok);
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ setError(x);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
// JT_GetServices
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
JT_GetServices::JT_GetServices(Task *parent)
|
|
@ -1,17 +0,0 @@
|
|||||||
? 002_offline_event.patch
|
|
||||||
Index: iris/xmpp-im/types.cpp
|
|
||||||
===================================================================
|
|
||||||
RCS file: /home/kde/tdenetwork/kopete/protocols/jabber/libiris/iris/xmpp-im/types.cpp,v
|
|
||||||
retrieving revision 1.3
|
|
||||||
diff -u -p -r1.3 types.cpp
|
|
||||||
--- iris/xmpp-im/types.cpp 21 May 2004 14:35:44 -0000 1.3
|
|
||||||
+++ iris/xmpp-im/types.cpp 5 Feb 2005 21:04:44 -0000
|
|
||||||
@@ -639,6 +639,8 @@ bool Message::fromStanza(const Stanza &s
|
|
||||||
d->eventList += ComposingEvent;
|
|
||||||
else if (evtag == "delivered")
|
|
||||||
d->eventList += DeliveredEvent;
|
|
||||||
+ else if (evtag == "offline")
|
|
||||||
+ d->eventList += OfflineEvent;
|
|
||||||
}
|
|
||||||
if (d->eventList.isEmpty())
|
|
||||||
d->eventList += CancelEvent;
|
|
@ -1,14 +0,0 @@
|
|||||||
Index: iris/xmpp-core/jid.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-core/jid.cpp (revision 469141)
|
|
||||||
+++ iris/xmpp-core/jid.cpp (working copy)
|
|
||||||
@@ -233,6 +233,9 @@
|
|
||||||
b = d;
|
|
||||||
else
|
|
||||||
b = n + '@' + d;
|
|
||||||
+
|
|
||||||
+ b=b.lower(); // JID are not case sensitive
|
|
||||||
+
|
|
||||||
if(r.isEmpty())
|
|
||||||
f = b;
|
|
||||||
else
|
|
@ -1,266 +0,0 @@
|
|||||||
Index: iris/include/xmpp.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/include/xmpp.h (revision 470311)
|
|
||||||
+++ iris/include/xmpp.h (working copy)
|
|
||||||
@@ -318,8 +318,11 @@
|
|
||||||
|
|
||||||
QDomDocument & doc() const;
|
|
||||||
QString baseNS() const;
|
|
||||||
+ QString xhtmlImNS() const;
|
|
||||||
+ QString xhtmlNS() const;
|
|
||||||
QDomElement createElement(const QString &ns, const QString &tagName);
|
|
||||||
QDomElement createTextElement(const QString &ns, const QString &tagName, const QString &text);
|
|
||||||
+ QDomElement createXHTMLElement(const QString &xHTML);
|
|
||||||
void appendChild(const QDomElement &e);
|
|
||||||
|
|
||||||
Kind kind() const;
|
|
||||||
@@ -372,6 +375,8 @@
|
|
||||||
|
|
||||||
virtual QDomDocument & doc() const=0;
|
|
||||||
virtual QString baseNS() const=0;
|
|
||||||
+ virtual QString xhtmlImNS() const=0;
|
|
||||||
+ virtual QString xhtmlNS() const=0;
|
|
||||||
virtual bool old() const=0;
|
|
||||||
|
|
||||||
virtual void close()=0;
|
|
||||||
@@ -479,6 +484,8 @@
|
|
||||||
// reimplemented
|
|
||||||
QDomDocument & doc() const;
|
|
||||||
QString baseNS() const;
|
|
||||||
+ QString xhtmlImNS() const;
|
|
||||||
+ QString xhtmlNS() const;
|
|
||||||
bool old() const;
|
|
||||||
|
|
||||||
void close();
|
|
||||||
Index: iris/include/im.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/include/im.h (revision 470311)
|
|
||||||
+++ iris/include/im.h (working copy)
|
|
||||||
@@ -65,6 +65,7 @@
|
|
||||||
QString lang() const;
|
|
||||||
QString subject(const QString &lang="") const;
|
|
||||||
QString body(const QString &lang="") const;
|
|
||||||
+ QString xHTMLBody(const QString &lang="") const;
|
|
||||||
QString thread() const;
|
|
||||||
Stanza::Error error() const;
|
|
||||||
|
|
||||||
@@ -75,6 +76,7 @@
|
|
||||||
void setLang(const QString &s);
|
|
||||||
void setSubject(const QString &s, const QString &lang="");
|
|
||||||
void setBody(const QString &s, const QString &lang="");
|
|
||||||
+ void setXHTMLBody(const QString &s, const QString &lang="", const QString &attr = "");
|
|
||||||
void setThread(const QString &s);
|
|
||||||
void setError(const Stanza::Error &err);
|
|
||||||
|
|
||||||
@@ -286,6 +288,7 @@
|
|
||||||
bool canSearch() const;
|
|
||||||
bool canGroupchat() const;
|
|
||||||
bool canDisco() const;
|
|
||||||
+ bool canXHTML() const;
|
|
||||||
bool isGateway() const;
|
|
||||||
bool haveVCard() const;
|
|
||||||
|
|
||||||
@@ -298,6 +301,7 @@
|
|
||||||
FID_Disco,
|
|
||||||
FID_Gateway,
|
|
||||||
FID_VCard,
|
|
||||||
+ FID_Xhtml,
|
|
||||||
|
|
||||||
// private Psi actions
|
|
||||||
FID_Add
|
|
||||||
Index: iris/xmpp-im/types.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/types.cpp (revision 470311)
|
|
||||||
+++ iris/xmpp-im/types.cpp (working copy)
|
|
||||||
@@ -19,7 +19,7 @@
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include"im.h"
|
|
||||||
-
|
|
||||||
+#include "protocol.h"
|
|
||||||
#include<qmap.h>
|
|
||||||
#include<qapplication.h>
|
|
||||||
|
|
||||||
@@ -180,7 +180,8 @@
|
|
||||||
Jid to, from;
|
|
||||||
QString id, type, lang;
|
|
||||||
|
|
||||||
- StringMap subject, body;
|
|
||||||
+ StringMap subject, body, xHTMLBody;
|
|
||||||
+
|
|
||||||
QString thread;
|
|
||||||
Stanza::Error error;
|
|
||||||
|
|
||||||
@@ -279,6 +280,11 @@
|
|
||||||
return d->body[lang];
|
|
||||||
}
|
|
||||||
|
|
||||||
+QString Message::xHTMLBody(const QString &lang) const
|
|
||||||
+{
|
|
||||||
+ return d->xHTMLBody[lang];
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
QString Message::thread() const
|
|
||||||
{
|
|
||||||
return d->thread;
|
|
||||||
@@ -340,9 +346,16 @@
|
|
||||||
void Message::setBody(const QString &s, const QString &lang)
|
|
||||||
{
|
|
||||||
d->body[lang] = s;
|
|
||||||
- //d->flag = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void Message::setXHTMLBody(const QString &s, const QString &lang, const QString &attr)
|
|
||||||
+{
|
|
||||||
+ //ugly but needed if s is not a node but a list of leaf
|
|
||||||
+
|
|
||||||
+ QString content = "<body xmlns='" + QString(NS_XHTML) + "' "+attr+" >\n" + s +"\n</body>";
|
|
||||||
+ d->xHTMLBody[lang] = content;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void Message::setThread(const QString &s)
|
|
||||||
{
|
|
||||||
d->thread = s;
|
|
||||||
@@ -489,7 +502,19 @@
|
|
||||||
s.appendChild(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+ if ( !d->xHTMLBody.isEmpty()) {
|
|
||||||
+ QDomElement parent = s.createElement(s.xhtmlImNS(), "html");
|
|
||||||
+ for(it = d->xHTMLBody.begin(); it != d->xHTMLBody.end(); ++it) {
|
|
||||||
+ const QString &str = it.data();
|
|
||||||
+ if(!str.isEmpty()) {
|
|
||||||
+ QDomElement child = s.createXHTMLElement(str);
|
|
||||||
+ if(!it.key().isEmpty())
|
|
||||||
+ child.setAttributeNS(NS_XML, "xml:lang", it.key());
|
|
||||||
+ parent.appendChild(child);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ s.appendChild(parent);
|
|
||||||
+ }
|
|
||||||
if(d->type == "error")
|
|
||||||
s.setError(d->error);
|
|
||||||
|
|
||||||
@@ -591,6 +616,21 @@
|
|
||||||
else if(e.tagName() == "thread")
|
|
||||||
d->thread = e.text();
|
|
||||||
}
|
|
||||||
+ else if (e.namespaceURI() == s.xhtmlImNS()) {
|
|
||||||
+ if (e.tagName() == "html") {
|
|
||||||
+ QDomNodeList htmlNL= e.childNodes();
|
|
||||||
+ for (unsigned int x = 0; x < htmlNL.count(); x++) {
|
|
||||||
+ QDomElement i = htmlNL.item(x).toElement();
|
|
||||||
+
|
|
||||||
+ if (i.tagName() == "body") {
|
|
||||||
+ QDomDocument RichText;
|
|
||||||
+ QString lang = i.attributeNS(NS_XML, "lang", "");
|
|
||||||
+ RichText.appendChild(i);
|
|
||||||
+ d-> xHTMLBody[lang] = RichText.toString();
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
else {
|
|
||||||
//printf("extension element: [%s]\n", e.tagName().latin1());
|
|
||||||
}
|
|
||||||
@@ -1418,6 +1458,16 @@
|
|
||||||
return test(ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#define FID_XHTML "http://jabber.org/protocol/xhtml-im"
|
|
||||||
+bool Features::canXHTML() const
|
|
||||||
+{
|
|
||||||
+ QStringList ns;
|
|
||||||
+
|
|
||||||
+ ns << FID_XHTML;
|
|
||||||
+
|
|
||||||
+ return test(ns);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#define FID_GROUPCHAT "jabber:iq:conference"
|
|
||||||
bool Features::canGroupchat() const
|
|
||||||
{
|
|
||||||
Index: iris/xmpp-im/xmpp_tasks.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.cpp (revision 470311)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.cpp (working copy)
|
|
||||||
@@ -1348,6 +1348,10 @@
|
|
||||||
query.appendChild(feature);
|
|
||||||
|
|
||||||
feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", "http://jabber.org/protocol/xhtml-im");
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
feature.setAttribute("var", "http://jabber.org/protocol/si/profile/file-transfer");
|
|
||||||
query.appendChild(feature);
|
|
||||||
|
|
||||||
Index: iris/xmpp-core/protocol.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-core/protocol.h (revision 470311)
|
|
||||||
+++ iris/xmpp-core/protocol.h (working copy)
|
|
||||||
@@ -35,6 +35,8 @@
|
|
||||||
#define NS_SESSION "urn:ietf:params:xml:ns:xmpp-session"
|
|
||||||
#define NS_STANZAS "urn:ietf:params:xml:ns:xmpp-stanzas"
|
|
||||||
#define NS_BIND "urn:ietf:params:xml:ns:xmpp-bind"
|
|
||||||
+#define NS_XHTML_IM "http://jabber.org/protocol/xhtml-im"
|
|
||||||
+#define NS_XHTML "http://www.w3.org/1999/xhtml"
|
|
||||||
|
|
||||||
namespace XMPP
|
|
||||||
{
|
|
||||||
Index: iris/xmpp-core/stream.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-core/stream.cpp (revision 470311)
|
|
||||||
+++ iris/xmpp-core/stream.cpp (working copy)
|
|
||||||
@@ -293,6 +293,16 @@
|
|
||||||
return d->s->baseNS();
|
|
||||||
}
|
|
||||||
|
|
||||||
+QString Stanza::xhtmlImNS() const
|
|
||||||
+{
|
|
||||||
+ return d->s->xhtmlImNS();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString Stanza::xhtmlNS() const
|
|
||||||
+{
|
|
||||||
+ return d->s->xhtmlNS();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
QDomElement Stanza::createElement(const QString &ns, const QString &tagName)
|
|
||||||
{
|
|
||||||
return d->s->doc().createElementNS(ns, tagName);
|
|
||||||
@@ -305,6 +315,16 @@
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
+QDomElement Stanza::createXHTMLElement(const QString &xHTML)
|
|
||||||
+{
|
|
||||||
+ QDomDocument doc;
|
|
||||||
+
|
|
||||||
+ doc.setContent(xHTML, true);
|
|
||||||
+ QDomElement root = doc.documentElement();
|
|
||||||
+ //QDomElement e;
|
|
||||||
+ return (root);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void Stanza::appendChild(const QDomElement &e)
|
|
||||||
{
|
|
||||||
d->e.appendChild(e);
|
|
||||||
@@ -861,6 +881,16 @@
|
|
||||||
return NS_CLIENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
+QString ClientStream::xhtmlImNS() const
|
|
||||||
+{
|
|
||||||
+ return NS_XHTML_IM;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString ClientStream::xhtmlNS() const
|
|
||||||
+{
|
|
||||||
+ return NS_XHTML;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void ClientStream::setAllowPlain(bool b)
|
|
||||||
{
|
|
||||||
d->allowPlain = b;
|
|
@ -1,163 +0,0 @@
|
|||||||
Index: iris/include/im.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/include/im.h (révision 498969)
|
|
||||||
+++ iris/include/im.h (copie de travail)
|
|
||||||
@@ -607,6 +607,7 @@
|
|
||||||
FileTransferManager *fileTransferManager() const;
|
|
||||||
|
|
||||||
bool groupChatJoin(const QString &host, const QString &room, const QString &nick);
|
|
||||||
+ bool groupChatJoin(const QString &host, const QString &room, const QString &nick, const QString &password);
|
|
||||||
void groupChatSetStatus(const QString &host, const QString &room, const Status &);
|
|
||||||
void groupChatChangeNick(const QString &host, const QString &room, const QString &nick, const Status &);
|
|
||||||
void groupChatLeave(const QString &host, const QString &room);
|
|
||||||
Index: iris/xmpp-im/client.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/client.cpp (révision 498969)
|
|
||||||
+++ iris/xmpp-im/client.cpp (copie de travail)
|
|
||||||
@@ -315,6 +315,35 @@
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
+bool Client::groupChatJoin(const QString &host, const QString &room, const QString &nick, const QString &password)
|
|
||||||
+{
|
|
||||||
+ Jid jid(room + "@" + host + "/" + nick);
|
|
||||||
+ for(QValueList<GroupChat>::Iterator it = d->groupChatList.begin(); it != d->groupChatList.end();) {
|
|
||||||
+ GroupChat &i = *it;
|
|
||||||
+ if(i.j.compare(jid, false)) {
|
|
||||||
+ // if this room is shutting down, then free it up
|
|
||||||
+ if(i.status == GroupChat::Closing)
|
|
||||||
+ it = d->groupChatList.remove(it);
|
|
||||||
+ else
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ ++it;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ debug(QString("Client: Joined: [%1]\n").arg(jid.full()));
|
|
||||||
+ GroupChat i;
|
|
||||||
+ i.j = jid;
|
|
||||||
+ i.status = GroupChat::Connecting;
|
|
||||||
+ d->groupChatList += i;
|
|
||||||
+
|
|
||||||
+ JT_MucPresence *j = new JT_MucPresence(rootTask());
|
|
||||||
+ j->pres(jid, Status(), password);
|
|
||||||
+ j->go(true);
|
|
||||||
+
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void Client::groupChatSetStatus(const QString &host, const QString &room, const Status &_s)
|
|
||||||
{
|
|
||||||
Jid jid(room + "@" + host);
|
|
||||||
Index: iris/xmpp-im/xmpp_tasks.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.h (révision 498969)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.h (copie de travail)
|
|
||||||
@@ -439,6 +439,26 @@
|
|
||||||
class Private;
|
|
||||||
Private *d;
|
|
||||||
};
|
|
||||||
+
|
|
||||||
+ class JT_MucPresence : public Task
|
|
||||||
+ {
|
|
||||||
+ Q_OBJECT
|
|
||||||
+ public:
|
|
||||||
+ JT_MucPresence(Task *parent);
|
|
||||||
+ ~JT_MucPresence();
|
|
||||||
+
|
|
||||||
+ void pres(const Status &);
|
|
||||||
+ void pres(const Jid &, const Status &, const QString &password);
|
|
||||||
+
|
|
||||||
+ void onGo();
|
|
||||||
+
|
|
||||||
+ private:
|
|
||||||
+ QDomElement tag;
|
|
||||||
+ int type;
|
|
||||||
+
|
|
||||||
+ class Private;
|
|
||||||
+ Private *d;
|
|
||||||
+ };
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Index: iris/xmpp-im/xmpp_tasks.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.cpp (révision 498969)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.cpp (copie de travail)
|
|
||||||
@@ -1956,3 +1956,75 @@
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
+// JT_MucPresence
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
+JT_MucPresence::JT_MucPresence(Task *parent)
|
|
||||||
+:Task(parent)
|
|
||||||
+{
|
|
||||||
+ type = -1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+JT_MucPresence::~JT_MucPresence()
|
|
||||||
+{
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_MucPresence::pres(const Status &s)
|
|
||||||
+{
|
|
||||||
+ type = 0;
|
|
||||||
+
|
|
||||||
+ tag = doc()->createElement("presence");
|
|
||||||
+ if(!s.isAvailable()) {
|
|
||||||
+ tag.setAttribute("type", "unavailable");
|
|
||||||
+ if(!s.status().isEmpty())
|
|
||||||
+ tag.appendChild(textTag(doc(), "status", s.status()));
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ if(s.isInvisible())
|
|
||||||
+ tag.setAttribute("type", "invisible");
|
|
||||||
+
|
|
||||||
+ if(!s.show().isEmpty())
|
|
||||||
+ tag.appendChild(textTag(doc(), "show", s.show()));
|
|
||||||
+ if(!s.status().isEmpty())
|
|
||||||
+ tag.appendChild(textTag(doc(), "status", s.status()));
|
|
||||||
+
|
|
||||||
+ tag.appendChild( textTag(doc(), "priority", QString("%1").arg(s.priority()) ) );
|
|
||||||
+
|
|
||||||
+ if(!s.keyID().isEmpty()) {
|
|
||||||
+ QDomElement x = textTag(doc(), "x", s.keyID());
|
|
||||||
+ x.setAttribute("xmlns", "http://jabber.org/protocol/e2e");
|
|
||||||
+ tag.appendChild(x);
|
|
||||||
+ }
|
|
||||||
+ if(!s.xsigned().isEmpty()) {
|
|
||||||
+ QDomElement x = textTag(doc(), "x", s.xsigned());
|
|
||||||
+ x.setAttribute("xmlns", "jabber:x:signed");
|
|
||||||
+ tag.appendChild(x);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if(!s.capsNode().isEmpty() && !s.capsVersion().isEmpty()) {
|
|
||||||
+ QDomElement c = doc()->createElement("c");
|
|
||||||
+ c.setAttribute("xmlns","http://jabber.org/protocol/caps");
|
|
||||||
+ c.setAttribute("node",s.capsNode());
|
|
||||||
+ c.setAttribute("ver",s.capsVersion());
|
|
||||||
+ if (!s.capsExt().isEmpty())
|
|
||||||
+ c.setAttribute("ext",s.capsExt());
|
|
||||||
+ tag.appendChild(c);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_MucPresence::pres(const Jid &to, const Status &s, const QString &password)
|
|
||||||
+{
|
|
||||||
+ pres(s);
|
|
||||||
+ tag.setAttribute("to", to.full());
|
|
||||||
+ QDomElement x = textTag(doc(), "x", s.xsigned());
|
|
||||||
+ x.setAttribute("xmlns", "http://jabber.org/protocol/muc");
|
|
||||||
+ x.appendChild( textTag(doc(), "password", password.latin1()) );
|
|
||||||
+ tag.appendChild(x);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_MucPresence::onGo()
|
|
||||||
+{
|
|
||||||
+ send(tag);
|
|
||||||
+ setSuccess();
|
|
||||||
+}
|
|
@ -1,130 +0,0 @@
|
|||||||
Index: iris/xmpp-im/xmpp_tasks.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.h (revision 499691)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.h (working copy)
|
|
||||||
@@ -459,6 +459,27 @@
|
|
||||||
class Private;
|
|
||||||
Private *d;
|
|
||||||
};
|
|
||||||
+
|
|
||||||
+ class JT_PrivateStorage : public Task
|
|
||||||
+ {
|
|
||||||
+ Q_OBJECT
|
|
||||||
+ public:
|
|
||||||
+ JT_PrivateStorage(Task *parent);
|
|
||||||
+ ~JT_PrivateStorage();
|
|
||||||
+
|
|
||||||
+ void set(const QDomElement &);
|
|
||||||
+ void get(const QString &tag, const QString& xmlns);
|
|
||||||
+
|
|
||||||
+ QDomElement element();
|
|
||||||
+
|
|
||||||
+ void onGo();
|
|
||||||
+ bool take(const QDomElement &);
|
|
||||||
+
|
|
||||||
+ private:
|
|
||||||
+ class Private;
|
|
||||||
+ Private *d;
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Index: iris/xmpp-im/xmpp_tasks.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/xmpp_tasks.cpp (revision 499691)
|
|
||||||
+++ iris/xmpp-im/xmpp_tasks.cpp (working copy)
|
|
||||||
@@ -2028,3 +2028,93 @@
|
|
||||||
send(tag);
|
|
||||||
setSuccess();
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
+// JT_PrivateStorage
|
|
||||||
+//----------------------------------------------------------------------------
|
|
||||||
+class JT_PrivateStorage::Private
|
|
||||||
+{
|
|
||||||
+ public:
|
|
||||||
+ Private() : type(-1) {}
|
|
||||||
+
|
|
||||||
+ QDomElement iq;
|
|
||||||
+ QDomElement elem;
|
|
||||||
+ int type;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+JT_PrivateStorage::JT_PrivateStorage(Task *parent)
|
|
||||||
+ :Task(parent)
|
|
||||||
+{
|
|
||||||
+ d = new Private;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+JT_PrivateStorage::~JT_PrivateStorage()
|
|
||||||
+{
|
|
||||||
+ delete d;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_PrivateStorage::get(const QString& tag, const QString& xmlns)
|
|
||||||
+{
|
|
||||||
+ d->type = 0;
|
|
||||||
+ d->iq = createIQ(doc(), "get" , QString() , id() );
|
|
||||||
+ QDomElement query = doc()->createElement("query");
|
|
||||||
+ query.setAttribute("xmlns", "jabber:iq:private");
|
|
||||||
+ d->iq.appendChild(query);
|
|
||||||
+ QDomElement s = doc()->createElement(tag);
|
|
||||||
+ if(!xmlns.isEmpty())
|
|
||||||
+ s.setAttribute("xmlns", xmlns);
|
|
||||||
+ query.appendChild(s);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_PrivateStorage::set(const QDomElement& element)
|
|
||||||
+{
|
|
||||||
+ d->type = 1;
|
|
||||||
+ d->elem=element;
|
|
||||||
+ QDomNode n=doc()->importNode(element,true);
|
|
||||||
+
|
|
||||||
+ d->iq = createIQ(doc(), "set" , QString() , id() );
|
|
||||||
+ QDomElement query = doc()->createElement("query");
|
|
||||||
+ query.setAttribute("xmlns", "jabber:iq:private");
|
|
||||||
+ d->iq.appendChild(query);
|
|
||||||
+ query.appendChild(n);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void JT_PrivateStorage::onGo()
|
|
||||||
+{
|
|
||||||
+ send(d->iq);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool JT_PrivateStorage::take(const QDomElement &x)
|
|
||||||
+{
|
|
||||||
+ QString to = client()->host();
|
|
||||||
+ if(!iqVerify(x, to, id()))
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ if(x.attribute("type") == "result") {
|
|
||||||
+ if(d->type == 0) {
|
|
||||||
+ QDomElement q = queryTag(x);
|
|
||||||
+ for(QDomNode n = q.firstChild(); !n.isNull(); n = n.nextSibling()) {
|
|
||||||
+ QDomElement i = n.toElement();
|
|
||||||
+ if(i.isNull())
|
|
||||||
+ continue;
|
|
||||||
+ d->elem=i;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ setSuccess();
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ setError(x);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+QDomElement JT_PrivateStorage::element( )
|
|
||||||
+{
|
|
||||||
+ return d->elem;
|
|
||||||
+}
|
|
||||||
+
|
|
@ -1,132 +0,0 @@
|
|||||||
Index: iris/include/im.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/include/im.h (revision 525193)
|
|
||||||
+++ iris/include/im.h (working copy)
|
|
||||||
@@ -49,7 +49,7 @@
|
|
||||||
typedef QValueList<Url> UrlList;
|
|
||||||
typedef QMap<QString, QString> StringMap;
|
|
||||||
typedef enum { OfflineEvent, DeliveredEvent, DisplayedEvent,
|
|
||||||
- ComposingEvent, CancelEvent } MsgEvent;
|
|
||||||
+ ComposingEvent, CancelEvent, InactiveEvent, GoneEvent } MsgEvent;
|
|
||||||
|
|
||||||
class Message
|
|
||||||
{
|
|
||||||
Index: iris/xmpp-im/types.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/types.cpp (revision 525193)
|
|
||||||
+++ iris/xmpp-im/types.cpp (working copy)
|
|
||||||
@@ -544,28 +544,49 @@
|
|
||||||
else
|
|
||||||
x.appendChild(s.createTextElement("jabber:x:event","id",d->eventId));
|
|
||||||
}
|
|
||||||
+ else
|
|
||||||
+ s.appendChild( s.createElement(NS_CHATSTATES , "active" ) );
|
|
||||||
|
|
||||||
+ bool need_x_event=false;
|
|
||||||
for(QValueList<MsgEvent>::ConstIterator ev = d->eventList.begin(); ev != d->eventList.end(); ++ev) {
|
|
||||||
switch (*ev) {
|
|
||||||
case OfflineEvent:
|
|
||||||
x.appendChild(s.createElement("jabber:x:event", "offline"));
|
|
||||||
+ need_x_event=true;
|
|
||||||
break;
|
|
||||||
case DeliveredEvent:
|
|
||||||
x.appendChild(s.createElement("jabber:x:event", "delivered"));
|
|
||||||
+ need_x_event=true;
|
|
||||||
break;
|
|
||||||
case DisplayedEvent:
|
|
||||||
x.appendChild(s.createElement("jabber:x:event", "displayed"));
|
|
||||||
+ need_x_event=true;
|
|
||||||
break;
|
|
||||||
case ComposingEvent:
|
|
||||||
x.appendChild(s.createElement("jabber:x:event", "composing"));
|
|
||||||
+ need_x_event=true;
|
|
||||||
+ if (d->body.isEmpty())
|
|
||||||
+ s.appendChild( s.createElement(NS_CHATSTATES , "composing" ) );
|
|
||||||
break;
|
|
||||||
case CancelEvent:
|
|
||||||
- // Add nothing
|
|
||||||
+ need_x_event=true;
|
|
||||||
+ if (d->body.isEmpty())
|
|
||||||
+ s.appendChild( s.createElement(NS_CHATSTATES , "paused" ) );
|
|
||||||
break;
|
|
||||||
+ case InactiveEvent:
|
|
||||||
+ if (d->body.isEmpty())
|
|
||||||
+ s.appendChild( s.createElement(NS_CHATSTATES , "inactive" ) );
|
|
||||||
+ break;
|
|
||||||
+ case GoneEvent:
|
|
||||||
+ if (d->body.isEmpty())
|
|
||||||
+ s.appendChild( s.createElement(NS_CHATSTATES , "gone" ) );
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- s.appendChild(x);
|
|
||||||
- }
|
|
||||||
+ if(need_x_event) //we don't need to have the (empty) x:event element if this is only <gone> or <inactive>
|
|
||||||
+ s.appendChild(x);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
|
|
||||||
// xencrypted
|
|
||||||
if(!d->xencrypted.isEmpty())
|
|
||||||
@@ -595,6 +616,7 @@
|
|
||||||
d->subject.clear();
|
|
||||||
d->body.clear();
|
|
||||||
d->thread = QString();
|
|
||||||
+ d->eventList.clear();
|
|
||||||
|
|
||||||
QDomElement root = s.element();
|
|
||||||
|
|
||||||
@@ -631,6 +653,33 @@
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ else if (e.namespaceURI() == NS_CHATSTATES)
|
|
||||||
+ {
|
|
||||||
+ if(e.tagName() == "active")
|
|
||||||
+ {
|
|
||||||
+ //like in JEP-0022 we let the client know that we can receive ComposingEvent
|
|
||||||
+ // (we can do that according to §4.6 of the JEP-0085)
|
|
||||||
+ d->eventList += ComposingEvent;
|
|
||||||
+ d->eventList += InactiveEvent;
|
|
||||||
+ d->eventList += GoneEvent;
|
|
||||||
+ }
|
|
||||||
+ else if (e.tagName() == "composing")
|
|
||||||
+ {
|
|
||||||
+ d->eventList += ComposingEvent;
|
|
||||||
+ }
|
|
||||||
+ else if (e.tagName() == "paused")
|
|
||||||
+ {
|
|
||||||
+ d->eventList += CancelEvent;
|
|
||||||
+ }
|
|
||||||
+ else if (e.tagName() == "inactive")
|
|
||||||
+ {
|
|
||||||
+ d->eventList += InactiveEvent;
|
|
||||||
+ }
|
|
||||||
+ else if (e.tagName() == "gone")
|
|
||||||
+ {
|
|
||||||
+ d->eventList += GoneEvent;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
else {
|
|
||||||
//printf("extension element: [%s]\n", e.tagName().latin1());
|
|
||||||
}
|
|
||||||
@@ -664,7 +713,6 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
// events
|
|
||||||
- d->eventList.clear();
|
|
||||||
nl = root.elementsByTagNameNS("jabber:x:event", "x");
|
|
||||||
if (nl.count()) {
|
|
||||||
nl = nl.item(0).childNodes();
|
|
||||||
Index: iris/xmpp-core/protocol.h
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-core/protocol.h (revision 525193)
|
|
||||||
+++ iris/xmpp-core/protocol.h (working copy)
|
|
||||||
@@ -37,6 +37,7 @@
|
|
||||||
#define NS_BIND "urn:ietf:params:xml:ns:xmpp-bind"
|
|
||||||
#define NS_XHTML_IM "http://jabber.org/protocol/xhtml-im"
|
|
||||||
#define NS_XHTML "http://www.w3.org/1999/xhtml"
|
|
||||||
+#define NS_CHATSTATES "http://jabber.org/protocol/chatstates"
|
|
||||||
|
|
||||||
namespace XMPP
|
|
||||||
{
|
|
@ -1,38 +0,0 @@
|
|||||||
Index: iris/xmpp-im/types.cpp
|
|
||||||
===================================================================
|
|
||||||
--- iris/xmpp-im/types.cpp (revision 526236)
|
|
||||||
+++ iris/xmpp-im/types.cpp (working copy)
|
|
||||||
@@ -544,7 +544,7 @@
|
|
||||||
else
|
|
||||||
x.appendChild(s.createTextElement("jabber:x:event","id",d->eventId));
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+ else if (d->type=="chat" || d->type=="groupchat")
|
|
||||||
s.appendChild( s.createElement(NS_CHATSTATES , "active" ) );
|
|
||||||
|
|
||||||
bool need_x_event=false;
|
|
||||||
@@ -565,20 +565,20 @@
|
|
||||||
case ComposingEvent:
|
|
||||||
x.appendChild(s.createElement("jabber:x:event", "composing"));
|
|
||||||
need_x_event=true;
|
|
||||||
- if (d->body.isEmpty())
|
|
||||||
+ if (d->body.isEmpty() && (d->type=="chat" || d->type=="groupchat") )
|
|
||||||
s.appendChild( s.createElement(NS_CHATSTATES , "composing" ) );
|
|
||||||
break;
|
|
||||||
case CancelEvent:
|
|
||||||
need_x_event=true;
|
|
||||||
- if (d->body.isEmpty())
|
|
||||||
+ if (d->body.isEmpty() && (d->type=="chat" || d->type=="groupchat") )
|
|
||||||
s.appendChild( s.createElement(NS_CHATSTATES , "paused" ) );
|
|
||||||
break;
|
|
||||||
case InactiveEvent:
|
|
||||||
- if (d->body.isEmpty())
|
|
||||||
+ if (d->body.isEmpty() && (d->type=="chat" || d->type=="groupchat") )
|
|
||||||
s.appendChild( s.createElement(NS_CHATSTATES , "inactive" ) );
|
|
||||||
break;
|
|
||||||
case GoneEvent:
|
|
||||||
- if (d->body.isEmpty())
|
|
||||||
+ if (d->body.isEmpty() && (d->type=="chat" || d->type=="groupchat") )
|
|
||||||
s.appendChild( s.createElement(NS_CHATSTATES , "gone" ) );
|
|
||||||
break;
|
|
||||||
}
|
|
@ -1,432 +0,0 @@
|
|||||||
diff -ur psi/iris/include/im.h psi-jingle/iris/include/im.h
|
|
||||||
--- psi/iris/include/im.h 2005-12-27 15:12:42.000000000 +0100
|
|
||||||
+++ psi-jingle/iris/include/im.h 2005-12-27 11:05:53.000000000 +0100
|
|
||||||
@@ -22,6 +22,7 @@
|
|
||||||
#define XMPP_IM_H
|
|
||||||
|
|
||||||
#include<qdatetime.h>
|
|
||||||
+#include<qvaluelist.h>
|
|
||||||
#include"xmpp.h"
|
|
||||||
|
|
||||||
namespace XMPP
|
|
||||||
@@ -153,6 +154,9 @@
|
|
||||||
|
|
||||||
const QString & xsigned() const;
|
|
||||||
const QString & songTitle() const;
|
|
||||||
+ const QString & capsNode() const;
|
|
||||||
+ const QString & capsVersion() const;
|
|
||||||
+ const QString & capsExt() const;
|
|
||||||
|
|
||||||
void setPriority(int);
|
|
||||||
void setShow(const QString &);
|
|
||||||
@@ -162,6 +166,9 @@
|
|
||||||
void setIsAvailable(bool);
|
|
||||||
void setIsInvisible(bool);
|
|
||||||
void setError(int, const QString &);
|
|
||||||
+ void setCapsNode(const QString&);
|
|
||||||
+ void setCapsVersion(const QString&);
|
|
||||||
+ void setCapsExt(const QString&);
|
|
||||||
|
|
||||||
void setXSigned(const QString &);
|
|
||||||
void setSongTitle(const QString &);
|
|
||||||
@@ -176,6 +183,7 @@
|
|
||||||
QString v_xsigned;
|
|
||||||
// gabber song extension
|
|
||||||
QString v_songTitle;
|
|
||||||
+ QString v_capsNode, v_capsVersion, v_capsExt;
|
|
||||||
|
|
||||||
int ecode;
|
|
||||||
QString estr;
|
|
||||||
@@ -285,6 +293,7 @@
|
|
||||||
bool canRegister() const;
|
|
||||||
bool canSearch() const;
|
|
||||||
bool canGroupchat() const;
|
|
||||||
+ bool canVoice() const;
|
|
||||||
bool canDisco() const;
|
|
||||||
bool isGateway() const;
|
|
||||||
bool haveVCard() const;
|
|
||||||
@@ -567,12 +576,25 @@
|
|
||||||
int timeZoneOffset() const;
|
|
||||||
QString clientName() const;
|
|
||||||
QString clientVersion() const;
|
|
||||||
+ QString capsNode() const;
|
|
||||||
+ QString capsVersion() const;
|
|
||||||
+ QString capsExt() const;
|
|
||||||
|
|
||||||
void setOSName(const QString &);
|
|
||||||
void setTimeZone(const QString &, int);
|
|
||||||
void setClientName(const QString &);
|
|
||||||
void setClientVersion(const QString &);
|
|
||||||
+ void setCapsNode(const QString &);
|
|
||||||
+ void setCapsVersion(const QString &);
|
|
||||||
|
|
||||||
+ void setIdentity(DiscoItem::Identity);
|
|
||||||
+ DiscoItem::Identity identity();
|
|
||||||
+
|
|
||||||
+ void addExtension(const QString& ext, const Features& f);
|
|
||||||
+ void removeExtension(const QString& ext);
|
|
||||||
+ const Features& extension(const QString& ext) const;
|
|
||||||
+ QStringList extensions() const;
|
|
||||||
+
|
|
||||||
S5BManager *s5bManager() const;
|
|
||||||
IBBManager *ibbManager() const;
|
|
||||||
JidLinkManager *jidLinkManager() const;
|
|
||||||
diff -ur psi/iris/xmpp-im/client.cpp psi-jingle/iris/xmpp-im/client.cpp
|
|
||||||
--- psi/iris/xmpp-im/client.cpp 2005-12-27 15:12:44.000000000 +0100
|
|
||||||
+++ psi-jingle/iris/xmpp-im/client.cpp 2005-12-27 11:05:53.000000000 +0100
|
|
||||||
@@ -70,6 +70,7 @@
|
|
||||||
//! \endcode
|
|
||||||
|
|
||||||
#include<stdarg.h>
|
|
||||||
+#include<qmap.h>
|
|
||||||
#include<qobjectlist.h>
|
|
||||||
#include<qtimer.h>
|
|
||||||
#include<qguardedptr.h>
|
|
||||||
@@ -125,7 +126,9 @@
|
|
||||||
int id_seed;
|
|
||||||
Task *root;
|
|
||||||
QString host, user, pass, resource;
|
|
||||||
- QString osname, tzname, clientName, clientVersion;
|
|
||||||
+ QString osname, tzname, clientName, clientVersion, capsNode, capsVersion, capsExt;
|
|
||||||
+ DiscoItem::Identity identity;
|
|
||||||
+ QMap<QString,Features> extension_features;
|
|
||||||
int tzoffset;
|
|
||||||
bool active;
|
|
||||||
|
|
||||||
@@ -149,6 +152,9 @@
|
|
||||||
d->osname = "N/A";
|
|
||||||
d->clientName = "N/A";
|
|
||||||
d->clientVersion = "0.0";
|
|
||||||
+ d->capsNode = "";
|
|
||||||
+ d->capsVersion = "";
|
|
||||||
+ d->capsExt = "";
|
|
||||||
|
|
||||||
d->id_seed = 0xaaaa;
|
|
||||||
d->root = new Task(this, true);
|
|
||||||
@@ -996,6 +1002,21 @@
|
|
||||||
return d->clientVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
+QString Client::capsNode() const
|
|
||||||
+{
|
|
||||||
+ return d->capsNode;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString Client::capsVersion() const
|
|
||||||
+{
|
|
||||||
+ return d->capsVersion;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QString Client::capsExt() const
|
|
||||||
+{
|
|
||||||
+ return d->capsExt;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void Client::setOSName(const QString &name)
|
|
||||||
{
|
|
||||||
d->osname = name;
|
|
||||||
@@ -1017,6 +1038,52 @@
|
|
||||||
d->clientVersion = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void Client::setCapsNode(const QString &s)
|
|
||||||
+{
|
|
||||||
+ d->capsNode = s;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Client::setCapsVersion(const QString &s)
|
|
||||||
+{
|
|
||||||
+ d->capsVersion = s;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+DiscoItem::Identity Client::identity()
|
|
||||||
+{
|
|
||||||
+ return d->identity;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Client::setIdentity(DiscoItem::Identity identity)
|
|
||||||
+{
|
|
||||||
+ d->identity = identity;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Client::addExtension(const QString& ext, const Features& features)
|
|
||||||
+{
|
|
||||||
+ if (!ext.isEmpty()) {
|
|
||||||
+ d->extension_features[ext] = features;
|
|
||||||
+ d->capsExt = extensions().join(" ");
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Client::removeExtension(const QString& ext)
|
|
||||||
+{
|
|
||||||
+ if (d->extension_features.contains(ext)) {
|
|
||||||
+ d->extension_features.remove(ext);
|
|
||||||
+ d->capsExt = extensions().join(" ");
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+QStringList Client::extensions() const
|
|
||||||
+{
|
|
||||||
+ return d->extension_features.keys();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+const Features& Client::extension(const QString& ext) const
|
|
||||||
+{
|
|
||||||
+ return d->extension_features[ext];
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void Client::s5b_incomingReady()
|
|
||||||
{
|
|
||||||
S5BConnection *c = d->s5bman->takeIncoming();
|
|
||||||
diff -ur psi/iris/xmpp-im/types.cpp psi-jingle/iris/xmpp-im/types.cpp
|
|
||||||
--- psi/iris/xmpp-im/types.cpp 2005-12-27 15:12:55.000000000 +0100
|
|
||||||
+++ psi-jingle/iris/xmpp-im/types.cpp 2005-12-27 11:05:53.000000000 +0100
|
|
||||||
@@ -784,6 +784,21 @@
|
|
||||||
v_songTitle = _songtitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void Status::setCapsNode(const QString & _capsNode)
|
|
||||||
+{
|
|
||||||
+ v_capsNode = _capsNode;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Status::setCapsVersion(const QString & _capsVersion)
|
|
||||||
+{
|
|
||||||
+ v_capsVersion = _capsVersion;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void Status::setCapsExt(const QString & _capsExt)
|
|
||||||
+{
|
|
||||||
+ v_capsExt = _capsExt;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
bool Status::isAvailable() const
|
|
||||||
{
|
|
||||||
return v_isAvailable;
|
|
||||||
@@ -836,6 +851,21 @@
|
|
||||||
return v_songTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
+const QString & Status::capsNode() const
|
|
||||||
+{
|
|
||||||
+ return v_capsNode;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+const QString & Status::capsVersion() const
|
|
||||||
+{
|
|
||||||
+ return v_capsVersion;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+const QString & Status::capsExt() const
|
|
||||||
+{
|
|
||||||
+ return v_capsExt;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int Status::errorCode() const
|
|
||||||
{
|
|
||||||
return ecode;
|
|
||||||
@@ -1427,6 +1457,15 @@
|
|
||||||
return test(ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#define FID_VOICE "http://www.google.com/xmpp/protocol/voice/v1"
|
|
||||||
+bool Features::canVoice() const
|
|
||||||
+{
|
|
||||||
+ QStringList ns;
|
|
||||||
+ ns << FID_VOICE;
|
|
||||||
+
|
|
||||||
+ return test(ns);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#define FID_GATEWAY "jabber:iq:gateway"
|
|
||||||
bool Features::isGateway() const
|
|
||||||
{
|
|
||||||
diff -ur psi/iris/xmpp-im/xmpp_tasks.cpp psi-jingle/iris/xmpp-im/xmpp_tasks.cpp
|
|
||||||
--- psi/iris/xmpp-im/xmpp_tasks.cpp 2005-12-27 15:12:45.000000000 +0100
|
|
||||||
+++ psi-jingle/iris/xmpp-im/xmpp_tasks.cpp 2005-12-27 11:05:53.000000000 +0100
|
|
||||||
@@ -516,6 +516,16 @@
|
|
||||||
x.setAttribute("xmlns", "jabber:x:signed");
|
|
||||||
tag.appendChild(x);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ if(!s.capsNode().isEmpty() && !s.capsVersion().isEmpty()) {
|
|
||||||
+ QDomElement c = doc()->createElement("c");
|
|
||||||
+ c.setAttribute("xmlns","http://jabber.org/protocol/caps");
|
|
||||||
+ c.setAttribute("node",s.capsNode());
|
|
||||||
+ c.setAttribute("ver",s.capsVersion());
|
|
||||||
+ if (!s.capsExt().isEmpty())
|
|
||||||
+ c.setAttribute("ext",s.capsExt());
|
|
||||||
+ tag.appendChild(c);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -625,6 +635,11 @@
|
|
||||||
else if(i.tagName() == "x" && i.attribute("xmlns") == "http://jabber.org/protocol/e2e") {
|
|
||||||
p.setKeyID(tagContent(i));
|
|
||||||
}
|
|
||||||
+ else if(i.tagName() == "c" && i.attribute("xmlns") == "http://jabber.org/protocol/caps") {
|
|
||||||
+ p.setCapsNode(i.attribute("node"));
|
|
||||||
+ p.setCapsVersion(i.attribute("ver"));
|
|
||||||
+ p.setCapsExt(i.attribute("ext"));
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
presence(j, p);
|
|
||||||
@@ -1265,23 +1280,86 @@
|
|
||||||
// return TRUE;
|
|
||||||
//}
|
|
||||||
else if(ns == "http://jabber.org/protocol/disco#info") {
|
|
||||||
+ // Find out the node
|
|
||||||
+ QString node;
|
|
||||||
+ bool found;
|
|
||||||
+ QDomElement q = findSubTag(e, "query", &found);
|
|
||||||
+ if(found) // NOTE: Should always be true, since a NS was found above
|
|
||||||
+ node = q.attribute("node");
|
|
||||||
+
|
|
||||||
QDomElement iq = createIQ(doc(), "result", e.attribute("from"), e.attribute("id"));
|
|
||||||
QDomElement query = doc()->createElement("query");
|
|
||||||
query.setAttribute("xmlns", "http://jabber.org/protocol/disco#info");
|
|
||||||
+ if (!node.isEmpty())
|
|
||||||
+ query.setAttribute("node", node);
|
|
||||||
iq.appendChild(query);
|
|
||||||
- QDomElement feature;
|
|
||||||
|
|
||||||
- feature = doc()->createElement("feature");
|
|
||||||
- feature.setAttribute("var", "http://jabber.org/protocol/bytestreams");
|
|
||||||
- query.appendChild(feature);
|
|
||||||
-
|
|
||||||
- feature = doc()->createElement("feature");
|
|
||||||
- feature.setAttribute("var", "http://jabber.org/protocol/si");
|
|
||||||
- query.appendChild(feature);
|
|
||||||
-
|
|
||||||
- feature = doc()->createElement("feature");
|
|
||||||
- feature.setAttribute("var", "http://jabber.org/protocol/si/profile/file-transfer");
|
|
||||||
- query.appendChild(feature);
|
|
||||||
+ // Identity
|
|
||||||
+ DiscoItem::Identity identity = client()->identity();
|
|
||||||
+ QDomElement id = doc()->createElement("identity");
|
|
||||||
+ if (!identity.category.isEmpty() && !identity.type.isEmpty()) {
|
|
||||||
+ id.setAttribute("category",identity.category);
|
|
||||||
+ id.setAttribute("type",identity.type);
|
|
||||||
+ if (!identity.name.isEmpty()) {
|
|
||||||
+ id.setAttribute("name",identity.name);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ // Default values
|
|
||||||
+ id.setAttribute("category","client");
|
|
||||||
+ id.setAttribute("type","pc");
|
|
||||||
+ }
|
|
||||||
+ query.appendChild(id);
|
|
||||||
+
|
|
||||||
+ QDomElement feature;
|
|
||||||
+ if (node.isEmpty() || node == client()->capsNode() + "#" + client()->capsVersion()) {
|
|
||||||
+ // Standard features
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", "http://jabber.org/protocol/bytestreams");
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", "http://jabber.org/protocol/si");
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", "http://jabber.org/protocol/si/profile/file-transfer");
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", "http://jabber.org/protocol/disco#info");
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+
|
|
||||||
+ if (node.isEmpty()) {
|
|
||||||
+ // Extended features
|
|
||||||
+ QStringList exts = client()->extensions();
|
|
||||||
+ for (QStringList::ConstIterator i = exts.begin(); i != exts.end(); ++i) {
|
|
||||||
+ const QStringList& l = client()->extension(*i).list();
|
|
||||||
+ for ( QStringList::ConstIterator j = l.begin(); j != l.end(); ++j ) {
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", *j);
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else if (node.startsWith(client()->capsNode() + "#")) {
|
|
||||||
+ QString ext = node.right(node.length()-client()->capsNode().length()-1);
|
|
||||||
+ if (client()->extensions().contains(ext)) {
|
|
||||||
+ const QStringList& l = client()->extension(ext).list();
|
|
||||||
+ for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
|
|
||||||
+ feature = doc()->createElement("feature");
|
|
||||||
+ feature.setAttribute("var", *it);
|
|
||||||
+ query.appendChild(feature);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ // TODO: ERROR
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ // TODO: ERROR
|
|
||||||
+ }
|
|
||||||
|
|
||||||
send(iq);
|
|
||||||
return true;
|
|
||||||
@@ -1599,6 +1677,7 @@
|
|
||||||
|
|
||||||
QDomElement iq;
|
|
||||||
Jid jid;
|
|
||||||
+ QString node;
|
|
||||||
DiscoItem item;
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1626,6 +1705,7 @@
|
|
||||||
d->item = DiscoItem(); // clear item
|
|
||||||
|
|
||||||
d->jid = j;
|
|
||||||
+ d->node = node;
|
|
||||||
d->iq = createIQ(doc(), "get", d->jid.full(), id());
|
|
||||||
QDomElement query = doc()->createElement("query");
|
|
||||||
query.setAttribute("xmlns", "http://jabber.org/protocol/disco#info");
|
|
||||||
@@ -1648,6 +1728,29 @@
|
|
||||||
d->iq.appendChild(query);
|
|
||||||
}
|
|
||||||
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Original requested jid.
|
|
||||||
+ * Is here because sometimes the responder does not include this information
|
|
||||||
+ * in the reply.
|
|
||||||
+ */
|
|
||||||
+const Jid& JT_DiscoInfo::jid() const
|
|
||||||
+{
|
|
||||||
+ return d->jid;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Original requested node.
|
|
||||||
+ * Is here because sometimes the responder does not include this information
|
|
||||||
+ * in the reply.
|
|
||||||
+ */
|
|
||||||
+const QString& JT_DiscoInfo::node() const
|
|
||||||
+{
|
|
||||||
+ return d->node;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
const DiscoItem &JT_DiscoInfo::item() const
|
|
||||||
{
|
|
||||||
return d->item;
|
|
||||||
diff -ur psi/iris/xmpp-im/xmpp_tasks.h psi-jingle/iris/xmpp-im/xmpp_tasks.h
|
|
||||||
--- psi/iris/xmpp-im/xmpp_tasks.h 2005-12-27 15:12:45.000000000 +0100
|
|
||||||
+++ psi-jingle/iris/xmpp-im/xmpp_tasks.h 2005-12-27 11:05:53.000000000 +0100
|
|
||||||
@@ -389,6 +389,8 @@
|
|
||||||
void get(const DiscoItem &);
|
|
||||||
|
|
||||||
const DiscoItem &item() const;
|
|
||||||
+ const Jid& jid() const;
|
|
||||||
+ const QString& node() const;
|
|
||||||
|
|
||||||
void onGo();
|
|
||||||
bool take(const QDomElement &);
|
|
@ -1,12 +0,0 @@
|
|||||||
Read this for how to use the rdesktop patch:
|
|
||||||
|
|
||||||
This patch is intended for rdesktop 1.3.1 only. It has not been tested
|
|
||||||
with other versions, and future versions should (hopefully) include it
|
|
||||||
by default.
|
|
||||||
|
|
||||||
- Get a copy of the rdesktop 1.3.1 sources and unpack it.
|
|
||||||
- Place the rdesktop.patch file in the top directory of the unpacked
|
|
||||||
sources.
|
|
||||||
- Go to the directory where you placed the patch and type the following
|
|
||||||
command: patch -p 0 -i rdesktop.patch
|
|
||||||
- You can now compile the sources as usual.
|
|
@ -1,76 +0,0 @@
|
|||||||
--- rdesktop.c.orig 2004-03-08 18:02:58.000000000 +0100
|
|
||||||
+++ rdesktop.c 2004-03-09 22:32:19.000000000 +0100
|
|
||||||
@@ -27,6 +27,7 @@
|
|
||||||
#include <sys/time.h> /* gettimeofday */
|
|
||||||
#include <sys/times.h> /* times */
|
|
||||||
#include <errno.h>
|
|
||||||
+#include <X11/Xlib.h> /* Window */
|
|
||||||
#include "rdesktop.h"
|
|
||||||
|
|
||||||
#ifdef EGD_SOCKET
|
|
||||||
@@ -68,6 +69,7 @@
|
|
||||||
BOOL g_console_session = False;
|
|
||||||
BOOL g_numlock_sync = False;
|
|
||||||
extern BOOL g_owncolmap;
|
|
||||||
+extern Window g_embed_wnd;
|
|
||||||
|
|
||||||
#ifdef WITH_RDPSND
|
|
||||||
BOOL g_rdpsnd = False;
|
|
||||||
@@ -112,6 +114,7 @@
|
|
||||||
fprintf(stderr, " -S: caption button size (single application mode)\n");
|
|
||||||
fprintf(stderr, " -T: window title\n");
|
|
||||||
fprintf(stderr, " -N: enable numlock synchronisation\n");
|
|
||||||
+ fprintf(stderr, " -X: embed into another window with a given id.\n");
|
|
||||||
fprintf(stderr, " -a: connection colour depth\n");
|
|
||||||
fprintf(stderr, " -r: enable specified device redirection (currently: sound)\n");
|
|
||||||
fprintf(stderr, " -0: attach to console\n");
|
|
||||||
@@ -224,6 +227,7 @@
|
|
||||||
prompt_password = False;
|
|
||||||
domain[0] = password[0] = shell[0] = directory[0] = 0;
|
|
||||||
strcpy(keymapname, "en-us");
|
|
||||||
+ g_embed_wnd = 0;
|
|
||||||
|
|
||||||
#ifdef RDP2VNC
|
|
||||||
#define VNCOPT "V:Q:"
|
|
||||||
@@ -231,7 +235,7 @@
|
|
||||||
#define VNCOPT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- while ((c = getopt(argc, argv, VNCOPT "u:d:s:c:p:n:k:g:fbeEmCDKS:T:Na:r:045h?")) != -1)
|
|
||||||
+ while ((c = getopt(argc, argv, VNCOPT "u:d:s:c:p:n:k:g:fbeEmCDKS:T:NX:a:r:045h?")) != -1)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
@@ -374,6 +378,10 @@
|
|
||||||
g_numlock_sync = True;
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case 'X':
|
|
||||||
+ g_embed_wnd = strtod(optarg, NULL);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case 'a':
|
|
||||||
g_server_bpp = strtol(optarg, NULL, 10);
|
|
||||||
if (g_server_bpp != 8 && g_server_bpp != 16 && g_server_bpp != 15
|
|
||||||
--- xwin.c.orig 2004-03-08 18:02:58.000000000 +0100
|
|
||||||
+++ xwin.c 2004-03-10 16:17:59.000000000 +0100
|
|
||||||
@@ -41,6 +41,7 @@
|
|
||||||
static int g_x_socket;
|
|
||||||
static Screen *g_screen;
|
|
||||||
Window g_wnd;
|
|
||||||
+Window g_embed_wnd;
|
|
||||||
BOOL g_enable_compose = False;
|
|
||||||
static GC g_gc;
|
|
||||||
static BOOL g_gc_initialized = False;
|
|
||||||
@@ -929,6 +930,11 @@
|
|
||||||
XFree(sizehints);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if ( g_embed_wnd )
|
|
||||||
+ {
|
|
||||||
+ XReparentWindow(g_display, g_wnd, g_embed_wnd, 0, 0);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
|
|
||||||
VisibilityChangeMask | FocusChangeMask;
|
|
||||||
|
|
Loading…
Reference in new issue