You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344 lines
7.6 KiB
344 lines
7.6 KiB
/* File: D:\WACKER\tdll\printhdl.c (Created: 10-Dec-1993)
|
|
*
|
|
* Copyright 1994 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 5 $
|
|
* $Date: 6/13/01 4:12p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include <term\res.h>
|
|
|
|
#include "stdtyp.h"
|
|
#include "mc.h"
|
|
#include "assert.h"
|
|
#include "print.h"
|
|
#include "print.hh"
|
|
#include "sf.h"
|
|
#include "tdll.h"
|
|
#include "htchar.h"
|
|
#include "term.h"
|
|
#include "session.h"
|
|
#include "sess_ids.h"
|
|
#include "statusbr.h"
|
|
#include "globals.h"
|
|
#include "errorbox.h"
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* printCreateHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* Creates a print handle.
|
|
*
|
|
*
|
|
* ARGUMENTS:
|
|
* hSession - Exteranl session handle
|
|
*
|
|
* RETURNS:
|
|
* Returns an External Print Handle, or 0 if an error.
|
|
*
|
|
*/
|
|
HPRINT printCreateHdl(const HSESSION hSession)
|
|
{
|
|
HHPRINT hhPrint = 0;
|
|
|
|
hhPrint = malloc(sizeof(*hhPrint));
|
|
|
|
if (hhPrint == 0)
|
|
{
|
|
assert(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
memset(hhPrint, 0, sizeof(*hhPrint));
|
|
|
|
hhPrint->hSession = hSession;
|
|
|
|
InitializeCriticalSection(&hhPrint->csPrint);
|
|
|
|
if (printInitializeHdl((HPRINT)hhPrint) != 0)
|
|
{
|
|
printDestroyHdl((HPRINT)hhPrint);
|
|
hhPrint = NULL;
|
|
return 0;
|
|
}
|
|
|
|
return (HPRINT)hhPrint;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* printInitializeHdl
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
*
|
|
* ARGUMENTS:
|
|
* hPrint - External print handle.
|
|
*
|
|
* RETURNS:
|
|
* 0 if successful, otherwise -1
|
|
*
|
|
*/
|
|
int printInitializeHdl(const HPRINT hPrint)
|
|
{
|
|
unsigned long lSize;
|
|
const HHPRINT hhPrint = (HHPRINT)hPrint;
|
|
TCHAR *tmp = 0;
|
|
TCHAR achBuf[256];
|
|
TCHAR *pszString;
|
|
int nCharSet;
|
|
|
|
if (hhPrint == 0)
|
|
return -1;
|
|
|
|
hhPrint->nLnIdx = 0;
|
|
|
|
// Initialize the printer name to the default.
|
|
//
|
|
if (GetProfileString("Windows", "Device", ",,,", achBuf,
|
|
sizeof(achBuf)) && (pszString = strtok(achBuf, ",")))
|
|
{
|
|
StrCharCopyN(hhPrint->achPrinterName, pszString, sizeof(hhPrint->achPrinterName) / sizeof(TCHAR));
|
|
}
|
|
else
|
|
{
|
|
// Just to let you know, there is no printer.
|
|
//
|
|
assert(FALSE);
|
|
hhPrint->achPrinterName[0] = TEXT('\0');
|
|
}
|
|
|
|
if (hhPrint->pstDevMode != NULL)
|
|
{
|
|
free(hhPrint->pstDevMode);
|
|
hhPrint->pstDevMode = NULL;
|
|
}
|
|
|
|
if (hhPrint->pstDevNames != NULL)
|
|
{
|
|
free(hhPrint->pstDevNames);
|
|
hhPrint->pstDevNames = NULL;
|
|
}
|
|
|
|
lSize = sizeof(hhPrint->achPrinterName);
|
|
|
|
sfGetSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_NAME,
|
|
&lSize,
|
|
hhPrint->achPrinterName);
|
|
|
|
|
|
lSize = 0;
|
|
if (sfGetSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVMODE,
|
|
&lSize,
|
|
0) == 0 && lSize)
|
|
{
|
|
if ((hhPrint->pstDevMode = malloc(lSize)))
|
|
{
|
|
sfGetSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVMODE,
|
|
&lSize,
|
|
hhPrint->pstDevMode);
|
|
}
|
|
}
|
|
|
|
lSize = 0;
|
|
if (sfGetSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVNAMES,
|
|
&lSize,
|
|
0) == 0 && lSize)
|
|
{
|
|
if ((hhPrint->pstDevNames = malloc(lSize)))
|
|
{
|
|
sfGetSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVNAMES,
|
|
&lSize,
|
|
hhPrint->pstDevNames);
|
|
}
|
|
}
|
|
|
|
//
|
|
// get the font and margin settings
|
|
//
|
|
|
|
memset(&hhPrint->lf, 0, sizeof(LOGFONT));
|
|
memset(&hhPrint->margins, 0, sizeof(RECT));
|
|
hhPrint->hFont = NULL;
|
|
|
|
lSize = sizeof(hhPrint->margins);
|
|
sfGetSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_MARGINS,
|
|
&lSize, &hhPrint->margins );
|
|
|
|
lSize = sizeof(hhPrint->lf);
|
|
sfGetSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_FONT,
|
|
&lSize, &hhPrint->lf );
|
|
|
|
lSize = sizeof(hhPrint->iFontPointSize);
|
|
sfGetSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_FONT_HEIGHT,
|
|
&lSize, &hhPrint->iFontPointSize );
|
|
|
|
|
|
//
|
|
// use default if we have no value stored
|
|
//
|
|
|
|
if (hhPrint->lf.lfHeight == 0)
|
|
{
|
|
TCHAR faceName[100];
|
|
|
|
if ( LoadString(glblQueryDllHinst(), IDS_PRINT_DEF_FONT,
|
|
faceName, sizeof (hhPrint->lf.lfFaceName) / sizeof(TCHAR)) )
|
|
{
|
|
StrCharCopyN( hhPrint->lf.lfFaceName, faceName, sizeof (faceName) / sizeof(TCHAR) );
|
|
hhPrint->lf.lfFaceName[sizeof(hhPrint->lf.lfFaceName)/sizeof(TCHAR)-1] = TEXT('\0');
|
|
}
|
|
|
|
hhPrint->lf.lfHeight = -17;
|
|
hhPrint->iFontPointSize = 100;
|
|
|
|
//mpt:2-4-98 changed to use resources so that dbcs fonts print correctly
|
|
if (LoadString(glblQueryDllHinst(), IDS_PRINT_DEF_CHARSET,
|
|
achBuf, sizeof(achBuf) / sizeof(TCHAR)))
|
|
{
|
|
nCharSet = atoi(achBuf);
|
|
hhPrint->lf.lfCharSet = (BYTE)nCharSet;
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* printSaveHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* Saves the name of the selected printer in the session file.
|
|
*
|
|
* ARGUMENTS:
|
|
* hPrint - The external printer handle.
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*/
|
|
void printSaveHdl(const HPRINT hPrint)
|
|
{
|
|
const HHPRINT hhPrint = (HHPRINT)hPrint;
|
|
unsigned long ulSize;
|
|
TCHAR *sz;
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_NAME,
|
|
StrCharGetByteCount(hhPrint->achPrinterName) +
|
|
sizeof(TCHAR),
|
|
hhPrint->achPrinterName);
|
|
|
|
if (hhPrint->pstDevMode)
|
|
{
|
|
ulSize = hhPrint->pstDevMode->dmSize +
|
|
hhPrint->pstDevMode->dmDriverExtra;
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVMODE,
|
|
ulSize,
|
|
hhPrint->pstDevMode);
|
|
}
|
|
|
|
if (hhPrint->pstDevNames)
|
|
{
|
|
// Getting the size of a DEVNAMES structure is harder.
|
|
//
|
|
sz = (TCHAR *)hhPrint->pstDevNames +
|
|
hhPrint->pstDevNames->wOutputOffset;
|
|
|
|
sz += StrCharGetByteCount((LPCSTR)sz) + sizeof(TCHAR);
|
|
ulSize = (unsigned long)(sz - (TCHAR *)hhPrint->pstDevNames);
|
|
|
|
sfPutSessionItem(sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_DEVNAMES,
|
|
ulSize,
|
|
hhPrint->pstDevNames);
|
|
}
|
|
|
|
//
|
|
// save the font and margin settings
|
|
//
|
|
|
|
sfPutSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_MARGINS,
|
|
sizeof(hhPrint->margins), &hhPrint->margins );
|
|
|
|
sfPutSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_FONT,
|
|
sizeof(hhPrint->lf), &hhPrint->lf );
|
|
|
|
sfPutSessionItem( sessQuerySysFileHdl(hhPrint->hSession),
|
|
SFID_PRINTSET_FONT_HEIGHT,
|
|
sizeof(hhPrint->iFontPointSize),
|
|
&hhPrint->iFontPointSize );
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* printDestroyHdl
|
|
*
|
|
* DESCRIPTION:
|
|
* Destroys a valid print handle.
|
|
*
|
|
* ARGUMENTS:
|
|
* hPrint - AN External Print Handle.
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*/
|
|
void printDestroyHdl(const HPRINT hPrint)
|
|
{
|
|
const HHPRINT hhPrint = (HHPRINT)hPrint;
|
|
|
|
if (hhPrint == 0)
|
|
return;
|
|
|
|
if (hhPrint->hFont)
|
|
{
|
|
DeleteObject(hhPrint->hFont);
|
|
}
|
|
|
|
printEchoClose(hPrint);
|
|
|
|
DeleteCriticalSection(&hhPrint->csPrint);
|
|
|
|
//
|
|
// Don't forget to free the Printer Device and Printer Name,
|
|
// or else there will be a memory leak. REV: 06/13/2001.
|
|
//
|
|
if (hhPrint->pstDevMode != NULL)
|
|
{
|
|
free(hhPrint->pstDevMode);
|
|
hhPrint->pstDevMode = NULL;
|
|
}
|
|
|
|
if (hhPrint->pstDevNames != NULL)
|
|
{
|
|
free(hhPrint->pstDevNames);
|
|
hhPrint->pstDevNames = NULL;
|
|
}
|
|
|
|
free(hhPrint);
|
|
return;
|
|
}
|
|
|