Huw Davies : inetcomm: Implement IMimeBody:SetData.

Alexandre Julliard julliard at winehq.org
Tue Nov 27 09:54:28 CST 2007


Module: wine
Branch: master
Commit: ef59756ace4f21f496f029d7c5f9ccf4c0d3db0f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ef59756ace4f21f496f029d7c5f9ccf4c0d3db0f

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Nov 26 12:04:51 2007 +0000

inetcomm: Implement IMimeBody:SetData.

---

 dlls/inetcomm/mimeole.c         |   44 +++++++++++++++++++++++++++++++++++++-
 dlls/inetcomm/regsvr.c          |    4 ++-
 dlls/inetcomm/tests/Makefile.in |    2 +-
 dlls/inetcomm/tests/mimeole.c   |    9 ++++++++
 4 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/dlls/inetcomm/mimeole.c b/dlls/inetcomm/mimeole.c
index 685356c..16fe3f4 100644
--- a/dlls/inetcomm/mimeole.c
+++ b/dlls/inetcomm/mimeole.c
@@ -104,6 +104,8 @@ typedef struct MimeBody
     char *content_pri_type;
     char *content_sub_type;
     ENCODINGTYPE encoding;
+    void *data;
+    IID data_iid;
 } MimeBody;
 
 static inline MimeBody *impl_from_IMimeBody( IMimeBody *iface )
@@ -431,6 +433,16 @@ static void empty_new_prop_list(struct list *list)
     }
 }
 
+static void release_data(REFIID riid, void *data)
+{
+    if(!data) return;
+
+    if(IsEqualIID(riid, &IID_IStream))
+        IStream_Release((IStream *)data);
+    else
+        FIXME("Unhandled data format %s\n", debugstr_guid(riid));
+}
+
 static HRESULT WINAPI MimeBody_QueryInterface(IMimeBody* iface,
                                      REFIID riid,
                                      void** ppvObject)
@@ -480,6 +492,9 @@ static ULONG WINAPI MimeBody_Release(IMimeBody* iface)
 
         HeapFree(GetProcessHeap(), 0, This->content_pri_type);
         HeapFree(GetProcessHeap(), 0, This->content_sub_type);
+
+        release_data(&This->data_iid, This->data);
+
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -818,8 +833,31 @@ static HRESULT WINAPI MimeBody_SetData(
                               REFIID riid,
                               LPVOID pvObject)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    MimeBody *This = impl_from_IMimeBody(iface);
+    TRACE("(%p)->(%d, %s, %s, %s %p)\n", This, ietEncoding, debugstr_a(pszPriType), debugstr_a(pszSubType),
+          debugstr_guid(riid), pvObject);
+
+    if(IsEqualIID(riid, &IID_IStream))
+        IStream_AddRef((IStream *)pvObject);
+    else
+    {
+        FIXME("Unhandled object type %s\n", debugstr_guid(riid));
+        return E_INVALIDARG;
+    }
+
+    if(This->data)
+        FIXME("release old data\n");
+
+    This->data_iid = *riid;
+    This->data = pvObject;
+
+    IMimeBody_SetCurrentEncoding(iface, ietEncoding);
+
+    /* FIXME: Update the content type.
+       If pszPriType == NULL use 'application'
+       If pszSubType == NULL use 'octet-stream' */
+
+    return S_OK;
 }
 
 static HRESULT WINAPI MimeBody_EmptyData(
@@ -934,6 +972,8 @@ HRESULT MimeBody_create(IUnknown *outer, void **obj)
     This->content_pri_type = NULL;
     This->content_sub_type = NULL;
     This->encoding = IET_7BIT;
+    This->data = NULL;
+    This->data_iid = IID_NULL;
 
     *obj = (IMimeBody *)&This->lpVtbl;
     return S_OK;
diff --git a/dlls/inetcomm/regsvr.c b/dlls/inetcomm/regsvr.c
index 9bd9930..97759fc 100644
--- a/dlls/inetcomm/regsvr.c
+++ b/dlls/inetcomm/regsvr.c
@@ -18,7 +18,6 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#define INITGUID
 
 #include <stdarg.h>
 #include <string.h>
@@ -28,7 +27,10 @@
 #include "winuser.h"
 #include "winreg.h"
 #include "winerror.h"
+#include "objbase.h"
+#include "ocidl.h"
 
+#include "initguid.h"
 #include "inetcomm_private.h"
 #include "mimeole.h"
 
diff --git a/dlls/inetcomm/tests/Makefile.in b/dlls/inetcomm/tests/Makefile.in
index 93e8b3b..9c001cc 100644
--- a/dlls/inetcomm/tests/Makefile.in
+++ b/dlls/inetcomm/tests/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = inetcomm.dll
 IMPORTS   = inetcomm ole32 kernel32
-EXTRALIBS =
+EXTRALIBS = -luuid
 
 CTESTS = \
 	mimeole.c
diff --git a/dlls/inetcomm/tests/mimeole.c b/dlls/inetcomm/tests/mimeole.c
index 32dec5c..c425c21 100644
--- a/dlls/inetcomm/tests/mimeole.c
+++ b/dlls/inetcomm/tests/mimeole.c
@@ -125,6 +125,15 @@ static void test_CreateBody(void)
     hr = IMimeBody_IsContentType(body, NULL, "mixed");
     ok(hr == S_OK, "ret %08x\n", hr);
 
+    hr = IMimeBody_SetData(body, IET_8BIT, "text", "plain", &IID_IStream, in);
+    ok(hr == S_OK, "ret %08x\n", hr);
+    hr = IMimeBody_IsContentType(body, "text", "plain");
+    todo_wine
+        ok(hr == S_OK, "ret %08x\n", hr);
+    hr = IMimeBody_GetCurrentEncoding(body, &enc);
+    ok(hr == S_OK, "ret %08x\n", hr);
+    ok(enc == IET_8BIT, "encoding %d\n", enc);
+
     IMimeBody_Release(body);
 }
 




More information about the wine-cvs mailing list