~gotwig/gazette/global-service-states

« back to all changes in this revision

Viewing changes to src/PluginManager.vala

  • Committer: Santiago Ocamica
  • Date: 2013-05-10 17:42:56 UTC
  • Revision ID: santi6982@gmail.com-20130510174256-25wteocc5x5klkjn
Initial work on plugin unloading. Plugins are not freed yet (Memory leak)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Code borrowed from Marlin
 
1
/* Code based on Marlin Plugin Manager
2
2
 * Copyright (C) 2011 Lucas Baudin <xapantu@gmail.com>
3
3
 *
4
4
 * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org> (from Rygel)
18
18
 * You should have received a copy of the GNU General Public License along
19
19
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 */
 
21
 
21
22
public class Gazette.PluginManager : GLib.Object
22
23
{
23
24
    delegate Gazette.Plugin ModuleInitFunc ();
27
28
    string plugin_dir;
28
29
    Gee.List<string> names;
29
30
 
30
 
    public PluginManager(Settings settings, string field, string plugin_dir)
31
 
    {
 
31
    public PluginManager (Settings settings, string field, string plugin_dir) {
32
32
        settings_field = field;
33
33
        this.settings = settings;
34
34
        this.plugin_dir = plugin_dir;
35
35
        plugin_hash = new Gee.HashMap<string,Gazette.Plugin>();
36
36
        names = new Gee.ArrayList<string>();
37
37
    }
 
38
    
38
39
    public Gee.Collection<Gazette.Plugin> get_plugins () {
39
40
        return plugin_hash.values;
40
41
    }
41
 
    public void load_plugins()
42
 
    {
 
42
    
 
43
    public void load_plugins () {
43
44
        load_modules_from_dir(plugin_dir);
44
45
    }
45
46
    
46
 
    private void load_modules_from_dir (string path, bool force = false)
47
 
    {
 
47
    private void load_modules_from_dir (string path) {
48
48
        File dir = File.new_for_path(path);
49
49
 
50
50
        string attributes = FileAttribute.STANDARD_NAME + "," +
68
68
 
69
69
                if(file_name.has_suffix(".plug"))
70
70
                {
71
 
                    load_plugin_keyfile(file_path, dir.get_path (), force);
 
71
                    load_plugin_keyfile(file_path, dir.get_path ());
72
72
                }
73
73
                info = enumerator.next_file ();
74
74
            }
82
82
        }
83
83
    }
84
84
 
85
 
    void load_module(string file_path)
 
85
    void load_module (string file_path)
86
86
    {
87
87
        Module module = Module.open (file_path, ModuleFlags.BIND_LOCAL);
88
88
        if (module == null)
108
108
 
109
109
        /* We don't want our modules to ever unload */
110
110
        module.make_resident ();
111
 
        Gazette.Plugin plug = plugin_init();
 
111
        Gazette.Plugin plug = plugin_init ();
112
112
 
113
 
        debug ("Loaded module source: '%s'", module.name());
114
 
        //message ("Loaded module source: '%s'", module.name());
 
113
        debug ("Loaded module source: '%s', id: '%s'", module.name(), plug.id);
115
114
        
116
115
        if(plug != null)
117
 
            plugin_hash.set (file_path, plug);
 
116
            plugin_hash.set (plug.id, (owned) plug);
118
117
    }
119
118
    
120
 
    void load_plugin_keyfile(string path, string parent, bool force)
121
 
    {
 
119
    void load_plugin_keyfile (string path, string parent) {
122
120
        var keyfile = new KeyFile();
123
121
        try
124
122
        {
125
123
            keyfile.load_from_file(path, KeyFileFlags.NONE);
126
124
            string name = keyfile.get_string("Plugin", "Name");
127
125
            names.add(name);
128
 
            if(force || name in settings.get_strv(settings_field))
 
126
            if(name in settings.get_strv(settings_field))
129
127
            {
130
128
                load_module(Path.build_filename(parent, keyfile.get_string("Plugin", "File")));
131
129
            }
132
130
        }
133
131
        catch(Error e)
134
132
        {
135
 
            warning("Couldn't open thie keyfile: %s, %s", path, e.message);
 
133
            warning("Couldn't open the keyfile: %s, %s", path, e.message);
136
134
        }
137
135
    }
138
136
    
139
 
    public Gee.List<string> get_available_plugins()
140
 
    {
 
137
    public Gee.List<string> get_available_plugins () {
141
138
        return names;
142
139
    }
143
140
    
144
 
    public bool disable_plugin(string path)
145
 
    {
146
 
        string[] plugs = settings.get_strv(settings_field);
147
 
        string[] plugs_ = new string[plugs.length - 1];
148
 
        bool found = false;
149
 
        int i = 0;
150
 
        foreach(var name in plugs)
151
 
        {
152
 
            if(name != path)
153
 
            {
154
 
                plugs[i] = name;
155
 
            }
156
 
            else found = true;
157
 
            i++;
158
 
        }
159
 
        if(found) settings.set_strv(settings_field, plugs_);
160
 
        return found;
 
141
    public void disable_plugin (string id) {
 
142
        debug(@"Disabling plugin. ID: $id");
 
143
        var plug = plugin_hash[id];
 
144
        plugin_hash.unset(id);
 
145
        plug.destroy ();
161
146
    }
162
147
}