#ifndef PROEXTDATA_H
#define PROEXTDATA_H

/* Include Files.
*/
#include        <ProANSI.h>
#include        <ProMdl.h>
#include        <ProConst.h>


PRO_BEGIN_C_DECLS

/*
--------------------------------------------------------------------------------
 Define New typdefs
--------------------------------------------------------------------------------
*/

typedef ProName * ProExtdataNamesList;
typedef int     * ProExtdataIdsList;

/*
--------------------------------------------------------------------------------
 Define New Structures for ProExtdata usage.
-------------------------------------------------------------------------------

<p><b>Note: </b>
      Although class and slot names are individually limited to a length of 
      PRO_NAME_SIZE, they must also have a combined length shorter than 
      PRO_NAME_SIZE. Attempting to use combined names longer than 
      PRO_NAME_SIZE results in an error.
-
*/
typedef struct pro_extdata_class 
{
  ProMdl   p_model;
  ProName  class_name;
  /* int   total_slots; */
} ProExtdataClass;

typedef struct pro_extdata_slot 
{
  ProExtdataClass *p_class;
  ProName         slot_name;
  int             slot_id;
} ProExtdataSlot;


/*
--------------------------------------------------------------------------------
 Define Error Codes.
--------------------------------------------------------------------------------
*/
/*14 Give error codes NEW names.
 */
typedef enum proappdata_error_status
{
	PROEXTDATA_TK_NO_ERROR			=  0,
	PROEXTDATA_TK_INVALID_OBJ_OR_CLASS	= -1,
	PROEXTDATA_TK_CLASS_OR_SLOT_EXISTS	= -2,
	PROEXTDATA_TK_NAMES_TOO_LONG		= -3,
	PROEXTDATA_TK_SLOT_NOT_FOUND		= -4,
	PROEXTDATA_TK_BAD_KEY_BY_FLAG		= -5,
	PROEXTDATA_TK_INVALID_OBJ_TYPE		= -6,
	PROEXTDATA_TK_EMPTY_SLOT		= -7,
	PROEXTDATA_TK_BAD_DATA_ARGS		= -8,
	PROEXTDATA_TK_STREAM_TOO_LARGE		= -9,
	PROEXTDATA_TK_INVALID_SLOT_NAME		= -10,
        PROEXTDATA_TK_ERROR                     = -11,
        PROEXTDATA_TK_MAX_SLOTS_IN_MODEL        = -12
        
} ProExtdataErr;



/* Maximum number of slots that can be added to a given model, in all
   ProExtdata classes.  Checked in ProExtdataSlotCreate() */
#define PRO_EXTDATA_MAX_SLOTS 11800



/*
--------------------------------------------------------------------------------
 Function prototyping for all the Pro/AppData Toolkit API.
--------------------------------------------------------------------------------
*/


extern	ProExtdataErr  ProExtdataInit ( ProMdl   p_model);
/*
    Purpose: Performs the initial setup for the generic application data 
             operation.

    Input Arguments:
        p_model - The model handle

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully performed the setup.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.

*/


extern	ProExtdataErr ProExtdataTerm ( ProMdl   p_model);
/*
    Purpose: Cleans up the setup required for the generic application data 
             operations for the specified model.

    Input Arguments:
        p_model - The model handle

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully performed the 
                                 cleanup.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.

*/



extern	ProExtdataErr	ProExtdataClassRegister
(
	ProMdl		p_model,
	ProName		class_name,
        ProExtdataClass *r_p_extclass
);
/*
    Purpose: Registers a class for the specified model.
             <p><b>Note: </b> Although class and slot names are individually 
             limited to a length of PRO_NAME_SIZE, they must also have a 
             combined length shorter than PRO_NAME_SIZE. Attempting to use 
             combined names longer than PRO_NAME_SIZE results in an error.

    Input Arguments:
        p_model - The model handle
        class_name - The name of the class to register

    Output Arguments:
        r_p_extclass - The handle to the newly registered class

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully registered the 
                                 class.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.
        PROEXTDATA_TK_CLASS_OR_SLOT_EXISTS - The specified class name already 
                                             exists.
        PROEXTDATA_TK_NAMES_TOO_LONG - The specified class name exceeds the 
                                       length PRO_NAME_SIZE.

*/



