Changeset 291 for trunk/src/ole32/clsid.cpp
- Timestamp:
- Jul 12, 1999, 2:21:37 AM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/clsid.cpp
r197 r291 1 /* 2 * 1 /* 2 * 3 3 * Project Odin Software License can be found in LICENSE.TXT 4 * 4 * 5 5 */ 6 /* 7 * Win32 OLE stubs for OS/2 8 * 9 * 1998/06/12 10 * 11 * Copyright 1998 Sander van Leeuwen 6 /* 7 * ClassID Manipulation. 8 * 9 * 1/7/99 10 * 11 * Copyright 1999 David J. Raison 12 * 13 * Some portions from Wine Implementation 14 * Copyright 1995 Martin von Loewis 15 * Copyright 1998 Justin Bradford 16 * Copyright 1999 Francis Beaudet 17 * Copyright 1999 Sylvain St-Germain 12 18 */ 13 19 … … 15 21 16 22 #include "oString.h" 17 18 // ----------------------------------------------------------------------19 // CLSIDFromStringA() [Internal]20 // ----------------------------------------------------------------------21 static HRESULT CLSIDFromStringA(22 const char * lpsz, // [in] - ASCII string to convert23 LPCLSID pclisid) // [out] - CLSID24 {25 dprintf(("OLE32.CLSIDFromStringA [Internal]\n"));26 27 BYTE *s = (BYTE *) lpsz;28 BYTE *p;29 int i;30 BYTE table[256];31 32 /* quick lookup table */33 memset(table, 0, 256);34 35 for (i = 0; i < 10; i++)36 {37 table['0' + i] = i;38 }39 for (i = 0; i < 6; i++)40 {41 table['A' + i] = i+10;42 table['a' + i] = i+10;43 }44 45 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */46 47 if (strlen(lpsz) != 38)48 return OLE_ERROR_OBJECT;49 50 p = (BYTE *) pclisid;51 52 s++; /* skip leading brace */53 for (i = 0; i < 4; i++)54 {55 p[3 - i] = table[*s]<<4 | table[*(s+1)];56 s += 2;57 }58 p += 4;59 s++; /* skip - */60 61 for (i = 0; i < 2; i++)62 {63 p[1-i] = table[*s]<<4 | table[*(s+1)];64 s += 2;65 }66 p += 2;67 s++; /* skip - */68 69 for (i = 0; i < 2; i++)70 {71 p[1-i] = table[*s]<<4 | table[*(s+1)];72 s += 2;73 }74 p += 2;75 s++; /* skip - */76 77 /* these are just sequential bytes */78 for (i = 0; i < 2; i++)79 {80 *p++ = table[*s]<<4 | table[*(s+1)];81 s += 2;82 }83 s++; /* skip - */84 85 for (i = 0; i < 6; i++)86 {87 *p++ = table[*s]<<4 | table[*(s+1)];88 s += 2;89 }90 91 return S_OK;92 }93 23 94 24 // ---------------------------------------------------------------------- … … 99 29 LPCLSID pclsid) // [out] - CLSID 100 30 { 101 dprintf(("OLE32 .CLSIDFromProgID\n"));31 dprintf(("OLE32: CLSIDFromProgID")); 102 32 103 33 LONG lDataLen = 80; 104 oString AszKey(lpszProgID);105 oString AszCLSID(lDataLen);34 oStringW szKey(lpszProgID); 35 oStringW szCLSID(lDataLen); 106 36 HKEY hKey; 107 37 HRESULT rc; 108 38 109 39 // Create the registry lookup string... 110 szKey += "\\CLSID";40 szKey += L"\\CLSID"; 111 41 112 42 // Try to open the key in the registry... 113 rc = RegOpenKey A(HKEY_CLASSES_ROOT, szKey, &hKey);43 rc = RegOpenKeyW(HKEY_CLASSES_ROOT, szKey, &hKey); 114 44 if (rc != 0) 115 45 return OLE_ERROR_GENERIC; 116 46 117 47 // Now get the data from the _default_ entry on this key... 118 rc = RegQueryValue A(hKey, NULL, szCLSID, &lDataLen);48 rc = RegQueryValueW(hKey, NULL, szCLSID, &lDataLen); 119 49 RegCloseKey(hKey); 120 50 if (rc != 0) … … 122 52 123 53 // Now convert from a string to a UUID 124 return CLSIDFromStringA(szCLSID, pclsid); 54 return CLSIDFromString(szCLSID, pclsid); 55 } 56 57 // ---------------------------------------------------------------------- 58 // IIDFromString 59 // ---------------------------------------------------------------------- 60 HRESULT WIN32API IIDFromString(LPSTR lpsz, LPIID lpiid) 61 { 62 dprintf(("OLE32: IIDFromString")); 63 return CLSIDFromString((LPCOLESTR)lpsz, (LPCLSID)lpiid); 125 64 } 126 65 … … 132 71 LPCLSID pclsid) // [out] - Binary CLSID 133 72 { 134 dprintf(("OLE32.CLSIDFromString\n")); 73 dprintf(("OLE32: CLSIDFromString")); 74 75 oStringA tClsId(lpsz); 135 76 136 77 HRESULT ret = OLE_ERROR_GENERIC; 137 oStringA szCLSID(lpsz);138 78 139 79 // Convert to binary CLSID 140 return CLSIDFromStringA(szCLSID, pclsid); 141 } 142 80 char *s = (char *) tClsId; 81 char *p; 82 int i; 83 char table[256]; 84 85 /* quick lookup table */ 86 memset(table, 0, 256); 87 88 for (i = 0; i < 10; i++) 89 { 90 table['0' + i] = i; 91 } 92 for (i = 0; i < 6; i++) 93 { 94 table['A' + i] = i+10; 95 table['a' + i] = i+10; 96 } 97 98 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ 99 100 if (lstrlenW(lpsz) != 38) 101 return OLE_ERROR_OBJECT; 102 103 p = (char *) pclsid; 104 105 s++; /* skip leading brace */ 106 for (i = 0; i < 4; i++) 107 { 108 p[3 - i] = table[*s]<<4 | table[*(s+1)]; 109 s += 2; 110 } 111 p += 4; 112 s++; /* skip - */ 113 114 for (i = 0; i < 2; i++) 115 { 116 p[1-i] = table[*s]<<4 | table[*(s+1)]; 117 s += 2; 118 } 119 p += 2; 120 s++; /* skip - */ 121 122 for (i = 0; i < 2; i++) 123 { 124 p[1-i] = table[*s]<<4 | table[*(s+1)]; 125 s += 2; 126 } 127 p += 2; 128 s++; /* skip - */ 129 130 /* these are just sequential bytes */ 131 for (i = 0; i < 2; i++) 132 { 133 *p++ = table[*s]<<4 | table[*(s+1)]; 134 s += 2; 135 } 136 s++; /* skip - */ 137 138 for (i = 0; i < 6; i++) 139 { 140 *p++ = table[*s]<<4 | table[*(s+1)]; 141 s += 2; 142 } 143 144 return S_OK; 145 } 146 147 // ---------------------------------------------------------------------- 148 // CoCreateGuid() 149 // ---------------------------------------------------------------------- 150 HRESULT WIN32API CoCreateGuid(GUID *pguid) 151 { 152 dprintf(("OLE32: CoCreateGuid")); 153 memset(pguid, 0, sizeof(GUID)); //TODO: should be random GUID 154 return S_OK; 155 } 156 157 // ---------------------------------------------------------------------- 158 // StringFromCLSID 159 // Memory allocated here on behalf of application should be freed using CoTaskMemFree() 160 // ---------------------------------------------------------------------- 161 HRESULT WIN32API StringFromCLSID(REFCLSID rclsid, LPOLESTR *ppsz) 162 { 163 char tmp[50]; 164 LPWSTR szclsid; 165 size_t strLen; 166 167 dprintf(("OLE32: StringFromCLSID")); 168 169 // Setup new string... 170 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", 171 rclsid->Data1, 172 rclsid->Data2, 173 rclsid->Data3, 174 rclsid->Data4[0], 175 rclsid->Data4[1], 176 rclsid->Data4[2], 177 rclsid->Data4[3], 178 rclsid->Data4[4], 179 rclsid->Data4[5], 180 rclsid->Data4[6], 181 rclsid->Data4[7]); 182 183 // Grab buffer for string... 184 szclsid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR)); 185 186 AsciiToUnicode(tmp, szclsid); 187 188 *ppsz = (LPOLESTR)szclsid; 189 190 return S_OK; 191 } 192 193 // ---------------------------------------------------------------------- 194 // StringFromIID 195 // Memory allocated here on behalf of application should be freed using CoTaskMemFree() 196 // ---------------------------------------------------------------------- 197 HRESULT WIN32API StringFromIID(REFIID riid, LPOLESTR *ppsz) 198 { 199 char tmp[50]; 200 LPWSTR sziid; 201 size_t strLen; 202 203 dprintf(("OLE32: StringFromIID")); 204 205 // Setup new string... 206 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", 207 riid->Data1, 208 riid->Data2, 209 riid->Data3, 210 riid->Data4[0], 211 riid->Data4[1], 212 riid->Data4[2], 213 riid->Data4[3], 214 riid->Data4[4], 215 riid->Data4[5], 216 riid->Data4[6], 217 riid->Data4[7]); 218 219 // Grab buffer for string... 220 sziid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR)); 221 222 AsciiToUnicode(tmp, sziid); 223 224 *ppsz = (LPOLESTR)sziid; 225 226 return S_OK; 227 } 228 229 // ---------------------------------------------------------------------- 230 // StringFromGUID2 231 // ---------------------------------------------------------------------- 232 int WIN32API StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cbMax) 233 { 234 char tmp[64]; 235 size_t strLen; 236 237 dprintf(("OLE32: StringFromGUID2")); 238 239 // Setup new string... 240 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", 241 rguid->Data1, 242 rguid->Data2, 243 rguid->Data3, 244 rguid->Data4[0], 245 rguid->Data4[1], 246 rguid->Data4[2], 247 rguid->Data4[3], 248 rguid->Data4[4], 249 rguid->Data4[5], 250 rguid->Data4[6], 251 rguid->Data4[7]); 252 253 if(cbMax < (strLen * 2 + 1)) 254 return 0; 255 256 AsciiToUnicode(tmp, lpsz); 257 258 return(strLen * 2 + 1); // including 0 terminator 259 } 260
Note:
See TracChangeset
for help on using the changeset viewer.