Windows2000/private/ntos/w32/ntgdi/icm/icmui/profile.h
2020-09-30 17:12:32 +02:00

287 lines
8.7 KiB
C++

/******************************************************************************
Header File: ICC Profile.H
This defines the C++ class we encapsulate the profile in. It also defines
the base class for device enumeration. All activity related to the profile,
including installations, associations, and so forth, is encapsulated in the
CProfile class. The UI classes themselves never call an ICM API, but are
instead concerned with simply handling the interface.
Copyright (c) 1996 by Microsoft Corporation
A Pretty Penny Enterprises Production
Change History:
10-31-96 A-RobKj (Pretty Penny Enterprises) began encapsulating
11-22-96 A-RobKj changed associations from string array to uint array to
facilitate the spec'd device naming conventions, and
filtering of lists for previously installed devices.
12-04-96 A-RobKj Added the CProfileArray class to make the Device
management UI more efficient.
12-13-96 A-RobKj Moved the CDeviceList derived classes here, so I can use
them elsewhere.
******************************************************************************/
#if !defined(ICC_PROFILE_CLASS)
#define ICC_PROFILE_CLASS
#include "StringAr.H"
#include "Dialog.H"
// CDeviceList class
/******************************************************************************
Highlights:
This is a base class for the enumeration and reporting of Device
class-specific information. The spec is such that a device can be associated
with a friendly name, but displayed in the UI with an enhanced name. Also,
the method for enumerating a device can differ from class to class.
This base class is usable for cases where there is no means of enumerating
devices currently. It reports that there are no devices.
To make overrides easier, the default display name returns the friendly name,
so derived classes where this is the case do not need to override this
method.
******************************************************************************/
class CDeviceList { // Device-specific information- base class
CString m_csDummy;
public:
CDeviceList() {}
~CDeviceList() {}
virtual unsigned Count() { return 0; }
virtual CString& DeviceName(unsigned u) { return m_csDummy; }
virtual CString& DisplayName(unsigned u) { return DeviceName(u); }
virtual void Enumerate() {}
virtual BOOL IsValidDeviceName(LPCTSTR lpstr) { return FALSE; }
};
// Device Enumeration classes- these must all derive from CDeviceList
// The CPrinterList class handles printers. Enumeration is via the Win32
// spooler API.
class CPrinterList : public CDeviceList {
CStringArray m_csaDeviceNames;
CStringArray m_csaDisplayNames;
public:
CPrinterList() {}
~CPrinterList() {}
virtual unsigned Count() { return m_csaDeviceNames.Count(); }
virtual CString& DeviceName(unsigned u) { return m_csaDeviceNames[u]; }
virtual CString& DisplayName(unsigned u) { return m_csaDisplayNames[u]; }
virtual void Enumerate();
virtual BOOL IsValidDeviceName(LPCTSTR lpstr);
};
// The CMonitorList class handles monitors. Enumeration is via a private ICM
// API.
class CMonitorList : public CDeviceList {
CStringArray m_csaDeviceNames;
CStringArray m_csaDisplayNames;
CString m_csPrimaryDeviceName;
public:
CMonitorList() {}
~CMonitorList() {}
virtual unsigned Count() { return m_csaDeviceNames.Count(); }
virtual CString& DeviceName(unsigned u) { return m_csaDeviceNames[u]; }
virtual CString& DisplayName(unsigned u) { return m_csaDisplayNames[u]; }
virtual CString& PrimaryDeviceName() { return m_csPrimaryDeviceName; }
virtual void Enumerate();
virtual BOOL IsValidDeviceName(LPCTSTR lpstr);
virtual LPCSTR DeviceNameToDisplayName(LPCTSTR lpstr);
};
// The CScannerList class handles scanners. Enumeration is via the STI
// interface.
class CScannerList : public CDeviceList {
CStringArray m_csaDeviceNames;
CStringArray m_csaDisplayNames;
public:
CScannerList() {}
~CScannerList() {}
virtual unsigned Count() { return m_csaDeviceNames.Count(); }
virtual CString& DeviceName(unsigned u) { return m_csaDeviceNames[u]; }
virtual CString& DisplayName(unsigned u) { return m_csaDisplayNames[u]; }
virtual void Enumerate();
virtual BOOL IsValidDeviceName(LPCTSTR lpstr);
};
// The CAllDeviceList class shows everything. We enumerate by combining the
// results of enumerating all of the other classes.
class CAllDeviceList : public CDeviceList {
CStringArray m_csaDeviceNames;
CStringArray m_csaDisplayNames;
public:
CAllDeviceList() {}
~CAllDeviceList() {}
virtual unsigned Count() { return m_csaDeviceNames.Count(); }
virtual CString& DeviceName(unsigned u) { return m_csaDeviceNames[u]; }
virtual CString& DisplayName(unsigned u) { return m_csaDisplayNames[u]; }
virtual void Enumerate();
virtual BOOL IsValidDeviceName(LPCTSTR lpstr);
};
// CProfile class
class CProfile {
HPROFILE m_hprof; // Profile handle
PROFILEHEADER m_phThis; // Profile header
CString m_csName;
BOOL m_bIsInstalled, m_bInstallChecked, m_bAssociationsChecked,
m_bDevicesChecked;
CDeviceList *m_pcdlClass; // Devices of this class
CUintArray m_cuaAssociation; // Associated devices (indices)
char m_acTag[MAX_PATH * 2];
void InstallCheck();
void AssociationCheck();
void DeviceCheck();
public:
static void Enumerate(ENUMTYPE& et, CStringArray& csaList);
static void Enumerate(ENUMTYPE& et, CStringArray& csaList, CStringArray& csaDesc);
static void Enumerate(ENUMTYPE& et, class CProfileArray& cpaList);
static const CString ColorDirectory();
CProfile(LPCTSTR lpstr);
~CProfile();
// Queries
CString GetName() { return m_csName.NameOnly(); }
DWORD GetType() { return m_hprof ? m_phThis.phClass : 0; }
DWORD GetCMM() { return m_hprof ? m_phThis.phCMMType : 0; }
// Inquire the color space information from the header
DWORD GetColorSpace() {return m_hprof ? m_phThis.phDataColorSpace : 0;}
BOOL IsInstalled() {
if (!m_bInstallChecked)
InstallCheck();
return m_bIsInstalled;
}
BOOL IsValid() {
BOOL bValid = FALSE;
if (m_hprof)
IsColorProfileValid(m_hprof, &bValid);
return bValid;
}
unsigned DeviceCount() {
if (m_pcdlClass) {
if (!m_bDevicesChecked)
DeviceCheck();
return m_pcdlClass -> Count();
} else {
return 0; // low memory - m_pcdlClass allocation failed
}
}
unsigned AssociationCount() {
if (!m_bAssociationsChecked)
AssociationCheck();
return m_cuaAssociation.Count();
}
LPCTSTR DeviceName(unsigned u) {
if (m_pcdlClass) {
if (!m_bDevicesChecked)
DeviceCheck();
return m_pcdlClass -> DeviceName(u);
} else {
return TEXT(""); // low memory - m_pcdlClass allocation failed
}
}
LPCTSTR DisplayName(unsigned u) {
if (m_pcdlClass) {
if (!m_bDevicesChecked)
DeviceCheck();
return m_pcdlClass -> DisplayName(u);
} else {
return TEXT(""); // low memory - m_pcdlClass allocation failed
}
}
unsigned Association(unsigned u) {
if (!m_bAssociationsChecked)
AssociationCheck();
return m_cuaAssociation[u];
}
LPCSTR TagContents(TAGTYPE tt, unsigned uOffset = 0);
// Operations
BOOL Install();
void Uninstall(BOOL bDelete);
void Associate(LPCTSTR lpstrNew);
void Dissociate(LPCTSTR lpstrNew);
};
// CProfileArray class- this is a list of profiles- it is used by the Device
// Management UI, so we only construct a CProfile object once per profile.
class CProfileArray {
CProfile *m_aStore[20];
CProfileArray *m_pcpaNext;
unsigned m_ucUsed;
const unsigned ChunkSize() const {
return sizeof m_aStore / sizeof m_aStore[0];
}
CProfile *Borrow();
public:
CProfileArray();
~CProfileArray();
unsigned Count() const { return m_ucUsed; }
// Add an item
void Add(LPCTSTR lpstrNew);
CProfile *operator [](unsigned u) const;
void Remove(unsigned u);
void Empty();
};
#endif