/*++ Copyright (C) Microsoft Corporation, 1992 - 1999 Module Name: uuidfmt.c {v1.00} Abstract: This module contains I_UuidStringGenerate, which coalesces the procedures UuidCreate and UuidToString to create a UUID in one of the formats IDL, C struct, or plain. Author: Joev Dubach (t-joevd) 6/11/92 Revision History: --*/ // // Defines // #define IDL_STR "[\nuuid(%s),\nversion(1.0)\n]\ninterface %s\n{\n\n}\n" // // Inclusions // // The order in which these includes are performed seems, after // extensive testing and analysis, to be highly crucial to a // successful NT build. #include #include #include #include #include // // Function prototypes. // void GenUuidAsIDL ( char PAPI * MyUuidString, char PAPI * UuidFormattedString, char PAPI * InterfaceName ); void GenUuidAsCStruct ( char PAPI * MyUuidString, char PAPI * UuidFormattedString, char PAPI * InterfaceName ); void GenUuidPlain ( char PAPI * MyUuidString, char PAPI * UuidFormattedString ); void __RPC_FAR * __RPC_API MIDL_user_allocate( size_t size ) { return malloc(size); } void __RPC_API MIDL_user_free( void __RPC_FAR * pvBuf ) { free(pvBuf); } /* Routine Description: This routine creates a UUID in one of several string representations. Arguments: Flag - UUIDGEN_FORMAT_IDL gives an IDL template; UUIDGEN_FORMAT_CSTRUCT gives a C Struct; UUIDGEN_FORMAT_PLAIN gives a plain UUID. UuidFormattedString - Must be preinitialized; will contain result. InterfaceName - Name of desired interface; used for IDL and C Structs. Return Value: RPC_S_OK - We successfully converted the UUID into its string representation. RPC_S_OUT_OF_MEMORY - Insufficient memory is available to allocate a string. RPC_S_UUID_NO_ADDRESS - We were unable to obtain the ethernet or token ring address for this machine. */ RPC_STATUS I_UuidStringGenerate( int Flag, int Sequential, int AllCaps, char PAPI * UuidFormattedString, char PAPI * InterfaceName ) { UUID MyUuid; // Storage for a retrieved UUID. char PAPI * MyUuidString; RPC_STATUS Result; int LocalOnly = 0; ASSERT( (Flag == UUIDGEN_FORMAT_IDL) || (Flag == UUIDGEN_FORMAT_CSTRUCT) || (Flag == UUIDGEN_FORMAT_PLAIN)); if (Sequential) { Result = UuidCreateSequential(&MyUuid); } else { Result = UuidCreate(&MyUuid); } ASSERT( (Result == RPC_S_UUID_NO_ADDRESS) || (Result == RPC_S_OK) || (Result == RPC_S_UUID_LOCAL_ONLY) ); if (Result == RPC_S_UUID_LOCAL_ONLY) { Result = RPC_S_OK; LocalOnly = 1; } if (Result == RPC_S_OK) { Result = UuidToString( &MyUuid, &MyUuidString ); ASSERT((Result == RPC_S_OK) || (Result == RPC_S_OUT_OF_MEMORY)); if (Result == RPC_S_OK) { if (AllCaps) { char *p = MyUuidString; while (*p) { *p= (char)toupper(*p); p++; } } switch(Flag) { case UUIDGEN_FORMAT_IDL: GenUuidAsIDL( MyUuidString, UuidFormattedString, InterfaceName ); break; case UUIDGEN_FORMAT_CSTRUCT: GenUuidAsCStruct( MyUuidString, UuidFormattedString, InterfaceName ); break; case UUIDGEN_FORMAT_PLAIN: GenUuidPlain( MyUuidString, UuidFormattedString ); } // end switch RpcStringFree(&MyUuidString); } // end if } // end if if ( (Result == RPC_S_OK) && (LocalOnly) ) { return(RPC_S_UUID_LOCAL_ONLY); } return(Result); } // end I_UuidStringGenerate void GenUuidAsIDL ( char PAPI * MyUuidString, char PAPI * UuidFormattedString, char PAPI * InterfaceName ) { sprintf( UuidFormattedString, IDL_STR, MyUuidString, InterfaceName ); } void GenUuidAsCStruct ( char PAPI * MyUuidString, char PAPI * UuidFormattedString, char PAPI * InterfaceName ) { int i; char temp[157] = "%s = { /* ........-....-....-....-............ */\n" " 0x........,\n" " 0x....,\n" " 0x....,\n" " {0x.., 0x.., 0x.., 0x.., 0x.., 0x.., 0x.., 0x..}\n" " };\n\0"; for (i=0; i<36; i++) temp[10+i] = MyUuidString[i]; for (i=0; i<8; i++) temp[56+i] = MyUuidString[i]; for (i=0; i<4; i++) temp[72+i] = MyUuidString[9+i]; for (i=0; i<4; i++) temp[84+i] = MyUuidString[14+i]; for (i=0; i<2; i++) temp[97+i] = MyUuidString[19+i]; for (i=0; i<2; i++) temp[103+i] = MyUuidString[21+i]; for (i=0; i<2; i++) temp[109+i] = MyUuidString[24+i]; for (i=0; i<2; i++) temp[115+i] = MyUuidString[26+i]; for (i=0; i<2; i++) temp[121+i] = MyUuidString[28+i]; for (i=0; i<2; i++) temp[127+i] = MyUuidString[30+i]; for (i=0; i<2; i++) temp[133+i] = MyUuidString[32+i]; for (i=0; i<2; i++) temp[139+i] = MyUuidString[34+i]; sprintf(UuidFormattedString, temp, InterfaceName); } void GenUuidPlain ( char PAPI * MyUuidString, char PAPI * UuidFormattedString ) { strcpy(UuidFormattedString, MyUuidString); strcat(UuidFormattedString, "\n"); }