ON_UUID ON_UuidFromString( const wchar_t* sUUID ) { wchar_t w; char s[64]; int i; while ( *sUUID && *sUUID <= ' ' ) // skip leading white space sUUID++; if ( *sUUID == '{' ) sUUID++; i = 0; while (i < 63 ) { w = *sUUID++; if ( w >= 'A' && w <= 'F' ) s[i++] = (char)w; else if ( w >= '0' && w <='9' ) s[i++] = (char)w; else if ( w >= 'a' && w <= 'f' ) s[i++] = (char)w; else if ( w != '-' ) break; } s[i] = 0; return ON_UuidFromString(s); }
char* ON_UuidToString( const ON_UUID& uuid, char* s) { // s - [out] The s[] char array must have length >= 37. // The returned char array will have a 36 // character uuid in s[0..35] and a null in s[36]. // NOTE WELL: // This code has to work on non-Windows OSs and on both big and // little endian CPUs. The result must satisfy // uuid == ON_UuidFromString(ON_UuidToString(uuid,s)) // 31 August 2005 Dale Lear // Changed upper case to lower case so result is // identical to the string returned by Windows' ::UuidToString(). //static const char x[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; static const char x[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; static const int addhyphen[16] = {0,0,0,1, 0,1, 0,1, 0,1, 0, 0, 0, 0, 0, 0}; const unsigned char* b = (const unsigned char*)&uuid; char* p; int i; static const int* rho = ( ON::big_endian == ON::Endian() ) ? big_endian_rho : little_endian_rho; // 5 December 2002 Dale Lear: // There is either a bug in Purify (likely) or perhaps a bug in the // way Microsoft compiles c>>4 when c is an unsigned char. In any // case, changing c to an unsigned int makes purify happy and should // work just as well. // //unsigned char c; unsigned int c; if ( !s ) return 0; p = s; for ( i = 0; i < 16; i++ ) { c = b[rho[i]]; *p++ = x[c>>4]; // purify gripes here if c is an unsigned char - the code runs fine. *p++ = x[c&0x0F]; if ( addhyphen[i] ) *p++ = '-'; } *p = 0; #if defined(ON_DEBUG) { ON_UUID u = ON_UuidFromString(s); if ( ON_UuidCompare(&u,&uuid) ) { ON_ERROR("ON_UuidToString() bug"); // <- breakpoint here } } #endif return s; }
GUID CSampleEventWatcherPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {1CCC2E4B-80AB-4370-A85E-47EDC8DACC48} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleDisplayConduitsPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {E87093E4-F872-48F1-A68C-7F2573395FAC} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleExportMeshPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {46B72A24-955D-431A-9E6C-75B8741E7728} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleHelloRhinoPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {349937A6-60EB-4474-8D4C-AE7EBDA47EC0} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleUserTextPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {2004B749-C90D-4A10-ABA8-F8C07FA543AF} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CTestRhinoCommandsPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {433C9D9B-5FDA-47CF-87C9-E8FC7F7F7D7F} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleContextMenuExtensionPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {EDA14E59-9FC1-4F79-8DBB-95FF0F8889C1} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleDocumentUserDataPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {B00B243F-2330-49C1-BB7C-C1EF3277A207} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleImportGeomviewPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {7AC5A609-B985-45D9-9B85-F04DB28FEA9D} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CHippoPlugInPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {675BD714-C05D-4B14-9066-06CB08DC7880} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CSampleObjectManagerPlugIn::PlugInID() const { // Description: // Plug-in unique identifier. The identifier is used by Rhino to // manage the plug-ins. // TODO: Return a unique identifier for the plug-in. // {990DDEEC-E207-4C17-9825-60D5E1846A41} return ON_UuidFromString( RhinoPlugInId() ); }
GUID CTestMoveControlPointPlugIn::PlugInID() const { // TODO: Return a unique identifier for the plug-in. // {F554CC1F-A47B-4D78-BF80-3F1B4866F308} return ON_UuidFromString( RhinoPlugInId() ); }
void ON_ClassId::ConstructorHelper( const char* sClassName, const char* sBaseClassName, const char* sUUID // UUID in registry format from guidgen ) { // Do not initialize "m_class_id_version" or any fields // after it in this helper. See comments in the constructors // for more information. memset( m_sClassName, 0, sizeof(m_sClassName) ); memset( m_sBaseClassName, 0, sizeof(m_sBaseClassName) ); m_uuid = ON_UuidFromString(sUUID); if ( sClassName ) { strncpy( m_sClassName, sClassName, sizeof(m_sClassName)-1 ); } if ( sBaseClassName ) { strncpy( m_sBaseClassName, sBaseClassName, sizeof(m_sBaseClassName)-1 ); } m_pBaseClassId = ClassId( m_sBaseClassName ); if ( !m_sClassName[0] ) { ON_ERROR("ON_ClassId::ON_ClassId() - missing class name"); return; } const ON_ClassId* duplicate_class = ClassId( m_sClassName ); // The m_mark0 > 2 test prevents opennurbs and Rhino from // having two ON_Object derived classes that have the same // name. Plug-ins are free to use any name. if ( 0 != duplicate_class && m_mark0 > 2 ) { char s[7]; int ver; ON_WARNING("ON_ClassId::ON_ClassId() - class name already in use. Will append number to make it unique."); for ( ver = 1; ver < 10000 && 0 != duplicate_class; ver++ ) { IntToString(ver,s); s[6] = 0; strncpy( m_sClassName, sClassName, sizeof(m_sClassName)-1 ); strncat( m_sClassName, s, sizeof(m_sClassName)-1 ); duplicate_class = ClassId( m_sClassName ); } } if ( 0 != duplicate_class ) { // Do NOT permit core classes to have duplicate names. ON_ERROR("ON_ClassId::ON_ClassId() - class name already in use."); return; } if ( m_sClassName[0] != 'O' || m_sClassName[1] != 'N' || m_sClassName[2] != '_' || m_sClassName[3] != 'O' || m_sClassName[4] != 'b' || m_sClassName[5] != 'j' || m_sClassName[6] != 'e' || m_sClassName[7] != 'c' || m_sClassName[8] != 't' || m_sClassName[9] != 0 ) { if ( !m_sBaseClassName[0] ) { ON_ERROR("ON_ClassId::ON_ClassId() - missing baseclass name."); return; } } g_bDisableDemotion = true; if ( ClassId( m_uuid ) ) { g_bDisableDemotion = false; ON_ERROR("ON_ClassId::ON_ClassId() - class uuid already in use."); return; } g_bDisableDemotion = false; if ( ON_UuidIsNil( m_uuid ) ) { ON_ERROR("ON_ClassId::ON_ClassId() - class uuid is nill."); return; } // see if any derived classes need to be updated because their static // members got initialized first if ( m_sClassName[0] ) { for ( ON_ClassId* p = m_p0; p; p = p->m_pNext ) { if ( !p->m_pBaseClassId && p->m_sBaseClassName ) { if ( !strcmp( m_sClassName, p->m_sBaseClassName ) ) p->m_pBaseClassId = this; } } } // Append to the list of class ids if ( m_p0 && m_p1 ) { m_p1->m_pNext = this; m_p1 = this; } else { // first class id m_p0 = this; } m_p1 = this; m_p1->m_pNext = 0; }