/*
 
uf_ugmgr_types.h
File description:

   Contains the type definitions, enumerations, structure definitions,
   #define s and macros for NX Manager user functions.

***************************************************************************/


#ifndef UF_UGMGR_TYPES_H_INCLUDED
#define UF_UGMGR_TYPES_H_INCLUDED

/*

*/

#define ERROR_UGMGR_base    940000
#include <uf_defs.h>
#include <uf_attr_types.h>



/**
* NX and TC are both moving to supporting string limits based on number of characters rather than
* on the number of bytes.  At the same time NX is moving to support multi-byte data everywhere, and
* so buffer sizes will need to increase to support this.  These transitions will take place over
* several releases, and so new definitions are being introduced that will help during the
* transition period starting with NX 9.  
*
* The following constants with the "_SIZE" suffixes are the fixed allocated lengths of their
* corresponding TC Database fields in bytes (as of TC10) - independent of the character encoding
* actually used when they are stored there. Each TC Database must use the same encoding for all
* of its strings. These are meant to be used only for string length limit validations.
*
* The constants with the "_NCHARS" suffix are number of characters the string are limited to. However,
* They are not to be used directly in the TCIN code as we are currently byte-limited to the "_SIZE"'s.
*
* The constants with the "_BUFSIZE" suffix are number of bytes to be used to allocate "char*" buffers to hold
* those strings in NX code. They include one more byte to add the trailing null "\0" terminator.  
* These are meant only for char* buffer allocations to make sure that they can hold "_NCHARS"
* characters in any language when encoded in UTF-8. They are not to be used for TC DB string length limit
* validations. Also
* once NX transitions to multi-byte character support, the NX_BUFSIZE() macro will guarantee that the
* buffers are large enough to hold the number of characters indicated.  So user written code allocating
* buffers should be switched use the _BUFSIZE definitions.
*
* New routines have been added which will help in this transition:
*     UF_TEXT_count_characters() will count the number of characters in a buffer.
*     UF_TEXT_terminate_chars() will terminate a C string after the given number of characters.
*

* The Teamcenter limits for Item-Id and WSOM name were previously increased from 32 to 128 chars.
* To support these Longer ID/Names, the NX/Manager basic limits for the Part-no and Part-name
* and Part File-name were also increased to 128 chars.
*
* Teamcenter 10.x or before the database fields are limited by a number of bytes, so the
* xxx_LIMIT values will be a byte based limit.  In Teamcenter 11 or later, the xxx_LIMIT
* values will be character based because the database is limited by characters.  The
* xxx_SIZE definitions are being deprecated as they were used for both declaring buffers
* and limiting the data in those buffers.  The xxx_BUFSIZE should now be used to declare
* buffers, as they will be big enough to hold the maximum amount of data, when working
* with Teamcenter 11 and multi-byte data.
*/

#define    UF_UGMGR_PARTNO_LIMIT        900  /* Part (Item) Number length in chars; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_PARTNO_BUFSIZE      NX_BUFSIZE(UF_UGMGR_PARTNO_LIMIT)  

#define    UF_UGMGR_PARTREV_LIMIT       32    /* Part (Item) Revision length in chars */
#define    UF_UGMGR_PARTREV_BUFSIZE     NX_BUFSIZE(UF_UGMGR_PARTREV_LIMIT)

#define    UF_UGMGR_NAME_LIMIT          128    /* Part (Item/Workspace object) Name length in chars; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_NAME_BUFSIZE        NX_BUFSIZE(UF_UGMGR_NAME_LIMIT)  

#define    UF_UGMGR_TYPE_LIMIT          32    /* Part (Item) Type length in chars */
#define    UF_UGMGR_TYPE_BUFSIZE        NX_BUFSIZE(UF_UGMGR_TYPE_LIMIT)

#define    UF_UGMGR_DESC_LIMIT         240    /* Part (Item/Workspace object) Description length in chars */
#define    UF_UGMGR_DESC_BUFSIZE       NX_BUFSIZE(UF_UGMGR_DESC_LIMIT)

#define    UF_UGMGR_FTYPE_LIMIT        42    /* Dataset File Type length in chars; now from 9 'multi-CAD' + 1 '-' + 32 TC datasettype name */
#define    UF_UGMGR_FTYPE_BUFSIZE       NX_BUFSIZE(UF_UGMGR_FTYPE_LIMIT)

