#ifndef PROMFGDB_H
#define PROMFGDB_H

/* Creo Parametric TOOLKIT functions and callback types for
   access to external Databases. */



#include <ProToolkit.h>
#include <ProToolinput.h>
#include <ProParamval.h>



PRO_BEGIN_C_DECLS

typedef struct mfgdb_data             *ProMfgdbData;
typedef struct mfgdb_name             *ProMfgdbName;
typedef struct mfgdb_search_option    *ProMfgdbSearchopt;
typedef struct mfgdb_match            *ProMfgdbMatch;
typedef struct query_node             *ProMfgdbQuerynode;
typedef struct search_expression      *ProMfgdbExpression;


typedef enum
{
    PROMFGDBCAT_UNUSED         = -1,
    PROMFGDBCAT_MFG_MODEL      =  1,
    PROMFGDBCAT_MACHINE_TOOL,
    PROMFGDBCAT_CUTTING_TOOL,
    PROMFGDBCAT_OPERATION,
    PROMFGDBCAT_TECHNOLOGY_DATA,
    PROMFGDBCAT_BOM_COMPONENTS,
    PROMFGDBCAT_STEP               /* NC SEQUENCE */
} ProMfgdbObjCategory;


typedef enum
{
    PROMFGDBTYPE_UNUSED      = -1,
    PROMFGDBTYPE_UNSPECIFIED =  0,
    PROMFGDBTYPE_GENERAL     =  1,
    PROMFGDBTYPE_NC_MFG      =  2,
    PROMFGDBTYPE_MILLING     = 10,
    PROMFGDBTYPE_DRILL,
    PROMFGDBTYPE_CENTER_DRL,
    PROMFGDBTYPE_CSINK,
    PROMFGDBTYPE_SIDE_MILL,
    PROMFGDBTYPE_PLUNGE_MILL,
    PROMFGDBTYPE_TAPER, 
    PROMFGDBTYPE_BACK_SPOT,
    PROMFGDBTYPE_GROOVE,
    PROMFGDBTYPE_MILL_THREAD,
    PROMFGDBTYPE_TAP,
    PROMFGDBTYPE_BORE,
    PROMFGDBTYPE_REAM,
    PROMFGDBTYPE_TURN,
    PROMFGDBTYPE_TURN_GRV,
    PROMFGDBTYPE_CHAMFERING,
    PROMFGDBTYPE_ROUNDING,
    PROMFGDBTYPE_HOLDER,
    PROMFGDBTYPE_INSERT,
    PROMFGDBTYPE_ADAPTER,
    PROMFGDBTYPE_END_MILL,
    PROMFGDBTYPE_BALL_MILL,
    PROMFGDBTYPE_BULL_MILL,
    PROMFGDBTYPE_BASIC_DRILL,
    PROMFGDBTYPE_SPOT_DRILL,
    PROMFGDBTYPE_KEY_CUTTER,
    PROMFGDBTYPE_LOLLIPOP,
    PROMFGDBTYPE_BORING_BAR,
    PROMFGDBTYPE_MULTI_TASK
} ProMfgdbObjType;


typedef enum
{
    PROLOGICOPER_NULL,
    PROLOGICOPER_AND,
    PROLOGICOPER_OR
} ProMfgdbLogicOper;


typedef enum
{
    PROMFGDBCOMPOP_EQUALS,
    PROMFGDBCOMPOP_LESS_THAN,
    PROMFGDBCOMPOP_GREATER_THAN,
    PROMFGDBCOMPOP_LESS_OR_EQUAL,
    PROMFGDBCOMPOP_GREATER_OR_EQUAL,
    PROMFGDBCOMPOP_CONTAINS,
    PROMFGDBCOMPOP_BEFORE,
    PROMFGDBCOMPOP_AFTER
} ProMfgdbCompOper;     /* comparison operation */


typedef ProError (*ProMfgdbSearchAction)(
    ProMfgdbQuerynode   root_node,
    int                 timeout,
    ProAppData          appdata,
    ProMfgdbMatch       **p_match_arr,
    ProLine             error);
