302 lines
7.5 KiB
C++
302 lines
7.5 KiB
C++
/*
|
|
** OSSP uuid - Universally Unique Identifier
|
|
** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
|
|
** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
|
|
**
|
|
** This file is part of OSSP uuid, a library for the generation
|
|
** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
|
|
**
|
|
** Permission to use, copy, modify, and distribute this software for
|
|
** any purpose with or without fee is hereby granted, provided that
|
|
** the above copyright notice and this permission notice appear in all
|
|
** copies.
|
|
**
|
|
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
|
** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
|
|
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
** SUCH DAMAGE.
|
|
**
|
|
** uuid++.cc: library C++ API implementation
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "uuid++.hh"
|
|
|
|
/* standard constructor */
|
|
uuid::uuid()
|
|
{
|
|
uuid_rc_t rc;
|
|
if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
}
|
|
|
|
/* copy constructor */
|
|
uuid::uuid(const uuid &obj)
|
|
{
|
|
/* Notice: the copy constructor is the same as the assignment
|
|
operator (with the object as the argument) below, except that
|
|
(1) no check for self-assignment is required, (2) no existing
|
|
internals have to be destroyed and (3) no return value is given back. */
|
|
uuid_rc_t rc;
|
|
if ((rc = uuid_clone(obj.ctx, &ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* extra constructor via C API object */
|
|
uuid::uuid(const uuid_t *obj)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (obj == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
if ((rc = uuid_clone(obj, &ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* extra constructor via binary representation */
|
|
uuid::uuid(const void *bin)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (bin == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
import(bin);
|
|
return;
|
|
}
|
|
|
|
/* extra constructor via string representation */
|
|
uuid::uuid(const char *str)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (str == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
import(str);
|
|
return;
|
|
}
|
|
|
|
/* standard destructor */
|
|
uuid::~uuid()
|
|
{
|
|
uuid_destroy(ctx);
|
|
return;
|
|
}
|
|
|
|
/* assignment operator: import of other C++ API object */
|
|
uuid &uuid::operator=(const uuid &obj)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (this == &obj)
|
|
return *this;
|
|
if ((rc = uuid_destroy(ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
if ((rc = uuid_clone(obj.ctx, &ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return *this;
|
|
}
|
|
|
|
/* assignment operator: import of other C API object */
|
|
uuid &uuid::operator=(const uuid_t *obj)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (obj == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
if ((rc = uuid_clone(obj, &ctx)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return *this;
|
|
}
|
|
|
|
/* assignment operator: import of binary representation */
|
|
uuid &uuid::operator=(const void *bin)
|
|
{
|
|
if (bin == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
import(bin);
|
|
return *this;
|
|
}
|
|
|
|
/* assignment operator: import of string representation */
|
|
uuid &uuid::operator=(const char *str)
|
|
{
|
|
if (str == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
import(str);
|
|
return *this;
|
|
}
|
|
|
|
/* method: clone object */
|
|
uuid uuid::clone(void)
|
|
{
|
|
return new uuid(this);
|
|
}
|
|
|
|
/* method: loading existing UUID by name */
|
|
void uuid::load(const char *name)
|
|
{
|
|
uuid_rc_t rc;
|
|
if (name == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
if ((rc = uuid_load(ctx, name)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* method: making new UUID one from scratch */
|
|
void uuid::make(unsigned int mode, ...)
|
|
{
|
|
uuid_rc_t rc;
|
|
va_list ap;
|
|
|
|
va_start(ap, mode);
|
|
if ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5)) {
|
|
const uuid *ns = (const uuid *)va_arg(ap, const uuid *);
|
|
const char *name = (const char *)va_arg(ap, char *);
|
|
if (ns == NULL || name == NULL)
|
|
throw uuid_error_t(UUID_RC_ARG);
|
|
rc = uuid_make(ctx, mode, ns->ctx, name);
|
|
}
|
|
else
|
|
rc = uuid_make(ctx, mode);
|
|
va_end(ap);
|
|
if (rc != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* method: comparison for Nil UUID */
|
|
int uuid::isnil(void)
|
|
{
|
|
uuid_rc_t rc;
|
|
int rv;
|
|
|
|
if ((rc = uuid_isnil(ctx, &rv)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return rv;
|
|
}
|
|
|
|
/* method: comparison against other object */
|
|
int uuid::compare(const uuid &obj)
|
|
{
|
|
uuid_rc_t rc;
|
|
int rv;
|
|
|
|
if ((rc = uuid_compare(ctx, obj.ctx, &rv)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return rv;
|
|
}
|
|
|
|
/* method: comparison for equality */
|
|
int uuid::operator==(const uuid &obj)
|
|
{
|
|
return (compare(obj) == 0);
|
|
}
|
|
|
|
/* method: comparison for inequality */
|
|
int uuid::operator!=(const uuid &obj)
|
|
{
|
|
return (compare(obj) != 0);
|
|
}
|
|
|
|
/* method: comparison for lower-than */
|
|
int uuid::operator<(const uuid &obj)
|
|
{
|
|
return (compare(obj) < 0);
|
|
}
|
|
|
|
/* method: comparison for lower-than-or-equal */
|
|
int uuid::operator<=(const uuid &obj)
|
|
{
|
|
return (compare(obj) <= 0);
|
|
}
|
|
|
|
/* method: comparison for greater-than */
|
|
int uuid::operator>(const uuid &obj)
|
|
{
|
|
return (compare(obj) > 0);
|
|
}
|
|
|
|
/* method: comparison for greater-than-or-equal */
|
|
int uuid::operator>=(const uuid &obj)
|
|
{
|
|
return (compare(obj) >= 0);
|
|
}
|
|
|
|
/* method: import binary representation */
|
|
void uuid::import(const void *bin)
|
|
{
|
|
uuid_rc_t rc;
|
|
if ((rc = uuid_import(ctx, UUID_FMT_BIN, bin, UUID_LEN_BIN)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* method: import string or single integer value representation */
|
|
void uuid::import(const char *str)
|
|
{
|
|
uuid_rc_t rc;
|
|
if ((rc = uuid_import(ctx, UUID_FMT_STR, str, UUID_LEN_STR)) != UUID_RC_OK)
|
|
if ((rc = uuid_import(ctx, UUID_FMT_SIV, str, UUID_LEN_SIV)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return;
|
|
}
|
|
|
|
/* method: export binary representation */
|
|
void *uuid::binary(void)
|
|
{
|
|
uuid_rc_t rc;
|
|
void *bin = NULL;
|
|
if ((rc = uuid_export(ctx, UUID_FMT_BIN, &bin, NULL)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return bin;
|
|
}
|
|
|
|
/* method: export string representation */
|
|
char *uuid::string(void)
|
|
{
|
|
uuid_rc_t rc;
|
|
char *str = NULL;
|
|
if ((rc = uuid_export(ctx, UUID_FMT_STR, (void **)&str, NULL)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return str;
|
|
}
|
|
|
|
/* method: export single integer value representation */
|
|
char *uuid::integer(void)
|
|
{
|
|
uuid_rc_t rc;
|
|
char *str = NULL;
|
|
if ((rc = uuid_export(ctx, UUID_FMT_SIV, (void **)&str, NULL)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return str;
|
|
}
|
|
|
|
/* method: export textual summary representation */
|
|
char *uuid::summary(void)
|
|
{
|
|
uuid_rc_t rc;
|
|
char *txt = NULL;
|
|
if ((rc = uuid_export(ctx, UUID_FMT_TXT, (void **)&txt, NULL)) != UUID_RC_OK)
|
|
throw uuid_error_t(rc);
|
|
return txt;
|
|
}
|
|
|
|
/* method: return library version */
|
|
unsigned long uuid::version(void)
|
|
{
|
|
return uuid_version();
|
|
}
|
|
|