Reduced usage of Gee
[gregoa/zavai.git] / src / core.vala
1 /*
2  * app - zavai main window
3  *
4  * Copyright (C) 2009  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 using GLib;
22
23 namespace zavai {
24
25 public interface Resource : Object {
26     /**
27      * Shut down this resource.
28      *
29      * Normally one does nothing here, but it is important to give resources a
30      * chance to do cleanup when the program quits.
31      * 
32      * This can be used for tasks like closing the tags on a GPX track,
33      * releasing a FSO resource, restoring mixer settings and so on.
34      */
35     public abstract void shutdown();
36 }
37
38 public abstract class Service : Object, Resource {
39     public string name { get; construct; }
40
41     bool _started;
42     public bool started {
43         get { return _started; }
44         set { _started = value; }
45         default = false;
46     }
47
48     public signal void toggled(bool new_state);
49
50     protected HashMap<string, int> requests;
51
52     construct
53     {
54         requests = new HashMap<string, int>(str_hash, str_equal);
55         zavai.registry.register(this);
56     }
57
58     public void shutdown()
59     {
60         stop();
61     }
62
63     /// Activate the service
64     protected virtual void start()
65     {
66         if (!started)
67         {
68             zavai.log.info("Service " + name + " started\n");
69             started = true;
70             toggled(started);
71         }
72     }
73
74     /// Deactivate the service
75     protected virtual void stop()
76     {
77         if (started)
78         {
79             zavai.log.info("Service " + name + " stopped\n");
80             started = false;
81             toggled(started);
82         }
83     }
84
85     /**
86       Request a resource using the given ID.
87      *
88      * If it is the first time the resource is requested, start it and
89      * return true. Else, take note of the request and return false.
90      *
91      * If a resource is requested multiple times with the same ID, it will
92      * need to be released multiple times with that ID.
93      */
94     public bool request(string id)
95     {
96         bool res = (requests.size == 0);
97         if (id in requests)
98             requests[id] = requests[id] + 1;
99         else
100             requests.set(id, 1);
101         if (res) start();
102         return res;
103     }
104
105     /**
106      * Release a resource using the given ID.
107      *
108      * If after the call nothing is requesting the resource, stop it and
109      * return true. Else, take note of the release and return false.
110      *
111      * If a resource is requested multiple times with the same ID, it will
112      * need to be released multiple times with that ID.
113      */
114     public bool release(string id)
115     {
116         if (id in requests)
117         {
118             if (requests[id] > 1)
119                 requests[id] = requests[id] - 1;
120             else
121                 requests.remove(id);
122         } else {
123             return false;
124         }
125         if (requests.size > 0)
126             return false;
127         stop();
128         return true;
129     }
130 }
131
132 }