versionsTest.c

/*
 * Tests for the various ways to test the QuickDraw 3D versions.
 * 
 * Nick Thompson, March 1997.
 * Robert Dierkes, February 1998.
 *      Added support for Q3GetReleaseVersion, Q3GetVersion,
 *      Q3ViewerGetReleaseVersion, and Q3ViewerGetVersion.
 */
 
/*-----------------------------------------------------------*\
 *                                                           *
 * VIEWER_VERSION should be non-zero to test Viewer gestalt  *
 *                                                           *
 * Also WEAK LINK against QuickDraw3DViewerLib stub library  *
 *                                                           *
\*-----------------------------------------------------------*/
#define VIEWER_VERSION  1
 
/*#define   OLDROUTINENAMES 1   /* Use this until Gestalt.h is updated */
 
#include <stdio.h>
#include <QD3D.h>
#include <Gestalt.h>
 
 
#if OLDROUTINENAMES
    #include <QD3DGestalt.h>
#else
#endif /* OLDROUTINENAMES */
 
#if defined(VIEWER_VERSION) || defined(VIEWER_VERSION)
    #if OLDROUTINENAMES
        #include <QD3DViewerGestalt.h>
    #endif /* OLDROUTINENAMES */
 
    #include <QD3DViewer.h>
#endif /* VIEWER_VERSION */
 
 
 
/*-----------------------------------------------------------*\
 *                                                           *
 *       Define these values for the current version         *
 *                                                           *
\*-----------------------------------------------------------*/
    #define kQD3DCurrentGestaltValue            0x00010504
    #define kQD3DCurrentMajorRevision           1L
    #define kQD3DCurrentMinorRevision           5L
 
#if defined(VIEWER_VERSION) || defined(VIEWER_VERSION)
    #define kQD3DViewerCurrentGestaltValue      0x00010504
    #define kQD3DViewerCurrentMajorRevision     1L
    #define kQD3DViewerCurrentMinorRevision     5L
#endif /* VIEWER_VERSION */
 
 
/*-----------------------------------------------------------*\
 * "Release Version" - based on format of the 'vers' resource*
\*-----------------------------------------------------------*/
#define kMajorPosition  24      /* bit position of major release number */
#define kMinorPosition  20      /* bit position of minor release number */
#define kDotPosition    16      /* bit position of dot   release number */
#define kMajorMask      (0xFF << kMajorPosition)
#define kMinorMask      (0x0F << kMinorPosition)
#define kDotMask        (0x0F << kDotPosition)
 
#define RELEASE_TO_MAJOR_MINOR_DOT(_release,_major,_minor,_dot) \
        _major = (_release & kMajorMask) >> kMajorPosition;     \
        _minor = (_release & kMinorMask) >> kMinorPosition;     \
        _dot   = (_release & kDotMask)   >> kDotPosition;
 
/*-----------------------------------------------------------*\
 * Gestalt Version number                                    *
\*-----------------------------------------------------------*/
#define kGestaltMajorPosition   16      /* bit position of major release number */
#define kGestaltMinorPosition    8      /* bit position of minor release number */
#define kGestaltDotPosition      0      /* bit position of dot   release number */
#define kGestaltMajorMask       (0xFF << kGestaltMajorPosition)
#define kGestaltMinorMask       (0xFF << kGestaltMinorPosition)
#define kGestaltDotMask         (0xFF << kGestaltDotPosition)
 
#define GESTALT_TO_MAJOR_MINOR_DOT(_gestalt,_major,_minor,_dot)                             \
        _major = (((unsigned long) _gestalt) & kGestaltMajorMask) >> kGestaltMajorPosition; \
        _minor = (((unsigned long) _gestalt) & kGestaltMinorMask) >> kGestaltMinorPosition; \
        _dot   = (((unsigned long) _gestalt) & kGestaltDotMask)   >> kGestaltDotPosition;
 
 
/*
 * Main
 */
