/*      @(#)pkg_public.h 20.25 93/06/28 SMI      */

/*
 *  (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
 *  pending in the U.S. and foreign countries. See LEGAL NOTICE
 *  file for terms of the license.
 */

#ifndef xview_pkg_public_DEFINED
#define xview_pkg_public_DEFINED

/*
 ***********************************************************************
 *          Include Files
 ***********************************************************************
 */

#include <xview/pkg.h>
#include <xview/xv_error.h>

/*
 ***********************************************************************
 *      Typedefs, Enumerations, and Structures
 ***********************************************************************
 *
 * SunView pkg. definition
 */

/*
 * PRIVATE structures for pkg implementors only
 */

/*
 * Last field before "embedded" struct in an "embedding object".
 */
typedef long unsigned    Xv_embedding;

/*
 * Base instance for all objects
 */
typedef struct
{
    long unsigned    seal;  /* Has "special" value meaning "am object" */
    Xv_pkg      *pkg;   /* Always points to pkg chain for an object */
} Xv_base;

/*
 ***********************************************************************
 *              Globals
 ***********************************************************************
 */

/*
 * PUBLIC General interface functions
 */
EXTERN_FUNCTION(Xv_object xv_create, (Xv_opaque owner, Xv_pkg *pkg,
                                      DOTDOTDOT));
EXTERN_FUNCTION(Xv_object xv_find, (Xv_opaque owner, Xv_pkg *pkg, DOTDOTDOT));
EXTERN_FUNCTION(Xv_opaque xv_set, (Xv_opaque object, DOTDOTDOT));
EXTERN_FUNCTION(Xv_opaque xv_get, (Xv_opaque object, Attr_attribute attr,
                                   DOTDOTDOT));
EXTERN_FUNCTION(int xv_destroy_safe, (Xv_object object));
EXTERN_FUNCTION(int xv_destroy_check, (Xv_object object));
EXTERN_FUNCTION(int xv_destroy, (Xv_object object));
EXTERN_FUNCTION(int xv_destroy_immediate, (Xv_object object));

/*
 * PRIVATE functions for pkg implementors only
 */

EXTERN_FUNCTION(Xv_opaque xv_object_to_standard, (Xv_object object,
                const char *caller));

#if !(defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus))
#define const
#endif
extern const char *xv_notptr_str;
#define XV_OBJECT_SEAL          0xF0A58142
#define XV_OBJECT_TO_STANDARD(_passed_object, _caller, _object)\
    {\
        if (!_passed_object) {\
            xv_error(NULL, ERROR_INVALID_OBJECT,xv_notptr_str,\
                     ERROR_STRING, _caller,\
                     0);\
            _object = ((Xv_opaque)0);\
        }\
        else\
            _object = (((Xv_base *)_passed_object)->seal == XV_OBJECT_SEAL) ? _passed_object : xv_object_to_standard(_passed_object, _caller);\
    }

#endif /* xview_pkg_public_DEFINED */