#define    UF_UGMGR_FNAME_LIMIT         128    /* Dataset File Name length in chars; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_FNAME_BUFSIZE       NX_BUFSIZE(UF_UGMGR_FNAME_LIMIT)

#define    UF_UGMGR_ROLE_LIMIT         32    /* User Role length in chars */
#define    UF_UGMGR_ROLE_BUFSIZE        NX_BUFSIZE(UF_UGMGR_ROLE_LIMIT)

#define    UF_UGMGR_PARTNO_SIZE_EX_LIMIT         32    /* Part Item Id limit (currently in bytes) */
#define    UF_UGMGR_NAME_SIZE_EX_LIMIT           32    /* Part Name limit (currently in bytes)  */
#define    UF_UGMGR_FNAME_SIZE_EX_LIMIT          32    /* Dataset Filename limit (currently in bytes) */
   
/*  */
#define    UF_UGMGR_PARTNO_SIZE         (UF_UGMGR_PARTNO_BUFSIZE-1)    /* Part (Item) Number length in bytes; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_PARTREV_SIZE        (UF_UGMGR_PARTREV_BUFSIZE-1)   /* Part (Item) Revision length in bytes */
#define    UF_UGMGR_NAME_SIZE           (UF_UGMGR_NAME_BUFSIZE-1)      /* Part (Item/Workspace object) Name length in bytes; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_TYPE_SIZE           (UF_UGMGR_TYPE_BUFSIZE-1)      /* Part (Item) Type length in bytes */
#define    UF_UGMGR_DESC_SIZE           (UF_UGMGR_DESC_BUFSIZE-1)      /* Part (Item/Workspace object) Description length in bytes */
#define    UF_UGMGR_FTYPE_SIZE          (UF_UGMGR_FTYPE_BUFSIZE-1)     /* Dataset File Type length in bytes; now from 9 'multi-CAD' + 1 '-' + 32 TC datasettype name */
#define    UF_UGMGR_FNAME_SIZE          (UF_UGMGR_FNAME_BUFSIZE-1)     /* Dataset File Name length in bytes; increased to 128 to support TC Longer ID/Names */
#define    UF_UGMGR_ROLE_SIZE           (UF_UGMGR_ROLE_BUFSIZE-1)      /* User Role length in bytes */
/*  */


/**
* This structure is used to define the parameters for a new Part
* specification in a customization of the new-Part dialog in NX Manager.
*/

struct UF_UGMGR_new_part_no_s
{
   const char* old_item;                            /* Seed name for the new item id, this may be NULL */
   const char* item_type;                           /* Name of item type for which number is being generated. */
   logical     part_number_modifiable;              /* Flag whether the user can change the returned value of new_id */
   char        new_id[UF_UGMGR_PARTNO_BUFSIZE];     /* Returned string for new part number, this may be an empty string */
   logical     part_name_modifiable;                /* Flag whether the user can change the returned value of new_name */
   char        new_name[UF_UGMGR_NAME_BUFSIZE];     /* Returned string for new part name, this may be an empty string */
   logical     part_description_modifiable;         /* Flag whether the user can change the returned value of new description. */
   char        new_description[UF_UGMGR_DESC_BUFSIZE];/* Returned string for new part description, this may be an empty string.*/
   int         ifail;                               /* Failure code returned from the user program, zero is success.  */
};

/**
* This structure is used to define the parameters for a new Part
* specification in a customization of the new-Part dialog in NX Manager.
*/

typedef struct UF_UGMGR_new_part_no_s UF_UGMGR_new_part_no_t,
              *UF_UGMGR_new_part_no_p_t;

/**
* This structure is used to descripbe the properties that are required for a new Part
* specification in a customization of the new-Part dialog in NX Manager.
*/

struct UF_UGMGR_property_info_s
{
   char*       property_name;          /* The name of the property. */
   logical     is_key_field;           /* Flag whether this is a key field of MFK id. */
   logical     is_mandatory;           /* Flag whether this is a mandatory mapped attribute. */
   logical     is_create_descriptor;   /* Flag whether this is a required or auto-assignable create descriptor. */
   char*       property_value;         /* The value of the property. */
   logical     is_modifiable;           /* Indicates whether the value is modifiable. */
};

typedef struct UF_UGMGR_property_info_s UF_UGMGR_property_info_t,
              *UF_UGMGR_property_info_p_t;

