/**************************************************************
 * Copyright (C) 2001 Alex Rozin, Optical Access 
 *
 *                     All Rights Reserved
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notice appear in all copies and that
 * both that copyright notice and this permission notice appear in
 * supporting documentation.
 * 
 * ALEX ROZIN DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 * ALEX ROZIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 ******************************************************************/

#ifndef _row_api_h_included__
#define _row_api_h_included__

/*
 * control tables API section 
 */

typedef enum {
    RMON1_ENTRY_VALID = 1,
    RMON1_ENTRY_CREATE_REQUEST,
    RMON1_ENTRY_UNDER_CREATION,
    RMON1_ENTRY_INVALID
} RMON1_ENTRY_STATUS_T;

#define MAX_OWNERSTRING		128

/*
 * structure for entry of all 'control' tables 
 */
typedef struct tagEntry {
    /*
     * begin of the header 
     */
    struct tagEntry *next;
    void           *table_ptr;  /* do casting to (TABLE_DEFINTION_T*) */
    RMON1_ENTRY_STATUS_T status;
    RMON1_ENTRY_STATUS_T new_status;
    u_long          ctrl_index;
    u_long          timer_id;
    char           *owner;
    char           *new_owner;
    u_char          only_just_created;

    /*
     * end of the header 
     */

    void           *body;
    void           *tmp;
} RMON_ENTRY_T;

typedef int     (ENTRY_CALLBACK_T) (RMON_ENTRY_T *);

typedef struct {
    const char     *name;
    RMON_ENTRY_T   *first;
    u_long          max_number_of_entries;      /* '<0' means without limit */
    u_long          current_number_of_entries;
    ENTRY_CALLBACK_T *ClbkCreate;
    ENTRY_CALLBACK_T *ClbkClone;
    ENTRY_CALLBACK_T *ClbkValidate;
    ENTRY_CALLBACK_T *ClbkActivate;
    ENTRY_CALLBACK_T *ClbkDeactivate;
    ENTRY_CALLBACK_T *ClbkDelete;
    ENTRY_CALLBACK_T *ClbkCopy;
} TABLE_DEFINTION_T;

/*
 * Api prototypes 
 */
void            ROWAPI_init_table(TABLE_DEFINTION_T * table_ptr,
                                  char *name,
                                  u_long max_number_of_entries,
                                  ENTRY_CALLBACK_T * ClbkCreate,
                                  ENTRY_CALLBACK_T * ClbkClone,
                                  ENTRY_CALLBACK_T * ClbkDelete,
                                  ENTRY_CALLBACK_T * ClbkValidate,
                                  ENTRY_CALLBACK_T * ClbkActivate,
                                  ENTRY_CALLBACK_T * ClbkDeactivate,
                                  ENTRY_CALLBACK_T * ClbkCopy);

int             ROWAPI_new(TABLE_DEFINTION_T * table_ptr,
                           u_long ctrl_index);

RMON_ENTRY_T   *ROWAPI_get_clone(TABLE_DEFINTION_T * table_ptr,
                                 u_long ctrl_index, size_t body_size);

void            ROWAPI_delete_clone(TABLE_DEFINTION_T * table_ptr,
                                    u_long ctrl_index);

RMON_ENTRY_T   *ROWAPI_first(TABLE_DEFINTION_T * table_ptr);

RMON_ENTRY_T   *ROWAPI_next(TABLE_DEFINTION_T * table_ptr,
                            u_long prev_index);

RMON_ENTRY_T   *ROWAPI_find(TABLE_DEFINTION_T * table_ptr,
                            u_long ctrl_index);

int             ROWAPI_action_check(TABLE_DEFINTION_T * table_ptr,
                                    u_long ctrl_index);

int             ROWAPI_commit(TABLE_DEFINTION_T * table_ptr,
                              u_long ctrl_index);

RMON_ENTRY_T   *ROWAPI_header_ControlEntry(struct variable *vp, oid * name,
                                           size_t * length, int exact,
                                           size_t * var_len,
                                           TABLE_DEFINTION_T * table_ptr,
                                           void *entry_ptr,
                                           size_t entry_size);

int             ROWAPI_do_another_action(oid * name,
                                         int tbl_first_index_begin,
                                         int action, int *prev_action,
                                         TABLE_DEFINTION_T * table_ptr,
                                         size_t entry_size);

/*
 * data tables API section 
 */

typedef int     (SCROLLER_ENTRY_DESCRUCTOR_T) (void *);

typedef struct nexted_void_t {
    struct nexted_void_t *next;
    u_long          data_index;
} NEXTED_PTR_T;

typedef struct data_scroller {
    u_long          max_number_of_entries;
    u_long          data_requested;
    u_long          data_granted;
    u_long          data_created;       /* number of allocated data entries */
    u_long          data_stored;        /* number of data, currently stored */
    u_long          data_total_number;  /* number of data entries, stored after validation */

    /*
     * these 3 pointers make casting to private (DATA_ENTRY_T*) 
     */
    void           *first_data_ptr;
    NEXTED_PTR_T   *last_data_ptr;
    void           *current_data_ptr;

    size_t          data_size;
    int             (*data_destructor) (struct data_scroller *, void *);
} SCROLLER_T;

int             ROWDATAAPI_init(SCROLLER_T * scrlr,
                                u_long max_number_of_entries,
                                u_long data_requested,
                                size_t data_size,
                                int (*data_destructor) (struct
                                                        data_scroller *,
                                                        void *));

void
                ROWDATAAPI_set_size(SCROLLER_T * scrlr,
                                    u_long data_requested,
                                    u_char do_allocation);

void            ROWDATAAPI_descructor(SCROLLER_T * scrlr);

void           *ROWDATAAPI_locate_new_data(SCROLLER_T * scrlr);

u_long          ROWDATAAPI_get_total_number(SCROLLER_T * scrlr);

RMON_ENTRY_T   *ROWDATAAPI_header_DataEntry(struct variable *vp,
                                            oid * name, size_t * length,
                                            int exact, size_t * var_len,
                                            TABLE_DEFINTION_T * table_ptr,
                                            SCROLLER_T *
                                            (*extract_scroller) (void
                                                                 *body),
                                            size_t data_size,
                                            void *entry_ptr);

#endif                          /* _row_api_h_included__ */
