Mercurial > spidermonkey-playground
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; }