|
|
/*******************************************************************************
* * (C) COPYRIGHT MICROSOFT CORP., 1997 * * TITLE: DevMgr.h * * VERSION: 2.0 * * DATE: May 18, 1999 * * DESCRIPTION: * Declarations and definitions for the WIA device manager object. * *******************************************************************************/
//
// Constants used by Event Notifier
//
#ifdef UNICODE
#define REG_PATH_STILL_IMAGE_CLASS \
L"System\\CurrentControlSet\\Control\\Class\\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}" #define REG_PATH_STILL_IMAGE_CONTROL \
L"System\\CurrentControlSet\\Control\\StillImage" #else
#define REG_PATH_STILL_IMAGE_CLASS \
"System\\CurrentControlSet\\Services\\Class\\Image" #define REG_PATH_STILL_IMAGE_CONTROL \
"System\\CurrentControlSet\\Control\\StillImage" #endif
#define NAME_VAL TEXT("Name")
#define DESC_VAL TEXT("Desc")
#define ICON_VAL TEXT("Icon")
#define CMDLINE_VAL TEXT("Cmdline")
#define DEFAULT_HANDLER_VAL TEXT("DefaultHandler")
//
// Node used to contain information about a specific callback
//
typedef struct __EventDestNode__ { //
// Linking elements
//
struct __EventDestNode__ *pPrev; struct __EventDestNode__ *pNext;
//
// Event callback related fields
//
IWiaEventCallback *pIEventCB; BSTR bstrDeviceID; GUID iidEventGUID; GUID ClsID; // Never returned to client in enumeration
TCHAR tszCommandline[MAX_PATH]; BSTR bstrName; BSTR bstrDescription; BSTR bstrIcon; FILETIME timeStamp;
BOOL bDeviceDefault;
} EventDestNode, *PEventDestNode;
/**************************************************************************\
* WIA_EVENT_THREAD_INFO * * Information for event callback thread * * Arguments: * * * * * History: * * 4/9/1999 Original Version * \**************************************************************************/
typedef struct __WIAEventThreadInfo__ { GUID eventGUID; BSTR bstrEventDescription; BSTR bstrDeviceID; BSTR bstrDeviceDescription; DWORD dwDeviceType; BSTR bstrFullItemName; ULONG ulEventType; ULONG ulReserved; IWiaEventCallback *pIEventCB; } WIAEventThreadInfo, *PWIAEventThreadInfo;
//
// Implementation of IEventNotifier interface
//
// Note : the class factory for CEventNotifier must be on the same
// thread as CWiaDevMgr.
//
//
// Flags to use when searching for callbacks
//
// Ignore STI proxy event matches , look only for exact match
#define FLAG_EN_FINDCB_EXACT_MATCH 0x0001
class CEventNotifier { friend class CWiaDevMgr; friend class CWiaInterfaceEvent;
public : static HRESULT CreateInstance(const IID& iid, void** ppv);
//
// Constructor and Destructor
//
CEventNotifier(); ~CEventNotifier();
VOID LinkNode(PEventDestNode); VOID UnlinkNode(PEventDestNode);
//
// Only the WIA device manager is allowed to use this method
//
HRESULT RegisterEventCallback( LONG lFlags, BSTR bstrDeviceID, const GUID *pEventGUID, IWiaEventCallback *pIWIAEventCallback, IUnknown **ppIEventObj);
HRESULT RegisterEventCallback( LONG lFlags, BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsID, LPCTSTR ptszCommandline, BSTR bstrName, BSTR bstrDescription, BSTR bstrIcon);
//
// Notify a STI event
//
HRESULT NotifySTIEvent( PWIANOTIFY pWiaNotify, ULONG ulEventType, BSTR bstrFullItemName); HRESULT NotifyVolumeEvent( PWIANOTIFY_VOLUME pWiaNotifyVolume);
//
// Fire the event
//
HRESULT NotifyEvent( LONG lReason, LONG lStatus, LONG lPercentComplete, const GUID *pEventGUID, BSTR bstrDeviceID, LONG lReserved);
//
// Restore all the persistent Event Callbacks
//
HRESULT RestoreAllPersistentCBs();
//
// Build enumerator for specific device's persistent handler
//
HRESULT CreateEnumEventInfo( BSTR bstrDeviceID, const GUID *pEventGUID, IEnumWIA_DEV_CAPS **ppIEnumDevCap);
//
// Find the total number of persistent handlers and the default one
//
HRESULT GetNumPersistentHandlerAndDefault( BSTR bstrDeviceID, const GUID *pEventGUID, ULONG *pulNumHandlers, EventDestNode **ppDefaultNode);
//
// Restore specific devices' persistent Event Callbacks
//
HRESULT RestoreDevPersistentCBs( HKEY hParentOfEventKey);
private :
//
// Utility functions
//
HRESULT RegisterEventCB( BSTR bstrDeviceID, const GUID *pEventGUID, IWiaEventCallback *pIWiaEventCallback, IUnknown **pEventObj);
HRESULT RegisterEventCB( BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsID, LPCTSTR ptszCommandline, BSTR bstrName, BSTR bstrDescription, BSTR bstrIcon, FILETIME &fileTime, BOOL bIsDefault = FALSE);
HRESULT UnregisterEventCB(PEventDestNode);
HRESULT UnregisterEventCB( BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsID, BOOL *pbUnRegCOMServer);
PEventDestNode FindEventCBNode( UINT uiFlags, BSTR bstrDeviceID, const GUID *pEventGUID, IWiaEventCallback *pIWiaEventCallback);
PEventDestNode FindEventCBNode( UINT uiFlags, BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsID);
HRESULT FindCLSIDForCommandline( LPCTSTR ptszCommandline, CLSID *pClsID);
HRESULT SavePersistentEventCB( BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsid, LPCTSTR ptszCommandline, BSTR bstrName, BSTR bstrDescription, BSTR bstrIcon, BOOL *pbCreatedKey, ULONG *pulNumExistingHandlers, BOOL bMakeDefault = FALSE);
HRESULT DelPersistentEventCB( BSTR bstrDeviceID, const GUID *pEventGUID, const GUID *pClsid, BOOL bUnRegCOMServer);
HRESULT FindEventByGUID( BSTR bstrDeviceID, const GUID *pEventGUID, HKEY *phEventKey);
//
// Fire an event asynchronously
//
HRESULT FireEventAsync( PWIAEventThreadInfo pMasterInfo);
//
// Start the callback program
//
HRESULT StartCallbackProgram( EventDestNode *pCBNode, PWIAEventThreadInfo pMasterInfo);
private :
ULONG m_ulRef;
//
// Double-linked list containing all the parties interested in Event CB
//
EventDestNode *m_pEventDestNodes; };
/**************************************************************************\
* CWiaInterfaceEvent * * This object is created when an application calls * RegisterForEventInterface. When this object is released, the * registered event is unregistered. * * History: * * 5/18/1999 Original Version * \**************************************************************************/
class CWiaInterfaceEvent : public IUnknown {
//
// IUnknown methods
//
public:
HRESULT _stdcall QueryInterface(const IID& iid, void** ppv); ULONG _stdcall AddRef(); ULONG _stdcall Release();
//
// private function
//
CWiaInterfaceEvent(PEventDestNode); ~CWiaInterfaceEvent();
private:
//
// member elements
//
ULONG m_cRef; PEventDestNode m_pEventDestNode; };
/**************************************************************************\
* CWiaEventContext * * This object is created when an event is queued as scheduler item * * History: * * 5/18/1999 Original Version * \**************************************************************************/
class CWiaEventContext : public IUnknown {
public:
//
// IUnknown methods
//
HRESULT _stdcall QueryInterface(const IID& iid, void** ppv); ULONG _stdcall AddRef(); ULONG _stdcall Release();
//
// Constructor /Destructor
//
CWiaEventContext( BSTR bstrDeviceID, const GUID *pGuidEvent, BSTR bstrFullItemName); ~CWiaEventContext();
public:
//
// Data members
//
ULONG m_cRef; BSTR m_bstrDeviceId; GUID m_guidEvent; BSTR m_bstrFullItemName; ULONG m_ulEventType; };
extern CEventNotifier g_eventNotifier;
|