/
CDC-1.2b/
CDC-1.2b/src/
parent $utilities
object $http

var $root dbref 'http
var $root child_index 0
var $root fertile 0
var $root manager $http
var $root owned [$http]
var $root owners [$http]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $http errors #[[400, ["<head><title>400 Bad Request</title></head>", "<body>", "<center><h1>400 Bad Request</h1></center>", "%s", "</body>"]], [403, ["<head><title>403 Permission Denied</title></head>", "<body>", "<center><h1>403 Permission Denied</h1></center>", "%s", "</body>"]], [404, ["<head><title>404 Not Found</title></head>", "<center><h1>404 Not Found</h1></center>", "%s", "</body>"]]]

method set_error
    arg error, lines;
    
    (> .perms(sender(), 'manager) <);
    errors = dict_add(errors, error, lines);
.

method del_error
    arg error, lines;
    
    (> .perms(sender(), 'manager) <);
    errors = dict_del(errors, error);
.

method get_error
    arg error, str;
    var lines, x;
    
    lines = (| errors[error] |) || ["Oops, server just broke."];
    for x in [1 .. listlen(lines)]
        lines = replace(lines, x, strsub(lines[x], "%s", str));
    return lines;
.

method make_href_string
    arg obj, [name];
    var line;
    
    if (!name)
        name = [obj.dbref()];
    line = ("<tt><a href=\"/objects/" + tostr(obj.dbref('symbol))) + "/\">";
    return (line + (name[1])) + "</a></tt>";
.

method bin_show
    arg [args];
    var out, obj;
    
    if (!args)
        return .get_error(400, "Must specify an object");
    obj = (| $object.to_dbref(args[1]) |);
    if (!obj)
        return .get_error(404, ("Unable to find object \"" + (args[1])) + "\"");
    return ["<pre>", @obj.show_in_html(), "</pre>"];
.

method make_method_href
    arg m;
    
    return ((((((("<a href=\"/bin/list_method?" + ((m[1]).dbref())) + ".") + tostr(m[2])) + "()\">") + tostr(m[2])) + "(") + (m[3])) + ")</a>";
.

method make_object_href
    arg obj, [name];
    var line;
    
    if (!name)
        name = [obj.dbref()];
    line = ("<tt><a href=\"/objects/" + tostr(obj.dbref('symbol))) + "/\">";
    return (line + (name[1])) + "</a></tt>";
.

method bin_list_method
    arg [args];
    var ref, str_ref, name, obj, code, anc, out, line, x;
    
    if (!args)
        return .get_error(400, "Must specify a method reference");
    catch any {
        ref = $parse.reference(args[1]);
        name = tosym(ref[2]);
        obj = $object.to_dbref(ref[1]);
        anc = obj.find_method(name);
        code = anc.list_method(name);
        code = .filter_text(code);
        for x in [1 .. listlen(code)]
            line = "    " + (code[x]);
        str_ref = (((obj.dbref()) + ".") + tostr(name)) + "()";
        out = [("<head><title>" + str_ref) + "</title></head>"];
        out = [@out, ("<body><center><h1>" + str_ref) + "</h1></center>"];
        out = [@out, "<hr>", "<pre><code>", "@program " + str_ref];
        out = [@out, @code, ".", "</code></pre>"];
    } with handler {
        switch (error()) {
            case ~methodnf:
                line = (((obj.dbref()) + ".") + tostr(name)) + "()";
                out = $http.get_error(400, line + " not found.");
            default:
                out = $http.get_error(400, (traceback()[1])[2]);
        }
    }
    return out;
.

method bin_who
    arg [args];
    var out, obj;
    
    // will have to spiff this up later.
    out = ["<head><title>Who is connected to the Cold Dark?</title></head>"];
    out = [@out, "<body><pre>", @$code.generate_listing($user_db.connected())];
    return out + ["</pre>"];
.

method filter_text
    arg text;
    var x, line;
    
    // embed's characters ('>' becomes '&gt;' etc)
    for x in [1 .. listlen(text)] {
        line = strsub(text[x], "&", "&amp;");
        line = strsub(line, "<", "&lt;");
        line = strsub(line, ">", "&gt;");
        text = replace(text, x, line);
    }
    return text;
.