/*
* @(#)SourceDescription.java 1.8 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media.rtp.rtcp;
import java.net.*;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import com.sun.media.*;
import com.ms.security.PermissionID;
import com.ms.security.PolicyEngine;
import com.sun.media.util.*;
/**
* Class to encapsulate a source description item used in RTCP SDES reports. <P>
*/
public class SourceDescription implements java.io.Serializable {
// possible values of the type variable
public static final int SOURCE_DESC_CNAME = 1;
public static final int SOURCE_DESC_NAME = 2;
public static final int SOURCE_DESC_EMAIL = 3;
public static final int SOURCE_DESC_PHONE = 4;
public static final int SOURCE_DESC_LOC = 5;
public static final int SOURCE_DESC_TOOL = 6;
public static final int SOURCE_DESC_NOTE = 7;
public static final int SOURCE_DESC_PRIV = 8;
private static JMFSecurity jmfSecurity = null;
private static boolean securityPrivelege=false;
private static Method m[] = new Method[1];
private static Class cl[] = new Class[1];
private static Object args[][] = new Object[1][0];
static {
try {
jmfSecurity = JMFSecurityManager.getJMFSecurity();
securityPrivelege = true;
} catch (SecurityException e) {
}
}
/**
* Constructor. <P>
* the type of source description this is
* description the actual source description string
* frequency the frequency at which RTCP sends this source description
* encrypted set to true if this SDES item is to be encrypted.
* Please see individual variable description for current implementation status
*/
public
SourceDescription(int type,
String description,
int frequency,
boolean encrypted) {
m_type = type;
m_description = description;
m_frequency = frequency;
m_encrypted = encrypted;
}
// Instance Variables
private int m_type; // what kind of user data is this
private String m_description = null; // the actual data
private int m_frequency; // how often RTCP sends it
private boolean m_encrypted = false; // encrypt it?
// Methods
/**
* Get the type of source description this is. <P>
*/
public int
getType(){
return m_type;
}
/**
* Get the actual source description string. <P>
*/
public String
getDescription(){
return m_description;
}
public void
setDescription(String desc){
m_description = desc;
}
/**
* Get the frequency at which RTCP sends this source description. <P>
* Currently, this frequency parameter will be ignored by the
* implementation and SDES items are sent according to the following
* algorithm... The CNAME is sent every RTCP reporting interval. All
* other SDES items are sent once every 3 RTCP report intervals.
*/
public int
getFrequency(){
return m_frequency;
}
/**
* Should this source description be encrypted?.
* Currently, we do not support any encryption schemes <P>
*/
public boolean
getEncrypted(){
return m_encrypted;
}
/**
* This function can be used to generate a CNAME using the scheme
* described in RFC1889. This function is provided in order to facilitate CNAME
* generation prior to actual stream creation. <P>
*
* @return The generated CNAME. <P>
*/
public static String generateCNAME() {
String hostname = null;
InetAddress host;
String cname = "";
if ( jmfSecurity != null) {
String permission = null;
try {
if (jmfSecurity.getName().startsWith("jmf-security")) {
permission = "connect";
jmfSecurity.requestPermission(m, cl, args, JMFSecurity.CONNECT);
m[0].invoke(cl[0], args[0]);
} else if (jmfSecurity.getName().startsWith("internet")) {
PolicyEngine.checkPermission(PermissionID.NETIO);
PolicyEngine.assertPermission(PermissionID.NETIO);
}
} catch (Throwable e) {
if (JMFSecurityManager.DEBUG) {
System.err.println("Unable to get " + permission +
" privilege " + e);
}
jmfSecurity.permissionFailureNotification(JMFSecurity.CONNECT);
// securityPrivelege = false;
}
}
try {
if ( (jmfSecurity != null) && (jmfSecurity.getName().startsWith("jdk12"))) {
Constructor cons = jdk12InetAddressAction.cons;
host = (InetAddress) jdk12.doPrivM.invoke(
jdk12.ac,
new Object[] {
cons.newInstance(
new Object[] {
null, // static method
"getLocalHost",
null, // No parameters
})});
hostname = (String) jdk12.doPrivM.invoke(
jdk12.ac,
new Object[] {
cons.newInstance(
new Object[] {
host,
"getHostName",
null, // No parameters
})});
} else {
host = InetAddress.getLocalHost();
hostname = host.getHostName();
}
} catch (Throwable e) {
System.err.println("InitSession : UnknownHostExcpetion " +
e.getMessage());
}
cname = getProperty("user.name");
if (cname == null) {
return hostname;
} else {
return cname + "@" + hostname;
}
}
private static String getProperty(String prop) {
String value = null;
if ( jmfSecurity != null) {
try {
if (jmfSecurity.getName().startsWith("jmf-security")) {
jmfSecurity.requestPermission(m, cl, args, JMFSecurity.READ_PROPERTY);
m[0].invoke(cl[0], args[0]);
} else if (jmfSecurity.getName().startsWith("internet")) {
PolicyEngine.checkPermission(PermissionID.PROPERTY);
PolicyEngine.assertPermission(PermissionID.PROPERTY);
}
} catch (Throwable e) {
if (JMFSecurityManager.DEBUG) {
System.err.println("Unable to get read property " +
" privilege " + e);
}
jmfSecurity.permissionFailureNotification(JMFSecurity.READ_PROPERTY);
// securityPrivelege = false;
}
}
try {
if ( (jmfSecurity != null) && (jmfSecurity.getName().startsWith("jdk12"))) {
Constructor cons = jdk12PropertyAction.cons;
value = (String) jdk12.doPrivM.invoke(
jdk12.ac,
new Object[] {
cons.newInstance(
new Object[] {
prop
})});
} else {
value = System.getProperty(prop);
}
} catch (Throwable e) {
}
return value;
}
}
|