/**
* BlueCove - Java library for Bluetooth
* Copyright (C) 2006-2009 Vlad Skarzhevskyy
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @author vlads
* @version $Id$
*/
package net.sf.bluecove.obex;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
public class Persistence {
private static final String configFileName = "obex-install.cfg";
private static final String devicePrefix = "device:";
private static final String selectedPrefix = "selected:";
private static final Properties properties = new Properties();
private static File homePath() {
String path = ".bluecove";
boolean isWindows = false;
String sysName = System.getProperty("os.name");
if (sysName != null) {
sysName = sysName.toLowerCase();
if (sysName.indexOf("windows") != -1) {
isWindows = true;
path = "Application Data";
}
}
File dir;
try {
dir = new File(System.getProperty("user.home"), path);
if (!dir.exists()) {
if (!dir.mkdirs()) {
throw new SecurityException();
}
}
} catch (SecurityException e) {
dir = new File(new File(System.getProperty("java.io.tmpdir"), System.getProperty("user.name")), path);
}
if (isWindows) {
dir = new File(dir, "BlueCove");
}
if (!dir.exists()) {
if (!dir.mkdirs()) {
return null;
}
} else if (!dir.isDirectory()) {
dir.delete();
if (!dir.mkdirs()) {
return null;
}
}
return dir;
}
private static File getConfigFile() {
File home = homePath();
if (home == null) {
return null;
}
return new File(home, configFileName);
}
public static String loadDevices(Hashtable devices) {
File cf = getConfigFile();
if (cf == null || !cf.exists()) {
return null;
}
Reader fr = null;
LineNumberReader lnr = null;
try {
lnr = new LineNumberReader(fr = new FileReader(cf));
devices.clear();
String line = lnr.readLine();
String selected = null;
while (line != null) {
if (line.startsWith(devicePrefix)) {
DeviceInfo di = new DeviceInfo();
di.loadFromLine(line.substring(devicePrefix.length()));
if (di.isValid()) {
devices.put(di.btAddress.toLowerCase(), di);
}
} else if (line.startsWith(selectedPrefix)) {
selected = line.substring(selectedPrefix.length());
} else {
int p = line.indexOf('=');
if (p != -1) {
properties.put(line.substring(0, p), line.substring(p + 1));
}
}
line = lnr.readLine();
}
return selected;
} catch (Throwable e) {
Logger.debug(e);
return null;
} finally {
if (lnr != null) {
try {
lnr.close();
} catch (IOException e) {
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
}
}
}
}
public static void storeDevices(Hashtable devices, String selected) {
File cf = getConfigFile();
if (cf == null) {
return;
}
FileWriter fw = null;
try {
fw = new FileWriter(cf, false);
for (Enumeration i = devices.keys(); i.hasMoreElements();) {
String addr = (String) i.nextElement();
DeviceInfo di = (DeviceInfo) devices.get(addr);
fw.write(devicePrefix + di.saveAsLine() + "\n");
}
if (selected != null) {
fw.write(selectedPrefix + selected + "\n");
}
for (Enumeration en = properties.propertyNames(); en.hasMoreElements();) {
String name = (String) en.nextElement();
fw.write(name + "=" + properties.getProperty(name) + "\n");
}
fw.flush();
} catch (Throwable e) {
Logger.debug(e);
return;
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
}
}
}
}
public static String getProperty(String key, String defaultValue) {
return properties.getProperty(key, defaultValue);
}
public static void setProperty(String key, String value) {
properties.setProperty(key, value);
}
}