You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
6.6 KiB

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.gnu.pilotlink.MidiRecord;
import org.gnu.pilotlink.PilotLink;
import org.gnu.pilotlink.PilotLinkException;
import org.gnu.pilotlink.SysInfo;
import org.gnu.pilotlink.User;
public class MidiMgr {
public final static int LIST=1;
public final static int INSTALL=2;
public final static int NOTHING=0;
public final static int DELETE=3;
public final static int FETCH=4;
public static void main(String args[]) {
String port="/dev/usb/tts/1"; //DEVFS
String db="MIDI Ring Tones";
int command=0;
String arg="";
String arg2="";
try {
for (int i=0; i<args.length; i++) {
if (args[i].equals("-p")) {
port=args[i+1];
i++;
continue;
}
if (args[i].equals("-l") || args[i].equals("--list")) {
command=LIST;
break;
}
if (args[i].equals("-i") || args[i].equals("--install")) {
command=INSTALL;
arg=args[i+1];
if (!arg.endsWith(".mid")) {
System.out.println("File to install must be a .mid-File!");
System.exit(1);
}
File f=new File(arg);
if (!f.exists()) {
System.out.println("File to install must exist! "+arg+" not found!");
System.exit(1);
}
arg2=args[i+2];
break;
}
if (args[i].equals("-d") || args[i].equals("--delete")) {
command=DELETE;
arg=args[i+1];
break;
}
if (args[i].equals("-f")|| args[i].equals("--fetch")) {
command=FETCH;
arg=args[i+1];
break;
}
}
} catch (Exception e) {
command=NOTHING;
}
if (command==NOTHING) {
System.out.println("USAGE: java MidiMgr CMD ARG\nwhere CMD:\n-p PORT: Pilot-Port (default /dev/usb/tts/1)\n-db NAME: Palm-DB to use (default 'MIDI Ring Tones')\n" +
"-l|--list : list all Midi-Files\n-d|--delete NAME: Delete File by name or id\n" +
"-i|--install FILE NAME: Install Midi-File FILE as NAME");
System.exit(1);
}
File p= new File(port);
System.out.println("looking for file " + port);
if (!p.exists()) {
System.out.println("File does not exist... DevFS? Waiting for port to appear");
while (!p.exists()) {
System.out.print(".");
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
PilotLink pl= null;
try {
pl= new PilotLink(port);
if (!pl.isConnected()) {
System.out.println("Something went wrong. Check output!");
System.exit(1);
}
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
try {
User u= pl.getUserInfo();
System.out.println("User: " + u.getName());
System.out.println("Last Synchronization Date: " + u.getLastSyncDate());
} catch (PilotLinkException e) {
e.printStackTrace();
}
try {
SysInfo si= pl.getSysInfo();
System.out.println("Product ID: '" + si.getProdID() + "'");
System.out.println("Rom Version: " + si.getRomVersion());
} catch (PilotLinkException e) {
e.printStackTrace();
}
int dbh;
try {
int db2= pl.openDB(db);
if (db2 < 0) {
System.out.println("ERROR! " + db2);
System.exit(1);
}
switch (command) {
////////
///LIST
case LIST:
int count=pl.getRecordCount(db2);
for (int i=0; i<count;i++) {
MidiRecord mr=new MidiRecord(pl.getRecordByIndex(db2,i));
System.out.println(i+": "+mr.getId()+" "+mr.getName()+" size: "+mr.getSize());
}
break;
//////////////////////
////INSTALL
case INSTALL:
File midi=new File(arg);
try {
InputStream in=new FileInputStream(midi);
long size=midi.length();
byte buf[]=new byte[(int)size];
in.read(buf);
MidiRecord r=new MidiRecord();
r.setName(arg2);
r.setMidi(buf);
in.close();
//hexdump(r.getBuffer());
pl.writeNewRecord(db2,r);
System.out.println("File Installed as "+arg2);
} catch(Exception e){
e.printStackTrace();
}
break;
///////////////////
////FETCH
case FETCH:
MidiRecord mr=null;
try {
int id=Integer.parseInt(arg);
mr=new MidiRecord(pl.getRecordByIndex(db2,id));
} catch(NumberFormatException e) {
System.out.println("No Number! Looking for file...");
count=pl.getRecordCount(db2);
for (int i=0; i<count;i++) {
mr=new MidiRecord(pl.getRecordByIndex(db2,i));
//System.out.println(i+": "+mr.getName()+" size: "+mr.getSize());
if (mr.getName().equals(arg)) {
break;
}
}
}
if (mr!=null) {
File f=new File(mr.getName()+".mid");
try {
f.createNewFile();
OutputStream out=new FileOutputStream(f);
out.write(mr.getMidi());
out.close();
System.out.println("File "+f.getName()+" stored successfully!");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else {
System.out.println("Not found!");
}
break;
////////////////
////DELETE
case DELETE:
MidiRecord r=null;
try {
int id=Integer.parseInt(arg);
pl.deleteRecordById(db2,id);
System.out.println("Index "+id+" deleted.");
} catch(NumberFormatException e) {
System.out.println("No Number! Looking for file...");
count=pl.getRecordCount(db2);
for (int i=0; i<count;i++) {
r=new MidiRecord(pl.getRecordByIndex(db2,i));
if (r.getName().equals(arg)) {
pl.deleteRecordById(db2,r.getId());
break;
}
}
}
break;
}
pl.closeDB(db2);
} catch (PilotLinkException e) {
e.printStackTrace();
}
try {
pl.endSync();
} catch (Exception e) {
e.printStackTrace();
}
pl.close();
System.exit(0);
}
public static void hexdump(byte[] arr) {
for (int i= 0; i < arr.length;) {
String chars= "";
String l= "" + Integer.toHexString(i);
while (l.length() < 4) {
l= "0" + l;
}
System.out.print(l + ": ");
for (int j= 0; j < 16 && i < arr.length; j++, i++) {
l= Integer.toHexString(arr[i]);
if (arr[i] < 0) {
l= l.substring(l.length() - 2);
}
while (l.length() < 2) {
l= "0" + l;
}
System.out.print(l + " ");
if ((arr[i] >= '0' && arr[i] <= 'z') || (arr[i] == ' ')) {
chars += (char) arr[i];
} else if (arr[i] == 252) {
chars += "\ufffd";
} else if (arr[i] ==246) {
chars += "\ufffd";
} else if (arr[i] == (byte) '\ufffd') {
chars += "\ufffd";
} else {
chars += ".";
}
}
System.out.println(" " + chars);
}
}
}