altoslib: Store saved state in version-independent format
[fw/altos] / altoslib / AltosPreferences.java
index 43fc9f22441fd7f27fa246f82d3c251587657d27..3f8e7a070a98715ab0749a80a35a4c1b32250e85 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_10;
+package org.altusmetrum.altoslib_11;
 
 import java.io.*;
 import java.util.*;
@@ -116,6 +116,7 @@ public class AltosPreferences {
        public final static String      frequency_count = "COUNT";
        public final static String      frequency_format = "FREQUENCY-%d";
        public final static String      description_format = "DESCRIPTION-%d";
+       public final static String      frequenciesPreference = "FREQUENCIES-1";
 
        /* Units preference */
 
@@ -128,25 +129,45 @@ public class AltosPreferences {
 
        public static int map_cache = 9;
 
+       final static String mapTypePreference = "MAP-TYPE";
+       static int      map_type;
+
        public static AltosFrequency[] load_common_frequencies() {
+
                AltosFrequency[] frequencies = null;
-               boolean existing = false;
-               existing = backend.nodeExists(common_frequencies_node_name);
 
-               if (existing) {
-                       AltosPreferencesBackend node = backend.node(common_frequencies_node_name);
-                       int             count = node.getInt(frequency_count, 0);
+               AltosHashSet[]  sets = AltosHashSet.array(backend.getString(frequenciesPreference,null));
+               if (sets != null) {
+                       ArrayList<AltosFrequency>       freqs = new ArrayList<AltosFrequency>();
 
-                       frequencies = new AltosFrequency[count];
-                       for (int i = 0; i < count; i++) {
-                               double  frequency;
-                               String  description;
+                       for (int i = 0; i < sets.length; i++) {
+                               AltosFrequency f = AltosFrequency.fromHashSet(sets[i], null);
+                               if (f != null)
+                                       freqs.add(f);
+                       }
+                       frequencies = freqs.toArray(new AltosFrequency[0]);
+               }
 
-                               frequency = node.getDouble(String.format(frequency_format, i), 0.0);
-                               description = node.getString(String.format(description_format, i), null);
-                               frequencies[i] = new AltosFrequency(frequency, description);
+               if (frequencies == null) {
+                       if (backend.nodeExists(common_frequencies_node_name)) {
+                               AltosPreferencesBackend node = backend.node(common_frequencies_node_name);
+                               int             count = node.getInt(frequency_count, 0);
+
+                               if (count > 0) {
+                                       frequencies = new AltosFrequency[count];
+                                       for (int i = 0; i < count; i++) {
+                                               double  frequency;
+                                               String  description;
+
+                                               frequency = node.getDouble(String.format(frequency_format, i), 0.0);
+                                               description = node.getString(String.format(description_format, i), null);
+                                               frequencies[i] = new AltosFrequency(frequency, description);
+                                       }
+                               }
                        }
-               } else {
+               }
+
+               if (frequencies == null) {
                        frequencies = new AltosFrequency[10];
                        for (int i = 0; i < 10; i++) {
                                frequencies[i] = new AltosFrequency(434.550 + i * .1,
@@ -156,15 +177,14 @@ public class AltosPreferences {
                return frequencies;
        }
 
-       public static void save_common_frequencies(AltosFrequency[] frequencies) {
-               AltosPreferencesBackend node = backend.node(common_frequencies_node_name);
-
-               node.putInt(frequency_count, frequencies.length);
-               for (int i = 0; i < frequencies.length; i++) {
-                       node.putDouble(String.format(frequency_format, i), frequencies[i].frequency);
-                       node.putString(String.format(description_format, i), frequencies[i].description);
-               }
+       public static void save_common_frequencies() {
+               AltosHashSet[]  sets = new AltosHashSet[common_frequencies.length];
+               for (int i = 0; i < sets.length; i++)
+                       sets[i] = common_frequencies[i].hashSet();
+               backend.putString(frequenciesPreference, AltosHashSet.toString(sets));
+               flush_preferences();
        }
+
        public static int launcher_serial;
 
        public static int launcher_channel;
@@ -221,6 +241,7 @@ public class AltosPreferences {
 
                map_cache = backend.getInt(mapCachePreference, 9);
                map_cache_listeners = new LinkedList<AltosMapCacheListener>();
+               map_type = backend.getInt(mapTypePreference, AltosMap.maptype_hybrid);
        }
 
        public static void flush_preferences() {
@@ -349,30 +370,12 @@ public class AltosPreferences {
                }
        }
 
-       public static void set_state(int serial, AltosState state, AltosListenerState listener_state) {
-
-               backend.debug("set_state for %d pos %g,%g\n",
-                             serial,
-                             state.gps != null ? state.gps.lat : 0.0,
-                             state.gps != null ? state.gps.lon : 0.0);
+       public static void set_state(AltosState 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);
-                               backend.putInt(statePreferenceLatest, serial);
-                               flush_preferences();
-                       }
-               } catch (IOException ie) {
-                       backend.debug("set_state failed %s\n", ie.toString());
+               synchronized(backend) {
+                       backend.putHashSet(String.format(statePreferenceFormat, state.serial), state.hashSet());
+                       backend.putInt(statePreferenceLatest, state.serial);
+                       flush_preferences();
                }
        }
 
@@ -382,7 +385,6 @@ public class AltosPreferences {
 
                for (String key : keys) {
                        if (key.startsWith(statePreferenceHead)) {
-                               backend.debug("list_states %s\n", key);
                                try {
                                        int serial = AltosParse.parse_int(key.substring(statePreferenceHead.length()));
                                        states.add(serial);
@@ -396,6 +398,7 @@ public class AltosPreferences {
        public static void remove_state(int serial) {
                synchronized(backend) {
                        backend.remove(String.format(statePreferenceFormat, serial));
+                       flush_preferences();
                }
        }
 
@@ -407,36 +410,14 @@ public class AltosPreferences {
                return latest;
        }
 
-       public static AltosSavedState state(int serial) {
-               byte[] bytes = null;
-
-               backend.debug("get state %d\n", serial);
-
+       public static AltosState state(int serial) {
                synchronized(backend) {
-                       bytes = backend.getBytes(String.format(statePreferenceFormat, serial), null);
-               }
-
-               if (bytes == null) {
-                       backend.debug("no state for %d\n", serial);
-                       return null;
-               }
-
-               ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-
-               try {
-                       ObjectInputStream ois = new ObjectInputStream(bais);
-                       AltosSavedState saved_state = (AltosSavedState) ois.readObject();
-                       backend.debug("got saved state for %d: %g,%g\n",
-                                     serial,
-                                     saved_state.state.gps != null ? saved_state.state.gps.lat : 0.0,
-                                     saved_state.state.gps != null ? saved_state.state.gps.lon : 0.0);
-                       return saved_state;
-               } catch (IOException ie) {
-                       backend.debug("IO exception %s\n", ie.toString());
-               } catch (ClassNotFoundException ce) {
-                       backend.debug("ClassNotFoundException %s\n", ce.toString());
+                       try {
+                               return AltosState.fromHashSet(backend.getHashSet(String.format(statePreferenceFormat, serial)));
+                       } catch (Exception e) {
+                               return null;
+                       }
                }
-               return null;
        }
 
        public static void set_scanning_telemetry(int new_scanning_telemetry) {
@@ -552,8 +533,8 @@ public class AltosPreferences {
        public static void set_common_frequencies(AltosFrequency[] frequencies) {
                synchronized(backend) {
                        common_frequencies = frequencies;
-                       save_common_frequencies(frequencies);
-                       flush_preferences();
+
+                       save_common_frequencies();
                }
        }
 
@@ -638,4 +619,39 @@ public class AltosPreferences {
                        return map_cache;
                }
        }
+
+       static LinkedList<AltosMapTypeListener> map_type_listeners;
+
+       public static void set_map_type(int map_type) {
+               synchronized(backend) {
+                       AltosPreferences.map_type = map_type;
+                       backend.putInt(mapTypePreference, map_type);
+                       flush_preferences();
+               }
+               if (map_type_listeners != null) {
+                       for (AltosMapTypeListener l : map_type_listeners) {
+                               l.map_type_changed(map_type);
+                       }
+               }
+       }
+
+       public static int map_type() {
+               synchronized(backend) {
+                       return map_type;
+               }
+       }
+
+       public static void register_map_type_listener(AltosMapTypeListener l) {
+               synchronized(backend) {
+                       if (map_type_listeners == null)
+                               map_type_listeners = new LinkedList<AltosMapTypeListener>();
+                       map_type_listeners.add(l);
+               }
+       }
+
+       public static void unregister_map_type_listener(AltosMapTypeListener l) {
+               synchronized(backend) {
+                       map_type_listeners.remove(l);
+               }
+       }
 }