Hi, This is used by a MS VisualBasic 5 installer to a large degree. What is still unknown to me is the correct mapping from CY height to font height. Ciao, Marcus Changelog: Fixed ICOM_CALLs for IFont_xx methods. Added IPersistPropertyBag, IPersistStreamInit interfaces with stubs. Implemented IDispatch::Invoke for the used DISPIDs. Index: include/wine/obj_olefont.h =================================================================== RCS file: /home/wine/wine/include/wine/obj_olefont.h,v retrieving revision 1.14 diff -u -u -r1.14 obj_olefont.h --- include/wine/obj_olefont.h 31 May 2002 23:06:51 -0000 1.14 +++ include/wine/obj_olefont.h 21 Jan 2003 22:15:27 -0000 @@ -82,27 +82,27 @@ #define IFont_putName(p,a) ICOM_CALL1(put_Name,p,a) #define IFont_get_Size(p,a) ICOM_CALL1(get_Size,p,a) #define IFont_put_Size(p,a) ICOM_CALL1(put_Size,p,a) -#define IFont_get_Bold(p,a) ICOM_CALL1(get_Bold,a) -#define IFont_put_Bold(p,a) ICOM_CALL1(put_Bold,a) -#define IFont_get_Italic(p,a) ICOM_CALL1(get_Italic,a) -#define IFont_put_Italic(p,a) ICOM_CALL1(put_Italic,a) -#define IFont_get_Underline(p,a) ICOM_CALL1(get_Underline,a) -#define IFont_put_Underline(p,a) ICOM_CALL1(put_Underline,a) -#define IFont_get_Strikethrough(p,a) ICOM_CALL1(get_Strikethrough,a) -#define IFont_put_Strikethrough(p,a) ICOM_CALL1(put_Strikethrough,a) -#define IFont_get_Weight(p,a) ICOM_CALL1(get_Weight,a) -#define IFont_put_Weight(p,a) ICOM_CALL1(put_Weight,a) -#define IFont_get_Charset(p,a) ICOM_CALL1(get_Charset,a) -#define IFont_put_Charset(p,a) ICOM_CALL1(put_Charset,a) -#define IFont_get_hFont(p,a) ICOM_CALL1(get_hFont,a) -#define IFont_put_hFont(p,a) ICOM_CALL1(put_hFont,a) -#define IFont_Clone(p,a) ICOM_CALL1(Clone,a) -#define IFont_IsEqual(p,a) ICOM_CALL1(IsEqual,a) -#define IFont_SetRatio(p,a,b) ICOM_CALL2(SetRatio,a,b) -#define IFont_QueryTextMetrics(p,a) ICOM_CALL1(QueryTextMetrics,a) -#define IFont_AddRefHfont(p,a) ICOM_CALL1(AddRefHfont,a) -#define IFont_ReleaseHfont(p,a) ICOM_CALL1(ReleaseHfont,a) -#define IFont_SetHdc(p,a) ICOM_CALL1(SetHdc,a) +#define IFont_get_Bold(p,a) ICOM_CALL1(get_Bold,p,a) +#define IFont_put_Bold(p,a) ICOM_CALL1(put_Bold,p,a) +#define IFont_get_Italic(p,a) ICOM_CALL1(get_Italic,p,a) +#define IFont_put_Italic(p,a) ICOM_CALL1(put_Italic,p,a) +#define IFont_get_Underline(p,a) ICOM_CALL1(get_Underline,p,a) +#define IFont_put_Underline(p,a) ICOM_CALL1(put_Underline,p,a) +#define IFont_get_Strikethrough(p,a) ICOM_CALL1(get_Strikethrough,p,a) +#define IFont_put_Strikethrough(p,a) ICOM_CALL1(put_Strikethrough,p,a) +#define IFont_get_Weight(p,a) ICOM_CALL1(get_Weight,p,a) +#define IFont_put_Weight(p,a) ICOM_CALL1(put_Weight,p,a) +#define IFont_get_Charset(p,a) ICOM_CALL1(get_Charset,p,a) +#define IFont_put_Charset(p,a) ICOM_CALL1(put_Charset,p,a) +#define IFont_get_hFont(p,a) ICOM_CALL1(get_hFont,p,a) +#define IFont_put_hFont(p,a) ICOM_CALL1(put_hFont,p,a) +#define IFont_Clone(p,a) ICOM_CALL1(Clone,p,a) +#define IFont_IsEqual(p,a) ICOM_CALL1(IsEqual,p,a) +#define IFont_SetRatio(p,a,b) ICOM_CALL2(SetRatio,p,a,b) +#define IFont_QueryTextMetrics(p,a) ICOM_CALL1(QueryTextMetrics,p,a) +#define IFont_AddRefHfont(p,a) ICOM_CALL1(AddRefHfont,p,a) +#define IFont_ReleaseHfont(p,a) ICOM_CALL1(ReleaseHfont,p,a) +#define IFont_SetHdc(p,a) ICOM_CALL1(SetHdc,p,a) /***************************************************************************** * IFont interface @@ -121,7 +121,7 @@ #define IFontDisp_Release(p) ICOM_CALL (Release,p) /*** IDispatch methods ***/ #define IFontDisp_GetTypeInfoCount(p,a) ICOM_CALL1 (GetTypeInfoCount,p,a) -#define IFontDisp_GetTypeInfo(p,a,b,c) ICOM_CALL3 (GetTypeInfo,p,b,c) +#define IFontDisp_GetTypeInfo(p,a,b,c) ICOM_CALL3 (GetTypeInfo,p,a,b,c) #define IFontDisp_GetIDsOfNames(p,a,b,c,d,e) ICOM_CALL5 (GetIDsOfNames,p,a,b,c,d,e) #define IFontDisp_Invoke(p,a,b,c,d,e,f,g,h) ICOM_CALL8 (Invoke,p,a,b,c,d,e,f,g,h) /*** IFontDisp methods ***/ Index: dlls/oleaut32/olefont.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/olefont.c,v retrieving revision 1.20 diff -u -u -r1.20 olefont.c --- dlls/oleaut32/olefont.c 7 Jan 2003 20:36:25 -0000 1.20 +++ dlls/oleaut32/olefont.c 21 Jan 2003 22:15:28 -0000 @@ -59,10 +59,12 @@ * The first two are supported by the first vtable, the next two are * supported by the second table and the last two have their own. */ - ICOM_VTABLE(IFont)* lpvtbl1; - ICOM_VTABLE(IDispatch)* lpvtbl2; - ICOM_VTABLE(IPersistStream)* lpvtbl3; - ICOM_VTABLE(IConnectionPointContainer)* lpvtbl4; + ICOM_VTABLE(IFont)* lpvtbl1; + ICOM_VTABLE(IDispatch)* lpvtbl2; + ICOM_VTABLE(IPersistStream)* lpvtbl3; + ICOM_VTABLE(IConnectionPointContainer)* lpvtbl4; + ICOM_VTABLE(IPersistPropertyBag)* lpvtbl5; + ICOM_VTABLE(IPersistStreamInit)* lpvtbl6; /* * Reference count for that instance of the class. */ @@ -102,6 +104,8 @@ #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*)); #define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*)); #define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*)); +#define _ICOM_THIS_From_IPersistPropertyBag(class, name) class* this = (class*)(((char*)name)-4*sizeof(void*)); +#define _ICOM_THIS_From_IPersistStreamInit(class, name) class* this = (class*)(((char*)name)-5*sizeof(void*)); /*********************************************************************** @@ -280,6 +284,8 @@ OLEFontImpl_FindConnectionPoint }; +static ICOM_VTABLE(IPersistPropertyBag) OLEFontImpl_IPersistPropertyBag_VTable; +static ICOM_VTABLE(IPersistStreamInit) OLEFontImpl_IPersistStreamInit_VTable; /****************************************************************************** * OleCreateFontIndirect [OLEAUT32.420] */ @@ -340,8 +346,11 @@ { IEnumConnections *pEnum; CONNECTDATA CD; + HRESULT hres; - IConnectionPoint_EnumConnections(this->pCP, &pEnum); + hres = IConnectionPoint_EnumConnections(this->pCP, &pEnum); + if (FAILED(hres)) /* When we have 0 connections. */ + return; while(IEnumConnections_Next(pEnum, 1, &CD, NULL) == S_OK) { IPropertyNotifySink *sink; @@ -383,6 +392,8 @@ newObject->lpvtbl2 = &OLEFontImpl_IDispatch_VTable; newObject->lpvtbl3 = &OLEFontImpl_IPersistStream_VTable; newObject->lpvtbl4 = &OLEFontImpl_IConnectionPointContainer_VTable; + newObject->lpvtbl5 = &OLEFontImpl_IPersistPropertyBag_VTable; + newObject->lpvtbl6 = &OLEFontImpl_IPersistStreamInit_VTable; /* * Start with one reference count. The caller of this function @@ -412,11 +423,9 @@ */ newObject->gdiFont = 0; newObject->fontLock = 0; - newObject->cyHimetric = 1; - newObject->cyLogical = 1; - + newObject->cyLogical = 72L; + newObject->cyHimetric = 2540L; CreateConnectionPoint((IUnknown*)newObject, &IID_IPropertyNotifySink, &newObject->pCP); - TRACE("returning %p\n", newObject); return newObject; } @@ -468,47 +477,32 @@ /* * Compare the riid with the interface IDs implemented by this object. */ - if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) - { + if (IsEqualGUID(&IID_IUnknown, riid)) *ppvObject = (IFont*)this; - } - else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) - { + if (IsEqualGUID(&IID_IFont, riid)) *ppvObject = (IFont*)this; - } - else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) - { + if (IsEqualGUID(&IID_IDispatch, riid)) *ppvObject = (IDispatch*)&(this->lpvtbl2); - } - else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) - { + if (IsEqualGUID(&IID_IFontDisp, riid)) *ppvObject = (IDispatch*)&(this->lpvtbl2); - } - else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) - { + if (IsEqualGUID(&IID_IPersistStream, riid)) *ppvObject = (IPersistStream*)&(this->lpvtbl3); - } - else if (memcmp(&IID_IConnectionPointContainer, riid, - sizeof(IID_IConnectionPointContainer)) == 0) - { - *ppvObject = (IPersistStream*)&(this->lpvtbl4); - } + if (IsEqualGUID(&IID_IConnectionPointContainer, riid)) + *ppvObject = (IConnectionPointContainer*)&(this->lpvtbl4); + if (IsEqualGUID(&IID_IPersistPropertyBag, riid)) + *ppvObject = (IPersistPropertyBag*)&(this->lpvtbl5); + if (IsEqualGUID(&IID_IPersistStreamInit, riid)) + *ppvObject = (IPersistStreamInit*)&(this->lpvtbl6); /* * Check that we obtained an interface. */ if ((*ppvObject)==0) { - FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid)); + FIXME("() : asking for unsupported interface %s\n",debugstr_guid(riid)); return E_NOINTERFACE; } - - /* - * Query Interface always increases the reference count by one when it is - * successful - */ OLEFontImpl_AddRef((IFont*)this); - return S_OK; } @@ -932,13 +926,12 @@ */ IFont_get_Size(iface, &cySize); - fontHeight = MulDiv(cySize.s.Lo, 2540L, 72L); - fontHeight = MulDiv(fontHeight, this->cyLogical,this->cyHimetric); + fontHeight = MulDiv( cySize.s.Lo, this->cyLogical, this->cyHimetric ); memset(&logFont, 0, sizeof(LOGFONTW)); - logFont.lfHeight = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 : - (-fontHeight/10000L); + logFont.lfHeight = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 : + (-fontHeight/10000L); logFont.lfItalic = this->description.fItalic; logFont.lfUnderline = this->description.fUnderline; logFont.lfStrikeOut = this->description.fStrikethrough; @@ -1000,8 +993,7 @@ /* We need to clone the HFONT too. This is just cut & paste from above */ IFont_get_Size(iface, &cySize); - fontHeight = MulDiv(cySize.s.Lo, 2540L, 72L); - fontHeight = MulDiv(fontHeight, this->cyLogical,this->cyHimetric); + fontHeight = MulDiv(cySize.s.Lo, this->cyLogical,this->cyHimetric); memset(&logFont, 0, sizeof(LOGFONTW)); @@ -1038,7 +1030,7 @@ IFont* iface, IFont* pFontOther) { - FIXME("():Stub\n"); + FIXME("(%p, %p), stub!\n",iface,pFontOther); return E_NOTIMPL; } @@ -1070,7 +1062,7 @@ IFont* iface, TEXTMETRICOLE* ptm) { - FIXME("():Stub\n"); + FIXME("(%p, %p), stub!\n",iface,ptm); return E_NOTIMPL; } @@ -1206,10 +1198,24 @@ LCID lcid, ITypeInfo** ppTInfo) { - _ICOM_THIS_From_IDispatch(IFont, iface); - FIXME("(%p):Stub\n", this); + _ICOM_THIS_From_IDispatch(OLEFontImpl, iface); + WCHAR stdole32tlb[] = {'s','t','d','o','l','e','3','2','.','t','l','b',0}; + ITypeLib *tl; + HRESULT hres; - return E_NOTIMPL; + TRACE("(%p, iTInfo=%d, lcid=%04x, %p), unimplemented stub!\n", this, iTInfo, (int)lcid, ppTInfo); + if (iTInfo != 0) + return E_FAIL; + hres = LoadTypeLib(stdole32tlb, &tl); + if (FAILED(hres)) { + FIXME("Could not load the stdole32.tlb?\n"); + return hres; + } + hres = ITypeLib_GetTypeInfoOfGuid(tl, &IID_IDispatch, ppTInfo); + if (FAILED(hres)) { + FIXME("Did not IDispatch typeinfo from typelib, hres %lx\n",hres); + } + return hres; } /************************************************************************ @@ -1226,8 +1232,9 @@ DISPID* rgDispId) { _ICOM_THIS_From_IDispatch(IFont, iface); - FIXME("(%p):Stub\n", this); - + FIXME("(%p,%s,%p,%d,%04x,%p), stub!\n", this, debugstr_guid(riid), rgszNames, + cNames, (int)lcid, rgDispId + ); return E_NOTIMPL; } @@ -1235,6 +1242,10 @@ * OLEFontImpl_Invoke (IDispatch) * * See Windows documentation for more details on IDispatch methods. + * + * Note: Do not call _put_Xxx methods, since setting things here + * should not call notify functions as I found out debugging the generic + * MS VB5 installer. */ static HRESULT WINAPI OLEFontImpl_Invoke( IDispatch* iface, @@ -1248,8 +1259,137 @@ UINT* puArgErr) { _ICOM_THIS_From_IDispatch(IFont, iface); - FIXME("%p->(%ld,%s,%lx,%x), stub!\n", this,dispIdMember,debugstr_guid(riid),lcid, - wFlags + OLEFontImpl *xthis = (OLEFontImpl*)this; + + switch (dispIdMember) { + case DISPID_FONT_NAME: + switch (wFlags) { + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_BSTR; + return OLEFontImpl_get_Name(this, &V_BSTR(pVarResult)); + case DISPATCH_PROPERTYPUT: { + BSTR name = V_BSTR(&pDispParams->rgvarg[0]); + if (V_VT(&pDispParams->rgvarg[0])!=VT_BSTR) { + FIXME("property put of Name, vt is not VT_BSTR but %d\n",V_VT(&pDispParams->rgvarg[0])); + return E_FAIL; + } + if (!xthis->description.lpstrName) + xthis->description.lpstrName = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(name)+1) * sizeof(WCHAR)); + else + xthis->description.lpstrName = HeapReAlloc(GetProcessHeap(), 0, xthis->description.lpstrName, (lstrlenW(name)+1) * sizeof(WCHAR)); + + if (xthis->description.lpstrName==0) + return E_OUTOFMEMORY; + strcpyW(xthis->description.lpstrName, name); + return S_OK; + } + } + break; + case DISPID_FONT_BOLD: + switch (wFlags) { + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_BOOL; + return OLEFontImpl_get_Bold(this, (BOOL*)&V_BOOL(pVarResult)); + case DISPATCH_PROPERTYPUT: + if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL) { + FIXME("DISPID_FONT_BOLD/put, vt is %d, not VT_BOOL.\n",V_VT(&pDispParams->rgvarg[0])); + return E_FAIL; + } else { + xthis->description.sWeight = V_BOOL(&pDispParams->rgvarg[0]) ? FW_BOLD : FW_NORMAL; + return S_OK; + } + } + break; + case DISPID_FONT_ITALIC: + switch (wFlags) { + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_BOOL; + return OLEFontImpl_get_Italic(this, (BOOL*)&V_BOOL(pVarResult)); + case DISPATCH_PROPERTYPUT: + if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL) { + FIXME("DISPID_FONT_ITALIC/put, vt is %d, not VT_BOOL.\n",V_VT(&pDispParams->rgvarg[0])); + return E_FAIL; + } else { + xthis->description.fItalic = V_BOOL(&pDispParams->rgvarg[0]); + return S_OK; + } + } + break; + case DISPID_FONT_UNDER: + switch (wFlags) { + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_BOOL; + return OLEFontImpl_get_Underline(this, (BOOL*)&V_BOOL(pVarResult)); + case DISPATCH_PROPERTYPUT: + if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL) { + FIXME("DISPID_FONT_UNDER/put, vt is %d, not VT_BOOL.\n",V_VT(&pDispParams->rgvarg[0])); + return E_FAIL; + } else { + xthis->description.fUnderline = V_BOOL(&pDispParams->rgvarg[0]); + return S_OK; + } + } + break; + case DISPID_FONT_STRIKE: + switch (wFlags) { + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_BOOL; + return OLEFontImpl_get_Strikethrough(this, (BOOL*)&V_BOOL(pVarResult)); + case DISPATCH_PROPERTYPUT: + if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL) { + FIXME("DISPID_FONT_STRIKE/put, vt is %d, not VT_BOOL.\n",V_VT(&pDispParams->rgvarg[0])); + return E_FAIL; + } else { + xthis->description.fStrikethrough = V_BOOL(&pDispParams->rgvarg[0]); + return S_OK; + } + } + break; + case DISPID_FONT_SIZE: + switch (wFlags) { + case DISPATCH_PROPERTYPUT: { + assert (pDispParams->cArgs == 1); + xthis->description.cySize.s.Hi = 0; + if (V_VT(&pDispParams->rgvarg[0]) != VT_CY) { + if (V_VT(&pDispParams->rgvarg[0]) == VT_I2) { + xthis->description.cySize.s.Lo = V_I2(&pDispParams->rgvarg[0]) * 10000; + } else { + FIXME("property put for Size with vt %d unsupported!\n",V_VT(&pDispParams->rgvarg[0])); + } + } else { + xthis->description.cySize.s.Lo = V_CY(&pDispParams->rgvarg[0]).s.Lo; + } + return S_OK; + } + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_CY; + return OLEFontImpl_get_Size(this, &V_CY(pVarResult)); + } + break; + case DISPID_FONT_CHARSET: + switch (wFlags) { + case DISPATCH_PROPERTYPUT: + assert (pDispParams->cArgs == 1); + if (V_VT(&pDispParams->rgvarg[0]) != VT_I2) + FIXME("varg of first disparg is not VT_I2, but %d\n",V_VT(&pDispParams->rgvarg[0])); + xthis->description.sCharset = V_I2(&pDispParams->rgvarg[0]); + return S_OK; + case DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET|DISPATCH_METHOD: + V_VT(pVarResult) = VT_I2; + return OLEFontImpl_get_Charset(this, &V_I2(pVarResult)); + } + break; + } + FIXME("%p->(%ld,%s,%lx,%x,%p,%p,%p,%p), unhandled dispid/flag!\n", + this,dispIdMember,debugstr_guid(riid),lcid, + wFlags,pDispParams,pVarResult,pExepInfo,puArgErr ); return S_OK; } @@ -1304,6 +1444,7 @@ IPersistStream* iface, CLSID* pClassID) { + TRACE("(%p,%p)\n",iface,pClassID); if (pClassID==0) return E_POINTER; @@ -1320,6 +1461,7 @@ static HRESULT WINAPI OLEFontImpl_IsDirty( IPersistStream* iface) { + TRACE("(%p)\n",iface); return S_OK; } @@ -1641,6 +1783,153 @@ return E_NOINTERFACE; } } + +/************************************************************************ + * OLEFontImpl implementation of IPersistPropertyBag. + */ +static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_QueryInterface( + IPersistPropertyBag *iface, REFIID riid, LPVOID *ppvObj +) { + _ICOM_THIS_From_IPersistPropertyBag(IFont, iface); + return IFont_QueryInterface(this,riid,ppvObj); +} + +static ULONG WINAPI OLEFontImpl_IPersistPropertyBag_AddRef( + IPersistPropertyBag *iface +) { + _ICOM_THIS_From_IPersistPropertyBag(IFont, iface); + return IFont_AddRef(this); +} + +static ULONG WINAPI OLEFontImpl_IPersistPropertyBag_Release( + IPersistPropertyBag *iface +) { + _ICOM_THIS_From_IPersistPropertyBag(IFont, iface); + return IFont_Release(this); +} + +static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_GetClassID( + IPersistPropertyBag *iface, CLSID *classid +) { + FIXME("(%p,%p), stub!\n", iface, classid); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_InitNew( + IPersistPropertyBag *iface +) { + FIXME("(%p), stub!\n", iface); + return S_OK; +} + +static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_Load( + IPersistPropertyBag *iface, IPropertyBag* pPropBag, IErrorLog* pErrorLog +) { + FIXME("(%p,%p,%p), stub!\n", iface, pPropBag, pErrorLog); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_Save( + IPersistPropertyBag *iface, IPropertyBag* pPropBag, BOOL fClearDirty, + BOOL fSaveAllProperties +) { + FIXME("(%p,%p,%d,%d), stub!\n", iface, pPropBag, fClearDirty, fSaveAllProperties); + return E_FAIL; +} + +static ICOM_VTABLE(IPersistPropertyBag) OLEFontImpl_IPersistPropertyBag_VTable = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + OLEFontImpl_IPersistPropertyBag_QueryInterface, + OLEFontImpl_IPersistPropertyBag_AddRef, + OLEFontImpl_IPersistPropertyBag_Release, + + OLEFontImpl_IPersistPropertyBag_GetClassID, + OLEFontImpl_IPersistPropertyBag_InitNew, + OLEFontImpl_IPersistPropertyBag_Load, + OLEFontImpl_IPersistPropertyBag_Save +}; + +/************************************************************************ + * OLEFontImpl implementation of IPersistStreamInit. + */ +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_QueryInterface( + IPersistStreamInit *iface, REFIID riid, LPVOID *ppvObj +) { + _ICOM_THIS_From_IPersistStreamInit(IFont, iface); + return IFont_QueryInterface(this,riid,ppvObj); +} + +static ULONG WINAPI OLEFontImpl_IPersistStreamInit_AddRef( + IPersistStreamInit *iface +) { + _ICOM_THIS_From_IPersistStreamInit(IFont, iface); + return IFont_AddRef(this); +} + +static ULONG WINAPI OLEFontImpl_IPersistStreamInit_Release( + IPersistStreamInit *iface +) { + _ICOM_THIS_From_IPersistStreamInit(IFont, iface); + return IFont_Release(this); +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_GetClassID( + IPersistStreamInit *iface, CLSID *classid +) { + FIXME("(%p,%p), stub!\n", iface, classid); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_IsDirty( + IPersistStreamInit *iface +) { + FIXME("(%p), stub!\n", iface); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_Load( + IPersistStreamInit *iface, LPSTREAM pStm +) { + FIXME("(%p,%p), stub!\n", iface, pStm); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_Save( + IPersistStreamInit *iface, LPSTREAM pStm, BOOL fClearDirty +) { + FIXME("(%p,%p,%d), stub!\n", iface, pStm, fClearDirty); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_GetSizeMax( + IPersistStreamInit *iface, ULARGE_INTEGER *pcbSize +) { + FIXME("(%p,%p), stub!\n", iface, pcbSize); + return E_FAIL; +} + +static HRESULT WINAPI OLEFontImpl_IPersistStreamInit_InitNew( + IPersistStreamInit *iface +) { + FIXME("(%p), stub!\n", iface); + return S_OK; +} + +static ICOM_VTABLE(IPersistStreamInit) OLEFontImpl_IPersistStreamInit_VTable = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + OLEFontImpl_IPersistStreamInit_QueryInterface, + OLEFontImpl_IPersistStreamInit_AddRef, + OLEFontImpl_IPersistStreamInit_Release, + + OLEFontImpl_IPersistStreamInit_GetClassID, + OLEFontImpl_IPersistStreamInit_IsDirty, + OLEFontImpl_IPersistStreamInit_Load, + OLEFontImpl_IPersistStreamInit_Save, + OLEFontImpl_IPersistStreamInit_GetSizeMax, + OLEFontImpl_IPersistStreamInit_InitNew +}; /******************************************************************************* * StdFont ClassFactory