Retabbed
[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 using Gee;
23
24 namespace zavai {
25
26 public interface Resource : Object {
27     /**
28      * Shut down this resource.
29      *
30      * Normally one does nothing here, but it is important to give resources a
31      * chance to do cleanup when the program quits.
32      * 
33      * This can be used for tasks like closing the tags on a GPX track,
34      * releasing a FSO resource, restoring mixer settings and so on.
35      */
36     public abstract void shutdown();
37 }
38
39 public abstract class Service : Object, Resource {
40     public string name { get; construct; }
41
42     bool _started;
43     public bool started {
44         get { return _started; }
45         set { _started = value; }
46         default = false;
47     }
48
49     public signal void toggled(bool new_state);
50
51     protected HashMap<string, int> requests;
52
53     construct {
54         requests = new HashMap<string, int>(str_hash, str_equal);
55     }
56
57     public void shutdown()
58     {
59         stop();
60     }
61
62     /// Activate the service
63     protected virtual void start()
64     {
65         if (!started)
66         {
67             zavai.log.info("Service " + name + " started\n");
68             started = true;
69             toggled(started);
70         }
71     }
72
73     /// Deactivate the service
74     protected virtual void stop()
75     {
76         if (started)
77         {
78             zavai.log.info("Service " + name + " stopped\n");
79             started = false;
80             toggled(started);
81         }
82     }
83
84     /**
85       Request a resource using the given ID.
86      *
87      * If it is the first time the resource is requested, start it and
88      * return true. Else, take note of the request and return false.
89      *
90      * If a resource is requested multiple times with the same ID, it will
91      * need to be released multiple times with that ID.
92      */
93     public bool request(string id)
94     {
95         bool res = (requests.size == 0);
96         if (id in requests)
97             requests[id] = requests[id] + 1;
98         else
99             requests.set(id, 1);
100         if (res) start();
101         return res;
102     }
103
104     /**
105      * Release a resource using the given ID.
106      *
107      * If after the call nothing is requesting the resource, stop it and
108      * return true. Else, take note of the release and return false.
109      *
110      * If a resource is requested multiple times with the same ID, it will
111      * need to be released multiple times with that ID.
112      */
113     public bool release(string id)
114     {
115         if (id in requests)
116         {
117             if (requests[id] > 1)
118                 requests[id] = requests[id] - 1;
119             else
120                 requests.remove(id);
121         } else {
122             return false;
123         }
124         if (requests.size > 0)
125             return false;
126         stop();
127         return true;
128     }
129 }
130
131 }