diff --git a/dlls/inetcomm/mimeole.c b/dlls/inetcomm/mimeole.c index d6b42740676..6398f29c3e6 100644 --- a/dlls/inetcomm/mimeole.c +++ b/dlls/inetcomm/mimeole.c @@ -1921,13 +1921,49 @@ static HRESULT WINAPI MimeMessage_CountBodies( return S_OK; } +static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out) +{ + HRESULT hr; + IMimeBody *mime_body; + HBODY next; + + if(find_body->dwReserved == 0) + find_body->dwReserved = (DWORD)HBODY_ROOT; + else + { + hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next); + if(hr == S_OK) + find_body->dwReserved = (DWORD)next; + else + { + hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next); + if(hr == S_OK) + find_body->dwReserved = (DWORD)next; + else + return MIME_E_NOT_FOUND; + } + } + + hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body); + if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK) + { + IMimeBody_Release(mime_body); + *out = (HBODY)find_body->dwReserved; + return S_OK; + } + IMimeBody_Release(mime_body); + return find_next(msg, find_body, out); +} + static HRESULT WINAPI MimeMessage_FindFirst( IMimeMessage *iface, LPFINDBODY pFindBody, LPHBODY phBody) { - FIXME("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - return E_NOTIMPL; + TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); + + pFindBody->dwReserved = 0; + return find_next(iface, pFindBody, phBody); } static HRESULT WINAPI MimeMessage_FindNext( @@ -1935,8 +1971,9 @@ static HRESULT WINAPI MimeMessage_FindNext( LPFINDBODY pFindBody, LPHBODY phBody) { - FIXME("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - return E_NOTIMPL; + TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); + + return find_next(iface, pFindBody, phBody); } static HRESULT WINAPI MimeMessage_ResolveURL( diff --git a/dlls/inetcomm/tests/mimeole.c b/dlls/inetcomm/tests/mimeole.c index c40952f35f2..ee53d152424 100644 --- a/dlls/inetcomm/tests/mimeole.c +++ b/dlls/inetcomm/tests/mimeole.c @@ -213,6 +213,8 @@ static void test_CreateMessage(void) IMimeBody *body; BODYOFFSETS offsets; ULONG count; + FINDBODY find_struct; + char text[] = "text"; hr = MimeOleCreateMessage(NULL, &msg); ok(hr == S_OK, "ret %08x\n", hr); @@ -268,6 +270,17 @@ static void test_CreateMessage(void) ok(offsets.cbBodyEnd == 639, "got %d\n", offsets.cbBodyEnd); IMimeBody_Release(body); + find_struct.pszPriType = text; + find_struct.pszSubType = NULL; + + hr = IMimeMessage_FindFirst(msg, &find_struct, &hbody); + ok(hr == S_OK, "ret %08x\n", hr); + + hr = IMimeMessage_FindNext(msg, &find_struct, &hbody); + ok(hr == S_OK, "ret %08x\n", hr); + + hr = IMimeMessage_FindNext(msg, &find_struct, &hbody); + ok(hr == MIME_E_NOT_FOUND, "ret %08x\n", hr); IMimeMessage_Release(msg);