blob: b1bbe2edb819bf8b72250a0a1828f3bc352c413b [file] [log] [blame]
/*
* 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;
}
}