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 }
/// <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. }