/* Copyright (c) 1998   Alexander Yukhimets. All rights reserved. */
#include<stdio.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>

#include"axyftp.h"
#include"multi.h"
#include"utils.h"
#include"pixmaps.h"
#include"dirinfo.h"
#include"functions.h"
#include"status.h"
#include"little_dialogs.h"

static void time_to_retry(int sig){
  siglongjmp(jmp_down_env,2);
}

#ifdef BUILD_GTK

#include<gtk/gtk.h>

static void ack_cb(GtkWidget* w,gpointer d){
  gtk_grab_remove(GTK_WIDGET(d));
  gtk_widget_destroy(GTK_WIDGET(d));
  return;
}

static void reconnect_cb(GtkWidget* w,gpointer app){
  GtkWidget *d;
  char * volatile mask;
  volatile int count,ret,total,delay;
  char t[40];
 
  d=(GtkWidget*)app;
  gtk_grab_remove(d);
  gtk_widget_destroy(d);

  appdata.job=1;
  busy_cursor(TRUE);
  appdata.sdata->locdir[0]='\0';
  WXfree(appdata.sdata->remdir);

  appdata.sdata->remdir=WXnewstring(appdata.remote.list->dir);

  appdata.sdata->locmask[0]='\0';
  appdata.sdata->remmask[0]='\0';
  mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));

  total=atoi(appdata.odata->redial);
  if(total<0)total=0;
  delay=atoi(appdata.odata->delay);
  if(delay<0)delay=0;
  count=0;
  while(1){
    start_session(appdata.sdata,mask);
    if(appdata.connected){
      gtk_label_set(GTK_LABEL(GTK_BUTTON(appdata.conbutton)->child),
	  "disconnect");
      signal(SIGALRM,SIG_IGN);
      break;
    } else {
      sprintf(t,"Attempt %d failed\n",count++);
      append_status(t);
      if(count>total){
	signal(SIGALRM,SIG_IGN);
	break;
      }
      if(delay>0){
	signal(SIGALRM,time_to_retry);
	alarm(delay);
	if(!(ret=sigsetjmp(jmp_down_env,1))){
	  appdata.jump_on_cancel=1;
	  LOOP();
	} 
	appdata.jump_on_cancel=0;
      }
      if(appdata.interrupt){
	signal(SIGALRM,SIG_IGN);
	appdata.interrupt=0;
	break;
      }
      sprintf(t,"Attempt %d ...\n",count);
      append_status(t);
    }
  }

  busy_cursor(FALSE);  
  appdata.job=0;
}

GtkWidget* popup_reconnect_dialog(GtkWidget* parent){
  GtkWidget *dialog,*box,*pict,*label,*actions,*button;
  
  dialog=gtk_dialog_new();

  gtk_window_set_title(GTK_WINDOW(dialog),"AxY FTP reconnect");
  /*gtk_window_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE);*/

  box=gtk_hbox_new(FALSE,4);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),box,TRUE,TRUE,6);
  gtk_widget_show(box);

  pict=gtk_pixmap_new(question_xpm,questmask_xpm);
  gtk_box_pack_start(GTK_BOX(box),pict,FALSE,FALSE,0);
  gtk_widget_show(pict);

  label=gtk_label_new("Connection lost. Reconnect?");
  gtk_box_pack_start(GTK_BOX(box),label,TRUE,TRUE,6);
  gtk_widget_show(label);

  actions=gtk_hbox_new(TRUE,6);
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),actions);
  gtk_widget_show(actions);

  label=gtk_alignment_new(0.5,0.5,0,0);
  gtk_box_pack_start(GTK_BOX(actions),label,TRUE,TRUE,4);
  gtk_widget_show(label);

  button=gtk_button_new_with_label(" Yes ");
  gtk_container_add(GTK_CONTAINER(label),button);
  gtk_widget_show(button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
      GTK_SIGNAL_FUNC(reconnect_cb),(gpointer)dialog);

  label=gtk_alignment_new(0.5,0.5,0,0);
  gtk_box_pack_start(GTK_BOX(actions),label,TRUE,TRUE,4);
  gtk_widget_show(label);

  button=gtk_button_new_with_label(" No ");
  gtk_container_add(GTK_CONTAINER(label),button);
  gtk_widget_show(button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
      GTK_SIGNAL_FUNC(ack_cb),(gpointer)dialog);

  gtk_widget_show(dialog);
  gtk_grab_add(dialog);

  return dialog;
}
  
