Implementation of IPersistPropertyBag_Load for OLEFont

Robert Shearman rob at codeweavers.com
Fri Aug 20 12:51:13 CDT 2004


Changelog:
Added implementation for IPersistPropertyBag_Load on OLEFont (based on a 
patch by Alex Villací­s Lasso).

-------------- next part --------------
Index: wine/dlls/oleaut32/olefont.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/olefont.c,v
retrieving revision 1.29
diff -u -p -r1.29 olefont.c
--- wine/dlls/oleaut32/olefont.c	12 Aug 2004 23:00:54 -0000	1.29
+++ wine/dlls/oleaut32/olefont.c	20 Aug 2004 11:35:32 -0000
@@ -1843,8 +1843,132 @@ static HRESULT WINAPI OLEFontImpl_IPersi
 static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_Load(
    IPersistPropertyBag *iface, IPropertyBag* pPropBag, IErrorLog* pErrorLog
 ) {
-  FIXME("(%p,%p,%p), stub!\n", iface, pPropBag, pErrorLog);
-  return E_FAIL;
+/* (from Visual Basic 6 property bag)
+         Name            =   "MS Sans Serif"
+         Size            =   13.8
+         Charset         =   0
+         Weight          =   400
+         Underline       =   0   'False
+         Italic          =   0   'False
+         Strikethrough   =   0   'False
+*/
+    static const WCHAR sAttrName[] = {'N','a','m','e',0};
+    static const WCHAR sAttrSize[] = {'S','i','z','e',0};
+    static const WCHAR sAttrCharset[] = {'C','h','a','r','s','e','t',0};
+    static const WCHAR sAttrWeight[] = {'W','e','i','g','h','t',0};
+    static const WCHAR sAttrUnderline[] = {'U','n','d','e','r','l','i','n','e',0};
+    static const WCHAR sAttrItalic[] = {'I','t','a','l','i','c',0};
+    static const WCHAR sAttrStrikethrough[] = {'S','t','r','i','k','e','t','h','r','o','u','g','h',0};
+    VARIANT rawAttr;
+    VARIANT valueAttr;
+    HRESULT iRes = S_OK;
+    _ICOM_THIS_From_IPersistPropertyBag(IFont, iface);
+
+    VariantInit(&rawAttr);
+    VariantInit(&valueAttr);
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrName, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_BSTR);
+            if (iRes == S_OK)
+                iRes = IFont_put_Name(this, V_BSTR(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrSize, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_CY);
+            if (iRes == S_OK)
+                iRes = IFont_put_Size(this, V_CY(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrCharset, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_I2);
+            if (iRes == S_OK)
+                iRes = IFont_put_Charset(this, V_I2(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrWeight, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_I2);
+            if (iRes == S_OK)
+                iRes = IFont_put_Weight(this, V_I2(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrUnderline, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_BOOL);
+            if (iRes == S_OK)
+                iRes = IFont_put_Underline(this, V_BOOL(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrItalic, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_BOOL);
+            if (iRes == S_OK)
+                iRes = IFont_put_Italic(this, V_BOOL(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (iRes == S_OK) {
+        iRes = IPropertyBag_Read(pPropBag, sAttrStrikethrough, &rawAttr, pErrorLog);
+        if (iRes == S_OK)
+        {
+            iRes = VariantChangeType(&rawAttr, &valueAttr, 0, VT_BOOL);
+            if (iRes == S_OK)
+                IFont_put_Strikethrough(this, V_BOOL(&valueAttr));
+        }
+        else if (iRes == E_INVALIDARG)
+            iRes = S_OK;
+        VariantClear(&rawAttr);
+        VariantClear(&valueAttr);
+    }
+
+    if (FAILED(iRes))
+        WARN("-- 0x%08lx\n", iRes);
+    return iRes;
 }
 
 static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_Save(


More information about the wine-patches mailing list