/
ColdCore-3.0a8/
ColdCore-3.0a8/src/
new object $page_bin_index: $page;

var $dmi_data descriptions = #[['help, #[['args, #[["node", [[$help_coldcore], [$converters, 'to_help_node, []]]]]]]], ['describe, #[['args, #[["detail", [[""], []]], ["target", [[$the_pit], [$converters, 'to_object, []]]]]]]], ['who, #[['args, #[]]]], ['display, #[['args, #[["target", [[$root], [$converters, 'to_object, []]]], ["methods", [[0], []]], ["vars", [[0], []]], ["description", [[0], []]]]]]], ['object, #[['args, #[["target", [[$root], [$converters, 'to_object, []]]]]]]], ['method, #[['args, #[["target", [[['method, $user, $user, "say_cmd", 0]], [$converters, 'parse_ref, [$foundation, ['method]]]]], ["linenumbers", [[0], [$converters, 'to_boolean, []]]]]]]]];
var $page_bin_index gateways = ["describe", "who", "display", "help", "object", "method"];
var $root created_on = 863765399;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$page_bin_index];
var $root manager = $page_bin_index;

public method ._list_gateways() {
    var out, line, gate;
    
    out = ["<ul>"];
    for gate in (gateways) {
        line = ((("<li><b><a href=\"/bin/" + gate) + "\">") + gate) + "</a></b>";
        out += [line];
    }
    return out + ["</ul>"];
};