GtkWidget* popup_error_dialog(GtkWidget* parent,char* message){
  GtkWidget *dialog,*box,*pict,*label,*actions,*button;
  
  dialog=gtk_dialog_new();
  gtk_window_set_title(GTK_WINDOW(dialog),"AxY FTP error");
  /*gtk_window_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE);*/

  box=gtk_hbox_new(FALSE,4);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),box,TRUE,TRUE,6);
  gtk_widget_show(box);

  pict=gtk_pixmap_new(error_xpm,errmask_xpm);
  gtk_box_pack_start(GTK_BOX(box),pict,FALSE,FALSE,0);
  gtk_widget_show(pict);

  label=gtk_label_new(message);
  gtk_box_pack_start(GTK_BOX(box),label,TRUE,TRUE,6);
  gtk_widget_show(label);

  actions=gtk_hbox_new(TRUE,6);
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),actions);
  gtk_widget_show(actions);

  label=gtk_alignment_new(0.5,0.5,0,0);
  gtk_box_pack_start(GTK_BOX(actions),label,TRUE,TRUE,4);
  gtk_widget_show(label);

  button=gtk_button_new_with_label(" OK ");
  gtk_container_add(GTK_CONTAINER(label),button);
  gtk_widget_show(button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
      GTK_SIGNAL_FUNC(ack_cb),(gpointer)dialog);

  gtk_widget_show(dialog);
  gtk_grab_add(dialog);

  return dialog;
}

GtkWidget* popup_warning_dialog(GtkWidget* parent,char* message){
  GtkWidget *dialog,*box,*pict,*label,*actions,*button;
  
  dialog=gtk_dialog_new();
  gtk_window_set_title(GTK_WINDOW(dialog),"AxY FTP warning");
  /*gtk_window_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE);*/

  box=gtk_hbox_new(FALSE,4);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),box,TRUE,TRUE,6);
  gtk_widget_show(box);

  pict=gtk_pixmap_new(warning_xpm,warnmask_xpm);
  gtk_box_pack_start(GTK_BOX(box),pict,FALSE,FALSE,0);
  gtk_widget_show(pict);

  label=gtk_label_new(message);
  gtk_box_pack_start(GTK_BOX(box),label,TRUE,TRUE,6);
  gtk_widget_show(label);

  actions=gtk_hbox_new(TRUE,6);
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),actions);
  gtk_widget_show(actions);

  label=gtk_alignment_new(0.5,0.5,0,0);
  gtk_box_pack_start(GTK_BOX(actions),label,TRUE,TRUE,4);
  gtk_widget_show(label);

  button=gtk_button_new_with_label(" OK ");
  gtk_container_add(GTK_CONTAINER(label),button);
  gtk_widget_show(button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
      GTK_SIGNAL_FUNC(ack_cb),(gpointer)dialog);

  gtk_widget_show(dialog);
  gtk_grab_add(dialog);

  return dialog;
}

#elif defined BUILD_MOTIF

#include<Xm/Xm.h>
#include<Xm/TextF.h>
#include<Xm/MessageB.h>
#include<Xm/SelectioB.h>

static void ack_cb(Widget w,XtPointer app,XtPointer call){
  XtDestroyWidget(XtParent(w));
  return;
}

