/*___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_dstring.h"
#include "cl_data_types.h"
#include "cl_commlib.h"
#include "cl_connection_list.h"

#define BUFSIZE              64*1024
#define COMM_HANDLE cl_com_handle_t

#define STDIN_DATA_MSG               0
#define STDOUT_DATA_MSG              1
#define STDERR_DATA_MSG              2
#define WINDOW_SIZE_CTRL_MSG         3
#define REGISTER_CTRL_MSG            4
#define UNREGISTER_CTRL_MSG          5
#define UNREGISTER_RESPONSE_CTRL_MSG 6
#define SETTINGS_CTRL_MSG            7

#define COMM_RETVAL_OK                    0
#define COMM_INVALID_PARAMETER            1
#define COMM_CANT_SETUP_COMMLIB           2
#define COMM_CANT_CLEANUP_COMMLIB         3
#define COMM_CANT_CREATE_HANDLE           4
#define COMM_CANT_SHUTDOWN_HANDLE         5
#define COMM_CANT_OPEN_CONNECTION         6 
#define COMM_CANT_CLOSE_CONNECTION        7
#define COMM_CANT_SETUP_SSL               8
#define COMM_CANT_SET_CONNECTION_PARAM    9
#define COMM_CANT_SET_IGNORE_TIMEOUTS    10
#define COMM_GOT_TIMEOUT                 11
#define COMM_CANT_TRIGGER                12
#define COMM_CANT_SEARCH_ENDPOINT        13
#define COMM_CANT_LOCK_CONNECTION_LIST   14
#define COMM_CANT_UNLOCK_CONNECTION_LIST 15
#define COMM_CANT_RECEIVE_MESSAGE        16
#define COMM_CANT_FREE_MESSAGE           17
#define COMM_CANT_GET_CLIENT_STATUS      18
#define COMM_NO_SELECT_DESCRIPTORS       19
#define COMM_CONNECTION_NOT_FOUND        20
#define COMM_NO_SECURITY_COMPILED_IN     21
#define COMM_SELECT_INTERRUPT            22
#define COMM_ENDPOINT_NOT_UNIQUE         23
#define COMM_ACCESS_DENIED               24
#define COMM_SYNC_RECEIVE_TIMEOUT        25
#define COMM_NO_MESSAGE_AVAILABLE        26

typedef struct recv_message_s {
   unsigned char type;
   char *data;
   struct winsize ws;
   cl_com_message_t *cl_message;
} recv_message_t;


int comm_init_lib(dstring *err_msg);
int comm_cleanup_lib(dstring *err_msg);

int comm_open_connection(bool                 b_server, 
                         bool                 b_secure,
                         const char           *this_component,
                         int                  port, 
                         const char           *other_component,
                         char                 *hostname,
                         const char           *user_name,
                         COMM_HANDLE          **handle, 
                         dstring              *err_msg);

int comm_get_application_error(dstring *err_msg);
int comm_shutdown_connection(COMM_HANDLE *handle,
                             const char *component_name,
                             char *hostname,
                             dstring *err_msg);


int comm_set_connection_param(COMM_HANDLE *handle, int param, int value,
                              dstring *err_msg);
int comm_ignore_timeouts(bool b_ignore, dstring *err_msg);

int comm_wait_for_connection(COMM_HANDLE *handle, const char *component, 
                             int wait_secs, const char **host, dstring *err_msg);
int comm_wait_for_no_connection(COMM_HANDLE *handle, const char *component, 
                                int wait_secs, dstring *err_msg);
int comm_get_connection_count(const COMM_HANDLE *handle, dstring *err_msg);

int comm_trigger(COMM_HANDLE *handle, int synchron, dstring *err_msg);


unsigned long comm_write_message(COMM_HANDLE *handle,
                  const char *unresolved_hostname,
                  const char *component_name,
                  unsigned long component_id,
                  unsigned char *buffer, 
                  unsigned long size, 
                  unsigned char type,
                  dstring *err_msg);

int comm_flush_write_messages(COMM_HANDLE *handle, dstring *err_msg);

int comm_recv_message(COMM_HANDLE *handle, 
                 cl_bool_t b_synchron, 
                 recv_message_t *recv_mess, 
                 dstring *err_msg);

int comm_free_message(recv_message_t *recv_mess, dstring *err_msg);
int check_client_alive(COMM_HANDLE *handle,
                       const char *component_name,
                       char *hostname,
                       dstring *err_msg);