4 * Copyright 1999, 2000 Marcus Meissner
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "wine/obj_olefont.h"
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ole);
40 /* The OLE Automation ProxyStub Interface Class (aka Typelib Marshaler) */
41 extern const GUID CLSID_PSOAInterface;
43 /******************************************************************************
44 * SysStringLen [OLEAUT32.7]
46 * The Windows documentation states that the length returned by this function
47 * is not necessarely the same as the length returned by the _lstrlenW method.
48 * It is the same number that was passed in as the "len" parameter if the
49 * string was allocated with a SysAllocStringLen method call.
51 int WINAPI SysStringLen(BSTR str)
57 * The length of the string (in bytes) is contained in a DWORD placed
58 * just before the BSTR pointer
60 bufferPointer = (DWORD*)str;
64 return (int)(*bufferPointer/sizeof(WCHAR));
67 /******************************************************************************
68 * SysStringByteLen [OLEAUT32.149]
70 * The Windows documentation states that the length returned by this function
71 * is not necessarely the same as the length returned by the _lstrlenW method.
72 * It is the same number that was passed in as the "len" parameter if the
73 * string was allocated with a SysAllocStringLen method call.
75 int WINAPI SysStringByteLen(BSTR str)
81 * The length of the string (in bytes) is contained in a DWORD placed
82 * just before the BSTR pointer
84 bufferPointer = (DWORD*)str;
88 return (int)(*bufferPointer);
91 /******************************************************************************
92 * SysAllocString [OLEAUT32.2]
94 * MSDN (October 2001) states that this returns a NULL value if the argument
95 * is a zero-length string. This does not appear to be true; certainly it
96 * returns a value under Win98 (Oleaut32.dll Ver 2.40.4515.0)
98 BSTR WINAPI SysAllocString(LPCOLESTR in)
102 /* Delegate this to the SysAllocStringLen32 method. */
103 return SysAllocStringLen(in, lstrlenW(in));
106 /******************************************************************************
107 * SysFreeString [OLEAUT32.6]
109 void WINAPI SysFreeString(BSTR in)
111 DWORD* bufferPointer;
113 /* NULL is a valid parameter */
117 * We have to be careful when we free a BSTR pointer, it points to
118 * the beginning of the string but it skips the byte count contained
121 bufferPointer = (DWORD*)in;
126 * Free the memory from its "real" origin.
128 HeapFree(GetProcessHeap(), 0, bufferPointer);
131 /******************************************************************************
132 * SysAllocStringLen [OLEAUT32.4]
134 * In "Inside OLE, second edition" by Kraig Brockshmidt. In the Automation
135 * section, he describes the DWORD value placed *before* the BSTR data type.
136 * he describes it as a "DWORD count of characters". By experimenting with
137 * a windows application, this count seems to be a DWORD count of bytes in
138 * the string. Meaning that the count is double the number of wide
139 * characters in the string.
141 BSTR WINAPI SysAllocStringLen(const OLECHAR *in, unsigned int len)
148 * Find the length of the buffer passed-in in bytes.
150 bufferSize = len * sizeof (WCHAR);
153 * Allocate a new buffer to hold the string.
154 * dont't forget to keep an empty spot at the beginning of the
155 * buffer for the character count and an extra character at the
158 newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(),
160 bufferSize + sizeof(WCHAR) + sizeof(DWORD));
163 * If the memory allocation failed, return a null pointer.
169 * Copy the length of the string in the placeholder.
171 *newBuffer = bufferSize;
174 * Skip the byte count.
179 * Copy the information in the buffer.
180 * Since it is valid to pass a NULL pointer here, we'll initialize the
181 * buffer to nul if it is the case.
184 memcpy(newBuffer, in, bufferSize);
186 memset(newBuffer, 0, bufferSize);
189 * Make sure that there is a nul character at the end of the
192 stringBuffer = (WCHAR*)newBuffer;
193 stringBuffer[len] = L'\0';
195 return (LPWSTR)stringBuffer;
198 /******************************************************************************
199 * SysReAllocStringLen [OLEAUT32.5]
201 int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len)
210 * Make sure we free the old string.
216 * Allocate the new string
218 *old = SysAllocStringLen(in, len);
223 /******************************************************************************
224 * SysAllocStringByteLen [OLEAUT32.150]
227 BSTR WINAPI SysAllocStringByteLen(LPCSTR in, UINT len)
233 * Allocate a new buffer to hold the string.
234 * dont't forget to keep an empty spot at the beginning of the
235 * buffer for the character count and an extra character at the
238 newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(),
240 len + sizeof(WCHAR) + sizeof(DWORD));
243 * If the memory allocation failed, return a null pointer.
249 * Copy the length of the string in the placeholder.
254 * Skip the byte count.
259 * Copy the information in the buffer.
260 * Since it is valid to pass a NULL pointer here, we'll initialize the
261 * buffer to nul if it is the case.
264 memcpy(newBuffer, in, len);
267 * Make sure that there is a nul character at the end of the
270 stringBuffer = (char *)newBuffer;
271 stringBuffer[len] = 0;
272 stringBuffer[len+1] = 0;
274 return (LPWSTR)stringBuffer;
277 /******************************************************************************
278 * SysReAllocString [OLEAUT32.3]
280 INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in)
289 * Make sure we free the old string.
295 * Allocate the new string
297 *old = SysAllocString(in);
302 static WCHAR _delimiter[2] = {'!',0}; /* default delimiter apparently */
303 static WCHAR *pdelimiter = &_delimiter[0];
305 /***********************************************************************
306 * RegisterActiveObject (OLEAUT32.33)
308 HRESULT WINAPI RegisterActiveObject(
309 LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister
313 LPRUNNINGOBJECTTABLE runobtable;
316 StringFromGUID2(rcid,guidbuf,39);
317 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
320 ret = GetRunningObjectTable(0,&runobtable);
322 IMoniker_Release(moniker);
325 ret = IRunningObjectTable_Register(runobtable,dwFlags,punk,moniker,pdwRegister);
326 IRunningObjectTable_Release(runobtable);
327 IMoniker_Release(moniker);
331 /***********************************************************************
332 * RevokeActiveObject (OLEAUT32.34)
334 HRESULT WINAPI RevokeActiveObject(DWORD xregister,LPVOID reserved)
336 LPRUNNINGOBJECTTABLE runobtable;
339 ret = GetRunningObjectTable(0,&runobtable);
340 if (FAILED(ret)) return ret;
341 ret = IRunningObjectTable_Revoke(runobtable,xregister);
342 if (SUCCEEDED(ret)) ret = S_OK;
343 IRunningObjectTable_Release(runobtable);
347 /***********************************************************************
348 * GetActiveObject (OLEAUT32.35)
350 HRESULT WINAPI GetActiveObject(REFCLSID rcid,LPVOID preserved,LPUNKNOWN *ppunk)
354 LPRUNNINGOBJECTTABLE runobtable;
357 StringFromGUID2(rcid,guidbuf,39);
358 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
361 ret = GetRunningObjectTable(0,&runobtable);
363 IMoniker_Release(moniker);
366 ret = IRunningObjectTable_GetObject(runobtable,moniker,ppunk);
367 IRunningObjectTable_Release(runobtable);
368 IMoniker_Release(moniker);
373 /***********************************************************************
374 * OaBuildVersion [OLEAUT32.170]
376 * known OLEAUT32.DLL versions:
377 * OLE 2.1 NT 1993-95 10 3023
379 * Win32s 1.1e 20 4049
380 * OLE 2.20 W95/NT 1993-96 20 4112
381 * OLE 2.20 W95/NT 1993-96 20 4118
382 * OLE 2.20 W95/NT 1993-96 20 4122
383 * OLE 2.30 W95/NT 1993-98 30 4265
384 * OLE 2.40 NT?? 1993-98 40 4267
385 * OLE 2.40 W98 SE orig. file 1993-98 40 4275
386 * OLE 2.40 W2K orig. file 1993-XX 40 4514
388 * I just decided to use version 2.20 for Win3.1, 2.30 for Win95 & NT 3.51,
389 * and 2.40 for all newer OSs. The build number is maximum, i.e. 0xffff.
391 UINT WINAPI OaBuildVersion()
393 switch(GetVersion() & 0x8000ffff) /* mask off build number */
395 case 0x80000a03: /* WIN31 */
396 return MAKELONG(0xffff, 20);
397 case 0x00003303: /* NT351 */
398 return MAKELONG(0xffff, 30);
399 case 0x80000004: /* WIN95; I'd like to use the "standard" w95 minor
400 version here (30), but as we still use w95
401 as default winver (which is good IMHO), I better
402 play safe and use the latest value for w95 for now.
403 Change this as soon as default winver gets changed
404 to something more recent */
405 case 0x80000a04: /* WIN98 */
406 case 0x00000004: /* NT40 */
407 case 0x00000005: /* W2K */
408 return MAKELONG(0xffff, 40);
410 ERR("Version value not known yet. Please investigate it !\n");
415 /******************************************************************************
416 * OleTranslateColor [OLEAUT32.421]
418 * Converts an OLE_COLOR to a COLORREF.
419 * See the documentation for conversion rules.
420 * pColorRef can be NULL. In that case the user only wants to test the
423 HRESULT WINAPI OleTranslateColor(
429 BYTE b = HIBYTE(HIWORD(clr));
431 TRACE("(%08lx, %p, %p):stub\n", clr, hpal, pColorRef);
434 * In case pColorRef is NULL, provide our own to simplify the code.
436 if (pColorRef == NULL)
437 pColorRef = &colorref;
444 *pColorRef = PALETTERGB(GetRValue(clr),
459 * Validate the palette index.
461 if (GetPaletteEntries(hpal, LOWORD(clr), 1, &pe) == 0)
476 int index = LOBYTE(LOWORD(clr));
479 * Validate GetSysColor index.
481 if ((index < COLOR_SCROLLBAR) || (index > COLOR_GRADIENTINACTIVECAPTION))
484 *pColorRef = GetSysColor(index);
496 /***********************************************************************
497 * DllRegisterServer (OLEAUT32.320)
499 HRESULT WINAPI OLEAUT32_DllRegisterServer() {
504 /***********************************************************************
505 * DllUnregisterServer (OLEAUT32.321)
507 HRESULT WINAPI OLEAUT32_DllUnregisterServer() {
512 extern void _get_STDFONT_CF(LPVOID);
513 extern void _get_STDPIC_CF(LPVOID);
515 /***********************************************************************
516 * DllGetClassObject (OLEAUT32.1)
518 HRESULT WINAPI OLEAUT32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
521 if (IsEqualGUID(rclsid,&CLSID_StdFont)) {
522 if (IsEqualGUID(iid,&IID_IClassFactory)) {
523 _get_STDFONT_CF(ppv);
524 IClassFactory_AddRef((IClassFactory*)*ppv);
528 if (IsEqualGUID(rclsid,&CLSID_StdPicture)) {
529 if (IsEqualGUID(iid,&IID_IClassFactory)) {
531 IClassFactory_AddRef((IClassFactory*)*ppv);
535 if (IsEqualGUID(rclsid,&CLSID_PSOAInterface)) {
536 if (S_OK==TypeLibFac_DllGetClassObject(rclsid,iid,ppv))
540 FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid));
541 return CLASS_E_CLASSNOTAVAILABLE;
544 /***********************************************************************
545 * DllCanUnloadNow (OLEAUT32.410)
547 HRESULT WINAPI OLEAUT32_DllCanUnloadNow() {
548 FIXME("(), stub!\n");