/**
* This structure is used to define the parameters for a new Part
* specification in a customization of the new-Part dialog in NX Manager.
*/

struct UF_UGMGR_new_id_s
{
   const char*                 old_item;                               /* <I> Seed name for the new item id, this may be NULL. */
   const char*                 item_type;                              /* <I> Name of item type for which the id is being generated. */
   int                         num_properties;                         /* <I> Number of properties. */
   UF_UGMGR_property_info_t*   properties;                             /* <I/O> Array of UF_UGMGR_property_info_t. One of the properties can be "item_id".
                                                                                  The property_value and is_modifiable are the outputs. */

   logical                     part_name_modifiable;                   /* <O> Flag whether the user can change the returned value of new_name. */
   char                        new_name[UF_UGMGR_NAME_BUFSIZE];        /* <O> Returned string for new part name, this may be an empty string. */
   logical                     part_description_modifiable;            /* <O> Flag whether the user can change the returned value of new description. */
   char                        new_description[UF_UGMGR_DESC_BUFSIZE]; /* <O> Returned string for new part description, this may be an empty string. */
   int                         ifail;                                  /* <O> Failure code returned from the user program, zero is success. */
};

/**
* This structure is used to define the parameters for a new Part
* specification in a customization of the new-Part dialog in NX Manager.
*/

typedef struct UF_UGMGR_new_id_s UF_UGMGR_new_id_t,
              *UF_UGMGR_new_id_p_t;

/**
* This structure is used to define the parameters for a new Part
* specification in a customisation of the new-Part dialog in
* NX Manager.
*/

struct UF_UGMGR_new_part_rev_s
{
   const char* item;                                /* Seed name for new item id for default domain item. This may be MFK id for non-default domain item. This may be NULL. */
   const char* item_type;                           /* Name of item type for which revision is being generated. */
   logical     part_revision_modifiable;            /* Flag whether the user can change the returned value of new_revision.  */
   char        new_revision[UF_UGMGR_PARTREV_BUFSIZE];/* Returned string for new part revision, this may be an empty string. */
   int         ifail;                               /* Failure code returned from the user program, zero is success.  */
};

/**
* This structure is used to define the parameters for a new Part
* specification in a customisation of the new-Part dialog in
* NX Manager.
*/

typedef struct UF_UGMGR_new_part_rev_s UF_UGMGR_new_part_rev_t,
              *UF_UGMGR_new_part_rev_p_t;

/**
* This structure may be used to define the parameters for a new Part
* specification in a customisation of the new-Part dialog in
* NX Manager.
*/

struct UF_UGMGR_new_dataset_name_s
{
   const char* owner;                           /* Owning Item of existing dataset, this may be NULL */
   const char* owner_revision;                  /* Revision name of Owning Item */
   const char* dataset_type;                    /* Name of dataset type for which a name is being generated. */
   const char* relation_type;                   /* Name of relation between Owning Item and dataset */
   const char* basis_name;                      /* Basis name of new dataset (this may be an empty string) */
   logical     dataset_name_modifiable;         /* Flag whether user can change the returned value of dataset_name */
   char        dataset_name[UF_UGMGR_NAME_BUFSIZE];/* Returned string for new dataset name, this may be an empty string. */
   int         ifail;                           /* Failure code returned from the user program, zero is success. */
};

/**
* This structure may be used to define the parameters for a new Part
* specification in a customisation of the new-Part dialog in
* NX Manager.
*/

typedef struct UF_UGMGR_new_dataset_name_s UF_UGMGR_new_dataset_name_t,
                                         *UF_UGMGR_new_dataset_name_p_t;

/**
* This structure may be used to define the parameters for a
* non-master, dataset name in a customisation of the saveas master
* part dialog in NX Manager.
*/

struct UF_UGMGR_saveas_dataset_name_s
{
   const char* old_owner;                       /* Owning Item of existing dataset, this may be NULL.  */
   const char* old_owner_revision;              /* Revision of Owning Item of existing dataset, this may be NULL. */
   const char* old_dataset;                     /* Name of existing dataset, this may be NULL.  */
   const char* relation_type;                   /* Name of relation type between the Owning Item and the dataset. */
   const char* new_owner;                       /* Name of the new Owning Item of the dataset. */
   const char* new_owner_revision;              /* Revision of the new Owning Item of the dataset. */
   logical     dataset_name_modifiable;         /* Flag whether the user can change the returned value of dataset_name. */
   char        dataset_name[UF_UGMGR_NAME_BUFSIZE];/* Returned string for saveas dataset name, this may be an empty string. */
   int         ifail;                           /* Failure code returned from the user program, zero is success. */
};

