Skip to content

Commit

Permalink
Support for forwarded messages not only withing carbons
Browse files Browse the repository at this point in the history
  • Loading branch information
Ri0n committed Aug 6, 2016
1 parent 17603cd commit cf4d6e5
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 9 deletions.
23 changes: 23 additions & 0 deletions src/xmpp/xmpp-im/types.cpp
Expand Up @@ -957,6 +957,7 @@ class Message::Private
QMap<QString,HTMLElement> htmlElements;
QDomElement sxe;
QList<BoBData> bobDataList;
Jid forwardedFrom;

QList<int> mucStatuses;
QList<MUCInvite> mucInvites;
Expand All @@ -966,6 +967,7 @@ class Message::Private
bool spooled, wasEncrypted;

//XEP-0280 Message Carbons
Message::CarbonDir carbonDir; // it's a forwarded message
bool isDisabledCarbons;
};

Expand All @@ -987,6 +989,7 @@ Message::Message(const Jid &to)
d->errorCode = -1;*/
d->chatState = StateNone;
d->messageReceipt = ReceiptNone;
d->carbonDir = Message::NoCarbon;
d->isDisabledCarbons = false;
}

Expand Down Expand Up @@ -1472,6 +1475,26 @@ bool Message::isDisabledCarbons() const
return d->isDisabledCarbons;
}

void Message::setCarbonDirection(Message::CarbonDir cd)
{
d->carbonDir = cd;
}

Message::CarbonDir Message::carbonDirection() const
{
return d->carbonDir;
}

void Message::setForwardedFrom(const Jid &jid)
{
d->forwardedFrom = jid;
}

const Jid &Message::forwardedFrom() const
{
return d->forwardedFrom;
}

bool Message::spooled() const
{
return d->spooled;
Expand Down
12 changes: 12 additions & 0 deletions src/xmpp/xmpp-im/xmpp_message.h
Expand Up @@ -47,6 +47,12 @@ namespace XMPP {
class Message
{
public:
enum CarbonDir : quint8 {
NoCarbon,
Received,
Sent
};

Message(const Jid &to="");
Message(const Message &from);
Message & operator=(const Message &from);
Expand Down Expand Up @@ -152,6 +158,12 @@ namespace XMPP {
// XEP-0280 Message Carbons
void setDisabledCarbons(bool disabled);
bool isDisabledCarbons() const;
void setCarbonDirection(CarbonDir);
CarbonDir carbonDirection() const;

// XEP-0297
void setForwardedFrom(const Jid &jid);
const Jid &forwardedFrom() const;

// MUC
void addMUCStatus(int);
Expand Down
30 changes: 21 additions & 9 deletions src/xmpp/xmpp-im/xmpp_tasks.cpp
Expand Up @@ -885,28 +885,36 @@ bool JT_PushMessage::take(const QDomElement &e)
return false;

QDomElement e1 = e;
QDomElement forward;
Message::CarbonDir cd = Message::NoCarbon;

// Check for Carbon
QDomNodeList list = e1.childNodes();
for (int i = 0; i < list.size(); ++i) {
QDomElement el = list.at(i).toElement();

if (el.attribute("xmlns") == "urn:xmpp:carbons:2" && (el.tagName() == "received" || el.tagName() == "sent")) {
if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2") && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))) {
QDomElement el1 = el.firstChildElement();
if (el1.tagName() == "forwarded" && el1.attribute("xmlns") == "urn:xmpp:forward:0") {
QDomElement el2 = el1.firstChildElement("message");
if (el1.tagName() == QLatin1String("forwarded") && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
QDomElement el2 = el1.firstChildElement(QLatin1String("message"));
if (!el2.isNull()) {
e1 = el2;
if (el.tagName() == "received")
e1.setAttribute("to", e.attribute("to"));
else
e1.setAttribute("from", e.attribute("to"));
forward = el2;
cd = el.tagName() == QLatin1String("received")? Message::Received : Message::Sent;
break;
}
}
}
else if (el.tagName() == QLatin1String("forwarded") && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
forward = el.firstChildElement(QLatin1String("message")); // currently only messages are supportted
// TODO <delay> element support
if (!forward.isNull()) {
break;
}
}
}

Stanza s = client()->stream().createStanza(addCorrectNS(e1));
QString from = e1.attribute(QLatin1String("from"));
Stanza s = client()->stream().createStanza(addCorrectNS(forward.isNull()? e1 : forward));
if(s.isNull()) {
//printf("take: bad stanza??\n");
return false;
Expand All @@ -917,6 +925,10 @@ bool JT_PushMessage::take(const QDomElement &e)
//printf("bad message\n");
return false;
}
if (!forward.isNull()) {
m.setForwardedFrom(Jid(from));
m.setCarbonDirection(cd);
}

emit message(m);
return true;
Expand Down

0 comments on commit cf4d6e5

Please sign in to comment.