/*
    Purpose: Type for callback used by Creo Parametric to initiate a query to 
             search the database for objects. To register this user-specified 
             function for use by Creo Parametric, specify the function as an 
             input argument to ProMfgdbRegister().

    Input Arguments:
        root_node - Root node of the query tree. The memory for this tree is 
                    allocated by Creo Parametric and will be automatically 
                    freed when the callback function returns. It is the user's 
                    responsibility to save any data for use in subsequent 
                    queries.
        timeout - The timeout period in seconds. If the database does not 
                  respond during this period, the function returns status 
                  PRO_TK_TIMED_OUT. Value -1 means no timeout.
        appdata - Pointer to data specific to the Creo Parametric TOOLKIT 
                  application which was passed in the call to 
                  ProMfgdbRegister().

    Output Arguments:
        p_match_arr - The matching object description, to be stored in an array 
                      of type ProArray.
        error - Text of an error message that Creo Parametric will display to 
                the user if the function returns any error status. To support 
                more than one language, provide a message file containing the 
                translations, and use ProMessageToBuffer() to translate the 
                string.

    Return Values:
        PRO_TK_NO_ERROR - At least one successful match was found
        PRO_TK_BAD_INPUTS - The query could be interpreted
        PRO_TK_E_NOT_FOUND - No matches were found
        PRO_TK_CANT_OPEN - Database connection is lost - login required
        PRO_TK_TIMED_OUT - The database could not be accessed within the 
                           timeout period.

*/


typedef ProError (*ProMfgdbLoginAction)(
    ProName            dbname,
    ProName            user_name,
    ProName            password,
    int                timeout,
    ProAppData         appdata,
    ProLine            error);
/*
    Purpose: Type for callback used by Creo Parametric to initiate an access to 
             the database. To register this user-specified function for use by 
             Creo Parametric, specify the function as an input argument to 
             ProMfgdbRegister().

    Input Arguments:
        dbname - A name used to identify the database.
        user_name - A user name for database access.
        password - A password for database access.
        timeout - The timeout period in seconds. If the database does not 
                  respond during this period, the function returns with status 
                  PRO_TK_TIMED_OUT. The value -1 means no timeout.
        appdata - Pointer to data specific to the Creo Parametric TOOLKIT 
                  application which was passed in the call to 
                  ProMfgdbRegister(). Database program can cache connection 
                  information into the appdata for subsequent connection 
                  requests.

    Output Arguments:
        error - Text of an error message that Creo Parametric displays to the 
                user if the function returns an error status. To support more 
                than one language, provide a message file containing the 
                translations and use ProMessageToBuffer() to translate the 
                string.

    Return Values:
        PRO_TK_NO_ERROR - Database access available.
        PRO_TK_BAD_INPUTS - Database not found.
        PRO_TK_TIMED_OUT - The database could not be accessed within the 
                           timeout period.

*/


typedef ProError (*ProMfgdbLogoffAction)(
    ProName            dbname,
    int                timeout,
    ProAppData         appdata,
    ProLine            error);
/*
    Purpose: Type for callback used by Creo Parametric to close a connection to 
             the database.To register this user-specified function for use by 
             Creo Parametric, specify the function as an input argument to 
             ProMfgdbRegister().

    Input Arguments:
        dbname - A name used to identify the database.
        timeout - The timeout period in seconds. If the database does not 
                  respond during this period, the function returns with status 
                  PRO_TK_TIMED_OUT. Value -1 means no timeout.
        appdata - Pointer to data specific to the Creo Parametric TOOLKIT 
                  application which was passed in the call to 
                  ProMfgdbRegister(). Database programs can cache connection 
                  information into the appdata for subsequent connection 
                  requests.

    Output Arguments:
        error - Text of an error message that Creo Parametric displays to the 
                user if the function returns an error status. To support more 
                than one language, provide a message file containing the 
                translations, and use ProMessageToBuffer() to translate the 
                string.

    Return Values:
        PRO_TK_NO_ERROR - Database connection closed successfully.
        PRO_TK_BAD_INPUTS - Connection to the specified database not found.
        PRO_TK_TIMED_OUT - The database could not be accessed within the 
                           timeout period.

*/


extern ProError ProMfgdbDataAlloc (  
    ProMfgdbData	       *p_mfgdb_data );
