/* * $Id$ * * Copyright (C) 2003-2015 JNode.org * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jnode.apps.jpartition.utils.device; import java.io.File; import javax.naming.NameAlreadyBoundException; import javax.naming.NameNotFoundException; import javax.naming.NamingException; import org.apache.log4j.Logger; import org.jnode.apps.jpartition.ErrorReporter; import org.jnode.apps.jpartition.swingview.FileDeviceView; import org.jnode.apps.vmware.disk.VMWareDisk; import org.jnode.apps.vmware.disk.tools.DiskFactory; import org.jnode.driver.Device; import org.jnode.driver.DeviceAlreadyRegisteredException; import org.jnode.driver.DeviceManager; import org.jnode.driver.DeviceNotFoundException; import org.jnode.driver.DriverException; import org.jnode.driver.bus.ide.IDEDevice; import org.jnode.emu.naming.BasicNameSpace; import org.jnode.emu.plugin.model.DummyConfigurationElement; import org.jnode.emu.plugin.model.DummyExtension; import org.jnode.emu.plugin.model.DummyExtensionPoint; import org.jnode.emu.plugin.model.DummyPluginDescriptor; import org.jnode.fs.service.FileSystemService; import org.jnode.fs.service.def.FileSystemPlugin; import org.jnode.naming.InitialNaming; import org.jnode.naming.NameSpace; import org.jnode.test.fs.driver.stubs.StubDeviceManager; import org.jnode.test.fs.filesystem.config.FSType; import org.jnode.util.OsUtils; public class DeviceUtils { private static final long DEFAULT_FILE_SIZE = 1024 * 1024; private static final Logger log = Logger.getLogger(FileDeviceView.class); private static boolean coreInitialized = false; public static final void initJNodeCore() { if (!coreInitialized && !OsUtils.isJNode()) { try { // ShellEmu.main(new String[0]); NameSpace namespace = new BasicNameSpace(); InitialNaming.setNameSpace(namespace); InitialNaming.bind(DeviceManager.NAME, StubDeviceManager.INSTANCE); // Build a plugin descriptor that is sufficient for the FileSystemPlugin to // configure file system types for testing. DummyPluginDescriptor desc = new DummyPluginDescriptor(true); DummyExtensionPoint ep = new DummyExtensionPoint("types", "org.jnode.fs.types", "types"); desc.addExtensionPoint(ep); for (FSType fsType : FSType.values()) { DummyExtension extension = new DummyExtension(); DummyConfigurationElement element = new DummyConfigurationElement(); element.addAttribute("class", fsType.getFsTypeClass().getName()); extension.addElement(element); ep.addExtension(extension); } FileSystemService fss = new FileSystemPlugin(desc); InitialNaming.bind(FileSystemService.class, fss); } catch (NameAlreadyBoundException e) { throw new RuntimeException(e); } catch (NamingException e) { throw new RuntimeException(e); } catch (Exception e) { throw new RuntimeException(e); } coreInitialized = true; } // if (!coreInitialized && !OsUtils.isJNode()) { // // We are not running in JNode, emulate a JNode environment. // // InitialNaming.setNameSpace(new BasicNameSpace()); // // // Build a plugin descriptor that is sufficient for the FileSystemPlugin to // // configure file system types for testing. // DummyPluginDescriptor desc = new DummyPluginDescriptor(true); // DummyExtensionPoint ep = new DummyExtensionPoint("types", "org.jnode.fs.types", "types"); // desc.addExtensionPoint(ep); // for (FSType fsType : FSType.values()) { // DummyExtension extension = new DummyExtension(); // DummyConfigurationElement element = new DummyConfigurationElement(); // element.addAttribute("class", fsType.getFsTypeClass().getName()); // extension.addElement(element); // ep.addExtension(extension); // } // // FileSystemService fss = new FileSystemPlugin(desc); // try { // InitialNaming.bind(FileSystemService.class, fss); // } catch (NameAlreadyBoundException e) { // throw new RuntimeException(e); // } catch (NamingException e) { // throw new RuntimeException(e); // } // coreInitialized = true; // } } public static IDEDevice createFakeDevice(ErrorReporter errorReporter) { IDEDevice device = null; try { String name = findUnusedName("fake"); FakeIDEDevice fd = new FakeIDEDevice(name, true, true, DEFAULT_FILE_SIZE); if (addDevice(fd)) { device = fd; } else { errorReporter.reportError(log, DeviceUtils.class.getName(), "failed to add device"); } } catch (Exception e) { log.error(e); } return device; } public static IDEDevice createVMWareDevice(ErrorReporter errorReporter) { IDEDevice device = null; try { AbstractIDEDevice fd = createVMWareDevice(); if (addDevice(fd)) { device = fd; } else { errorReporter.reportError(log, DeviceUtils.class.getName(), "failed to add device"); } } catch (Exception e) { log.error(e); } return device; } public static IDEDevice createFileDevice(ErrorReporter errorReporter) { IDEDevice device = null; try { AbstractIDEDevice fd = createFileDevice(); if (addDevice(fd)) { device = fd; } else { errorReporter.reportError(log, DeviceUtils.class.getName(), "failed to add device"); } } catch (Exception e) { log.error(e); } return device; } private static AbstractIDEDevice createVMWareDevice() throws Exception { File tmpFile = File.createTempFile("disk", ""); File directory = tmpFile.getParentFile(); String name = tmpFile.getName(); File mainFile = DiskFactory.createSparseDisk(directory, name, DEFAULT_FILE_SIZE); VMWareDisk vmwareDisk = new VMWareDisk(mainFile); AbstractIDEDevice dev = new VMWareIDEDevice(name, true, true, vmwareDisk); return dev; } private static AbstractIDEDevice createFileDevice() throws Exception { File tmpFile = File.createTempFile("disk", ""); File directory = tmpFile.getParentFile(); String name = tmpFile.getName(); AbstractIDEDevice dev = new FileIDEDevice(name, true, true, new File(directory, name), DEFAULT_FILE_SIZE); return dev; } public static void restart(Device device) { DeviceManager devMan; try { devMan = org.jnode.driver.DeviceUtils.getDeviceManager(); devMan.stop(device); devMan.start(device); } catch (NameNotFoundException e) { log.error(e); } catch (DeviceNotFoundException e) { log.error(e); } catch (DriverException e) { log.error(e); } } public static boolean addDevice(AbstractIDEDevice device) { boolean success = false; try { DeviceManager devMan = org.jnode.driver.DeviceUtils.getDeviceManager(); devMan.register(device); success = true; // PartitionHelper helper = new PartitionHelper(device); // helper.initMbr(); // helper.write(); // if(helper.hasValidMBR()) // { // helper.modifyPartition(0, true, 0, DEFAULT_FILE_SIZE, // false, IBMPartitionTypes.PARTTYPE_WIN95_FAT32); // } } catch (NameNotFoundException e) { log.error(e); } catch (DeviceAlreadyRegisteredException e) { log.error(e); } catch (DriverException e) { log.error(e); // } catch (DeviceNotFoundException e) { // log.error(e); // } catch (ApiNotFoundException e) { // log.error(e); // } catch (IOException e) { // log.error(e); } return success; } public static String findUnusedName(String baseName) throws NameNotFoundException { DeviceManager devMan = org.jnode.driver.DeviceUtils.getDeviceManager(); String name = null; int i = 0; do { String newName = baseName + "-" + i; try { devMan.getDevice(newName); i++; } catch (DeviceNotFoundException e) { name = newName; } } while (name == null); return name; } }