|
|
1.1 ! root 1: /* js_client.c */ ! 2: ! 3: /* Synchronet JavaScript "Client" Object */ ! 4: ! 5: /* $Id: js_client.c,v 1.15 2005/12/13 02:24:49 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: ! 40: #ifdef JAVASCRIPT ! 41: ! 42: /* Client Object Properites */ ! 43: enum { ! 44: CLIENT_PROP_ADDR /* IP address */ ! 45: ,CLIENT_PROP_HOST /* host name */ ! 46: ,CLIENT_PROP_PORT /* TCP port number */ ! 47: ,CLIENT_PROP_TIME /* connect time */ ! 48: ,CLIENT_PROP_PROTOCOL /* protocol description */ ! 49: ,CLIENT_PROP_USER /* user name */ ! 50: }; ! 51: ! 52: #ifdef BUILD_JSDOCS ! 53: static char* client_prop_desc[] = { ! 54: "client's IP address (in dotted-decimal format)" ! 55: ,"client's host name (up to 64 characters)" ! 56: ,"client's TCP or UDP port number" ! 57: ,"date/time of initial connection (in time_t format)" ! 58: ,"protocol description (e.g. 'Telnet', 'FTP', etc.)" ! 59: ,"user's name/alias (if logged in)" ! 60: /* this next one must be last */ ! 61: ,"instance of <a href=#Socket>Socket class</a> representing client's TCP/IP connection" ! 62: ,NULL ! 63: }; ! 64: #endif ! 65: ! 66: static JSBool js_client_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ! 67: { ! 68: return(JS_FALSE); ! 69: } ! 70: ! 71: static JSBool js_client_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ! 72: { ! 73: char* p=NULL; ! 74: ulong val=0; ! 75: jsint tiny; ! 76: JSString* js_str; ! 77: client_t* client; ! 78: ! 79: if((client=(client_t*)JS_GetPrivate(cx,obj))==NULL) ! 80: return(JS_FALSE); ! 81: ! 82: tiny = JSVAL_TO_INT(id); ! 83: ! 84: switch(tiny) { ! 85: case CLIENT_PROP_ADDR: ! 86: p=client->addr; ! 87: break; ! 88: case CLIENT_PROP_HOST: ! 89: p=client->host; ! 90: break; ! 91: case CLIENT_PROP_PORT: ! 92: val=client->port; ! 93: break; ! 94: case CLIENT_PROP_TIME: ! 95: val=client->time; ! 96: break; ! 97: case CLIENT_PROP_PROTOCOL: ! 98: p=(char*)client->protocol; ! 99: break; ! 100: case CLIENT_PROP_USER: ! 101: p=client->user; ! 102: break; ! 103: default: ! 104: return(JS_TRUE); ! 105: } ! 106: if(p!=NULL) { ! 107: if((js_str=JS_NewStringCopyZ(cx, p))==NULL) ! 108: return(JS_FALSE); ! 109: *vp = STRING_TO_JSVAL(js_str); ! 110: } else ! 111: *vp = INT_TO_JSVAL(val); ! 112: ! 113: return(JS_TRUE); ! 114: } ! 115: ! 116: #define CLIENT_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY ! 117: ! 118: static jsSyncPropertySpec js_client_properties[] = { ! 119: /* name ,tinyid ,flags, ver */ ! 120: ! 121: { "ip_address" ,CLIENT_PROP_ADDR ,CLIENT_PROP_FLAGS, 310}, ! 122: { "host_name" ,CLIENT_PROP_HOST ,CLIENT_PROP_FLAGS, 310}, ! 123: { "port" ,CLIENT_PROP_PORT ,CLIENT_PROP_FLAGS, 310}, ! 124: { "connect_time" ,CLIENT_PROP_TIME ,CLIENT_PROP_FLAGS, 310}, ! 125: { "protocol" ,CLIENT_PROP_PROTOCOL ,CLIENT_PROP_FLAGS, 310}, ! 126: { "user_name" ,CLIENT_PROP_USER ,CLIENT_PROP_FLAGS, 310}, ! 127: {0} ! 128: }; ! 129: ! 130: static JSClass js_client_class = { ! 131: "Client" /* name */ ! 132: ,JSCLASS_HAS_PRIVATE /* flags */ ! 133: ,JS_PropertyStub /* addProperty */ ! 134: ,JS_PropertyStub /* delProperty */ ! 135: ,js_client_get /* getProperty */ ! 136: ,js_client_set /* setProperty */ ! 137: ,JS_EnumerateStub /* enumerate */ ! 138: ,JS_ResolveStub /* resolve */ ! 139: ,JS_ConvertStub /* convert */ ! 140: ,JS_FinalizeStub /* finalize */ ! 141: }; ! 142: ! 143: JSObject* DLLCALL js_CreateClientObject(JSContext* cx, JSObject* parent ! 144: ,char* name, client_t* client, SOCKET sock) ! 145: { ! 146: JSObject* obj; ! 147: ! 148: obj = JS_DefineObject(cx, parent, name, &js_client_class, NULL ! 149: ,JSPROP_ENUMERATE|JSPROP_READONLY); ! 150: ! 151: if(obj==NULL) ! 152: return(NULL); ! 153: ! 154: JS_SetPrivate(cx, obj, client); /* Store a pointer to client_t */ ! 155: ! 156: js_DefineSyncProperties(cx, obj, js_client_properties); ! 157: ! 158: js_CreateSocketObject(cx, obj, "socket", sock); ! 159: ! 160: #ifdef BUILD_JSDOCS ! 161: js_DescribeSyncObject(cx,obj,"Represents a TCP/IP client session",310); ! 162: js_CreateArrayOfStrings(cx, obj, "_property_desc_list", client_prop_desc, JSPROP_READONLY); ! 163: #endif ! 164: ! 165: return(obj); ! 166: } ! 167: ! 168: #endif /* JAVSCRIPT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.