mirror of https://github.com/sipwise/jitsi.git
parent
999e658691
commit
8cfed9f5c6
@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.launcher;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
import java.util.logging.*;
|
||||
|
||||
import net.java.sip.communicator.util.FileHandler;
|
||||
import net.java.sip.communicator.util.*;
|
||||
|
||||
public class SIPCommunicatorJWS
|
||||
{
|
||||
public static void main(String[] args) throws Exception
|
||||
{
|
||||
// allow access to everything
|
||||
System.setSecurityManager(null);
|
||||
|
||||
// prepare the logger
|
||||
// needed by the FileHandler-Logger
|
||||
SIPCommunicator.setScHomeDir(System.getProperty("os.name"));
|
||||
LogManager.getLogManager()
|
||||
.readConfiguration(
|
||||
SIPCommunicatorJWS.class
|
||||
.getResourceAsStream("/logging.properties"));
|
||||
|
||||
for (Handler h : LogManager.getLogManager().getLogger("").getHandlers())
|
||||
LogManager.getLogManager().getLogger("").removeHandler(h);
|
||||
LogManager.getLogManager().getLogger("").addHandler(new FileHandler());
|
||||
LogManager.getLogManager().getLogger("")
|
||||
.addHandler(new ConsoleHandler());
|
||||
for (Handler h : LogManager.getLogManager().getLogger("").getHandlers())
|
||||
h.setFormatter(new ScLogFormatter());
|
||||
|
||||
// be evil :-)
|
||||
// find the path of the nativelibs under webstart (findLibrary is
|
||||
// protected and therefore at least documented api)
|
||||
Method findLibrary =
|
||||
SIPCommunicatorJWS.class.getClassLoader().getClass()
|
||||
.getDeclaredMethod("findLibrary", String.class);
|
||||
findLibrary.setAccessible(true);
|
||||
File path =
|
||||
new File((String) findLibrary.invoke(
|
||||
SIPCommunicatorJWS.class.getClassLoader(), "hid"))
|
||||
.getParentFile();
|
||||
System.setProperty(
|
||||
"java.library.path",
|
||||
System.getProperty("java.library.path") + File.pathSeparator
|
||||
+ path.getAbsolutePath());
|
||||
|
||||
// reset sys_paths to re-read usr_paths (runtime-dependent and therefore
|
||||
// very very ugly :()
|
||||
Field sys_paths = ClassLoader.class.getDeclaredField("sys_paths");
|
||||
sys_paths.setAccessible(true);
|
||||
sys_paths.set(null, null);
|
||||
|
||||
// prepare the felix-config with the absolute paths
|
||||
Properties pIn = new Properties();
|
||||
Properties pOut = new Properties();
|
||||
pIn.load(SIPCommunicatorJWS.class.getResourceAsStream(System
|
||||
.getProperty("felix.config.properties")));
|
||||
|
||||
String baseServerUrl =
|
||||
System.getProperty("net.java.sip.communicator.SC_JWS_BASEDIR");
|
||||
ClassLoader cl = SIPCommunicatorJWS.class.getClassLoader();
|
||||
Method getJarFile =
|
||||
cl.getClass().getDeclaredMethod("getJarFile", URL.class);
|
||||
getJarFile.setAccessible(true);
|
||||
for (Map.Entry<Object, Object> e : pIn.entrySet())
|
||||
{
|
||||
if (((String) e.getKey()).startsWith("felix.auto.start."))
|
||||
{
|
||||
String[] refs = ((String) e.getValue()).split("\\s");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String ref : refs)
|
||||
{
|
||||
JarFile localFile =
|
||||
(JarFile) getJarFile.invoke(cl, new URL(baseServerUrl
|
||||
+ ref.replace("@URL@", "")));
|
||||
if (localFile != null)
|
||||
{
|
||||
String localFileName =
|
||||
new File(localFile.getName()).toURI().toString();
|
||||
sb.append("reference:");
|
||||
sb.append(localFileName);
|
||||
sb.append(" ");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("ref <" + ref
|
||||
+ "> not found in cache");
|
||||
}
|
||||
}
|
||||
pOut.put(e.getKey(), sb.toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
pOut.put(e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
File jwsFelixConfig = File.createTempFile("jws", ".properties");
|
||||
jwsFelixConfig.deleteOnExit();
|
||||
pOut.store(new FileOutputStream(jwsFelixConfig),
|
||||
"--- autogenerated, do not edit! ---");
|
||||
System.setProperty("felix.config.properties", jwsFelixConfig.toURI()
|
||||
.toString());
|
||||
|
||||
// Workaround broken desktop shortcut in ubuntu linux:
|
||||
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6957030
|
||||
try
|
||||
{
|
||||
if (System.getProperty("os.name").equals("Linux"))
|
||||
{
|
||||
File desktop =
|
||||
new File(System.getProperty("user.home") + "/Desktop");
|
||||
File[] files = desktop.listFiles();
|
||||
for (File file : files)
|
||||
{
|
||||
if (file.getName().contains("jws_app_shortcut_"))
|
||||
{
|
||||
file.setExecutable(true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
|
||||
// launch the original app
|
||||
SIPCommunicator.main(args);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
# value without trailing '/' (slash)
|
||||
java.jdk.dir = c:\\java\\jdk6
|
||||
|
||||
keystore.alias =
|
||||
keystore.file =
|
||||
keystore.password =
|
||||
|
||||
# value without trailing '/' (slash)
|
||||
webstart.codebase.url = http://localhost/client
|
||||
@ -0,0 +1,292 @@
|
||||
<!DOCTYPE project>
|
||||
<!-- Disables DTD warning -->
|
||||
|
||||
<project name="jitsi-webstart">
|
||||
|
||||
<!-- import user-specific/alterable properties -->
|
||||
<property file="${basedir}/WebStartBuild.properties" />
|
||||
|
||||
<property name="webstart.dir" value="${basedir}" />
|
||||
<property name="sc.basedir" value="${webstart.dir}/.." />
|
||||
<property name="release.dir" value="${sc.basedir}/release/web-start" />
|
||||
<property name="tmp.dir" value="${release.dir}/temp" />
|
||||
<property name="ant-ext-src.dir" value="${webstart.dir}/ant-ext" />
|
||||
<property name="ant-ext.dir" value="${sc.basedir}/release/ant-ext" />
|
||||
|
||||
<property name="pack200.path" value="${java.jdk.dir}/bin/pack200" />
|
||||
<property name="unpack200.path" value="${java.jdk.dir}/bin/unpack200" />
|
||||
<property name="jarsigner.path" value="${java.jdk.dir}/bin/jarsigner" />
|
||||
|
||||
<target name="compile-ant-ext">
|
||||
<javac srcdir="${ant-ext-src.dir}" destdir="${ant-ext.dir}" includeantruntime="true" />
|
||||
</target>
|
||||
|
||||
<!-- Custom ant target and typedefs -->
|
||||
<target name="load-ant-ext" depends="compile-ant-ext">
|
||||
<typedef name="felixConfigSelector" classname="FelixConfigSelector" classpath="${ant-ext.dir}" />
|
||||
<taskdef name="PutJarsToJnlp" classname="PutJarsToJnlp" classpath="${ant-ext.dir}" />
|
||||
<taskdef name="GenerateFelixConfigs" classname="GenerateFelixConfigs" classpath="${ant-ext.dir}" />
|
||||
</target>
|
||||
|
||||
<!-- Exclusion of unsupported os's -->
|
||||
<patternset id="unsupported.os.exclude">
|
||||
<exclude name="**/freebsd*/**" />
|
||||
<exclude name="**/solaris*/**" />
|
||||
</patternset>
|
||||
|
||||
<!-- Excluded Bundles or Libs -->
|
||||
<patternset id="excluded.bundles">
|
||||
<exclude name="sc-bundles/addrbook.jar" if="exclude.addressbook" />
|
||||
</patternset>
|
||||
|
||||
<!-- Testing build -->
|
||||
<target name="-all-test">
|
||||
<property name="jnlp.packEnabled" value="false" />
|
||||
<property name="release.name" value="" />
|
||||
</target>
|
||||
<target name="all-test" depends="-all-test, load-ant-ext, make, prepare, copy-libs, copy-config-files, sign-libs" description="Testing build without repacking and compression (faster)." />
|
||||
|
||||
<!-- Production build -->
|
||||
<target name="-all-prod">
|
||||
<property name="jnlp.packEnabled" value="true" />
|
||||
<property name="release.name" value="" />
|
||||
</target>
|
||||
<target name="all-prod" depends="-all-prod, clean, load-ant-ext, make, prepare, copy-libs, copy-config-files, repack-libs, sign-libs, compress-libs, verify-compressed-jars" description="Production build includes all steps (slow)." />
|
||||
|
||||
<target name="all-prod-without-addrbook">
|
||||
<property name="exclude.addressbook" value="true" />
|
||||
<property name="release.name" value="-without-addrbook" />
|
||||
<antcall target="-all-prod" />
|
||||
<antcall target="clean" />
|
||||
<antcall target="make" />
|
||||
<antcall target="prepare" />
|
||||
<antcall target="copy-libs" />
|
||||
<antcall target="copy-config-files" />
|
||||
|
||||
<!-- rename jnlp and configs.jar -->
|
||||
<move file="${release.dir}/client.jnlp" tofile="${release.dir}/client${release.name}.jnlp" />
|
||||
<move file="${release.dir}/jnlp.jar" tofile="${release.dir}/jnlp${release.name}.jar" />
|
||||
<move file="${release.dir}/lib/configs.jar" tofile="${release.dir}/lib/configs${release.name}.jar" />
|
||||
|
||||
<antcall target="repack-libs" />
|
||||
<antcall target="sign-libs" />
|
||||
<antcall target="compress-libs" />
|
||||
<antcall target="verify-compressed-jars" />
|
||||
</target>
|
||||
|
||||
<!-- clean -->
|
||||
<target name="clean" description="Cleans release and temporary directories.">
|
||||
<delete dir="${release.dir}" />
|
||||
<delete dir="${tmp.dir}" />
|
||||
</target>
|
||||
|
||||
<!-- prepare -->
|
||||
<target name="prepare" description="Create folder sturcture.">
|
||||
<mkdir dir="${release.dir}" />
|
||||
<mkdir dir="${release.dir}/lib" />
|
||||
<mkdir dir="${release.dir}/lib/bundle" />
|
||||
<mkdir dir="${release.dir}/native" />
|
||||
<mkdir dir="${release.dir}/sc-bundles" />
|
||||
<mkdir dir="${ant-ext.dir}" />
|
||||
<mkdir dir="${tmp.dir}" />
|
||||
<mkdir dir="${tmp.dir}/JNLP-INF" />
|
||||
</target>
|
||||
|
||||
<!-- make -->
|
||||
<target name="make" description="Compile and package the main project.">
|
||||
<ant dir="${sc.basedir}" antfile="build.xml" target="make-and-deploy" />
|
||||
</target>
|
||||
|
||||
<!-- copy libs -->
|
||||
<target name="copy-libs" description="Copy required libraries in release folder.">
|
||||
<echo message="Copying libs in ${release.dir}" />
|
||||
<copy todir="${release.dir}">
|
||||
<fileset dir="${sc.basedir}">
|
||||
<!-- Include ... -->
|
||||
<!-- ... jars for felix startup -->
|
||||
<include name="lib/*.jar" />
|
||||
<!-- ... os specific jars for felix startup -->
|
||||
<include name="lib/os-specific/**/*.jar" />
|
||||
<!-- ... os specific Sip-Comm bundles -->
|
||||
<include name="sc-bundles/os-specific/**/*.jar" />
|
||||
<!-- ... Sip-Comm launcher -->
|
||||
<include name="sc-bundles/sc-launcher.jar" />
|
||||
|
||||
<!-- Exclude ... -->
|
||||
<!-- ... installer stuff -->
|
||||
<exclude name="**/installer-exclude/*" />
|
||||
<!-- ... unsupported os's -->
|
||||
<patternset refid="unsupported.os.exclude" />
|
||||
</fileset>
|
||||
|
||||
<fileset dir="${sc.basedir}">
|
||||
<!-- Copy all bundles referenced in felix config file. -->
|
||||
<include name="lib/**" />
|
||||
<include name="sc-bundles/**" />
|
||||
<felixConfigSelector felixConfig="${sc.basedir}/lib/felix.client.run.properties" />
|
||||
<patternset refid="excluded.bundles" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- Package and copy native libraries -->
|
||||
<subant genericantfile="${ant.file}" target="-jar-natives" inheritall="true">
|
||||
<dirset dir="${sc.basedir}/lib/native/" includes="*">
|
||||
<patternset refid="unsupported.os.exclude" />
|
||||
</dirset>
|
||||
</subant>
|
||||
</target>
|
||||
|
||||
<!-- Package and copy native libraries -->
|
||||
<target name="-jar-natives">
|
||||
<!-- Get the last part of the directory (windows, linux, etc.) -->
|
||||
<basename file="${basedir}" property="jarname" />
|
||||
|
||||
<jar destfile="${release.dir}/native/${jarname}.jar">
|
||||
<fileset dir="${basedir}" />
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
<!-- sign libs -->
|
||||
<target name="sign-libs" description="Sign all jars within the release folder.">
|
||||
<echo message="Signing libs in ${release.dir}" />
|
||||
<signjar alias="${keystore.alias}" keystore="${keystore.file}" storepass="${keystore.password}" lazy="true">
|
||||
<path>
|
||||
<fileset dir="${release.dir}" includes="**/*.jar" />
|
||||
</path>
|
||||
</signjar>
|
||||
</target>
|
||||
|
||||
<!-- repack libs -->
|
||||
<target name="repack-libs" description="Repack all jars within release folder.">
|
||||
<echo message="Repacking libs in ${release.dir}" />
|
||||
<apply executable="${pack200.path}" parallel="false">
|
||||
<arg value="--repack" />
|
||||
<fileset dir="${release.dir}" includes="**/*.jar" />
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<!-- compress libs -->
|
||||
<target name="compress-libs" description="Comperss all jars within release folder.">
|
||||
<echo message="Compressing libs in ${release.dir}" />
|
||||
<apply executable="${pack200.path}" parallel="false" dest="${release.dir}">
|
||||
<!--<arg value="- -modification-time=latest"/>-->
|
||||
<!-- Arg 'segment-limit=-1' omitted because it broke signatures of some jars -->
|
||||
<targetfile />
|
||||
<srcfile />
|
||||
<fileset dir="${release.dir}" includes="**/*.jar">
|
||||
<!-- Exclude Libs which can not be compressed -->
|
||||
<exclude name="**/os-specific/macosx/neomedia.jar" />
|
||||
<exclude name="**/os-specific/linux/neomedia.jar" />
|
||||
</fileset>
|
||||
<mapper type="glob" from="*" to="*.pack.gz" />
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<!-- verify compressed jars -->
|
||||
<target name="verify-compressed-jars">
|
||||
<echo message="Verifying compressed libs in ${release.dir}" />
|
||||
|
||||
<!-- create temporary folder -->
|
||||
<property name="verify.dir" value="${tmp.dir}/verification" />
|
||||
<mkdir dir="${tmp.dir}/verification" />
|
||||
|
||||
<!-- unpack in temporary folder -->
|
||||
<apply executable="${unpack200.path}" parallel="false" dest="${verify.dir}">
|
||||
<!--<arg value="-v" />-->
|
||||
<srcfile />
|
||||
<targetfile />
|
||||
<fileset dir="${release.dir}" includes="**/*.jar.pack.gz" />
|
||||
<chainedmapper>
|
||||
<packagemapper from="*" to="*" />
|
||||
<mapper type="glob" from="*.jar.pack.gz" to="*.jar" />
|
||||
<!-- rename -->
|
||||
</chainedmapper>
|
||||
</apply>
|
||||
|
||||
<!-- verify unpacked jars -->
|
||||
<apply executable="${jarsigner.path}" failonerror="false">
|
||||
<arg value="-verify" />
|
||||
<!--<arg value="-verbose" />-->
|
||||
<srcfile />
|
||||
<fileset dir="${verify.dir}" includes="**/*.jar" />
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<!-- copy config files -->
|
||||
<target name="copy-config-files" description="Copy and package webstart configuration files.">
|
||||
<echo message="Create and copy config files in ${release.dir}" />
|
||||
<PutJarsToJnlp bundledir="${release.dir}/sc-bundles" osbundles="${release.dir}/sc-bundles/os-specific" />
|
||||
<subant genericantfile="${ant.file}" target="-build-felix-files-os" inheritall="true">
|
||||
<dirset dir="${release.dir}/sc-bundles/os-specific" includes="*" />
|
||||
</subant>
|
||||
|
||||
<!-- Copy template files -->
|
||||
<copy todir="${tmp.dir}" overwrite="yes">
|
||||
<fileset dir=".">
|
||||
<include name="*_template" />
|
||||
</fileset>
|
||||
|
||||
<!-- remove '_template' suffix -->
|
||||
<mapper type="glob" from="*_template" to="*" />
|
||||
|
||||
<!-- replace '@_@' tokens with value -->
|
||||
<filterset>
|
||||
<filter token="URL" value="${webstart.codebase.url}" />
|
||||
<filter token="COMMON" value="${jnlp.jars.common}" />
|
||||
<filter token="WINDOWS" value="${jnlp.jars.windows}" />
|
||||
<filter token="LINUX" value="${jnlp.jars.linux}" />
|
||||
<filter token="MACOSX" value="${jnlp.jars.macosx}" />
|
||||
<filter token="PACKENABLED" value="${jnlp.packEnabled}" />
|
||||
<filter token="RELEASE" value="${release.name}" />
|
||||
</filterset>
|
||||
</copy>
|
||||
|
||||
<!-- Delete comments marked as INTERNAL_COMMENT from jnlp file. Example on next line: -->
|
||||
<!-- INTERNAL_COMMENT some text ... -->
|
||||
<replaceregexp match="<!-- INTERNAL_COMMENT .*?-->" replace="" flags="gs">
|
||||
<fileset dir="${tmp.dir}">
|
||||
<include name="*.jnlp" />
|
||||
</fileset>
|
||||
</replaceregexp>
|
||||
|
||||
<copy todir="${release.dir}">
|
||||
<fileset dir="${tmp.dir}">
|
||||
<include name="client.jnlp" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy tofile="${tmp.dir}/JNLP-INF/APPLICATION.JNLP" file="${tmp.dir}/client.jnlp" />
|
||||
<jar destfile="${release.dir}/jnlp.jar">
|
||||
<fileset dir="${tmp.dir}">
|
||||
<include name="JNLP-INF/**" />
|
||||
</fileset>
|
||||
</jar>
|
||||
|
||||
<jar destfile="${release.dir}/lib/configs.jar">
|
||||
<fileset dir="${sc.basedir}/resources/install">
|
||||
<include name="logging.properties" />
|
||||
</fileset>
|
||||
<fileset dir="${tmp.dir}">
|
||||
<include name="*.properties" />
|
||||
</fileset>
|
||||
</jar>
|
||||
|
||||
<!-- Copy index.html and images -->
|
||||
<copy file="index.html" todir="${release.dir}"/>
|
||||
<copy file="${sc.basedir}/resources/images/logo/sc_logo_64x64.png" todir="${release.dir}" />
|
||||
</target>
|
||||
|
||||
<!-- Assemble os specific felix configuration files -->
|
||||
<target name="-build-felix-files-os">
|
||||
<!-- Get the last part of the directory (windows, linux, etc.) -->
|
||||
<basename file="${basedir}" property="osname" />
|
||||
|
||||
<GenerateFelixConfigs file="${sc.basedir}/lib/felix.client.run.properties" os="${osname}" bundledir="${release.dir}/sc-bundles" libdir="${release.dir}/lib/bundle" output="${tmp.dir}/felix.client.run.${osname}.properties" />
|
||||
</target>
|
||||
</project>
|
||||
|
||||
<!--
|
||||
Useful sources:
|
||||
- Pack200 and Compression: http://download.oracle.com/javase/6/docs/technotes/guides/deployment/deployment-guide/pack200.html
|
||||
- Pack200 in Ant: http://stackoverflow.com/questions/3312401/how-to-make-an-ant-task-to-sign-and-pack200-all-my-jar-files
|
||||
-->
|
||||
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license. See terms of license at gnu.org.
|
||||
*/
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.tools.ant.*;
|
||||
import org.apache.tools.ant.types.selectors.*;
|
||||
|
||||
/**
|
||||
* Selector which lets those files through that are referenced in the felix
|
||||
* configuration file.
|
||||
*/
|
||||
public class FelixConfigSelector
|
||||
implements FileSelector
|
||||
{
|
||||
private Set<File> referencedBundleCache;
|
||||
|
||||
private File felixConfig;
|
||||
|
||||
public void setFelixConfig(File felixConifg)
|
||||
{
|
||||
if (!felixConifg.isFile())
|
||||
throw new BuildException("No felix configuration file provided.");
|
||||
|
||||
this.felixConfig = felixConifg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected(File basedir, String filename, File file)
|
||||
{
|
||||
cacheConfigEntries(basedir);
|
||||
return referencedBundleCache.contains(file);
|
||||
}
|
||||
|
||||
private void cacheConfigEntries(File basedir)
|
||||
{
|
||||
if (referencedBundleCache != null)
|
||||
return;
|
||||
|
||||
// cache files referenced in felix config
|
||||
referencedBundleCache = new HashSet<File>();
|
||||
|
||||
// load felix config
|
||||
Properties pIn = new Properties();
|
||||
try
|
||||
{
|
||||
pIn.load(new FileInputStream(felixConfig));
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
|
||||
for (Map.Entry<Object, Object> e : pIn.entrySet())
|
||||
{
|
||||
if (((String) e.getKey()).startsWith("felix.auto.start."))
|
||||
{
|
||||
String[] refs = ((String) e.getValue()).split("\\s");
|
||||
for (String jar : refs)
|
||||
{
|
||||
if (jar.startsWith("reference:file:"))
|
||||
{
|
||||
String relPath =
|
||||
jar.substring("reference:file:".length());
|
||||
String absPath =
|
||||
basedir.getPath() + File.separator + relPath;
|
||||
File f = new File(absPath);
|
||||
if (f.isFile())
|
||||
{
|
||||
referencedBundleCache.add(f);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println(
|
||||
"WARNING: Referenced file does not exist: "
|
||||
+ f.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license. See terms of license at gnu.org.
|
||||
*/
|
||||
import org.apache.tools.ant.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class GenerateFelixConfigs
|
||||
extends Task
|
||||
{
|
||||
private File baseConfig;
|
||||
|
||||
private String os;
|
||||
|
||||
private File libdir;
|
||||
|
||||
private File bundledir;
|
||||
|
||||
private File output;
|
||||
|
||||
public void setFile(File f)
|
||||
{
|
||||
baseConfig = f;
|
||||
}
|
||||
|
||||
public void setOs(String os)
|
||||
{
|
||||
this.os = os;
|
||||
}
|
||||
|
||||
public void setBundledir(File bundledir)
|
||||
{
|
||||
this.bundledir = bundledir;
|
||||
}
|
||||
|
||||
public void setLibdir(File libdir)
|
||||
{
|
||||
this.libdir = libdir;
|
||||
}
|
||||
|
||||
public void setOutput(File output)
|
||||
{
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
public void execute() throws BuildException
|
||||
{
|
||||
try
|
||||
{
|
||||
execute0();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
throw new BuildException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void execute0() throws BuildException
|
||||
{
|
||||
Properties pIn = new Properties();
|
||||
Properties pOut = new Properties();
|
||||
try
|
||||
{
|
||||
pIn.load(new FileInputStream(baseConfig));
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
|
||||
for (Map.Entry<Object, Object> e : pIn.entrySet())
|
||||
{
|
||||
if (((String) e.getKey()).startsWith("felix.auto.start."))
|
||||
{
|
||||
String[] refs = ((String) e.getValue()).split("\\s");
|
||||
StringBuilder value = new StringBuilder();
|
||||
for (String jar : refs)
|
||||
{
|
||||
if (jar.startsWith("reference:file:sc-bundles/"))
|
||||
{
|
||||
String name =
|
||||
jar.substring("reference:file:sc-bundles/".length());
|
||||
if (contains(
|
||||
new File(bundledir, "os-specific/" + os).list(),
|
||||
name))
|
||||
{
|
||||
value.append("@URL@/sc-bundles/");
|
||||
value.append("os-specific/");
|
||||
value.append(os);
|
||||
value.append("/");
|
||||
value.append(name);
|
||||
}
|
||||
else if (contains(bundledir.list(), name))
|
||||
{
|
||||
value.append("@URL@/sc-bundles/");
|
||||
value.append(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
log("Bundle <" + name + "> not found in <"
|
||||
+ bundledir.getName()
|
||||
+ ">. Seems like this bundle was ignored.");
|
||||
}
|
||||
}
|
||||
else if (jar.startsWith("reference:file:lib/bundle/"))
|
||||
{
|
||||
String name =
|
||||
jar.substring("reference:file:lib/bundle/".length());
|
||||
if (contains(libdir.list(), name))
|
||||
{
|
||||
value.append("@URL@/lib/bundle/");
|
||||
value.append(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
log("Lib <" + name + "> not found in <" + libdir
|
||||
+ ">. Seems like this lib was ignored.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BuildException(
|
||||
"unsupported reference prefix: " + jar);
|
||||
}
|
||||
value.append(" ");
|
||||
}
|
||||
pOut.put(e.getKey(), value.toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
pOut.put(e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
pOut.store(new FileOutputStream(output),
|
||||
"--- autogenerated by GenerateFelixConfigs, do not edit! ---");
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new BuildException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean contains(String[] files, String file)
|
||||
{
|
||||
return Arrays.asList(files).contains(file);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license. See terms of license at gnu.org.
|
||||
*/
|
||||
import org.apache.tools.ant.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class PutJarsToJnlp
|
||||
extends Task
|
||||
{
|
||||
private File bundledir;
|
||||
|
||||
private File osbundles;
|
||||
|
||||
public void setBundledir(File b)
|
||||
{
|
||||
bundledir = b;
|
||||
}
|
||||
|
||||
public void setOsbundles(File f)
|
||||
{
|
||||
osbundles = f;
|
||||
}
|
||||
|
||||
public void execute() throws BuildException
|
||||
{
|
||||
try
|
||||
{
|
||||
execute0();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
throw new BuildException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void execute0() throws BuildException
|
||||
{
|
||||
StringBuilder common = new StringBuilder();
|
||||
for (File jar : bundledir.listFiles())
|
||||
{
|
||||
if (jar.isFile())
|
||||
{
|
||||
common.append("<jar href=\"sc-bundles/");
|
||||
common.append(jar.getName());
|
||||
common.append("\"/>\n");
|
||||
}
|
||||
}
|
||||
getProject().setProperty("jnlp.jars.common", common.toString());
|
||||
|
||||
for (File dir : osbundles.listFiles())
|
||||
{
|
||||
if (dir.isDirectory())
|
||||
{
|
||||
StringBuilder os = new StringBuilder();
|
||||
for (File jar : dir.listFiles())
|
||||
{
|
||||
if (jar.isFile())
|
||||
{
|
||||
os.append("<jar href=\"sc-bundles/os-specific/");
|
||||
os.append(dir.getName());
|
||||
os.append("/");
|
||||
os.append(jar.getName());
|
||||
os.append("\"/>\n");
|
||||
}
|
||||
}
|
||||
getProject().setProperty("jnlp.jars." + dir.getName(),
|
||||
os.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- JNLP File -->
|
||||
<jnlp spec="1.0+" codebase="@URL@" href="client@RELEASE@.jnlp">
|
||||
<information>
|
||||
<title>Jitsi</title>
|
||||
<vendor>jitsi.org</vendor>
|
||||
<description>Jitsi - Open Source Video Calls and Chat</description>
|
||||
<homepage href="@URL@"/>
|
||||
<icon href="sc_logo_64x64.png"/>
|
||||
<!-- INTERNAL_COMMENT
|
||||
Seems the Splashscreen does not work properly.
|
||||
See: http://blogs.sun.com/thejavatutorials/entry/changing_the_java_web_start
|
||||
-->
|
||||
<shortcut online="true">
|
||||
<desktop/>
|
||||
<menu submenu="Jitsi"/>
|
||||
</shortcut>
|
||||
</information>
|
||||
|
||||
<!-- INTERNAL_COMMENT
|
||||
Request all permissions. Application must be signed. -->
|
||||
<security>
|
||||
<all-permissions/>
|
||||
</security>
|
||||
|
||||
<!-- Windows common -->
|
||||
<resources os="Windows">
|
||||
<!--<jar href="lib/os-specific/windows/jdic_stub.jar" />-->
|
||||
<property name="felix.config.properties" value="/felix.client.run.windows.properties" />
|
||||
<property name="net.java.sip.communicator.SC_HOME_DIR_NAME" value="jitsi-jws"/>
|
||||
|
||||
@WINDOWS@
|
||||
</resources>
|
||||
|
||||
<!-- Windows 32 bit -->
|
||||
<resources os="Windows" arch="x86">
|
||||
<nativelib href="native/windows.jar"/>
|
||||
</resources>
|
||||
|
||||
<!-- Windows 64 bit -->
|
||||
<resources os="Windows" arch="x86_64 amd64">
|
||||
<nativelib href="native/windows-64.jar"/>
|
||||
</resources>
|
||||
|
||||
<!-- Linux common -->
|
||||
<resources os="Linux">
|
||||
<!--<jar href="lib/os-specific/linux/jdic_stub.jar" />-->
|
||||
<property name="felix.config.properties" value="/felix.client.run.linux.properties" />
|
||||
<property name="net.java.sip.communicator.SC_HOME_DIR_NAME" value=".jitsi-jws"/>
|
||||
<!-- INTERNAL_COMMENT
|
||||
Accelerates certificate generation in unix systems. This property instructs NativePRNG
|
||||
class to use /dev/urandom to build up entropy. Normally /dev/random is used, which is safer
|
||||
but much more slower because the entropy is build upon system events.
|
||||
See: http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom
|
||||
!!! The '.' in the path of the url is necessary to avoid Java Bug 6202721 !!!
|
||||
See: http://bugs.sun.com/view_bug.do;jsessionid=ff625daf459fdffffffffcd54f1c775299e0?bug_id=6202721
|
||||
-->
|
||||
<property name="java.security.egd" value="file:/dev/./urandom"/>
|
||||
|
||||
@LINUX@
|
||||
</resources>
|
||||
|
||||
<!-- Linux 32 bit -->
|
||||
<resources os="Linux" arch="i386">
|
||||
<nativelib href="native/linux.jar"/>
|
||||
</resources>
|
||||
|
||||
<!-- Linux 64 bit -->
|
||||
<resources os="Linux" arch="amd64">
|
||||
<nativelib href="native/linux-64.jar"/>
|
||||
</resources>
|
||||
|
||||
<!-- Mac -->
|
||||
<resources os="Mac OS X">
|
||||
<!--<jar href="lib/os-specific/mac/jdic_stub.jar" />-->
|
||||
<property name="felix.config.properties" value="/felix.client.run.macosx.properties" />
|
||||
<property name="net.java.sip.communicator.SC_HOME_DIR_NAME" value=".jitsi-jws"/>
|
||||
<nativelib href="native/mac.jar"/>
|
||||
|
||||
@MACOSX@
|
||||
</resources>
|
||||
|
||||
<resources>
|
||||
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
|
||||
<property name="net.java.sip.communicator.SC_JWS_BASEDIR" value="@URL@"/>
|
||||
<!-- INTERNAL_COMMENT
|
||||
Use compressed Jars if available -->
|
||||
<property name="jnlp.packEnabled" value="@PACKENABLED@"/>
|
||||
|
||||
<jar href="jnlp@RELEASE@.jar" main="true" />
|
||||
<jar href="lib/configs@RELEASE@.jar" />
|
||||
<!--<jar href="lib/jdic-all.jar" />-->
|
||||
<jar href="lib/felix.jar" />
|
||||
<jar href="lib/bundle/org.apache.felix.bundlerepository-1.6.4.jar" />
|
||||
<jar href="lib/bundle/log4j.jar" />
|
||||
<jar href="lib/bundle/commons-logging.jar" />
|
||||
@COMMON@
|
||||
</resources>
|
||||
|
||||
<application-desc main-class="net.java.sip.communicator.launcher.SIPCommunicatorJWS"/>
|
||||
</jnlp>
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
<html>
|
||||
<body>
|
||||
<a href="client.jnlp">Launch Jitsi</a> </br>
|
||||
|
||||
<p>
|
||||
Tested Operating Systems:
|
||||
<ul>
|
||||
<li>Windows Vista, 7, 8 (32 & 64 bit)</li>
|
||||
<li>Windows XP 32 bit</li>
|
||||
<li>Mac OS X</li>
|
||||
<li>Ubuntu Linux 32 & 64 bit</li>
|
||||
</ul>
|
||||
Only Sun's/Oracle's JVM is supported and tested. Your Java Web Start cache must be enabled.
|
||||
</p>
|
||||
<p>
|
||||
In case Jitsi starts with errors please delete the 'jitsi-jws'
|
||||
folder in your home directory and try again. If this does not solve the problem contact us.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in new issue