/** * 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 org.bluecove.tester.me.rms; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; import javax.microedition.rms.RecordStoreException; import org.bluecove.tester.log.Logger; import org.bluecove.tester.util.IOUtils; public abstract class RmsDataStorage { /** * * @param recordStoreName * @param list * can be null, then load only one first Item * @param instance * @return true in case of success */ public static boolean load(String recordStoreName, Vector list, RmsStorable instance) { RecordStore recordStore = null; try { // RecordStore.deleteRecordStore(name); recordStore = RecordStore.openRecordStore(recordStoreName, false); } catch (RecordStoreException e) { return false; } try { RecordEnumeration re = recordStore.enumerateRecords(null, null, true); while (re.hasNextElement()) { int id = re.nextRecordId(); ByteArrayInputStream bais = new ByteArrayInputStream(recordStore.getRecord(id)); DataInputStream inputStream = new DataInputStream(bais); try { if (list == null) { instance.setRmsId(id); instance.readExternal(inputStream); break; } else { RmsStorable item = instance.newInstance(id); item.readExternal(inputStream); list.addElement(item); } } catch (IOException e) { Logger.error("RMS decode", e); return false; } } } catch (RecordStoreException e) { Logger.error("RMS read", e); return false; } finally { closeQuietly(recordStore); } return true; } public static void deleteRecordStore(String recordStoreName) { try { RecordStore.deleteRecordStore(recordStoreName); } catch (Exception rse) { } } public static boolean saveAll(String recordStoreName, Vector list) { // Delete any previous record store with same name. // Silently ignore failure. try { RecordStore.deleteRecordStore(recordStoreName); } catch (Exception rse) { } RecordStore recordStore = null; // Create new RMS store. If we fail, return false. try { recordStore = RecordStore.openRecordStore(recordStoreName, true); } catch (RecordStoreException rse) { return false; } try { for (Enumeration en = list.elements(); en.hasMoreElements();) { try { RmsStorable item = (RmsStorable) en.nextElement(); byte[] b = IOUtils.writeByteArray(item); item.setRmsId(recordStore.addRecord(b, 0, b.length)); } catch (Throwable e) { Logger.error("RMS write", e); return false; } } } finally { closeQuietly(recordStore); } return true; } public static boolean update(String recordStoreName, RmsStorable item) { RecordStore recordStore = null; // Create new RMS store. If we fail, return false. try { recordStore = RecordStore.openRecordStore(recordStoreName, true); } catch (RecordStoreException rse) { return false; } try { byte[] b = IOUtils.writeByteArray(item); if (item.getRmsId() == -1) { item.setRmsId(recordStore.addRecord(b, 0, b.length)); } else { recordStore.setRecord(item.getRmsId(), b, 0, b.length); } return true; } catch (Throwable e) { Logger.error("RMS write", e); return false; } finally { closeQuietly(recordStore); } } public static void closeQuietly(RecordStore recordStore) { try { if (recordStore != null) { recordStore.closeRecordStore(); } } catch (RecordStoreException ignore) { // ignore } } }