extern	ProExtdataErr	ProExtdataClassUnregister
(
	ProExtdataClass *p_extclass
);
/*
    Purpose: Unregisters the specified class, if it has been registered.

    Input Arguments:
        p_extclass - The class handle

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully unregistered the 
                                 class.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.

*/



extern	ProExtdataErr	ProExtdataSlotCreate
(
	ProExtdataClass *p_extclass,
	ProName         slot_name,
	ProExtdataSlot  *r_p_extslot
);
/*
    Purpose: Creates a data slot for the specified class.
             <p><b>Note: </b> Although class and slot names are individually 
             limited to a length of PRO_NAME_SIZE, they must also have a 
             combined length shorter than PRO_NAME_SIZE. Attempting to use 
             combined names longer than PRO_NAME_SIZE results in an error.

    Input Arguments:
        p_extclass - The class handle
        slot_name - The name of the data slot to create. Pass NULL to 
                    automatically create a slot with a name related to the next 
                    available id.

    Output Arguments:
        r_p_extslot - The handle to the newly created data slot

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully created the data 
                                 slot.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.
        PROEXTDATA_TK_CLASS_OR_SLOT_EXISTS - The specified slot already exists 
                                             in the specified class.
        PROEXTDATA_TK_NAMES_TOO_LONG - The specified slot or class name exceeds 
                                       the length PRO_NAME_SIZE.
        PROEXTDATA_TK_MAX_SLOTS_IN_MODEL - Model already contains 
                                           PRO_EXTDATA_MAX_SLOTS slots.

*/



extern	ProExtdataErr	ProExtdataSlotWrite
(
	ProExtdataSlot  *p_extslot,
	int             key_by_flag,
	int             data_type,
	int             data_size,
	void            *p_data
);
/*
    Purpose: Writes data to the specified data slot.

    Input Arguments:
        p_extslot - The handle to the data slot.
        key_by_flag - The key-by flag -- either KEY_BY_ID or KEY_BY_NAME.
        data_type - The data type. The valid types are PRO_INTEGER_TYPE, 
                    PRO_DOUBLE_TYPE, PRO_WIDE_STRING_TYPE, PRO_STREAM_TYPE, 
                    PRO_CHAPTER_TYPE. PRO_CHAPTER_TYPE behaves similar to 
                    PRO_STREAM_TYPE but has no data length limit.
        data_size - The size of the data. This argument applies to 
                    PRO_STREAM_TYPE only.
        p_data - The handle to the data to be written in the specified slot.

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully wrote data to the 
                                 data slot.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.
        PROEXTDATA_TK_BAD_KEY_BY_FLAG - The specified <i>key_by_flag</i> is 
                                        invalid.
        PROEXTDATA_TK_SLOT_NOT_FOUND - The specified slot was not found.
        PROEXTDATA_TK_STREAM_TOO_LARGE - The stream data size is greater than 
                                         524288 bytes.
        PROEXTDATA_TK_BAD_DATA_ARGS - The specified <i>data_type</i> is 
                                      invalid.

*/


extern	ProExtdataErr	ProExtdataSlotRead
(
	ProExtdataSlot *p_extslot,
	int            key_by_flag,
	int            *data_type,
	int            *data_size,
	void           **r_p_data
);
/*
    Purpose: Reads the data from the specified slot.

    Input Arguments:
        p_extslot - The handle to the data slot.
        key_by_flag - The key-by flag -- either KEY_BY_ID or KEY_BY_NAME.

    Output Arguments:
        data_type - The data type. The valid types are PRO_INTEGER_TYPE, 
                    PRO_DOUBLE_TYPE, PRO_WIDE_STRING_TYPE, PRO_STREAM_TYPE, 
                    PRO_CHAPTER_TYPE. PRO_CHAPTER_TYPE behaves similar to 
                    PRO_STREAM_TYPE but has no data length limit.
        data_size - The size of the data. This argument applies to 
                    PRO_STREAM_TYPE only.
        r_p_data - The returned data handle.

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully read data from the 
                                 specified slot.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.
        PROEXTDATA_TK_BAD_KEY_BY_FLAG - The specified <i>key_by_flag</i> is 
                                        invalid.
        PROEXTDATA_TK_SLOT_NOT_FOUND - The specified slot was not found.
        PROEXTDATA_TK_BAD_DATA_ARGS - The <i>data_size</i> is NULL.
        PROEXTDATA_TK_EMPTY_SLOT - No data exists in the slot.

*/


