summaryrefslogtreecommitdiffstats
path: root/private/ole32/com/remote/dde/client/ddecnvrt.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ole32/com/remote/dde/client/ddecnvrt.cxx348
1 files changed, 348 insertions, 0 deletions
diff --git a/private/ole32/com/remote/dde/client/ddecnvrt.cxx b/private/ole32/com/remote/dde/client/ddecnvrt.cxx
new file mode 100644
index 000000000..119c67d15
--- /dev/null
+++ b/private/ole32/com/remote/dde/client/ddecnvrt.cxx
@@ -0,0 +1,348 @@
+
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ ddecnvrt.cpp
+
+Abstract:
+
+ This module contains the code to read/write PBrush, MSDraw native data
+ formats. This module also contains PBrush native format <->DIbFile stream,
+ and MSDraw native format <-> placeable metafile stream conversion routines.
+
+Author:
+
+ Srini Koppolu (srinik) 06/29/1993
+
+Revision History:
+
+--*/
+
+#ifndef _MAC
+
+
+/************************ FILE FORMATS **********************************
+
+
+Normal Metafile (memory or disk based):
+
+ ------------ ---------------
+ | METAHEADER | Metafile bits |
+ ------------ ---------------
+
+Placeable Metafile:
+
+ --------------------- -----------------
+ | PLACEABLEMETAHEADER | Normal metafile |
+ --------------------- -----------------
+
+Memory Based DIB:
+
+ ------------------ --------------- ----------
+ | BITMAPINFOHEADER | RGBQUAD array | DIB bits |
+ ------------------ --------------- ----------
+
+DIB file format:
+
+ ------------------ ------------------
+ | BITMAPFILEHEADER | Memory based DIB |
+ ------------------ ------------------
+
+Ole10NativeStream Format:
+
+ -------- ----------------------
+ | dwSize | Object's Native data |
+ -------- ----------------------
+
+PBrush Native data format:
+
+ -----------------
+ | Dib File format |
+ -----------------
+
+MSDraw Native data format:
+
+ --------------------- ------------- ------------- -----------------
+ | mapping mode (WORD) | xExt (WORD) | yExt (WORD) | Normal metafile |
+ --------------------- ------------- ------------- -----------------
+
+
+*****************************************************************************/
+
+#include <ole2int.h>
+
+INTERNAL UtGetHMFPICTFromMSDrawNativeStm
+ (LPSTREAM pstm, DWORD dwSize, HANDLE FAR* lphdata)
+{
+ HRESULT error;
+ WORD mfp[3]; // mm, xExt, yExt
+ HMETAFILE hMF = NULL;
+
+ *lphdata = NULL;
+
+ if (error = pstm->Read(mfp, sizeof(mfp), NULL))
+ return error;
+
+ dwSize -= sizeof(mfp);
+
+ if (error = UtGetHMFFromMFStm(pstm, dwSize, FALSE, (void **)&hMF))
+ return error;
+
+ AssertSz(mfp[0] == MM_ANISOTROPIC, "invalid map mode in MsDraw native data");
+
+ if (*lphdata = UtGetHMFPICT(hMF, TRUE, (int) mfp[1], (int) mfp[2]))
+ return NOERROR;
+
+ return ResultFromScode(E_OUTOFMEMORY);
+}
+
+
+INTERNAL UtPlaceableMFStmToMSDrawNativeStm
+ (LPSTREAM pstmPMF, LPSTREAM pstmMSDraw)
+{
+ DWORD dwSize; // size of metafile bits excluding the placeable MF header
+ LONG xExt;
+ LONG yExt;
+ WORD wBuf[5]; // dwSize(DWORD), mm(int), xExt(int), yExt(int)
+ HRESULT error;
+
+ if (error = UtGetSizeAndExtentsFromPlaceableMFStm(pstmPMF, &dwSize,
+ &xExt, &yExt))
+ return error;
+
+ *((DWORD FAR*) wBuf) = dwSize + 3*sizeof(WORD);
+ wBuf[2] = MM_ANISOTROPIC;
+ wBuf[3] = (int) xExt;
+ wBuf[4] = (int) yExt;
+
+ if (error = pstmMSDraw->Write(wBuf, sizeof(wBuf), 0))
+ return error;
+
+ ULARGE_INTEGER ularge_int;
+ ULISet32(ularge_int, dwSize);
+ if ((error = pstmPMF->CopyTo(pstmMSDraw, ularge_int,
+ NULL, NULL)) == NOERROR)
+ StSetSize(pstmMSDraw);
+
+ return error;
+
+}
+
+
+INTERNAL UtDIBFileStmToPBrushNativeStm
+ (LPSTREAM pstmDIBFile, LPSTREAM pstmPBrush)
+{
+ BITMAPFILEHEADER bfh;
+ HRESULT error;
+
+ if (error = pstmDIBFile->Read(&bfh, sizeof(bfh), 0))
+ return error;
+
+ // seek to the begining of the stream
+ LARGE_INTEGER large_int;
+ LISet32( large_int, 0);
+ if (error = pstmDIBFile->Seek(large_int, STREAM_SEEK_SET, 0))
+ return error;
+
+ if (error = pstmPBrush->Write(&(bfh.bfSize), sizeof(DWORD), 0))
+ return error;
+
+ ULARGE_INTEGER ularge_int;
+ ULISet32(ularge_int, bfh.bfSize);
+
+ if ((error = pstmDIBFile->CopyTo(pstmPBrush, ularge_int,
+ NULL, NULL)) == NOERROR)
+ StSetSize(pstmPBrush);
+
+ return error;
+}
+
+
+
+INTERNAL UtContentsStmTo10NativeStm
+ (LPSTORAGE pstg, REFCLSID rclsid, BOOL fDeleteSrcStm, UINT FAR* puiStatus)
+{
+ CLIPFORMAT cf;
+ LPOLESTR lpszUserType = NULL;
+ HRESULT error;
+ LPSTREAM pstmSrc = NULL;
+ LPSTREAM pstmDst = NULL;
+
+ *puiStatus = NULL;
+
+ if (error = ReadFmtUserTypeStg(pstg, &cf, &lpszUserType))
+ return error;
+
+
+ if (! ((cf == CF_DIB && rclsid == CLSID_PBrush)
+ || (cf == CF_METAFILEPICT && rclsid == CLSID_MSDraw))) {
+ error = ResultFromScode(DV_E_CLIPFORMAT);
+ goto errRtn;
+ }
+
+ if (error = pstg->OpenStream(CONTENTS_STREAM, NULL,
+ (STGM_READ|STGM_SHARE_EXCLUSIVE),
+ 0, &pstmSrc)) {
+ *puiStatus |= CONVERT_NOSOURCE;
+
+ // check whether OLE10_NATIVE_STREAM exists
+ if (pstg->OpenStream(OLE10_NATIVE_STREAM, NULL,
+ (STGM_READ|STGM_SHARE_EXCLUSIVE), 0, &pstmDst))
+ *puiStatus |= CONVERT_NODESTINATION;
+ else {
+ pstmDst->Release();
+ pstmDst = NULL;
+ }
+
+ goto errRtn;
+ }
+
+ if (error = OpenOrCreateStream(pstg, OLE10_NATIVE_STREAM, &pstmDst)) {
+ *puiStatus |= CONVERT_NODESTINATION;
+ goto errRtn;
+ }
+
+ if (cf == CF_METAFILEPICT)
+ error = UtPlaceableMFStmToMSDrawNativeStm(pstmSrc, pstmDst);
+ else
+ error = UtDIBFileStmToPBrushNativeStm(pstmSrc, pstmDst);
+
+errRtn:
+ if (pstmDst)
+ pstmDst->Release();
+
+ if (pstmSrc)
+ pstmSrc->Release();
+
+ if (error == NOERROR) {
+ LPOLESTR lpszProgId = NULL;
+ ProgIDFromCLSID(rclsid, &lpszProgId);
+
+ error = WriteFmtUserTypeStg(pstg,
+ RegisterClipboardFormat(lpszProgId),
+ lpszUserType);
+
+ if (lpszProgId)
+ delete lpszProgId;
+ }
+
+ if (error == NOERROR) {
+ if (fDeleteSrcStm)
+ pstg->DestroyElement(CONTENTS_STREAM);
+ } else {
+ pstg->DestroyElement(OLE10_NATIVE_STREAM);
+ }
+
+ if (lpszUserType)
+ delete lpszUserType;
+
+ return error;
+}
+
+
+
+INTERNAL Ut10NativeStmToContentsStm
+ (LPSTORAGE pstg, REFCLSID rclsid, BOOL fDeleteSrcStm)
+{
+ extern CLIPFORMAT cfPBrush;
+ extern CLIPFORMAT cfMSDraw;
+
+ CLIPFORMAT cfOld;
+ CLIPFORMAT cfNew;
+ LPOLESTR lpszUserType = NULL;
+ HRESULT error;
+ LPSTREAM pstmSrc = NULL;
+ LPSTREAM pstmDst = NULL;
+
+
+ if (error = ReadFmtUserTypeStg(pstg, &cfOld, &lpszUserType))
+ return error;
+
+ if (rclsid == CLSID_StaticDib)
+ cfNew = CF_DIB;
+ else if (rclsid == CLSID_StaticMetafile)
+ cfNew = CF_METAFILEPICT;
+ else {
+ AssertSz(FALSE, "Internal Error: this routine shouldn't have been called for this class");
+ return ResultFromScode(E_FAIL);
+ }
+
+ if (cfOld == cfPBrush) {
+ if (cfNew != CF_DIB) {
+ error = ResultFromScode(DV_E_CLIPFORMAT);
+ goto errRtn;
+ }
+ } else if (cfOld == cfMSDraw) {
+ if (cfNew != CF_METAFILEPICT) {
+ error = ResultFromScode(DV_E_CLIPFORMAT);
+ goto errRtn;
+ }
+ } else {
+ // Converted to static object from some class other than PBrush or
+ // MSDraw. The data must be in a proper format in the CONTENTS
+ // stream.
+ return NOERROR;
+ }
+
+ if (error = pstg->OpenStream(OLE10_NATIVE_STREAM, NULL,
+ (STGM_READ|STGM_SHARE_EXCLUSIVE),
+ 0, &pstmSrc))
+ goto errRtn;
+
+ if (error = OpenOrCreateStream(pstg, CONTENTS_STREAM, &pstmDst))
+ goto errRtn;
+
+ DWORD dwSize;
+ if (error = pstmSrc->Read(&dwSize, sizeof(DWORD), NULL))
+ goto errRtn;
+
+ if (cfOld == cfMSDraw) {
+ WORD mfp[3]; // mm, xExt, yExt
+
+ if (error = pstmSrc->Read(mfp, sizeof(mfp), NULL))
+ goto errRtn;
+
+ dwSize -= sizeof(mfp);
+
+ error = UtMFStmToPlaceableMFStm(pstmSrc, dwSize,
+ (LONG) mfp[1], (LONG) mfp[2], pstmDst);
+
+ } else {
+ // The PBrush native data format is DIB File format. So all we got to
+ // do is CopyTo.
+
+ ULARGE_INTEGER ularge_int;
+ ULISet32(ularge_int, dwSize);
+ if ((error = pstmSrc->CopyTo(pstmDst, ularge_int, NULL,
+ NULL)) == NOERROR)
+ StSetSize(pstmDst);
+ }
+
+errRtn:
+ if (pstmDst)
+ pstmDst->Release();
+
+ if (pstmSrc)
+ pstmSrc->Release();
+
+ if (error == NOERROR) {
+ error = WriteFmtUserTypeStg(pstg, cfNew, lpszUserType);
+
+ if (fDeleteSrcStm)
+ pstg->DestroyElement(OLE10_NATIVE_STREAM);
+
+ } else {
+ pstg->DestroyElement(CONTENTS_STREAM);
+ }
+
+ if (lpszUserType)
+ delete lpszUserType;
+
+ return error;
+}
+
+#endif
+