/*
    Purpose: Allocates memory to store optional, non-Creo Parametric-native 
             search parameters and external tool database names for use in 
             creating queries.

    Input Arguments:
        none

    Output Arguments:
        p_mfgdb_data - The allocated structure.

    Return Values:
        PRO_TK_BAD_INPUTS - Invalid argument.
        PRO_TK_NO_ERROR - The function successfully allocated the memory.
        PRO_TK_OUT_OF_MEMORY - Insufficient memory.

*/


extern ProError ProMfgdbDataDbnameAdd (  
    ProMfgdbData	       mfgdb_data,
    ProName                db_external_name,
    ProCharName            db_internal_name,
    ProLine                db_name_help_text );
/*
    Purpose: Adds the name of an external tool database to the structure 
             created by ProMfgdbDataAlloc. To add multiple names, make multiple 
             calls to this function with each call specifying a new 
             db_external_name.

    Input Arguments:
        mfgdb_data - handle to the mfgdb_data.
        db_external_name - database name; can be translated. Can be NULL. 
                           db_internal_name is used if there is no translation.
        db_internal_name - database name; never translated.
        db_name_help_text - help text line. This can be translated. This can 
                            also be NULL, in which case internal_name is used 
                            without translation.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added database name data.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbDataSearchoptAdd (  
    ProMfgdbData	       mfgdb_data,
    ProMfgdbSearchopt      search_option );
/*
    Purpose: Adds definitions of an optional, non-Creo Parametric-native search 
             parameter to the structure created by ProMfgdbDataAlloc. To add 
             multiple names, make multiple calls to this function with each 
             call specifying a new search_option name.

    Input Arguments:
        mfgdb_data - handle to the database data.
        search_option - option created by user for search UI.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added database name data.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbSearchoptCreate (  
    ProName                external_name,
    ProCharName            internal_name,
    ProLine                help_text,
    ProParamvalueType      value_type,
    ProMfgdbName           group_name,
    ProMfgdbSearchopt	   *p_search_option );
/*
    Purpose: Allocates and initializes a structure for the user's optional, 
             non-Creo Parametric-native search parameters.

    Input Arguments:
        external_name - name; can be translated. Can be NULL. internal_name is 
                        used if there is no translation.
        internal_name - name; never translated.
        help_text - help line for the search option; can be translated. Can be 
                    NULL. internal_name is used if there is no translation.
        value_type - option value type.
        group_name - group name data, such as Geometry, General, or All, in 
                     search UI. Each option can be associated with only one 
                     group of options in the search UI. Can be NULL; group All 
                     used if specified as NULL.

    Output Arguments:
        p_search_option - Allocated and initialized option for search UI;

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated and initialized 
                          the option for search UI.
        PRO_TK_OUT_OF_MEMORY - Insufficient memory.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbSearchoptApplicDataAdd (  
    ProMfgdbSearchopt	   search_option,
    ProMfgdbObjCategory    category,
    ProMfgdbObjType        object_type );
/*
    Purpose: Adds applicability data to the optional, non-Creo 
             Parametric-native search parameter. This data sets the category 
             and object type for which the search option is valid. Use multiple 
             calls to this function if the option is valid for multiple 
             categories or object types.

    Input Arguments:
        search_option - user-specified option for search UI.
        category - applicable object category.
        object_type - applicable object type.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added applicability data to 
                          the option.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbSearchoptAllowedValueAdd (  
    ProMfgdbSearchopt      search_option,
    ProLine                external_value,
    ProCharLine            internal_value,
    ProLine                help_text );
/*
    Purpose: Adds valid value for the optional, non-Creo Parametric-native 
             search parameter. Use multiple calls to this function if the 
             option has multiple valid values.

    Input Arguments:
        search_option - option, created by user for search UI.
        external_value - value; can be translated. Can be NULL. nternal_value 
                         is used if there is no translation.
        internal_value - value; never translated.
        help_text - value help text; can be translated. Can be NULL. 
                    internal_value is used if there is no translation.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added allowed value to the 
                          option.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbNameCreate (  
    ProName                  external_name,
    ProCharName              internal_name,
    ProLine                  help_text,
    ProMfgdbName             *p_mfgdb_name );
/*
    Purpose: Allocates and initializes a name structure for the groups into 
             which optional, non-Creo Parametric-native search parameters are 
             organized. Use multiple calls to this function to create multiple 
             group structure names.

    Input Arguments:
        external_name - name; can be translated. Can be NULL. internal_name is 
                        used if there is no translation.
        internal_name - name; never translated.
        help_text - help prompt for name; can be translated. Can be NULL. 
                    internal_name used if there is no translation.

    Output Arguments:
        p_mfgdb_name - handle to allocated and initialized name structure.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated and initialized 
                          the name structure.
        PRO_TK_OUT_OF_MEMORY - Insufficient memory.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbMatchAlloc (  
    ProMfgdbMatch	       *p_mfgdb_match );
/*
    Purpose: Allocates memory for a structure to contain query matches.

    Input Arguments:
        none

    Output Arguments:
        p_mfgdb_match - pointer to handle to allocated match structure.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated memory for match.
        PRO_TK_BAD_INPUTS - Invalid argument.
        PRO_TK_OUT_OF_MEMORY - Insufficient memory.

*/


