# HG changeset patch # User Atul Varma # Date 1245880766 25200 # Node ID 48dfabed15beeaf03606bd79bd2fd2e86a54dba0 # Parent 0aac2efec58e78db1d85e582fa196c56017b5b9a implemented accept() fully. diff -r 0aac2efec58e -r 48dfabed15be server_socket.cpp --- 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); +} diff -r 0aac2efec58e -r 48dfabed15be tcb.js --- 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);