+ if not err then
+ hosts[host].events.fire_event("roster-load", { username = username, host = host, roster = roster });
+ end
+ return roster, err;
+end
+
+function save_roster(username, host, roster, jid)
+ if not um_user_exists(username, host) then
+ log("debug", "not saving roster for %s@%s: the user doesn't exist", username, host);
+ return nil;
+ end
+
+ log("debug", "save_roster: saving roster for %s@%s, (%s)", username, host, jid or "all contacts");
+ if not roster then
+ roster = hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster;
+ --if not roster then
+ -- --roster = load_roster(username, host);
+ -- return true; -- roster unchanged, no reason to save
+ --end
+ end
+ if roster then
+ local metadata = roster_metadata(roster);
+ if metadata.version ~= true then
+ metadata.version = (metadata.version or 0) + 1;
+ end
+ if metadata.broken then return nil, "Not saving broken roster" end
+ if jid == nil then
+ local roster_store = storagemanager.open(host, "roster", "keyval");
+ return roster_store:set(username, roster);
+ else
+ local roster_store = storagemanager.open(host, "roster", "map");
+ return roster_store:set_keys(username, { [false] = metadata, [jid] = roster[jid] or roster_store.remove });
+ end
+ end
+ log("warn", "save_roster: user had no roster to save");