/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.harmony.sound.utils; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Properties; public class ProviderService { // Properties from sound.propertie file private static Properties devices; static { devices = new Properties(); FileInputStream fstream = AccessController .doPrivileged(new PrivilegedAction<FileInputStream>() { public FileInputStream run() { // obtain the path to the file sound.properties String soundPropertiesPath = System .getProperty("java.home") //$NON-NLS-1$ + File.separator + "lib" + File.separator //$NON-NLS-1$ + "sound.properties"; //$NON-NLS-1$ try { return new FileInputStream(soundPropertiesPath); } catch (FileNotFoundException e) { return null; } } }); if (fstream != null) { // reading file sound.properties try { devices.load(fstream); } catch (IOException e) {} } } /** * this method return information about default device * * @param deviceName * @return */ public static List<String> getDefaultDeviceDescription(String deviceName) { // variable that contain information about default device List<String> defaultDevice = new ArrayList<String>(); String str; int index; /* * obtain the default device that describes by deviceName */ str = devices.getProperty(deviceName); /* * if default device doesn't define, than return empty defaultDevice */ if (str == null) { return defaultDevice; } /* * the separator between provider and name is '#'; find separator of * provider and name of device in the notation of default device */ index = str.indexOf("#"); //$NON-NLS-1$ /* * if separator doesn't find, so in the definition of default device * contain only name of provider, and so we add it */ if (index == -1) { defaultDevice.add(str); defaultDevice.add(null); /* * if separator is the first symbol, so definition contain only name * of device */ } else if (index == 0) { defaultDevice.add(null); defaultDevice.add(str.substring(index + 1)); /* * if separator is not the first, so we find provider and name of * device */ } else { defaultDevice.add(str.substring(0, index)); defaultDevice.add(str.substring(index + 1)); } return defaultDevice; } /** * this method return the list of providers * * @param providerName * @return */ public static List<?> getProviders(String providerName) { final String name = providerName; return AccessController .doPrivileged(new PrivilegedAction<List<Object>>() { public List<Object> run() { List<Object> providers = new ArrayList<Object>(); String className = null; byte[] bytes; ClassLoader cl = ClassLoader.getSystemClassLoader(); Enumeration<URL> urls = null; try { urls = cl.getResources(name); } catch (IOException e) { return providers; } for (; urls.hasMoreElements();) { try { InputStream in = urls.nextElement() .openStream(); bytes = new byte[in.available()]; in.read(bytes); in.close(); } catch (IOException e) { continue; } String[] astr = new String(bytes).split("\r\n"); //$NON-NLS-1$ for (String str : astr) { className = str.trim(); if (!className.startsWith("#")) { // skip // comments // //$NON-NLS-1$ try { providers.add(Class.forName( className.trim(), true, cl) .newInstance()); } catch (IllegalAccessException e) {} catch (InstantiationException e) {} catch (ClassNotFoundException e) {} } } } return providers; } }); } public static Properties getSoundProperties() { return devices; } }