void main(void)
{
    TQ3Status       status     = kQ3Failure,
                    initStatus = kQ3Failure;
    OSErr           osError;
    long            gestaltValue;
    unsigned long   releaseQd3dValue,
                    releaseQd3dMajor,
                    releaseQd3dMinor,
                    releaseQd3dDot;
    unsigned long   releaseViewer,
                    releaseViewerMajor,
                    releaseViewerMinor,
                    releaseViewerDot;
    unsigned long   gestaltMajor,
                    gestaltMinor,
                    gestaltDot;
    unsigned long   majorRevision,
                    minorRevision;
    
    /*---------------*
     *  QuickDraw 3D *
     *---------------*/
 
    /* Query Gestalt for presence of QuickDraw 3D */
    gestaltValue = ~0;
    osError = Gestalt(gestaltQD3D, &gestaltValue);
 
    if (osError != noErr) {
        printf("Error:  Gestalt check for QuickDraw 3D extension failed; \n", osError);
        goto Exit_VersionTest;
    } else {
        if (gestaltValue == gestaltQD3DNotPresent) {
            printf("Error:  QuickDraw 3D extension isn't installed.\n");
            goto Exit_VersionTest;
        }
        printf("QuickDraw 3D extension is installed.\n");
    }
 
    /* Query Gestalt for QuickDraw 3D version */
    gestaltValue = ~0;
    osError = Gestalt(gestaltQD3DVersion, &gestaltValue);
 
    if (osError != noErr) {
        printf("Error:  Check for Gestalt gestaltQD3DVersion failed; %d;", osError);
        goto Exit_VersionTest;
    } else {
        if (gestaltValue != kQD3DCurrentGestaltValue) {
            printf("Error:  Check for Gestalt gestaltQD3DVersion returned unexpected version 0x%08X\n", gestaltValue);
            goto Exit_VersionTest;
        }
 
        GESTALT_TO_MAJOR_MINOR_DOT( gestaltValue,
                                    gestaltMajor,
                                    gestaltMinor,
                                    gestaltDot);
 
        printf("Gestalt gestaltQD3DVersion returns %d.%d.%d\n", 
                        gestaltMajor, gestaltMinor, gestaltDot);
    }
 
 
    /* Initialize QuickDraw 3D */
    initStatus = Q3Initialize();
    if (initStatus == kQ3Failure) {
        printf("Error:  Q3Initialize failed.\n");
        goto Exit_VersionTest;
    }
 
    /*
     * Q3GetReleaseVersion
     */
    releaseQd3dValue = ~0;
    status = Q3GetReleaseVersion(&releaseQd3dValue);
 
    if (status == kQ3Failure) {
        printf("Error:  Q3GetReleaseVersion failed.\n");
        goto Exit_VersionTest;
    } else {
        RELEASE_TO_MAJOR_MINOR_DOT( releaseQd3dValue,
                                    releaseQd3dMajor,
                                    releaseQd3dMinor,
                                    releaseQd3dDot);
 
        if ( (gestaltMajor != releaseQd3dMajor) ||
             (gestaltMinor != releaseQd3dMinor) ||
             (gestaltDot   != releaseQd3dDot) )
        {
            printf("Error:  Inconsistent version numbers - Gestalt returns %d.%d.%d"
                    " while Q3GetReleaseVersion returns %d.%d.%d\n", 
                            gestaltMajor,     gestaltMinor,     gestaltDot,
                            releaseQd3dMajor, releaseQd3dMinor, releaseQd3dDot);
            goto Exit_VersionTest;
        }
        printf("Q3GetReleaseVersion returns %d.%d.%d\n", 
                        releaseQd3dMajor, releaseQd3dMinor, releaseQd3dDot);
    }
 
 
    /*
     * Q3GetVersion
     */
    majorRevision = ~0;
    minorRevision = ~0;
    status = Q3GetVersion(&majorRevision, &minorRevision);
 
    if (status == kQ3Failure) {
        printf("Error:  Q3GetVersion failed.\n");
        goto Exit_VersionTest;
    } else {
        if ( (majorRevision != kQD3DCurrentMajorRevision) ||
             (minorRevision != kQD3DCurrentMinorRevision) )
        {
            printf("Error:  Incorrect version number - Q3GetVersion returns %d.%d\n", 
                            majorRevision, minorRevision);
            goto Exit_VersionTest;
        }
        printf("Q3GetVersion returns %d.%d\n", 
                        majorRevision, minorRevision);
    }
 
 
 
#if defined(VIEWER_VERSION) || defined(VIEWER_VERSION)
 
    printf("\n");
 
    /*----------------------*
     *  QuickDraw 3D Viewer *
     *----------------------*/
 
    /* Gestalt for presence of QuickDraw 3D Viewer */
    gestaltValue = ~0;
    osError = Gestalt(gestaltQD3DViewer, &gestaltValue);
 
    if (osError != noErr ) {
        printf("Error:  Check for Gestalt gestaltQD3DViewer failed; \n", osError);
        goto Exit_VersionTest;
    } else {
        if ((gestaltValue & (1 << gestaltQD3DViewerPresent)) == 0) {
            printf("Error:  QuickDraw 3D Viewer isn't installed.\n");
            goto Exit_VersionTest;
        }
        printf("QuickDraw 3D Viewer is installed.\n");
    }
    
    /* (No Gestalt for QuickDraw 3D Viewer version) */
 
    /*
     * Q3ViewerGetReleaseVersion
     */
    releaseViewer = ~0;
    osError = Q3ViewerGetReleaseVersion(&releaseViewer);
 
    if (osError != noErr ) {
        printf("Error:  Q3ViewerGetReleaseVersion failed.\n");
        goto Exit_VersionTest;
    } else {
        RELEASE_TO_MAJOR_MINOR_DOT( releaseViewer,
                                    releaseViewerMajor,
                                    releaseViewerMinor,
                                    releaseViewerDot);
 
        /* Compare Viewer release version with QD3D release version */
        if ( (releaseViewerMajor != releaseQd3dMajor) ||
             (releaseViewerMinor != releaseQd3dMinor) ||
             (releaseViewerDot   != releaseQd3dDot) )
        {
            printf("Error:  Unexpected version number from Q3ViewerGetReleaseVersion - returned %d.%d.%d", 
                            releaseViewerMajor, releaseViewerMinor, releaseViewerDot);
            goto Exit_VersionTest;
        }
        printf("Q3ViewerGetReleaseVersion returns %d.%d.%d\n", 
                        releaseViewerMajor, releaseViewerMinor, releaseViewerDot);
    }
 
    /*
     * Q3ViewerGetVersion
     */
    majorRevision = ~0;
    minorRevision = ~0;
    osError = Q3ViewerGetVersion(&majorRevision, &minorRevision);
 
    if (osError != noErr) {
        printf("Error:  Q3GetVersion failed.\n");
        goto Exit_VersionTest;
    } else {
        if ( (majorRevision != kQD3DViewerCurrentMajorRevision) ||
             (minorRevision != kQD3DViewerCurrentMinorRevision) )
        {
            printf("Error:  Incorrect version number - Q3ViewerGetVersion returns %d.%d", 
                            majorRevision, minorRevision);
            goto Exit_VersionTest;
        }
        printf("Q3ViewerGetVersion returns %d.%d\n", 
                        majorRevision, minorRevision);
    }
 
#endif /* VIEWER_VERSION */
 
 
Exit_VersionTest:
 
    if (initStatus == kQ3Success) {
        status = Q3Exit();
        if (status == kQ3Failure) {
            printf("Error:  Q3Exit failed.\n");
        }
    }
}