/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


/* author: jstewart */

#if defined(_PRVERSION_H)
#else
#define _PRVERSION_H

#include "prtypes.h"

PR_BEGIN_EXTERN_C

/* All components participating in the PR version protocol must expose
 * a structure and a function. The structure is defined below and named
 * according to the naming conventions outlined further below.  The function
 * is called libVersionPoint and returns a pointer to this structure.
 */

/* on NT, always pack the structure the same. */
#ifdef _WIN32
#pragma pack(push, 8)
#endif

typedef struct {
    /*
     * The first field defines which version of this structure is in use.
     * At this time, only version 2 is specified. If this value is not 
     * 2, you must read no further into the structure.
     */
    PRInt32    version; 
  
    /* for Version 2, this is the body format. */
    PRInt64         buildTime;      /* 64 bits - usecs since midnight, 1/1/1970 */
    char *          buildTimeString;/* a human readable version of the time */
  
    PRUint8   vMajor;               /* Major version of this component */
    PRUint8   vMinor;               /* Minor version of this component */
    PRUint8   vPatch;               /* Patch level of this component */
  
    PRBool          beta;           /* true if this is a beta component */
    PRBool          debug;          /* true if this is a debug component */
    PRBool          special;        /* true if this component is a special build */
  
    char *          filename;       /* The original filename */
    char *          description;    /* description of this component */
    char *          security;       /* level of security in this component */
    char *          copyright;      /* The copyright for this file */
    char *          comment;        /* free form field for misc usage */
    char *          specialString;  /* the special variant for this build */
} PRVersionDescription;

/* on NT, restore the previous packing */
#ifdef _WIN32
#pragma pack(pop)
#endif

/*
 * All components must define an entrypoint named libVersionPoint which
 * is of type versionEntryPointType.
 *
 * For example, for a library named libfoo, we would have:
 *
 *   PRVersionDescription prVersionDescription_libfoo =
 *   {
 *       ...
 *   };
 *
 *   PR_IMPLEMENT(const PRVersionDescription*) libVersionPoint(void)
 *   {
 *       return &prVersionDescription_libfoo;
 *   }
 */
typedef const PRVersionDescription *(*versionEntryPointType)(void);

/* 
 * Where you declare your libVersionPoint, do it like this: 
 * PR_IMPLEMENT(const PRVersionDescription *) libVersionPoint(void) {
 *  fill it in...
 * }
 */

/*
 * NAMING CONVENTION FOR struct
 *
 * all components should also expose a static PRVersionDescription
 * The name of the struct should be calculated as follows:
 * Take the value of filename. (If filename is not specified, calculate
 * a short, unique string.)  Convert all non-alphanumeric characters
 * to '_'.  To this, prepend "PRVersionDescription_".  Thus for libfoo.so,
 * the symbol name is "PRVersionDescription_libfoo_so".
 * so the file should have
 * PRVersionDescription PRVersionDescription_libfoo_so { fill it in };
 * on NT, this file should be declspec export.
 */

PR_END_EXTERN_C

#endif  /* defined(_PRVERSION_H) */

/* prvrsion.h */