/**
* This structure may be used to define the parameters for a
* non-master, dataset name in a customisation of the saveas master
* part dialog in NX Manager.
*/

typedef struct UF_UGMGR_saveas_dataset_name_s UF_UGMGR_saveas_dataset_name_t,
              *UF_UGMGR_saveas_dataset_name_p_t;

/**
* This structure is used to hold the input and output arguments to
* UF_UGMGR_saveas_dataset_info, which supercedes
* UF_UGMGR_saveas_dataset_name.  This user exit is called when
* NX Manager is about to save a part with non-masters attached to it.
* It collects information about how to save these non-masters and
* returns it to NX.
*/

struct UF_UGMGR_saveas_dataset_info_s
{
   const char              *old_part_number;       /* <I> Original item id */
   const char              *old_rev_name;          /* <I> Original revision id */
   const char              *new_part_number;       /* <I> New item id */
   const char              *new_rev_name;          /* <I> New revision id */
   const char              *new_part_type;         /* <I> New item type */
   int                     dataset_count;          /* <I> Number of datasets */
   char                    **dataset_list;         /* <I> Names of datasets */

   /**
   * Return arguments; for arrays, it is one for each non-master dataset.
   */

   char                    ***dataset_name_list;   /* <OF> For each non-master Dataset: dataset name */
   int                     **copy_state;           /* <OF> For each non-master Dataset: each one of {USER_DATASET_always_copy, USER_DATASET_never_copy,
                                                       USER_DATASET_user_chooses} */

   logical                 **name_locked;          /* <OF> For each non-master Dataset: indicates whether the user is allowed to change the suggested name
                                                      returned from the user exit. */

   logical                 **validation_required;  /* <OF> For each non-master Dataset: Indicates whether or not the name must pass the validation check. */
   logical                 **original_owner;       /* <OF> For each non-master Dataset: Indicates whether the new non-masters are to be owned by the original
                                                      owner or by the user doing the saving. */

   logical                 *allow_duplicates;      /* <O> Whether or not duplicate non-master names are allowed. */
   int                     ifail;                  /* <O> Failure code returned from the user program, zero is success. */
};

/**
* This structure is used to hold the input and output arguments to
* UF_UGMGR_saveas_dataset_info, which supercedes
* UF_UGMGR_saveas_dataset_name.  This user exit is called when
* NX Manager is about to save a part with non-masters attached to it.
* It collects information about how to save these non-masters and
* returns it to NX.
*/

typedef struct UF_UGMGR_saveas_dataset_info_s UF_UGMGR_saveas_dataset_info_t,
              *UF_UGMGR_saveas_dataset_info_p_t;

/**
* This function is called by NX when it wants to ensure that a dataset
* name is valid.  It is typically called in the context of saving an
* existing part to a new part, and these details are passed to it in
* case the function wants to use them to check the name.
*/

struct UF_UGMGR_validate_dataset_name_s
{
   const char              *old_part_number;       /* <I> Original item id */
   const char              *old_rev_name;          /* <I> Original revision id */
   const char              *new_part_number;       /* <I> New item id */
   const char              *new_rev_name;          /* <I> New revision id */
   const char              *new_part_type;         /* <I> New item type */
   const char              *new_dataset_name;      /* <I> New dataset name */
   logical                 *valid;                 /* <O> Whether or not the name is considered valid  */
   int                     ifail;                  /* Failure code returned from the user program, zero is success. */
};

/**
* This function is called by NX when it wants to ensure that a dataset
* name is valid.  It is typically called in the context of saving an
* existing part to a new part, and these details are passed to it in
* case the function wants to use them to check the name.
*/

typedef struct UF_UGMGR_validate_dataset_name_s UF_UGMGR_validate_dataset_name_t,
              *UF_UGMGR_validate_dataset_name_p_t;

