/*
 * Copyright (c) 2000-2001 Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write the Free Software Foundation,
 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <assert.h>
#include <string.h>
#include <uuid/uuid.h>

#include "config.h"

#include "types.h"
#include "mlog.h"
#include "dlog.h"
#include "cldmgr.h"
#include "global.h"
#include "drive.h"

#define PREAMBLEMAX	3
#define QUERYMAX	1
#define CHOICEMAX	2
#define ACKMAX		3
#define POSTAMBLEMAX	3
#define DLOG_TIMEOUT	3600

bool_t
Media_prompt_change(drive_t *drivep)
{
	fold_t fold;
	char question[100];
	char *preamblestr[PREAMBLEMAX];
	size_t preamblecnt;
	char *querystr[QUERYMAX];
	size_t querycnt;
	char *choicestr[CHOICEMAX];
	size_t choicecnt;
	char *ackstr[ACKMAX];
	size_t ackcnt;
	char *postamblestr[POSTAMBLEMAX];
	size_t postamblecnt;
	ix_t doix;
	ix_t dontix;
	ix_t responseix;
	ix_t sigintix;

retry:
	preamblecnt = 0;
	fold_init(fold, _("change media dialog"), '=');
	preamblestr[preamblecnt++ ] = "\n";
	preamblestr[preamblecnt++] = fold;
	preamblestr[preamblecnt++ ] = "\n\n";
	assert(preamblecnt <= PREAMBLEMAX);
	dlog_begin(preamblestr, preamblecnt);

	/* query: ask if media changed or declined
	 */
	sprintf(question, _(
		 "please change media in "
		 "drive %u\n"),
		 (unsigned int)drivep->d_index);
	querycnt = 0;
	querystr[querycnt++] = question;
	assert(querycnt <= QUERYMAX);
	choicecnt = 0;
	dontix = choicecnt;
	choicestr[choicecnt++ ] = _("media change declined");
	doix = choicecnt;
	choicestr[choicecnt++ ] = _("media changed");
	assert(choicecnt <= CHOICEMAX);
	sigintix = IXMAX - 1;

	responseix = dlog_multi_query(querystr,
				       querycnt,
				       choicestr,
				       choicecnt,
				       0,           /* hilitestr */
				       IXMAX,       /* hiliteix */
				       0,           /* defaultstr */
				       doix,        /* defaultix */
				       DLOG_TIMEOUT,
				       dontix,		/* timeout ix */
				       sigintix,	/* sigint ix */
				       dontix,		/* sighup ix */
				       dontix);	/* sigquit ix */
	ackcnt = 0;
	if (responseix == doix) {
		ackstr[ackcnt++ ] = _("examining new media\n");
	} else if (responseix == dontix) {
		ackstr[ackcnt++ ] = _("media change aborted\n");
	} else {
		assert(responseix == sigintix);
		ackstr[ackcnt++ ] = _("keyboard interrupt\n");
	}

	assert(ackcnt <= ACKMAX);
	dlog_multi_ack(ackstr,
			ackcnt);

	postamblecnt = 0;
	fold_init(fold, _("end dialog"), '-');
	postamblestr[postamblecnt++ ] = "\n";
	postamblestr[postamblecnt++] = fold;
	postamblestr[postamblecnt++ ] = "\n\n";
	assert(postamblecnt <= POSTAMBLEMAX);
	dlog_end(postamblestr,
		  postamblecnt);

	if (responseix == sigintix) {
		if (cldmgr_stop_requested()) {
			return BOOL_FALSE;
		}
		sleep(1); /* to allow main thread to begin dialog */
		mlog(MLOG_NORMAL | MLOG_BARE,
		      ""); /* to block until main thread dialog complete */
		sleep(1); /* to allow main thread to request children die */
		if (cldmgr_stop_requested()) {
			return BOOL_FALSE;
		}
		mlog(MLOG_DEBUG,
		      "retrying media change dialog\n");
		goto retry;
	}

	return responseix == doix;
}
