コード例 #1
0
        public __UdpClient(int __port = 0)
        {
            // x:\jsc.svn\examples\javascript\chrome\apps\chromeudpsendasync\chromeudpsendasync\application.cs

            // async ctors?
            var isocket_after_create = socket.create("udp", new object());

            var afterbind = new TaskCompletionSource<int>();

            #region Client vBind
            this.Client = new __Socket
            {
                // called by?
                #region vBind
                vBind = async (EndPoint localEP) =>
                {
                    var isocket = await isocket_after_create;

                    var v4 = localEP as IPEndPoint;
                    if (v4 != null)
                    {
                        __IPAddress v4a = v4.Address;

                        //  Error: Invocation of form socket.bind(integer, null, integer, function) doesn't match definition socket.bind(integer socketId, string address, integer port, function callback)
                        var bind = await isocket.socketId.bind(
                            //address: "0.0.0.0",
                            address: v4a.ipString,
                            port: v4.Port
                        );

                        Console.WriteLine("UdpClient.Client.vBind " + new
                        {
                            v4a.ipString,
                            v4.Port,

                            bind
                        });

                        // 0 is ok?
                        afterbind.SetResult(bind);
                    }
                }
                #endregion

            };
            #endregion


            // https://developer.chrome.com/apps/app_network

            // X:\jsc.svn\examples\javascript\chrome\apps\ChromeUDPFloats\ChromeUDPFloats\Application.cs
            if (__port > 0)
            {
                // X:\jsc.svn\examples\javascript\chrome\apps\MulticastListenExperiment\MulticastListenExperiment\Application.cs

                // are we doing the right thing?
                // um. xt7 chrome wont listen at all?
                this.Client.Bind(
                    new IPEndPoint(IPAddress.Any, port: __port)
                    //new IPEndPoint(IPAddress.Parse("192.168.1.3"), port: __port)
                );
            }


            #region vJoinMulticastGroup
            this.vJoinMulticastGroup = async (IPAddress multicastAddr) =>
            {
                __IPAddress a = multicastAddr;

                var isocket = await isocket_after_create;

                var value_joinGroup = await isocket.socketId.joinGroup(a.ipString);

                // 0 is ok?
                Console.WriteLine("UdpClient.vJoinMulticastGroup " + new { value_joinGroup });
            };
            #endregion


            #region vReceiveAsync
            this.vReceiveAsync = async delegate
            {
                // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150723
                //Console.WriteLine("enter UdpClient.vReceiveAsync ");

                var isocket = await isocket_after_create;

                // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150807/chromeequirectangularpanorama
                Console.WriteLine("UdpClient.vReceiveAsync recvFrom " + new { isocket });

                // android defaults to 4096
                var result = await isocket.socketId.recvFrom(1048576);

                if (result.resultCode < 0)
                {
                    Console.WriteLine("UdpClient.vReceiveAsync " + new { result.resultCode });

                    #region await forever
                    await new TaskCompletionSource<object>().Task;
                    #endregion
                }

                byte[] buffer = new ScriptCoreLib.JavaScript.WebGL.Uint8ClampedArray(result.data);

                //Console.WriteLine("UdpClient.vReceiveAsync " + new { buffer.Length });

                return new UdpReceiveResult(
                    buffer,
                    remoteEndPoint: default(IPEndPoint)
                );
            };

            #endregion


            #region vSendAsync
            this.vSendAsync = async (byte[] datagram, int bytes, string hostname, int port) =>
            {
                // X:\jsc.svn\examples\javascript\chrome\apps\ChromeUDPSendAsync\ChromeUDPSendAsync\Application.cs

                // now we need it
                var isocket = await isocket_after_create;

                // are we bound?
                await afterbind.Task;

                var data = new ScriptCoreLib.JavaScript.WebGL.Uint8Array(datagram);

                var result = await isocket.socketId.sendTo(
                         data.buffer,
                         hostname,
                         port
                     );

                // sent: -15 no bind?
                //Console.WriteLine("UdpClient.vSendAsync " + new { result.bytesWritten });
                // would spam the chrome://extensions ?

                return result.bytesWritten;
            };
            #endregion




            #region vSend
            this.vSend = (byte[] datagram, int bytes, string hostname, int port) =>
            {
                // X:\jsc.svn\examples\javascript\chrome\apps\ChromeUDPSendAsync\ChromeUDPSendAsync\Application.cs

                new { }.With(
                    async delegate
                    {
                        // now we need it
                        var isocket = await isocket_after_create;

                        // are we bound?
                        await afterbind.Task;

                        this.vSend = (byte[] datagram0, int bytes0, string hostname0, int port0) =>
                        {
                            // patch the vSend now?
                            var data = new ScriptCoreLib.JavaScript.WebGL.Uint8Array(datagram0);

                            isocket.socketId.sendTo(
                                data.buffer,
                                hostname,
                                port
                            );

                            // optimistic.
                            return datagram0.Length;
                        };

                        // tail
                        this.vSend(datagram, bytes, hostname, port);
                    }
                );


                // sent: -15 no bind?
                //Console.WriteLine("UdpClient.vSendAsync " + new { result.bytesWritten });
                // would spam the chrome://extensions ?

                // optimistic.
                return datagram.Length;
            };
            #endregion



            #region vClose
            this.vClose = async delegate
            {
                var isocket = await isocket_after_create;

                isocket.socketId.disconnect();
                isocket.socketId.destroy();
            };
            #endregion
        }
