Preserve unchanged conference data (name) in bookmarks

fixes #748
This commit is contained in:
fiaxh 2020-02-20 16:29:23 +01:00
parent 4c953b5882
commit a81af020f3
6 changed files with 25 additions and 48 deletions

View file

@ -187,13 +187,6 @@ public class MucManager : StreamInteractionModule, Object {
} }
} }
public void replace_bookmark(Account account, Conference was, Conference replace) {
XmppStream? stream = stream_interactor.get_stream(account);
if (stream != null) {
stream.get_module(Xep.Bookmarks.Module.IDENTITY).replace_conference.begin(stream, was, replace);
}
}
public void remove_bookmark(Account account, Conference conference) { public void remove_bookmark(Account account, Conference conference) {
XmppStream? stream = stream_interactor.get_stream(account); XmppStream? stream = stream_interactor.get_stream(account);
if (stream != null) { if (stream != null) {
@ -380,12 +373,8 @@ public class MucManager : StreamInteractionModule, Object {
foreach (Conference conference in conferences) { foreach (Conference conference in conferences) {
if (conference.jid.equals(jid)) { if (conference.jid.equals(jid)) {
if (!conference.autojoin) { if (!conference.autojoin) {
Conference new_conference = new Conference(); Conference new_conference = new Conference() { jid=jid, nick=conference.nick, name=conference.name, password=conference.password, autojoin=true };
new_conference.jid = jid; bookmarks_provider[account].replace_conference.begin(stream, jid, new_conference);
new_conference.autojoin = true;
new_conference.nick = nick;
new_conference.password = password;
bookmarks_provider[account].replace_conference.begin(stream, conference, new_conference);
} }
return; return;
} }
@ -403,12 +392,8 @@ public class MucManager : StreamInteractionModule, Object {
foreach (Conference conference in conferences) { foreach (Conference conference in conferences) {
if (conference.jid.equals(jid)) { if (conference.jid.equals(jid)) {
if (conference.autojoin) { if (conference.autojoin) {
Conference new_conference = new Conference(); Conference new_conference = new Conference() { jid=jid, nick=conference.nick, name=conference.name, password=conference.password, autojoin=false };
new_conference.jid = jid; bookmarks_provider[account].replace_conference.begin(stream, jid, new_conference);
new_conference.autojoin = false;
new_conference.nick = conference.nick;
new_conference.password = conference.password;
bookmarks_provider[account].replace_conference.begin(stream, conference, new_conference);
return; return;
} }
} }

View file

@ -19,7 +19,6 @@ protected class AddGroupchatDialog : Gtk.Dialog {
[GtkChild] private Entry nick_entry; [GtkChild] private Entry nick_entry;
private StreamInteractor stream_interactor; private StreamInteractor stream_interactor;
private Conference? edit_conference = null;
private bool alias_entry_changed = false; private bool alias_entry_changed = false;
public AddGroupchatDialog(StreamInteractor stream_interactor) { public AddGroupchatDialog(StreamInteractor stream_interactor) {
@ -36,19 +35,6 @@ protected class AddGroupchatDialog : Gtk.Dialog {
nick_entry.key_release_event.connect(check_ok); nick_entry.key_release_event.connect(check_ok);
} }
public AddGroupchatDialog.for_conference(StreamInteractor stream_interactor, Account account, Conference conference) {
this(stream_interactor);
edit_conference = conference;
ok_button.label = _("Save");
ok_button.sensitive = true;
accounts_stack.set_visible_child_name("label");
account_label.label = account.bare_jid.to_string();
account_combobox.selected = account;
jid_entry.text = conference.jid.to_string();
nick_entry.text = conference.nick ?? "";
alias_entry.text = conference.name;
}
private bool on_jid_key_release() { private bool on_jid_key_release() {
check_ok(); check_ok();
if (!alias_entry_changed) { if (!alias_entry_changed) {
@ -78,11 +64,7 @@ protected class AddGroupchatDialog : Gtk.Dialog {
conference.jid = new Jid(jid_entry.text); conference.jid = new Jid(jid_entry.text);
conference.nick = nick_entry.text != "" ? nick_entry.text : null; conference.nick = nick_entry.text != "" ? nick_entry.text : null;
conference.name = alias_entry.text; conference.name = alias_entry.text;
if (edit_conference == null) { stream_interactor.get_module(MucManager.IDENTITY).add_bookmark(account_combobox.selected, conference);
stream_interactor.get_module(MucManager.IDENTITY).add_bookmark(account_combobox.selected, conference);
} else {
stream_interactor.get_module(MucManager.IDENTITY).replace_bookmark(account_combobox.selected, edit_conference, conference);
}
close(); close();
} catch (InvalidJidError e) { } catch (InvalidJidError e) {
warning("Ignoring invalid conference Jid: %s", e.message); warning("Ignoring invalid conference Jid: %s", e.message);

View file

@ -11,7 +11,7 @@ public interface BookmarksProvider : Object {
public async abstract async Set<Conference>? get_conferences(XmppStream stream); public async abstract async Set<Conference>? get_conferences(XmppStream stream);
public async abstract void add_conference(XmppStream stream, Conference conference); public async abstract void add_conference(XmppStream stream, Conference conference);
public async abstract void remove_conference(XmppStream stream, Conference conference); public async abstract void remove_conference(XmppStream stream, Conference conference);
public async abstract void replace_conference(XmppStream stream, Conference orig_conference, Conference modified_conference); public async abstract void replace_conference(XmppStream stream, Jid muc_jid, Conference modified_conference);
} }
} }

View file

@ -7,7 +7,11 @@ public class Conference : Object {
public virtual string? name { get; set; } public virtual string? name { get; set; }
public virtual string? password { get; set; } public virtual string? password { get; set; }
public static bool equal_func(Conference a, Conference b) { public bool equals(Conference c) {
return equals_func(this, c);
}
public static bool equals_func(Conference a, Conference b) {
return Jid.equals_func(a.jid, b.jid); return Jid.equals_func(a.jid, b.jid);
} }

View file

@ -7,7 +7,7 @@ public class Module : BookmarksProvider, XmppStreamModule {
public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0048_bookmarks_module"); public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0048_bookmarks_module");
public async Set<Conference>? get_conferences(XmppStream stream) { public async Set<Conference>? get_conferences(XmppStream stream) {
Set<Conference> ret = new HashSet<Conference>(Conference.hash_func, Conference.equal_func); Set<Conference> ret = new HashSet<Conference>(Conference.hash_func, Conference.equals_func);
StanzaNode get_node = new StanzaNode.build("storage", NS_URI).add_self_xmlns(); StanzaNode get_node = new StanzaNode.build("storage", NS_URI).add_self_xmlns();
stream.get_module(PrivateXmlStorage.Module.IDENTITY).retrieve(stream, get_node, (stream, node) => { stream.get_module(PrivateXmlStorage.Module.IDENTITY).retrieve(stream, get_node, (stream, node) => {
@ -54,20 +54,26 @@ public class Module : BookmarksProvider, XmppStreamModule {
public async void add_conference(XmppStream stream, Conference conference) { public async void add_conference(XmppStream stream, Conference conference) {
Set<Conference>? conferences = yield get_conferences(stream); Set<Conference>? conferences = yield get_conferences(stream);
conferences.add(conference); conferences.add(conference);
stream.get_module(Module.IDENTITY).set_conferences(stream, conferences); set_conferences(stream, conferences);
} }
public async void replace_conference(XmppStream stream, Conference orig_conference, Conference modified_conference) { public async void replace_conference(XmppStream stream, Jid muc_jid, Conference modified_conference) {
Set<Conference>? conferences = yield get_conferences(stream); Set<Conference>? conferences = yield get_conferences(stream);
conferences.remove(orig_conference); foreach (Conference conference in conferences) {
conferences.add(modified_conference); if (conference.jid.equals(muc_jid)) {
stream.get_module(Module.IDENTITY).set_conferences(stream, conferences); conference.autojoin = modified_conference.autojoin;
conference.name = modified_conference.name;
conference.nick = modified_conference.nick;
conference.password = modified_conference.password;
}
}
set_conferences(stream, conferences);
} }
public async void remove_conference(XmppStream stream, Conference conference_remove) { public async void remove_conference(XmppStream stream, Conference conference_remove) {
Set<Conference>? conferences = yield get_conferences(stream); Set<Conference>? conferences = yield get_conferences(stream);
conferences.remove(conference_remove); conferences.remove(conference_remove);
stream.get_module(Module.IDENTITY).set_conferences(stream, conferences); set_conferences(stream, conferences);
} }
public override void attach(XmppStream stream) { } public override void attach(XmppStream stream) { }

View file

@ -45,7 +45,7 @@ public class Module : BookmarksProvider, XmppStreamModule {
yield stream.get_module(Pubsub.Module.IDENTITY).publish(stream, stream.get_flag(Bind.Flag.IDENTITY).my_jid.bare_jid, NS_URI, conference.jid.to_string(), conference_node, Xmpp.Xep.Pubsub.ACCESS_MODEL_WHITELIST); yield stream.get_module(Pubsub.Module.IDENTITY).publish(stream, stream.get_flag(Bind.Flag.IDENTITY).my_jid.bare_jid, NS_URI, conference.jid.to_string(), conference_node, Xmpp.Xep.Pubsub.ACCESS_MODEL_WHITELIST);
} }
public async void replace_conference(XmppStream stream, Conference orig_conference, Conference modified_conference) { public async void replace_conference(XmppStream stream, Jid muc_jid, Conference modified_conference) {
yield add_conference(stream, modified_conference); yield add_conference(stream, modified_conference);
} }