/
CDC-1.2b/
CDC-1.2b/src/
parent $text
parent $mail_root
object $mail

var $root child_index 18
var $root owners [$mail]
var $root owned [$mail]
var $root fertile 1
var $root inited 1
var $located location $creation
var $has_verbs verbs #[]
var $mail readers []
var $root info []
var $ text []
var $root manager $mail
var $root writable [$mail]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'mail
var $mail header #[]
var $mail delivered 0

method del_recipient
    disallow_overrides;
    arg whom;
    var rcpts;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    rcpts = setremove(header['rcpt], whom);
    if (!rcpts)
        .destroy();
    else
        header = header.add('rcpt, rcpts);
.

method add_recipient
    disallow_overrides;
    arg whom;
    var current;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    current = (| header['rcpt] |) || [];
    if ((| whom in current |))
        throw(~type, "Recipient is already in the list of recipients");
    header = header.add('rcpt, current.union([whom]));
.

method letter
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return dict_add(.header(), 'text, .text());
.

method readers
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return readers;
.

method did_read
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    readers = [@readers, sender()];
.

method set_time
    disallow_overrides;
    arg time;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('time, time);
.

method set_recipients
    disallow_overrides;
    arg whom;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('rcpt, whom);
.

method set_subject
    disallow_overrides;
    arg what;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('subj, what);
.

method set_from
    disallow_overrides;
    arg whom;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = dict_add(header, 'from, whom);
.

method add_reader
    disallow_overrides;
    arg who;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    readers = readers.union([who]);
.

method recipients
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['rcpt] |) || [$no_one];
.

method from
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['from] |) || $no_one;
.

method subject
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['subj] |) || "<none>";
.

method time
    disallow_overrides;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['time] |) || 0;
.

method format
    disallow_overrides;
    var output, names, o, h;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    h = .header();
    output = ["From:    " + ((h['from]).namef('ref))];
    names = ((h['rcpt]).omap($mail_utils, 'mail_name)).to_english();
    output = [@output, "To:      " + names];
    output = [@output, "When:    " + ($time.date(h['time]))];
    output = [@output, "Subject: " + (h['subj])];
    output = [@output, "---", @.text(), "---"];
    return output;
.

method header
    disallow_overrides;
    var h, d;
    
    (> .perms(sender()) <);
    h = #[['from, $no_one], ['rcpt, [$no_one]], ['subj, "<none>"], ['time, 0]];
    for d in (header)
        h = h.add(@d);
    return h;
.

method uninit_mail
    disallow_overrides;
    var r;
    
    (> .perms(caller(), $root) <);
    for r in (.recipients())
        (| r.del_mail(this(), (| (.from()) || this() |)) |);
    header = #[];
    readers = [];
.

method init_mail
    disallow_overrides;
    
    (> .perms(caller(), $root) <);
    header = #[];
    readers = [];
    .set_readable([]);
.

method has_read
    disallow_overrides;
    arg who;
    
    return who in readers;
.

method text
    return (> pass() <) || ["", "(no message)", ""];
.

method send
    arg [recips];
    var r, valid, invalid;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    if (delivered)
        throw(~delivered, "This mail has already been delivered.");
    if (!recips)
        recips = .recipients();
    if ((listlen(recips) == 1) && ((recips[1]) == $no_one))
        throw(~norcpt, "No recipients specified.");
    valid = [];
    invalid = [];
    for r in (recips) {
        if (r.has_ancestor($mail_list))
            valid = [@valid, r];
        else
            invalid = [@invalid, r];
    }
    if (invalid)
        throw(~invrcpt, "Invalid mail recipients: " + (invalid.map('name)), invalid);
    recips = valid;
    invalid = [];
    
    // ok, now that we have that cleared up, lets set pertinent info...
    .set_time(time());
    .set_from(sender());
    
    // and now to finalize the recipients
    for r in (recips) {
        if (r.list_is_sendable_by(sender())) {
            r.add_mail();
            .add_recipient(r);
        } else {
            invalid = [@invalid, r];
        }
    }
    delivered = 1;
    return invalid;
.

method new_mail
    var new;
    
    if (!($mail_utils.has_mail_perms(caller())))
        (> .perms(sender()) <);
    if (definer() != $mail)
        throw(~perm, "Only spawn mail from $mail.");
    new = .spawn();
    new.add_writer(sender());
    new.set_manager(new);
    return new;
.