windows-nt/Source/XPSP1/NT/printscan/ui/wiadefui/paprsize.cpp
2020-09-26 16:20:57 +08:00

261 lines
11 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION
*
* TITLE: PAPRSIZE.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 1/8/2001
*
* DESCRIPTION: Scanner paper sizes
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "wiauiext.h"
#include "paprsize.h"
extern HINSTANCE g_hInstance;
static const struct
{
int nStringId;
LONG nWidth;
LONG nHeight;
} g_SupportedPaperSizes[] =
{
{ IDS_WIA_PAPER_SIZE_E_SIZE_SHEET, 34000, 44000 },
{ IDS_WIA_PAPER_SIZE_D_SIZE_SHEET, 22000, 34000 },
{ IDS_WIA_PAPER_SIZE_A2, 16535, 23386 },
{ IDS_WIA_PAPER_SIZE_C_SIZE_SHEET, 17000, 22000 },
{ IDS_WIA_PAPER_SIZE_SUPER_B, 12008, 19173 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_10_ROTATED, 18031, 12756 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_C3, 12756, 18031 },
{ IDS_WIA_PAPER_SIZE_A3_EXTRA, 12677, 17520 },
{ IDS_WIA_PAPER_SIZE_TABLOID_EXTRA, 12000, 18000 },
{ IDS_WIA_PAPER_SIZE_A3_ROTATED, 16535, 11693 },
{ IDS_WIA_PAPER_SIZE_A3, 11693, 16535 },
{ IDS_WIA_PAPER_SIZE_LEDGER, 17000, 11000 },
{ IDS_WIA_PAPER_SIZE_TABLOID, 11000, 17000 },
{ IDS_WIA_PAPER_SIZE_15X11, 15000, 11000 },
{ IDS_WIA_PAPER_SIZE_US_STD_FANFOLD, 14875, 11000 },
{ IDS_WIA_PAPER_SIZE_B4_JIS_ROTATED, 14331, 10118 },
{ IDS_WIA_PAPER_SIZE_B4_JIS, 10118, 14331 },
{ IDS_WIA_PAPER_SIZE_LEGAL_EXTRA, 9500, 15000 },
{ IDS_WIA_PAPER_SIZE_10X14, 10000, 14000 },
{ IDS_WIA_PAPER_SIZE_B4_ISO, 9843, 13898 },
{ IDS_WIA_PAPER_SIZE_12X11, 12005, 11005 },
{ IDS_WIA_PAPER_SIZE_SUPER_A, 8937, 14016 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_KAKU_2_ROTATED, 13071, 9449 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_ENVELOPE_KAKU_2, 9449, 13071 },
{ IDS_WIA_PAPER_SIZE_LEGAL, 8500, 14000 },
{ IDS_WIA_PAPER_SIZE_A4_EXTRA, 9270, 12690 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_9_ROTATED, 12756, 9016 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_C4, 9016, 12756 },
{ IDS_WIA_PAPER_SIZE_LETTER_EXTRA, 9500, 12000 },
{ IDS_WIA_PAPER_SIZE_FOLIO, 8500, 13000 },
{ IDS_WIA_PAPER_SIZE_10X11, 10000, 11000 },
{ IDS_WIA_PAPER_SIZE_LETTER_PLUS, 8500, 12690 },
{ IDS_WIA_PAPER_SIZE_A4_PLUS, 8268, 12992 },
{ IDS_WIA_PAPER_SIZE_GERMAN_STD_FANFOLD, 8500, 12000 },
{ IDS_WIA_PAPER_SIZE_9X11, 9000, 11000 },
{ IDS_WIA_PAPER_SIZE_A4_ROTATED, 11693, 8268 },
{ IDS_WIA_PAPER_SIZE_A4, 8268, 11693 },
{ IDS_WIA_PAPER_SIZE_LETTER_ROTATED, 11000, 8500 },
{ IDS_WIA_PAPER_SIZE_LETTER, 8500, 11000 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_KAKU_3_ROTATED, 10906, 8504 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_ENVELOPE_KAKU_3, 8504, 10906 },
{ IDS_WIA_PAPER_SIZE_QUARTO, 8465, 10827 },
{ IDS_WIA_PAPER_SIZE_B5_ISO_EXTRA, 7913, 10866 },
{ IDS_WIA_PAPER_SIZE_EXECUTIVE, 7250, 10500 },
{ IDS_WIA_PAPER_SIZE_PRC_16K_ROTATED, 10236, 7402 },
{ IDS_WIA_PAPER_SIZE_PRC_16K, 7402, 10236 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_INVITE, 8661, 8661 },
{ IDS_WIA_PAPER_SIZE_B5_JIS_ROTATED, 10118, 7165 },
{ IDS_WIA_PAPER_SIZE_B5_JIS, 7165, 10118 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_B5, 6929, 9843 },
{ IDS_WIA_PAPER_SIZE_A5_EXTRA, 6850, 9252 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_C5, 6378, 9016 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_14, 5000, 11500 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_8_ROTATED, 12165, 4724 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_8, 4724, 12165 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_7_ROTATED, 9055, 6299 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_7, 6299, 9055 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_12, 4750, 11000 },
{ IDS_WIA_PAPER_SIZE_A5_ROTATED, 8268, 5827 },
{ IDS_WIA_PAPER_SIZE_A5, 5827, 8268 },
{ IDS_WIA_PAPER_SIZE_STATEMENT, 5500, 8500 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_11, 4500, 10375 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_DOUBLE_POSTCARD, 7874, 5827 },
{ IDS_WIA_PAPER_SIZE_DOUBLE_JAPAN_POSTCARD_ROTATED, 5827, 7874 },
{ IDS_WIA_PAPER_SIZE_PRC_32KBIG_ROTATED, 7992, 5512 },
{ IDS_WIA_PAPER_SIZE_PRC_32KBIG, 5512, 7992 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_CHOU_3_ROTATED, 9252, 4724 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_ENVELOPE_CHOU_3, 4724, 9252 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_6_ROTATED, 9055, 4724 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_6, 4724, 9055 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_C65, 4488, 9016 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE, 4331, 9055 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_10, 4125, 9500 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_YOU_4_ROTATED, 9252, 4134 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_YOU_4, 4134, 9252 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_5_ROTATED, 8661, 4331 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_DL, 4331, 8661 },
{ IDS_WIA_PAPER_SIZE_PRC_32K_ROTATED, 7244, 5118 },
{ IDS_WIA_PAPER_SIZE_PRC_32K, 5118, 7244 },
{ IDS_WIA_PAPER_SIZE_B6, 5040, 7170 },
{ IDS_WIA_PAPER_SIZE_B6_JIS_ROTATED, 7165, 5039 },
{ IDS_WIA_PAPER_SIZE_B6_JIS, 5039, 7165 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_4_ROTATED, 8189, 4331 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_4, 4331, 8189 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_9, 3875, 8875 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_B6, 6929, 4921 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_3, 4921, 6929 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_MONARCH, 3875, 7500 },
{ IDS_WIA_PAPER_SIZE_ENVELOPE_C6, 4488, 6378 },
{ IDS_WIA_PAPER_SIZE_JAPAN_ENVELOPE_CHOU_4_ROTATED, 8071, 3543 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_ENVELOPE_CHOU_4, 3543, 8071 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_2_ROTATED, 6929, 4016 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_2, 4016, 6929 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_1_ROTATED, 6496, 4016 },
{ IDS_WIA_PAPER_SIZE_PRC_ENVELOPE_1, 4016, 6496 },
{ IDS_WIA_PAPER_SIZE_A6_105_X_148, 4133, 5830 },
{ IDS_WIA_PAPER_SIZE_A6_ROTATED, 5827, 4134 },
{ IDS_WIA_PAPER_SIZE_A6, 4134, 5827 },
{ IDS_WIA_PAPER_SIZE_6_34_ENVELOPE, 3625, 6500 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_POSTCARD_ROTATED, 5827, 3937 },
{ IDS_WIA_PAPER_SIZE_JAPANESE_POSTCARD, 3937, 5827 }
};
static const UINT g_SupportedPaperSizeCount = ARRAYSIZE(g_SupportedPaperSizes);
STDMETHODIMP CWiaDefaultUI::GetPaperSizes( CWiaPaperSize **ppPaperSizes, UINT *pnCount )
{
//
// Verify arguments
//
if (!ppPaperSizes || !pnCount)
{
return E_INVALIDARG;
}
//
// Initialize to NULL
//
*ppPaperSizes = NULL;
*pnCount = 0;
//
// Allocate the array of paper sizes
//
CWiaPaperSize *pPaperSizes = reinterpret_cast<CWiaPaperSize*>(CoTaskMemAlloc( sizeof(CWiaPaperSize) * g_SupportedPaperSizeCount ));
if (pPaperSizes)
{
//
// Initialize each name, so we can delete them if we encounter an error.
//
for (UINT i=0;i<g_SupportedPaperSizeCount;i++)
{
pPaperSizes[i].pszName = NULL;
}
//
// Assume success
//
bool bSucceeded = true;
//
// Loop through the paper size array
//
for (UINT i=0;i<g_SupportedPaperSizeCount && bSucceeded;i++)
{
//
// Load the name of this paper size
//
CSimpleStringWide strPaperName = CSimpleStringConvert::WideString(CSimpleString(g_SupportedPaperSizes[i].nStringId,g_hInstance));
if (strPaperName.Length())
{
//
// Allocate the string to hold the paper size name
//
pPaperSizes[i].pszName = reinterpret_cast<LPWSTR>(CoTaskMemAlloc((strPaperName.Length()+1) * sizeof(WCHAR)));
if (pPaperSizes[i].pszName)
{
//
// Copy over all the paper size values
//
lstrcpyW( pPaperSizes[i].pszName, strPaperName );
pPaperSizes[i].nWidth = g_SupportedPaperSizes[i].nWidth;
pPaperSizes[i].nHeight = g_SupportedPaperSizes[i].nHeight;
}
else
{
bSucceeded = false;
}
}
else
{
bSucceeded = false;
}
}
//
// If we hit some kind of error, free all memory
//
if (!bSucceeded)
{
UINT nCount = g_SupportedPaperSizeCount;
FreePaperSizes( &pPaperSizes, &nCount );
}
}
//
// Save the paper size and the array size
//
*ppPaperSizes = pPaperSizes;
*pnCount = g_SupportedPaperSizeCount;
//
// Return success if we successfully allocated the paper size array
//
return (*ppPaperSizes && *pnCount) ? S_OK : E_FAIL;
}
STDMETHODIMP CWiaDefaultUI::FreePaperSizes( CWiaPaperSize **ppPaperSizes, UINT *pnCount )
{
//
// Verify arguments
//
if (!ppPaperSizes || !pnCount)
{
return E_INVALIDARG;
}
//
// Loop and free the strings
//
for (UINT i=0;i<*pnCount;i++)
{
if ((*ppPaperSizes)[i].pszName)
{
CoTaskMemFree((*ppPaperSizes)[i].pszName);
}
}
//
// Free the array
//
CoTaskMemFree(*ppPaperSizes);
//
// 0 everything
//
*ppPaperSizes = NULL;
*pnCount = 0;
return S_OK;
}