256 lines
5.8 KiB
C
256 lines
5.8 KiB
C
/*++
|
|
|
|
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 <sysinc.h>
|
|
#include <rpc.h>
|
|
#include <uuidfmt.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
//
|
|
// 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");
|
|
}
|
|
|