Release 971130
[wine/hacks.git] / ole / compobj.c
blob7287bfef6dc9b41f289287ded78d44b90047a213
1 /*
2 * COMPOBJ library
4 * Copyright 1995 Martin von Loewis
5 */
7 /* At the moment, these are only empty stubs.
8 */
9 #define INITGUID
11 #include <ctype.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include "ole.h"
15 #include "ole2.h"
16 #include "stddebug.h"
17 #include "debug.h"
18 #include "compobj.h"
19 #include "interfaces.h"
20 #include "shlobj.h"
22 DWORD currentMalloc=0;
24 /***********************************************************************
25 * CoBuildVersion [COMPOBJ.1]
27 DWORD WINAPI CoBuildVersion()
29 dprintf_ole(stddeb,"CoBuildVersion()\n");
30 return (rmm<<16)+rup;
33 /***********************************************************************
34 * CoInitialize [COMPOBJ.2]
35 * lpReserved is an IMalloc pointer in 16bit OLE. We just stored it as-is.
37 HRESULT WINAPI CoInitialize(DWORD lpReserved)
39 dprintf_ole(stdnimp,"CoInitialize\n");
40 /* remember the LPMALLOC, maybe somebody wants to read it later on */
41 currentMalloc = lpReserved;
42 return S_OK;
45 /***********************************************************************
46 * CoUnitialize [COMPOBJ.3]
48 void WINAPI CoUnitialize()
50 dprintf_ole(stdnimp,"CoUnitialize()\n");
53 /***********************************************************************
54 * CoGetMalloc [COMPOBJ.4]
56 HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
58 if(currentMalloc)
60 *lpMalloc = currentMalloc;
61 return S_OK;
63 *lpMalloc = 0;
64 /* 16-bit E_NOTIMPL */
65 return 0x80000001L;
68 /***********************************************************************
69 * CoDisconnectObject
71 OLESTATUS WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
73 dprintf_ole(stdnimp,"CoDisconnectObject:%p %lx\n",lpUnk,reserved);
74 return OLE_OK;
77 /***********************************************************************
78 * IsEqualGUID [COMPOBJ.18]
80 BOOL16 WINAPI IsEqualGUID(GUID* g1, GUID* g2)
82 return !memcmp( g1, g2, sizeof(GUID) );
85 /***********************************************************************
86 * CLSIDFromString [COMPOBJ.20]
89 /* Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] */
91 OLESTATUS WINAPI CLSIDFromString(const LPCSTR idstr, CLSID *id)
93 BYTE *s = (BYTE *) idstr;
94 BYTE *p;
95 int i;
96 BYTE table[256];
98 dprintf_ole(stddeb,"ClsIDFromString() %s -> %p\n", idstr, id);
100 /* quick lookup table */
101 memset(table, 0, 256);
103 for (i = 0; i < 10; i++) {
104 table['0' + i] = i;
106 for (i = 0; i < 6; i++) {
107 table['A' + i] = i+10;
108 table['a' + i] = i+10;
111 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
113 if (strlen(idstr) != 38)
114 return OLE_ERROR_OBJECT;
116 p = (BYTE *) id;
118 s++; /* skip leading brace */
119 for (i = 0; i < 4; i++) {
120 p[3 - i] = table[*s]<<4 | table[*(s+1)];
121 s += 2;
123 p += 4;
124 s++; /* skip - */
126 for (i = 0; i < 2; i++) {
127 p[1-i] = table[*s]<<4 | table[*(s+1)];
128 s += 2;
130 p += 2;
131 s++; /* skip - */
133 for (i = 0; i < 2; i++) {
134 p[1-i] = table[*s]<<4 | table[*(s+1)];
135 s += 2;
137 p += 2;
138 s++; /* skip - */
140 /* these are just sequential bytes */
141 for (i = 0; i < 2; i++) {
142 *p++ = table[*s]<<4 | table[*(s+1)];
143 s += 2;
145 s++; /* skip - */
147 for (i = 0; i < 6; i++) {
148 *p++ = table[*s]<<4 | table[*(s+1)];
149 s += 2;
152 return OLE_OK;
155 /***********************************************************************
156 * CLSIDFromString [COMPOBJ.19]
159 OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
161 static const char *hex = "0123456789ABCDEF";
162 char *s;
163 int i;
165 sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
166 id->Data1, id->Data2, id->Data3,
167 id->Data4[0], id->Data4[1]);
168 s = &idstr[25];
170 /* 6 hex bytes */
171 for (i = 2; i < 8; i++) {
172 *s++ = hex[id->Data4[i]>>4];
173 *s++ = hex[id->Data4[i] & 0xf];
176 *s++ = '}';
177 *s++ = '\0';
179 for (i = strlen(idstr)-1; i >= 0; i--) {
180 idstr[i] = toupper(idstr[i]);
183 dprintf_ole(stddeb,"StringFromClsID: %p->%s\n", id, idstr);
185 return OLE_OK;