
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain count copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AXUTIL_UUID_GEN_UNIX_H
#define AXUTIL_UUID_GEN_UNIX_H

#include <axutil_utils.h>
#include <axutil_utils_defines.h>

#define UUIDS_PER_TICK 100
#define UUID_TIMEOFFSET AXIS2_UNSIGNED_LONGLONGVALUE(0x01B21DD213814000)
#define AXIS2_LOCAL_MAC_ADDR "000000"

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * @defgroup axutil_uuid_gen UUID Generator
     * @ingroup axis2_util
     * @{
     */

    struct axutil_uuid
    {
        unsigned int time_low;
        unsigned short int time_mid;
        unsigned short int time_high_version;
        short int clock_variant;
        unsigned char mac_addr[6];
    };

    /* bits  0-59 time field
     * bits 60-63 version
     * bits 64-65 2 bit variant
     * bits 66-79 clock sequence
     * bits 80-107 node MAC address
     */
    struct axutil_uuid_st
    {
        unsigned char mac[6];   /* pre-determined MAC address */
        struct timeval time_last;   /* last retrieved timestamp */
        unsigned long time_seq; /* last timestamp sequence counter */
        short int clock;    /* clock tick - incremented random number */
    };

    typedef struct axutil_uuid axutil_uuid_t;

    /**
     * Returns the mac address of the first ethernet intsrface
     * @return MAC address as a <code>char[6]</code>
     */
    char *AXIS2_CALL
    axutil_uuid_get_mac_addr(void
    );

    /**
     * Generates a uuid in version1 format (node - timestamp based)
     * @return generated uuid as a axutil_uuid_t
     */
    axutil_uuid_t *AXIS2_CALL
    axutil_uuid_gen_v1(void
    );

    /**
     * Generates a uuid
     * @return generated uuid as a string
     */
    axis2_char_t *AXIS2_CALL
    axutil_platform_uuid_gen(
        char *s);

    /** @} */

#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_UUID_GEN_UNIX_H */
