Leaked source code of windows server 2003
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.
 
 
 
 
 
 

287 lines
8.0 KiB

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
ExtensionData.h
Abstract:
This file provides declarations of the named
extension data functions (get / set / notify)
Author:
Eran Yariv (EranY) Dec, 1999
Revision History:
--*/
#ifndef _EXTENSION_DATA_H_
#define _EXTENSION_DATA_H_
#include <map>
#include <list>
#include <string>
using namespace std;
class CExtNotifyCallbackPacket
{
public:
CExtNotifyCallbackPacket();
~CExtNotifyCallbackPacket();
BOOL Init(
PFAX_EXT_CONFIG_CHANGE pCallback,
DWORD dwDeviceId,
LPCWSTR lpcwstrDataGuid,
LPBYTE lpbData,
DWORD dwDataSize);
public:
DWORD m_dwDeviceId;
LPWSTR m_lpwstrGUID;
LPBYTE m_lpbData;
DWORD m_dwDataSize;
PFAX_EXT_CONFIG_CHANGE m_pCallback ;
};
/************************************
* *
* CMapDeviceId *
* *
************************************/
class CMapDeviceId
{
public:
CMapDeviceId () {}
~CMapDeviceId () {}
DWORD AddDevice (DWORD dwTAPIid, DWORD dwFaxId);
DWORD RemoveDevice (DWORD dwTAPIid);
DWORD LookupUniqueId (DWORD dwOtherId, LPDWORD lpdwFaxId) const;
private:
typedef map<DWORD, DWORD> DEVICE_IDS_MAP, *PDEVICE_IDS_MAP;
DEVICE_IDS_MAP m_Map;
}; // CMapDeviceId
/************************************
* *
* CDeviceAndGUID *
* *
************************************/
//
// CDeviceAndGUID class
//
// This class represents the key in the notification map
//
class CDeviceAndGUID
{
public:
CDeviceAndGUID (DWORD dwDeviceId, LPCWSTR lpcwstrGUID) :
m_dwDeviceId (dwDeviceId),
m_strGUID (lpcwstrGUID)
{}
virtual ~CDeviceAndGUID () {}
bool operator < ( const CDeviceAndGUID &other ) const;
private:
wstring m_strGUID;
DWORD m_dwDeviceId;
}; // CDeviceAndGUID
/************************************
* *
* CNotificationSink *
* *
************************************/
//
// CNotificationSink class
//
// This generic abstract class represents a notification sink.
// The value in the map is a list of pointer to instances derived from this class.
//
class CNotificationSink
{
public:
CNotificationSink () : m_type (SINK_TYPE_UNKNOWN) {}
virtual ~CNotificationSink() {}
virtual HRESULT Notify (DWORD dwDeviceId,
LPCWSTR lpcwstrNameGUID,
LPCWSTR lpcwstrComputerName,
HANDLE hModule,
LPBYTE lpData,
DWORD dwDataSize,
LPBOOL lpbRemove) = 0;
virtual bool operator == (const CNotificationSink &rhs) const = 0;
virtual bool operator != (const CNotificationSink &rhs) const
{
return !(*this == rhs);
}
virtual HRESULT Disconnect () = 0;
typedef enum {
SINK_TYPE_UNKNOWN, // Unspecified sink type
SINK_TYPE_LOCAL, // Local sink (callback)
SINK_TYPE_REMOTE // Remote sink (RPC)
} SinkType;
SinkType Type() const { return m_type; }
protected:
SinkType m_type;
}; // CNotificationSink
/************************************
* *
* CLocalNotificationSink *
* *
************************************/
//
// CLocalNotificationSink class
//
// This is a concrete class derived from CNotificationSink.
// It implementes a notification local sink in a Fax extension (via a callback).
//
class CLocalNotificationSink : public CNotificationSink
{
public:
CLocalNotificationSink (
PFAX_EXT_CONFIG_CHANGE lpConfigChangeCallback,
DWORD dwNotifyDeviceId,
HINSTANCE hInst);
virtual ~CLocalNotificationSink() {}
virtual bool operator == (const CNotificationSink &rhs) const;
virtual HRESULT Disconnect () { return NOERROR; }
virtual HRESULT Notify (DWORD dwDeviceId,
LPCWSTR lpcwstrNameGUID,
LPCWSTR lpcwstrComputerName,
HANDLE hModule,
LPBYTE lpData,
DWORD dwDataSize,
LPBOOL lpbRemove);
private:
PFAX_EXT_CONFIG_CHANGE m_lpConfigChangeCallback;
DWORD m_dwNotifyDeviceId;
HINSTANCE m_hInst; // Instance of extension that asks for this sink
}; // CLocalNotificationSink
/************************************
* *
* CSinksList *
* *
************************************/
typedef list<CNotificationSink *> SINKS_LIST, *PSINKS_LIST;
class CSinksList
{
public:
CSinksList () : m_bNotifying (FALSE) {}
~CSinksList ();
BOOL m_bNotifying; // Are we now already notifying to this device id + GUID?
SINKS_LIST m_List; // List of notification sinks
}; // CSinksList
#define NUM_EXT_DATA_SET_THREADS 1 /* The number of extension
notification completion port
dequeueing threads created
*/
#define MAX_CONCURRENT_EXT_DATA_SET_THREADS 1 /* The maximal number of extension
notification completion
port dequeueing threads allowed
(by the system) to run concurrently.
*/
/************************************
* *
* CNotificationMap *
* *
************************************/
typedef map<CDeviceAndGUID, CSinksList*> NOTIFY_MAP, *PNOTIFY_MAP;
//
// The CNotificationMap class is the global notification mechanism
//
class CNotificationMap
{
public:
CNotificationMap () :
m_bNotifying (FALSE),
m_hCompletionPort(NULL)
{}
virtual ~CNotificationMap ();
void Notify (DWORD dwDeviceId,
LPCWSTR lpcwstrNameGUID,
LPCWSTR lpcwstrComputerName,
HANDLE hModule,
LPBYTE lpData,
DWORD dwDataSize);
CNotificationSink * AddLocalSink (
HINSTANCE hInst,
DWORD dwDeviceId,
DWORD dwNotifyDeviceId,
LPCWSTR lpcwstrNameGUID,
PFAX_EXT_CONFIG_CHANGE lpConfigChangeCallback);
DWORD RemoveSink (CNotificationSink *pSinkToRemove);
DWORD Init ();
HANDLE m_hCompletionPort;
CFaxCriticalSection m_CsExtensionData; // Protects all extension data use
private:
NOTIFY_MAP m_Map;
BOOL m_bNotifying; // Are we notifying someone now?
static DWORD ExtNotificationThread(LPVOID UnUsed); // Extension Notification Thread function
}; // CNotificationMap
/************************************
* *
* Externs *
* *
************************************/
extern CNotificationMap* g_pNotificationMap; // Map of DeviceId+GUID to list of notification sinks
extern CMapDeviceId* g_pTAPIDevicesIdsMap; // Map between TAPI permanent line id and fax unique device id.
#endif // _EXTENSION_DATA_H_