mirror of https://github.com/lianthony/NT4.0
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.
494 lines
12 KiB
494 lines
12 KiB
/***************************************************************************
|
|
*
|
|
* File Name: shellext.cpp
|
|
*
|
|
* Copyright (C) 1993-1996 Hewlett-Packard Company.
|
|
* All rights reserved.
|
|
*
|
|
* 11311 Chinden Blvd.
|
|
* Boise, Idaho 83714
|
|
*
|
|
* This is a part of the HP JetAdmin Printer Utility
|
|
*
|
|
* This source code is only intended as a supplement for support and
|
|
* localization of HP JetAdmin by 3rd party Operating System vendors.
|
|
* Modification of source code cannot be made without the express written
|
|
* consent of Hewlett-Packard.
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
* Author: Name
|
|
*
|
|
*
|
|
* Modification history:
|
|
*
|
|
* date initials change description
|
|
*
|
|
* mm-dd-yy MJB
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include <pch_cpp.h>
|
|
#include "priv.h"
|
|
|
|
// Initialize GUID (do once and only once)
|
|
//
|
|
#pragma data_seg(".text")
|
|
#define INITGUID
|
|
#include <objbase.h>
|
|
#include <initguid.h>
|
|
#include "shellext.h"
|
|
#pragma data_seg()
|
|
|
|
#include <trace.h>
|
|
#include "hpshell.h"
|
|
#include "resource.h"
|
|
#include "..\help\jetadmin.hh"
|
|
#include <nolocal.h>
|
|
#include <hpalerts.h>
|
|
#include <macros.h>
|
|
|
|
//
|
|
// Global variables
|
|
//
|
|
UINT g_cRefThisDll = 0; // Reference count of this DLL.
|
|
HINSTANCE g_hmodThisDll = NULL; // Handle to this DLL itself.
|
|
|
|
|
|
// Ones specific to HP extensions
|
|
//
|
|
HICON hTrayModelIcon = NULL;
|
|
HICON hStatusIcon = NULL;
|
|
|
|
HPERIPHERAL hCurrent = NULL;
|
|
TCHAR szPrinterName[MAX_PATH] = TEXT("");
|
|
|
|
int keywordIDListSummary[] = {IDC_MODEL, IDH_RC_model,
|
|
IDC_MODELBOX, IDH_RC_model,
|
|
IDC_HELP, IDH_RC_help,
|
|
IDC_MODELSTR, IDH_RC_model,
|
|
IDOK, IDH_RC_close,
|
|
IDC_STATUS_BOX, IDH_RC_sum_status,
|
|
IDC_STATUSMSG, IDH_RC_sum_printer_status,
|
|
IDC_STOPLIGHT, IDH_RC_sum_stoplight,
|
|
IDC_FPTITLE, IDH_RC_sum_message,
|
|
IDC_FRONTPANEL, IDH_RC_sum_message,
|
|
0, 0};
|
|
HPAL hPal = NULL;
|
|
|
|
#ifdef WINNT // Garth 10-30-96. For WIN NT 4.0
|
|
HINSTANCE hMSAFDdll = NULL; // load the MSAFD dll at process attach.
|
|
#endif // (Multi-processor defect)
|
|
|
|
extern "C" int APIENTRY
|
|
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
|
{
|
|
COLAINFO colaInfo;
|
|
|
|
if (dwReason == DLL_PROCESS_ATTACH)
|
|
{
|
|
TRACE0(TEXT("In DLLMain, DLL_PROCESS_ATTACH\r\n"));
|
|
|
|
// Extension DLL one-time initialization
|
|
|
|
g_hmodThisDll = hInstance;
|
|
|
|
// Start HP Initialization
|
|
//
|
|
colaInfo.dwSize = sizeof(COLAINFO);
|
|
// Register app with PAL
|
|
hPal = PALRegisterAppEx(hInstance, NULL, &colaInfo);
|
|
#ifdef MBCS
|
|
if ( colaInfo.dwFlags & COLA_UNICODE_SUPPORT )
|
|
{
|
|
TRACE0(TEXT("HPSHELL: The file HPCOLA.DLL is intended for Windows/NT and will not run on Windows 95.\n\r"));
|
|
SetLastError(ERROR_DLL_INIT_FAILED);
|
|
return(FALSE);
|
|
}
|
|
#endif
|
|
#ifdef UNICODE
|
|
if ( colaInfo.dwFlags & COLA_MBCS_SUPPORT )
|
|
{
|
|
TRACE0(TEXT("HPSHELL: The file HPCOLA.DLL is intended for Windows 95 and will not run on Windows/NT.\n\r"));
|
|
SetLastError(ERROR_DLL_INIT_FAILED);
|
|
return(FALSE);
|
|
}
|
|
#endif
|
|
if (hPal == NULL)
|
|
{
|
|
SetLastError(ERROR_DLL_INIT_FAILED);
|
|
TRACE0(TEXT("\tHPSHELL::Failed to register with COLA\n\r"));
|
|
return(FALSE);
|
|
}
|
|
#ifdef WINNT // For WIN NT 4.0 load the MSAFD.dll
|
|
hMSAFDdll = LoadLibrary(MSAFDDLL); // Do not unload it in process detach.
|
|
#endif // (Multi-processor defect)
|
|
|
|
}
|
|
else if (dwReason == DLL_PROCESS_DETACH)
|
|
{
|
|
TRACE0(TEXT("HPSHELL: In DLLMain, DLL_PROCESS_DETACH\r\n"));
|
|
|
|
}
|
|
|
|
return 1; // ok
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// DllCanUnloadNow
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
TRACE1(TEXT("HPSHELL: DLLCanUnloadNow returning %s\r\n"),
|
|
(g_cRefThisDll IS 0) ? TEXT("TRUE") : TEXT("FALSE"));
|
|
if (g_cRefThisDll IS 0)
|
|
{
|
|
if ( hPal )
|
|
{
|
|
PALUnregisterAppEx(hPal, UNREG_DEFAULTS);
|
|
hPal = NULL;
|
|
}
|
|
}
|
|
return (g_cRefThisDll == 0 ? S_OK : S_FALSE);
|
|
}
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
|
|
{
|
|
TRACE0(TEXT("In DllGetClassObject\r\n"));
|
|
|
|
*ppvOut = NULL;
|
|
|
|
if (IsEqualIID(rclsid, CLSID_HPShell))
|
|
{
|
|
CShellExtClassFactory *pcf = new CShellExtClassFactory;
|
|
|
|
return pcf->QueryInterface(riid, ppvOut);
|
|
}
|
|
|
|
return CLASS_E_CLASSNOTAVAILABLE;
|
|
}
|
|
|
|
CShellExtClassFactory::CShellExtClassFactory()
|
|
{
|
|
TRACE0(TEXT("CShellExtClassFactory::CShellExtClassFactory()\r\n"));
|
|
|
|
m_cRef = 0L;
|
|
|
|
g_cRefThisDll++;
|
|
}
|
|
|
|
CShellExtClassFactory::~CShellExtClassFactory()
|
|
{
|
|
g_cRefThisDll--;
|
|
}
|
|
|
|
STDMETHODIMP CShellExtClassFactory::QueryInterface(REFIID riid,
|
|
LPVOID FAR *ppv)
|
|
{
|
|
TRACE0(TEXT("CShellExtClassFactory::QueryInterface()\r\n"));
|
|
|
|
*ppv = NULL;
|
|
|
|
// Any interface on this object is the object pointer
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
|
|
{
|
|
*ppv = (LPCLASSFACTORY)this;
|
|
|
|
AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CShellExtClassFactory::AddRef()
|
|
{
|
|
return ++m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CShellExtClassFactory::Release()
|
|
{
|
|
if (--m_cRef)
|
|
return m_cRef;
|
|
|
|
delete this;
|
|
|
|
return 0L;
|
|
}
|
|
|
|
STDMETHODIMP CShellExtClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
|
|
REFIID riid,
|
|
LPVOID *ppvObj)
|
|
{
|
|
TRACE0(TEXT("CShellExtClassFactory::CreateInstance()\r\n"));
|
|
|
|
*ppvObj = NULL;
|
|
|
|
// Shell extensions typically don't support aggregation (inheritance)
|
|
|
|
if (pUnkOuter)
|
|
return CLASS_E_NOAGGREGATION;
|
|
|
|
// Create the main shell extension object. The shell will then call
|
|
// QueryInterface with IID_IShellExtInit--this is how shell extensions are
|
|
// initialized.
|
|
|
|
LPCSHELLEXT pShellExt = new CShellExt(); //Create the CShellExt object
|
|
|
|
if (NULL == pShellExt)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return pShellExt->QueryInterface(riid, ppvObj);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CShellExtClassFactory::LockServer(BOOL fLock)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
// *********************** CShellExt *************************
|
|
CShellExt::CShellExt()
|
|
{
|
|
TRACE0(TEXT("CShellExt::CShellExt()\r\n"));
|
|
|
|
m_cRef = 0L;
|
|
m_pDataObj = NULL;
|
|
_hPeripheral = NULL;
|
|
_szFile[0] = '\0';
|
|
|
|
g_cRefThisDll++;
|
|
}
|
|
|
|
CShellExt::~CShellExt()
|
|
{
|
|
if (m_pDataObj)
|
|
m_pDataObj->Release();
|
|
|
|
g_cRefThisDll--;
|
|
}
|
|
|
|
STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv)
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown))
|
|
{
|
|
TRACE0(TEXT("CShellExt::QueryInterface()==>IID_IShellExtInit\r\n"));
|
|
|
|
*ppv = (LPSHELLEXTINIT)this;
|
|
}
|
|
else if (IsEqualIID(riid, IID_IContextMenu))
|
|
{
|
|
TRACE0(TEXT("CShellExt::QueryInterface()==>IID_IContextMenu\r\n"));
|
|
|
|
*ppv = (LPCONTEXTMENU)this;
|
|
}
|
|
else if (IsEqualIID(riid, IID_IShellPropSheetExt))
|
|
{
|
|
TRACE0(TEXT("CShellExt::QueryInterface()==>IShellPropSheetExt\r\n"));
|
|
|
|
*ppv = (LPSHELLPROPSHEETEXT)this;
|
|
}
|
|
|
|
if (*ppv)
|
|
{
|
|
AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
TRACE0(TEXT("CShellExt::QueryInterface()==>Unknown Interface!\r\n"));
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CShellExt::AddRef()
|
|
{
|
|
TRACE0(TEXT("CShellExt::AddRef()\r\n"));
|
|
|
|
return ++m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CShellExt::Release()
|
|
{
|
|
TRACE0(TEXT("CShellExt::Release()\r\n"));
|
|
|
|
if (--m_cRef)
|
|
return m_cRef;
|
|
|
|
delete this;
|
|
|
|
return 0L;
|
|
}
|
|
|
|
|
|
|
|
// HP Specific
|
|
//
|
|
|
|
// Summary stuff
|
|
DLL_EXPORT(BOOL) APIENTRY SummaryProc(HWND hDlg, UINT msg, UINT wParam, LONG lParam)
|
|
|
|
{
|
|
BOOL bProcessed = FALSE;
|
|
LPCURRENTPRTRINFO lpTemp;
|
|
|
|
//TRACE0(TEXT("SummaryProc entered.\n\r"));
|
|
|
|
switch (msg)
|
|
{
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
|
|
case IDC_HELP:
|
|
WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, IDH_sum);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
lpTemp = (LPCURRENTPRTRINFO)lParam;
|
|
hCurrent = lpTemp->hCurrent;
|
|
_tcscpy(szPrinterName, lpTemp->szPrinterName);
|
|
OnInitSummaryDialog(hDlg);
|
|
bProcessed = TRUE;
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
OnTimer(hDlg);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
if ( hTrayModelIcon )
|
|
DestroyIcon(hTrayModelIcon);
|
|
if ( hStatusIcon )
|
|
DestroyIcon(hStatusIcon);
|
|
KillTimer(hDlg, 1);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
return(OnF1HelpSummary(wParam, lParam));
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
return(OnContextHelpSummary(wParam, lParam));
|
|
break;
|
|
}
|
|
return (bProcessed);
|
|
}
|
|
|
|
BOOL OnInitSummaryDialog(HWND hDlg)
|
|
|
|
{
|
|
PeripheralDetails periphDetails;
|
|
//DWORD type,
|
|
// size,
|
|
DWORD dWord;
|
|
DWORD dwResult;
|
|
DWORD cBufSize = 128;
|
|
DWORD dwLevel = 0;
|
|
BOOL bFrontPanel = TRUE;
|
|
//char update[16];
|
|
PeripheralIcon periphIcon;
|
|
//HKEY hKey;
|
|
int timerInt;
|
|
|
|
dwResult = RC_FAILURE;
|
|
TRACE0(TEXT("OnInitSummaryDialog entered.\n\r"));
|
|
|
|
|
|
// set the printer name in the dialog box title area
|
|
SetWindowText(hDlg, szPrinterName);
|
|
SetFocus(hDlg);
|
|
|
|
// install the model name
|
|
dWord = sizeof(PeripheralDetails);
|
|
dwResult = PALGetObject(hCurrent, OT_PERIPHERAL_DETAILS, 0, &periphDetails, &dWord);
|
|
SetDlgItemText(hDlg, IDC_MODELSTR, periphDetails.deviceName);
|
|
|
|
// install the correct model icon
|
|
dWord = sizeof(PeripheralIcon);
|
|
dwResult = PALGetObject(hCurrent, OT_PERIPHERAL_ICON, 0, &periphIcon, &dWord);
|
|
if (dwResult == RC_SUCCESS)
|
|
{
|
|
hTrayModelIcon = LoadIcon(periphIcon.hResourceModule, MAKEINTRESOURCE(periphIcon.iconResourceID));
|
|
SendDlgItemMessage(hDlg, IDC_MODEL, STM_SETICON, (WPARAM)hTrayModelIcon, 0);
|
|
}
|
|
|
|
//RegOpenKey(HKEY_LOCAL_MACHINE, PRINTER_APPLETS_KEY, &hKey);
|
|
//size = sizeof(update);
|
|
//if ( RegQueryValueEx(hKey, UPDATE_INTERVAL, NULL, &type, (LPBYTE)update, &size) IS ERROR_SUCCESS )
|
|
// timerInt = ( atoi(update) * 1000 );
|
|
timerInt = 15000;
|
|
SetTimer(hDlg, 1, timerInt, NULL);
|
|
|
|
OnTimer(hDlg);
|
|
return(TRUE);
|
|
}
|
|
|
|
LRESULT OnContextHelpSummary(WPARAM wParam, LPARAM lParam)
|
|
|
|
{
|
|
WinHelp((HWND)wParam, HELP_FILE, HELP_CONTEXTMENU,
|
|
(DWORD)(LPSTR)keywordIDListSummary);
|
|
return(1);
|
|
}
|
|
|
|
LRESULT OnF1HelpSummary(WPARAM wParam, LPARAM lParam)
|
|
|
|
{
|
|
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
|
|
(DWORD)(LPSTR)keywordIDListSummary);
|
|
return(1);
|
|
}
|
|
|
|
void OnTimer(HWND hDlg)
|
|
{
|
|
PeripheralStatus periphStatus;
|
|
PeripheralPanel periphPanel;
|
|
DWORD dWord;
|
|
DWORD dwResult;
|
|
DWORD cBufSize = 128;
|
|
DWORD dwLevel = 0;
|
|
BOOL bFrontPanel = TRUE;
|
|
TCHAR cBuf[128];
|
|
|
|
DBAgeNow(hCurrent);
|
|
dWord = sizeof(PeripheralPanel);
|
|
dwResult = PALGetObject(hCurrent, OT_PERIPHERAL_PANEL, 0, &periphPanel, &dWord);
|
|
if ( (dwResult == RC_SUCCESS) AND ( _tcslen(periphPanel.frontPanel) ) )
|
|
SetDlgItemText(hDlg, IDC_FRONTPANEL, periphPanel.frontPanel);
|
|
else
|
|
bFrontPanel = FALSE;
|
|
ShowWindow(GetDlgItem(hDlg, IDC_FRONTPANEL), bFrontPanel ? SW_SHOW : SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_FPTITLE), bFrontPanel ? SW_SHOW : SW_HIDE);
|
|
|
|
// install hCurrent status message here
|
|
dWord = sizeof(PeripheralStatus);
|
|
dwResult = PALGetObject(hCurrent, OT_PERIPHERAL_STATUS, 0, &periphStatus, &dWord);
|
|
if (dwResult == RC_SUCCESS)
|
|
{
|
|
LoadString(periphStatus.hResourceModule, periphStatus.statusResID, cBuf, SIZEOF_IN_CHAR(cBuf));
|
|
SetDlgItemText(hDlg, IDC_STATUSMSG, cBuf);
|
|
}
|
|
|
|
// install correct stoplight here
|
|
// load stoplight icons into icon array
|
|
hStatusIcon = LoadIcon(periphStatus.hResourceModule, MAKEINTRESOURCE(periphStatus.severityIcon));
|
|
SendDlgItemMessage(hDlg, IDC_STOPLIGHT, STM_SETICON, (WPARAM)hStatusIcon, 0);
|
|
}
|
|
|