コード例 #2
0
        /// <summary>
        /// This is a javascript application.
        /// </summary>
        /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param>
        public Application(IApp page)
        {
            // https://developer.chrome.com/extensions/contentSecurityPolicy.html
            //var __chrome = new IFunction("return window['chrome'];").apply(null);


            //new { chrome = __chrome }.ToString().ToDocumentTitle();


            #region switch to chrome AppWindow
            //if (chrome.app.runtime != null)
            {
                //The JavaScript context calling chrome.app.window.current() has no associated AppWindow. 
                //Console.WriteLine("appwindow loading... " + new { current = chrome.app.window.current() });

                // no HTML layout yet

                if (Native.window.opener == null)
                    if (Native.window.parent == Native.window.self)
                    {
                        chrome.app.runtime.Launched +=
                                async delegate
                                {
                                    // runtime will launch only once?

                                    // http://developer.chrome.com/apps/app.window.html
                                    // do we even need index?

                                    // https://code.google.com/p/chromium/issues/detail?id=148857
                                    // https://developer.mozilla.org/en-US/docs/data_URIs

                                    // chrome-extension://mdcjoomcbillipdchndockmfpelpehfc/data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E
                                    var appwindow = await chrome.app.window.create(Native.document.location.pathname, null);


                                    // Uncaught TypeError: Cannot read property 'contentWindow' of undefined 

                                    Console.WriteLine("appwindow loading... " + new { appwindow });
                                    Console.WriteLine("appwindow loading... " + new { appwindow.contentWindow });


                                    appwindow.contentWindow.onload +=
                                        delegate
                                        {
                                            Console.WriteLine("appwindow contentWindow onload");


                                            //new IHTMLButton("dynamic").AttachTo(
                                            //    appwindow.contentWindow.document.body
                                            //);


                                        };

                                };

                        return;
                    }

                // if we are in a window lets add layout
                new App().Container.AttachToDocument();
            }
            #endregion

            #region __chrome
            // not an app
            //{ member = loadTimes }
            //{ member = csi }
            //{ member = app }
            //{ member = webstore }

            // running as a legacy app
            //{ member = loadTimes }
            //{ member = csi }
            //{ member = Event }
            //{ member = activityLogPrivate }
            //{ member = adview }
            //{ member = alarms }
            //{ member = app }
            //{ member = audio }
            //{ member = autotestPrivate }
            //{ member = bluetooth }
            //{ member = bookmarkManagerPrivate }
            //{ member = bookmarks }
            //{ member = browserAction }
            //{ member = browsingData }
            //{ member = chromeosInfoPrivate }
            //{ member = cloudPrintPrivate }
            //{ member = commandLinePrivate }
            //{ member = commands }
            //{ member = contentSettings }
            //{ member = contextMenus }
            //{ member = cookies }
            //{ member = debugger }
            //{ member = declarativeContent }
            //{ member = declarativeWebRequest }
            //{ member = developerPrivate }
            //{ member = diagnostics }
            //{ member = dial }
            //{ member = downloads }
            //{ member = echoPrivate }
            //{ member = enterprise }
            //{ member = experimental }
            //{ member = extension }
            //{ member = feedbackPrivate }
            //{ member = fileBrowserHandler }
            //{ member = fileBrowserPrivate }
            //{ member = fileSystem }
            //{ member = fontSettings }
            //{ member = history }
            //{ member = i18n }
            //{ member = identity }
            //{ member = identityPrivate }
            //{ member = idle }
            //{ member = input }
            //{ member = inputMethodPrivate }
            //{ member = location }
            //{ member = management }
            //{ member = mediaGalleries }
            //{ member = mediaGalleriesPrivate }
            //{ member = mediaPlayerPrivate }
            //{ member = metricsPrivate }
            //{ member = musicManagerPrivate }
            //{ member = networkingPrivate }
            //{ member = notifications }
            //{ member = omnibox }
            //{ member = pageAction }
            //{ member = pageActions }
            //{ member = pageCapture }
            //{ member = pageLauncher }
            //{ member = permissions }
            //{ member = power }
            //{ member = preferencesPrivate }
            //{ member = privacy }
            //{ member = proxy }
            //{ member = pushMessaging }
            //{ member = rtcPrivate }
            //{ member = runtime }
            //{ member = scriptBadge }
            //{ member = serial }
            //{ member = sessionRestore }
            //{ member = socket }
            //{ member = storage }
            //{ member = streamsPrivate }
            //{ member = syncFileSystem }
            //{ member = systemIndicator }
            //{ member = systemInfo }
            //{ member = systemPrivate }
            //{ member = tabCapture }
            //{ member = tabs }
            //{ member = terminalPrivate }
            //{ member = test }
            //{ member = topSites }
            //{ member = tts }
            //{ member = ttsEngine }
            //{ member = types }
            //{ member = usb }
            //{ member = wallpaperPrivate }
            //{ member = webNavigation }
            //{ member = webRequest }
            //{ member = webSocketProxyPrivate }
            //{ member = webstorePrivate }
            //{ member = webview }
            //{ member = windows }

            // as packaged app
            //            { member = loadTimes }
            //{ member = csi }
            //{ member = Event }
            //{ member = activityLogPrivate }
            //{ member = adview }
            //{ member = alarms }
            //{ member = app }
            //{ member = audio }
            //{ member = autotestPrivate }
            //{ member = bluetooth }
            //{ member = bookmarkManagerPrivate }
            //{ member = bookmarks }
            //{ member = browserAction }
            //{ member = browsingData }
            //{ member = chromeosInfoPrivate }
            //{ member = cloudPrintPrivate }
            //{ member = commandLinePrivate }
            //{ member = commands }
            //{ member = contentSettings }
            //{ member = contextMenus }
            //{ member = cookies }
            //{ member = debugger }
            //{ member = declarativeContent }
            //{ member = declarativeWebRequest }
            //{ member = developerPrivate }
            //{ member = diagnostics }
            //{ member = dial }
            //{ member = downloads }
            //{ member = echoPrivate }
            //{ member = enterprise }
            //{ member = experimental }
            //{ member = extension }
            //{ member = feedbackPrivate }
            //{ member = fileBrowserHandler }
            //{ member = fileBrowserPrivate }
            //{ member = fileSystem }
            //{ member = fontSettings }
            //{ member = history }
            //{ member = i18n }
            //{ member = identity }
            //{ member = identityPrivate }
            //{ member = idle }
            //{ member = input }
            //{ member = inputMethodPrivate }
            //{ member = location }
            //{ member = management }
            //{ member = mediaGalleries }
            //{ member = mediaGalleriesPrivate }
            //{ member = mediaPlayerPrivate }
            //{ member = metricsPrivate }
            //{ member = musicManagerPrivate }
            //{ member = networkingPrivate }
            //{ member = notifications }
            //{ member = omnibox }
            //{ member = pageAction }
            //{ member = pageActions }
            //{ member = pageCapture }
            //{ member = pageLauncher }
            //{ member = permissions }
            //{ member = power }
            //{ member = preferencesPrivate }
            //{ member = privacy }
            //{ member = proxy }
            //{ member = pushMessaging }
            //{ member = rtcPrivate }
            //{ member = runtime }
            //{ member = scriptBadge }
            //{ member = serial }
            //{ member = sessionRestore }
            //{ member = socket }
            //{ member = storage }
            //{ member = streamsPrivate }
            //{ member = syncFileSystem }
            //{ member = systemIndicator }
            //{ member = systemInfo }
            //{ member = systemPrivate }
            //{ member = tabCapture }
            //{ member = tabs }
            //{ member = terminalPrivate }
            //{ member = test }
            //{ member = topSites }
            //{ member = tts }
            //{ member = ttsEngine }
            //{ member = types }
            //{ member = usb }
            //{ member = wallpaperPrivate }
            //{ member = webNavigation }
            //{ member = webRequest }
            //{ member = webSocketProxyPrivate }
            //{ member = webstorePrivate }
            //{ member = webview }
            //{ member = windows }

            //Expando.Of(__chrome).GetMemberNames().WithEach(
            //    member =>
            //    {
            //        new IHTMLDiv { innerText = new { member }.ToString() }.AttachToDocument();

            //    }
            //);
            #endregion




            Action<string> AtUDPString = delegate { };

            // suggest: HTMLElements
            IHTMLElement.HTMLElementEnum.hr.AttachToDocument();


            // X:\jsc.svn\examples\javascript\chrome\extensions\ChromeExtensionWithWorker\ChromeExtensionWithWorker\Application.cs
            // Fired when a connection is made from another extension.

            // X:\jsc.svn\examples\merge\TestDetectOpenFiles\TestDetectOpenFiles\Program.cs

            #region ConnectExternal
            chrome.runtime.ConnectExternal += e =>
            {
                // 0:10428ms extension connects to app: { id = fkgibadjpabiongmgoeomdbcefhabmah }
                // 
                Console.WriteLine("extension connects to app: " + new { e.sender.id });

                //e.postMessage("hello from app");


                var e_disconnected = false;

                e.onDisconnect.addListener(
                    new Action(
                        delegate
                        {
                            e_disconnected = true;

                            Console.WriteLine("extension onDisconnect from app");
                        }
                    )
                );


                e.onMessage.addListener(
                    new Action<string>(
                        xmlstring =>
                        {
                            var xml = XElement.Parse(xmlstring);

                            if (xml.Value.StartsWith("Visit me at "))
                            {
                                // what about android apps runnning on SSL?
                                // what about preview images?
                                // do we get localhost events too?

                                var uri = "http://" + xml.Value.SkipUntilOrEmpty("Visit me at ");

                                var fff = OpenUri(uri);


                                fff.FormClosed +=
                                    delegate
                                    {
                                        // dock into tab...

                                        AtUDPString(xmlstring);
                                    };

                            }

                        }
                    )
                );




                AtUDPString +=
                    xml =>
                    {
                        if (e_disconnected)
                            return;

                        e.postMessage(xml);

                    };
            };

            #endregion



            #region the new api. is it any better?
            new IHTMLButton { "chrome.sockets.udp.create" }.AttachToDocument().onclick +=
                async e =>
                {
                    // this aint defined for chrme38???
					// not available for c43 either.

                    // http://wefixbugs.com/blog/How-to-do-UDP-broadcast-using-chromesocketsudp-API-55233.html#.U8Krqm0wqCg
                    // https://developer.chrome.com/apps/app_network

                    e.Element.disabled = true;


                    var socket = await chrome.sockets.udp.create(new object());

                    var value_bind = await chrome.sockets.udp.bind(socket.socketId, "0.0.0.0", 40404);
                    var value_joinGroup = await chrome.sockets.udp.joinGroup(socket.socketId, "239.1.2.3");

                    e.Element.innerText = new { socket.socketId }.ToString();

                    chrome.sockets.udp.Receive +=
                        info =>
                        {
                            if (info.socketId != socket.socketId)
                                return;

                            var xml = Encoding.UTF8.GetString(info.data);

                            new IHTMLPre { new { info.remoteAddress, info.remotePort, xml } }.AttachToDocument();
                        };
                };
            #endregion



            #region  working API chrome.socket.create
            new IHTMLButton { "chrome.socket.create" }.AttachToDocument().onclick +=
                async e =>
                {
                    // X:\jsc.internal.git\market\chrome\ChromeMyJscSolutionsNet\ChromeMyJscSolutionsNet\Application.cs

                    e.Element.disabled = true;


                    var socket = await chrome.socket.create("udp", new object());

                    //var x = Expando.Of(socket);

                    //new IHTMLDiv { innerText = new { x.constructor }.ToString() }.AttachToDocument();
                    //new IHTMLDiv { innerText = new { x.prototype }.ToString() }.AttachToDocument();

                    //x.GetMemberNames().WithEach(
                    //    member =>
                    //    {
                    //        new IHTMLDiv { innerText = new { member }.ToString() }.AttachToDocument();

                    //    }
                    //);

                    var socketId = socket.socketId;

                    new IHTMLDiv { innerText = new { socketId }.ToString() }.AttachToDocument();

                    #region send data
                    new IHTMLButton { innerText = "send data" }.AttachToDocument().WhenClicked(
                        async delegate
                        {
							// x:\jsc.svn\examples\javascript\chrome\apps\chromeudpsendasync\chromeudpsendasync\application.cs

							var data = new ScriptCoreLib.JavaScript.WebGL.Uint8Array(
                                40, 41, 42
                            );

                            // Uncaught Error: Invocation of form socket.sendTo(object, string, integer, function) 
                            // doesn't match definition socket.sendTo(integer socketId, binary data, string address, integer port, function callback) 

                            var result = await socketId.sendTo(
                                data.buffer,
                                "239.1.2.3",
                                40404
                            );

                            new IHTMLDiv { innerText = new { result.bytesWritten }.ToString() }.AttachToDocument();

                        }
                    );
                    #endregion


                    var value_setMulticastTimeToLive = await socketId.setMulticastTimeToLive(30);

                    new IHTMLDiv { innerText = new { value_setMulticastTimeToLive }.ToString() }.AttachToDocument();


                    var value_bind = await socketId.bind("0.0.0.0", 40404);

                    new IHTMLDiv { innerText = new { value_bind }.ToString() }.AttachToDocument();

                    var value_joinGroup = await socketId.joinGroup("239.1.2.3");


                    new IHTMLDiv { innerText = new { value_joinGroup }.ToString() }.AttachToDocument();

                    var forever = true;

                    while (forever)
                    {
                        var result = await socketId.recvFrom(1048576);

                        new IHTMLDiv { innerText = new { result.resultCode }.ToString() }.AttachToDocument();


                        if (result.resultCode < 0)
                            return;

                        new IHTMLDiv { innerText = new { result.data.byteLength }.ToString() }.AttachToDocument();





                        byte[] source = new ScriptCoreLib.JavaScript.WebGL.Uint8ClampedArray(result.data);

                        var xml = Encoding.UTF8.GetString(source);

                        AtUDPString(xml);
                        new IHTMLPre { new { xml } }.AttachToDocument();
                        // 52 bytes
                    }

                };
            #endregion


            // https://code.google.com/p/chromium/issues/detail?id=246872
            // chrome.socket is not available: 'socket' requires a different Feature that is not present. 
            // chrome.socket is not available: 'socket' is only allowed for packaged apps, and this is a legacy packaged app. 



        }