/************************************************************** * 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, const 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__ */