fixup bcb9690
(Roster versioning)
This commit is contained in:
parent
bcb96909c9
commit
142257a544
|
@ -15,6 +15,7 @@ public class Account : Object {
|
||||||
}
|
}
|
||||||
public string? alias { get; set; }
|
public string? alias { get; set; }
|
||||||
public bool enabled { get; set; default = false; }
|
public bool enabled { get; set; default = false; }
|
||||||
|
public string? roster_version { get; set; }
|
||||||
|
|
||||||
private Database? db;
|
private Database? db;
|
||||||
|
|
||||||
|
@ -34,6 +35,7 @@ public class Account : Object {
|
||||||
password = row[db.account.password];
|
password = row[db.account.password];
|
||||||
alias = row[db.account.alias];
|
alias = row[db.account.alias];
|
||||||
enabled = row[db.account.enabled];
|
enabled = row[db.account.enabled];
|
||||||
|
roster_version = row[db.account.roster_version];
|
||||||
|
|
||||||
notify.connect(on_update);
|
notify.connect(on_update);
|
||||||
}
|
}
|
||||||
|
@ -46,6 +48,7 @@ public class Account : Object {
|
||||||
.value(db.account.password, password)
|
.value(db.account.password, password)
|
||||||
.value(db.account.alias, alias)
|
.value(db.account.alias, alias)
|
||||||
.value(db.account.enabled, enabled)
|
.value(db.account.enabled, enabled)
|
||||||
|
.value(db.account.roster_version, roster_version)
|
||||||
.perform();
|
.perform();
|
||||||
|
|
||||||
notify.connect(on_update);
|
notify.connect(on_update);
|
||||||
|
@ -83,6 +86,8 @@ public class Account : Object {
|
||||||
update.set(db.account.alias, alias); break;
|
update.set(db.account.alias, alias); break;
|
||||||
case "enabled":
|
case "enabled":
|
||||||
update.set(db.account.enabled, enabled); break;
|
update.set(db.account.enabled, enabled); break;
|
||||||
|
case "roster-version":
|
||||||
|
update.set(db.account.roster_version, roster_version); break;
|
||||||
}
|
}
|
||||||
update.perform();
|
update.perform();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ using Dino.Entities;
|
||||||
namespace Dino {
|
namespace Dino {
|
||||||
|
|
||||||
public class Database : Qlite.Database {
|
public class Database : Qlite.Database {
|
||||||
private const int VERSION = 1;
|
private const int VERSION = 2;
|
||||||
|
|
||||||
public class AccountTable : Table {
|
public class AccountTable : Table {
|
||||||
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
|
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
|
||||||
|
@ -15,10 +15,11 @@ public class Database : Qlite.Database {
|
||||||
public Column<string> password = new Column.Text("password");
|
public Column<string> password = new Column.Text("password");
|
||||||
public Column<string> alias = new Column.Text("alias");
|
public Column<string> alias = new Column.Text("alias");
|
||||||
public Column<bool> enabled = new Column.BoolInt("enabled");
|
public Column<bool> enabled = new Column.BoolInt("enabled");
|
||||||
|
public Column<string> roster_version = new Column.Text("roster_version") { min_version=2 };
|
||||||
|
|
||||||
internal AccountTable(Database db) {
|
internal AccountTable(Database db) {
|
||||||
base(db, "account");
|
base(db, "account");
|
||||||
init({id, bare_jid, resourcepart, password, alias, enabled});
|
init({id, bare_jid, resourcepart, password, alias, enabled, roster_version});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,18 +129,6 @@ public class Database : Qlite.Database {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AccountKeyValueTable : Table {
|
|
||||||
public Column<int> account_id = new Column.Integer("account_id");
|
|
||||||
public Column<string> key = new Column.Text("key");
|
|
||||||
public Column<string> value = new Column.Text("value");
|
|
||||||
|
|
||||||
internal AccountKeyValueTable(Database db) {
|
|
||||||
base(db, "account_key_value");
|
|
||||||
init({account_id, key, value});
|
|
||||||
unique({account_id, key}, "IGNORE");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AccountTable account { get; private set; }
|
public AccountTable account { get; private set; }
|
||||||
public JidTable jid { get; private set; }
|
public JidTable jid { get; private set; }
|
||||||
public MessageTable message { get; private set; }
|
public MessageTable message { get; private set; }
|
||||||
|
@ -148,7 +137,6 @@ public class Database : Qlite.Database {
|
||||||
public AvatarTable avatar { get; private set; }
|
public AvatarTable avatar { get; private set; }
|
||||||
public EntityFeatureTable entity_feature { get; private set; }
|
public EntityFeatureTable entity_feature { get; private set; }
|
||||||
public RosterTable roster { get; private set; }
|
public RosterTable roster { get; private set; }
|
||||||
public AccountKeyValueTable account_key_value { get; private set; }
|
|
||||||
|
|
||||||
public Map<int, string> jid_table_cache = new HashMap<int, string>();
|
public Map<int, string> jid_table_cache = new HashMap<int, string>();
|
||||||
public Map<string, int> jid_table_reverse = new HashMap<string, int>();
|
public Map<string, int> jid_table_reverse = new HashMap<string, int>();
|
||||||
|
@ -164,8 +152,7 @@ public class Database : Qlite.Database {
|
||||||
avatar = new AvatarTable(this);
|
avatar = new AvatarTable(this);
|
||||||
entity_feature = new EntityFeatureTable(this);
|
entity_feature = new EntityFeatureTable(this);
|
||||||
roster = new RosterTable(this);
|
roster = new RosterTable(this);
|
||||||
account_key_value = new AccountKeyValueTable(this);
|
init({ account, jid, message, real_jid, conversation, avatar, entity_feature, roster });
|
||||||
init({ account, jid, message, real_jid, conversation, avatar, entity_feature, roster, account_key_value });
|
|
||||||
exec("PRAGMA synchronous=0");
|
exec("PRAGMA synchronous=0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,14 +72,12 @@ public class RosterStoreImpl : Roster.Storage, Object {
|
||||||
private Account account;
|
private Account account;
|
||||||
private Database db;
|
private Database db;
|
||||||
|
|
||||||
private string version = "";
|
|
||||||
private HashMap<string, Roster.Item> items = new HashMap<string, Roster.Item>();
|
private HashMap<string, Roster.Item> items = new HashMap<string, Roster.Item>();
|
||||||
|
|
||||||
public class RosterStoreImpl(Account account, Database db) {
|
public class RosterStoreImpl(Account account, Database db) {
|
||||||
this.account = account;
|
this.account = account;
|
||||||
this.db = db;
|
this.db = db;
|
||||||
|
|
||||||
version = db_get_roster_version() ?? "";
|
|
||||||
foreach (Qlite.Row row in db.roster.select().with(db.roster.account_id, "=", account.id)) {
|
foreach (Qlite.Row row in db.roster.select().with(db.roster.account_id, "=", account.id)) {
|
||||||
Roster.Item item = new Roster.Item();
|
Roster.Item item = new Roster.Item();
|
||||||
item.jid = row[db.roster.jid];
|
item.jid = row[db.roster.jid];
|
||||||
|
@ -90,7 +88,7 @@ public class RosterStoreImpl : Roster.Storage, Object {
|
||||||
}
|
}
|
||||||
|
|
||||||
public string? get_roster_version() {
|
public string? get_roster_version() {
|
||||||
return version;
|
return account.roster_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<Roster.Item> get_roster() {
|
public Collection<Roster.Item> get_roster() {
|
||||||
|
@ -102,11 +100,7 @@ public class RosterStoreImpl : Roster.Storage, Object {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_roster_version(string version) {
|
public void set_roster_version(string version) {
|
||||||
db.account_key_value.insert().or("REPLACE")
|
account.roster_version = version;
|
||||||
.value(db.account_key_value.account_id, account.id)
|
|
||||||
.value(db.account_key_value.key, "roster_version")
|
|
||||||
.value(db.account_key_value.value, version)
|
|
||||||
.perform();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_roster(Collection<Roster.Item> items) {
|
public void set_roster(Collection<Roster.Item> items) {
|
||||||
|
@ -130,15 +124,7 @@ public class RosterStoreImpl : Roster.Storage, Object {
|
||||||
items.unset(item.jid);
|
items.unset(item.jid);
|
||||||
db.roster.delete()
|
db.roster.delete()
|
||||||
.with(db.roster.account_id, "=", account.id)
|
.with(db.roster.account_id, "=", account.id)
|
||||||
.with(db.roster.jid, "=", item.jid);
|
.with(db.roster.jid, "=", item.jid).perform();
|
||||||
}
|
|
||||||
|
|
||||||
private string? db_get_roster_version() {
|
|
||||||
Qlite.Row? row = db.account_key_value.select()
|
|
||||||
.with(db.account_key_value.account_id, "=", account.id)
|
|
||||||
.with(db.account_key_value.key, "=", "roster_version").iterator().get_next();
|
|
||||||
if (row != null) return row[db.account_key_value.value];
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,10 @@ public class View : Box {
|
||||||
case "/nick":
|
case "/nick":
|
||||||
stream_interactor.get_module(MucManager.IDENTITY).change_nick(conversation.account, conversation.counterpart, token[1]);
|
stream_interactor.get_module(MucManager.IDENTITY).change_nick(conversation.account, conversation.counterpart, token[1]);
|
||||||
break;
|
break;
|
||||||
|
case "/ping":
|
||||||
|
Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account);
|
||||||
|
stream.get_module(Xmpp.Xep.Ping.Module.IDENTITY).send_ping(stream, conversation.counterpart.to_string() + "/" + token[1], null);
|
||||||
|
break;
|
||||||
case "/topic":
|
case "/topic":
|
||||||
stream_interactor.get_module(MucManager.IDENTITY).change_subject(conversation.account, conversation.counterpart, token[1]);
|
stream_interactor.get_module(MucManager.IDENTITY).change_subject(conversation.account, conversation.counterpart, token[1]);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace Xmpp.Xep.Ping {
|
||||||
public class Module : XmppStreamModule {
|
public class Module : XmppStreamModule {
|
||||||
public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0199_ping");
|
public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0199_ping");
|
||||||
|
|
||||||
public void send_ping(XmppStream stream, string jid, ResponseListener listener) {
|
public void send_ping(XmppStream stream, string jid, ResponseListener? listener) {
|
||||||
Iq.Stanza iq = new Iq.Stanza.get(new StanzaNode.build("ping", NS_URI).add_self_xmlns());
|
Iq.Stanza iq = new Iq.Stanza.get(new StanzaNode.build("ping", NS_URI).add_self_xmlns());
|
||||||
iq.to = jid;
|
iq.to = jid;
|
||||||
stream.get_module(Iq.Module.IDENTITY).send_iq(stream, iq, on_ping_response, listener);
|
stream.get_module(Iq.Module.IDENTITY).send_iq(stream, iq, on_ping_response, listener);
|
||||||
|
@ -35,9 +35,9 @@ namespace Xmpp.Xep.Ping {
|
||||||
public void on_iq_set(XmppStream stream, Iq.Stanza iq) { }
|
public void on_iq_set(XmppStream stream, Iq.Stanza iq) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void on_ping_response(XmppStream stream, Iq.Stanza iq, Object o) {
|
private static void on_ping_response(XmppStream stream, Iq.Stanza iq, Object? o) {
|
||||||
ResponseListener listener = o as ResponseListener;
|
ResponseListener? listener = o as ResponseListener;
|
||||||
listener.on_result(stream);
|
if (listener != null) listener.on_result(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue