144 lines
4.5 KiB
C++
144 lines
4.5 KiB
C++
/*
|
|
*
|
|
* Copyright (C) 2011-2013, OFFIS e.V.
|
|
* All rights reserved. See COPYRIGHT file for details.
|
|
*
|
|
* This software and supporting documentation were developed by
|
|
*
|
|
* OFFIS e.V.
|
|
* R&D Division Health
|
|
* Escherweg 2
|
|
* D-26121 Oldenburg, Germany
|
|
*
|
|
*
|
|
* Module: ofstd
|
|
*
|
|
* Author: Uli Schlachter
|
|
*
|
|
* Purpose: Definitions for generating UUIDs, as defined by ITU-T X.667
|
|
*
|
|
*/
|
|
|
|
#ifndef OFUUID_H
|
|
#define OFUUID_H
|
|
|
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
|
|
|
#include "dcmtk/ofstd/oftypes.h"
|
|
#include "dcmtk/ofstd/ofstring.h"
|
|
#include "dcmtk/ofstd/ofstream.h"
|
|
|
|
/** Helper class for generating and storing UUIDs, as specified in ITU-T X.667.
|
|
* A UUID is an Universally Unique IDentifier. If UUIDs are generated
|
|
* correctly, it's almost impossible that the same UUID is generated twice.
|
|
*/
|
|
class DCMTK_OFSTD_EXPORT OFUUID {
|
|
public:
|
|
|
|
/** The possible ways to represent a UUID */
|
|
enum E_Representation {
|
|
/** The UUID is printed as one, long integer in base 10 (up to 39 digits long) */
|
|
ER_RepresentationInteger,
|
|
/** The UUID is printed in hexadecimal notation with hyphens (-) separating groups */
|
|
ER_RepresentationHex,
|
|
/** The UUID is printed as one, long integer with the prefix "2.25." */
|
|
ER_RepresentationOID,
|
|
/** The UUID is printed in hexadecimal notation with the prefix "urn:uuid:" */
|
|
ER_RepresentationURN,
|
|
/** The default representation that is used when none is given */
|
|
ER_RepresentationDefault = ER_RepresentationHex
|
|
};
|
|
|
|
struct BinaryRepresentation {
|
|
Uint8 value[16];
|
|
};
|
|
|
|
/** Default constructor. Generates a new UUID. */
|
|
OFUUID();
|
|
|
|
/** Construct a new UUID from its binary representation.
|
|
* @param val the binary representation
|
|
* @see getBinaryRepresentation
|
|
*/
|
|
OFUUID(const struct BinaryRepresentation& val);
|
|
|
|
/* This class uses the default assignment operator */
|
|
|
|
/** Generate a new UUID. The old UUID is discarded. */
|
|
void generate();
|
|
|
|
/** Get the string representation of this UUID.
|
|
* @param result string instance to save the result in
|
|
* @param representation the representation to use
|
|
* @return result
|
|
*/
|
|
OFString& toString(OFString& result, E_Representation representation = ER_RepresentationDefault) const;
|
|
|
|
/** Write the string representation of this UUID to a stream.
|
|
* @param stream the output stream to write to
|
|
* @param representation the representation to use
|
|
* @return stream
|
|
*/
|
|
STD_NAMESPACE ostream& print(STD_NAMESPACE ostream& stream, E_Representation representation = ER_RepresentationDefault) const;
|
|
|
|
/** Get the binary representation of this UUID.
|
|
* @param val the structure where the result should be saved to
|
|
*/
|
|
void getBinaryRepresentation(struct BinaryRepresentation& val) const;
|
|
|
|
/** Compare this instance to another OFUUID instance.
|
|
* @param other the other instance
|
|
* @return OFTrue if both UUIDs are equal.
|
|
*/
|
|
OFBool operator==(const OFUUID& other) const;
|
|
|
|
/** Compare this instance to another OFUUID instance.
|
|
* @param other the other instance
|
|
* @return OFFalse if both UUIDs are equal.
|
|
*/
|
|
OFBool operator!=(const OFUUID& other) const
|
|
{
|
|
return !(*this == other);
|
|
}
|
|
|
|
private:
|
|
|
|
/** Print the integer representation to the given stream.
|
|
* @param stream stream to print to.
|
|
*/
|
|
void printInteger(STD_NAMESPACE ostream& stream) const;
|
|
|
|
/** Print the hexadecimal representation to the given stream.
|
|
* @param stream stream to print to.
|
|
*/
|
|
void printHex(STD_NAMESPACE ostream& stream) const;
|
|
|
|
/* The fields of an UUID, as defined by ITU-T X.667 */
|
|
|
|
/** Octets 0-3 of the time field */
|
|
Uint32 time_low;
|
|
/** Octets 4-5 of the time field */
|
|
Uint16 time_mid;
|
|
/** 4 bits for the version and the 12 highest bits of the time */
|
|
Uint16 version_and_time_high;
|
|
/** 2 bits for the variant and the 6 highest bits of the clock sequence */
|
|
Uint8 variant_and_clock_seq_high;
|
|
/** The lowest 8 bits of the clock sequence */
|
|
Uint8 clock_seq_low;
|
|
/** The node value in the form of a MAC address */
|
|
Uint8 node[6];
|
|
|
|
};
|
|
|
|
/** Print an UUID to a stream with OFUUID::ER_RepresentationDefault.
|
|
* @param stream the output stream to use
|
|
* @param uuid the UUID to print
|
|
* @return stream
|
|
*/
|
|
static inline STD_NAMESPACE ostream& operator<< (STD_NAMESPACE ostream& stream, const OFUUID& uuid)
|
|
{
|
|
return uuid.print(stream);
|
|
}
|
|
|
|
#endif
|