changeset 46:48dfabed15be

implemented accept() fully.
author Atul Varma <varmaa@toolness.com>
date Wed, 24 Jun 2009 14:59:26 -0700
parents 0aac2efec58e
children e46bf8ff5dc5
files server_socket.cpp tcb.js
diffstat 2 files changed, 31 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/server_socket.cpp	Wed Jun 24 14:49:48 2009 -0700
+++ b/server_socket.cpp	Wed Jun 24 14:59:26 2009 -0700
@@ -38,6 +38,8 @@
 
 #include "nspr.h"
 
+static JSBool createWithFd(JSContext *cx, jsval *rval, PRFileDesc *fd);
+
 static JSBool getSocket(JSContext *cx, JSObject *obj, PRFileDesc **fd)
 {
   *fd = (PRFileDesc *) JS_GetInstancePrivate(
@@ -64,7 +66,7 @@
 
 JSExtendedClass sServerSocket_JSClass = {
   // JSClass (JSExtendedClass.base) initialization
-  { "FlexibleWrapper",
+  { "SimpleSocket",
     JSCLASS_IS_EXTENDED | JSCLASS_HAS_PRIVATE |
     JSCLASS_HAS_RESERVED_SLOTS(0),
     JS_PropertyStub,          JS_PropertyStub,
@@ -85,8 +87,8 @@
   JSCLASS_NO_RESERVED_MEMBERS
 };
 
-JSBool listen(JSContext *cx, JSObject *obj, uintN argc,
-              jsval *argv, jsval *rval)
+static JSBool listen(JSContext *cx, JSObject *obj, uintN argc,
+                     jsval *argv, jsval *rval)
 {
   PRInt32 backlog = 0;
 
@@ -108,8 +110,8 @@
   return JS_TRUE;
 }
 
-JSBool accept(JSContext *cx, JSObject *obj, uintN argc,
-              jsval *argv, jsval *rval)
+static JSBool accept(JSContext *cx, JSObject *obj, uintN argc,
+                     jsval *argv, jsval *rval)
 {
   PRIntervalTime timeout = PR_INTERVAL_NO_TIMEOUT;
 
@@ -123,17 +125,17 @@
   PRNetAddr addr;
   PRFileDesc *conn = PR_Accept(fd, &addr, timeout);
 
-  *rval = JSVAL_NULL;
-  if (conn != NULL) {
-    JS_ReportError(cx, "TODO: Make a new socket object for the connection!");
-    return JS_FALSE;
+  if (conn == NULL) {
+    *rval = JSVAL_NULL;
+    return JS_TRUE;
   }
 
-  return JS_TRUE;
+  // TODO: We should really be passing in addr here, right?
+  return createWithFd(cx, rval, conn);
 }
 
-JSBool bind(JSContext *cx, JSObject *obj, uintN argc,
-            jsval *argv, jsval *rval)
+static JSBool bind(JSContext *cx, JSObject *obj, uintN argc,
+                   jsval *argv, jsval *rval)
 {
   const char *addrStr;
   PRUint16 port;
@@ -176,25 +178,18 @@
   JS_FS_END
 };
 
-JSBool createServerSocket(JSContext *cx, JSObject *obj, uintN argc,
-                          jsval *argv, jsval *rval)
+static JSBool createWithFd(JSContext *cx, jsval *rval, PRFileDesc *fd)
 {
   JSObject *object = JS_NewObject(
     cx,
     &sServerSocket_JSClass.base,
     NULL,
-    JS_GetScopeChain(cx)
+    NULL
     );
 
   if (!JS_DefineFunctions(cx, object, methods))
     return JS_FALSE;
 
-  PRFileDesc *fd = PR_OpenTCPSocket(PR_AF_INET);
-  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;
@@ -203,3 +198,15 @@
   *rval = OBJECT_TO_JSVAL(object);
   return JS_TRUE;
 }
+
+JSBool createServerSocket(JSContext *cx, JSObject *obj, uintN argc,
+                          jsval *argv, jsval *rval)
+{
+  PRFileDesc *fd = PR_OpenTCPSocket(PR_AF_INET);
+  if (fd == NULL) {
+    JS_ReportError(cx, "Creation of TCP socket failed.");
+    return JS_FALSE;
+  }
+
+  return createWithFd(cx, rval, fd);
+}
--- a/tcb.js	Wed Jun 24 14:49:48 2009 -0700
+++ b/tcb.js	Wed Jun 24 14:59:26 2009 -0700
@@ -242,4 +242,6 @@
 } catch (e) {}
 socket.bind("127.0.0.1", 8080);
 socket.listen();
-socket.accept();
+
+var conn = socket.accept();
+print("connection: " + conn);