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.
270 lines
5.9 KiB
270 lines
5.9 KiB
/*******************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORP., 1999
|
|
*
|
|
* TITLE: fstidev.cpp
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* AUTHOR: ByronC
|
|
*
|
|
* DATE: 7 Dec, 1999
|
|
*
|
|
* DESCRIPTION:
|
|
* Implmentation for fake StiDevice which gets handed down to WIA
|
|
* driver.
|
|
*
|
|
*******************************************************************************/
|
|
#include "precomp.h"
|
|
|
|
#include "stiexe.h"
|
|
#include "device.h"
|
|
#include "assert.h"
|
|
#include "wiapriv.h"
|
|
#include "lockmgr.h"
|
|
#include "fstidev.h"
|
|
|
|
//
|
|
// Default constructor
|
|
//
|
|
|
|
FakeStiDevice::FakeStiDevice()
|
|
{
|
|
m_cRef = 0;
|
|
m_pDevice = NULL;
|
|
}
|
|
|
|
//
|
|
// Constructor which takes in the device name and returns a pointer to this
|
|
// IStiDevice interface
|
|
//
|
|
|
|
FakeStiDevice::FakeStiDevice(BSTR bstrDeviceName, IStiDevice **ppStiDevice)
|
|
{
|
|
if (SUCCEEDED(Init(bstrDeviceName))) {
|
|
QueryInterface(IID_IStiDevice, (VOID**)ppStiDevice);
|
|
} else {
|
|
*ppStiDevice = NULL;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
FakeStiDevice::~FakeStiDevice()
|
|
{
|
|
m_cRef = 0;
|
|
}
|
|
|
|
//
|
|
// Initialization methods
|
|
//
|
|
|
|
HRESULT FakeStiDevice::Init(ACTIVE_DEVICE *pDevice)
|
|
{
|
|
m_pDevice = pDevice;
|
|
|
|
if (pDevice) {
|
|
return S_OK;
|
|
} else {
|
|
return E_POINTER;
|
|
}
|
|
}
|
|
|
|
HRESULT FakeStiDevice::Init(BSTR bstrDeviceName)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
/* This is all dead code. The Fake STI Device object implementation
|
|
is no longer needed for ensuring mutually exclusive locking - it is
|
|
now done automatically by the wrapper.
|
|
ACTIVE_DEVICE *pDevice;
|
|
|
|
USES_CONVERSION;
|
|
pDevice = g_pDevMan->IsInList(DEV_MAN_IN_LIST_DEV_ID, bstrDeviceName);
|
|
if(pDevice) {
|
|
m_pDevice = pDevice;
|
|
|
|
//
|
|
// We don't need to maintain a ref count on pDevice,
|
|
// since we're only used while the ACTIVE_DEVICE
|
|
// lives.
|
|
//
|
|
|
|
pDevice->Release();
|
|
} else {
|
|
hr = E_FAIL;
|
|
}
|
|
*/
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// IUnknown methods. Note: This object cannot be delegated and
|
|
// does not use aggregation.
|
|
//
|
|
|
|
HRESULT _stdcall FakeStiDevice::QueryInterface(const IID& iid, void** ppv)
|
|
{
|
|
if (ppv == NULL)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
if (ppv != NULL) {
|
|
*ppv = NULL;
|
|
}
|
|
|
|
if (iid == IID_IUnknown) {
|
|
*ppv = (IUnknown*) this;
|
|
} else if (iid == IID_IStiDevice) {
|
|
*ppv = (IStiDevice*) this;
|
|
} else {
|
|
return E_NOINTERFACE;
|
|
}
|
|
AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG _stdcall FakeStiDevice::AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
ULONG _stdcall FakeStiDevice::Release(void)
|
|
{
|
|
LONG cRef = m_cRef;
|
|
|
|
InterlockedDecrement(&m_cRef);
|
|
|
|
return cRef;
|
|
}
|
|
|
|
//
|
|
// IStiDevice Methods. The only methods implemented are:
|
|
//
|
|
// LockDevice
|
|
// UnLockDevice
|
|
//
|
|
// All other methods return E_NOTIMPL
|
|
//
|
|
|
|
HRESULT _stdcall FakeStiDevice::LockDevice( DWORD dwTimeOut)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
/* This is all dead code. The Fake STI Device object implementation
|
|
is no longer needed for ensuring mutually exclusive locking - it is
|
|
now done automatically by the wrapper.
|
|
if (m_pDevice) {
|
|
|
|
//
|
|
// AddRef the ACTIVE_DEVICE so it doesn't attempt to
|
|
// unload us while we're in use.
|
|
//
|
|
|
|
m_pDevice->AddRef();
|
|
hr = g_pStiLockMgr->RequestLock(m_pDevice, 60000);
|
|
if (FAILED(hr)) {
|
|
m_pDevice->Release();
|
|
}
|
|
}
|
|
*/
|
|
return hr;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::UnLockDevice( )
|
|
{
|
|
HRESULT hr = S_OK/*E_FAIL*/;
|
|
|
|
/* This is all dead code. The Fake STI Device object implementation
|
|
is no longer needed for ensuring mutually exclusive locking - it is
|
|
now done automatically by the wrapper.
|
|
if (m_pDevice) {
|
|
hr = g_pStiLockMgr->RequestUnlock(m_pDevice);
|
|
m_pDevice->Release();
|
|
}
|
|
*/
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::Initialize(HINSTANCE hinst,LPCWSTR pwszDeviceName,DWORD dwVersion,DWORD dwMode)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::GetCapabilities( PSTI_DEV_CAPS pDevCaps)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::GetStatus( PSTI_DEVICE_STATUS pDevStatus)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::DeviceReset( )
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::Diagnostic( LPSTI_DIAG pBuffer)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::Escape( STI_RAW_CONTROL_CODE EscapeFunction,LPVOID lpInData,DWORD cbInDataSize,LPVOID pOutData,DWORD dwOutDataSize,LPDWORD pdwActualData)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
HRESULT _stdcall FakeStiDevice::GetLastError( LPDWORD pdwLastDeviceError)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::RawReadData( LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::RawWriteData( LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::RawReadCommand( LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::RawWriteCommand( LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::Subscribe( LPSTISUBSCRIBE lpSubsribe)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::GetLastNotificationData(LPSTINOTIFY lpNotify)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::UnSubscribe( )
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
HRESULT _stdcall FakeStiDevice::GetLastErrorInfo( STI_ERROR_INFO *pLastErrorInfo)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|