Annotation of sbbs/sbbs3/js_msg_area.c, revision 1.1

1.1     ! root        1: /* js_msg_area.c */
        !             2: 
        !             3: /* Synchronet JavaScript "Message Area" Object */
        !             4: 
        !             5: /* $Id: js_msg_area.c,v 1.47 2004/12/31 02:39:19 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 2004 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: enum { /* msg_area Object Properties */
        !            43:         PROP_MAX_QWK_MSGS
        !            44: };
        !            45: 
        !            46: #ifdef _DEBUG
        !            47: 
        !            48: static char* msg_grp_prop_desc[] = {
        !            49:         "index into grp_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
        !            50:        ,"unique number for this message group"
        !            51:        ,"group name"
        !            52:        ,"group description"
        !            53:        ,"group access requirements"
        !            54:        ,NULL
        !            55: };
        !            56: 
        !            57: static char* msg_area_prop_desc[] = {
        !            58: 
        !            59:         "index into sub_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
        !            60:        ,"group's index into grp_list array <i>(introduced in v3.12)</i>"
        !            61:        ,"unique number for this sub-board"
        !            62:        ,"group number"
        !            63:        ,"group name <i>(introduced in v3.12)</i>"
        !            64:        ,"sub-board internal code"
        !            65:        ,"sub-board name"
        !            66:        ,"sub-board description"
        !            67:        ,"sub-board QWK name"
        !            68:        ,"newsgroup name (as configured or dymamically generated)"
        !            69:        ,"sub-board access requirements"
        !            70:        ,"sub-board reading requirements"
        !            71:        ,"sub-board posting requirements"
        !            72:        ,"sub-board operator requirements"
        !            73:        ,"sub-board moderated-user requirements (if non-blank)"
        !            74:        ,"sub-board data storage location"
        !            75:        ,"FidoNet origin line"
        !            76:        ,"QWK Network tagline"
        !            77:        ,"toggle options (bitfield)"
        !            78:        ,"index into message scan configuration/pointer file"
        !            79:        ,"QWK conference number"
        !            80:        ,"configured maximum number of message CRCs to store (for dupe checking)"
        !            81:        ,"configured maximum number of messages before purging"
        !            82:        ,"configured maximum age (in days) of messages before expiration"
        !            83:        /* Insert here */
        !            84:        ,"user has sufficient access to read messages"
        !            85:        ,"user has sufficient access to post messages"
        !            86:        ,"user has operator access to this message area"
        !            87:        ,"user's posts are moderated"
        !            88:        ,"user's current new message scan pointer (highest-read message number)"
        !            89:        ,"user's message scan configuration (bitfield) see <tt>SCAN_CFG_*</tt> in <tt>sbbsdefs.js</tt> for valid bits"
        !            90:        ,"user's last-read message number"
        !            91:        ,NULL
        !            92: };
        !            93: #endif
        !            94: 
        !            95: BOOL DLLCALL js_CreateMsgAreaProperties(JSContext* cx, scfg_t* cfg, JSObject* subobj, uint subnum)
        !            96: {
        !            97:        char            str[128];
        !            98:        int                     c;
        !            99:        JSString*       js_str;
        !           100:        jsval           val;
        !           101:        sub_t*          sub;
        !           102: 
        !           103:        if(subnum==INVALID_SUB || subnum>=cfg->total_subs)
        !           104:                return(FALSE);
        !           105: 
        !           106:        sub=cfg->sub[subnum];
        !           107: 
        !           108:        if(!JS_DefineProperty(cx, subobj, "number", INT_TO_JSVAL(subnum)
        !           109:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           110:                return(FALSE);
        !           111: 
        !           112:        if(!JS_DefineProperty(cx, subobj, "grp_number", INT_TO_JSVAL(sub->grp)
        !           113:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           114:                return(FALSE);
        !           115: 
        !           116:        if((js_str=JS_NewStringCopyZ(cx, cfg->grp[sub->grp]->sname))==NULL)
        !           117:                return(FALSE);
        !           118:        if(!JS_DefineProperty(cx, subobj, "grp_name", STRING_TO_JSVAL(js_str)
        !           119:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           120:                return(FALSE);
        !           121: 
        !           122:        if((js_str=JS_NewStringCopyZ(cx, sub->code))==NULL)
        !           123:                return(FALSE);
        !           124:        if(!JS_DefineProperty(cx, subobj, "code", STRING_TO_JSVAL(js_str)
        !           125:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           126:                return(FALSE);
        !           127: 
        !           128:        if((js_str=JS_NewStringCopyZ(cx, sub->sname))==NULL)
        !           129:                return(FALSE);
        !           130:        if(!JS_DefineProperty(cx, subobj, "name", STRING_TO_JSVAL(js_str)
        !           131:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           132:                return(FALSE);
        !           133: 
        !           134:        if((js_str=JS_NewStringCopyZ(cx, sub->lname))==NULL)
        !           135:                return(FALSE);
        !           136:        if(!JS_DefineProperty(cx, subobj, "description", STRING_TO_JSVAL(js_str)
        !           137:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           138:                return(FALSE);
        !           139: 
        !           140:        if((js_str=JS_NewStringCopyZ(cx, sub->qwkname))==NULL)
        !           141:                return(FALSE);
        !           142:        if(!JS_DefineProperty(cx, subobj, "qwk_name", STRING_TO_JSVAL(js_str)
        !           143:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           144:                return(FALSE);
        !           145: 
        !           146:        if(sub->newsgroup[0])
        !           147:                SAFECOPY(str,sub->newsgroup);
        !           148:        else {
        !           149:                sprintf(str,"%s.%s",cfg->grp[sub->grp]->sname,sub->sname);
        !           150:                for(c=0;str[c];c++)
        !           151:                        if(str[c]==' ')
        !           152:                                str[c]='_';
        !           153:        }
        !           154:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !           155:                return(FALSE);
        !           156:        if(!JS_DefineProperty(cx, subobj, "newsgroup", STRING_TO_JSVAL(js_str)
        !           157:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           158:                return(FALSE);
        !           159: 
        !           160:        if((js_str=JS_NewStringCopyZ(cx, sub->arstr))==NULL)
        !           161:                return(FALSE);
        !           162:        if(!JS_DefineProperty(cx, subobj, "ars", STRING_TO_JSVAL(js_str)
        !           163:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           164:                return(FALSE);
        !           165: 
        !           166:        if((js_str=JS_NewStringCopyZ(cx, sub->read_arstr))==NULL)
        !           167:                return(FALSE);
        !           168:        if(!JS_DefineProperty(cx, subobj, "read_ars", STRING_TO_JSVAL(js_str)
        !           169:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           170:                return(FALSE);
        !           171: 
        !           172:        if((js_str=JS_NewStringCopyZ(cx, sub->post_arstr))==NULL)
        !           173:                return(FALSE);
        !           174:        if(!JS_DefineProperty(cx, subobj, "post_ars", STRING_TO_JSVAL(js_str)
        !           175:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           176:                return(FALSE);
        !           177: 
        !           178:        if((js_str=JS_NewStringCopyZ(cx, sub->op_arstr))==NULL)
        !           179:                return(FALSE);
        !           180:        if(!JS_DefineProperty(cx, subobj, "operator_ars", STRING_TO_JSVAL(js_str)
        !           181:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           182:                return(FALSE);
        !           183: 
        !           184:        if((js_str=JS_NewStringCopyZ(cx, sub->mod_arstr))==NULL)
        !           185:                return(FALSE);
        !           186:        if(!JS_DefineProperty(cx, subobj, "moderated_ars", STRING_TO_JSVAL(js_str)
        !           187:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           188:                return(FALSE);
        !           189: 
        !           190:        if((js_str=JS_NewStringCopyZ(cx, sub->data_dir))==NULL)
        !           191:                return(FALSE);
        !           192:        if(!JS_DefineProperty(cx, subobj, "data_dir", STRING_TO_JSVAL(js_str)
        !           193:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           194:                return(FALSE);
        !           195: 
        !           196:        if((js_str=JS_NewStringCopyZ(cx, sub->origline))==NULL)
        !           197:                return(FALSE);
        !           198:        if(!JS_DefineProperty(cx, subobj, "fidonet_origin", STRING_TO_JSVAL(js_str)
        !           199:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           200:                return(FALSE);
        !           201: 
        !           202:        if((js_str=JS_NewStringCopyZ(cx, sub->tagline))==NULL)
        !           203:                return(FALSE);
        !           204:        if(!JS_DefineProperty(cx, subobj, "qwknet_tagline", STRING_TO_JSVAL(js_str)
        !           205:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           206:                return(FALSE);
        !           207: 
        !           208:        if(!JS_NewNumberValue(cx,sub->misc,&val))
        !           209:                return(FALSE);
        !           210:        if(!JS_DefineProperty(cx, subobj, "settings", val
        !           211:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           212:                return(FALSE);
        !           213: 
        !           214:        if(!JS_DefineProperty(cx, subobj, "ptridx", INT_TO_JSVAL(sub->ptridx)
        !           215:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           216:                return(FALSE);
        !           217: 
        !           218:        if(!JS_DefineProperty(cx, subobj, "qwk_conf", INT_TO_JSVAL(sub->qwkconf)
        !           219:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           220:                return(FALSE);
        !           221: 
        !           222:        if(!JS_DefineProperty(cx, subobj, "max_crcs", INT_TO_JSVAL(sub->maxcrcs)
        !           223:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           224:                return(FALSE);
        !           225: 
        !           226:        if(!JS_DefineProperty(cx, subobj, "max_msgs", INT_TO_JSVAL(sub->maxmsgs)
        !           227:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           228:                return(FALSE);
        !           229: 
        !           230:        if(!JS_DefineProperty(cx, subobj, "max_age", INT_TO_JSVAL(sub->maxage)
        !           231:                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           232:                return(FALSE);
        !           233: 
        !           234: #ifdef _DEBUG
        !           235:        js_CreateArrayOfStrings(cx, subobj, "_property_desc_list", msg_area_prop_desc, JSPROP_READONLY);
        !           236: #endif
        !           237: 
        !           238:        return(TRUE);
        !           239: }
        !           240: 
        !           241: /*******************************************/
        !           242: /* Re-writable Sub-board Object Properites */
        !           243: /*******************************************/
        !           244: enum {
        !           245:         SUB_PROP_SCAN_PTR
        !           246:        ,SUB_PROP_SCAN_CFG
        !           247:        ,SUB_PROP_LAST_READ
        !           248: };
        !           249: 
        !           250: 
        !           251: static JSBool js_sub_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           252: {
        !           253:     jsint       tiny;
        !           254:        subscan_t*      scan;
        !           255: 
        !           256:        if((scan=(subscan_t*)JS_GetPrivate(cx,obj))==NULL)
        !           257:                return(JS_TRUE);
        !           258: 
        !           259:     tiny = JSVAL_TO_INT(id);
        !           260: 
        !           261:        switch(tiny) {
        !           262:                case SUB_PROP_SCAN_PTR:
        !           263:                        JS_NewNumberValue(cx,scan->ptr,vp);
        !           264:                        break;
        !           265:                case SUB_PROP_SCAN_CFG:
        !           266:                        JS_NewNumberValue(cx,scan->cfg,vp);
        !           267:                        break;
        !           268:                case SUB_PROP_LAST_READ:
        !           269:                        JS_NewNumberValue(cx,scan->last,vp);
        !           270:                        break;
        !           271:        }
        !           272: 
        !           273:        return(JS_TRUE);
        !           274: }
        !           275: 
        !           276: static JSBool js_sub_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           277: {
        !           278:        int32           val=0;
        !           279:     jsint       tiny;
        !           280:        subscan_t*      scan;
        !           281: 
        !           282:        if((scan=(subscan_t*)JS_GetPrivate(cx,obj))==NULL)
        !           283:                return(JS_TRUE);
        !           284: 
        !           285:     tiny = JSVAL_TO_INT(id);
        !           286: 
        !           287:        switch(tiny) {
        !           288:                case SUB_PROP_SCAN_PTR:
        !           289:                        JS_ValueToInt32(cx, *vp, (int32*)&scan->ptr);
        !           290:                        break;
        !           291:                case SUB_PROP_SCAN_CFG:
        !           292:                        JS_ValueToInt32(cx, *vp, &val);
        !           293:                        scan->cfg=(ushort)val;
        !           294:                        break;
        !           295:                case SUB_PROP_LAST_READ:
        !           296:                        JS_ValueToInt32(cx, *vp, (int32*)&scan->last);
        !           297:                        break;
        !           298:        }
        !           299: 
        !           300:        return(JS_TRUE);
        !           301: }
        !           302: 
        !           303: static struct JSPropertySpec js_sub_properties[] = {
        !           304: /*              name                           ,tinyid         ,flags  */
        !           305: 
        !           306:        {       "scan_ptr"      ,SUB_PROP_SCAN_PTR      ,JSPROP_ENUMERATE|JSPROP_SHARED },
        !           307:        {       "scan_cfg"      ,SUB_PROP_SCAN_CFG      ,JSPROP_ENUMERATE|JSPROP_SHARED },
        !           308:        {       "lead_read"     ,SUB_PROP_LAST_READ     ,JSPROP_ENUMERATE|JSPROP_SHARED },
        !           309:        {0}
        !           310: };
        !           311: 
        !           312: 
        !           313: static JSClass js_sub_class = {
        !           314:      "Message Sub-board"       /* name                 */
        !           315:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !           316:        ,JS_PropertyStub                /* addProperty  */
        !           317:        ,JS_PropertyStub                /* delProperty  */
        !           318:        ,js_sub_get                             /* getProperty  */
        !           319:        ,js_sub_set                             /* setProperty  */
        !           320:        ,JS_EnumerateStub               /* enumerate    */
        !           321:        ,JS_ResolveStub                 /* resolve              */
        !           322:        ,JS_ConvertStub                 /* convert              */
        !           323:        ,JS_FinalizeStub                /* finalize             */
        !           324: };
        !           325: 
        !           326: JSObject* DLLCALL js_CreateMsgAreaObject(JSContext* cx, JSObject* parent, scfg_t* cfg
        !           327:                                                                                  ,user_t* user, subscan_t* subscan)
        !           328: {
        !           329:        JSObject*       areaobj;
        !           330:        JSObject*       allgrps;
        !           331:        JSObject*       allsubs;
        !           332:        JSObject*       grpobj;
        !           333:        JSObject*       subobj;
        !           334:        JSObject*       grp_list;
        !           335:        JSObject*       sub_list;
        !           336:        JSString*       js_str;
        !           337:        jsval           val;
        !           338:        jsuint          grp_index;
        !           339:        jsuint          sub_index;
        !           340:        uint            l,d;
        !           341: 
        !           342:        /* Return existing object if it's already been created */
        !           343:        if(JS_GetProperty(cx,parent,"msg_area",&val) && val!=JSVAL_VOID)
        !           344:                areaobj = JSVAL_TO_OBJECT(val);
        !           345:        else
        !           346:                areaobj = JS_DefineObject(cx, parent, "msg_area", NULL
        !           347:                                                                        , NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
        !           348: 
        !           349:        if(areaobj==NULL)
        !           350:                return(NULL);
        !           351: 
        !           352: #ifdef _DEBUG
        !           353:        js_DescribeSyncObject(cx,areaobj,"Message Areas",310);
        !           354: #endif
        !           355: 
        !           356:        /* msg_area.grp[] */
        !           357:        if((allgrps=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
        !           358:                return(NULL);
        !           359: 
        !           360:        val=OBJECT_TO_JSVAL(allgrps);
        !           361:        if(!JS_SetProperty(cx, areaobj, "grp", &val))
        !           362:                return(NULL);
        !           363: 
        !           364:        /* msg_area.sub[] */
        !           365:        if((allsubs=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
        !           366:                return(NULL);
        !           367: 
        !           368:        val=OBJECT_TO_JSVAL(allsubs);
        !           369:        if(!JS_SetProperty(cx, areaobj, "sub", &val))
        !           370:                return(NULL);
        !           371: 
        !           372:        /* msg_area.grp_list[] */
        !           373:        if((grp_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
        !           374:                return(NULL);
        !           375: 
        !           376:        val=OBJECT_TO_JSVAL(grp_list);
        !           377:        if(!JS_SetProperty(cx, areaobj, "grp_list", &val)) 
        !           378:                return(NULL);
        !           379: 
        !           380:        for(l=0;l<cfg->total_grps;l++) {
        !           381: 
        !           382:                if((grpobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL)
        !           383:                        return(NULL);
        !           384: 
        !           385:                grp_index=-1;
        !           386:                if(user==NULL || chk_ar(cfg,cfg->grp[l]->ar,user)) {
        !           387: 
        !           388:                        if(!JS_GetArrayLength(cx, grp_list, &grp_index))
        !           389:                                return(NULL);
        !           390: 
        !           391:                        val=OBJECT_TO_JSVAL(grpobj);
        !           392:                        if(!JS_SetElement(cx, grp_list, grp_index, &val))
        !           393:                                return(NULL);
        !           394:                }
        !           395: 
        !           396:                /* Add as property (associative array element) */
        !           397:                if(!JS_DefineProperty(cx, allgrps, cfg->grp[l]->sname, val
        !           398:                        ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
        !           399:                        return(NULL);
        !           400: 
        !           401:                val=INT_TO_JSVAL(grp_index);
        !           402:                if(!JS_SetProperty(cx, grpobj, "index", &val))
        !           403:                        return(NULL);
        !           404: 
        !           405:                val=INT_TO_JSVAL(l);
        !           406:                if(!JS_SetProperty(cx, grpobj, "number", &val))
        !           407:                        return(NULL);
        !           408: 
        !           409:                if((js_str=JS_NewStringCopyZ(cx, cfg->grp[l]->sname))==NULL)
        !           410:                        return(NULL);
        !           411:                val=STRING_TO_JSVAL(js_str);
        !           412:                if(!JS_SetProperty(cx, grpobj, "name", &val))
        !           413:                        return(NULL);
        !           414: 
        !           415:                if((js_str=JS_NewStringCopyZ(cx, cfg->grp[l]->lname))==NULL)
        !           416:                        return(NULL);
        !           417:                val=STRING_TO_JSVAL(js_str);
        !           418:                if(!JS_SetProperty(cx, grpobj, "description", &val))
        !           419:                        return(NULL);
        !           420: 
        !           421:                if((js_str=JS_NewStringCopyZ(cx, cfg->grp[l]->arstr))==NULL)
        !           422:                        return(NULL);
        !           423:                if(!JS_DefineProperty(cx, grpobj, "ars", STRING_TO_JSVAL(js_str)
        !           424:                        ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
        !           425:                        return(NULL);
        !           426: 
        !           427: #ifdef _DEBUG
        !           428:                js_DescribeSyncObject(cx,grpobj,"Message Groups (current user has access to)",310);
        !           429: #endif
        !           430: 
        !           431:                /* sub_list[] */
        !           432:                if((sub_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
        !           433:                        return(NULL);
        !           434: 
        !           435:                val=OBJECT_TO_JSVAL(sub_list);
        !           436:                if(!JS_SetProperty(cx, grpobj, "sub_list", &val)) 
        !           437:                        return(NULL);
        !           438: 
        !           439:                for(d=0;d<cfg->total_subs;d++) {
        !           440:                        if(cfg->sub[d]->grp!=l)
        !           441:                                continue;
        !           442: 
        !           443:                        if((subobj=JS_NewObject(cx, &js_sub_class, NULL, NULL))==NULL)
        !           444:                                return(NULL);
        !           445: 
        !           446:                        if(subscan!=NULL)
        !           447:                                JS_SetPrivate(cx,subobj,&subscan[d]);
        !           448: 
        !           449:                        sub_index=-1;
        !           450: 
        !           451:                        if(user==NULL || chk_ar(cfg,cfg->sub[d]->ar,user)) {
        !           452: 
        !           453:                                if(!JS_GetArrayLength(cx, sub_list, &sub_index))
        !           454:                                        return(NULL);                                                   
        !           455: 
        !           456:                                val=OBJECT_TO_JSVAL(subobj);
        !           457:                                if(!JS_SetElement(cx, sub_list, sub_index, &val))
        !           458:                                        return(NULL);
        !           459:                        }
        !           460: 
        !           461:                        /* Add as property (associative array element) */
        !           462:                        if(!JS_DefineProperty(cx, allsubs, cfg->sub[d]->code, val
        !           463:                                ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
        !           464:                                return(NULL);
        !           465: 
        !           466:                        val=INT_TO_JSVAL(sub_index);
        !           467:                        if(!JS_SetProperty(cx, subobj, "index", &val))
        !           468:                                return(NULL);
        !           469: 
        !           470:                        val=INT_TO_JSVAL(grp_index);
        !           471:                        if(!JS_SetProperty(cx, subobj, "grp_index", &val))
        !           472:                                return(NULL);
        !           473: 
        !           474:                        if(!js_CreateMsgAreaProperties(cx, cfg, subobj, d))
        !           475:                                return(NULL);
        !           476:                        
        !           477:                        if(user==NULL || chk_ar(cfg,cfg->sub[d]->read_ar,user))
        !           478:                                val=BOOLEAN_TO_JSVAL(JS_TRUE);
        !           479:                        else
        !           480:                                val=BOOLEAN_TO_JSVAL(JS_FALSE);
        !           481:                        if(!JS_SetProperty(cx, subobj, "can_read", &val))
        !           482:                                return(NULL);
        !           483: 
        !           484:                        if(user==NULL)
        !           485:                                val=BOOLEAN_TO_JSVAL(JS_TRUE);
        !           486:                        else if(cfg->sub[d]->misc&(SUB_QNET|SUB_FIDO|SUB_PNET|SUB_INET)
        !           487:                                && user->rest&FLAG('N'))                /* network restriction? */
        !           488:                                val=BOOLEAN_TO_JSVAL(JS_FALSE);
        !           489:                        else if(!chk_ar(cfg,cfg->sub[d]->post_ar,user)
        !           490:                                || user->rest&FLAG('P'))                /* post restriction? */
        !           491:                                val=BOOLEAN_TO_JSVAL(JS_FALSE); 
        !           492:                        else
        !           493:                                val=BOOLEAN_TO_JSVAL(JS_TRUE);
        !           494:                        if(!JS_SetProperty(cx, subobj, "can_post", &val))
        !           495:                                return(NULL);
        !           496: 
        !           497:                        if(user!=NULL &&
        !           498:                                (user->level>=SYSOP_LEVEL ||
        !           499:                                        (cfg->sub[d]->op_ar[0]!=0 && chk_ar(cfg,cfg->sub[d]->op_ar,user))))
        !           500:                                val=BOOLEAN_TO_JSVAL(JS_TRUE);
        !           501:                        else
        !           502:                                val=BOOLEAN_TO_JSVAL(JS_FALSE);
        !           503:                        if(!JS_SetProperty(cx, subobj, "is_operator", &val))
        !           504:                                return(NULL);
        !           505: 
        !           506:                        if(cfg->sub[d]->mod_ar[0]!=0 && user!=NULL 
        !           507:                                && chk_ar(cfg,cfg->sub[d]->mod_ar,user))
        !           508:                                val=BOOLEAN_TO_JSVAL(JS_TRUE);
        !           509:                        else
        !           510:                                val=BOOLEAN_TO_JSVAL(JS_FALSE);
        !           511:                        if(!JS_SetProperty(cx, subobj, "is_moderated", &val))
        !           512:                                return(NULL);
        !           513: 
        !           514:                        if(!JS_DefineProperties(cx, subobj, js_sub_properties))
        !           515:                                return(NULL);
        !           516: 
        !           517: #ifdef _DEBUG
        !           518:                        js_DescribeSyncObject(cx,subobj,"Message Sub-boards (current user has access to)</h2>"
        !           519:                                "(all properties are <small>READ ONLY</small> except for "
        !           520:                                "<i>scan_ptr</i>, <i>scan_cfg</i>, and <i>last_read</i>)"
        !           521:                                ,310);
        !           522: #endif
        !           523: 
        !           524:                }
        !           525: 
        !           526: #ifdef _DEBUG
        !           527:                js_CreateArrayOfStrings(cx, grpobj, "_property_desc_list", msg_grp_prop_desc, JSPROP_READONLY);
        !           528: #endif
        !           529:        }
        !           530: 
        !           531: #ifdef _DEBUG
        !           532:        js_DescribeSyncObject(cx,allgrps,"Associative array of all groups (use name as index)",312);
        !           533:        JS_DefineProperty(cx,allgrps,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY);
        !           534: #endif
        !           535: 
        !           536: #ifdef _DEBUG
        !           537:        js_DescribeSyncObject(cx,allsubs,"Associative array of all sub-boards (use internal code as index)",311);
        !           538:        JS_DefineProperty(cx,allsubs,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY);
        !           539: #endif
        !           540: 
        !           541:        return(areaobj);
        !           542: }
        !           543: 
        !           544: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.