static void reconnect_cb(Widget w,XtPointer app,XtPointer call){
  int act;
  char* volatile mask;
  volatile int count,ret,total,delay;
  char t[40];
 
  act=(int)app;
  XtDestroyWidget(XtParent(w));

  if(act){
    appdata.job=1;
    busy_cursor(True);
    appdata.sdata->locdir[0]='\0';
    XtFree(appdata.sdata->remdir);

    appdata.sdata->remdir=XtNewString(appdata.remote.list->dir);

    appdata.sdata->locmask[0]='\0';
    appdata.sdata->remmask[0]='\0';
    mask=XmTextFieldGetString(appdata.remote.text);

    total=atoi(appdata.odata->redial);
    if(total<0)total=0;
    delay=atoi(appdata.odata->delay);
    if(delay<0)delay=0;
    count=0;
    while(1){
      start_session(appdata.sdata,mask);
      if(appdata.connected){
	XmString l;
	l=XmStringCreateLocalized("disconnect");
	XtVaSetValues(appdata.conbutton,XmNlabelString,l,NULL);
	XmStringFree(l);
	signal(SIGALRM,SIG_IGN);
	break;
      } else {
	sprintf(t,"Attempt %d failed\n",count++);
	append_status(t);
	if(count>total){
	  signal(SIGALRM,SIG_IGN);
	  break;
	}
	if(delay>0){
	  signal(SIGALRM,time_to_retry);
	  alarm(delay);
	  if(!(ret=sigsetjmp(jmp_down_env,1))){
	    appdata.jump_on_cancel=1;
	    LOOP();
	  } 
	  appdata.jump_on_cancel=0;
	}
	if(appdata.interrupt){
	  signal(SIGALRM,SIG_IGN);
	  appdata.interrupt=0;
	  break;
	}
	sprintf(t,"Attempt %d ...\n",count);
	append_status(t);
      }
    }
   
    XtFree(mask);
    busy_cursor(False);
    appdata.job=0;
  }
}

Widget popup_reconnect_dialog(Widget parent){
  Widget dialog,button;
  XmString xms,yes,no;
  Arg args[10];
  Cardinal n;
  xms=XmStringCreateLocalized("Connection lost. Reconnect?");
  yes=XmStringCreateLocalized("Yes");
  no=XmStringCreateLocalized("No");


  n=0;
  XtSetArg(args[n],XmNtitle,"AxY FTP reconnect");n++;
  XtSetArg(args[n],XmNokLabelString,yes);n++;
  XtSetArg(args[n],XmNcancelLabelString,no);n++;
  XtSetArg(args[n],XmNmessageString,xms);n++;
  XtSetArg(args[n],XmNmessageAlignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL);n++;
  dialog=XmCreateQuestionDialog(parent,"reconnect",args,n);
  XtAddCallback(dialog,XmNokCallback,reconnect_cb,(XtPointer)1);
  XtAddCallback(dialog,XmNcancelCallback,reconnect_cb,(XtPointer)0);
  
  button=XmMessageBoxGetChild(dialog,XmDIALOG_HELP_BUTTON);
  XtUnmanageChild(button);

  XtManageChild(dialog);
  
  XmStringFree(yes);
  XmStringFree(no);
  XmStringFree(xms);
  return dialog;
}
  
Widget popup_error_dialog(Widget parent,char* message){
  Widget dialog,button;
  XmString xms;
  Arg args[4];
  Cardinal n;
  
  xms=XmStringCreateLocalized(message);

  n=0;
  XtSetArg(args[n],XmNtitle,"AxY FTP error");n++;
  XtSetArg(args[n],XmNmessageString,xms);n++;
  XtSetArg(args[n],XmNmessageAlignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL);n++;
  dialog=XmCreateErrorDialog(parent,"error",args,n);
  XtAddCallback(dialog,XmNokCallback,ack_cb,NULL);
  
  button=XmMessageBoxGetChild(dialog,XmDIALOG_HELP_BUTTON);
  XtUnmanageChild(button);
  button=XmMessageBoxGetChild(dialog,XmDIALOG_CANCEL_BUTTON);
  XtUnmanageChild(button);

  XtManageChild(dialog);
  XmStringFree(xms);

  return dialog;
}

Widget popup_warning_dialog(Widget parent,char* message){
  Widget dialog,button;
  XmString xms;
  Arg args[4];
  Cardinal n;
  
  xms=XmStringCreateLocalized(message);

  n=0;
  XtSetArg(args[n],XmNtitle,"AxY FTP warning");n++;
  XtSetArg(args[n],XmNmessageString,xms);n++;
  XtSetArg(args[n],XmNmessageAlignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL);n++;
  dialog=XmCreateWarningDialog(parent,"info",args,n);
  XtAddCallback(dialog,XmNokCallback,ack_cb,NULL);
  
  button=XmMessageBoxGetChild(dialog,XmDIALOG_HELP_BUTTON);
  XtUnmanageChild(button);
  button=XmMessageBoxGetChild(dialog,XmDIALOG_CANCEL_BUTTON);
  XtUnmanageChild(button);

  XtManageChild(dialog);
  XmStringFree(xms);

  return dialog;
}

#else
#error Either BUILD_GTK or BUILD_MOTIF should be defined
#endif


syntax highlighted by Code2HTML, v. 0.9.1