typedef int (*UF_UGMGR_new_part_no_fn_t)(UF_UGMGR_new_part_no_p_t /* <I> */);
typedef int (*UF_UGMGR_new_id_fn_t)(UF_UGMGR_new_id_p_t /* <I> */);
typedef int (*UF_UGMGR_new_part_rev_fn_t)(UF_UGMGR_new_part_rev_p_t /* <I> */);
typedef int (*UF_UGMGR_new_dataset_name_fn_t)(UF_UGMGR_new_dataset_name_p_t /* <I> */);

/**
* This structure is used to define the parameters for a new Alternate Identifier
* as a customization of the Add Alternate dialog in NX Manager.
*/

struct UF_UGMGR_new_alternate_part_no_s
{
   tag_t        part_tag;                            /* Tag of part to assign alternate ID. */
   const char  *context;                             /* Context for which an alternate number is being requested.  */
   const char  *id_type;                             /* ID type of part for which the number is being requested. May be NULL */
   char         alt_item_id[UF_UGMGR_PARTNO_BUFSIZE];/* Alternate Item ID. The string must freed after use with UF_free(). */
   char         alt_rev_id[UF_UGMGR_PARTREV_BUFSIZE];/* Alternate Revision ID. The string must freed after use with UF_free() */
   char         alt_name[UF_UGMGR_NAME_BUFSIZE];     /* Returned string for new part name, this may be an empty string */
   char         alt_description[UF_UGMGR_DESC_BUFSIZE];/* Returned string for new part description, this may be an empty string.*/
   logical      modifiable;                          /* Boolean; is the alternate ID allowed to be modified */
};

/**
* This structure is used to define the parameters for a new Alternate Identifier
* as a customization of the Add Alternate dialog in NX Manager.
*/

typedef struct UF_UGMGR_new_alternate_part_no_s UF_UGMGR_new_alternate_part_no_t,
              *UF_UGMGR_new_alternate_part_no_p_t;

/**
* Valid revision configuration options
*/

enum UF_UGMGR_rev_config_options_e
{
   UF_UGMGR_configure_none,            /* No revision option has been set */
   UF_UGMGR_configure_latest,          /* The latest revision will be returned, even for configured input */
   UF_UGMGR_configure_by_rev_rule,     /* Use the specified Revision Rule for configuration, even for configured input */
   UF_UGMGR_configure_all_revisions    /* All revisions will be returned, even for configured input */
};
typedef enum UF_UGMGR_rev_config_options_e  

/**
* Valid revision configuration options
*/

typedef enum UF_UGMGR_rev_config_options_e UF_UGMGR_rev_config_options_t;

/**
* This structure is used to represent an NX PartFile for the purpose of resolving
* a part file name and used as input to the service UF_UGMGR_resolve_part_file_infos.
*
* Note: -If fileName is specified then partId, revisionID, modelType, datasetName are ignored.
       -If fileName is not provided then partID has to be provided for the input to be valid.
       -If partID is provided then modelType, datasetName can be provided along with partID and revisionID.
       -For unconfigured input( i.e., revision information not available) and revisionOption is UF_UGMGR_configure_none
         the current revision Rule in effect will be used to resolve the NX PartFile.
*/

struct UF_UGMGR_part_file_info_s
{
   const char                          *fileName;                             /* %UGMGR filename(This is what is returned from methods such as UF_UGMGR_encode_part_filename),
                                                                                  or @DB- Command line Input name (This is what is returned from methods such as
                                                                                  UF_UGMGR_convert_file_name_to_cli) of the NX PartFile. If this is not specified/used,
                                                                                  it has to be initialized to NULL*/

   const char                          *partID;                               /* PartID of the NX PartFile to be resolved. If this is not specified/used, it has to be
                                                                                   initialized to NULL. */

   const char                          *revisionId;                           /* RevisionID of the part to be resolved. If the revisionOption is set to UF_UGMGR_configure_by_rev_rule,
                                                                                   this will be ignored. If this is not specified/used, it has to be initialized to NULL.*/

   const char                          *modelType;                            /* PDI Model Type, valid values are "master","specification", "manifestation", "altrep",
                                                                                  "scenario", "simulation", "cae_motion", "cae_solution", "cae_mesh" and "cae_geometry".
                                                                                   If this is not specified/used, it has to be initialized to NULL.*/

   const char                          *datasetName;                          /* Dataset name of the NX PartFile to be resolved.
                                                                                   If this is not specified/used, it has to be initialized to NULL.*/

