/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $mail_message: $has_text, $mail_root;

var $mail_message creator = 0;
var $mail_message delivered = 0;
var $mail_message header = #[];
var $mail_message meta = 0;
var $mail_message readers = [];
var $root created_on = 796268969;
var $root fertile = 1;
var $root flags = ['methods, 'code, 'fertile, 'core, 'variables];
var $root inited = 1;
var $root managed = [$mail_message];
var $root manager = $mail_message;
var $root quota_exempt = 1;

public method .add_reader(): nooverride  {
    arg who;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    readers = readers.union([who]);
};

public method .add_recipient(): nooverride  {
    arg whom;
    var current;
    
    if (!($mail_lib.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]));
};

public method .body() {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return .text();
};

public method .creator() {
    return creator;
};

public method .del_recipient(): nooverride  {
    arg whom;
    var rcpts;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    rcpts = (header['rcpt]).setremove(whom);
    if (!rcpts)
        .destroy();
    else
        header = header.add('rcpt, rcpts);
};

public method .did_read(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    if ($guest in (sender().parents()))
        return;
    readers = setadd(readers, sender());
};

public method .format(): nooverride  {
    arg @metainfo;
    var output, o, h, line, br, sep, i;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    h = .header();
    o = [];
    br = $cml_lib.format_br_tag();
    sep = $cml_lib.format_sep_tag();
    if (metainfo) {
        for i in (meta || [])
            o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag(("I-" + (i[1])) + ":"), $cml_lib.format_td_tag(i[2]))];
    }
    o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("From:"), $cml_lib.format_td_tag($object_lib.get_name(h['from], 'mail_name)))];
    o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("To:"), $cml_lib.format_td_tag(((h['rcpt]).omap($mail_lib, 'mail_name)).to_english()))];
    o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("When:"), $cml_lib.format_td_tag($time.format("%I:%M %p %d-%b-%Y", h['time])))];
    o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("Subject:"), $cml_lib.format_td_tag(h['subj]))];
    output = [$cml_lib.format_table_tag("18%,82%", @o), sep, map line in (.text()) to ([line, br]), sep];
    return $ctext_frob.new_with(output);
};

public method .from(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['from] |) || $no_one;
};

public method .has_read(): nooverride  {
    arg who;
    
    return who in readers;
};

public method .header(): nooverride  {
    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;
};

root method .init_mail_message() {
    header = #[];
    readers = [];
    .set_flags([]);
};

public method .meta(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return meta || [];
};

public method .new_mail(): nooverride  {
    var new, suffix;
    
    // if (!$mail_lib.has_mail_perms(caller()))
    //     (> .perms(sender()) <);
    if (definer() != this())
        throw(~perm, "Only spawn mail from $mail_message.");
    suffix = tosym("mail_" + (.get_obj_suffix()));
    new = (> $sys.spawn_selfmanager(suffix, sender()) <);
    
    // since anybody can create mail, do some tracking..
    new.set_creator(user());
    return new;
};

public method .readers(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return readers;
};

public method .recipients(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['rcpt] |) || [$no_one];
};

public method .send() {
    arg @recips;
    var r, valid, invalid;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    if (delivered)
        throw(~delivered, "This mail has already been delivered.");
    if (!recips)
        recips = .recipients();
    if (((recips.length()) == 1) && ((recips[1]) == $no_one))
        throw(~norcpt, "No recipients specified.");
    valid = [];
    invalid = [];
    for r in (recips) {
        if (r.has_ancestor($mail_list))
            valid += [r];
        else
            invalid += [r];
    }
    if (invalid)
        throw(~invrcpt, "Invalid mail recipients: " + (invalid.mmap('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 += [r];
        }
    }
    delivered = 1;
    return invalid;
};

private method .set_creator() {
    arg who;
    
    creator = who;
};

public method .set_from(): nooverride  {
    arg whom;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('from, whom);
};

public method .set_meta(): nooverride  {
    arg new_meta;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    meta = new_meta;
};

public method .set_recipients(): nooverride  {
    arg whom;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('rcpt, whom);
};

public method .set_subject(): nooverride  {
    arg what;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('subj, what);
};

public method .set_time(): nooverride  {
    arg time;
    
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    header = header.add('time, time);
};

public method .subject(): nooverride  {
    return (| header['subj] |) || "<none>";
};

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

public method .time(): nooverride  {
    if (!($mail_lib.has_mail_perms(caller())))
        (> .perms(sender()) <);
    return (| header['time] |) || 0;
};

root method .uninit_mail_message() {
    var r;
    
    for r in (.recipients())
        (| r.del_mail(this(), (| (.from()) || this() |)) |);
    header = #[];
    readers = [];
};