public ScriptEventResult Execute() { if (_returnType == ReturnType.Unsupported) { //Can't use anything that's not void: SciterValue, Task<void> or Task<SciterValue> return(ScriptEventResult.Failed()); } if (_methodInfo != null) { var parameters = BuildParameters(); { try { if (_isWrappedCallback && _isAwaitable) { ((Task)_methodInfo.Invoke(_owner, parameters))?.ContinueWith( task => { if (task.IsFaulted) { return; } if (!task.GetType().IsGenericType) { return; } _callbackValue?.Invoke((task as Task <SciterValue>)?.Result ?? SciterValue.Null, SciterValue.Null); }); return(ScriptEventResult.Successful()); } var ret = _methodInfo.Invoke(_owner, parameters); // Awaitable Tasks should return Successful immediately, don't block the main Thread waiting for completion! if (_isAwaitable) { return(ScriptEventResult.Successful()); } var value = (ret as SciterValue) ?? SciterValue.Null; return(ScriptEventResult.Successful(value)); } catch (TargetInvocationException e) { return(ExceptionCallbackResult(e.InnerException ?? e)); } catch (Exception e) { return(ExceptionCallbackResult(e)); } } } // not handled return(ScriptEventResult.Failed()); }
public async Task CallMeBack(SciterElement element, SciterValue value, SciterValue onProgress, SciterValue onCompleted) { _callMeBackResetEvent = new ManualResetEventSlim(false); for (var i = 0; i < 201; i++) { if (_callMeBackResetEvent.IsSet) { break; } //Simulates a delay await Task.Delay(10); onProgress.Invoke(SciterValue.Create(i), SciterValue.Create(i / 200d * 100)); } onCompleted.Invoke(SciterValue.Create($"You have {(!_callMeBackResetEvent.IsSet ? "successfully completed" : "cancelled")} your task!"), SciterValue.Create(!_callMeBackResetEvent.IsSet)); }
public Task StackTrace(SciterElement element, SciterValue onCompleted) { var stackTrace = new StackTrace(true); var stackFrame = stackTrace.GetFrame(0); var value = SciterValue.Create( new { MethodName = stackFrame?.GetMethod()?.Name, Parameters = stackFrame?.GetMethod()?.GetParameters().Select(s => new { s.Name, s.Position, Type = s.ParameterType.Name }), FileUri = new Uri(stackFrame?.GetFileName() ?? string.Empty).AbsoluteUri, FileName = Path.GetFileName(stackFrame?.GetFileName()), LineNumber = stackFrame?.GetFileLineNumber(), ColumnNumber = stackFrame?.GetFileColumnNumber() }); onCompleted.Invoke(value); return(Task.CompletedTask); }
public Task GetRuntimeInfo(SciterElement element, SciterValue onCompleted, SciterValue onError) { try { var value = SciterValue.Create( new { FrameworkDescription = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription, ProcessArchitecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString(), OSArchitecture = System.Runtime.InteropServices.RuntimeInformation.OSArchitecture.ToString(), OSDescription = System.Runtime.InteropServices.RuntimeInformation.OSDescription, SystemVersion = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion() }); onCompleted.Invoke(value); } catch (Exception e) { onError.Invoke(SciterValue.MakeError(e.Message)); } return(Task.CompletedTask); }
/// A dynamic script call handler. Any call in TIScript to function 'view.Host_HelloSciter()' with invoke this method /// Notice that signature of these handlers is always the same /// (Hint: install OmniCode snippets which adds the 'ssh' snippet to C# editor so you can easily declare 'Siter Handler' methods) /// (see: https://github.com/MISoftware/OmniCode-Snippets) public Task HelloSciterCore(SciterElement element, SciterValue onCompleted) { var stackTrace = new StackTrace(true); var stackFrame = stackTrace.GetFrame(0); var value = SciterValue.Create(System.Text.Json.JsonSerializer.Serialize(new { MethodName = stackFrame?.GetMethod()?.Name, FileUri = new Uri(stackFrame?.GetFileName() ?? "file://<unknown>")?.AbsoluteUri, FileName = Path.GetFileName(stackFrame?.GetFileName()), LineNumber = stackFrame?.GetFileLineNumber(), ColumnNumber = stackFrame?.GetFileColumnNumber() }, options: new JsonSerializerOptions() { WriteIndented = true })); //value = SciterValue.Create($"<h2>Hello Sciter from C# in .Net Core!</h2><code>Method: {stackFrame?.GetMethod()?.Name}<br/>File: <a href=\"{new Uri(stackFrame?.GetFileName())?.AbsoluteUri}\">{Path.GetFileName(stackFrame?.GetFileName())}</a><br/>Line: {stackFrame?.GetFileLineNumber()}<br/>Column: {stackFrame?.GetFileColumnNumber()}</code>"); onCompleted.Invoke(value); return(Task.CompletedTask); }
public void GetDotNetVersion(SciterElement element, SciterValue onCompleted) { var value = SciterValue.Create(RuntimeInformation.FrameworkDescription); onCompleted.Invoke(value); }