/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** user.c -- a user object
**
** This object represents a particular user and that user's connection.
**
** 95-Apr-30.  Deathblade.  Created.
*/

#include <security.h>

inherit M_ACCESS;

inherit __DIR__ "user/login";
inherit __DIR__ "user/sw_body";
inherit __DIR__ "user/sw_user";
inherit __DIR__ "user/failures";
inherit __DIR__ "user/inputsys";
inherit __DIR__ "user/userinfo";
inherit __DIR__ "user/messages";
inherit __DIR__ "user/mailbase";
inherit __DIR__ "user/shell";
inherit __DIR__ "user/newsdata";
inherit __DIR__ "user/channel";
inherit __DIR__ "user/misc";
inherit __DIR__ "user/history";

/*
** This users's userid (login id).
*/
private string		userid;


nomask string query_userid()
{
    /*
    ** NOTE: allow this to return 0 so that callers can know that we
    ** are still in the login sequence.
    */
    return userid;
}
protected nomask void set_userid(string new_userid)
{
    userid = new_userid;
}

void remove()
{
    object body = query_body();

    MAILBOX_D->unload_mailbox(query_userid());
    unload_mailer();

    if ( body )
	destruct(body);

    remove_call_out();
    stop_shell();
    destruct();
}

void quit()
{
    object body = query_body();

    if ( body )
	body->quit();

    remove();
}

nomask void save_me()
{
    unguarded(1, (: save_object, LINK_PATH(userid) :));
}

protected nomask void restore_me(string some_userid, int preserve_vars)
{
    unguarded(1, (: restore_object, LINK_PATH(some_userid), preserve_vars :));
}

private nomask void net_dead()
{
    object body = query_body();

    /*
    ** Tell the body about the net death.  The user object should stick
    ** around, though, so we can find it again if the user reconnects.
    ** If there is no body yet, then just torch self.
    */
    if ( body )
    {
	body->net_dead();
	call_out((: remove :), 300);
    }
    else
    {
	remove();
    }
}
