123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.IO;
- using System.Threading;
- using OpenSim.Framework;
- using OpenSim.Framework.Interfaces;
- using OpenSim.Framework.Utilities;
- namespace OpenSim.Scripting.EmbeddedJVM
- {
- public class OpenSimJVM : IScriptEngine
- {
- private List<Thread> _threads = new List<Thread>();
- private BlockingQueue<CompileInfo> CompileScripts = new BlockingQueue<CompileInfo>();
- private MainMemory _mainMemory;
- private System.Threading.Thread compileThread;
- public OpenSimJVM()
- {
- }
- public bool Init(IScriptAPI api)
- {
- _mainMemory = new MainMemory();
- Thread.GlobalMemory = this._mainMemory;
- Thread.OpenSimScriptAPI = api;
- compileThread = new System.Threading.Thread(new ThreadStart(CompileScript));
- compileThread.IsBackground = true;
- compileThread.Start();
- return true;
- }
- public string GetName()
- {
- return "OpenSimJVM";
- }
- public void LoadScript(string script, string scriptName, uint entityID)
- {
- CompileInfo comp = new CompileInfo();
- comp.entityId = entityID;
- comp.script = script;
- comp.scriptName = scriptName;
- this.CompileScripts.Enqueue(comp);
- }
- public void CompileScript()
- {
- while (true)
- {
- CompileInfo comp = this.CompileScripts.Dequeue();
- string script = comp.script;
- string scriptName = comp.scriptName;
- uint entityID = comp.entityId;
- try
- {
- //need to compile the script into a java class file
- //first save it to a java source file
- TextWriter tw = new StreamWriter(scriptName + ".java");
- tw.WriteLine(script);
- tw.Close();
- //now compile
- System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files\Java\jdk1.6.0_01\bin\javac.exe *.java");
- psi.RedirectStandardOutput = true;
- psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
- psi.UseShellExecute = false;
- System.Diagnostics.Process javacomp;
- javacomp = System.Diagnostics.Process.Start(psi);
- javacomp.WaitForExit();
- //now load in class file
- ClassRecord class1 = new ClassRecord();
- class1.LoadClassFromFile(scriptName + ".class");
- class1.PrintToConsole();
- //Console.WriteLine();
- this._mainMemory.MethodArea.Classes.Add(class1);
- Thread newThread = new Thread();
- this._threads.Add(newThread);
- newThread.EntityId = entityID;
- newThread.currentClass = class1;
- //now delete the created files
- System.IO.File.Delete(scriptName + ".java");
- System.IO.File.Delete(scriptName + ".class");
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
- }
- public void OnFrame()
- {
- for (int i = 0; i < this._threads.Count; i++)
- {
- if (!this._threads[i].running)
- {
- this._threads[i].StartMethod("OnFrame");
- bool run = true;
- while (run)
- {
- run = this._threads[i].Excute();
- }
- }
- }
- }
- private class CompileInfo
- {
- public string script;
- public string scriptName;
- public uint entityId;
- public CompileInfo()
- {
- }
- }
- }
- }
|