Handle if Items/InfoResult are null
This commit is contained in:
parent
231df1bbbb
commit
ee9795d8f4
|
@ -26,6 +26,10 @@ public class ItemsResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ItemsResult? create_from_iq(Iq.Stanza iq) {
|
public static ItemsResult? create_from_iq(Iq.Stanza iq) {
|
||||||
|
if (iq.type_ != Iq.Stanza.TYPE_RESULT) return null;
|
||||||
|
|
||||||
|
if (iq.stanza.get_subnode("query", NS_URI_ITEMS) == null) return null;
|
||||||
|
|
||||||
return new ItemsResult.from_iq(iq);
|
return new ItemsResult.from_iq(iq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,11 +46,11 @@ public class Module : XmppStreamModule, Iq.Handler {
|
||||||
|
|
||||||
if (flag.has_entity_feature(jid, feature) == null) {
|
if (flag.has_entity_feature(jid, feature) == null) {
|
||||||
InfoResult? info_result = yield request_info(stream, jid);
|
InfoResult? info_result = yield request_info(stream, jid);
|
||||||
stream.get_flag(Flag.IDENTITY).set_entity_features(info_result.iq.from, info_result != null ? info_result.features : null);
|
stream.get_flag(Flag.IDENTITY).set_entity_features(jid, info_result != null ? info_result.features : null);
|
||||||
stream.get_flag(Flag.IDENTITY).set_entity_identities(info_result.iq.from, info_result != null ? info_result.identities : null);
|
stream.get_flag(Flag.IDENTITY).set_entity_identities(jid, info_result != null ? info_result.identities : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return flag.has_entity_feature(jid, feature);
|
return flag.has_entity_feature(jid, feature) ?? false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Gee.Set<Identity>? get_entity_identities(XmppStream stream, Jid jid) {
|
public async Gee.Set<Identity>? get_entity_identities(XmppStream stream, Jid jid) {
|
||||||
|
|
|
@ -35,6 +35,7 @@ public class Module : XmppStreamModule, Iq.Handler {
|
||||||
|
|
||||||
private async void query_availability(XmppStream stream) {
|
private async void query_availability(XmppStream stream) {
|
||||||
ServiceDiscovery.ItemsResult? items_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_items(stream, stream.remote_name);
|
ServiceDiscovery.ItemsResult? items_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_items(stream, stream.remote_name);
|
||||||
|
if (items_result == null) return;
|
||||||
|
|
||||||
foreach (Xep.ServiceDiscovery.Item item in items_result.items) {
|
foreach (Xep.ServiceDiscovery.Item item in items_result.items) {
|
||||||
bool has_feature = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).has_entity_feature(stream, item.jid, NS_URI);
|
bool has_feature = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).has_entity_feature(stream, item.jid, NS_URI);
|
||||||
|
|
|
@ -86,6 +86,7 @@ namespace Xmpp.Xep.EntityCapabilities {
|
||||||
ServiceDiscovery.Identity identity = storage.get_identities(caps_hash);
|
ServiceDiscovery.Identity identity = storage.get_identities(caps_hash);
|
||||||
if (identity == null) {
|
if (identity == null) {
|
||||||
ServiceDiscovery.InfoResult? info_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_info(stream, jid_from);
|
ServiceDiscovery.InfoResult? info_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_info(stream, jid_from);
|
||||||
|
if (info_result == null) return;
|
||||||
store_entity_result(stream, caps_hash, info_result);
|
store_entity_result(stream, caps_hash, info_result);
|
||||||
} else {
|
} else {
|
||||||
stream.get_flag(ServiceDiscovery.Flag.IDENTITY).set_entity_features(jid_from, capabilities);
|
stream.get_flag(ServiceDiscovery.Flag.IDENTITY).set_entity_features(jid_from, capabilities);
|
||||||
|
|
|
@ -116,14 +116,26 @@ public class Module : XmppStreamModule {
|
||||||
bool available = check_ns_in_info(stream, stream.remote_name, info_result);
|
bool available = check_ns_in_info(stream, stream.remote_name, info_result);
|
||||||
if (!available) {
|
if (!available) {
|
||||||
ServiceDiscovery.ItemsResult? items_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_items(stream, stream.remote_name);
|
ServiceDiscovery.ItemsResult? items_result = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_items(stream, stream.remote_name);
|
||||||
foreach (Xep.ServiceDiscovery.Item item in items_result.items) {
|
if (items_result == null) return;
|
||||||
ServiceDiscovery.InfoResult? info_result2 = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_info(stream, item.jid);
|
|
||||||
check_ns_in_info(stream, item.jid, info_result2);
|
for (int i = 0; i < 2; i++) {
|
||||||
|
foreach (Xep.ServiceDiscovery.Item item in items_result.items) {
|
||||||
|
|
||||||
|
// First try the promising items and only afterwards all the others
|
||||||
|
bool promising_upload_item = item.jid.to_string().has_prefix("upload");
|
||||||
|
if ((i == 0 && !promising_upload_item) || (i == 1) && promising_upload_item) continue;
|
||||||
|
|
||||||
|
ServiceDiscovery.InfoResult? info_result2 = yield stream.get_module(ServiceDiscovery.Module.IDENTITY).request_info(stream, item.jid);
|
||||||
|
bool available2 = check_ns_in_info(stream, item.jid, info_result2);
|
||||||
|
if (available2) return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool check_ns_in_info(XmppStream stream, Jid jid, Xep.ServiceDiscovery.InfoResult info_result) {
|
private bool check_ns_in_info(XmppStream stream, Jid jid, Xep.ServiceDiscovery.InfoResult? info_result) {
|
||||||
|
if (info_result == null) return false;
|
||||||
|
|
||||||
bool ver_available = false;
|
bool ver_available = false;
|
||||||
bool ver_0_available = false;
|
bool ver_0_available = false;
|
||||||
foreach (string feature in info_result.features) {
|
foreach (string feature in info_result.features) {
|
||||||
|
|
Loading…
Reference in a new issue