/* * @(#)Log.java 1.10 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import java.io.*; import java.lang.reflect.Method; import java.lang.reflect.Constructor; import com.sun.media.JMFSecurity; import com.sun.media.JDK12Security; import com.sun.media.IESecurity; import com.sun.media.JMFSecurityManager; import com.ms.security.PermissionID; import com.ms.security.PolicyEngine; /** * A public static class to generate and write to jmf.log. */ public class Log { public static boolean isEnabled = true; private static DataOutputStream log = null; private static String fileName = "jmf.log"; private static int indent = 0; // Security private static JMFSecurity jmfSecurity = null; private static Method m[] = new Method[1]; private static Class cl[] = new Class[1]; private static Object args[][] = new Object[1][0]; private static boolean ieSec = false; private static String permission = null; private static int permissionid = 0; static { // This is to guard against the log file being opened twice at // the same time. synchronized (fileName) { // Check so we won't run this twice. if (isEnabled && log == null) { Object llog = com.sun.media.util.Registry.get("allowLogging"); // Check the registry file to see if logging is turned on. if (llog != null && llog instanceof Boolean) { if (! ((Boolean)llog).booleanValue()) isEnabled = false; } // Check security to open the file. if (isEnabled) { try { jmfSecurity = JMFSecurityManager.getJMFSecurity(); if (jmfSecurity == null) { // allow log writing for applications. } else if (jmfSecurity.getName().startsWith("jmf-security")) { permission = "write file"; permissionid = JMFSecurity.WRITE_FILE; jmfSecurity.requestPermission(m, cl, args, JMFSecurity.WRITE_FILE); m[0].invoke(cl[0], args[0]); permission = "delete file"; permissionid = JMFSecurity.DELETE_FILE; jmfSecurity.requestPermission(m, cl, args, JMFSecurity.DELETE_FILE); m[0].invoke(cl[0], args[0]); permission = "read system property"; permissionid = JMFSecurity.READ_PROPERTY; jmfSecurity.requestPermission(m, cl, args, JMFSecurity.READ_PROPERTY); m[0].invoke(cl[0], args[0]); } else if (jmfSecurity.getName().startsWith("internet")) { PolicyEngine.checkPermission(PermissionID.FILEIO); PolicyEngine.assertPermission(PermissionID.FILEIO); ieSec = true; } } catch (Exception e) { isEnabled = false; } } if (isEnabled) { isEnabled = false; try { String dir; Object ldir = com.sun.media.util.Registry.get("secure.logDir"); if (ldir != null && ldir instanceof String && !("".equals(ldir))) dir = (String)ldir; else dir = (String)System.getProperty("user.dir"); String file = dir + File.separator + fileName; log = new DataOutputStream(new FileOutputStream(file)); if (log != null) { System.err.println("Open log file: " + file); isEnabled = true; writeHeader(); } } catch (Exception e) { System.err.println("Failed to open log file."); } } } // Don't need to run this twise. } // synchronized (fileName) } // Request write permission to the log file. private static synchronized boolean requestPerm() { try { if (!ieSec) { permission = "write file"; permissionid = JMFSecurity.WRITE_FILE; jmfSecurity.requestPermission(m, cl, args, JMFSecurity.WRITE_FILE); m[0].invoke(cl[0], args[0]); } else { PolicyEngine.checkPermission(PermissionID.FILEIO); PolicyEngine.assertPermission(PermissionID.FILEIO); } } catch (Exception e) { return false; } return true; } private static synchronized void writeHeader() { if (jmfSecurity != null && !requestPerm()) return; write("#\n# JMF " + BasicPlayer.VERSION + "\n#\n"); String os = null, osver = null, osarch = null; String java = null, jver = null; try { os = System.getProperty("os.name"); osarch = System.getProperty("os.arch"); osver = System.getProperty("os.version"); java = System.getProperty("java.vendor"); jver = System.getProperty("java.version"); } catch (Throwable e) { // Can't get the info. No big deal. return; } if (os != null) comment("Platform: " + os + ", " + osarch + ", " + osver); if (java != null) comment("Java VM: " + java + ", " + jver); write(""); } public static synchronized void comment(Object str) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; try { log.writeBytes("## " + str + "\n"); } catch (IOException e) {} } } public static synchronized void warning(Object str) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; try { log.writeBytes("!! " + str + "\n"); } catch (IOException e) {} } } public static synchronized void profile(Object str) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; try { log.writeBytes("$$ " + str + "\n"); } catch (IOException e) {} } } static boolean errorWarned = false; public static synchronized void error(Object str) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; if (!errorWarned) { System.err.println("An error has occurred. Check jmf.log for details."); errorWarned = true; } try { log.writeBytes("XX " + str + "\n"); } catch (IOException e) {} } else { System.err.println(str); } } public static synchronized void dumpStack(Throwable e) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; e.printStackTrace(new PrintWriter(log, true)); write(""); } else e.printStackTrace(); } public static synchronized void write(Object str) { if (isEnabled) { if (jmfSecurity != null && !requestPerm()) return; try { for (int i = indent; i > 0; i--) log.writeBytes(" "); log.writeBytes(str + "\n"); } catch (IOException e) {} } } public static synchronized void setIndent(int i) { indent = i; } public static synchronized void incrIndent() { indent++; } public static synchronized void decrIndent() { indent--; } public static int getIndent() { return indent; } }