/* * ac - an AppleCommander command line utility * Copyright (C) 2002 by Robert Greene * robgreene at users.sourceforge.net * Copyright (C) 2003, 2004 by John B. Matthews * matthewsj at users.sourceforge.net * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.webcodepro.applecommander.ui; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import com.webcodepro.applecommander.storage.DirectoryEntry; import com.webcodepro.applecommander.storage.Disk; import com.webcodepro.applecommander.storage.DiskFullException; import com.webcodepro.applecommander.storage.FileEntry; import com.webcodepro.applecommander.storage.FileFilter; import com.webcodepro.applecommander.storage.FormattedDisk; import com.webcodepro.applecommander.storage.FormattedDisk.DiskInformation; import com.webcodepro.applecommander.storage.os.dos33.DosFormatDisk; import com.webcodepro.applecommander.storage.os.pascal.PascalFormatDisk; import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk; import com.webcodepro.applecommander.storage.physical.ByteArrayImageLayout; import com.webcodepro.applecommander.storage.physical.DosOrder; import com.webcodepro.applecommander.storage.physical.ImageOrder; import com.webcodepro.applecommander.storage.physical.ProdosOrder; import com.webcodepro.applecommander.util.AppleUtil; import com.webcodepro.applecommander.util.TextBundle; public class ac { private static TextBundle textBundle = UiBundle.getInstance(); public static void main(String[] args) { try { if (args.length == 0) { help(); } else if ("-ls".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ showDirectory(args[1], FormattedDisk.FILE_DISPLAY_STANDARD); } else if ("-l".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ showDirectory(args[1], FormattedDisk.FILE_DISPLAY_NATIVE); } else if ("-ll".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ showDirectory(args[1], FormattedDisk.FILE_DISPLAY_DETAIL); } else if ("-e".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ getFile(args[1], args[2], true); } else if ("-g".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ getFile(args[1], args[2], false); } else if ("-p".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ putFile(args[1], args[2], args[3], (args.length > 4 ? args[4] : "0x2000")); } else if ("-d".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ deleteFile(args[1], args[2]); } else if ("-i".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ getDiskInfo(args[1]); } else if ("-cc65".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ putCC65(args[1], args[2], args[3]); } else if ("-dos140".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ createDosDisk(args[1], Disk.APPLE_140KB_DISK); } else if ("-pas140".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ createPasDisk(args[1], args[2], Disk.APPLE_140KB_DISK); } else if ("-pas800".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ createPasDisk(args[1], args[2], Disk.APPLE_800KB_DISK); } else if ("-pro140".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ createProDisk(args[1], args[2], Disk.APPLE_140KB_DISK); } else if ("-pro800".equalsIgnoreCase(args[0])) { //$NON-NLS-1$ createProDisk(args[1], args[2], Disk.APPLE_800KB_DISK); } else { help(); } } catch (Exception ex) { System.err.println(textBundle.format("CommandLineErrorMessage", //$NON-NLS-1$ ex.getLocalizedMessage())); ex.printStackTrace(); help(); } } /** * Put into the file named fileName on the disk named imageName; * Note: only volume level supported; input size unlimited. */ static void putFile(String imageName, String fileName, String fileType, String address) throws IOException, DiskFullException { ByteArrayOutputStream buf = new ByteArrayOutputStream(); byte[] inb = new byte[1024]; int byteCount = 0; while ((byteCount = System.in.read(inb)) > 0) { buf.write(inb, 0, byteCount); } Disk disk = new Disk(imageName); FormattedDisk[] formattedDisks = disk.getFormattedDisks(); FormattedDisk formattedDisk = formattedDisks[0]; FileEntry entry = formattedDisk.createFile(); entry.setFilename(fileName); entry.setFiletype(fileType); entry.setFileData(buf.toByteArray()); if (entry.needsAddress()) { entry.setAddress(stringToInt(address)); } formattedDisk.save(); } /** * Put into the file named fileName on the disk named imageName; * Assume a cc65 style four-byte header with start address in bytes 0-1. */ static void putCC65(String imageName, String fileName, String fileType) throws IOException, DiskFullException { byte[] header = new byte[4]; if (System.in.read(header, 0, 4) == 4) { int address = AppleUtil.getWordValue(header, 0); putFile(imageName, fileName, fileType, Integer.toString(address)); } } /** * Delete the file named fileName from the disk named imageName. */ static void deleteFile(String imageName, String fileName) throws IOException { Disk disk = new Disk(imageName); FormattedDisk[] formattedDisks = disk.getFormattedDisks(); for (int i=0; i. */ static void getFile(String imageName, String fileName, boolean filter) throws IOException { Disk disk = new Disk(imageName); FormattedDisk[] formattedDisks = disk.getFormattedDisks(); for (int i=0; i