author | ar <ar> | 2004-06-06 19:43:58 (UTC) |
---|---|---|
committer | ar <ar> | 2004-06-06 19:43:58 (UTC) |
commit | a1ef1c3fe8700a16329358288299276fd16c8fa0 (patch) (side-by-side diff) | |
tree | 3db826a2b2df0fd407721aaefe03bfc61ffd35f0 | |
parent | d5f6057374caf1c81e02628f0fcca01394b1dc9d (diff) | |
download | opie-a1ef1c3fe8700a16329358288299276fd16c8fa0.zip opie-a1ef1c3fe8700a16329358288299276fd16c8fa0.tar.gz opie-a1ef1c3fe8700a16329358288299276fd16c8fa0.tar.bz2 |
- solve problems with padded memory - dont use memcpy
-rw-r--r-- | library/quuid.cpp | 99 | ||||
-rw-r--r-- | library/quuid.h | 119 |
2 files changed, 126 insertions, 92 deletions
diff --git a/library/quuid.cpp b/library/quuid.cpp index 46fd816..36469a8 100644 --- a/library/quuid.cpp +++ b/library/quuid.cpp @@ -42,105 +42,186 @@ Example: \code // {67C8770B-44F1-410A-AB9A-F9B5446F13EE} QUuid IID_MyInterface( 0x67c8770b, 0x44f1, 0x410a, 0xab, 0x9a, 0xf9, 0xb5, 0x44, 0x6f, 0x13, 0xee ) \endcode */ /*! \fn QUuid::QUuid( const QUuid &orig ) Creates a copy of the QUuid \a orig. */ + #ifndef QT_NO_QUUID_STRING + /*! Creates a QUuid object from the string \a text. Right now, the function can only convert the format {12345678-1234-1234-1234-123456789ABC} and will create the null UUID when the conversion fails. */ QUuid::QUuid( const QString &text ) { bool ok; QString temp = text.upper(); data1 = temp.mid( 1, 8 ).toULong( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } data2 = temp.mid( 10, 4 ).toUInt( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } data3 = temp.mid( 15, 4 ).toUInt( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } data4[0] = temp.mid( 20, 2 ).toUInt( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } data4[1] = temp.mid( 22, 2 ).toUInt( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } - for ( int i = 2; i<8; i++ ) { + for ( int i = 2; i<8; i++ ) + { data4[i] = temp.mid( 25 + (i-2)*2, 2 ).toUShort( &ok, 16 ); - if ( !ok ) { + if ( !ok ) + { *this = QUuid(); return; } } } -#endif + /*! \fn QUuid QUuid::operator=(const QUuid &uuid ) Assigns the value of \a uuid to this QUuid object. */ /*! \fn bool QUuid::operator==(const QUuid &other) const Returns TRUE if this QUuid and the \a other QUuid are identical, otherwise returns FALSE. */ /*! \fn bool QUuid::operator!=(const QUuid &other) const Returns TRUE if this QUuid and the \a other QUuid are different, otherwise returns FALSE. */ -#ifndef QT_NO_QUUID_STRING + /*! QString QUuid::toString() const Returns a string in {12345678-1234-1234-1234-123456789ABC} format. */ QString QUuid::toString() const { QString result; result = "{" + QString::number( data1, 16 ).rightJustify( 8, '0' ) + "-"; result += QString::number( (int)data2, 16 ).rightJustify( 4, '0' ) + "-"; result += QString::number( (int)data3, 16 ).rightJustify( 4, '0' ) + "-"; result += QString::number( (int)data4[0], 16 ).rightJustify( 2, '0' ); result += QString::number( (int)data4[1], 16 ).rightJustify( 2, '0' ) + "-"; for ( int i = 2; i < 8; i++ ) result += QString::number( (int)data4[i], 16 ).rightJustify( 2, '0' ); return result + "}"; } #endif + /*! Returns TRUE if this is the null UUID {00000000-0000-0000-0000-000000000000}, otherwise returns FALSE. */ bool QUuid::isNull() const { return data4[0] == 0 && data4[1] == 0 && data4[2] == 0 && data4[3] == 0 && data4[4] == 0 && data4[5] == 0 && data4[6] == 0 && data4[7] == 0 && data1 == 0 && data2 == 0 && data3 == 0; } + + +/*! + \fn QUuid::Variant QUuid::variant() const + + Returns the variant of the UUID. + The null UUID is considered to be of an unknown variant. + + \sa version() +*/ +QUuid::Variant QUuid::variant() const +{ + if ( isNull() ) + return VarUnknown; + // Check the 3 MSB of data4[0] + if ( (data4[0] & 0x80) == 0x00 ) return NCS; + else if ( (data4[0] & 0xC0) == 0x80 ) return DCE; + else if ( (data4[0] & 0xE0) == 0xC0 ) return Microsoft; + else if ( (data4[0] & 0xE0) == 0xE0 ) return Reserved; + return VarUnknown; +} + +/*! + \fn bool QUuid::operator<(const QUuid &other) const + + Returns TRUE if this QUuid is of the same variant, + and lexicographically before the \a other QUuid; + otherwise returns FALSE. + + \sa variant() +*/ +#define ISLESS(f1, f2) if (f1!=f2) return (f1<f2); +bool QUuid::operator<(const QUuid &other ) const +{ + if ( variant() != other.variant() ) + return FALSE; + + ISLESS( data1, other.data1 ); + ISLESS( data2, other.data2 ); + ISLESS( data3, other.data3 ); + for ( int n = 0; n < 8; n++ ) + { + ISLESS( data4[n], other.data4[n] ); + } + return FALSE; +} + +/*! + \fn bool QUuid::operator>(const QUuid &other) const + + Returns TRUE if this QUuid is of the same variant, + and lexicographically after the \a other QUuid; + otherwise returns FALSE. + + \sa variant() +*/ +#define ISMORE(f1, f2) if (f1!=f2) return (f1>f2); +bool QUuid::operator>(const QUuid &other ) const +{ + if ( variant() != other.variant() ) + return FALSE; + + ISMORE( data1, other.data1 ); + ISMORE( data2, other.data2 ); + ISMORE( data3, other.data3 ); + for ( int n = 0; n < 8; n++ ) + { + ISMORE( data4[n], other.data4[n] ); + } + return FALSE; +} diff --git a/library/quuid.h b/library/quuid.h index 841a00f..1575711 100644 --- a/library/quuid.h +++ b/library/quuid.h @@ -16,148 +16,101 @@ ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef QUUID_H #define QUUID_H #ifndef QT_H #include <qstring.h> #endif // QT_H -#include <memory.h> - -#if defined(Q_OS_WIN32) -#ifndef GUID_DEFINED -#define GUID_DEFINED -typedef struct _GUID -{ - ulong Data1; - ushort Data2; - ushort Data3; - uchar Data4[ 8 ]; -} GUID; -#endif -#endif - -#if defined( Q_WS_QWS ) && !defined( UUID_H_INCLUDED ) -typedef unsigned char uuid_t[16]; -#endif - struct Q_EXPORT QUuid { + enum Variant { + VarUnknown =-1, + NCS = 0, // 0 - - + DCE = 2, // 1 0 - + Microsoft = 6, // 1 1 0 + Reserved = 7 // 1 1 1 + }; + QUuid() { memset( this, 0, sizeof(QUuid) ); } QUuid( uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8 ) { data1 = l; data2 = w1; data3 = w2; data4[0] = b1; data4[1] = b2; data4[2] = b3; data4[3] = b4; data4[4] = b5; data4[5] = b6; data4[6] = b7; data4[7] = b8; } QUuid( const QUuid &uuid ) { - memcpy( this, &uuid, sizeof(QUuid) ); + uint i; + + data1 = uuid.data1; + data2 = uuid.data2; + data3 = uuid.data3; + for( i = 0; i < 8; i++ ) + data4[ i ] = uuid.data4[ i ]; } + #ifndef QT_NO_QUUID_STRING QUuid( const QString & ); QString toString() const; #endif bool isNull() const; QUuid &operator=(const QUuid &orig ) { - memcpy( this, &orig, sizeof(QUuid) ); - return *this; - } - - bool operator==(const QUuid &orig ) const - { - return !memcmp( this, &orig, sizeof(QUuid) ); - } - - bool operator!=(const QUuid &orig ) const - { - return !( *this == orig ); - } - - inline bool operator<(const QUuid &orig) const - { - return ( memcmp(this, &orig, sizeof(QUuid)) < 0); - } - - inline bool operator>(const QUuid &orig) const - { - return ( memcmp(this, &orig, sizeof(QUuid) ) > 0); - } + uint i; -#if defined(Q_OS_WIN32) - // On Windows we have a type GUID that is used by the platform API, so we - // provide convenience operators to cast from and to this type. - QUuid( const GUID &guid ) - { - memcpy( this, &guid, sizeof(GUID) ); - } + data1 = orig.data1; + data2 = orig.data2; + data3 = orig.data3; + for( i = 0; i < 8; i++ ) + data4[ i ] = orig.data4[ i ]; - QUuid &operator=(const GUID &orig ) - { - memcpy( this, &orig, sizeof(QUuid) ); return *this; } - operator GUID() const - { - GUID guid = { data1, data2, data3, { data4[0], data4[1], data4[2], data4[3], data4[4], data4[5], data4[6], data4[7] } }; - return guid; - } - - bool operator==( const GUID &guid ) const + bool operator==(const QUuid &orig ) const { - return !memcmp( this, &guid, sizeof(QUuid) ); - } + uint i; + if ( data1 != orig.data1 || data2 != orig.data2 || + data3 != orig.data3 ) + return FALSE; - bool operator!=( const GUID &guid ) const - { - return !( *this == guid ); - } + for( i = 0; i < 8; i++ ) + if ( data4[i] != orig.data4[i] ) + return FALSE; - inline bool operator<(const QUuid &orig) const - { - return ( memcmp(this, &orig, sizeof(QUuid) ) < 0); + return TRUE; } - inline bool operator>(const QUuid &orig) const + bool operator!=(const QUuid &orig ) const { - return ( memcmp(this, &orig, sizeof(QUuid) ) > 0); + return !( *this == orig ); } -#endif -#if defined (Q_WS_QWS) - QUuid( uuid_t uuid ) - { - memcpy( this, uuid, sizeof(uuid_t) ); - } + bool operator<(const QUuid &other ) const; + bool operator>(const QUuid &other ) const; - QUuid &operator=(const uuid_t &orig ) - { - memcpy( this, &orig, sizeof(uuid_t) ); - return *this; - } -#endif + QUuid::Variant variant() const; ulong data1; ushort data2; ushort data3; uchar data4[ 8 ]; }; #endif //QUUID_H |