|
|
1.1 ! root 1: /* js_xtrn_area.c */ ! 2: ! 3: /* Synchronet JavaScript "External Program Area" Object */ ! 4: ! 5: /* $Id: js_xtrn_area.c,v 1.21 2006/12/28 02:44:24 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 2006 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: #ifdef BUILD_JSDOCS ! 43: ! 44: static char* xtrn_sec_prop_desc[] = { ! 45: ! 46: "index into sec_list array (or -1 if not in index) <i>(introduced in v3.12)</i>" ! 47: ,"unique number for this external program section" ! 48: ,"external program section internal code" ! 49: ,"external program section name" ! 50: ,"external program section access requirements" ! 51: ,NULL ! 52: }; ! 53: ! 54: static char* xtrn_prog_prop_desc[] = { ! 55: ! 56: "index into prog_list array (or -1 if not in index) <i>(introduced in v3.12)</i>" ! 57: ,"program number" ! 58: ,"program section index <i>(introduced in v3.12)</i>" ! 59: ,"program section number" ! 60: ,"program section internal code <i>(introduced in v3.12)</i>" ! 61: ,"internal code" ! 62: ,"name" ! 63: ,"command-line" ! 64: ,"clean-up command-line" ! 65: ,"startup directory" ! 66: ,"access requirements" ! 67: ,"execution requirements" ! 68: ,"toggle options (bitfield)" ! 69: ,"drop file type" ! 70: ,"event type (0=none)" ! 71: ,"extra time given to users running this program" ! 72: ,"maximum time allowed in program" ! 73: ,"execution cost (credits to run this program)" ! 74: /* Insert here */ ! 75: ,"user has sufficient access to run this program" ! 76: ,NULL ! 77: }; ! 78: ! 79: static char* event_prop_desc[] = { ! 80: ! 81: "command-line" ! 82: ,"startup directory" ! 83: ,"node number" ! 84: ,"time to execute" ! 85: ,"frequency to execute" ! 86: ,"days of week to execute (bitfield)" ! 87: ,"days of month to execute (bitfield)" ! 88: ,"date/time last run (in time_t format)" ! 89: ,"toggle options (bitfield)" ! 90: ,NULL ! 91: }; ! 92: ! 93: static char* xedit_prop_desc[] = { ! 94: ! 95: "name" ! 96: ,"command-line" ! 97: ,"access requirements" ! 98: ,"toggle options (bitfield)" ! 99: ,"drop file type" ! 100: ,NULL ! 101: }; ! 102: ! 103: #endif ! 104: ! 105: BOOL DLLCALL js_CreateXtrnProgProperties(JSContext* cx, JSObject* obj, xtrn_t* xtrn) ! 106: { ! 107: JSString* js_str; ! 108: ! 109: if((js_str=JS_NewStringCopyZ(cx, xtrn->code))==NULL) ! 110: return(FALSE); ! 111: if(!JS_DefineProperty(cx, obj, "code", STRING_TO_JSVAL(js_str) ! 112: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 113: return(FALSE); ! 114: ! 115: if((js_str=JS_NewStringCopyZ(cx, xtrn->name))==NULL) ! 116: return(FALSE); ! 117: if(!JS_DefineProperty(cx, obj, "name", STRING_TO_JSVAL(js_str) ! 118: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 119: return(FALSE); ! 120: ! 121: if((js_str=JS_NewStringCopyZ(cx, xtrn->cmd))==NULL) ! 122: return(FALSE); ! 123: if(!JS_DefineProperty(cx, obj, "cmd", STRING_TO_JSVAL(js_str) ! 124: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 125: return(FALSE); ! 126: ! 127: if((js_str=JS_NewStringCopyZ(cx, xtrn->clean))==NULL) ! 128: return(FALSE); ! 129: if(!JS_DefineProperty(cx, obj, "clean_cmd", STRING_TO_JSVAL(js_str) ! 130: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 131: return(FALSE); ! 132: ! 133: if((js_str=JS_NewStringCopyZ(cx, xtrn->path))==NULL) ! 134: return(FALSE); ! 135: if(!JS_DefineProperty(cx, obj, "startup_dir", STRING_TO_JSVAL(js_str) ! 136: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 137: return(FALSE); ! 138: ! 139: if((js_str=JS_NewStringCopyZ(cx, xtrn->arstr))==NULL) ! 140: return(FALSE); ! 141: if(!JS_DefineProperty(cx, obj, "ars", STRING_TO_JSVAL(js_str) ! 142: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 143: return(FALSE); ! 144: ! 145: if((js_str=JS_NewStringCopyZ(cx, xtrn->run_arstr))==NULL) ! 146: return(FALSE); ! 147: if(!JS_DefineProperty(cx, obj, "execution_ars", STRING_TO_JSVAL(js_str) ! 148: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 149: return(FALSE); ! 150: ! 151: if(!JS_DefineProperty(cx, obj, "settings", INT_TO_JSVAL(xtrn->misc) ! 152: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 153: return(FALSE); ! 154: ! 155: if(!JS_DefineProperty(cx, obj, "type", INT_TO_JSVAL(xtrn->type) ! 156: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 157: return(FALSE); ! 158: ! 159: if(!JS_DefineProperty(cx, obj, "event", INT_TO_JSVAL(xtrn->event) ! 160: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 161: return(FALSE); ! 162: ! 163: if(!JS_DefineProperty(cx, obj, "textra", INT_TO_JSVAL(xtrn->textra) ! 164: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 165: return(FALSE); ! 166: ! 167: if(!JS_DefineProperty(cx, obj, "max_time", INT_TO_JSVAL(xtrn->maxtime) ! 168: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 169: return(FALSE); ! 170: ! 171: if(!JS_DefineProperty(cx, obj, "cost", INT_TO_JSVAL(xtrn->cost) ! 172: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 173: return(FALSE); ! 174: ! 175: #ifdef BUILD_JSDOCS ! 176: js_CreateArrayOfStrings(cx, obj, "_property_desc_list", xtrn_prog_prop_desc, JSPROP_READONLY); ! 177: #endif ! 178: ! 179: return(TRUE); ! 180: } ! 181: ! 182: ! 183: JSObject* DLLCALL js_CreateXtrnAreaObject(JSContext* cx, JSObject* parent, scfg_t* cfg ! 184: ,user_t* user) ! 185: { ! 186: JSObject* areaobj; ! 187: JSObject* allsec; ! 188: JSObject* allprog; ! 189: JSObject* secobj; ! 190: JSObject* progobj; ! 191: JSObject* eventobj; ! 192: JSObject* event_array; ! 193: JSObject* xeditobj; ! 194: JSObject* xedit_array; ! 195: JSObject* sec_list; ! 196: JSObject* prog_list; ! 197: JSString* js_str; ! 198: jsval val; ! 199: jsuint sec_index; ! 200: jsuint prog_index; ! 201: uint l,d; ! 202: ! 203: /* Return existing object if it's already been created */ ! 204: if(JS_GetProperty(cx,parent,"xtrn_area",&val) && val!=JSVAL_VOID) ! 205: areaobj = JSVAL_TO_OBJECT(val); ! 206: else ! 207: areaobj = JS_DefineObject(cx, parent, "xtrn_area", NULL ! 208: , NULL, JSPROP_ENUMERATE|JSPROP_READONLY); ! 209: ! 210: if(areaobj==NULL) ! 211: return(NULL); ! 212: ! 213: #ifdef BUILD_JSDOCS ! 214: js_DescribeSyncObject(cx,areaobj,"External Program Areas",310); ! 215: #endif ! 216: ! 217: /* xtrn_area.sec[] */ ! 218: if((allsec=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) ! 219: return(NULL); ! 220: ! 221: val=OBJECT_TO_JSVAL(allsec); ! 222: if(!JS_SetProperty(cx, areaobj, "sec", &val)) ! 223: return(NULL); ! 224: ! 225: /* xtrn_area.prog[] */ ! 226: if((allprog=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) ! 227: return(NULL); ! 228: ! 229: val=OBJECT_TO_JSVAL(allprog); ! 230: if(!JS_SetProperty(cx, areaobj, "prog", &val)) ! 231: return(NULL); ! 232: ! 233: /* xtrn_area.sec_list[] */ ! 234: if((sec_list=JS_NewArrayObject(cx, 0, NULL))==NULL) ! 235: return(NULL); ! 236: ! 237: val=OBJECT_TO_JSVAL(sec_list); ! 238: if(!JS_SetProperty(cx, areaobj, "sec_list", &val)) ! 239: return(NULL); ! 240: ! 241: for(l=0;l<cfg->total_xtrnsecs;l++) { ! 242: ! 243: if((secobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) ! 244: return(NULL); ! 245: ! 246: sec_index=-1; ! 247: if(user==NULL || chk_ar(cfg,cfg->xtrnsec[l]->ar,user)) { ! 248: ! 249: if(!JS_GetArrayLength(cx, sec_list, &sec_index)) ! 250: return(NULL); ! 251: ! 252: val=OBJECT_TO_JSVAL(secobj); ! 253: if(!JS_SetElement(cx, sec_list, sec_index, &val)) ! 254: return(NULL); ! 255: } ! 256: ! 257: /* Add as property (associative array element) */ ! 258: if(!JS_DefineProperty(cx, allsec, cfg->xtrnsec[l]->code, val ! 259: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) ! 260: return(NULL); ! 261: ! 262: val=INT_TO_JSVAL(sec_index); ! 263: if(!JS_SetProperty(cx, secobj, "index", &val)) ! 264: return(NULL); ! 265: ! 266: val=INT_TO_JSVAL(l); ! 267: if(!JS_SetProperty(cx, secobj, "number", &val)) ! 268: return(NULL); ! 269: ! 270: if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->code))==NULL) ! 271: return(NULL); ! 272: val=STRING_TO_JSVAL(js_str); ! 273: if(!JS_SetProperty(cx, secobj, "code", &val)) ! 274: return(NULL); ! 275: ! 276: if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->name))==NULL) ! 277: return(NULL); ! 278: val=STRING_TO_JSVAL(js_str); ! 279: if(!JS_SetProperty(cx, secobj, "name", &val)) ! 280: return(NULL); ! 281: ! 282: if((js_str=JS_NewStringCopyZ(cx, cfg->xtrnsec[l]->arstr))==NULL) ! 283: return(NULL); ! 284: val=STRING_TO_JSVAL(js_str); ! 285: if(!JS_SetProperty(cx, secobj, "ars", &val)) ! 286: return(NULL); ! 287: ! 288: /* prog_list[] */ ! 289: if((prog_list=JS_NewArrayObject(cx, 0, NULL))==NULL) ! 290: return(NULL); ! 291: ! 292: val=OBJECT_TO_JSVAL(prog_list); ! 293: if(!JS_SetProperty(cx, secobj, "prog_list", &val)) ! 294: return(NULL); ! 295: ! 296: #ifdef BUILD_JSDOCS ! 297: js_DescribeSyncObject(cx,secobj,"Online Program (door) Sections (current user has access to)",310); ! 298: #endif ! 299: ! 300: for(d=0;d<cfg->total_xtrns;d++) { ! 301: if(cfg->xtrn[d]->sec!=l) ! 302: continue; ! 303: ! 304: if((progobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) ! 305: return(NULL); ! 306: ! 307: prog_index=-1; ! 308: if((user==NULL || chk_ar(cfg,cfg->xtrn[d]->ar,user)) ! 309: && !(cfg->xtrn[d]->event && cfg->xtrn[d]->misc&EVENTONLY)) { ! 310: ! 311: if(!JS_GetArrayLength(cx, prog_list, &prog_index)) ! 312: return(NULL); ! 313: ! 314: val=OBJECT_TO_JSVAL(progobj); ! 315: if(!JS_SetElement(cx, prog_list, prog_index, &val)) ! 316: return(NULL); ! 317: } ! 318: ! 319: /* Add as property (associative array element) */ ! 320: if(!JS_DefineProperty(cx, allprog, cfg->xtrn[d]->code, val ! 321: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) ! 322: return(NULL); ! 323: ! 324: val=INT_TO_JSVAL(prog_index); ! 325: if(!JS_SetProperty(cx, progobj, "index", &val)) ! 326: return(NULL); ! 327: ! 328: val=INT_TO_JSVAL(d); ! 329: if(!JS_SetProperty(cx, progobj, "number", &val)) ! 330: return(NULL); ! 331: ! 332: val=INT_TO_JSVAL(sec_index); ! 333: if(!JS_SetProperty(cx, progobj, "sec_index", &val)) ! 334: return(NULL); ! 335: ! 336: val=INT_TO_JSVAL(l); ! 337: if(!JS_SetProperty(cx, progobj, "sec_number", &val)) ! 338: return(NULL); ! 339: ! 340: val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,cfg->xtrnsec[l]->code)); ! 341: if(!JS_SetProperty(cx, progobj, "sec_code", &val)) ! 342: return(NULL); ! 343: ! 344: if(!js_CreateXtrnProgProperties(cx, progobj, cfg->xtrn[d])) ! 345: return(NULL); ! 346: ! 347: if(user==NULL || chk_ar(cfg,cfg->xtrn[d]->run_ar,user)) ! 348: val=JSVAL_TRUE; ! 349: else ! 350: val=JSVAL_FALSE; ! 351: if(!JS_SetProperty(cx, progobj, "can_run", &val)) ! 352: return(NULL); ! 353: ! 354: #ifdef BUILD_JSDOCS ! 355: js_DescribeSyncObject(cx,progobj,"Online External Programs (doors) (current user has access to)",310); ! 356: #endif ! 357: } ! 358: ! 359: #ifdef BUILD_JSDOCS ! 360: js_CreateArrayOfStrings(cx, secobj, "_property_desc_list", xtrn_sec_prop_desc, JSPROP_READONLY); ! 361: #endif ! 362: ! 363: } ! 364: ! 365: #ifdef BUILD_JSDOCS ! 366: ! 367: js_DescribeSyncObject(cx,allsec,"Associative array of all external program sections (use internal code as index)",312); ! 368: JS_DefineProperty(cx,allsec,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); ! 369: ! 370: js_DescribeSyncObject(cx,allprog,"Associative array of all external programs (use internal code as index)",311); ! 371: JS_DefineProperty(cx,allprog,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); ! 372: #endif ! 373: ! 374: /* Create event property */ ! 375: if((event_array=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) ! 376: return(NULL); ! 377: ! 378: val=OBJECT_TO_JSVAL(event_array); ! 379: if(!JS_SetProperty(cx, areaobj, "event", &val)) ! 380: return(NULL); ! 381: ! 382: for(l=0;l<cfg->total_events;l++) { ! 383: ! 384: if((eventobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) ! 385: return(NULL); ! 386: ! 387: if(!JS_DefineProperty(cx, event_array, cfg->event[l]->code, OBJECT_TO_JSVAL(eventobj) ! 388: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) ! 389: return(NULL); ! 390: ! 391: if((js_str=JS_NewStringCopyZ(cx, cfg->event[l]->cmd))==NULL) ! 392: return(NULL); ! 393: if(!JS_DefineProperty(cx, eventobj, "cmd", STRING_TO_JSVAL(js_str) ! 394: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 395: return(NULL); ! 396: ! 397: if((js_str=JS_NewStringCopyZ(cx, cfg->event[l]->dir))==NULL) ! 398: return(NULL); ! 399: if(!JS_DefineProperty(cx, eventobj, "startup_dir", STRING_TO_JSVAL(js_str) ! 400: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 401: return(NULL); ! 402: ! 403: if(!JS_DefineProperty(cx, eventobj, "node_num", INT_TO_JSVAL(cfg->event[l]->node) ! 404: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 405: return(NULL); ! 406: ! 407: if(!JS_DefineProperty(cx, eventobj, "time", INT_TO_JSVAL(cfg->event[l]->time) ! 408: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 409: return(NULL); ! 410: ! 411: if(!JS_DefineProperty(cx, eventobj, "freq", INT_TO_JSVAL(cfg->event[l]->freq) ! 412: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 413: return(NULL); ! 414: ! 415: if(!JS_DefineProperty(cx, eventobj, "days", INT_TO_JSVAL(cfg->event[l]->days) ! 416: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 417: return(NULL); ! 418: ! 419: if(!JS_DefineProperty(cx, eventobj, "mdays", INT_TO_JSVAL(cfg->event[l]->mdays) ! 420: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 421: return(NULL); ! 422: ! 423: if(!JS_DefineProperty(cx, eventobj, "last_run", INT_TO_JSVAL(cfg->event[l]->last) ! 424: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 425: return(NULL); ! 426: ! 427: if(!JS_DefineProperty(cx, eventobj, "settings", INT_TO_JSVAL(cfg->event[l]->misc) ! 428: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 429: return(NULL); ! 430: ! 431: #ifdef BUILD_JSDOCS ! 432: js_CreateArrayOfStrings(cx, eventobj, "_property_desc_list", event_prop_desc, JSPROP_READONLY); ! 433: #endif ! 434: } ! 435: ! 436: #ifdef BUILD_JSDOCS ! 437: js_DescribeSyncObject(cx,event_array,"Associative array of all timed events (use internal code as index)",311); ! 438: JS_DefineProperty(cx,event_array,"_assoc_array",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); ! 439: #endif ! 440: ! 441: /* Create editor property */ ! 442: if((xedit_array=JS_NewObject(cx,NULL,NULL,areaobj))==NULL) ! 443: return(NULL); ! 444: ! 445: val=OBJECT_TO_JSVAL(xedit_array); ! 446: if(!JS_SetProperty(cx, areaobj, "editor", &val)) ! 447: return(NULL); ! 448: ! 449: for(l=0;l<cfg->total_xedits;l++) { ! 450: ! 451: if(user!=NULL && !chk_ar(cfg,cfg->xedit[l]->ar,user)) ! 452: continue; ! 453: ! 454: if((xeditobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL) ! 455: return(NULL); ! 456: ! 457: if(!JS_DefineProperty(cx, xedit_array, cfg->xedit[l]->code, OBJECT_TO_JSVAL(xeditobj) ! 458: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE)) ! 459: return(NULL); ! 460: ! 461: if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->name))==NULL) ! 462: return(NULL); ! 463: if(!JS_DefineProperty(cx, xeditobj, "name", STRING_TO_JSVAL(js_str) ! 464: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 465: return(NULL); ! 466: ! 467: if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->rcmd))==NULL) ! 468: return(NULL); ! 469: if(!JS_DefineProperty(cx, xeditobj, "cmd", STRING_TO_JSVAL(js_str) ! 470: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 471: return(NULL); ! 472: ! 473: if((js_str=JS_NewStringCopyZ(cx, cfg->xedit[l]->arstr))==NULL) ! 474: return(NULL); ! 475: if(!JS_DefineProperty(cx, xeditobj, "ars", STRING_TO_JSVAL(js_str) ! 476: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 477: return(NULL); ! 478: ! 479: if(!JS_DefineProperty(cx, xeditobj, "settings", INT_TO_JSVAL(cfg->xedit[l]->misc) ! 480: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 481: return(NULL); ! 482: ! 483: if(!JS_DefineProperty(cx, xeditobj, "type", INT_TO_JSVAL(cfg->xedit[l]->type) ! 484: ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY)) ! 485: return(NULL); ! 486: ! 487: #ifdef BUILD_JSDOCS ! 488: js_CreateArrayOfStrings(cx, xeditobj, "_property_desc_list", xedit_prop_desc, JSPROP_READONLY); ! 489: #endif ! 490: } ! 491: ! 492: #ifdef BUILD_JSDOCS ! 493: js_DescribeSyncObject(cx,xedit_array,"Associative array of all external editors (use internal code as index)",311); ! 494: JS_DefineProperty(cx,xedit_array,"_assoc_array",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY); ! 495: #endif ! 496: ! 497: return(areaobj); ! 498: } ! 499: ! 500: #endif /* JAVSCRIPT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.