author | Anna Ivanova <kalterfx@gmail.com> | |
Sat, 28 Feb 2015 15:44:04 +0000 (21:44 +0600) | ||
committer | Anna Ivanova <kalterfx@gmail.com> | |
Sat, 28 Feb 2015 16:44:04 +0000 (21:44 +0500) |
README.MD | [new file with mode: 0644] | patch | blob |
src/Lib_rms.java | [new file with mode: 0644] | patch | blob |
src/RMSListener.java | [new file with mode: 0644] | patch | blob |
src/StringInputStream.java | [new file with mode: 0644] | patch | blob |
src/StringOutputStream.java | [new file with mode: 0644] | patch | blob |
diff --git a/README.MD b/README.MD
--- /dev/null
+++ b/README.MD
@@ -0,0 +1,4 @@
+Lib_rms\r
+=======\r
+\r
+Lib_rms - library for working with RMS to MIDlet Pascal\r
diff --git a/src/Lib_rms.java b/src/Lib_rms.java
--- /dev/null
+++ b/src/Lib_rms.java
@@ -0,0 +1,365 @@
+import javax.microedition.rms.RecordListener;
+import javax.microedition.rms.RecordStore;
+import javax.microedition.rms.RecordStoreException;
+
+/**
+ * Библиотека для MIDlet Pascal<br/>
+ * Для грамотной работы с RMS
+ * @author Kalter
+ */
+
+public class Lib_rms{
+
+ /**
+ * Хранилище записей
+ */
+ private static RecordStore rms;
+
+ /**
+ * Входные данные
+ */
+ private static StringInputStream input;
+
+ /**
+ * Выходные данные
+ */
+ private static StringOutputStream output;
+
+ /**
+ * Обработчик событий
+ */
+ private static RecordListener listener;
+
+ /**
+ * Открывает хранилище. В случае отсутствия создаёт новое
+ * @param name Имя хранилища
+ */
+ public static void open(String name){
+
+ try{
+
+ rms=RecordStore.openRecordStore(name,true);
+ output=new StringOutputStream();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * Удаляет хранилище по имени
+ * @param name Имя удаляемого хранилища
+ */
+ public static void deleterecordstore(String name){
+
+ try{
+
+ RecordStore.deleteRecordStore(name);
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * @return Время последнего изменения данных в хранилище записей в виде
+ * количества миллисекунд прошедших с 1 января 1970 года до момента
+ * последнего изменения
+ */
+ public static int getlastmodified(){
+
+ try{
+
+ return (int)rms.getLastModified();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @return Имя хранилища
+ */
+ public static String getname(){
+
+ try{
+
+ return rms.getName();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return "-1";
+ }
+ }
+
+ /**
+ * @return Номер, который будет присвоен следующей записи
+ */
+ public static int getnextrecordid(){
+
+ try{
+
+ return rms.getNextRecordID();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @return Количество записей в хранилище
+ */
+ public static int getnumrecords(){
+
+ try{
+
+ return rms.getNumRecords();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @param id Номер записи
+ * @return Размер (в байтах) записи по указанному номеру
+ */
+ public static int getrecordsize(int id){
+
+ try{
+
+ return rms.getRecordSize(id);
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @return Размер (в байтах) хранилища
+ */
+ public static int getsize(){
+
+ try{
+
+ return rms.getSize();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @return Объём памяти (в байтах), доступный для расширения хранилища
+ */
+ public static int getsizeavailable(){
+
+ try{
+
+ return rms.getSizeAvailable();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * @return Номер версии хранилища
+ */
+ public static int getversion(){
+
+ try{
+
+ return rms.getVersion();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ return -1;
+ }
+ }
+
+ /**
+ * Включить обработчик событий
+ */
+ public static void addlistener(){
+
+ listener=new RMSListener();
+ rms.addRecordListener(listener);
+ }
+
+ /**
+ * Отключить обработчик событий
+ */
+ public static void deletelistener(){
+
+ rms.removeRecordListener(listener);
+ listener=null;
+ }
+
+ /**
+ * Удалить запись по указанному номеру
+ * @param id Номер удаляемой записи
+ */
+ public static void deleterecord(int id){
+
+ try{
+
+ rms.deleteRecord(id);
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * Прочитать в буфер данные записи по указанному номеру
+ * @param id Номер записи
+ */
+ public static void read(int id){
+
+ try{
+
+ input=new StringInputStream(new String(rms.getRecord(id)));
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * Добавить данные из буфера в запись
+ */
+ public static void add(){
+
+ try{
+
+ rms.addRecord(output.toString().getBytes(),0,
+ output.toString().length());
+ output=new StringOutputStream();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * Добавить данные из буфера в запись по указанному номеру
+ * @param id Номер записи
+ */
+ public static void set(int id){
+
+ try{
+
+ rms.setRecord(id,output.toString().getBytes(),0,
+ output.toString().length());
+ output=new StringOutputStream();
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * @return Данные из буфера типа Integer
+ */
+ public static int inputinteger(){
+
+ int result=-1;
+ try{
+
+ istype('i');
+ result=Integer.parseInt(input.readString());
+ }catch(IndexOutOfBoundsException ioobe){
+
+ exception(ioobe);
+ }
+ return result;
+ }
+
+ /**
+ * @return Данные из буфера типа String
+ */
+ public static String inputstring(){
+
+ String result="-1";
+ try{
+
+ istype('s');
+ result=input.readString();
+ }catch(IndexOutOfBoundsException ioobe){
+
+ exception(ioobe);
+ }
+ return result;
+ }
+
+ /**
+ * Записывает переменную типа Integer в буфер
+ * @param value Записываемая переменная
+ */
+ public static void printinteger(int value){
+
+ output.write('i',""+value);
+ }
+
+ /**
+ * Записывает переменную типа String в буфер
+ * @param value Записываемая переменная
+ */
+ public static void printstring(String value){
+
+ output.write('s',value);
+ }
+
+ /**
+ * Закрывает хранилище
+ */
+ public static void close(){
+
+ try{
+
+ rms.closeRecordStore();
+ rms=null;
+ input=null;
+ output=null;
+ }catch(RecordStoreException rse){
+
+ exception(rse);
+ }
+ }
+
+ /**
+ * Проверяет на совместимость типа из буфера и читаемого типа
+ * @param c Тип читаемой переменной
+ * @throws IndexOutOfBoundsException При выходе за границы буфера
+ */
+ private static void istype(char c) throws IndexOutOfBoundsException{
+
+ if(c!=input.read()){
+
+ exception(new RecordStoreException("wrong_type"));
+ }
+ }
+
+ /**
+ * Сообщает процедуре rms_exception сообщение об ошибке
+ * @param e Возбужденное исключение
+ */
+ private static void exception(Exception e){
+
+ try{
+
+ M.rms_exception(e.getMessage());
+ }catch(Exception e0){
+
+ System.out.println(e0.getMessage());
+ e0.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/RMSListener.java b/src/RMSListener.java
--- /dev/null
+++ b/src/RMSListener.java
@@ -0,0 +1,61 @@
+import javax.microedition.rms.RecordStore;
+import javax.microedition.rms.RecordListener;
+
+/**
+ * Обработчик событий RMS
+ * @author Kalter
+ */
+
+public class RMSListener implements RecordListener{
+
+ /**
+ * Вызывается после добавления записи в хранилище
+ * @param rms Хранилище
+ * @param id Номер добавленной записи
+ */
+ public void recordAdded(RecordStore rms,int id){
+
+ try{
+
+ M.rms_added(id);
+ }catch(Exception e){
+
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Вызывается при изменении записи
+ * @param rms Хранилище
+ * @param id Номер изменяемой записи
+ */
+ public void recordChanged(RecordStore rms,int id){
+
+ try{
+
+ M.rms_changet(id);
+ }catch(Exception e){
+
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Вызывается после удаления записи
+ * @param rms Хранилище
+ * @param id Номер удаляемой записи
+ */
+ public void recordDeleted(RecordStore rms,int id){
+
+ try{
+
+ M.rms_deleted(id);
+ }catch(Exception e){
+
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/StringInputStream.java b/src/StringInputStream.java
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * Осуществляет удобное чтения из буфера
+ * @author Kalter
+ */
+
+public class StringInputStream{
+
+ /**
+ * Строковой буфер, откуда производится чтение
+ */
+ private final String string;
+
+ /**
+ * Позиция чтения
+ */
+ private int position;
+
+ /**
+ * @param string Буфер, откуда будет производится чтение
+ */
+ public StringInputStream(String string){
+
+ this.string=string;
+ position=0;
+ }
+
+ /**
+ * @return Следующий символ из буфера
+ * @throws IndexOutOfBoundsException При выходе позиции чтения за границы
+ * буфера
+ */
+ public int read() throws IndexOutOfBoundsException{
+
+ int index=position++;
+ if(index>=string.length())throw new IndexOutOfBoundsException("empty");
+ return string.charAt(index);
+ }
+
+ /**
+ * @return Строка до символа остановки
+ * @throws IndexOutOfBoundsException При выходе позиции чтения за границы
+ * буфера
+ */
+ public String readString() throws IndexOutOfBoundsException{
+
+ StringBuffer result=new StringBuffer();
+ int c=read();
+ while(c!='|'){
+
+ result.append((char)c);
+ c=read();
+ }
+ return result.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/StringOutputStream.java b/src/StringOutputStream.java
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * Осуществляет удобную запись в буфер
+ * @author Kalter
+ */
+
+public class StringOutputStream{
+
+ /**
+ * Строковой буфер, куда производится запись
+ */
+ private final StringBuffer data;
+
+ /**
+ * Буфер создаётся пустым
+ */
+ public StringOutputStream(){
+
+ data=new StringBuffer();
+ }
+
+ /**
+ * Записать в буфер данные
+ * @param type Тип данных
+ * @param value Значение данных
+ */
+ public void write(char type,String value){
+
+ data.append(type);
+ data.append(value);
+ data.append('|');
+ }
+
+ /**
+ * @return Строковой буфер
+ */
+ public String toString(){
+
+ return data.toString();
+ }
+}
\ No newline at end of file