home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
print
/
pmenv
/
second
/
pmhpenv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-03
|
14KB
|
498 lines
/*
* OS/2 Presentation Manager HP LaserJet Envelope Printing Program
*
* Dave Briccetti & Associates CompuServe: 74475,1072
* P.O. Box 1713
* Lafayette, CA 94549-7013
* USA
*
* Copyright (c) 1990, David C. Briccetti
*
* See the extended help in the program for more information.
*/
#include <io.h>
#include <malloc.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INCL_WINDIALOGS
#define INCL_WINFRAMEMGR
#define INCL_WINHELP
#define INCL_WINMESSAGEMGR
#define INCL_WINMENUS
#define INCL_WINMLE
#define INCL_WINRECTANGLES
#define INCL_WINSHELLDATA
#define INCL_WINSYS
#define INCL_WINWINDOWMGR
#include <os2.h>
#include "pmenv.h"
#define OUTSTREAM stdprn
#define MLE_BUFSIZE 2000
static HAB hab;
static HWND hwndHelpInstance;
static MRESULT EXPENTRY
DlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
static ULONG
GetAllText (HWND hwnd, USHORT idMle, USHORT cbBuf);
static ULONG
SetAllText (HWND hwnd, USHORT idMle, ULONG cbCopy);
static VOID PrintEnvelope (HWND hwnd, USHORT idAddr,
USHORT idRetAddr, PBYTE pabBufAddr, PBYTE pabBufRetAddr);
static HWND InitializeHelp (HAB hab, HWND hwndFrame);
static MRESULT ProcessHmMessages (HWND hwndHelpInstance,
USHORT msg, MPARAM mp1, MPARAM mp2);
static VOID CenterDlgBox( HWND hwnd );
static VOID SetSystemMenu( HWND hwndDlg );
/* ----------------------------------------------------------------- */
VOID main (VOID)
{
HMQ hmq;
QMSG qmsg;
HWND hwndDlg;
hab = WinInitialize (0);
hmq = WinCreateMsgQueue (hab, DEFAULT_QUEUE_SIZE);
hwndDlg = WinLoadDlg (HWND_DESKTOP, HWND_DESKTOP,
DlgProc, 0, DID_DLG, 0);
hwndHelpInstance = InitializeHelp (hab, hwndDlg);
while (WinGetMsg (hab, &qmsg, 0, 0, 0))
WinDispatchMsg (hab, &qmsg);
if (hwndHelpInstance)
WinDestroyHelpInstance (hwndHelpInstance);
WinDestroyMsgQueue (hmq);
WinTerminate (hab);
}
/* ----------------------------------------------------------------- */
static MRESULT EXPENTRY
DlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
static PBYTE pabBufAddr;
static PBYTE pabBufRetAddr;
ULONG cbData;
switch (msg)
{
case WM_INITDLG:
{
HWND hwndStamp;
RECTL rclStamp;
SWP swpEnvelope;
/* Make cosmetic changes to dialog box */
CenterDlgBox (hwnd);
SetSystemMenu (hwnd);
/* Place stamp in upper right corner of envelope */
WinQueryWindowRect (hwndStamp =
WinWindowFromID (hwnd, DID_STAMP),
&rclStamp);
WinQueryWindowPos (
WinWindowFromID (hwnd, DID_ENVELOPE),
&swpEnvelope);
WinSetWindowPos (hwndStamp, 0,
(SHORT) (swpEnvelope.x +
swpEnvelope.cx - (rclStamp.xRight * 6 / 5)),
(SHORT) (swpEnvelope.y +
swpEnvelope.cy - (rclStamp.yTop * 6 / 5)),
0, 0, SWP_MOVE);
/* Allocate MLE buffers and assign them to MLE controls */
pabBufAddr = halloc (MLE_BUFSIZE, sizeof (BYTE));
pabBufRetAddr = halloc (MLE_BUFSIZE, sizeof (BYTE));
WinSendDlgItemMsg (hwnd, DID_ADDR,
MLM_SETIMPORTEXPORT, MPFROMP (pabBufAddr),
MPFROMSHORT (MLE_BUFSIZE));
WinSendDlgItemMsg (hwnd, DID_RETURN_ADDR,
MLM_SETIMPORTEXPORT, MPFROMP (pabBufRetAddr),
MPFROMSHORT (MLE_BUFSIZE));
/* Retrieve saved data from user profile */
cbData = MLE_BUFSIZE;
if (PrfQueryProfileData (HINI_USERPROFILE,
"PMHPENV", "Address", pabBufAddr, &cbData))
SetAllText (hwnd, DID_ADDR, cbData);
cbData = MLE_BUFSIZE;
if (PrfQueryProfileData (HINI_USERPROFILE, "PMHPENV",
"ReturnAddress", pabBufRetAddr, &cbData))
SetAllText (hwnd, DID_RETURN_ADDR, cbData);
return 0;
}
case WM_COMMAND:
switch (SHORT1FROMMP (mp1))
{
case DID_SAVE:
/* Save address in profile */
cbData = GetAllText (hwnd, DID_ADDR,
MLE_BUFSIZE);
PrfWriteProfileData (HINI_USERPROFILE,
"PMHPENV", "Address", pabBufAddr, cbData);
break;
case DID_SAVE_RET:
/* Save return address in profile */
cbData = GetAllText (hwnd, DID_RETURN_ADDR,
MLE_BUFSIZE);
PrfWriteProfileData (HINI_USERPROFILE, "PMHPENV",
"ReturnAddress", pabBufRetAddr, cbData);
break;
case DID_PRINT:
PrintEnvelope (hwnd, DID_ADDR,
DID_RETURN_ADDR, pabBufAddr,
pabBufRetAddr);
break;
case DID_CANCEL:
WinPostMsg (hwnd, WM_CLOSE, 0L, 0L);
break;
}
break;
case WM_CLOSE:
WinPostMsg (0, WM_QUIT, 0L, 0L);
WinDestroyWindow (hwnd);
hfree (pabBufAddr);
hfree (pabBufRetAddr);
break;
case HM_ERROR:
return ProcessHmMessages (hwndHelpInstance,
msg, mp1, mp2);
default:
return WinDefDlgProc (hwnd, msg, mp1, mp2);
}
return (MRESULT) 0;
}
/* ----------------------------------------------------------------- */
static ULONG
GetAllText (HWND hwnd, USHORT idMle, USHORT cbBuf)
{
/*
* Export text from MLE
*/
ULONG lOffset = 0;
ULONG cbCopy = cbBuf;
ULONG cbText;
cbText = LONGFROMMR (WinSendDlgItemMsg (hwnd, idMle,
MLM_QUERYTEXTLENGTH, 0, 0));
return WinSendDlgItemMsg (hwnd, idMle,
MLM_EXPORT, MPFROMP (&lOffset), MPFROMP (&cbCopy)) ?
cbText : 0;
}
/* ----------------------------------------------------------------- */
static ULONG
SetAllText (HWND hwnd, USHORT idMle, ULONG cbCopy)
{
/*
* Export text to MLE
*/
ULONG lOffset = 0;
return LONGFROMMR (WinSendDlgItemMsg (hwnd, idMle,
MLM_IMPORT, MPFROMP (&lOffset),
MPFROMP (&cbCopy)));
}
/* ----------------------------------------------------------------- */
static VOID PrintEnvelope (HWND hwnd, USHORT idAddr,
USHORT idRetAddr, PBYTE pabBufAddr, PBYTE pabBufRetAddr)
{
/*
* Print Envelope
*/
FILE *pfPrint;
static PSZ pszTempTemplate = "HPPXXXXX";
CHAR szTempFilename [9];
CHAR szCommand [40];
ULONG cbData;
/* Export MLE data to buffers */
cbData = GetAllText (hwnd, idRetAddr,
MLE_BUFSIZE);
pabBufRetAddr [cbData] = 0;
cbData = GetAllText (hwnd, idAddr,
MLE_BUFSIZE);
pabBufAddr [cbData] = 0;
/* Set up temporary print file */
strcpy (szTempFilename, pszTempTemplate);
mktemp (szTempFilename);
pfPrint = fopen (szTempFilename, "w");
if (! pfPrint)
{
WinMessageBox (HWND_DESKTOP, HWND_DESKTOP,
"Can not open temporary print file",
"Printing Error", 1, MB_OK | MB_MOVEABLE);
return;
}
/* Print return address */
fprintf( pfPrint,
"\x01b" "E\x1b&l1O\x1b&l3H\x1b&l15E" );
fprintf( pfPrint, "\x1b&a1r&a15L" );
fprintf( pfPrint, pabBufRetAddr );
/* Print address */
fprintf( pfPrint, "\x1b&a11R" ); /* Line position */
fprintf( pfPrint, "\x1b&a58L" ); /* Column position */
fprintf( pfPrint, pabBufAddr );
fprintf( pfPrint, "\f\x01b" "E" );
/* Close temp file, copy to prn and delete */
fclose (pfPrint);
sprintf (szCommand, "copy %s prn", szTempFilename);
system (szCommand);
unlink (szTempFilename);
}
/* ----------------------------------------------------------------- */
static HWND InitializeHelp (HAB hab, HWND hwndFrame)
{
HELPINIT hmiHelpData; /* Help initialization structure */
HWND hwndHelpInstance;
CHAR szMsg[100];
memset (&hmiHelpData, 0, sizeof (HELPINIT));
hmiHelpData.cb = sizeof (HELPINIT);
hmiHelpData.phtHelpTable = (PVOID) (0xffff0000 | DID_DLG);
hmiHelpData.pszHelpWindowTitle = "Print Envelope Help Window";
hmiHelpData.pszHelpLibraryName = "PMHPENV.HLP";
hwndHelpInstance = WinCreateHelpInstance (hab, &hmiHelpData);
if (hwndHelpInstance && hmiHelpData.ulReturnCode)
{
WinDestroyHelpInstance (hwndHelpInstance);
hwndHelpInstance = 0;
}
if (!hwndHelpInstance)
{
sprintf (szMsg, "WinCreateHelpInstance failed, rc = %lx. "
"Program will continue without help.",
hmiHelpData.ulReturnCode);
WinMessageBox (HWND_DESKTOP, HWND_DESKTOP, szMsg,
(PSZ) "Help Creation Error", 1,
MB_OK | MB_APPLMODAL | MB_MOVEABLE);
}
else
WinAssociateHelpInstance (hwndHelpInstance, hwndFrame);
return hwndHelpInstance;
}
/* ----------------------------------------------------------------- */
static MRESULT ProcessHmMessages (HWND hwndHelpInstance,
USHORT msg, MPARAM mp1, MPARAM mp2)
{
switch (msg)
{
case HM_ERROR:
if (hwndHelpInstance && LONGFROMMP(mp1) == HMERR_NO_MEMORY)
{
WinMessageBox (HWND_DESKTOP, HWND_DESKTOP,
(PSZ) "Help Terminated Due to Error",
(PSZ) "Help Error",
1,
MB_OK | MB_APPLMODAL | MB_MOVEABLE);
WinDestroyHelpInstance (hwndHelpInstance);
}
else
{
CHAR szMsg[ 50 ];
sprintf (szMsg, "Help Error %lx Occurred",
LONGFROMMP (mp1));
WinMessageBox (HWND_DESKTOP, HWND_DESKTOP,
szMsg, "Help Error", 0,
MB_OK | MB_APPLMODAL | MB_MOVEABLE);
}
return (MRESULT) 0;
}
return (MRESULT) 0;
}
/*********************************************************************/
/* */
/* FUNCTION : CenterDlgBox */
/* */
/* Positions the dialog box in the center of the screen */
/* */
/*********************************************************************/
static VOID CenterDlgBox( HWND hwnd )
{
SHORT ix, iy;
SHORT iwidth, idepth;
SWP swp;
/* Query width and depth of screen device */
iwidth = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
idepth = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
/* Query width and depth of dialog box */
WinQueryWindowPos( hwnd, (PSWP)&swp );
/* Center dialog box within the screen */
ix = ( iwidth - swp.cx ) / 2;
iy = ( idepth - swp.cy ) / 2;
WinSetWindowPos( hwnd, HWND_TOP, ix, iy, 0, 0, SWP_MOVE );
}
/*********************************************************************/
/* */
/* FUNCTION: SetSystemMenu */
/* */
/* Edit items in the system menu to leave "Move", "Close", and */
/* "Switch to Task Manager". */
/* */
/*********************************************************************/
static VOID SetSystemMenu( HWND hwndDlg )
{
HWND hwndSysMenu; /* sys menu pull-down handle */
MENUITEM miTemp; /* menu item template */
SHORT sItemId; /* system menu item ID */
SHORT sItemIndex; /* system menu item index */
/*******************************************************************/
/* Get the handle of the system menu pull-down. */
/*******************************************************************/
hwndSysMenu = WinWindowFromID( hwndDlg, FID_SYSMENU );
WinSendMsg( hwndSysMenu,
MM_QUERYITEM,
MPFROM2SHORT( SC_SYSMENU, FALSE ),
MPFROMP( (PSZ)&miTemp ));
hwndSysMenu = miTemp.hwndSubMenu;
/*******************************************************************/
/* Remove all items from the system menu pull-down that are no */
/* longer wanted. */
/*******************************************************************/
for ( sItemIndex = 0, sItemId = 0; sItemId != MIT_ERROR; sItemIndex++)
{
sItemId = SHORT1FROMMR (WinSendMsg( hwndSysMenu,
MM_ITEMIDFROMPOSITION,
MPFROMSHORT( sItemIndex ),
(MPARAM) 0 ));
if ( sItemId != MIT_ERROR &&
sItemId != SC_MOVE &&
sItemId != SC_CLOSE &&
sItemId != SC_TASKMANAGER )
{
WinSendMsg( hwndSysMenu,
MM_DELETEITEM,
MPFROM2SHORT( sItemId, FALSE ),
(MPARAM)NULL );
sItemIndex--;
}
}
}