extern	ProExtdataErr	ProExtdataSlotDelete
(
	ProExtdataSlot  *p_extslot,
	int             key_by_flag 
);
/*
    Purpose: Deletes the specified data slot.

    Input Arguments:
        p_extslot - The handle to the data slot
        key_by_flag - The key-by flag -- either KEY_BY_ID or KEY_BY_NAME

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully deleted the slot.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model or class name 
                                             is invalid.
        PROEXTDATA_TK_BAD_KEY_BY_FLAG - The specified <i>key_by_flag</i> is 
                                        invalid.
        PROEXTDATA_TK_SLOT_NOT_FOUND - The specified slot was not found.

*/



extern	ProExtdataErr	ProExtdataLoadAll
(
	ProMdl		p_model
);
/*
    Purpose: Loads all the generic application data for the specified model.

    Input Arguments:
        p_model - The model handle

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully loaded all the 
                                 generic application data for the model.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.

*/



extern	ProExtdataErr	ProExtdataClassNamesList
(
	ProMdl			p_model,
	int			*r_num_of_classes,
	ProExtdataNamesList	*r_class_names
);
/*
    Purpose: Generates a list of all the classes registered for the specified 
             model.

    Input Arguments:
        p_model - The model handle

    Output Arguments:
        r_num_of_classes - The number of classes in the generated list
        r_class_names - The list of all the registered classes

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully created a list of 
                                 all the classes.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.

*/



extern	ProExtdataErr	ProExtdataSlotIdsList
(
        ProExtdataClass 	*p_extclass,
	int			*r_num_of_slots,
	ProExtdataIdsList	*r_slot_ids
);
/*
    Purpose: Generates a list of all the slot identifiers for the specified 
             class.

    Input Arguments:
        p_extclass - The class handle

    Output Arguments:
        r_num_of_slots - The number of slots in the class
        r_slot_ids - The list of slots identifiers for the class

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully created a list of 
                                 all the slot identifiers.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.
        PROEXTDATA_TK_BAD_DATA_ARGS - The argument <i>r_slot_ids</i> is 
                                      invalid.

*/



extern	ProExtdataErr	ProExtdataSlotNamesList
(
	ProExtdataClass		*p_extclass,
	int			*r_num_of_slots,
	ProExtdataNamesList	*r_slot_names
);
/*
    Purpose: Generates a list of all the slot names for the specified class.

    Input Arguments:
        p_extclass - The class handle

    Output Arguments:
        r_num_of_slots - The number of slots in the class
        r_slot_names - The list of slot names

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully returned the 
                                 information.
        PROEXTDATA_TK_ERROR - The function failed.
        PROEXTDATA_TK_INVALID_OBJ_OR_CLASS - The specified model is invalid.
        PROEXTDATA_TK_BAD_DATA_ARGS - The argument <i>r_slot_names</i> is 
                                      invalid.

*/

extern ProExtdataErr ProExtdataFree
(
 void **p_extdata
);
/*
    Purpose: Frees the memory allocated by the <i>ProExtdata</i> API.

    Input Arguments:
        p_extdata - The handle to the external data

    Output Arguments:
        none

    Return Values:
        PROEXTDATA_TK_NO_ERROR - The function successfully freed the memory.

*/



PRO_END_C_DECLS
#endif /* PROEXTDATA_H */