From e8f11178ecc1a333976ba713f532fcae11931b16 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Sun, 12 Mar 2017 13:19:04 +0100 Subject: Move storage into user directory and fix plugin search path --- libdino/src/application.vala | 17 +++++++++++++++-- libdino/src/plugin/loader.vala | 27 +++++++++++++++++++++++++-- libdino/src/service/avatar_manager.vala | 12 +++++++++++- libdino/src/service/avatar_storage.vala | 17 +++++++++++------ libdino/src/service/message_manager.vala | 2 +- libdino/src/service/module_manager.vala | 3 --- 6 files changed, 63 insertions(+), 15 deletions(-) (limited to 'libdino/src') diff --git a/libdino/src/application.vala b/libdino/src/application.vala index ad19a976..4b5fd274 100644 --- a/libdino/src/application.vala +++ b/libdino/src/application.vala @@ -8,8 +8,17 @@ public class Dino.Application : Gtk.Application { public StreamInteractor stream_interaction; public Plugins.Registry plugin_registry = new Plugins.Registry(); - public Application() { - this.db = new Database("store.sqlite3"); + public Application() throws Error { + if (DirUtils.create_with_parents(get_storage_dir(), 0700) == -1) { + throw new Error(-1, 0, @"Could not create storage dir \"$(get_storage_dir())\": $(FileUtils.error_from_errno(errno))"); + } + + // FIXME: Legacy import + if (FileUtils.test("store.sqlite3", FileTest.IS_REGULAR)) { + FileUtils.rename("store.sqlite3", Path.build_filename(get_storage_dir(), "dino.db")); + } + + this.db = new Database(Path.build_filename(get_storage_dir(), "dino.db")); this.stream_interaction = new StreamInteractor(db); AvatarManager.start(stream_interaction, db); @@ -21,5 +30,9 @@ public class Dino.Application : Gtk.Application { ConversationManager.start(stream_interaction, db); ChatInteraction.start(stream_interaction); } + + public static string get_storage_dir() { + return Path.build_filename(Environment.get_user_data_dir(), "dino"); + } } diff --git a/libdino/src/plugin/loader.vala b/libdino/src/plugin/loader.vala index acb26ff4..42d7fa9b 100644 --- a/libdino/src/plugin/loader.vala +++ b/libdino/src/plugin/loader.vala @@ -14,17 +14,40 @@ public class Loader : Object { [CCode (has_target = false)] private delegate Type RegisterPluginFunction (Module module); + private string[] search_paths = new string[0]; private RootInterface[] plugins = new RootInterface[0]; private Info[] infos = new Info[0]; + public Loader(string? exec_str = null) { + search_paths += Application.get_storage_dir(); + if (exec_str != null) { + string exec_path = exec_str; + if (!exec_path.contains(Path.DIR_SEPARATOR_S)) { + exec_path = Environment.find_program_in_path(exec_str); + } + if (exec_path[0:5] != "/usr") { + search_paths += Path.get_dirname(exec_path); + } + } + foreach (string dir in Environment.get_system_data_dirs()) { + search_paths += Path.build_filename(dir, "dino"); + } + } + public RootInterface load(string name, Dino.Application app) throws Error { if (Module.supported () == false) { throw new Error (-1, 0, "Plugins are not supported"); } - Module module = Module.open ("plugins/" + name, ModuleFlags.BIND_LAZY); + Module module = null; + string path = ""; + foreach (string prefix in search_paths) { + path = Path.build_filename(prefix, "plugins", name); + module = Module.open (path, ModuleFlags.BIND_LAZY); + if (module != null) break; + } if (module == null) { - throw new Error (-1, 1, Module.error ()); + throw new Error (-1, 1, Module.error ().replace(path, name)); } void* function; diff --git a/libdino/src/service/avatar_manager.vala b/libdino/src/service/avatar_manager.vala index 69e5580e..032bd576 100644 --- a/libdino/src/service/avatar_manager.vala +++ b/libdino/src/service/avatar_manager.vala @@ -20,7 +20,7 @@ public class AvatarManager : StreamInteractionModule, Object { private Database db; private HashMap user_avatars = new HashMap(Jid.hash_func, Jid.equals_func); private HashMap vcard_avatars = new HashMap(Jid.hash_func, Jid.equals_func); - private AvatarStorage avatar_storage = new AvatarStorage("./"); // TODO ihh + private AvatarStorage avatar_storage = new AvatarStorage(get_storage_dir()); private const int MAX_PIXEL = 192; public static void start(StreamInteractor stream_interactor, Database db) { @@ -28,10 +28,20 @@ public class AvatarManager : StreamInteractionModule, Object { stream_interactor.add_module(m); } + public static string get_storage_dir() { + return Path.build_filename(Application.get_storage_dir(), "avatars"); + } + private AvatarManager(StreamInteractor stream_interactor, Database db) { this.stream_interactor = stream_interactor; this.db = db; stream_interactor.account_added.connect(on_account_added); + stream_interactor.module_manager.initialize_account_modules.connect(initialize_avatar_modules); + } + + private void initialize_avatar_modules(Account account, ArrayList modules) { + modules.add(new Xep.UserAvatars.Module(avatar_storage)); + modules.add(new Xep.VCard.Module(avatar_storage)); } public Pixbuf? get_avatar(Account account, Jid jid) { diff --git a/libdino/src/service/avatar_storage.vala b/libdino/src/service/avatar_storage.vala index a9a8fb86..46b43d99 100644 --- a/libdino/src/service/avatar_storage.vala +++ b/libdino/src/service/avatar_storage.vala @@ -9,23 +9,28 @@ public class AvatarStorage : Xep.PixbufStorage, Object { public AvatarStorage(string folder) { this.folder = folder; + DirUtils.create_with_parents(folder, 0700); } public void store(string id, uint8[] data) { - File file = File.new_for_path(id); - if (file.query_exists()) file.delete(); //TODO y? - DataOutputStream fos = new DataOutputStream(file.create(FileCreateFlags.REPLACE_DESTINATION)); - fos.write(data); + File file = File.new_for_path(Path.build_filename(folder, id)); + try { + if (file.query_exists()) file.delete(); //TODO y? + DataOutputStream fos = new DataOutputStream(file.create(FileCreateFlags.REPLACE_DESTINATION)); + fos.write(data); + } catch (Error e) { + // Ignore: we failed in storing, so we refuse to display later... + } } public bool has_image(string id) { - File file = File.new_for_path(folder + id); + File file = File.new_for_path(Path.build_filename(folder, id)); return file.query_exists(); } public Pixbuf? get_image(string id) { try { - return new Pixbuf.from_file(folder + id); + return new Pixbuf.from_file(Path.build_filename(folder, id)); } catch (Error e) { return null; } diff --git a/libdino/src/service/message_manager.vala b/libdino/src/service/message_manager.vala index 11435262..b24aa12d 100644 --- a/libdino/src/service/message_manager.vala +++ b/libdino/src/service/message_manager.vala @@ -170,7 +170,7 @@ public class MessageManager : StreamInteractionModule, Object { pre_message_send(message, new_message, conversation); if (message.marked == Entities.Message.Marked.UNSENT || message.marked == Entities.Message.Marked.WONTSEND) return; if (delayed) { - stream.get_module(Xmpp.Xep.DelayedDelivery.Module.IDENTITY).set_message_delay(new_message, message.time); + Xmpp.Xep.DelayedDelivery.Module.set_message_delay(new_message, message.time); } stream.get_module(Xmpp.Message.Module.IDENTITY).send_message(stream, new_message); message.stanza_id = new_message.id; diff --git a/libdino/src/service/module_manager.vala b/libdino/src/service/module_manager.vala index 896fb1e4..ab268876 100644 --- a/libdino/src/service/module_manager.vala +++ b/libdino/src/service/module_manager.vala @@ -8,7 +8,6 @@ namespace Dino { public class ModuleManager { private HashMap> module_map = new HashMap>(); - private AvatarStorage avatar_storage = new AvatarStorage("./"); private EntityCapabilitiesStorage entity_capabilities_storage; public signal void initialize_account_modules(Account account, ArrayList modules); @@ -65,8 +64,6 @@ public class ModuleManager { module_map[account].add(new Xep.Muc.Module()); module_map[account].add(new Xep.Pubsub.Module()); module_map[account].add(new Xep.EntityCapabilities.Module(entity_capabilities_storage)); - module_map[account].add(new Xep.UserAvatars.Module(avatar_storage)); - module_map[account].add(new Xep.VCard.Module(avatar_storage)); module_map[account].add(new Xep.MessageDeliveryReceipts.Module()); module_map[account].add(new Xep.ChatStateNotifications.Module()); module_map[account].add(new Xep.ChatMarkers.Module()); -- cgit v1.2.3-54-g00ecf