public method ._make_display_href() {
    arg obj, @args;
    
    args = args ? (args.join("")) : "";
    return (((("<a href=\"/bin/display?target=" + (obj.objname())) + args) + "\">") + (obj.namef('xref))) + "</a>";
};

public method ._make_method_href() {
    arg m;
    
    return ((((((("<a href=\"/bin/method?target=%%24" + ((m[1]).objname())) + ".") + (m[2])) + "()\">.") + (m[2])) + "(") + (m[3])) + ")</a>";
};

public method ._make_object_href() {
    arg obj;
    
    return ((("<a href=\"/bin/object?target=" + (obj.objname())) + "\">") + (obj.namef('xref))) + "</a>";
};

public method ._make_string_to_display_href() {
    arg obj, @args;
    
    args = args ? (args.join("")) : "";
    return (((("<a href=\"/bin/display?target=" + obj) + args) + "\">") + obj) + "</a>";
};

public method ._show_header_objs() {
    arg objs, what;
    var o, line;
    
    if ((objs.length()) > 1) {
        line = (("<tr><td><b>" + what) + "s</b>:</td><td>") + (._make_object_href(objs[1]));
        for o in (objs.subrange(2))
            line += ", " + (._make_object_href(o));
        line += "</td></tr>";
    } else if ((objs.length()) == 1) {
        line = ((("<tr><td><b>" + what) + "</b>:</td><td>") + (._make_object_href(objs[1]))) + "</td></tr>";
    } else {
        line = ("<tr><td><b>" + what) + "</b>:</td><td>(none)</td></tr>";
    }
    return line;
};

public method ._show_methods() {
    arg obj;
    var methods, types, m, t, out;
    
    types = #[];
    for m in (obj.methods())
        types = types.add_elem(obj.method_access(m), [m] + (obj.method_info(m)));
    
    // hard-listing the types guarantee's their order
    out = [];
    for t in (['root, 'driver, 'frob, 'public, 'protected, 'private]) {
        if (!(types.contains(t)))
            continue;
        out += [(tostr(t).capitalize()) + " methods:"];
        for m in (types[t])
            out += [strfmt("%5l %4r " + (._make_method_href([obj, m[1], m[2]])), $object_lib.parse_method_flags(m[7]), m[5])];
    }
    return out;
};

public method ._show_object() {
    arg obj, what;
    var out, desc;
    
    out = [("<h1>" + (._make_object_href(obj))) + "</h1>"];
    out += ["<table>", ("<tr><td><b>Perms</b>:</td><td>" + (((.flags()).prefix("+")).join())) + "</td></tr>", ("<tr><td><b>Size</b>:</td><td>" + ((obj.size()).to_english())) + " bytes (on disk)</td></tr>", ("<tr><td><b>Manager</b>:</td><td>" + (._make_object_href(obj.manager()))) + "</td></tr>", ._show_header_objs(obj.writers('literal), "Writer"), ._show_header_objs(obj.parents(), "Parent")];
    if (obj.has_ancestor($located))
        out += [("<tr><td><b>Location</b>:</td><td>" + (._make_object_href(obj.location()))) + "</td></tr>"];
    if (obj.help_node())
        out += [((("<tr><td><b>Associated Help</b>:</td><td><a href=\"/bin/help?node=" + (obj.help_node())) + "\">") + (obj.help_node())) + "</a></td></tr>"];
    if (obj.has_ancestor($described)) {
        out += ["<tr><td valign=top><b>Description</b>:</td><td>"];
        if ('description in what) {
            desc = obj.prose();
            out += ["<pre>"];
            switch (type(desc)) {
                case 'frob:
                    out += desc.uncompile();
                case 'list:
                    out += desc;
                case 'string:
                    out += [desc];
            }
            out += ["</pre>"];
        } else {
            out += [((("<a href=\"/bin/display?target=" + obj) + "&") + ((['description] + what).join("=yes&"))) + "=yes\">Display description</a>"];
        }
        out += ["</td></tr>"];
    }
    out += ["</table>"];
    out += ["<p><pre>"];
    if ('methods in what) {
        if (!(obj.has_flag('methods, this())))
            out += ["  ** No permission to list methods **"];
        else
            out += ._show_methods(obj);
    } else {
        out += [((((("  <h3><a href=\"/bin/display?target=" + obj) + "&") + ((['methods] + what).join("=yes&"))) + "=yes\">Display Methods on ") + obj) + "</a></h3>"];
    }
    if ('variables in what) {
        if (!(obj.has_flag('variables, this())))
            out += ["  ** No permission to show variables **"];
        else
            out += ._show_variables(obj);
    } else {
        out += [((((("  <h3><a href=\"/bin/display?target=" + obj) + "&") + ((what + ['vars]).join("=yes&"))) + "=yes\">Display Variables on ") + obj) + "</a></h3>"];
    }
    return out + ["</pre>"];
};

public method ._show_variables() {
    arg obj;
    var parent, out, v;
    
    out = [];
    for parent in (obj.data()) {
        if (valid(parent[1])) {
            out += [(parent[1]) + " variables:"];
            if ((parent[1]).has_flag('variables, this())) {
                for v in (parent[2])
                    out += [(("  " + (v[1])) + ": ") + toliteral(v[2])];
            } else {
                out += ["  ** Permission Denied **"];
            }
        } else {
            out += [($object_lib.get_name(parent[1])) + " variables:"];
            for v in (parent[2])
                out += [(("  " + (v[1])) + ": ") + toliteral(v[2])];
        }
        refresh();
    }
    return out;
};

public method .describe() {
    arg header, info, args;
    var obj, desc, flags, detail, page, body, name;
    
    obj = (| args["target"] |);
    detail = (| args["detail"] |);
    if (detail) {
        detail = $http.decode(detail);
        name = ((obj.name()) + ": ") + detail;
        catch any
            body = (<$ctext_frob, [[(<$format, ["subj", [["level", "2"]], [detail.capitalize()], 'do_subj]>)], #[['this, obj]]]>).append(obj.get_detail(detail));
        with
            body = (header['interface]).response(404, ("No such detail '" + detail) + "'");
    } else {
        name = obj.name();
        body = obj.get_description(#[['actor, $no_one]]);
    }
    return [[@.build_header(header, info, args), body, @.build_footer(header, info, args)]];
};

public method .display() {
    arg header, info, args;
    var out, obj, what, user;
    
    obj = (| args["target"] |);
    what = [];
    if ((| args["vars"] |))
        what = setadd(what, 'variables);
    if ((| args["methods"] |))
        what = setadd(what, 'methods);
    if ((| args["description"] |))
        what = setadd(what, 'description);
    if ($security_lib.check_userdb_with_optional(header['interface]))
        user = (header['interface]).get_info('run_as);
    if (user) {
        if (!("description" in (args['arg_list])))
            what = ((| user.get_setting("www-show-descriptions", $www_preferences) |) || 0) ? setadd(what, 'description) : setremove(what, 'description);
        if (!("methods" in (args['arg_list])))
            what = ((| user.get_setting("www-show-methods", $www_preferences) |) || 0) ? setadd(what, 'methods) : setremove(what, 'methods);
        if (!("vars" in (args['arg_list])))
            what = ((| user.get_setting("www-show-variables", $www_preferences) |) || 0) ? setadd(what, 'variables) : setremove(what, 'variables);
    }
    return [[@.build_header(header, info, args, obj), ._show_object(obj, what), .build_footer(header, info, args)]];
};

public method .generate() {
    arg header, info, args;
    var gate;
    
    return [(header['interface]).response(300, ["Multiple Choices: "] + (._list_gateways()))];
};

public method .help() {
    arg header, info, args;
    var node, head, body, tail, tmp, n, name;
    
    node = (| args["node"] |);
    head = [@.build_header(header, info, args, "Help: " + (node.node_name())), ("<h2 align=center>" + (node.html_node_name('top))) + "</h2><hr size=1 noshade>"];
    body = node.body();
    if (node.group()) {
        tail = "<p><hr size=1 noshade><p align=center>";
        tmp = "";
        for n in (((node.parents())[1]).children()) {
            if (n.nolist())
                continue;
            name = (n.name()).word(1, "|");
            if (n == node)
                tmp += ((tmp ? "| " : "") + name) + " ";
            else if (n.holder())
                tmp += (((tmp ? "| " : "") + "<i>") + name) + "</i> ";
            else
                tmp += (((((tmp ? "| " : "") + "<a href=\"/bin/help?node=") + n) + "\">") + name) + "</a> ";
        }
        if (tmp)
            tail += tmp + "<p>";
    } else {
        tail = "<p>";
    }
    return [[@head, body, tail, @.build_footer(header, info, args)]];
};

public method .method() {
    arg header, info, args;
    var ref, str_ref, name, obj, code, anc, out, line, linenumbers, user, strings, flags;
    
    ref = (| args["target"] |);
    linenumbers = (| args["linenumbers"] |);
    if (!("linenumbers" in (args['arg_list]))) {
        if ($security_lib.check_userdb_with_optional(header['interface])) {
            user = (header['interface]).get_info('run_as);
            linenumbers = (| user.get_setting("www-show-line-num", $www_preferences) |) || 0;
        }
    }
    catch any {
        name = (> tosym(ref[4]) <);
        obj = ref[3];
        anc = obj.find_method(name);
        if ('native in (anc.method_flags(name)))
            code = ["This method is implemented natively within the driver."];
        else
            code = (anc.list_method(name)).mmap('html_escape);
        code = $code_lib.code_to_html(code, obj);
        if (linenumbers)
            code = code.numbered_text();
        str_ref = ((obj + ".") + name) + "()";
        out = [@.build_header(header, info, args, str_ref), (((("<center><h1>" + (._make_string_to_display_href(obj, "&methods=yes"))) + ".") + name) + "()") + "</h1></center>", "<hr size=1 noshade>"];
        strings = linenumbers ? ["no", "off"] : ["yes", "on"];
        out += [strfmt("[<A HREF=\"/bin/method?target=%s&linenumbers=%s\">Turn %s line numbering</A>]", str_ref, @strings)];
        out += ["<blockquote><pre>", @code, "</pre></blockquote>"];
    } with {
        switch (error()) {
            case ~type:
                return [(header['interface]).response(400, ((("Invalid method reference " + obj) + ".") + name) + "()")];
            case ~methodnf:
                line = ((obj + ".") + name) + "()";
                return [(header['interface]).response(400, line + " not found.")];
            default:
                return [(header['interface]).response(400, (traceback()[1])[2])];
        }
    }
    return [out + (.build_footer(header, info, args))];
};

public method .object() {
    arg header, info, args;
    var out, obj, o, line, objs, m;
    
    obj = (| args["target"] |);
    out = [@.build_header(header, info, args, obj.namef('xref)), ("<h1 align=center>" + (._make_display_href(obj, "&methods=1"))) + "</h1>"];
    line = "<p align=center><b>Parent(s)</b>: " + ((| ._make_object_href((obj.parents())[1]) |) || "(none)");
    for o in ((| (obj.parents()).subrange(2) |) || [])
        line += ", " + (._make_object_href(o));
    out += [line + "</p>", "<table>"];
    objs = obj.children();
    if (obj) {
        out += ["<p align=center><b>Children:</b></p>", "<center><table width=300 cellspacing=0 cellpadding=0>", "<tr><td width=25%><b>Name</b></td><td width=25%><b>Perms</b></td><td width=25%><b>Size</b></td><td width=25%><b>Manager</b></td></tr>"];
        for o in (objs) {
            refresh();
            m = o.manager();
            if (!valid(o))
                m = toliteral(m);
            else
                m = ._make_object_href(m);
            out += [((((((("<tr><td>" + (._make_object_href(o))) + "</td><td>") + ($object_lib.see_perms(o, ["", ""]))) + "</td><td>") + ((o.size()).to_english())) + "</td><td>") + m) + "</td></tr>"];
        }
    }
    return [(out + ["</table></center>"]) + (.build_footer(header, info, args))];
};

public method .who() {
    arg headers, info, args;
    var who, namel, names, times, idle, realm, x, cols, out, output, line;
    
    out = (.build_header(headers, info, args, "Connected users to " + ($motd.server_name()))) + [("<center><h2>Connected users to <i>" + ($motd.server_name())) + "</i></h2></center></head><body><pre>"];
    who = $user_db.connected();
    names = who.mmap('hname);
    namel = [];
    for x in (who.mmap('name))
        namel += [x.length()];
    cols = (namel.max()) + 1;
    if (cols < 5)
        cols = 5;
    times = who.mmap('connected_time);
    cols = [cols, (times.element_maxlength()) + 1];
    if ((cols[2]) < 7)
        cols = [cols[1], 7];
    idle = who.mmap('idle_time);
    cols += [(idle.element_maxlength()) + 1];
    if ((cols[3]) < 5)
        cols = cols.replace(3, 5);
    realm = who.mmap('realm_name, "text/html");
    out += [((((("<hr size=1 noshade><b>" + ("Name".pad(cols[1]))) + " ") + ("On for".pad(cols[2]))) + " ") + ("Idle".pad(cols[3]))) + " Location", ((((("----".pad(cols[1])) + " ") + ("------".pad(cols[2]))) + " ") + ("----".pad(cols[3]))) + " --------</b>"];
    for x in [1 .. who.length()] {
        line = ((("<b>" + (names[x])) + "</b>") + ("".pad((cols[1]) - (namel[x])))) + " ";
        line = (((line + "<i>") + (times[x])) + ("".pad((cols[2]) - ((times[x]).length())))) + " ";
        line = (((line + (idle[x])) + "</i>") + ("".pad((cols[3]) - ((idle[x]).length())))) + " ";
        line += realm[x];
        out += [line];
    }
    return [out + (.build_footer(headers, info, args))];
};