extern ProError ProMfgdbMatchParamAdd (  
    ProMfgdbMatch	       mfgdb_match,
    ProName                param_external_name,
    ProCharName            param_internal_name,
    ProLine                value_wstr,
    ProParamvalueType      value_type );
/*
    Purpose: Adds a parameter to the match in the structure allocated by 
             ProMfgdbMatchAlloc().

    Input Arguments:
        mfgdb_match - match with parameter added.
        param_external_name - parameter name; can be translated. Can be NULL. 
                              param_internal_name used if there is no 
                              translation.
        param_internal_name - parameter name; never translated.
        value_wstr - parameter value.
        value_type - value type ( PRO_PARAM_DOUBLE, PRO_PARAM_STRING...).

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the parameter to the 
                          match.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/


extern ProError ProMfgdbRegister(
          ProMfgdbData          mfgdb_data,
          ProMfgdbLoginAction   login_callback,
          ProMfgdbLogoffAction  logoff_callback,
          ProMfgdbSearchAction  search_callback,
          ProAppData            appdata,
          ProMfgdbObjCategory   target);
/*
    Purpose: Registers an external database with Creo Parametric. This function 
             sets the functions to be called to gain access to a database, to 
             close a database, and the function that executes database queries. 
             It also specifies any optional user data passed to the registered 
             callbacks.

    Input Arguments:
        mfgdb_data - information about the database.
        login_callback - Pointer to the callback function that will be executed 
                         to get access to the database.
        logoff_callback - Pointer to the callback function that will be 
                          executed to close a connection to the database.
        search_callback - Pointer to the callback function that will execute 
                          the database queries.
        appdata - Pointer to data specific to the Creo Parametric TOOLKIT 
                  application that will be passed as an input the query 
                  callback.
        target - category of object searched in database.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The database was registered. PRO_TK_BAD_INPUTS

*/


extern ProError ProMfgdbQueryTargetGet (
    ProMfgdbQuerynode           node,
    ProMfgdbObjCategory         *p_target );
/*
    Purpose: Return the target object searched for by the query tree that 
             contains the specified node. All nodes in the same query tree 
             return the same target.

    Input Arguments:
        node - The query node.

    Output Arguments:
        p_target - The target of a query.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the target.
        PRO_TK_BAD_INPUTS - The node handle was invalid.

*/


extern ProError ProMfgdbQuerynodeIsLeaf( 
    ProMfgdbQuerynode       query_node,
    ProBoolean	            *leaf_node );
/*
    Purpose: Allows the user to determine whether the given node is a leaf 
             (that is, a node that contains expressions).

    Input Arguments:
        query_node - The query node.

    Output Arguments:
        leaf_node - Node is a leaf.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived leaf_node flag.
        PRO_TK_BAD_INPUTS - The query_node handle was invalid.

*/


extern ProError ProMfgdbQuerynodeLeftChildGet (  
    ProMfgdbQuerynode 	        parent_node,
    ProMfgdbQuerynode	        *p_left_child );
/*
    Purpose: Return the left branch of a query node

    Input Arguments:
        parent_node - The parent query node.

    Output Arguments:
        p_left_child - The right child query node

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the left child.
        PRO_TK_BAD_INPUTS - The parent_node handle was invalid.

*/


extern ProError ProMfgdbQuerynodeRightChildGet (  
    ProMfgdbQuerynode 	        parent_node,
    ProMfgdbQuerynode	        *p_right_child );
