/
CDC-1.2b/
CDC-1.2b/src/
parent $misc
object $file

var $root dbref 'file
var $root child_index 1
var $root fertile 0
var $root manager $file
var $root owned [$file]
var $root owners [$file]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $file content_type ""
var $file data 0
var $file header 0
var $file filename "Generic File"

method init_file
    (> .perms(caller(), $root) <);
    data = 0;
    header = 0;
    content_type = "text/plain";
.

method uninit_file
    (> .perms(caller(), $root) <);
    data = 0;
    header = 0;
    content_type = "text/plain";
.

method set_header
    arg new_header;
    var type, valid_types;
    
    (> .perms(sender()) <);
    if (type(new_header) != 'list)
        throw(~type, "Header must be a list of strings.");
    header = new_header;
.

method set_data
    arg new_data;
    var type, valid_types;
    
    (> .perms(sender()) <);
    type = type(new_data);
    valid_types = ['list, 'buffer];
    if (!(type in valid_types))
        throw(~type, "Data must be one of: " + ($data.unparse(valid_types)));
    data = new_data;
.

method header
    if (!('parameter in (.is_readable_by(sender()))))
        throw(~perm, ((sender().namef('xref)) + " does not have permission to see parameters on ") + (.namef('xref)));
    return header;
.

method content_type
    return content_type;
.

method set_content_type
    arg type;
    
    (> .perms(sender()) <);
    if (type(type) != 'string)
        throw(~type, "Content-type must be sent as a string.");
    content_type = type;
.

method filename
    arg [args];
    
    if (!args)
        return filename;
    else if ((args[1]) == 'full)
        return ((filename + " (") + (.dbref())) + ")";
.

method set_filename
    arg fname;
    var x;
    
    (> .perms(sender()) <);
    if (type(fname) != 'string)
        throw(~type, ("Filename for " + (.namef('xref))) + " must be submitted as a string.");
    for x in [1 .. strlen(fname)] {
        if ((fname[x]) in "!@#$%^&*()+-=~`'{}[]|/?\"\\,<>;: ")
            throw(~type, "Filenames cannot contain any of: !@#$%^&*()+-=~`'{}[]|/?\"\\,<>;: ");
    }
    filename = fname;
.

method find_file
    arg path;
    var child, found;
    
    if ((!('parameters in (.is_readable_by(sender())))) && (!(sender() in (.parents()))))
        throw(~perm, ((sender().dbref()) + " does not have permission to see the filesystem from ") + (.filename()));
    if (type(path) != 'list)
        path = explode(path, "/");
    if (!path)
        return 0;
    if ((listlen(path) == 1) && ((path[1]) == (.filename())))
        return;
    for child in (.children()) {
        found = child.find_file(sublist(path, 2));
        if (found)
            return found;
    }
    return 0;
.

method generate_html
    arg [args];
    var out;
    
    out = [];
    if ('parameters in (.is_readable_by(sender()))) {
        out = .data();
        if (out && (type(out) != 'buffer))
            out = ["<hr width=50% align=center>", ("<center><b>Filename: " + (.filename())) + "</b></center><P>", @out];
    }
    return (> pass(@args) <) + (out || []);
.

method file_data
    if (!('parameters in (.is_readable_by(sender()))))
        throw(~perm, ((sender().namef('xref)) + " does not have permission to see parameters on ") + (.namef('xref)));
    return data;
.