|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
faxshell.h
Abstract:
definitions for faxshell.cpp
Author:
Andrew Ritz (andrewr) 2-27-98
Environment:
user-mode
Notes:
Revision History:
2-27-98 (andrewr) Created. 8-06-99 (steveke) Major rewrite -> changed from shell extension to column provider
--*/
#define REGKEY_CLASSES_CLSID L"Clsid"
#define REGKEY_FAXSHELL_CLSID L"{7f9609be-af9a-11d1-83e0-00c04fb6e984}"
#define REGVAL_FAXSHELL_TEXT L"Fax Tiff Data Column Provider"
#define REGKEY_INPROC L"InProcServer32"
#define REGVAL_THREADING L"ThreadingModel"
#define REGVAL_APARTMENT L"Apartment"
#define REGVAL_LOCATION L"%SystemRoot%\\system32\\faxshell.dll"
#define REGKEY_COLUMNHANDLERS L"Folder\\shellex\\ColumnHandlers"
// g_hInstance is a global handle to the instance of the dll
HINSTANCE g_hInstance = NULL; // cLockCount is the lock count on the dll
LONG cLockCount = 0;
// CLSID_FaxShellExtension is the class id: 7f9609be-af9a-11d1-83e0-00c04fb6e984
DEFINE_GUID (CLSID_FaxShellExtension, 0x7f9609be, 0xaf9a, 0x11d1, 0x83, 0xe0, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x84); // PSGUID_FAXSHELLEXTENSION is the class guid: 7f9609be-af9a-11d1-83e0-00c04fb6e984
#define PSGUID_FAXSHELLEXTENSION {0x7f9609be, 0xaf9a, 0x11d1, 0x83, 0xe0, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x84}
// PID_* are column property identifiers
#define PID_SENDERNAME 0
#define PID_RECIPIENTNAME 1
#define PID_RECIPIENTNUMBER 2
#define PID_CSID 3
#define PID_TSID 4
#define PID_RECEIVETIME 5
#define PID_CALLERID 6
#define PID_ROUTING 7
// SCID_* are SHCOLUMNID structures that uniquely indentify the columns
SHCOLUMNID SCID_SenderName = { PSGUID_FAXSHELLEXTENSION, PID_SENDERNAME }; SHCOLUMNID SCID_RecipientName = { PSGUID_FAXSHELLEXTENSION, PID_RECIPIENTNAME }; SHCOLUMNID SCID_RecipientNumber = { PSGUID_FAXSHELLEXTENSION, PID_RECIPIENTNUMBER }; SHCOLUMNID SCID_Csid = { PSGUID_FAXSHELLEXTENSION, PID_CSID }; SHCOLUMNID SCID_Tsid = { PSGUID_FAXSHELLEXTENSION, PID_TSID }; SHCOLUMNID SCID_ReceiveTime = { PSGUID_FAXSHELLEXTENSION, PID_RECEIVETIME }; SHCOLUMNID SCID_CallerId = { PSGUID_FAXSHELLEXTENSION, PID_CALLERID }; SHCOLUMNID SCID_Routing = { PSGUID_FAXSHELLEXTENSION, PID_ROUTING };
typedef struct _COLUMN_TABLE { SHCOLUMNID *pscid; // SHCOLUMNID structure that uniquely identifies the column
DWORD dwId; // Resource id of the column name
DWORD dwSize; // Resource size of the column name
VARTYPE vt; // Variant type of the column's data
} COLUMN_TABLE;
const COLUMN_TABLE ColumnTable[] = { { &SCID_SenderName, IDS_COL_SENDERNAME, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_RecipientName, IDS_COL_RECIPIENTNAME, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_RecipientNumber, IDS_COL_RECIPIENTNUMBER, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_Csid, IDS_COL_CSID, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_Tsid, IDS_COL_TSID, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_ReceiveTime, IDS_COL_RECEIVETIME, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_CallerId, IDS_COL_CALLERID, MAX_COLUMN_NAME_LEN, VT_BSTR }, { &SCID_Routing, IDS_COL_ROUTING, MAX_COLUMN_NAME_LEN, VT_BSTR }, };
// ColumnTableCount is the number of entries in the column table
#define ColumnTableCount (sizeof(ColumnTable) / sizeof(COLUMN_TABLE))
class CClassFactory : public IClassFactory { public: // IUnknown methods
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvOut) { static const QITAB qit[] = { QITABENT(CClassFactory, IClassFactory), // IID_IClassFactory
{ 0 }, };
return QISearch(this, qit, riid, ppvOut); }; virtual STDMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&cObjectCount); }; virtual STDMETHODIMP_(ULONG) Release() { if (InterlockedDecrement(&cObjectCount) != 0) { return cObjectCount; }
delete this;
return 0; };
// IClassFactory methods
virtual STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR *ppvOut); virtual STDMETHODIMP LockServer(BOOL fLock) { (fLock == TRUE) ? InterlockedIncrement(&cLockCount) : InterlockedDecrement(&cLockCount);
return S_OK; }
CClassFactory() : cObjectCount(1) { LockServer(TRUE); } virtual ~CClassFactory() { LockServer(FALSE); }
private: // cObjectCount is the reference count of the object
LONG cObjectCount; };
class CFaxColumnProvider : public IColumnProvider { public: // IUnknown methods
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvOut) { static const QITAB qit[] = { QITABENT(CFaxColumnProvider, IColumnProvider), // IID_IColumnProvider
{ 0 }, };
return QISearch(this, qit, riid, ppvOut); }; virtual STDMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&cObjectCount); }; virtual STDMETHODIMP_(ULONG) Release() { if (InterlockedDecrement(&cObjectCount) != 0) { return cObjectCount; }
if (m_IFaxTiff != NULL) { m_IFaxTiff->Release(); }
delete this;
return 0; };
// IColumnProvider methods
virtual STDMETHODIMP Initialize(LPCSHCOLUMNINIT psci) {return S_OK;}; virtual STDMETHODIMP GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO *psci); virtual STDMETHODIMP GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT *pvarData);
CFaxColumnProvider() : cObjectCount(1), m_IFaxTiff(NULL) { InterlockedIncrement(&cLockCount); } virtual ~CFaxColumnProvider() { InterlockedDecrement(&cLockCount); }
private: // m_IFaxTiff is the IFaxTiff object
IFaxTiff* m_IFaxTiff; // cObjectCount is the reference count of the object
LONG cObjectCount; };
|