/***************************************************************************
                          dialog_base.cpp  -  description
                             -------------------
    begin                : Thu Feb 26 2004
    copyright            : (C) 2004 by David Rokhvarg
    email                : davidr@sangoma.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "dialog_base.h"

#define DBG_DIALOG_BASE 1

dialog_base::dialog_base()
{
  Debug(DBG_DIALOG_BASE, ("dialog_base::dialog_base()\n"));
  snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "NOT INITIALIZED");
}

dialog_base::~dialog_base()
{
  Debug(DBG_DIALOG_BASE, ("dialog_base::~dialog_base()\n"));
  //do nothing
}

int dialog_base::set_lxdialog_path(char * lxdialog_path)
{
  Debug(DBG_DIALOG_BASE, ("dialog_base::set_lx_dialog_path()\n"));
  Debug(DBG_DIALOG_BASE, ("lxdialog_path and command line: %s\n", lxdialog_path));

  if(strlen(lxdialog_path) > MAX_PATH_LENGTH){
    printf("dialog_base: lxdialog_path is longer than maximum\n");
    return NO;
  }

  snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "%s", lxdialog_path);
  return YES;
}

//return status of command execution
//YES - command executed successfully
//NO  - command failed
int dialog_base::execute_command_line(OUT int * selection_index)
{
  int sytem_call_status;
  int lxdialog_exit_status=0;
  int rc;

  sytem_call_status = system(lxdialog_path);

  if(WIFEXITED(sytem_call_status)){

    lxdialog_exit_status = WEXITSTATUS(sytem_call_status);

    //Debug(DBG_DIALOG_BASE, ("lxdialog_exit_status: %d\n", lxdialog_exit_status));

    switch(lxdialog_exit_status)
    {
    case SELECTION_0:
    case SELECTION_1:
    case SELECTION_2:
    case 255://if lxdialog returns -1 - may happen On Text Box 'Exit'
      rc = YES;
      break;

    default:
      printf("Invalid lxdialog_exit_status: %d\n", lxdialog_exit_status);
      printf("lx_dialog_path and command line: %s\n", lxdialog_path);
      rc = NO;
    }
  }else{
    //lxdialog crashed or killed
    printf("lxdialog exited abnormally (sytem_call_status: %d).\n",
            sytem_call_status);
    rc = NO;
  }

  *selection_index = lxdialog_exit_status;
  return rc;
}

int dialog_base::open_lxdialog_output_file(char * file_name)
{
  lxdialog_output_file = fopen(file_name, "r+");

  if(lxdialog_output_file == NULL){
    Debug(DBG_DIALOG_BASE, ("Failed to open file '%s'. File does not exist.\n", file_name));
    return NO;
  }
  return YES;
}

//this version reads file line by line
int dialog_base::read_lxdialog_output_file()
{
  int rc = NO;
  int lines_counter;

  lines_counter = 0;
  do{
    fgets(lxdialog_output_string, MAX_PATH_LENGTH, lxdialog_output_file);
    if(!feof(lxdialog_output_file)){
      Debug(DBG_DIALOG_BASE, (lxdialog_output_string));
    }

    //there must be at least 1 line. but not more than 1 line.
    rc = YES;

  }while(!feof(lxdialog_output_file) && lines_counter++ < 2);

  if(lines_counter >= 2){
    printf("Invalid number of lines in lxdialog output file!!\n");
    rc = NO;
  }

  fclose(lxdialog_output_file);

  if(rc == NO){
    Debug(DBG_DIALOG_BASE, ("failed to read_lxdialog_output_file!\n"));
  }

  Debug(DBG_DIALOG_BASE, ("\n"));
  return rc;
}
