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

/*
** mail.c -- handler for I3's "mail" service
**
** 950126, Deathblade: created
*/

void oob_register_requests(mapping requests);
void oob_register_replies(mapping replies);
void oob_initiate_connection(string target_mudname);
void oob_svc_send(object socket, mixed * message);
private nomask void mail_add_request(string, mixed array);

nosave private mapping mail_requests = ([]);

private nomask void handle_mail(string mudname,
				object socket,
				mixed * message)
{
  string array 	errors;

  errors = IMAIL_D->incoming_mail(mudname, message);
  oob_svc_send(socket, ({"mail-ack", ([ message[1] : errors ])}));
}

private nomask void handle_mail_ack(string mudname,
				    object socket,
				    mixed * message)
{
  IMAIL_D->receive_ack(message[1]);
}

protected nomask int mail_has_outgoing(string mudname)
{
    return sizeof(mail_requests[mudname]) != 0;
}

protected nomask int mail_send_outgoing(string mudname, object socket)
{
    mixed array	requests = mail_requests[mudname];

    if (!sizeof(requests))
    {
	return 0;
    }

    oob_svc_send(socket, requests[0]);
    mail_requests[mudname] = requests[1..];
}

protected nomask void mail_startup()
{
    oob_register_requests(([ "mail" : (: handle_mail :),
				 ]));
    oob_register_replies(([ "mail-ack" : (: handle_mail_ack :),
				]));
}

private nomask void mail_add_request(string mudname, mixed array request)
{
    if ( !mail_requests[mudname] )
      {
	mail_requests[mudname] = request;
      }
    else
      {
	mail_requests[mudname] += request;
      }
}

public nomask void send_mail_message_to_mud(array packet, string mudname)
{
  if(previous_object() != find_object(IMAIL_D))
    {
      error("Fuck no");
    }

  mail_add_request(mudname, ({packet}));
  oob_initiate_connection(mudname);
}
