--- /dev/null
+package org.simantics.msvc.runtime;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+
+import org.eclipse.core.runtime.Path;
+
+/**
+ * @author Tuukka Lehtonen
+ */
+public final class Runtimes {
+
+ public static final String VC_2010 = "vc2010";
+
+ static boolean vc100Initialized = false;
+
+ public static void initialize(String vc) {
+ OSType os = OSType.calculate();
+ if (os == OSType.WINDOWS) {
+ if (VC_2010.equals(vc) && !vc100Initialized) {
+ initializeVC100();
+ }
+ }
+ }
+
+ static synchronized void initializeVC100() {
+ try {
+ // Works in OSGi environment.
+ System.loadLibrary("msvcr100");
+ System.loadLibrary("msvcp100");
+ vc100Initialized = true;
+ } catch (UnsatisfiedLinkError e) {
+ // Try to load from a workspace in POJO environment.
+ try {
+ String archStr = ARCHType.calculate().toString().toLowerCase();
+ URL url = Runtimes.class.getResource(".");
+ File dir = new File(URLDecoder.decode(url.getPath(), "UTF-8") + "../../../../../../org.simantics.msvc.runtime." + archStr);
+ dir = new Path(dir.getAbsolutePath()).toFile();
+ String vcr = new File(dir, "msvcr100.dll").getAbsolutePath();
+ String vcp = new File(dir, "msvcp100.dll").getAbsolutePath();
+ System.load(vcr);
+ System.load(vcp);
+ vc100Initialized = true;
+ } catch (UnsupportedEncodingException e1) {
+ throw new Error("UTF-8 not supported, impossible");
+ }
+ }
+ }
+
+ public enum ARCHType {
+ PPC, PPC_64, SPARC, X86, X86_64, UNKNOWN;
+
+ public static ARCHType calculate() {
+ String osArch = System.getProperty("os.arch");
+ assert osArch != null;
+ osArch = osArch.toLowerCase();
+ if (osArch.equals("i386") || osArch.equals("i586") || osArch.equals("i686") || osArch.equals("x86"))
+ return X86;
+ if (osArch.startsWith("amd64") || osArch.startsWith("x86_64"))
+ return X86_64;
+ if (osArch.equals("ppc"))
+ return PPC;
+ if (osArch.startsWith("ppc"))
+ return PPC_64;
+ if (osArch.startsWith("sparc"))
+ return SPARC;
+ return UNKNOWN;
+ }
+ }
+
+ public enum OSType {
+ APPLE, LINUX, SUN, WINDOWS, UNKNOWN;
+
+ public static OSType calculate() {
+ String osName = System.getProperty("os.name");
+ assert osName != null;
+ osName = osName.toLowerCase();
+ if (osName.startsWith("mac os x"))
+ return APPLE;
+ if (osName.startsWith("windows"))
+ return WINDOWS;
+ if (osName.startsWith("linux"))
+ return LINUX;
+ if (osName.startsWith("sun"))
+ return SUN;
+ return UNKNOWN;
+ }
+ }
+
+}