/*
    Purpose: Return the right branch of a query node

    Input Arguments:
        parent_node - The parent query node.

    Output Arguments:
        p_right_child - The right child query node

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the right child.
        PRO_TK_BAD_INPUTS - The parent_node handle was invalid.

*/


extern ProError ProMfgdbQuerynodeLogicOperGet(
    ProMfgdbQuerynode           query,
    ProMfgdbLogicOper           *p_oper);
/*
    Purpose: Returns from a node the logical operation (AND or OR) applied to 
             the specified query.

    Input Arguments:
        query - The query.

    Output Arguments:
        p_oper - The operation.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the logical oper
        PRO_TK_BAD_INPUTS - The query_node handle was invalid or did not 
                            contain a logical operation.

*/


extern ProError ProMfgdbQuerynodeExprGet(
    ProMfgdbQuerynode      query_node,
    ProMfgdbExpression     *p_expression);
/*
    Purpose: Provides the expressions for the given query. Note that the 
             query_node must be a leaf node.

    Input Arguments:
        query_node - Handle to the node for which the expression is retrieved.

    Output Arguments:
        p_expression - Handle to output ProMfgdbExpression.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the handle
        PRO_TK_BAD_INPUTS - The query_node handle was invalid or did not 
                            contain an expression.

*/


extern ProError ProMfgdbExprCategoryGet(
    ProMfgdbExpression   expression,
    ProMfgdbObjCategory  *p_category );
/*
    Purpose: Provides the category of the attribute contained in the specified 
             expression in a leaf node.

    Input Arguments:
        expression - The expression.

    Output Arguments:
        p_category - The category.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the category.
        PRO_TK_BAD_INPUTS - The expression handle was invalid or did not 
                            contain a category.

*/


extern ProError ProMfgdbExprNameGet(
    ProMfgdbExpression expression,
    ProName            name);
/*
    Purpose: Provides the name of the attribute contained in the specified 
             expression in a leaf node.

    Input Arguments:
        expression - The expression.

    Output Arguments:
        name - The attribute name.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the name.
        PRO_TK_BAD_INPUTS - The expression handle was invalid or did not 
                            contain a name.

*/


extern ProError ProMfgdbExprValueGet(
    ProMfgdbExpression expression,
    ProLine value);
/*
    Purpose: Returns the value of the attribute contained in the specified 
             expression in a leaf node.

    Input Arguments:
        expression - The expression.

    Output Arguments:
        value - The attribute value.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the value.
        PRO_TK_BAD_INPUTS - The expression handle was invalid or did not 
                            contain a value.

*/


extern ProError ProMfgdbExprValueTypeGet(
    ProMfgdbExpression expression,
    ProParamvalueType  *p_value_type );
/*
    Purpose: Returns the value type of the attribute contained in the specified 
             expression so the user knows the data type of the search 
             parameter. Use when defining a query, for example, search on 
             Boolean, String, and so on.

    Input Arguments:
        expression - The expression.

    Output Arguments:
        p_value_type - The attribute value type ( PRO_PARAM_DOUBLE, 
                       PRO_PARAM_STRING... ).

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the value.
        PRO_TK_BAD_INPUTS - The expression handle was invalid or did not 
                            contain a value.

*/


extern ProError ProMfgdbExprCompopGet(
    ProMfgdbExpression   expression,
    ProMfgdbCompOper     *p_comp_op);
/*
    Purpose: Provides the comparison operation (=, <, >, etc.) contained in the 
             specified expression.

    Input Arguments:
        expression - The expression.

    Output Arguments:
        p_comp_op - The comparison operation.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrived the comp oper.
        PRO_TK_BAD_INPUTS - The expression handle was invalid or did not 
                            contain a comparison operation.

*/


extern ProError ProMfgdbDeregister( ProMfgdbObjCategory target );
/*
    Purpose: Deregisters an external database with Creo Parametric. It also 
             calls any ProMfgdbLogoffAction action defined by the user.

    Input Arguments:
        target - Category of the registered database.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully deregistered the database.
        PRO_TK_BAD_INPUTS - Database of the input Category is not available.

*/

PRO_END_C_DECLS
#endif  /* PROMFGDB_H */