#ifndef __SGE_ANSWER_H
#define __SGE_ANSWER_H
/*___INFO__MARK_BEGIN__*/
/*************************************************************************
 * 
 *  The Contents of this file are made available subject to the terms of
 *  the Sun Industry Standards Source License Version 1.2
 * 
 *  Sun Microsystems Inc., March, 2001
 * 
 * 
 *  Sun Industry Standards Source License Version 1.2
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.2 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
 * 
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 * 
 *   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 * 
 *   Copyright: 2001 by Sun Microsystems, Inc.
 * 
 *   All Rights Reserved.
 * 
 ************************************************************************/
/*___INFO__MARK_END__*/

#include "sge_answer_AN_L.h"

typedef enum {
   ANSWER_QUALITY_CRITICAL = 0,
   ANSWER_QUALITY_ERROR = 1,
   ANSWER_QUALITY_WARNING = 2,
   ANSWER_QUALITY_INFO = 3,
   ANSWER_QUALITY_END = 4  /* needs to be last element */
} answer_quality_t;

/* 
 * valid values for AN_status 
 */
typedef enum {
   STATUS_OK = 1,            /* everything was fine */
   STATUS_ESEMANTIC,         /* semantic error */
   STATUS_EEXIST,            /* elem does not exist OR it exists for a
                              * "add" request */
   STATUS_EUNKNOWN,          /* unknown error occured */
   STATUS_ENOIMP,            /* command not implemented for target */
   STATUS_ENOKEY,            /* missing key field in case of add,del,mod */
   STATUS_ESYNTAX,           /* syntax error parsing a_source field */
   STATUS_EDENIED2HOST,      /* operation denied to this host */
   STATUS_ENOMGR,            /* operation needs manager privileges */
   STATUS_ENOOPR,            /* operation needs operator privileges */
   STATUS_NOQMASTER,         /* failed to reach sge_qmaster */
   STATUS_NOCOMMD,           /* failed to reach commd */
   STATUS_NOCONFIG,          /* missing dir/conf (cell, common, bootstrap) */
   STATUS_EDISK,             /* disk operation failed */
   STATUS_ENOSUCHUSER,       /* can't resolve user */
   STATUS_NOSUCHGROUP,       /* can't resolve group */
   STATUS_EMALLOC,           /* can't allocate memory */
   STATUS_ENOTOWNER,         /* need to be owner for this operation */
   STATUS_ESUBHLIC,          /* too few submit host licenses */
   STATUS_DENIED,            /* not allowed to do whatever you try */
   STATUS_EVERSION,          /* qmaster GDI version differs from clients
                              * GDI version */
   STATUS_ERROR1,            /* general error 1 */
   STATUS_ERROR2,            /* general error 2 */
   STATUS_ERROR3,            /* general error 3 */
   STATUS_OK_DOAGAIN=24,     /* 
                              * everything was fine but transaction
                              * was not completly finished. 
                              */
   STATUS_NOTOK_DOAGAIN=25   /*
                              * transaction was rejected. Try again later 
                              * (value will be used as return value for
                              * qsub)
                              */
} an_status_t;


bool answer_has_quality(const lListElem *answer, answer_quality_t quality);

void answer_exit_if_not_recoverable(const lListElem *answer);

const char *answer_get_quality_text(const lListElem *answer);

u_long32 answer_get_status(const lListElem *answer);

void answer_print_text(const lListElem *answer, 
                       FILE *stream,
                       const char *prefix,
                       const char *suffix);

void answer_to_dstring(const lListElem *answer, dstring *diag);

void answer_list_to_dstring(const lList *alp, dstring *diag);

bool answer_list_add_sprintf(lList **answer_list, u_long32 status, 
                             answer_quality_t quality, const char *fmt, ...);

bool answer_list_has_quality(lList **answer_list, 
                             answer_quality_t quality);

void answer_list_remove_quality(lList *answer_list, answer_quality_t quality);


bool answer_list_has_status(lList **answer_list, 
                            u_long32 status);

bool answer_list_has_error(lList **answer_list);

void answer_list_on_error_print_or_exit(lList **answer_list, FILE *stream);

int answer_list_print_err_warn(lList **answer_list,
                               const char *critical_prefix,
                               const char *err_prefix,
                               const char *warn_prefix);

bool answer_list_output(lList **answer_list);

bool answer_list_log(lList **answer_list, bool is_free_list, bool show_info);

int answer_list_handle_request_answer_list(lList **answer_list, FILE *stream);

bool answer_list_add(lList **answer_list, const char *text,
                     u_long32 status, answer_quality_t quality);

bool answer_list_add_elem(lList **answer_list, lListElem *answer);

void answer_list_replace(lList **answer_list, lList **new_list);

void answer_list_append_list(lList **answer_list, lList **new_list);

int show_answer(lList *alp);

int show_answer_list(lList *alp);


#endif /* __SGE_ANSWER_H */
