/* * app - zavai main window * * Copyright (C) 2009 Enrico Zini * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using GLib; using Gee; namespace zavai { public interface Resource : Object { /** * Shut down this resource. * * Normally one does nothing here, but it is important to give resources a * chance to do cleanup when the program quits. * * This can be used for tasks like closing the tags on a GPX track, * releasing a FSO resource, restoring mixer settings and so on. */ public abstract void shutdown(); } public abstract class Service : Object, Resource { public string name { get; construct; } bool _started; public bool started { get { return _started; } set { _started = value; } default = false; } public signal void toggled(bool new_state); protected HashMap requests; construct { requests = new HashMap(str_hash, str_equal); } public void shutdown() { stop(); } /// Activate the service protected virtual void start() { if (!started) { zavai.log.info("Service " + name + " started\n"); started = true; toggled(started); } } /// Deactivate the service protected virtual void stop() { if (started) { zavai.log.info("Service " + name + " stopped\n"); started = false; toggled(started); } } /** Request a resource using the given ID. * * If it is the first time the resource is requested, start it and * return true. Else, take note of the request and return false. * * If a resource is requested multiple times with the same ID, it will * need to be released multiple times with that ID. */ public bool request(string id) { bool res = (requests.size == 0); if (id in requests) requests[id] = requests[id] + 1; else requests.set(id, 1); if (res) start(); return res; } /** * Release a resource using the given ID. * * If after the call nothing is requesting the resource, stop it and * return true. Else, take note of the release and return false. * * If a resource is requested multiple times with the same ID, it will * need to be released multiple times with that ID. */ public bool release(string id) { if (id in requests) { if (requests[id] > 1) requests[id] = requests[id] - 1; else requests.remove(id); } else { return false; } if (requests.size > 0) return false; stop(); return true; } } }