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