   const char                          *revisionRule;                         /* Teamcenter Revision Rule to use for configuration, This will be used only if revisionOption is
                                                                                   set to UF_UGMGR_configure_by_rev_rule. If this is not specified/used, it has to be initialized to NULL.*/

   UF_UGMGR_rev_config_options_t       revisionOption;                        /* Revision configuration option.*/  

};

/**
* This structure is used to represent an NX PartFile for the purpose of resolving
* a part file name and used as input to the service UF_UGMGR_resolve_part_file_infos.
*/

typedef struct UF_UGMGR_part_file_info_s UF_UGMGR_part_file_info_t,
              *UF_UGMGR_part_file_info_p_t;

/**
* This structure is used to hold information about an NX partFile that is resolved by
* the service UF_UGMGR_resolve_part_file_infos. The elements of this structure are
* valid only if iFail is zero.
*/

struct UF_UGMGR_part_file_object_s
{
   char                          *fullSpec;                             /* Returned string, %UGMGR filename. The string must freed after use with UF_free()  */
   char                          *cliSpec;                              /* Returned string, @DB-CommandLineInput filename of the part. The string must freed after use with UF_free()  */
   char                          *partID;                               /* Returned string, ID of the part. The string must freed after use with UF_free()  */
   char                          *datasetName;                          /* Returned string, Datasetname of the part. The string must freed after use with UF_free()  */
   char                          *revisionID;                           /* Returned string, Revision ID of the part. The string must freed after use with UF_free()  */
   char                          *partNumber;                           /* Returned string, PartNumber of the part. The string must freed after use with UF_free()  */
   char                          *datasetType;                          /* Returned string, The TC dataset type for this Part. The string must freed after use with UF_free()*/
   char                          *pdiModelType;                         /* Returned string, The equivalent PDI model type for this part. The string must freed after use with UF_free()*/
   tag_t                          partTag;                              /* Returned Database tag of the part */
   int                            iFail;                                /* Returned Error code for this object, zero is success.  */
};

/**
* This structure is used to define the parameters for PartFileObject used as output
* in the service UF_UGMGR_resolve_part_file_infos.
*/

typedef struct UF_UGMGR_part_file_object_s UF_UGMGR_part_file_object_t,
              *UF_UGMGR_part_file_object_p_t;


typedef int (*UF_UGMGR_saveas_dataset_name_fn_t)
                                           (UF_UGMGR_saveas_dataset_name_p_t /* <I> */);
typedef int (*UF_UGMGR_saveas_dataset_info_fn_t)
                                           (UF_UGMGR_saveas_dataset_info_p_t /* <I> */);

typedef int (*UF_UGMGR_validate_dataset_name_fn_t)
                                           (UF_UGMGR_validate_dataset_name_p_t /* <I> */);
typedef int (*UF_UGMGR_new_alternate_part_no_fn_t)
                                           (UF_UGMGR_new_alternate_part_no_p_t /* <I> */);

/**
* PDM object types that can be accessed from NX Manager.
*/

enum UF_UGMGR_object_type_e
{
   UF_UGMGR_type_unknown,       /* Unknown object type */
   UF_UGMGR_type_folder,        /* Folder object type */
   UF_UGMGR_type_part,          /* Part Item object type */
   UF_UGMGR_type_part_revision  /* Part Item Revision object type */
} ;

/**
* PDM object types that can be accessed from NX Manager.
*/

typedef enum UF_UGMGR_object_type_e UF_UGMGR_object_type_t;

/**
* Part Number creation validation codes.
*/

enum UF_UGMGR_partno_status_e
{
   UF_UGMGR_partno_valid,    /* Part Number is valid */
   UF_UGMGR_partno_invalid,  /* Part Number is invalid, such as has invalid character, violates database pattern rules, etc. */
   UF_UGMGR_partno_modified, /* Part Number is valid but has been modified as output, due to naming rules, etc. */
   UF_UGMGR_partno_override  /* Part Number is valid but has been overwritten due to user exit, etc. */
} ;

/**
* Part Number creation validation codes.
*/

typedef enum UF_UGMGR_partno_status_e UF_UGMGR_partno_status_t;

/**
* Alternate Id creation validation codes.
*/

