Include the <fin><set><first/><last/></></> nodes in the MAM iq result
fix #3322
This commit is contained in:
@@ -725,7 +725,24 @@ bool BiboumiComponent::handle_mam_request(const Stanza& stanza)
|
|||||||
if (!line.col<Database::Nick>().empty())
|
if (!line.col<Database::Nick>().empty())
|
||||||
this->send_archived_message(line, to.full(), from.full(), query_id);
|
this->send_archived_message(line, to.full(), from.full(), query_id);
|
||||||
}
|
}
|
||||||
this->send_iq_result_full_jid(id, from.full(), to.full());
|
{
|
||||||
|
auto fin_ptr = std::make_unique<XmlNode>("fin");
|
||||||
|
{
|
||||||
|
XmlNode& fin = *(fin_ptr.get());
|
||||||
|
fin["xmlns"] = MAM_NS;
|
||||||
|
XmlSubNode set(fin, "set");
|
||||||
|
set["xmlns"] = RSM_NS;
|
||||||
|
if (!lines.empty())
|
||||||
|
{
|
||||||
|
XmlSubNode first(set, "first");
|
||||||
|
first["index"] = "0";
|
||||||
|
first.set_inner(lines[0].col<Database::Uuid>());
|
||||||
|
XmlSubNode last(set, "last");
|
||||||
|
last.set_inner(lines[lines.size() - 1].col<Database::Uuid>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->send_iq_result_full_jid(id, from.full(), to.full(), std::move(fin_ptr));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -640,13 +640,15 @@ void XmppComponent::send_iq_version_request(const std::string& from,
|
|||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::send_iq_result_full_jid(const std::string& id, const std::string& to_jid, const std::string& from_full_jid)
|
void XmppComponent::send_iq_result_full_jid(const std::string& id, const std::string& to_jid, const std::string& from_full_jid, std::unique_ptr<XmlNode> inner)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
iq["from"] = from_full_jid;
|
iq["from"] = from_full_jid;
|
||||||
iq["to"] = to_jid;
|
iq["to"] = to_jid;
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
|
if (inner)
|
||||||
|
iq.add_child(std::move(inner));
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void send_iq_result(const std::string& id, const std::string& to_jid, const std::string& from);
|
void send_iq_result(const std::string& id, const std::string& to_jid, const std::string& from);
|
||||||
void send_iq_result_full_jid(const std::string& id, const std::string& to_jid,
|
void send_iq_result_full_jid(const std::string& id, const std::string& to_jid,
|
||||||
const std::string& from_full_jid);
|
const std::string& from_full_jid, std::unique_ptr<XmlNode> inner=nullptr);
|
||||||
|
|
||||||
void handle_handshake(const Stanza& stanza);
|
void handle_handshake(const Stanza& stanza);
|
||||||
void handle_error(const Stanza& stanza);
|
void handle_error(const Stanza& stanza);
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ def match(stanza, xpath):
|
|||||||
'dataform': 'jabber:x:data',
|
'dataform': 'jabber:x:data',
|
||||||
'version': 'jabber:iq:version',
|
'version': 'jabber:iq:version',
|
||||||
'mam': 'urn:xmpp:mam:2',
|
'mam': 'urn:xmpp:mam:2',
|
||||||
|
'rms': 'http://jabber.org/protocol/rsm',
|
||||||
'delay': 'urn:xmpp:delay',
|
'delay': 'urn:xmpp:delay',
|
||||||
'forward': 'urn:xmpp:forward:0',
|
'forward': 'urn:xmpp:forward:0',
|
||||||
'client': 'jabber:client',
|
'client': 'jabber:client',
|
||||||
@@ -1852,7 +1853,9 @@ if __name__ == '__main__':
|
|||||||
),
|
),
|
||||||
|
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"/iq/mam:fin/rms:set/rsm:last",
|
||||||
|
"/iq/mam:fin/rsm:set/rsm:first")),
|
||||||
|
|
||||||
# Retrieve an empty archive by specifying an early “end” date
|
# Retrieve an empty archive by specifying an early “end” date
|
||||||
partial(send_stanza, """<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id2'>
|
partial(send_stanza, """<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id2'>
|
||||||
|
|||||||
Reference in New Issue
Block a user