Implementing Wireless Print for WinNT/Win2K
By Zuoliu, November 01, 2001
WLSMON is a wireless print monitor prototype. By modifying a few function placeholders, you can customize it for your own wireless implementation.
November 2001/Implementing Wireless Print for WinNT/Win2K
Listing 3: wlsfnc.c
Source for wireless procedures. The functions prefixed with two underscores
need further implementation based on technology
/*------------------------------------------------------------------
wlsfnc.c: Implement wireless communications, for WDJ article only
Note: __WlsXxx functions need technology-based implementations
Author: Zuoliu Ding
------------------------------------------------------------------*/
#include <windows.h>
#include "wlsmon.h"
#define __WlsFrmSize 240
typedef struct tag__WLS_HANDLE
{
LPWSTR pNetwork;
LPWSTR pNode1;
LPWSTR pNode2;
WORD wTmo;
DWORD dwStatus;
// Other members...
} *__WLS_HANDLE;
HANDLE WlsConnectPrinter(LPWSTR pName, DWORD JobId)
{
WCHAR wcs[256], wcs2[256];
__WLS_HANDLE wlsHnd;
// Here do some sanitary check for network first...
if (!(wlsHnd =__WlsOpenHandle()) // Allocate memory for handle
return NULL;
RegReadPort(pName, wcs); // Read settings from registry
WORD wTmo =RegGetPortData(wcs); // Get prn node name and timeout
__WlsGetLocalUserName(wsz2); // Get PC node name
__WlsSetNodeNames(wlsHnd, wsz2, wcs);
wlsHnd->wTmo = wTmo;
// Here set other data members before connection...
if (!__WlsSetConnection(wlsHnd))
{
// Here do cleanup...
return NULL;
}
return (HANDLE)wlsHnd;
}
BOOL WlsWritePrinter(HANDLE hPrinter,
LPBYTE pBuffer, DWORD cbBuf, LPDWORD pcbWrtn)
{
__WLS_HANDLE wlsHnd = (__WLS_HANDLE)hPrinter;
DWORD dwCurLen = cbBuf;
DWORD dwFrmLen;
*pcbWrtn =0;
// Here validate network and wlsHnd first...
while (dwCurLen>0)
{
dwFrmLen = dwCurLen< __WlsFrmSize ? dwCurLen: __WlsFrmSize;
if (!__WlsTransferFrame(wlsHnd, pBuffer, dwFrmLen))
{
// Here do cleanup...
return FALSE;
}
dwCurLen -= dwFrmLen;
pBuffer += dwFrmLen;
*pcbWrtn += dwFrmLen;
}
return TRUE;
}
BOOL WlsDisconnectPrinter(HANDLE hPrinter)
{
__WLS_HANDLE wlsHnd = (__WLS_HANDLE)hPrinter;
// Here validate wlsHnd and do some other cleanup...
if (!__WlsTerminateConnection(wlsHnd)) return FALSE;
__WlsCloseHandle(wlsHnd);
return TRUE;
}
void WlsGetPrinterData(HWND hwnd)
{
WCHAR wsz[256];
int i;
__WlsGetNetworkName(wsz);
SetDlgItemText(hwnd, IDD_CW_EDTNETWORK, wsz);
__WlsGetLocalUserName(wsz);
SetDlgItemText(hwnd, IDD_CW_LOCALUNIT, wsz);
SendDlgItemMessage(hwnd, IDD_CW_LISTPRNS, LB_RESETCONTENT, 0,0);
if (!__WlsGetFirstPrinter(wsz)) return;
do
{
SendDlgItemMessage(hwnd, IDD_CW_LISTPRNS,
LB_ADDSTRING, 0, (LPARAM)wsz);
}
while (__WlsGetNextPrinter(wsz));
}
//End of file