Update java library version numbers
[fw/altos] / altoslib / AltosPreferences.java
index dba57dcb73d055f0509257e809346c721dacde92..43fc9f22441fd7f27fa246f82d3c251587657d27 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_5;
+package org.altusmetrum.altoslib_10;
 
 import java.io.*;
 import java.util.*;
+import java.text.*;
 
 public class AltosPreferences {
        public static AltosPreferencesBackend backend = null;
@@ -41,6 +42,11 @@ public class AltosPreferences {
        /* log file format preference name */
        public final static String logfilePreferenceFormat = "LOGFILE-%d";
 
+       /* state preference name */
+       public final static String statePreferenceHead = "STATE-";
+       public final static String statePreferenceFormat = "STATE-%d";
+       public final static String statePreferenceLatest = "STATE-LATEST";
+
        /* voice preference name */
        public final static String voicePreference = "VOICE";
 
@@ -115,6 +121,13 @@ public class AltosPreferences {
 
        public final static String      unitsPreference = "IMPERIAL-UNITS";
 
+       /* Maps cache size preference name */
+       final static String mapCachePreference = "MAP-CACHE";
+
+       static LinkedList<AltosMapCacheListener> map_cache_listeners;
+
+       public static int map_cache = 9;
+
        public static AltosFrequency[] load_common_frequencies() {
                AltosFrequency[] frequencies = null;
                boolean existing = false;
@@ -205,6 +218,9 @@ public class AltosPreferences {
                common_frequencies = load_common_frequencies();
 
                AltosConvert.imperial_units = backend.getBoolean(unitsPreference, false);
+
+               map_cache = backend.getInt(mapCachePreference, 9);
+               map_cache_listeners = new LinkedList<AltosMapCacheListener>();
        }
 
        public static void flush_preferences() {
@@ -333,6 +349,96 @@ 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);
+
+               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());
+               }
+       }
+
+       public static ArrayList<Integer> list_states() {
+               String[]                keys = backend.keys();
+               ArrayList<Integer>      states = new ArrayList<Integer>();
+
+               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);
+                               } catch (ParseException pe) {
+                               }
+                       }
+               }
+               return states;
+       }
+
+       public static void remove_state(int serial) {
+               synchronized(backend) {
+                       backend.remove(String.format(statePreferenceFormat, serial));
+               }
+       }
+
+       public static int latest_state() {
+               int     latest = 0;
+               synchronized (backend) {
+                       latest = backend.getInt(statePreferenceLatest, 0);
+               }
+               return latest;
+       }
+
+       public static AltosSavedState state(int serial) {
+               byte[] bytes = null;
+
+               backend.debug("get state %d\n", 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());
+               }
+               return null;
+       }
+
        public static void set_scanning_telemetry(int new_scanning_telemetry) {
                synchronized (backend) {
                        scanning_telemetry = new_scanning_telemetry;
@@ -503,4 +609,33 @@ public class AltosPreferences {
                        units_listeners.remove(l);
                }
        }
+
+
+       public static void register_map_cache_listener(AltosMapCacheListener l) {
+               synchronized(backend) {
+                       map_cache_listeners.add(l);
+               }
+       }
+
+       public static void unregister_map_cache_listener(AltosMapCacheListener l) {
+               synchronized (backend) {
+                       map_cache_listeners.remove(l);
+               }
+       }
+
+       public static void set_map_cache(int new_map_cache) {
+               synchronized(backend) {
+                       map_cache = new_map_cache;
+                       backend.putInt(mapCachePreference, map_cache);
+                       flush_preferences();
+                       for (AltosMapCacheListener l: map_cache_listeners)
+                               l.map_cache_changed(map_cache);
+               }
+       }
+
+       public static int map_cache() {
+               synchronized(backend) {
+                       return map_cache;
+               }
+       }
 }