/* Demo Recorder for MAEMO 5 * Copyright (C) 2010 Dru Moore * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * or (at your option) any later version, as published by the Free * Software Foundation * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ namespace IdWorks { public class ApplicationSettings { public enum OpenAction { LAST_PROJECT, NEW_PROJECT, RECENT_PROJECTS, NAMED_PROJECT; public static OpenAction from_label(string val) { switch (val) { case "Last open project": return LAST_PROJECT; case "New project": return NEW_PROJECT; case "Recent projects list": return RECENT_PROJECTS; case "Specified project": return NAMED_PROJECT; default: return LAST_PROJECT; } } public static OpenAction from_name(string val) { switch (val) { case "LAST_PROJECT": return LAST_PROJECT; case "NEW_PROJECT": return NEW_PROJECT; case "RECENT_PROJECTS": return RECENT_PROJECTS; case "NAMED_PROJECT": return NAMED_PROJECT; default: return LAST_PROJECT; } } public static string to_label(OpenAction val) { switch (val) { case LAST_PROJECT: return "Last open project"; case NEW_PROJECT: return "New project"; case RECENT_PROJECTS: return "Recent projects list"; case NAMED_PROJECT: return "Specified project"; default: return "Last open project"; } } public static string to_name(OpenAction val) { switch(val) { case LAST_PROJECT: return "LAST_PROJECT"; case NEW_PROJECT: return "NEW_PROJECT"; case RECENT_PROJECTS: return "RECENT_PROJECTS"; case NAMED_PROJECT: return "NAMED_PROJECT"; default: return "LAST_PROJECT"; } } } public enum CloseAction { AUTO_SAVE_PROJECT, PROMPT_SAVE_PROJECT, DO_NOTHING; public static CloseAction from_label(string val) { switch (val) { case "Auto-save the project": return AUTO_SAVE_PROJECT; case "Prompt to save the project": return PROMPT_SAVE_PROJECT; case "Do nothing": return DO_NOTHING; default: return AUTO_SAVE_PROJECT; } } public static CloseAction from_name(string val) { switch (val) { case "AUTO_SAVE_PROJECT": return AUTO_SAVE_PROJECT; case "PROMPT_SAVE_PROJECT": return PROMPT_SAVE_PROJECT; case "DO_NOTHING": return DO_NOTHING; default: return PROMPT_SAVE_PROJECT; } } public static string to_label(CloseAction val) { switch (val) { case AUTO_SAVE_PROJECT: return "Auto-save the project"; case PROMPT_SAVE_PROJECT: return "Prompt to save the project"; case DO_NOTHING: return "Do nothing"; default: return "Auto-save the project"; } } public static string to_name(CloseAction val) { switch(val) { case AUTO_SAVE_PROJECT: return "AUTO_SAVE_PROJECT"; case PROMPT_SAVE_PROJECT: return "PROMPT_SAVE_PROJECT"; case DO_NOTHING: return "DO_NOTHING"; default: return "PROMPT_SAVE_PROJECT"; } } } public enum AddTrackAction { SET_ACTIVE, SET_SOLO, SET_INACTIVE, SET_MUTE; public static AddTrackAction from_label(string val) { switch (val) { case "Enable track": return SET_ACTIVE; case "Solo track": return SET_SOLO; case "Disable track": return SET_INACTIVE; case "Mute track": return SET_MUTE; default: return SET_ACTIVE; } } public static AddTrackAction from_name(string val) { switch (val) { case "SET_ACTIVE": return SET_ACTIVE; case "SET_SOLO": return SET_SOLO; case "SET_INACTIVE": return SET_INACTIVE; case "SET_MUTE": return SET_MUTE; default: return SET_ACTIVE; } } public static string to_label(AddTrackAction val) { switch (val) { case SET_ACTIVE: return "Enable track"; case SET_SOLO: return "Solo track"; case SET_INACTIVE: return "Disable track"; case SET_MUTE: return "Mute track"; default: return "Enable track"; } } public static string to_name(AddTrackAction val) { switch(val) { case SET_ACTIVE: return "SET_ACTIVE"; case SET_SOLO: return "SET_SOLO"; case SET_INACTIVE: return "SET_INACTIVE"; case SET_MUTE: return "SET_MUTE"; default: return "SET_ACTIVE"; } } } public enum BounceTracksAction { SET_SOURCE_INACTIVE, SET_SOURCE_MUTE, SET_TARGET_SOLO, SET_TARGET_INACTIVE, SET_TARGET_MUTE; public static BounceTracksAction from_label(string val) { switch (val) { case "Disable source tracks": return SET_SOURCE_INACTIVE; case "Mute source tracks": return SET_SOURCE_MUTE; case "Solo new track": return SET_TARGET_SOLO; case "Disable new track": return SET_TARGET_INACTIVE; case "Mute new track": return SET_TARGET_MUTE; default: return SET_SOURCE_INACTIVE; } } public static BounceTracksAction from_name(string val) { switch (val) { case "SET_SOURCE_INACTIVE": return SET_SOURCE_INACTIVE; case "SET_SOURCE_MUTE": return SET_SOURCE_MUTE; case "SET_TARGET_SOLO": return SET_TARGET_SOLO; case "SET_TARGET_INACTIVE": return SET_TARGET_INACTIVE; case "SET_TARGET_MUTE": return SET_TARGET_MUTE; default: return SET_SOURCE_INACTIVE; } } public static string to_label(BounceTracksAction val) { switch (val) { case SET_SOURCE_INACTIVE: return "Disable source tracks"; case SET_SOURCE_MUTE: return "Mute source tracks"; case SET_TARGET_SOLO: return "Solo new track"; case SET_TARGET_INACTIVE: return "Disable new track"; case SET_TARGET_MUTE: return "Mute new track"; default: return "Disable source tracks"; } } public static string to_name(BounceTracksAction val) { switch (val) { case SET_SOURCE_INACTIVE: return "SET_SOURCE_INACTIVE"; case SET_SOURCE_MUTE: return "SET_SOURCE_MUTE"; case SET_TARGET_SOLO: return "SET_TARGET_SOLO"; case SET_TARGET_INACTIVE: return "SET_TARGET_INACTIVE"; case SET_TARGET_MUTE: return "SET_TARGET_MUTE"; default: return "SET_SOURCE_INACTIVE"; } } } public enum RemoveTrackAction { PROMPT, DELETE_FILE, PRESERVE_FILE; public static RemoveTrackAction from_label(string val) { switch (val) { case "Prompt with choices": return PROMPT; case "Delete the file": return DELETE_FILE; case "Preserve the file": return PRESERVE_FILE; default: return PROMPT; } } public static RemoveTrackAction from_name(string val) { switch (val) { case "PROMPT": return PROMPT; case "DELETE_FILE": return DELETE_FILE; case "PRESERVE_FILE": return PRESERVE_FILE; default: return PROMPT; } } public static string to_label(RemoveTrackAction val) { switch (val) { case PROMPT: return "Prompt with choices"; case DELETE_FILE: return "Delete the file"; case PRESERVE_FILE: return "Preserve the file"; default: return "Prompt with choices"; } } public static string to_name(RemoveTrackAction val) { switch(val) { case PROMPT: return "PROMPT"; case DELETE_FILE: return "DELETE_FILE"; case PRESERVE_FILE: return "PRESERVE_FILE"; default: return "PROMPT"; } } } public enum MixdownAction { NONE, PLAY_TARGET; public static MixdownAction from_label(string val) { switch (val) { case "Do nothing": return NONE; case "Play mix": return PLAY_TARGET; default: return NONE; } } public static MixdownAction from_name(string val) { switch (val) { case "NONE": return NONE; case "PLAY_TARGET": return PLAY_TARGET; default: return NONE; } } public static string to_label(MixdownAction val) { switch (val) { case NONE: return "Do nothing"; case PLAY_TARGET: return "Play mix"; default: return "Do nothing"; } } public static string to_name(MixdownAction val) { switch(val) { case NONE: return "NONE"; case PLAY_TARGET: return "PLAY_TARGET"; default: return "NONE"; } } } public string working_directory {public get; public set;} public string last_project_name {public get; public set;} public string last_project_location {public get; public set;} public string named_project_name {public get; public set;} public string named_project_location {public get; public set;} public string[] recent_project_names {public get; public set;} public string[] recent_project_locations {public get; public set;} public uint64 delay_max_delay {public get; public set;} public bool mixdown_enable_lamenc {public get; public set;} public bool mixdown_enable_mpegaudio {public get; public set;} public OpenAction open_action {public get; public set;} public CloseAction close_action {public get; public set;} public AddTrackAction add_track_action {public get; public set;} public BounceTracksAction bounce_tracks_action {public get; public set;} public RemoveTrackAction remove_track_action {public get; public set;} public MixdownAction mixdown_action {public get; public set;} public ApplicationSettings() { working_directory = Environment.get_home_dir() + "/DemoRecordings"; last_project_name = ""; last_project_location = ""; named_project_name = ""; named_project_location = ""; recent_project_names = new string[]{"","","","","","","","","",""}; recent_project_locations = new string[]{"","","","","","","","","",""}; delay_max_delay = Time.Nanoseconds.SECOND / 2; mixdown_enable_lamenc = false; mixdown_enable_mpegaudio = false; open_action = OpenAction.LAST_PROJECT; close_action = CloseAction.PROMPT_SAVE_PROJECT; add_track_action = AddTrackAction.SET_ACTIVE; bounce_tracks_action = BounceTracksAction.SET_SOURCE_INACTIVE; remove_track_action = RemoveTrackAction.PROMPT; } public static ApplicationSettings load_settings(string filename, string version, out string errors) { errors = ""; ApplicationSettings settings = new ApplicationSettings(); bool success = false; // prepare the Xml Parser Xml.Parser.init(); // load the document Xml.Doc* doc = Xml.Parser.parse_file(filename); if (null != doc) { // load the root node Xml.Node* root = doc->get_root_element(); if (null != root) { // check element is ProjectSettings if ("ApplicationSettings" == root->name) { // check version string? doc_version = XmlHelpers.get_node_attribute(root, "version"); if (null != doc_version && version == doc_version) { // looking good let's get parsing. try { settings.from_xml_node(root); success = true; } catch (GLib.Error ex) { errors = "ApplicationSettings parser threw an error."; } finally { // no op } } else { errors = "Incorrect version or unversioned document."; } } else { errors = "Not a valid settings file."; } } else { errors = "No root node found."; } // clean up delete doc; } else { errors = "Couldn't parse file as valid XML."; } // clean up the parser Xml.Parser.cleanup(); return (success) ? settings : null; } public static bool save_settings(string filename, ApplicationSettings settings, ref string errors) { //stdout.printf("save settings called\n"); //stdout.flush(); string contents = settings.to_xml_string(); errors = ""; if (0 < contents.length) { contents = "\n" + contents; //stdout.printf(contents); //stdout.printf("\n" + filename + "\n"); //stdout.flush(); try { if (FileUtils.set_contents(filename, contents, contents.length)) { //stdout.printf("save settings worked\n"); //stdout.flush(); return true; } else { errors = "Couldn't save the settings file!\n%s".printf("FILE ERROR"); } } catch (FileError ex) { errors = "Couldn't save the settings file!\n%s".printf("FILE ERROR"); } } else { errors = "Couldn't serialize the settings!."; } //stdout.printf("save settings failed\n"); //stdout.flush(); return false; } private string to_xml_string() { return ("\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "%llu\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "\n").printf( working_directory, last_project_name, last_project_location, "", "", "", "", delay_max_delay, mixdown_enable_lamenc.to_string(), mixdown_enable_mpegaudio.to_string(), OpenAction.to_name(open_action), CloseAction.to_name(close_action), AddTrackAction.to_name(add_track_action), BounceTracksAction.to_name(bounce_tracks_action), RemoveTrackAction.to_name(remove_track_action) ); } private void from_xml_node(Xml.Node* node) { // Loop over the passed node's children for (Xml.Node* iter = node->children; iter != null; iter = iter->next) { // Spaces between tags are also nodes, discard them if (iter->type != Xml.ElementType.ELEMENT_NODE) { continue; } // Get the node's name string node_name = iter->name; // Get the nodes type string? type = XmlHelpers.get_node_attribute(iter, "type"); // Get the node's content with stripped if (null != type) { // check the type switch(type) { case "string": switch(node_name) { case "working_directory": this.working_directory = iter->get_content(); break; case "last_project_name": this.last_project_name = iter->get_content(); break; case "last_project_location": this.last_project_location = iter->get_content(); break; case "named_project_name": this.named_project_name = iter->get_content(); break; case "named_project_location": this.named_project_location = iter->get_content(); break; default: break; } break; case "bool": switch(node_name) { case "mixdown_enable_lamenc": this.mixdown_enable_lamenc = iter->get_content().to_bool(); break; case "mixdown_enable_mpegaudio": this.mixdown_enable_mpegaudio = iter->get_content().to_bool(); break; default: break; } break; case "uint64": switch(node_name) { case "delay_max_delay": this.delay_max_delay = iter->get_content().to_uint64(); break; default: break; } break; case "CDL": switch(node_name) { case "recent_project_names": /// TODO this.recent_project_names = iter->get_content().to_uint64(); break; case "recent_project_locations": /// TODO this.recent_project_locations = iter->get_content().to_uint64(); break; default: break; } break; case "OpenAction": switch(node_name) { case "open_action": this.open_action = OpenAction.from_name(iter->get_content()); break; default: break; } break; case "CloseAction": switch(node_name) { case "close_action": this.close_action = CloseAction.from_name(iter->get_content()); break; default: break; } break; case "AddTrackAction": switch(node_name) { case "add_track_action": this.add_track_action = AddTrackAction.from_name(iter->get_content()); break; default: break; } break; case "BounceTracksAction": switch(node_name) { case "bounce_tracks_action": this.bounce_tracks_action = BounceTracksAction.from_name(iter->get_content()); break; default: break; } break; case "RemoveTrackAction": switch(node_name) { case "remove_track_action": this.remove_track_action = RemoveTrackAction.from_name(iter->get_content()); break; default: break; } break; default: continue; } } } } } }