コード例 #1
0
ファイル: JsValue.cs プロジェクト: fdsa-ltd/tangram
        /// <summary>
        /// 获取代表 function 的 JsValue
        /// </summary>
        /// <param name="jsExecState"></param>
        /// <param name="function">long (IntPtr jsExecState, long obj, jsValue[] args)</param>
        /// <returns></returns>
        public static JsValue FunctionValue(IntPtr jsExecState, jsCallAsFunction function)
        {
            if (function == null)
            {
                return(MBApi.jsUndefined());
            }
            IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData)));

            if (pData == IntPtr.Zero)
            {
                return(MBApi.jsUndefined());
            }
            jsData jd = new jsData();

            jd.typeName = "function";
            sm_jsCallAsFunctionDictionary[pData] = new jsCallAsFunctionCallback((IntPtr es, Int64 obj, IntPtr args, int argCount) =>
            {
                JsValue[] argsValue = new JsValue[argCount];
                for (int i = 0; i < argCount; i++)
                {
                    argsValue[i] = MBApi.jsArg(es, i);
                }
                return(function(es, obj, argsValue));
            });
            jd.callAsFunction = sm_jsCallAsFunctionDictionary[pData];
            jd.finalize       = sm_finalize;
            Marshal.StructureToPtr(jd, pData, false);
            return(MBApi.jsFunction(jsExecState, pData));
        }
コード例 #2
0
ファイル: Browser.cs プロジェクト: zmxGeorge/WebCore
        public long CreateFunction(IntPtr es, jsCallAsFunctionCallback fun)
        {
            jsData data = new jsData();

            data.callAsFunction = fun;
            data.propertyGet    = null;
            data.propertySet    = null;
            data.finalize       = _disposed;
            var size = Marshal.SizeOf(typeof(jsData));
            var ptr  = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(data, ptr, true);
            var v = MBApi.jsFunction(es, ptr);

            return(v);
        }
コード例 #3
0
ファイル: JsValue.cs プロジェクト: fdsa-ltd/tangram
        /// <summary>
        /// 获取代表 object 的 JsValue
        /// </summary>
        /// <param name="jsExecState"></param>
        /// <param name="jsObj">继承此类,Overite 方法</param>
        /// <returns></returns>
        public static JsValue ObjectValue(IntPtr jsExecState, JsObject jsObj)
        {
            if (jsObj == null)
            {
                return(MBApi.jsUndefined());
            }
            IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData)));

            if (pData == IntPtr.Zero)
            {
                return(MBApi.jsUndefined());
            }
            jsData jd = new jsData();

            jd.typeName    = "object";
            jd.propertyGet = jsObj._jsGetProperty;
            jd.propertySet = jsObj._jsSetProperty;
            jd.finalize    = jsObj._jsFinalize;
            Marshal.StructureToPtr(jd, pData, false);
            return(MBApi.jsObject(jsExecState, pData));
        }
コード例 #4
0
        public CSharpMethodInfo(IntPtr es,
                                object obj,
                                MethodInfo methodInfo)
        {
            _obj                = obj;
            _webView            = MBApi.jsGetWebView(es);
            _methodInfo         = methodInfo;
            _methodCall         = new jsCallAsFunctionCallback(OnMethodCall);
            _jsFinalizeCallback = new jsFinalizeCallback(OnMehtodDispose);
            jsData data = new jsData();

            data.typeName       = new byte[100];
            data.finalize       = _jsFinalizeCallback;
            data.callAsFunction = _methodCall;
            var s   = Marshal.SizeOf(typeof(jsData));
            var ptr = Marshal.AllocHGlobal(s);

            Marshal.StructureToPtr(data, ptr, true);
            _jsValue = MBApi.jsFunction(es, ptr);
            MBApi.jsAddRef(es, _jsValue);
        }
コード例 #5
0
        public static long ToJsValue(this object obj, BlinkBrowser miniblink, IntPtr es)
        {
            if (obj == null)
            {
                return(BlinkBrowserPInvoke.jsUndefined());
            }
            if (obj is int)
            {
                return(BlinkBrowserPInvoke.jsInt((int)obj));
            }
            if (obj is bool)
            {
                return(BlinkBrowserPInvoke.jsBoolean((bool)obj));
            }
            if (obj is double)
            {
                return(BlinkBrowserPInvoke.jsDouble((double)obj));
            }
            if (obj is decimal)
            {
                var dec = (decimal)obj;
                if (dec.ToString().Contains("."))
                {
                    return(ToJsValue(Convert.ToDouble(dec.ToString()), miniblink, es));
                }
                else
                {
                    return(ToJsValue(Convert.ToInt32(dec.ToString()), miniblink, es));
                }
            }
            if (obj is long)
            {
                return(ToJsValue(obj.ToString(), miniblink, es));
            }
            if (obj is float)
            {
                return(BlinkBrowserPInvoke.jsFloat((float)obj));
            }
            if (obj is DateTime)
            {
                return(BlinkBrowserPInvoke.jsDouble(((DateTime)obj).ToLong()));
            }
            if (obj is string)
            {
                return(BlinkBrowserPInvoke.jsString(es, obj.ToString()));
            }
            if (obj is IEnumerable)
            {
                var list = new List <object>();
                foreach (var item in (IEnumerable)obj)
                {
                    list.Add(item);
                }
                var array = BlinkBrowserPInvoke.jsEmptyArray(es);
                BlinkBrowserPInvoke.jsSetLength(es, array, list.Count);
                for (var i = 0; i < list.Count; i++)
                {
                    BlinkBrowserPInvoke.jsSetAt(es, array, i, list[i].ToJsValue(miniblink, es));
                }

                return(array);
            }

            if (obj is Delegate)
            {
                var func    = (Delegate)obj;
                var funcptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData)));
                var jsfunc  = new jsCallAsFunctionCallback(
                    (fes, fobj, fargs, fcount) =>
                {
                    if (func is TempNetFunc)
                    {
                        var fps = new List <object>();
                        for (var i = 0; i < fcount; i++)
                        {
                            fps.Add(BlinkBrowserPInvoke.jsArg(fes, i).ToValue(miniblink, fes));
                        }

                        return(((TempNetFunc)func)(fps.ToArray()).ToJsValue(miniblink, fes));
                    }
                    else
                    {
                        var fps = new object[func.Method.GetParameters().Length];
                        for (var i = 0; i < fcount && i < fps.Length; i++)
                        {
                            fps[i] = BlinkBrowserPInvoke.jsArg(fes, i).ToValue(miniblink, fes);
                        }

                        var rs = func.Method.Invoke(func.Target, fps);
                        return(rs.ToJsValue(miniblink, fes));
                    }
                });
                var funcdata = new jsData
                {
                    typeName       = "function",
                    callAsFunction = jsfunc,
                    finalize       = FunctionFinalize
                };
                _keepref.Add(funcptr.ToInt64(), funcdata);
                Marshal.StructureToPtr(funcdata, funcptr, false);
                return(BlinkBrowserPInvoke.jsFunction(es, funcptr));
            }

            var jsobj = BlinkBrowserPInvoke.jsEmptyObject(es);
            var ps    = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

            foreach (var p in ps)
            {
                var v = p.GetValue(obj, null);
                if (v == null)
                {
                    continue;
                }
                BlinkBrowserPInvoke.jsSet(es, jsobj, p.Name, v.ToJsValue(miniblink, es));
            }

            return(jsobj);
        }