// -------------------------------------------------------------------------------- // Mimeutil.cpp // Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved // -------------------------------------------------------------------------------- #include "pch.hxx" #include "resource.h" #include "dllmain.h" #include "mimeutil.h" #include "demand.h" HRESULT HrHasBodyParts(LPMIMEMESSAGE pMsg) { DWORD dwFlags=0; if (pMsg) pMsg->GetFlags(&dwFlags); return (dwFlags&IMF_HTML || dwFlags & IMF_PLAIN)? S_OK : S_FALSE; } HRESULT HrHasEncodedBodyParts(LPMIMEMESSAGE pMsg, ULONG cBody, LPHBODY rghBody) { ULONG uBody; if (cBody==0 || rghBody==NULL) return S_FALSE; for (uBody=0; uBody CCHMAX_CSET_NAME HRESULT HrGetMetaTagName(HCHARSET hCharset, LPSTR lpszBuffer, DWORD cchSize) { INETCSETINFO rCsetInfo; CODEPAGEINFO rCodePage; HRESULT hr; LPSTR psz; if (hCharset == NULL) return E_INVALIDARG; hr = MimeOleGetCharsetInfo(hCharset, &rCsetInfo); if (FAILED(hr)) goto error; hr = MimeOleGetCodePageInfo(rCsetInfo.cpiInternet, &rCodePage); if (FAILED(hr)) goto error; psz = rCodePage.szWebCset; if (FIsEmpty(psz)) // if no webset, try the body cset psz = rCodePage.szBodyCset; if (FIsEmpty(psz)) { hr = E_FAIL; goto error; } StrCpyN(lpszBuffer, psz, cchSize); error: return hr; } HRESULT HrIsInRelatedSection(LPMIMEMESSAGE pMsg, HBODY hBody) { HBODY hBodyParent; if (!FAILED(pMsg->GetBody(IBL_PARENT, hBody, &hBodyParent)) && (pMsg->IsContentType(hBodyParent, STR_CNT_MULTIPART, STR_SUB_RELATED)==S_OK)) return S_OK; else return S_FALSE; } HRESULT HrMarkGhosted(LPMIMEMESSAGE pMsg, HBODY hBody) { PROPVARIANT pv; Assert (pMsg && hBody); pv.vt = VT_I4; pv.lVal = TRUE; return pMsg->SetBodyProp(hBody, PIDTOSTR(PID_ATT_GHOSTED), NOFLAGS, &pv); } HRESULT HrIsReferencedUrl(LPMIMEMESSAGE pMsg, HBODY hBody) { PROPVARIANT rVariant; rVariant.vt = VT_I4; if (!FAILED(pMsg->GetBodyProp(hBody, PIDTOSTR(PID_ATT_RENDERED), NOFLAGS, &rVariant)) && rVariant.ulVal) return S_OK; return S_FALSE; } HRESULT HrIsGhosted(LPMIMEMESSAGE pMsg, HBODY hBody) { PROPVARIANT pv; pv.vt = VT_I4; if (pMsg->GetBodyProp(hBody, PIDTOSTR(PID_ATT_GHOSTED), NOFLAGS, &pv)==S_OK && pv.vt == VT_I4 && pv.lVal == TRUE) return S_OK; else return S_FALSE; } HRESULT HrGhostKids(LPMIMEMESSAGE pMsg, HBODY hBody) { HRESULT hr=S_OK; if (pMsg && hBody) { if (!FAILED(pMsg->GetBody(IBL_FIRST, hBody, &hBody))) { do { if (HrIsReferencedUrl(pMsg, hBody)==S_OK) { hr = HrMarkGhosted(pMsg, hBody); if (FAILED(hr)) goto error; } } while (!FAILED(pMsg->GetBody(IBL_NEXT, hBody, &hBody))); } } error: return hr; } HRESULT HrDeleteGhostedKids(LPMIMEMESSAGE pMsg, HBODY hBody) { HRESULT hr=S_OK; ULONG cKids=0, uKid; LPHBODY rghKids=0; pMsg->CountBodies(hBody, FALSE, &cKids); if (cKids) { if (!MemAlloc((LPVOID *)&rghKids, sizeof(HBODY) * cKids)) { hr = E_OUTOFMEMORY; goto error; } cKids = 0; if (!FAILED(pMsg->GetBody(IBL_FIRST, hBody, &hBody))) { do { if (HrIsGhosted(pMsg, hBody)==S_OK) { rghKids[cKids++] = hBody; } } while (!FAILED(pMsg->GetBody(IBL_NEXT, hBody, &hBody))); } for (uKid = 0; uKid < cKids; uKid++) { hr=pMsg->DeleteBody(rghKids[uKid], 0); if (FAILED(hr)) goto error; } } error: SafeMemFree(rghKids); return hr; } UINT uCodePageFromCharset(HCHARSET hCharset) { INETCSETINFO CsetInfo; UINT uiCodePage = GetACP(); if (hCharset && (MimeOleGetCharsetInfo(hCharset, &CsetInfo)==S_OK)) uiCodePage = CsetInfo.cpiInternet ; return uiCodePage; } UINT uCodePageFromMsg(LPMIMEMESSAGE pMsg) { HCHARSET hCharset=0; if (pMsg) pMsg->GetCharset(&hCharset); return uCodePageFromCharset(hCharset); } HRESULT HrIStreamWToInetCset(LPSTREAM pstmW, HCHARSET hCharset, LPSTREAM *ppstmOut) { IMimeBody *pBody; HRESULT hr; hr = MimeOleCreateBody(&pBody); if (!FAILED(hr)) { hr = pBody->InitNew(); if (!FAILED(hr)) { hr = pBody->SetData(IET_UNICODE, STR_CNT_TEXT, STR_SUB_HTML, IID_IStream, pstmW); if (!FAILED(hr)) { hr = pBody->SetCharset(hCharset, CSET_APPLY_ALL); if (!FAILED(hr)) hr = pBody->GetData(IET_INETCSET, ppstmOut); } } pBody->Release(); } return hr; } HRESULT HrCopyHeader(LPMIMEMESSAGE pMsgDest, HBODY hBodyDest, LPMIMEMESSAGE pMsgSrc, HBODY hBodySrc, LPCSTR pszName) { LPSTR lpszProp; HRESULT hr; hr = MimeOleGetBodyPropA(pMsgSrc, hBodySrc, pszName, NOFLAGS, &lpszProp); if (!FAILED(hr)) { hr = MimeOleSetBodyPropA(pMsgDest, hBodyDest, pszName, NOFLAGS, lpszProp); SafeMimeOleFree(lpszProp); } return hr; }