changeset 42:68d2a675a33a

Added a 'bind' method to ServerSocket.
author Atul Varma <varmaa@toolness.com>
date Wed, 24 Jun 2009 14:05:32 -0700
parents f495677654fc
children cdfbd4b71027
files server_socket.cpp tcb.js
diffstat 2 files changed, 73 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/server_socket.cpp	Wed Jun 24 13:02:29 2009 -0700
+++ b/server_socket.cpp	Wed Jun 24 14:05:32 2009 -0700
@@ -38,6 +38,22 @@
 
 #include "nspr.h"
 
+static JSBool getSocket(JSContext *cx, JSObject *obj, PRFileDesc **fd)
+{
+  *fd = (PRFileDesc *) JS_GetInstancePrivate(
+    cx,
+    obj,
+    &sServerSocket_JSClass.base,
+    NULL
+    );
+  if (*fd == NULL) {
+    JS_ReportError(cx, "ServerSocket method called on "
+                   "non-ServerSocket object.");
+    return JS_FALSE;
+  }
+  return JS_TRUE;
+}
+
 static void finalize(JSContext *cx, JSObject *obj)
 {
   PRFileDesc *fd = (PRFileDesc *) JS_GetPrivate(cx, obj);
@@ -69,6 +85,44 @@
   JSCLASS_NO_RESERVED_MEMBERS
 };
 
+JSBool bind(JSContext *cx, JSObject *obj, uintN argc,
+            jsval *argv, jsval *rval)
+{
+  const char *addrStr;
+  PRUint16 port;
+
+  if (!JS_ConvertArguments(cx, argc, argv, "sc", &addrStr, &port))
+    return JS_FALSE;
+
+  PRNetAddr addr;
+  PRStatus result = PR_StringToNetAddr(addrStr, &addr);
+
+  if (result != PR_SUCCESS) {
+    JS_ReportError(cx, "Invalid address.");
+    return JS_FALSE;
+  }
+
+  PRFileDesc *fd;
+  if (!getSocket(cx, obj, &fd))
+    return JS_FALSE;
+
+  addr.inet.port = port;
+  result = PR_Bind(fd, &addr);
+
+  if (result != PR_SUCCESS) {
+    JS_ReportError(cx, "Bind failed.");
+    return JS_FALSE;
+  }
+
+  *rval = JSVAL_VOID;
+  return JS_TRUE;
+}
+
+static JSFunctionSpec methods[] = {
+  JS_FS("bind",          bind,        1, 0, 0),
+  JS_FS_END
+};
+
 JSBool createServerSocket(JSContext *cx, JSObject *obj, uintN argc,
                           jsval *argv, jsval *rval)
 {
@@ -78,8 +132,21 @@
     NULL,
     JS_GetScopeChain(cx)
     );
+
+  if (!JS_DefineFunctions(cx, object, methods))
+    return JS_FALSE;
+
   PRFileDesc *fd = PR_OpenTCPSocket(PR_AF_INET);
-  JS_SetPrivate(cx, object, fd);
+  if (fd == NULL) {
+    JS_ReportError(cx, "Creation of TCP socket failed.");
+    return JS_FALSE;
+  }
+
+  if (!JS_SetPrivate(cx, object, fd)) {
+    PR_Close(fd);
+    return JS_FALSE;
+  }
+
   *rval = OBJECT_TO_JSVAL(object);
   return JS_TRUE;
 }
--- a/tcb.js	Wed Jun 24 13:02:29 2009 -0700
+++ b/tcb.js	Wed Jun 24 14:05:32 2009 -0700
@@ -236,3 +236,8 @@
 dumpHeap(new Object());
 
 var socket = new ServerSocket();
+try {
+  var boop = {bind: socket.bind};
+  boop.bind("127.0.0.1", 8080);
+} catch (e) {}
+socket.bind("127.0.0.1", 8080);