/* ** OSSP uuid - Universally Unique Identifier ** Copyright (c) 2004-2005 Ralf S. Engelschall ** Copyright (c) 2004-2005 The OSSP Project ** ** 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 #include #include "uuid++.hh" using namespace std; /* ** OBJECT CONSTRUCTORS AND DESTRUCTOR */ /* standard constructor */ uuid::uuid() { if (uuid_create(&ctx) != UUID_RC_OK) throw "unable to create UUID context"; } /* standard destructor */ uuid::~uuid() { uuid_destroy(ctx); } /* construction: import of other C++ API object (= special C++ copy constructor) */ uuid::uuid(const uuid &obj) { /* Notice: the copy constructor is the same as the assignment operator (with the object as the RHS) 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. */ if (uuid_clone(obj.ctx, &ctx) != UUID_RC_OK) throw "unable to clone UUID context"; } /* construction: import of other C API object */ uuid::uuid(uuid_t *obj) { if (obj != NULL) ctx = obj; else { if (uuid_create(&ctx) != UUID_RC_OK) throw "unable to create UUID context"; } } /* construction: import of binary representation */ uuid::uuid(const unsigned char *bin) { if (uuid_create(&ctx) != UUID_RC_OK) throw "unable to create UUID context"; if (bin != NULL) { if (uuid_import(ctx, UUID_FMT_BIN, bin, UUID_LEN_BIN) != UUID_RC_OK) throw "unable to import UUID from binary representation"; } } /* construction: import of string representation */ uuid::uuid(const char *str) { if (uuid_create(&ctx) != UUID_RC_OK) throw "unable to create UUID context"; if (str != NULL) { if (uuid_import(ctx, UUID_FMT_STR, str, strlen(str)) != UUID_RC_OK) throw "unable to import UUID from string representation"; } } /* ** IMPORT METHODS */ /* assignment: import of other C++ API object */ uuid &uuid::operator=(const uuid &rhs) { if (this == &rhs) return *this; if (uuid_destroy(ctx) != UUID_RC_OK) throw "failed to destroy old UUID context"; if (uuid_clone(rhs.ctx, &ctx) != UUID_RC_OK) throw "unable to clone UUID context"; return *this; } /* assignment: import of other C API object */ uuid &uuid::operator=(const uuid_t *rhs) { if (rhs == NULL) throw "invalid RHS C object"; if (uuid_clone((uuid_t *)rhs, &ctx) != UUID_RC_OK) throw "unable to clone UUID context"; return *this; } /* assignment: import of binary representation */ uuid &uuid::operator=(const unsigned char *rhs) { if (rhs == NULL) throw "invalid RHS string"; if (uuid_import(ctx, UUID_FMT_BIN, (const void *)rhs, UUID_LEN_BIN) != UUID_RC_OK) throw "unable to import into source UUID context"; return *this; } /* assignment: import of string representation */ uuid &uuid::operator=(const char *rhs) { if (rhs == NULL) throw "invalid RHS string"; if (uuid_import(ctx, UUID_FMT_STR, (const void *)rhs, strlen(rhs)) != UUID_RC_OK) throw "unable to import into source UUID context"; return *this; } /* ** GENERATION METHODS */ /* generation: loading existing UUID by name */ void uuid::load(const char *name) { if (name == NULL) throw "invalid UUID name"; if (uuid_load(ctx, name) != UUID_RC_OK) throw "unable to load UUID by name"; return; } /* generation: making new UUID one from scratch */ void uuid::make(unsigned int mode, ...) { uuid_rc_t rv; va_list ap; va_start(ap, mode); if ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5)) { const char *ns = (const char *)va_arg(ap, char *); const char *name = (const char *)va_arg(ap, char *); if (ns == NULL || name == NULL) throw "invalid arguments"; rv = uuid_make(ctx, mode, ns, name); } else rv = uuid_make(ctx, mode); va_end(ap); if (rv != UUID_RC_OK) throw "unable to make new UUID"; return; } /* ** COMPARISON METHODS */ /* comparison: is-Nil-UUID */ int uuid::isnil(void) { int rv; if (uuid_isnil(ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID for being Nil-UUID"; return rv; } /* comparison: equality */ int uuid::operator==(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv == 0); } /* comparison: inequality */ int uuid::operator!=(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv != 0); } /* comparison: lower-than */ int uuid::operator<(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv < 0); } /* comparison: lower-than-or-equal */ int uuid::operator<=(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv <= 0); } /* comparison: greater-than */ int uuid::operator>(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv > 0); } /* comparison: greater-than-or-equal */ int uuid::operator>=(const uuid &rhs) { int rv; if (uuid_compare(ctx, rhs.ctx, &rv) != UUID_RC_OK) throw "unable to compare UUID contexts"; return (rv >= 0); } /* ** EXPORT METHODS */ /* export: object representation */ uuid_t *uuid::object(void) { return ctx; } /* export: binary representation */ unsigned char *uuid::binary(void) { unsigned char *bin; bin = NULL; if (uuid_export(ctx, UUID_FMT_BIN, (void **)&bin, NULL) != UUID_RC_OK) throw "unable to export UUID context"; return bin; } /* export: string representation */ char *uuid::string(void) { char *str; str = NULL; if (uuid_export(ctx, UUID_FMT_STR, (void **)&str, NULL) != UUID_RC_OK) throw "unable to export UUID context"; return str; }