windows-nt/Source/XPSP1/NT/com/oleutest/letest/ole2ui/targtdev.c
2020-09-26 16:20:57 +08:00

329 lines
8.2 KiB
C

/*************************************************************************
**
** OLE 2 Standard Utilities
**
** olestd.c
**
** This file contains utilities that are useful for dealing with
** target devices.
**
** (c) Copyright Microsoft Corp. 1992 All Rights Reserved
**
*************************************************************************/
#define STRICT 1
#include "ole2ui.h"
#ifndef WIN32
#include <print.h>
#endif
/*
* OleStdCreateDC()
*
* Purpose:
*
* Parameters:
*
* Return Value:
* SCODE - S_OK if successful
*/
STDAPI_(HDC) OleStdCreateDC(DVTARGETDEVICE FAR* ptd)
{
HDC hdc=NULL;
LPDEVNAMES lpDevNames;
LPDEVMODE lpDevMode;
LPTSTR lpszDriverName;
LPTSTR lpszDeviceName;
LPTSTR lpszPortName;
if (ptd == NULL) {
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
goto errReturn;
}
lpDevNames = (LPDEVNAMES) ptd; // offset for size field
if (ptd->tdExtDevmodeOffset == 0) {
lpDevMode = NULL;
}else{
lpDevMode = (LPDEVMODE) ((LPSTR)ptd + ptd->tdExtDevmodeOffset);
}
lpszDriverName = (LPTSTR) lpDevNames + ptd->tdDriverNameOffset;
lpszDeviceName = (LPTSTR) lpDevNames + ptd->tdDeviceNameOffset;
lpszPortName = (LPTSTR) lpDevNames + ptd->tdPortNameOffset;
hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
errReturn:
return hdc;
}
/*
* OleStdCreateIC()
*
* Purpose: Same as OleStdCreateDC, except that information context is
* created, rather than a whole device context. (CreateIC is
* used rather than CreateDC).
* OleStdDeleteDC is still used to delete the information context.
*
* Parameters:
*
* Return Value:
* SCODE - S_OK if successful
*/
STDAPI_(HDC) OleStdCreateIC(DVTARGETDEVICE FAR* ptd)
{
HDC hdcIC=NULL;
LPDEVNAMES lpDevNames;
LPDEVMODE lpDevMode;
LPTSTR lpszDriverName;
LPTSTR lpszDeviceName;
LPTSTR lpszPortName;
if (ptd == NULL) {
hdcIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
goto errReturn;
}
lpDevNames = (LPDEVNAMES) ptd; // offset for size field
lpDevMode = (LPDEVMODE) ((LPTSTR)ptd + ptd->tdExtDevmodeOffset);
lpszDriverName = (LPTSTR) lpDevNames + ptd->tdDriverNameOffset;
lpszDeviceName = (LPTSTR) lpDevNames + ptd->tdDeviceNameOffset;
lpszPortName = (LPTSTR) lpDevNames + ptd->tdPortNameOffset;
hdcIC = CreateIC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
errReturn:
return hdcIC;
}
#ifdef NEVER
// This code is wrong
/*
* OleStdCreateTargetDevice()
*
* Purpose:
*
* Parameters:
*
* Return Value:
* SCODE - S_OK if successful
*/
STDAPI_(DVTARGETDEVICE FAR*) OleStdCreateTargetDevice(LPPRINTDLG lpPrintDlg)
{
DVTARGETDEVICE FAR* ptd=NULL;
LPDEVNAMES lpDevNames, pDN;
LPDEVMODE lpDevMode, pDM;
UINT nMaxOffset;
LPTSTR pszName;
DWORD dwDevNamesSize, dwDevModeSize, dwPtdSize;
if ((pDN = (LPDEVNAMES)GlobalLock(lpPrintDlg->hDevNames)) == NULL) {
goto errReturn;
}
if ((pDM = (LPDEVMODE)GlobalLock(lpPrintDlg->hDevMode)) == NULL) {
goto errReturn;
}
nMaxOffset = (pDN->wDriverOffset > pDN->wDeviceOffset) ?
pDN->wDriverOffset : pDN->wDeviceOffset ;
nMaxOffset = (pDN->wOutputOffset > nMaxOffset) ?
pDN->wOutputOffset : nMaxOffset ;
pszName = (LPTSTR)pDN + nMaxOffset;
dwDevNamesSize = (DWORD)((nMaxOffset+lstrlen(pszName) + 1/* NULL term */)*sizeof(TCHAR));
dwDevModeSize = (DWORD) (pDM->dmSize + pDM->dmDriverExtra);
dwPtdSize = sizeof(DWORD) + dwDevNamesSize + dwDevModeSize;
if ((ptd = (DVTARGETDEVICE FAR*)OleStdMalloc(dwPtdSize)) != NULL) {
// copy in the info
ptd->tdSize = (UINT)dwPtdSize;
lpDevNames = (LPDEVNAMES) &ptd->tdDriverNameOffset;
_fmemcpy(lpDevNames, pDN, (size_t)dwDevNamesSize);
lpDevMode=(LPDEVMODE)((LPTSTR)&ptd->tdDriverNameOffset+dwDevNamesSize);
_fmemcpy(lpDevMode, pDM, (size_t)dwDevModeSize);
ptd->tdDriverNameOffset += 4 ;
ptd->tdDeviceNameOffset += 4 ;
ptd->tdPortNameOffset += 4 ;
ptd->tdExtDevmodeOffset = (UINT)dwDevNamesSize + 4 ;
}
errReturn:
GlobalUnlock(lpPrintDlg->hDevNames);
GlobalUnlock(lpPrintDlg->hDevMode);
return ptd;
}
#endif // NEVER
/*
* OleStdDeleteTargetDevice()
*
* Purpose:
*
* Parameters:
*
* Return Value:
* SCODE - S_OK if successful
*/
STDAPI_(BOOL) OleStdDeleteTargetDevice(DVTARGETDEVICE FAR* ptd)
{
BOOL res=TRUE;
if (ptd != NULL) {
OleStdFree(ptd);
}
return res;
}
/*
* OleStdCopyTargetDevice()
*
* Purpose:
* duplicate a TARGETDEVICE struct. this function allocates memory for
* the copy. the caller MUST free the allocated copy when done with it
* using the standard allocator returned from CoGetMalloc.
* (OleStdFree can be used to free the copy).
*
* Parameters:
* ptdSrc pointer to source TARGETDEVICE
*
* Return Value:
* pointer to allocated copy of ptdSrc
* if ptdSrc==NULL then retuns NULL is returned.
* if ptdSrc!=NULL and memory allocation fails, then NULL is returned
*/
STDAPI_(DVTARGETDEVICE FAR*) OleStdCopyTargetDevice(DVTARGETDEVICE FAR* ptdSrc)
{
DVTARGETDEVICE FAR* ptdDest = NULL;
if (ptdSrc == NULL) {
return NULL;
}
if ((ptdDest = (DVTARGETDEVICE FAR*)OleStdMalloc(ptdSrc->tdSize)) != NULL) {
_fmemcpy(ptdDest, ptdSrc, (size_t)ptdSrc->tdSize);
}
return ptdDest;
}
/*
* OleStdCopyFormatEtc()
*
* Purpose:
* Copies the contents of a FORMATETC structure. this function takes
* special care to copy correctly copying the pointer to the TARGETDEVICE
* contained within the source FORMATETC structure.
* if the source FORMATETC has a non-NULL TARGETDEVICE, then a copy
* of the TARGETDEVICE will be allocated for the destination of the
* FORMATETC (petcDest).
*
* OLE2NOTE: the caller MUST free the allocated copy of the TARGETDEVICE
* within the destination FORMATETC when done with it
* using the standard allocator returned from CoGetMalloc.
* (OleStdFree can be used to free the copy).
*
* Parameters:
* petcDest pointer to destination FORMATETC
* petcSrc pointer to source FORMATETC
*
* Return Value:
* returns TRUE is copy is successful; retuns FALSE if not successful
*/
STDAPI_(BOOL) OleStdCopyFormatEtc(LPFORMATETC petcDest, LPFORMATETC petcSrc)
{
if ((petcDest == NULL) || (petcSrc == NULL)) {
return FALSE;
}
petcDest->cfFormat = petcSrc->cfFormat;
petcDest->ptd = OleStdCopyTargetDevice(petcSrc->ptd);
petcDest->dwAspect = petcSrc->dwAspect;
petcDest->lindex = petcSrc->lindex;
petcDest->tymed = petcSrc->tymed;
return TRUE;
}
// returns 0 for exact match, 1 for no match, -1 for partial match (which is
// defined to mean the left is a subset of the right: fewer aspects, null target
// device, fewer medium).
STDAPI_(int) OleStdCompareFormatEtc(FORMATETC FAR* pFetcLeft, FORMATETC FAR* pFetcRight)
{
BOOL bExact = TRUE;
if (pFetcLeft->cfFormat != pFetcRight->cfFormat)
return 1;
else if (!OleStdCompareTargetDevice (pFetcLeft->ptd, pFetcRight->ptd))
return 1;
if (pFetcLeft->dwAspect == pFetcRight->dwAspect)
// same aspects; equal
;
else if ((pFetcLeft->dwAspect & ~pFetcRight->dwAspect) != 0)
// left not subset of aspects of right; not equal
return 1;
else
// left subset of right
bExact = FALSE;
if (pFetcLeft->tymed == pFetcRight->tymed)
// same medium flags; equal
;
else if ((pFetcLeft->tymed & ~pFetcRight->tymed) != 0)
// left not subset of medium flags of right; not equal
return 1;
else
// left subset of right
bExact = FALSE;
return bExact ? 0 : -1;
}
STDAPI_(BOOL) OleStdCompareTargetDevice
(DVTARGETDEVICE FAR* ptdLeft, DVTARGETDEVICE FAR* ptdRight)
{
if (ptdLeft == ptdRight)
// same address of td; must be same (handles NULL case)
return TRUE;
else if ((ptdRight == NULL) || (ptdLeft == NULL))
return FALSE;
else if (ptdLeft->tdSize != ptdRight->tdSize)
// different sizes, not equal
return FALSE;
#ifdef WIN32
else if (memcmp(ptdLeft, ptdRight, ptdLeft->tdSize) != 0)
#else
else if (_fmemcmp(ptdLeft, ptdRight, (int)ptdLeft->tdSize) != 0)
#endif
// not same target device, not equal
return FALSE;
return TRUE;
}