windows-nt/Source/XPSP1/NT/printscan/wia/test/wiatest/devicecmddlg.cpp
2020-09-26 16:20:57 +08:00

648 lines
17 KiB
C++

// DeviceCmdDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wiatest.h"
#include "DeviceCmdDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// #define _REED // added for debugload of all commands
/////////////////////////////////////////////////////////////////////////////
// CDeviceCmdDlg dialog
/**************************************************************************\
* CDeviceCmdDlg::CDeviceCmdDlg()
*
* Constructor for the Device Command Dialog
*
*
* Arguments:
*
* pParent - Parent Window
*
*
* Return Value:
*
* none
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
CDeviceCmdDlg::CDeviceCmdDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDeviceCmdDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDeviceCmdDlg)
m_Flags = 0;
m_FunctionCallText = _T("");
//}}AFX_DATA_INIT
}
/**************************************************************************\
* CDeviceCmdDlg::DoDataExchange()
*
* Handles control message maps to the correct member variables
*
*
* Arguments:
*
* pDX - DataExchange object
*
* Return Value:
*
* none
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDeviceCmdDlg)
DDX_Control(pDX, IDC_LIST_ITEMPROP, m_ItemPropertyListControl);
DDX_Control(pDX, IDC_COMMAND_LISTBOX, m_CommandListBox);
DDX_Text(pDX, IDC_FLAGS_EDITBOX, m_Flags);
DDX_Text(pDX, IDC_FUNCTIONCALLTEXT, m_FunctionCallText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDeviceCmdDlg, CDialog)
//{{AFX_MSG_MAP(CDeviceCmdDlg)
ON_BN_CLICKED(IDC_SEND_COMMAND, OnSendCommand)
ON_EN_KILLFOCUS(IDC_FLAGS_EDITBOX, OnKillfocusFlagsEditbox)
ON_LBN_SELCHANGE(IDC_COMMAND_LISTBOX, OnSelchangeCommandListbox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDeviceCmdDlg message handlers
/**************************************************************************\
* CDeviceCmdDlg::Initialize()
*
* Sets the current item to operate commands on
*
*
* Arguments:
*
* pIWiaItem - Item to use for command operations
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::Initialize(IWiaItem *pIWiaItem)
{
m_pIWiaItem = pIWiaItem;
}
/**************************************************************************\
* CDeviceCmdDlg::OnInitDialog()
*
* Initializes the Command dialog's controls/display
*
*
* Arguments:
*
* none
*
* Return Value:
*
* status
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
BOOL CDeviceCmdDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HFONT hFixedFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
if(hFixedFont != NULL)
m_CommandListBox.SendMessage(WM_SETFONT,(WPARAM)hFixedFont,0);
//
// initialize headers for Property list control
//
m_ItemPropertyListControl.InitHeaders();
m_ItemPropertyListControl.DisplayItemPropData(m_pIWiaItem);
m_Flags = 0;
m_pOptionalItem = NULL;
EnumerateDeviceCapsToListBox();
m_CommandListBox.SetCurSel(0);
OnSelchangeCommandListbox();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/**************************************************************************\
* CDeviceCmdDlg::FormatFunctionCallText()
*
* Formats the Command call into a readable/displayed CString
*
*
* Arguments:
*
* none
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::FormatFunctionCallText()
{
// format flags param
CString strFlag;
strFlag.Format("%d",m_Flags);
// format GUID param
CString strGUID;
strGUID = ConvertGUIDToKnownCString(GetCommandFromListBox());
// format pIWiaItem param
CString strOptionalItem;
strOptionalItem.Format("%p",m_pOptionalItem);
m_FunctionCallText = "Flags = "+strFlag+", Command = "+strGUID+", pIWiaItem = "+strOptionalItem+"\nhResult = " + m_strhResult;
UpdateData(FALSE);
}
/**************************************************************************\
* CDeviceCmdDlg::EnumerateDeviceCapsToListBox()
*
* Enumerates all supported device commands, and events to the command selection
* listbox
*
*
* Arguments:
*
* none
*
* Return Value:
*
* status
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
BOOL CDeviceCmdDlg::EnumerateDeviceCapsToListBox()
{
#ifdef _REED
// false loading of commands for debugging
DebugLoadCommands();
#else
WIA_DEV_CAP* pDevCap = NULL;
IEnumWIA_DEV_CAPS* pIEnumWiaDevCaps;
HRESULT hResult = S_OK;
hResult = m_pIWiaItem->EnumDeviceCapabilities(WIA_DEVICE_COMMANDS | WIA_DEVICE_EVENTS,&pIEnumWiaDevCaps);
if(hResult != S_OK)
{
AfxMessageBox("m_pIWiaItem->EnumDeviceCapabilities() Failed.." + hResultToCString(hResult));
return FALSE;
}
else
{
int CapIndex = 0;
do {
pDevCap = (WIA_DEV_CAP*) LocalAlloc(LPTR, sizeof(WIA_DEV_CAP));
if (pDevCap) {
hResult = pIEnumWiaDevCaps->Next(1,pDevCap,NULL);
if (hResult == S_OK)
{
AddDevCapToListBox(CapIndex,pDevCap);
CapIndex++;
if(pDevCap)
{
if(pDevCap->bstrName)
SysFreeString(pDevCap->bstrName);
if(pDevCap->bstrDescription)
SysFreeString(pDevCap->bstrDescription);
CoTaskMemFree(pDevCap);
}
}
} else {
hResult = E_OUTOFMEMORY;
AfxMessageBox("m_pIWiaItem->EnumDeviceCapabilities() Failed.." + hResultToCString(hResult));
return FALSE;
}
}while(hResult == S_OK);
pIEnumWiaDevCaps->Release();
}
#endif
return TRUE;
}
/**************************************************************************\
* CDeviceCmdDlg::OnSendCommand()
*
* Sends the selected command
*
*
* Arguments:
*
* none
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::OnSendCommand()
{
// get command from list box
GUID Command = GetCommandFromListBox();
// get flags flags from edit box
LONG Flags = m_Flags;
// send command
// set m_pOptionalItem pointer to NULL (don't release it, the app will do this later)
m_pOptionalItem = NULL;
HRESULT hResult = m_pIWiaItem->DeviceCommand(Flags,&Command,&m_pOptionalItem);
if (hResult != S_OK)
{
//WIA_ERROR(("*CWIACameraPg()* m_pIWiaItem->DeviceCommand() failed hResult = 0x%lx\n",hResult));
}
else
{
if(m_pOptionalItem != NULL)
m_ItemPropertyListControl.DisplayItemPropData(m_pOptionalItem);
}
m_strhResult = hResultToCString(hResult);
UpdateData(TRUE);
FormatFunctionCallText();
}
/**************************************************************************\
* CDeviceCmdDlg::GetCommandFromListBox()
*
* Returns the selected command GUID from the command list box
*
*
* Arguments:
*
* none
*
* Return Value:
*
* GUID - selected command
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
GUID CDeviceCmdDlg::GetCommandFromListBox()
{
// get current listbox selection
int CurSel = m_CommandListBox.GetCurSel();
GUID* pGUID = NULL;
if(CurSel != -1)
{
// get GUID from current selection
pGUID = (GUID*)m_CommandListBox.GetItemDataPtr(CurSel);
if(pGUID != NULL)
return *pGUID;
else
{
AfxMessageBox("GUID is NULL");
return WIA_CMD_SYNCHRONIZE;
}
}
else
{
// just send back synchronize for fun.. ?/ DEBUG
return WIA_CMD_SYNCHRONIZE;
}
}
/**************************************************************************\
* CDeviceCmdDlg::GUIDToCString()
*
* Formats a GUID into a CString (There is a better way to do this..I will fix
* this later)
*
*
* Arguments:
*
* guid - GUID to format
*
* Return Value:
*
* CString - Formatted GUID in CString format
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
CString CDeviceCmdDlg::GUIDToCString(GUID guid)
{
CString strGUID;
strGUID.Format("GUID = %8x-%lx-%lx-%2x%2x%2x%2x%2x%2x%2x%2x",
guid.Data1,
guid.Data2,
guid.Data3,
guid.Data4[0],
guid.Data4[1],
guid.Data4[2],
guid.Data4[3],
guid.Data4[4],
guid.Data4[5],
guid.Data4[6],
guid.Data4[7]);
return strGUID;
}
/**************************************************************************\
* CDeviceCmdDlg::AddDevCapToListBox()
*
* Adds a Device capability to the command listbox
*
*
* Arguments:
*
* CapIndex - Position for the command to be placed into the command list box
* pDevCapStruct - Device capability structure containing the supported device command info.
*
* Return Value:
*
* status
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
BOOL CDeviceCmdDlg::AddDevCapToListBox(int CapIndex,WIA_DEV_CAP *pDevCapStruct)
{
m_CommandListBox.InsertString(CapIndex,GUIDToCString(pDevCapStruct->guid)+" "+(CString)pDevCapStruct->bstrDescription);
// alloc data pointer for list box.
// the list box will free this memory on destruction..
GUID* pGUID = (GUID*)LocalAlloc(LPTR,sizeof(GUID));
memcpy(pGUID,&pDevCapStruct->guid,sizeof(GUID));
m_CommandListBox.SetItemDataPtr(CapIndex,(LPVOID)pGUID);
return TRUE;
}
/**************************************************************************\
* CDeviceCmdDlg::OnKillfocusFlagsbox()
*
* Handles the window's message when the focus has left the flags edit box
* When focus has left the control, it updates the formatted function call text.
*
*
* Arguments:
*
* none
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::OnKillfocusFlagsEditbox()
{
UpdateData(TRUE);
FormatFunctionCallText();
}
/**************************************************************************\
* CDeviceCmdDlg::ConvertGUIDToKnownCString()
*
* Converts a command GUID into a readable CString for display only
*
*
* Arguments:
*
* guid - Command GUID to convert
*
* Return Value:
*
* CString - converted GUID
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
CString CDeviceCmdDlg::ConvertGUIDToKnownCString(GUID guid)
{
// big nasty way to convert a known command into a string..
// no points for speed. :)
if(guid == WIA_CMD_SYNCHRONIZE)
return "WIA_CMD_SYNCHRONIZE";
else if(guid == WIA_CMD_TAKE_PICTURE)
return "WIA_CMD_TAKE_PICTURE";
else if(guid == WIA_CMD_DELETE_ALL_ITEMS)
return "WIA_CMD_DELETE_ALL_ITEMS";
else if(guid == WIA_CMD_CHANGE_DOCUMENT)
return "WIA_CMD_CHANGE_DOCUMENT";
else if(guid == WIA_CMD_UNLOAD_DOCUMENT)
return "WIA_CMD_UNLOAD_DOCUMENT";
else if(guid == WIA_EVENT_DEVICE_DISCONNECTED)
return "WIA_EVENT_DEVICE_DISCONNECTED";
else if(guid == WIA_EVENT_DEVICE_CONNECTED)
return "WIA_EVENT_DEVICE_CONNECTED";
else if(guid == WIA_CMD_DELETE_DEVICE_TREE)
return "WIA_CMD_DELETE_DEVICE_TREE";
else if(guid == WIA_CMD_BUILD_DEVICE_TREE)
return "WIA_CMD_BUILD_DEVICE_TREE";
else
return "WIA_CMD_USERDEFINED";
}
/**************************************************************************\
* CDeviceCmdDlg::DebugLoadCommands()
*
* Loads a set of pre-loaded commands for debugging only
*
*
* Arguments:
*
* none
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::DebugLoadCommands()
{
BSTR bstrCapName;
BSTR bstrCapFriendlyName;
WIA_DEV_CAP pDevCap[9];
// load WIA_CMD_SYNCHRONIZE
bstrCapName = ::SysAllocString(L"Syncronize");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_SYNCHRONIZE");
pDevCap[0].guid = WIA_CMD_SYNCHRONIZE;
pDevCap[0].bstrName = bstrCapName;
pDevCap[0].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(0,pDevCap);
// load WIA_CMD_TAKE_PICTURE
bstrCapName = ::SysAllocString(L"Take Picture");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_TAKE_PICTURE");
pDevCap[1].guid = WIA_CMD_TAKE_PICTURE;
pDevCap[1].bstrName = bstrCapName;
pDevCap[1].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(1,&pDevCap[1]);
// load WIA_CMD_DELETE_ALL_ITEMS
bstrCapName = ::SysAllocString(L"Delete all items");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_DELETE_ALL_ITEMS");
pDevCap[2].guid = WIA_CMD_DELETE_ALL_ITEMS;
pDevCap[2].bstrName = bstrCapName;
pDevCap[2].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(2,&pDevCap[2]);
// load WIA_CMD_CHANGE_DOCUMENT
bstrCapName = ::SysAllocString(L"Change Document");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_CHANGE_DOCUMENT");
pDevCap[3].guid = WIA_CMD_CHANGE_DOCUMENT;
pDevCap[3].bstrName = bstrCapName;
pDevCap[3].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(3,&pDevCap[3]);
// load WIA_CMD_UNLOAD_DOCUMENT
bstrCapName = ::SysAllocString(L"Unload Document");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_UNLOAD_DOCUMENT");
pDevCap[4].guid = WIA_CMD_UNLOAD_DOCUMENT;
pDevCap[4].bstrName = bstrCapName;
pDevCap[4].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(4,&pDevCap[4]);
// load WIA_EVENT_DEVICE_DISCONNECTED
bstrCapName = ::SysAllocString(L"Disconnect Event");
bstrCapFriendlyName = ::SysAllocString(L"WIA_EVENT_DEVICE_DISCONNECTED");
pDevCap[5].guid = WIA_EVENT_DEVICE_DISCONNECTED;
pDevCap[5].bstrName = bstrCapName;
pDevCap[5].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(5,&pDevCap[5]);
// load WIA_EVENT_DEVICE_CONNECTED
bstrCapName = ::SysAllocString(L"Connect Event");
bstrCapFriendlyName = ::SysAllocString(L"WIA_EVENT_DEVICE_CONNECTED");
pDevCap[6].guid = WIA_EVENT_DEVICE_CONNECTED;
pDevCap[6].bstrName = bstrCapName;
pDevCap[6].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(6,&pDevCap[6]);
// load WIA_CMD_DELETE_DEVICE_TREE
bstrCapName = ::SysAllocString(L"Delete Device Tree");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_DELETE_DEVICE_TREE");
pDevCap[7].guid = WIA_CMD_DELETE_DEVICE_TREE;
pDevCap[7].bstrName = bstrCapName;
pDevCap[7].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(7,&pDevCap[7]);
// load WIA_CMD_BUILD_DEVICE_TREE
bstrCapName = ::SysAllocString(L"Build Device Tree");
bstrCapFriendlyName = ::SysAllocString(L"WIA_CMD_BUILD_DEVICE_TREE");
pDevCap[8].guid = WIA_CMD_BUILD_DEVICE_TREE;
pDevCap[8].bstrName = bstrCapName;
pDevCap[8].bstrDescription = bstrCapFriendlyName;
AddDevCapToListBox(8,&pDevCap[8]);
}
/**************************************************************************\
* CDeviceCmdDlg::OnSelchangeCommandListbox()
*
* Handles the window's message when a user changes the selection in the
* command listbox
*
*
* Arguments:
*
* none
*
* Return Value:
*
* void
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
void CDeviceCmdDlg::OnSelchangeCommandListbox()
{
UpdateData(TRUE);
FormatFunctionCallText();
}
/**************************************************************************\
* CDeviceCmdDlg::hResultToCString()
*
* Converts a hResult value into a readable CString for display only
*
*
* Arguments:
*
* hResult - some HRESULT
*
* Return Value:
*
* CString - readable error return
*
* History:
*
* 2/14/1999 Original Version
*
\**************************************************************************/
CString CDeviceCmdDlg::hResultToCString(HRESULT hResult)
{
CString strhResult = "";
ULONG ulLen = 0;
LPTSTR pMsgBuf;
ulLen = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hResult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&pMsgBuf, 0, NULL);
if (ulLen)
{
strhResult = pMsgBuf;
strhResult.TrimRight();
LocalFree(pMsgBuf);
}
else
{
// use sprintf to write to buffer instead of .Format member of
// CString. This conversion works better for HEX
char buffer[255];
sprintf(buffer," 0x%08X",hResult);
strhResult = buffer;
}
return strhResult;
}