Remove old *.patch files. Code is already merged or obsolete.

pull/1/head
Darrell Anderson 12 years ago
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…
Cancel
Save