altoslib: add AltosPreferences state save/restore interfaces
[fw/altos] / altoslib / AltosPreferences.java
index 72cfeb4bc5a47e81c63c2ba0582e0de3438b5263..5fe810d7e8160c6300765fa9390f5e7b155a59cb 100644 (file)
@@ -38,6 +38,12 @@ public class AltosPreferences {
        /* telemetry rate format preference name */
        public final static String telemetryRatePreferenceFormat = "RATE-%d";
 
+       /* log file format preference name */
+       public final static String logfilePreferenceFormat = "LOGFILE-%d";
+
+       /* state preference name */
+       public final static String statePreferenceFormat = "STATE-%d";
+
        /* voice preference name */
        public final static String voicePreference = "VOICE";
 
@@ -83,6 +89,9 @@ public class AltosPreferences {
        /* Telemetry rate (map serial to telemetry format) */
        public static Hashtable<Integer, Integer> telemetry_rates;
 
+       /* Log file (map serial to logfile name) */
+       public static Hashtable<Integer, File> logfiles;
+
        /* Voice preference */
        public static boolean voice;
 
@@ -151,6 +160,10 @@ public class AltosPreferences {
        public static int launcher_channel;
 
        public static void init(AltosPreferencesBackend in_backend) {
+
+               if (backend != null)
+                       return;
+
                backend = in_backend;
 
                /* Initialize logdir from preferences */
@@ -172,6 +185,8 @@ public class AltosPreferences {
 
                telemetry_rates = new Hashtable<Integer,Integer>();
 
+               logfiles = new Hashtable<Integer,File>();
+
                voice = backend.getBoolean(voicePreference, true);
 
                callsign = backend.getString(callsignPreference,"N0CALL");
@@ -300,6 +315,69 @@ public class AltosPreferences {
                }
        }
 
+       public static void set_logfile(int serial, File new_logfile) {
+               synchronized(backend) {
+                       logfiles.put(serial, new_logfile);
+                       backend.putString(String.format(logfilePreferenceFormat, serial), new_logfile.getPath());
+                       flush_preferences();
+               }
+       }
+
+       public static File logfile(int serial) {
+               synchronized(backend) {
+                       if (logfiles.containsKey(serial))
+                               return logfiles.get(serial);
+                       String logfile_string = backend.getString(String.format(logfilePreferenceFormat, serial), null);
+                       if (logfile_string == null)
+                               return null;
+                       File logfile = new File(logfile_string);
+                       logfiles.put(serial, logfile);
+                       return logfile;
+               }
+       }
+
+       public static void set_state(int serial, AltosState state, AltosListenerState listener_state) {
+
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+               try {
+                       ObjectOutputStream oos = new ObjectOutputStream(baos);
+
+                       AltosSavedState saved_state = new AltosSavedState(state, listener_state);
+                       oos.writeObject(saved_state);
+
+                       byte[] bytes = baos.toByteArray();
+
+                       synchronized(backend) {
+                               backend.putBytes(String.format(statePreferenceFormat, serial), bytes);
+                               flush_preferences();
+                       }
+               } catch (IOException ie) {
+               }
+       }
+
+       public static AltosSavedState state(int serial) {
+               byte[] bytes = null;
+
+               synchronized(backend) {
+                       bytes = backend.getBytes(String.format(statePreferenceFormat, serial), null);
+               }
+
+               if (bytes == null)
+                       return null;
+
+               ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+
+               try {
+                       ObjectInputStream ois = new ObjectInputStream(bais);
+                       AltosSavedState saved_state = (AltosSavedState) ois.readObject();
+                       return saved_state;
+               } catch (IOException ie) {
+               } catch (ClassNotFoundException ce) {
+               }
+               return null;
+       }
+
        public static void set_scanning_telemetry(int new_scanning_telemetry) {
                synchronized (backend) {
                        scanning_telemetry = new_scanning_telemetry;