示例#1
0
        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());
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#5
0
        /// 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);
        }
示例#6
0
        public void GetDotNetVersion(SciterElement element, SciterValue onCompleted)
        {
            var value = SciterValue.Create(RuntimeInformation.FrameworkDescription);

            onCompleted.Invoke(value);
        }