Module: system-internals Synopsis: Settings and user profiles, for the emulator Author: Scott McKay Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// Settings implementation for the emulator /// Reading, writing, and removing values // Binds 'data' to a byte string containing the key's value //---*** Do this by reading from a file named by the key define macro reading-value { reading-value (?data:name = ?settings:expression, ?key:expression) ?:body end } => { values(#f, #f) } end macro reading-value; // 'body' should evaluate to a byte string, which is written as the key's value //---*** Do this by writing to a file named by the key define macro writing-value { writing-value (?settings:expression, ?key:expression) ?:body end } => { #f } end macro writing-value; define sealed method get-value (settings :: , key :: , type == ) => (value :: false-or(), found? :: ) reading-value (data = settings, key) data end end method get-value; define sealed method set-value (value :: , settings :: , key :: , type == ) => (success? :: ) writing-value (settings, key) value end end method set-value; define sealed method get-value (settings :: , key :: , type == ) => (value :: false-or(), found? :: ) reading-value (data = settings, key) as(, data) end end method get-value; define sealed method set-value (value :: , settings :: , key :: , type == ) => (success? :: ) writing-value (settings, key) as(, value) end end method set-value; define sealed method get-value (settings :: , key :: , type == ) => (value :: false-or(), found? :: ) reading-value (data = settings, key) string-to-integer(data) end end method get-value; define sealed method set-value (value :: , settings :: , key :: , type == ) => (success? :: ) writing-value (settings, key) integer-to-string(value) end end method set-value; define sealed method get-value (settings :: , key :: , type == ) => (value :: false-or(), found? :: ) reading-value (data = settings, key) let value = as-lowercase!(data); case value = "yes" => #t; value = "no" => #f; otherwise => #t; end end end method get-value; define sealed method set-value (value :: , settings :: , key :: , type == ) => (success? :: ) writing-value (settings, key) if (value) "yes" else "no" end end end method set-value; define sealed method get-value (settings :: , key :: , type == ) => (value :: false-or(), found? :: ) reading-value (data = settings, key) string-to-machine-word(data) end end method get-value; define sealed method set-value (value :: , settings :: , key :: , type == ) => (success? :: ) writing-value (settings, key) machine-word-to-string(value) end end method set-value; define sealed method do-remove-value! (settings :: , key :: ) => () //---*** Do this by deleting the file named by the key end method do-remove-value!; /// Creating keys define sealed method settings-key-name (settings :: ) => (key-name :: ) "System" end method settings-key-name; define sealed method settings-handle (settings :: ) => (handle :: ) "~/.settings/System" end method settings-handle; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Site" end method settings-key-name; define sealed method settings-handle (settings :: ) => (handle :: ) "~/.settings/Site" end method settings-handle; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Software" end method settings-key-name; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Local" end method settings-key-name; define sealed method settings-handle (settings :: ) => (handle :: ) "~/.settings/Local" end method settings-handle; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Software" end method settings-key-name; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Hardware" end method settings-key-name; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Users" end method settings-key-name; define sealed method settings-handle (settings :: ) => (handle :: ) "~/.settings/Users" end method settings-handle; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Software" end method settings-key-name; define sealed method settings-key-name (settings :: ) => (key-name :: ) "User" end method settings-key-name; define sealed method settings-handle (settings :: ) => (handle :: ) "~/.settings/Users" end method settings-handle; define sealed method settings-key-name (settings :: ) => (key-name :: ) "Software" end method settings-key-name; /// Registering keys define sealed method initialize-settings (settings :: , for-writing? :: ) => () unless (settings-handle(settings)) let parent = element($settings-table, settings-parent(settings)); initialize-settings(parent, for-writing?); let handle = settings-handle(parent); let key = settings-key-name(settings); let path = concatenate-as(, handle, "/", key); //---*** Create the directory given by 'path' settings-writable?(settings) := for-writing?; settings-handle(settings) := path end end method initialize-settings; define sealed method register-key (settings :: , key-name :: , for-writing? :: ) => (key :: ) // No need to do anything except ensure that all the parent // settings have been initialized //---*** This should transmogrify '?' and '*' characters initialize-settings(settings, for-writing?); key-name end method register-key; define sealed method unregister-key (settings :: , key-name :: ) => () initialize-settings(settings, #t); //---*** What should this do? end method unregister-key;