enum UF_UGMGR_alt_id_status_e
{
   UF_UGMGR_alt_id_valid,    /* Alternate Id is valid */
   UF_UGMGR_alt_id_invalid,  /* Alternate Id is invalid, such as has invalid character, violates database pattern rules, etc. */
   UF_UGMGR_alt_id_modified, /* Alternate Id is valid but has been modified as output, due to naming rules, etc. */
   UF_UGMGR_alt_id_override  /* Alternate Id is valid but has been overwritten due to user exit, etc. */
} ;

/**
* Alternate Id creation validation codes.
*/

typedef enum UF_UGMGR_alt_id_status_e UF_UGMGR_alt_id_status_t;

/**
* Tags related to NX database objects.
*/

typedef  tag_t UF_UGMGR_tag_t;

/**
* Null NX database tag. Indicates unknown or invalid object tags.
*/

#define UF_UGMGR_null_tag  ((UF_UGMGR_tag_t)0)

/**
* Constants for the TCIN error return codes.
*/

#define    UF_UGMGR_error_base                 ERROR_UGMGR_base + 3000
#define    UF_UGMGR_not_supported              (UF_UGMGR_error_base + 0)
#define    UF_UGMGR_apiserver_inactive         (UF_UGMGR_error_base + 1)
#define    UF_UGMGR_invalid_input              (UF_UGMGR_error_base + 2)
#define    UF_UGMGR_invalid_type               (UF_UGMGR_error_base + 3)
#define    UF_UGMGR_invalid_partno             (UF_UGMGR_error_base + 4)
#define    UF_UGMGR_invalid_partrev            (UF_UGMGR_error_base + 5)
#define    UF_UGMGR_invalid_fname              (UF_UGMGR_error_base + 6)
#define    UF_UGMGR_not_part_name              (UF_UGMGR_error_base + 7)
#define    UF_UGMGR_invalid_role               (UF_UGMGR_error_base + 8)
#define    UF_UGMGR_not_loaded_part            (UF_UGMGR_error_base + 9)
#define    UF_UGMGR_no_export_dir              (UF_UGMGR_error_base + 10)
#define    UF_UGMGR_part_does_not_exist        (UF_UGMGR_error_base + 11)
#define    UF_UGMGR_invalid_object             (UF_UGMGR_error_base + 12)
#define    UF_UGMGR_invalid_rule               (UF_UGMGR_error_base + 13)
#define    UF_UGMGR_part_exists                (UF_UGMGR_error_base + 14)
#define    UF_UGMGR_configured_rev_not_found   (UF_UGMGR_error_base + 15)
#define    UF_UGMGR_invalid_part_name          (UF_UGMGR_error_base + 16)
#define    UF_UGMGR_invalid_part_desc          (UF_UGMGR_error_base + 17)
#define    UF_UGMGR_invalid_seed               (UF_UGMGR_error_base + 18)
#define    UF_UGMGR_user_exit_failure          (UF_UGMGR_error_base + 19)
#define    UF_UGMGR_terminate_obsolete         (UF_UGMGR_error_base + 20)
#define    UF_UGMGR_iddisp_rule_not_in_pdm     (UF_UGMGR_error_base + 21)
#define    UF_UGMGR_invalid_altids_data        (UF_UGMGR_error_base + 22)
#define    UF_UGMGR_not_admin                  (UF_UGMGR_error_base + 23)
#define    UF_UGMGR_invalid_db_setting         (UF_UGMGR_error_base + 24)


/****************************************************************************
* UF_UGMGR_ATTR_info_t
*
* User attribute information struct representing a creation parameter
* for creating a new part in Teamcenter. This struct is used by
* UF_UGMGR_get_creation_parameters.
*
****************************************************************************/

struct UF_UGMGR_ATTR_info_s
{
   logical create_descriptor;  /* Flag indicating if this parameter is a create descriptor */
   logical key_identifier;     /* Flag indicating if this parameter is a field of the multi field key */
   UF_ATTR_info_t basic_info;  /* Other informarion viz. title, alias, whether required, etc. */
};
typedef struct UF_UGMGR_ATTR_info_s UF_UGMGR_ATTR_info_t, *UF_UGMGR_ATTR_info_p_t;
typedef const struct UF_UGMGR_ATTR_info_s UF_UGMGR_ATTR_info_c_t, *UF_UGMGR_ATTR_info_pc_t;



#endif /* UF_UGMGR_TYPES_H_INCLUDED */