Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

679 lines
22 KiB

//=============================================================================
// (c) Copyright Wang Laboratories, Inc. 1995 All rights reserved.
//-----------------------------------------------------------------------------
// Project: Norway - Image Editor
//
// Component: CClassFactory, CShellExtension
//
// File Name: shlcode.cpp
//
// Class: CClassFactory, CShellExtension
//
// Functions:
//-----------------------------------------------------------------------------
// Maintenance Log:
/*
$Header: S:\products\wangview\norway\wangshl\shlcode.cpv 1.15 10 Apr 1996 14:50:36 MMB $
$Log: S:\products\wangview\norway\wangshl\shlcode.cpv $
Rev 1.15 10 Apr 1996 14:50:36 MMB
fixed focus problems with pneumonics
Rev 1.14 05 Feb 1996 13:39:10 GMP
nt changes.
Rev 1.13 17 Jan 1996 15:32:54 MMB
added What's this help
Rev 1.12 21 Dec 1995 11:40:34 MMB
added help stuff
Rev 1.11 10 Nov 1995 10:20:02 MMB
remove set and get calls to the resource
Rev 1.10 12 Oct 1995 18:34:12 ADMIN
removed include of afxfllx.h per Guy's instructions
(MikeR)
Rev 1.9 25 Sep 1995 19:32:38 MMB
fixing the AWD preview scale
Rev 1.8 20 Sep 1995 17:19:00 MMB
fix for unrecog pages in a multi page TIF file
Rev 1.7 11 Sep 1995 19:42:12 MMB
moved hard coded string into resource file
Rev 1.6 16 Aug 1995 17:45:48 MMB
made error code fixes - try setting & getting resource handle to fix
debug mode crashes
Rev 1.5 11 Aug 1995 16:05:18 MMB
fixed bug for vert & horz settings
Rev 1.4 11 Aug 1995 09:10:24 MMB
added page information
Rev 1.3 02 Aug 1995 13:45:26 MMB
removed resolution made it Image Type instead!
Rev 1.2 31 Jul 1995 14:00:52 MMB
fixed bug for setting initial page to 1
Rev 1.1 31 Jul 1995 12:16:14 MMB
remove Begin & End WaitCursor calls ...
Rev 1.0 31 Jul 1995 12:08:54 MMB
Initial entry
*/
//=============================================================================
// ----------------------------> Includes <-------------------------------
#include "stdafx.h"
//#include <afxdllx.h>
#include <initguid.h>
#include <shlobj.h>
#include "shlcode.h"
#include "afxpriv.h"
#include "resource.h"
#include "shlhlp.h"
extern "C"
{
#include "oidisp.h"
#include "oiadm.h"
}
// ----------------------------> Globals <-------------------------------
LONG g_cRefThisDll = 0;
HINSTANCE g_hInstance;
BOOL CALLBACK WangImageDlgProc (HWND, UINT, WPARAM, LPARAM);
static const DWORD ImageShellHelpIDs [] =
{
IDC_IMAGEDESC, HIDC_IMAGEDESC,
IDC_HEIGHT_LABEL, HIDC_HEIGHT_LABEL,
IDC_HEIGHT, HIDC_HEIGHT,
IDC_WIDTH_LABEL, HIDC_WIDTH_LABEL,
IDC_WIDTH, HIDC_WIDTH,
IDC_COMPRESSION_LABEL, HIDC_COMPRESSION_LABEL,
IDC_COMPRESSION, HIDC_COMPRESSION,
IDC_IMAGETYPE_LABEL, HIDC_IMAGETYPE_LABEL,
IDC_IMAGETYPE, HIDC_IMAGETYPE,
IDC_PAGEDESC, HIDC_PAGEDESC,
IDC_PAGE_INFO, HIDC_PAGE_INFO,
IDC_PREVIOUS, HIDC_PREVIOUS,
IDC_NEXT, HIDC_NEXT,
IDC_PREVIEW, HIDC_PREVIEW,
IDC_THUMB, HIDC_THUMB,
0,0
};
//=============================================================================
// Function: DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID *ppv)
//-----------------------------------------------------------------------------
STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
*ppv = NULL;
if (!IsEqualCLSID (rclsid, CLSID_ShellExtension))
return ResultFromScode (CLASS_E_CLASSNOTAVAILABLE);
CClassFactory *pClassFactory = new CClassFactory ();
if (pClassFactory == NULL) return ResultFromScode (E_OUTOFMEMORY);
HRESULT hr = pClassFactory->QueryInterface (riid, ppv);
pClassFactory->Release ();
return hr;
}
//=============================================================================
// Function: DllCanUnloadNow (void)
//-----------------------------------------------------------------------------
STDAPI DllCanUnloadNow (void)
{
return (ResultFromScode (g_cRefThisDll == 0 ? S_OK : S_FALSE));
}
//=============================================================================
// Function: CClassFactory ()
//-----------------------------------------------------------------------------
CClassFactory::CClassFactory ()
{
m_cRef = 1;
g_cRefThisDll++;
//InterlockedIncrement(&g_cRefThisDll);
}
//=============================================================================
// Function: ~CClassFactory ()
//-----------------------------------------------------------------------------
CClassFactory::~CClassFactory ()
{
g_cRefThisDll--;
//InterlockedDecrement(&g_cRefThisDll);
}
//=============================================================================
// Function: QueryInterface (...)
//-----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::QueryInterface (REFIID riid, LPVOID* ppv)
{
if (IsEqualIID (riid, IID_IUnknown))
{
*ppv = (LPUNKNOWN) (LPCLASSFACTORY) this;
m_cRef++;
return NOERROR;
}
else if (IsEqualIID (riid, IID_IClassFactory))
{
*ppv = (LPCLASSFACTORY) this;
m_cRef++;
return NOERROR;
}
else
{
*ppv = NULL;
return ResultFromScode (E_NOINTERFACE);
}
}
//=============================================================================
// Function: AddRef ()
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::AddRef ()
{
return (++m_cRef);
}
//=============================================================================
// Function: Release ()
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CClassFactory::Release ()
{
if (--m_cRef == 0)
delete this;
return m_cRef;
}
//=============================================================================
// Function: CreateInstance (...)
//-----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid,
LPVOID FAR *ppvObj)
{
*ppvObj = NULL;
if (pUnkOuter != NULL)
return ResultFromScode (CLASS_E_NOAGGREGATION);
CShellExtension *pShellExtension = new CShellExtension ();
if (pShellExtension == NULL)
return (ResultFromScode (E_OUTOFMEMORY));
HRESULT hr = pShellExtension->QueryInterface (riid, ppvObj);
pShellExtension->Release ();
return hr;
}
//=============================================================================
// Function: LockServer (...)
//-----------------------------------------------------------------------------
STDMETHODIMP CClassFactory::LockServer (BOOL fLock)
{
return ResultFromScode (E_NOTIMPL);
}
//=============================================================================
// Function: CShellExtension ()
//-----------------------------------------------------------------------------
CShellExtension::CShellExtension ()
{
m_cRef = 1;
m_szFileName[0] = NULL;
g_cRefThisDll++;
//InterlockedIncrement(&g_cRefThisDll);
}
//=============================================================================
// Function: ~CShellExtension ()
//-----------------------------------------------------------------------------
CShellExtension::~CShellExtension ()
{
g_cRefThisDll--;
//InterlockedDecrement(&g_cRefThisDll);
}
//=============================================================================
// Function: QueryInterface (REFIID riid, LPVOID FAR *ppv)
//-----------------------------------------------------------------------------
STDMETHODIMP CShellExtension::QueryInterface (REFIID riid, LPVOID FAR *ppv)
{
if (IsEqualIID (riid, IID_IUnknown))
{
*ppv = (LPUNKNOWN) (LPSHELLPROPSHEETEXT) this;
m_cRef++;
return NOERROR;
}
else if (IsEqualIID (riid, IID_IShellPropSheetExt))
{
*ppv = (LPSHELLPROPSHEETEXT) this;
m_cRef++;
return NOERROR;
}
else if (IsEqualIID (riid, IID_IShellExtInit))
{
*ppv = (LPSHELLEXTINIT) this;
m_cRef++;
return NOERROR;
}
else
{
*ppv = NULL;
return ResultFromScode (E_NOINTERFACE);
}
}
//=============================================================================
// Function: AddRef ()
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CShellExtension::AddRef()
{
return (++m_cRef);
}
//=============================================================================
// Function: Release ()
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CShellExtension::Release ()
{
if (--m_cRef == 0)
delete this;
return m_cRef;
}
//=============================================================================
// Function: AddPages (LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
//-----------------------------------------------------------------------------
#include "resource.h"
STDMETHODIMP CShellExtension::AddPages (LPFNADDPROPSHEETPAGE lpfnAddPage,
LPARAM lParam)
{
PROPSHEETPAGE psp;
memset ((void*)&psp, 0, sizeof (psp));
HPROPSHEETPAGE hPage;
psp.dwSize = sizeof (psp);
psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = "ImageProperties";
CString szTmp;
szTmp.LoadString (IDS_PSHEET_TITLE);
psp.pszTitle = szTmp;
psp.pfnDlgProc = (DLGPROC) WangImageDlgProc;
void* ptr = malloc (strlen (m_szFileName) + 1);
memcpy (ptr, m_szFileName, strlen (m_szFileName) + 1);
psp.lParam = (LPARAM) ptr;
psp.pcRefParent = (UINT*)&g_cRefThisDll;
hPage = ::CreatePropertySheetPage (&psp);
if (hPage != NULL)
if (!lpfnAddPage (hPage, lParam))
DestroyPropertySheetPage (hPage);
return NOERROR;
}
//=============================================================================
// Function: ReplacePage (...)
//-----------------------------------------------------------------------------
STDMETHODIMP CShellExtension::ReplacePage (UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam)
{
return (ResultFromScode (E_FAIL));
}
//=============================================================================
// Function: Initialize (...)
//-----------------------------------------------------------------------------
STDMETHODIMP CShellExtension::Initialize (LPCITEMIDLIST pidlFolder,
LPDATAOBJECT lpdobj, HKEY hKeyProgID)
{
STGMEDIUM medium;
FORMATETC fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
if (lpdobj == NULL) return ResultFromScode (E_FAIL);
HRESULT hr = lpdobj->GetData(&fe, &medium);
if (FAILED (hr))
return ResultFromScode (E_FAIL);
if (DragQueryFile ((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0) == 1)
{
DragQueryFile ((HDROP)medium.hGlobal, 0, m_szFileName, sizeof (m_szFileName));
hr = NOERROR;
/*
FIO_INFORMATION FileInfo;
FIO_INFO_CGBW ColorInfo;
ColorInfo.lppalette_table = NULL;
FileInfo.page_number = 1;
FileInfo.filename = m_szFileName;
if (IMGFileGetInfo (NULL, NULL, &FileInfo, &ColorInfo, NULL) != 0)
hr = E_FAIL;
else if (FileInfo.page_count > 1)
hr = NOERROR;
else if (FileInfo.compression_type == FIO_GLZW || FileInfo.compression_type == FIO_LZW)
hr = E_FAIL;
*/
}
else
hr = ResultFromScode (E_FAIL);
ReleaseStgMedium (&medium);
return hr;
}
//=============================================================================
// Function: GetPageInformation (...)
//-----------------------------------------------------------------------------
long GetPageInformation (HWND hWnd, ShlFileInfo* pInfo, LP_FIO_INFORMATION lpFileInfo, LP_FIO_INFO_CGBW lpColorInfo,
long CurrPage)
{
lpColorInfo->lppalette_table = NULL;
lpFileInfo->page_number = CurrPage;
lpFileInfo->filename = pInfo->lpszImage;
return (IMGFileGetInfo (NULL, hWnd, lpFileInfo, lpColorInfo, NULL));
}
//=============================================================================
// Function: UpdatePageInformation (...)
//-----------------------------------------------------------------------------
BOOL UpdatePageInformation (HWND hWnd, LP_FIO_INFORMATION lpFileInfo, LP_FIO_INFO_CGBW lpColorInfo, BOOL nStatus)
{
// HINSTANCE hOldInstance = AfxGetResourceHandle ();
// AfxSetResourceHandle (g_hInstance);
CString szPageInfo;
char szThisPage[5], szTotalPages[5];
if (nStatus != 0)
{
// oops - error in getting the file information
szPageInfo.LoadString (IDS_UNKNOWN);
SetDlgItemText (hWnd, IDC_HEIGHT, szPageInfo);
SetDlgItemText (hWnd, IDC_WIDTH, szPageInfo);
SetDlgItemText (hWnd, IDC_IMAGETYPE, szPageInfo);
SetDlgItemText (hWnd, IDC_PAGE_INFO, szPageInfo);
SetDlgItemText (hWnd, IDC_COMPRESSION, szPageInfo);
// AfxSetResourceHandle (hOldInstance);
return (TRUE);
}
// hey - no error!!
_itoa ((int)lpFileInfo->page_number, szThisPage, 10);
_itoa ((int)lpFileInfo->page_count, szTotalPages, 10);
AfxFormatString2 (szPageInfo, IDS_PAGE_INFO, szThisPage, szTotalPages);
SetDlgItemText (hWnd, IDC_PAGE_INFO, szPageInfo);
SetDlgItemInt (hWnd, IDC_HEIGHT, (UINT)lpFileInfo->vertical_pixels, FALSE);
SetDlgItemInt (hWnd, IDC_WIDTH, (UINT)lpFileInfo->horizontal_pixels, FALSE);
// to do : get resolution information & display it!
UINT nID = IDS_UNKNOWN;
switch (lpColorInfo->image_type)
{
case ITYPE_BI_LEVEL :
nID = IDS_BLACK_AND_WHITE;
break;
case ITYPE_GRAY4 :
nID = IDS_GRAY4;
break;
case ITYPE_GRAY8 :
nID = IDS_GRAY8;
break;
case ITYPE_RGB24 :
nID = IDS_RGB24;
break;
case ITYPE_BGR24 :
nID = IDS_BGR24;
break;
case ITYPE_PAL8 :
nID = IDS_PAL8;
break;
case ITYPE_PAL4 :
nID = IDS_PAL4;
break;
}
CString szTmp;
szTmp.LoadString (nID);
SetDlgItemText (hWnd, IDC_IMAGETYPE, szTmp);
switch (lpFileInfo->compression_type & FIO_TYPES_MASK)
{
case FIO_0D :
nID = IDS_UNCOMPRESSED;
break;
case FIO_1D :
nID = IDS_1D;
break;
case FIO_2D :
nID = IDS_2D;
break;
case FIO_PACKED :
nID = IDS_PACKED;
break;
case FIO_GLZW :
nID = IDS_GLZW;
break;
case FIO_LZW :
nID = IDS_LZW;
break;
case FIO_TJPEG :
nID = IDS_TJPEG;
break;
}
szTmp = (LPCTSTR)NULL;
szTmp.LoadString (nID);
SetDlgItemText (hWnd, IDC_COMPRESSION, szTmp);
// AfxSetResourceHandle (hOldInstance);
return (TRUE);
}
//=============================================================================
// Function: WangImageDlgProc (HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
//-----------------------------------------------------------------------------
BOOL CALLBACK WangImageDlgProc (HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
LPSTR lpszImage;
ShlFileInfo* pInfo;
HWND hImgWnd;
FIO_INFORMATION FileInfo;
FIO_INFO_CGBW ColorInfo;
int nScale = SD_FIT_WINDOW;
static int nStatus = 0;
DWORD dwFlags = NULL;
switch (uMessage)
{
case WM_INITDIALOG :
{
lpszImage = (LPSTR) (((LPPROPSHEETPAGE)lParam)->lParam);
hImgWnd = GetDlgItem (hwnd, IDC_THUMB);
if (IMGRegWndw (hImgWnd) != 0)
return (FALSE);
pInfo = (ShlFileInfo*) new ShlFileInfo;
pInfo->lpszImage = (LPSTR) new char[(strlen (lpszImage) + 1)];
strcpy (pInfo->lpszImage, lpszImage);
free (lpszImage);
SetWindowLong (hwnd, DWL_USER, (long)pInfo);
pInfo->lCurrPage = 1;
nStatus = GetPageInformation (hImgWnd, pInfo, &FileInfo, &ColorInfo, pInfo->lCurrPage);
UpdatePageInformation (hwnd, &FileInfo, &ColorInfo, nStatus);
pInfo->lPages = FileInfo.page_count;
IMGSetParmsCgbw (hImgWnd, PARM_SCALE, (void*)&nScale, PARM_WINDOW_DEFAULT);
PARM_SCALE_ALGORITHM_STRUCT Alg;
Alg.uImageFlags = ITYPE_BI_LEVEL;
Alg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY8;
nScale = OI_SCALE_ALG_AVERAGE_TO_GRAY8;
IMGSetParmsCgbw (hImgWnd, PARM_SCALE_ALGORITHM, (void*)&Alg, PARM_WINDOW_DEFAULT);
if (pInfo->lPages > 1)
EnableWindow (GetDlgItem (hwnd, IDC_NEXT), TRUE);
else
EnableWindow (GetDlgItem (hwnd, IDC_NEXT), FALSE);
EnableWindow (GetDlgItem (hwnd, IDC_PREVIOUS), FALSE);
}
return TRUE;
case WM_NOTIFY :
SetWindowLong (hwnd, DWL_MSGRESULT, FALSE);
return TRUE;
case WM_PAINT :
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
EndPaint (hwnd, &ps);
if ((IsDlgButtonChecked (hwnd, IDC_PREVIEW) == 1) && (nStatus == 0))
IMGRepaintDisplay (GetDlgItem (hwnd, IDC_THUMB), (LPRECT)-1);
return TRUE;
}
case WM_DESTROY :
IMGDeRegWndw (GetDlgItem (hwnd, IDC_THUMB));
pInfo = (ShlFileInfo*) GetWindowLong (hwnd, DWL_USER);
free (pInfo->lpszImage);
free (pInfo);
return TRUE;
case WM_HELP :
{
LPHELPINFO lpHelpInfo;
lpHelpInfo = (LPHELPINFO)lParam;
// All tabs have same ID so can't give tab specific help
if (lpHelpInfo->iCtrlId == AFX_IDC_TAB_CONTROL)
return 0L;
if (lpHelpInfo->iContextType == HELPINFO_WINDOW) // must be for a control
{
::WinHelp ((HWND)lpHelpInfo->hItemHandle, "WANGSHL.HLP", HELP_WM_HELP,
(DWORD)(LPVOID)ImageShellHelpIDs);
}
return 1L;
}
case WM_COMMANDHELP :
return TRUE;
case WM_CONTEXTMENU :
if (::GetDlgCtrlID ((HWND)wParam) == AFX_IDC_TAB_CONTROL)
return 0L;
return ::WinHelp ((HWND)wParam, "WANGSHL.HLP", HELP_CONTEXTMENU,
(DWORD)(LPVOID)ImageShellHelpIDs);
case WM_COMMAND :
{
switch (wParam)
{
case IDC_PREVIEW :
hImgWnd = GetDlgItem (hwnd, IDC_THUMB);
SetFocus (GetDlgItem (hwnd, IDC_PREVIEW));
if ((IsDlgButtonChecked (hwnd, IDC_PREVIEW) == 1) && nStatus == 0)
{
pInfo = (ShlFileInfo*) GetWindowLong (hwnd, DWL_USER);
IMGDisplayFile (hImgWnd, pInfo->lpszImage, pInfo->lCurrPage, OI_DONT_REPAINT);
IMGSetParmsCgbw (hImgWnd, PARM_SCALE, (void*)&nScale, PARM_IMAGE | PARM_WINDOW_DEFAULT);
IMGSetParmsCgbw (hImgWnd, PARM_DWFLAGS, &dwFlags, PARM_REPAINT);
}
else
InvalidateRect (hImgWnd, NULL, TRUE);
break;
case IDC_NEXT :
SetFocus (GetDlgItem (hwnd, IDC_NEXT));
pInfo = (ShlFileInfo*) GetWindowLong (hwnd, DWL_USER);
if (pInfo->lCurrPage + 1 <= pInfo->lPages)
{
pInfo->lCurrPage += 1;
nStatus = GetPageInformation (GetDlgItem (hwnd, IDC_THUMB), pInfo, &FileInfo, &ColorInfo, pInfo->lCurrPage);
UpdatePageInformation (hwnd, &FileInfo, &ColorInfo, nStatus);
hImgWnd = GetDlgItem (hwnd, IDC_THUMB);
if (nStatus != 0)
{
InvalidateRect (hImgWnd, NULL, TRUE);
}
else if (IsDlgButtonChecked (hwnd, IDC_PREVIEW) == 1)
{
IMGDisplayFile (hImgWnd, pInfo->lpszImage, pInfo->lCurrPage, OI_DONT_REPAINT);
IMGSetParmsCgbw (hImgWnd, PARM_SCALE, (void*)&nScale, PARM_IMAGE | PARM_WINDOW_DEFAULT);
IMGSetParmsCgbw (hImgWnd, PARM_DWFLAGS, &dwFlags, PARM_REPAINT);
}
EnableWindow (GetDlgItem (hwnd, IDC_PREVIOUS), TRUE);
}
if (pInfo->lCurrPage == pInfo->lPages)
{
SetFocus (GetDlgItem (hwnd, IDC_PREVIOUS));
EnableWindow (GetDlgItem (hwnd, IDC_NEXT), FALSE);
}
break;
case IDC_PREVIOUS :
SetFocus (GetDlgItem (hwnd, IDC_PREVIOUS));
pInfo = (ShlFileInfo*) GetWindowLong (hwnd, DWL_USER);
if (pInfo->lCurrPage - 1 > 0 && pInfo->lPages > 1)
{
pInfo->lCurrPage -= 1;
hImgWnd = GetDlgItem (hwnd, IDC_THUMB);
nStatus = GetPageInformation (hImgWnd, pInfo, &FileInfo, &ColorInfo, pInfo->lCurrPage);
UpdatePageInformation (hwnd, &FileInfo, &ColorInfo, nStatus);
if (nStatus != 0)
{
InvalidateRect (hwnd, NULL, TRUE);
}
else if (IsDlgButtonChecked (hwnd, IDC_PREVIEW) == 1)
{
IMGDisplayFile (hImgWnd, pInfo->lpszImage, pInfo->lCurrPage, OI_DONT_REPAINT);
IMGSetParmsCgbw (hImgWnd, PARM_SCALE, (void*)&nScale, PARM_IMAGE | PARM_WINDOW_DEFAULT);
IMGSetParmsCgbw (hImgWnd, PARM_DWFLAGS, &dwFlags, PARM_REPAINT);
}
EnableWindow (GetDlgItem (hwnd, IDC_NEXT), TRUE);
}
if (pInfo->lCurrPage == 1)
{
SetFocus (GetDlgItem (hwnd, IDC_NEXT));
EnableWindow (GetDlgItem (hwnd, IDC_PREVIOUS), FALSE);
}
break;
}
}
return TRUE;
}
return (FALSE);
}