/* * @(#)CusRegistry.java 1.9 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.customizer; import java.util.*; import java.io.*; import javax.media.CaptureDeviceInfo; import javax.media.cdm.*; public class CusRegistry { // Default Hashtable in RegistryLib.class in jmf.jar private Hashtable defaultHash = null; // Hashtable loaded from jmf.properties, including all the native plugins private Hashtable fullHash = null; // Name of the properties file, including path. private static String filename = null; // Version number of the serialized file format. Will need // to be incremented if the format changes so that an old // implementation will expect errors with a new format. static final int versionNumber = 200; private static final String CLASSPATH = "java.class.path"; private String classpath = null; private String workDir = null; private String javacpath = null; public CusRegistry() { defaultHash = null; fullHash = null; workDir = null; javacpath = null; } public void setWorkDir(String wdir) { workDir = wdir; } public String getWorkDir() { return workDir; } public void setJavacPath(String cpath) { javacpath = cpath; } public String getJavacPath() { return javacpath; } public boolean loadRegistry(){ InputStream ris = null; boolean loadDef = false; defaultHash = new Hashtable(); fullHash = new Hashtable(); // Load the default registry from RegistryLib ris = findJMFPropertiesFile(); boolean loadFull = readRegistry(fullHash, ris); if ( loadFull ) { return true; } try { byte[] data; Class c = Class.forName("com.sun.media.util.RegistryLib"); data = (byte[]) c.getMethod("getData", null).invoke(c,null); if(data != null) { ris = new ByteArrayInputStream(data); loadDef = readRegistry(defaultHash, ris); } } catch ( Exception ex) { ex.printStackTrace(); ris = null; loadDef = false; } return loadDef; } public Hashtable getDefaultRegistry() { return defaultHash; } public Hashtable getFullRegistry() { return fullHash; } // --------------------- public void removePlugIn(Hashtable newhash, String pname, int type) { String key = "PIM." + type + "_" + pname + ".in"; newhash.remove(key); key = "PIM." + type + "_" + pname + ".out"; newhash.remove(key); // System.out.println("remove " + key); } // ---------------------------- public void removeCaptureD(Hashtable newhash, String cname){ String key1 = "CDM.nDevices"; Object oo; if ( newhash.get(key1) != null ) { int totalnum = ((Integer)(newhash.get(key1))).intValue(); int found = -1; int j = 0; String key; CaptureDeviceInfo info; for ( int i = 0 ; i < totalnum; i++) { oo = newhash.get("CDM." + i); if ( oo != null ) { info = (CaptureDeviceInfo)oo; if ( info.getLocator().getProtocol().equalsIgnoreCase(cname) ) { newhash.put(key1, new Integer(totalnum-1)); newhash.remove("CDM." + i); found = i; break; } } } for ( int i = found+1; i < totalnum; i++) { oo = newhash.get("CDM." + i); j = i - 1; key = "CDM." + j; newhash.put(key, oo); } if ( found >= 0) { totalnum --; key = "CDM." + totalnum; newhash.remove(key); } } } // ----------------------------------- private final InputStream findJMFPropertiesFile() { String pfileName = findJMF(); InputStream ris = null; if ( pfileName != null ) { try { ris = new FileInputStream(pfileName); } catch (Exception ex) { ris = null; } } return ris; } public final String findJMF() { // Search the directories in CLASSPATH for the first available // jmf.properties classpath = System.getProperty(CLASSPATH); if (classpath == null ) return null; StringTokenizer tokens = new StringTokenizer(classpath, File.pathSeparator); String dir; String strJMF = "jmf.properties"; File file = null; InputStream ris = null; filename = null; while (tokens.hasMoreTokens()) { dir = tokens.nextToken(); String caps = dir.toUpperCase(); // If its not a directory, then we need to get rid of // the file name and get the directory. try { if (caps.indexOf(".ZIP") > 0 || caps.indexOf(".JAR") > 0 ) { int sep = dir.lastIndexOf(File.separator); if (sep == -1 && ! File.separator.equals("/")) // if someone uses a slash in DOS // instead of a backslash sep = dir.lastIndexOf("/"); if (sep == -1) { // no separator sep = dir.lastIndexOf(":"); // is there a ":" ? if (sep == -1) { // no ":" dir = strJMF; // its just a xxx.jar or xxx.zip } else { // there is a ":" dir = dir.substring(0, sep) + ":" + strJMF; } } else { dir = dir.substring(0, sep) + File.separator + strJMF; } } else dir = dir + File.separator + strJMF; } catch (Exception e) { dir = dir + File.separator + strJMF; } try { file = new File(dir); if ( file.exists() && file.length() > 0 ) { // ris = new FileInputStream(file); filename = dir; System.out.println("Found jmf.properties in " + dir); break; } } catch (Throwable t) { filename = null; return null; } } // end of while return filename; //if ( filename == null || file == null ) // return null; // return ris; } // ------------------------- private final boolean readRegistry(Hashtable hash, InputStream ris) { if ( ris == null ) return false; if ( hash == null ) hash = new Hashtable(); try { // Inner class with skipHeader so that the protected method // readStreamHeader can be called. ObjectInputStream ois = new ObjectInputStream(ris); int tableSize = ois.readInt(); int version = ois.readInt(); if (version > 200) { System.err.println("Version number mismatch.\nThere could be" + " errors in reading the registry"); } for (int i = 0; i < tableSize; i++) { String key = ois.readUTF(); boolean failed = false; byte [] serObject; try { /* serObject = (byte[])ois.readObject(); ByteArrayInputStream bais = new ByteArrayInputStream(serObject); ObjectInputStream tois = new ObjectInputStream(bais); Object value = tois.readObject(); hash.put(key, value); tois.close(); */ Object value = ois.readObject(); hash.put(key, value); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); failed = true; } catch (OptionalDataException ode) { ode.printStackTrace(); failed = true; } } ois.close(); ris.close(); } catch (IOException ioe) { System.err.println("IOException in readRegistry: " + ioe); return false; } catch (Throwable t) { return false; } System.out.println("Registry Size = " + hash.size()); return true; } // ----------------------------- public boolean saveRegistry(Hashtable newhash){ String tmpfilename = workDir + File.separator + "new_jmf.properties"; try { File tmpF = new File(tmpfilename); if ( tmpF.exists() ) { tmpF.delete(); } FileOutputStream fos = new FileOutputStream(tmpfilename); ObjectOutputStream oos = new ObjectOutputStream(fos); int tableSize = newhash.size(); oos.writeInt(tableSize); oos.writeInt(versionNumber); for (Enumeration e = newhash.keys(); e.hasMoreElements() ;) { String key = (String) e.nextElement(); Object value = newhash.get(key); oos.writeUTF(key); // write key as UTF chars. /* ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream tempOOS = new ObjectOutputStream(baos); tempOOS.writeObject(value); tempOOS.flush(); byte [] serObject = baos.toByteArray(); oos.writeObject(serObject); tempOOS.close(); */ oos.writeObject(value); oos.flush(); } oos.close(); } catch ( Exception ex) { ex.printStackTrace(); return false; } return true; } }