Release 980201
[wine.git] / ole / compobj.c
blobef476a962aeebc4c6ce660f24eeda6a7669d7c0c
1 /*
2 * COMPOBJ library
4 * Copyright 1995 Martin von Loewis
5 */
7 #define INITGUID
9 #include <ctype.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <time.h>
13 #include "ole.h"
14 #include "ole2.h"
15 #include "stddebug.h"
16 #include "debug.h"
17 #include "file.h"
18 #include "compobj.h"
19 #include "interfaces.h"
20 #include "shlobj.h"
21 #include "ddraw.h"
22 #include "dsound.h"
23 #include "dinput.h"
24 #include "d3d.h"
26 DWORD currentMalloc=0;
28 /***********************************************************************
29 * CoBuildVersion [COMPOBJ.1]
31 DWORD WINAPI CoBuildVersion()
33 dprintf_ole(stddeb,"CoBuildVersion()\n");
34 return (rmm<<16)+rup;
37 /***********************************************************************
38 * CoInitialize [COMPOBJ.2]
39 * lpReserved is an IMalloc pointer in 16bit OLE. We just stored it as-is.
41 HRESULT WINAPI CoInitialize(DWORD lpReserved)
43 dprintf_ole(stdnimp,"CoInitialize\n");
44 /* remember the LPMALLOC, maybe somebody wants to read it later on */
45 currentMalloc = lpReserved;
46 return S_OK;
49 /***********************************************************************
50 * CoUnitialize [COMPOBJ.3]
52 void WINAPI CoUnitialize()
54 dprintf_ole(stdnimp,"CoUnitialize()\n");
57 /***********************************************************************
58 * CoGetMalloc [COMPOBJ.4]
60 HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
62 if(currentMalloc)
64 *lpMalloc = currentMalloc;
65 return S_OK;
67 *lpMalloc = 0;
68 /* 16-bit E_NOTIMPL */
69 return 0x80000001L;
72 /***********************************************************************
73 * CoDisconnectObject
75 OLESTATUS WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
77 dprintf_ole(stdnimp,"CoDisconnectObject:%p %lx\n",lpUnk,reserved);
78 return OLE_OK;
81 /***********************************************************************
82 * IsEqualGUID [COMPOBJ.18]
84 BOOL16 WINAPI IsEqualGUID(GUID* g1, GUID* g2)
86 return !memcmp( g1, g2, sizeof(GUID) );
89 /***********************************************************************
90 * CLSIDFromString [COMPOBJ.20]
93 /* Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] */
95 OLESTATUS WINAPI CLSIDFromString(const LPCSTR idstr, CLSID *id)
97 BYTE *s = (BYTE *) idstr;
98 BYTE *p;
99 int i;
100 BYTE table[256];
102 dprintf_ole(stddeb,"ClsIDFromString() %s -> %p\n", idstr, id);
104 /* quick lookup table */
105 memset(table, 0, 256);
107 for (i = 0; i < 10; i++) {
108 table['0' + i] = i;
110 for (i = 0; i < 6; i++) {
111 table['A' + i] = i+10;
112 table['a' + i] = i+10;
115 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
117 if (strlen(idstr) != 38)
118 return OLE_ERROR_OBJECT;
120 p = (BYTE *) id;
122 s++; /* skip leading brace */
123 for (i = 0; i < 4; i++) {
124 p[3 - i] = table[*s]<<4 | table[*(s+1)];
125 s += 2;
127 p += 4;
128 s++; /* skip - */
130 for (i = 0; i < 2; i++) {
131 p[1-i] = table[*s]<<4 | table[*(s+1)];
132 s += 2;
134 p += 2;
135 s++; /* skip - */
137 for (i = 0; i < 2; i++) {
138 p[1-i] = table[*s]<<4 | table[*(s+1)];
139 s += 2;
141 p += 2;
142 s++; /* skip - */
144 /* these are just sequential bytes */
145 for (i = 0; i < 2; i++) {
146 *p++ = table[*s]<<4 | table[*(s+1)];
147 s += 2;
149 s++; /* skip - */
151 for (i = 0; i < 6; i++) {
152 *p++ = table[*s]<<4 | table[*(s+1)];
153 s += 2;
156 return OLE_OK;
159 /***********************************************************************
160 * StringFromCLSID [COMPOBJ.19]
162 OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
164 static const char *hex = "0123456789ABCDEF";
165 char *s;
166 int i;
168 sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
169 id->Data1, id->Data2, id->Data3,
170 id->Data4[0], id->Data4[1]);
171 s = &idstr[25];
173 /* 6 hex bytes */
174 for (i = 2; i < 8; i++) {
175 *s++ = hex[id->Data4[i]>>4];
176 *s++ = hex[id->Data4[i] & 0xf];
179 *s++ = '}';
180 *s++ = '\0';
182 for (i = strlen(idstr)-1; i >= 0; i--) {
183 idstr[i] = toupper(idstr[i]);
186 dprintf_ole(stddeb,"StringFromClsID: %p->%s\n", id, idstr);
188 return OLE_OK;
191 /***********************************************************************
192 * CLSIDFromProgID [COMPOBJ.61]
195 OLESTATUS WINAPI CLSIDFromProgID(LPCSTR progid,LPCLSID riid)
197 char *buf,buf2[80];
198 DWORD buf2len;
199 HRESULT err;
200 HKEY xhkey;
202 buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
203 sprintf(buf,"%s\\CLSID",progid);
204 if ((err=RegOpenKey32A(HKEY_CLASSES_ROOT,buf,&xhkey))) {
205 HeapFree(GetProcessHeap(),0,buf);
206 return OLE_ERROR_GENERIC;
208 HeapFree(GetProcessHeap(),0,buf);
209 buf2len = sizeof(buf2);
210 if ((err=RegQueryValue32A(xhkey,NULL,buf2,&buf2len))) {
211 RegCloseKey(xhkey);
212 return OLE_ERROR_GENERIC;
214 RegCloseKey(xhkey);
215 return CLSIDFromString(buf2,riid);
218 OLESTATUS WINAPI LookupETask(LPVOID p1,LPVOID p2) {
219 fprintf(stderr,"LookupETask(%p,%p),stub!\n",p1,p2);
220 return 0;
223 OLESTATUS WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) {
224 fprintf(stderr,"CallObjectInWOW(%p,%p),stub!\n",p1,p2);
225 return 0;
228 /***********************************************************************
229 * CoRegisterClassObject [COMPOBJ.5]
231 OLESTATUS WINAPI CoRegisterClassObject(
232 REFCLSID rclsid, LPUNKNOWN pUnk,DWORD dwClsContext,DWORD flags,
233 LPDWORD lpdwRegister
235 char buf[80];
237 StringFromCLSID(rclsid,buf);
239 fprintf(stderr,"CoRegisterClassObject(%s,%p,0x%08lx,0x%08lx,%p),stub\n",
240 buf,pUnk,dwClsContext,flags,lpdwRegister
242 return 0;
245 /***********************************************************************
246 * CoRegisterClassObject [COMPOBJ.27]
248 OLESTATUS WINAPI CoRegisterMessageFilter16(
249 LPMESSAGEFILTER lpMessageFilter,LPMESSAGEFILTER *lplpMessageFilter
251 fprintf(stderr,"CoRegisterMessageFilter(%p,%p),stub!\n",
252 lpMessageFilter,lplpMessageFilter
254 return 0;
257 /***********************************************************************
258 * CoCreateInstance [COMPOBJ.13, OLE32.7]
260 HRESULT WINAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
261 DWORD dwClsContext, REFIID riid, LPVOID *ppv)
263 fprintf(stderr, "CoCreateInstance(): stub !\n");
264 *ppv = NULL;
265 return S_OK;
268 /***********************************************************************
269 * CoFreeUnusedLibraries [COMPOBJ.17]
271 void WINAPI CoFreeUnusedLibraries()
273 fprintf(stderr, "CoFreeUnusedLibraries(): stub !\n");
276 /***********************************************************************
277 * CoFileTimeNow [COMPOBJ.82, OLE32.10]
279 * stores the current system time in lpFileTime
281 HRESULT WINAPI CoFileTimeNow(FILETIME *lpFileTime)
283 DOSFS_UnixTimeToFileTime(time(NULL), lpFileTime, 0);
284 return S_OK;