OLEAUT32: implementation for IPersistPropertyBag_Load for OLEFont
Alex Villacís Lasso
a_villacis at palosanto.com
Wed Aug 18 13:08:23 CDT 2004
This implementation is enough to satisfy VB6 when loading font objects
from property bags in projects.
Changelog:
* Added implementation for IPersistPropertyBag_Load on OLEFont
-------------- next part --------------
--- wine-20040813/dlls/oleaut32/olefont.c 2004-08-12 18:00:54.000000000 -0500
+++ wine-20040813-patch/dlls/oleaut32/olefont.c 2004-08-18 12:42:33.000000000 -0500
@@ -1843,8 +1843,348 @@
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
+*/
+ WCHAR sAttrName[] = {'N','a','m','e',0};
+ WCHAR sAttrSize[] = {'S','i','z','e',0};
+ WCHAR sAttrCharset[] = {'C','h','a','r','s','e','t',0};
+ WCHAR sAttrWeight[] = {'W','e','i','g','h','t',0};
+ WCHAR sAttrUnderline[] = {'U','n','d','e','r','l','i','n','e',0};
+ WCHAR sAttrItalic[] = {'I','t','a','l','i','c',0};
+ WCHAR sAttrStrikethrough[] = {'S','t','r','i','k','e','t','h','r','o','u','g','h',0};
+ VARIANT valueAttr;
+ HRESULT iRes = S_OK;
+
+ _ICOM_THIS_From_IPersistPropertyBag(IFont, iface);
+
+ if (iRes == S_OK) {
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrName, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ if (V_VT(&valueAttr) == VT_BSTR) {
+ /* Type is BSTR, use for name directly */
+ OLEFontImpl_put_Name(this, V_BSTR(&valueAttr));
+
+ /* FIXME: Leaking memory here? */
+ } else {
+ /* Don't know how to handle this type */
+ FIXME("Name has type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ }
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+
+ if (iRes == S_OK) {
+ CY iSize;
+ iSize.s.Hi = 0;
+ iSize.s.Lo = 0;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrSize, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ iSize.s.Lo = V_I2(&valueAttr) * 10000UL;
+ break;
+ case VT_UI2:
+ iSize.s.Lo = V_UI2(&valueAttr) * 10000UL;
+ break;
+ case VT_I4:
+ iSize.s.Lo = V_I4(&valueAttr) * 10000UL;
+ break;
+ case VT_UI4:
+ iSize.s.Lo = V_UI4(&valueAttr) * 10000UL;
+ break;
+ case VT_R4:
+ iSize.s.Lo = (ULONG)(V_R4(&valueAttr) * 10000UL);
+ break;
+ case VT_R8:
+ iSize.s.Lo = (ULONG)(V_R8(&valueAttr) * 10000UL);
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Size type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ break;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Size(this, iSize);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+ if (iRes == S_OK) {
+ signed short iCharset = 0;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrCharset, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ if (V_I2(&valueAttr) < 0) {
+ FIXME("Unexpected value for Font Charset (%hd), using 0\n", V_I2(&valueAttr));
+ } else {
+ iCharset = V_I2(&valueAttr);
+ }
+ break;
+ case VT_UI2:
+ if (V_UI4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Charset (%ld), using 0\n", V_UI4(&valueAttr));
+ } else {
+ iCharset = V_UI2(&valueAttr);
+ }
+ break;
+ case VT_I4:
+ if (V_I4(&valueAttr) < 0 || V_I4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Charset (%ld), using 0\n", V_I4(&valueAttr));
+ } else {
+ iCharset = V_I4(&valueAttr);
+ }
+ break;
+ case VT_UI4:
+ if (V_UI4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Charset (%ld), using 0\n", V_UI4(&valueAttr));
+ } else {
+ iCharset = V_UI4(&valueAttr);
+ }
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Charset type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Charset(this, iCharset);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+
+ if (iRes == S_OK) {
+ signed short iWeight = FW_NORMAL;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrWeight, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ if (V_I2(&valueAttr) < 0) {
+ FIXME("Unexpected value for Font Weight (%hd), using FW_NORMAL\n", V_I2(&valueAttr));
+ } else {
+ iWeight = V_I2(&valueAttr);
+ }
+ break;
+ case VT_UI2:
+ if (V_UI4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Weight (%ld), using FW_NORMAL\n", V_UI4(&valueAttr));
+ } else {
+ iWeight = V_UI2(&valueAttr);
+ }
+ break;
+ case VT_I4:
+ if (V_I4(&valueAttr) < 0 || V_I4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Weight (%ld), using FW_NORMAL\n", V_I4(&valueAttr));
+ } else {
+ iWeight = V_I4(&valueAttr);
+ }
+ break;
+ case VT_UI4:
+ if (V_UI4(&valueAttr) > 32767L) {
+ FIXME("Unexpected value for Font Weight (%ld), using FW_NORMAL\n", V_UI4(&valueAttr));
+ } else {
+ iWeight = V_UI4(&valueAttr);
+ }
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Weight type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Weight(this, iWeight);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+
+ if (iRes == S_OK) {
+ BOOL bUnderline = FALSE;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrUnderline, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ bUnderline = V_I2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_I4:
+ bUnderline = V_I4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI2:
+ bUnderline = V_UI2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI4:
+ bUnderline = V_UI4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_BOOL:
+ bUnderline = V_BOOL(&valueAttr);
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Underline type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ break;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Underline(this, bUnderline);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+
+ if (iRes == S_OK) {
+ BOOL bItalic = FALSE;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrItalic, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ bItalic = V_I2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_I4:
+ bItalic = V_I4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI2:
+ bItalic = V_UI2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI4:
+ bItalic = V_UI4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_BOOL:
+ bItalic = V_BOOL(&valueAttr);
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Italic type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ break;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Italic(this, bItalic);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+
+ if (iRes == S_OK) {
+ BOOL bStrikethrough = FALSE;
+
+ V_VT(&valueAttr) = VT_EMPTY;
+ iRes = IPropertyBag_Read(pPropBag, sAttrStrikethrough, &valueAttr, pErrorLog);
+ switch (iRes) {
+ case S_OK:
+ switch (V_VT(&valueAttr)) {
+ case VT_I2:
+ bStrikethrough = V_I2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_I4:
+ bStrikethrough = V_I4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI2:
+ bStrikethrough = V_UI2(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_UI4:
+ bStrikethrough = V_UI4(&valueAttr) ? TRUE : FALSE;
+ break;
+ case VT_BOOL:
+ bStrikethrough = V_BOOL(&valueAttr);
+ break;
+ default:
+ /* Don't know how to handle this type */
+ FIXME("Strikethrough type %d, not implemented\n", V_VT(&valueAttr));
+ iRes = E_NOTIMPL;
+ break;
+ }
+ if (iRes != E_NOTIMPL) IFont_put_Strikethrough(this, bStrikethrough);
+ break;
+ case E_POINTER:
+ FIXME("\tiResult = [E_POINTER]\n");
+ break;
+ case E_INVALIDARG:
+ FIXME("\tiResult = [undef]\n");
+ iRes = S_OK;
+ break;
+ case E_FAIL:
+ FIXME("\tiResult = [E_FAIL]\n");
+ break;
+ }
+ }
+ return iRes;
}
static HRESULT WINAPI OLEFontImpl_IPersistPropertyBag_Save(
More information about the wine-patches
mailing list