#ifndef __CAP_H_ #define __CAP_H_ typedef struct tagCapData { TW_UINT16 CapId; // TWAIN capability ID(CAP_xxx or ICAP_xxx) TW_UINT16 ItemType; // Item type, TWTY_xxx TW_UINT16 ConType; // Container type, TWON_xxx TW_UINT32 ItemSize; // size of each item TW_UINT16 Default; // Default and Current are both value if TW_UINT16 Current; // ConType is not TWON_ENUMERATION. They are // index into the enumeration item list // if ConType is TWON_ENUMERATION. // When ConType is TWON_ONEVALUE, this is // *the* value. TW_UINT16 MinValue; // if Contype is TWON_ENUMERATION, // MaxValue - MinValue + 1 is number of TW_UINT16 MaxValue; // items in the enumeration with // MinValue indexes to the first item and TW_UINT16 StepSize; // MaxValue indexes to the last item. // If ConType is not TWON_ENUMERATION, MinValue // and MaxValue creates a bound for all the // possible values. For TWON_ONEVALUE, step size // is 1. For TWON_RANGE, StepSize is the // step size. VOID *ItemList; // ignore if ConType is not TWON_ENUMERATION VOID *pStrData; // optional string data }CAPDATA, *PCAPDATA; // // This class serves as a basic repository for saving and retreiving // TWAIN data. class CCap { public: CCap() { m_CurMinValue = m_CurMaxValue = m_BaseMinValue = m_BaseMaxValue = m_CurrentValue = m_DefaultValue = m_CurEnumMask = m_CurNumItems = m_ResetNumItems = m_ResetCurIndex = m_ResetDefIndex = 0; m_pStrData = NULL; m_ItemList = NULL; m_ResetItemList = NULL; } ~CCap() { if (m_ItemList) { if (m_ResetItemList == m_ItemList) { m_ResetItemList = NULL; } ::LocalFree(m_ItemList); } if (m_ResetItemList) { ::LocalFree(m_ResetItemList); } if (m_pStrData) { ::LocalFree(m_pStrData); } } TW_UINT16 ICap(PCAPDATA pCapData); TW_UINT16 ValueSize(TW_UINT16 uTWAINType); TW_UINT16 GetCapId() { return m_CapId; } TW_UINT16 GetItemType() { return m_ItemType; } TW_UINT16 GetContainerType() { return m_ConType; } TW_UINT32 GetDefault(); TW_UINT32 GetCurrent(); TW_UINT16 Set(TW_UINT32 DefValue, TW_UINT32 CurValue, TW_UINT32 MinValue, TW_UINT32 MaxValue, TW_UINT32 StepSize = 0 ); TW_UINT16 Set(TW_UINT32 StrDataSize, BYTE *pStrData); TW_UINT16 Set(TW_UINT32 DefIndex, TW_UINT32 CurIndex, TW_UINT32 NumItems, BYTE *ItemList ); TW_UINT16 Set(TW_UINT32 DefIndex, TW_UINT32 CurIndex, TW_UINT32 NumItems, BYTE *ItemList,BOOL bForce ); TW_UINT16 CalcEnumBitMask(TW_ENUMERATION *pEnum); TW_UINT16 Reset(); TW_UINT16 GetCurrent(TW_CAPABILITY *ptwCap) { return GetOneValue(FALSE, ptwCap); } TW_UINT16 GetDefault(TW_CAPABILITY *ptwCap) { return GetOneValue(TRUE, ptwCap); } TW_UINT16 Get(TW_CAPABILITY *ptwCap); TW_UINT16 SetCurrent(VOID *pNewValue); TW_UINT16 SetCurrent(TW_CAPABILITY *ptwCap); TW_UINT16 Set(TW_CAPABILITY *ptwCap); int CompareValue(TW_UINT32 This, TW_UINT32 That); TW_FIX32 FloatToFix32(FLOAT f); FLOAT Fix32ToFloat(TW_FIX32 fix32); TW_UINT16 SetCurrent(TW_UINT32 NewValue); protected: TW_UINT32 ExtractValue(BYTE *pData); TW_UINT16 m_CapId; TW_UINT16 m_ItemType; TW_UINT16 m_ConType; TW_UINT32 m_ItemSize; private: TW_UINT16 GetOneValue(BOOL bDefault, TW_CAPABILITY *ptwCap); TW_UINT32 GetClosestValue(TW_UINT32 Value); // copy contstructor. CCap(const CCap& CapData); // Assignment operator CCap& operator=(const CCap& CCap); TW_UINT32 m_CurrentValue; TW_UINT32 m_DefaultValue; TW_UINT32 m_StepSize; TW_UINT32 m_BaseMinValue; TW_UINT32 m_BaseMaxValue; TW_UINT32 m_CurMinValue; TW_UINT32 m_CurMaxValue; TW_UINT32 m_CurEnumMask; TW_UINT32 m_CurNumItems; TW_UINT32 m_ResetNumItems; TW_UINT32 m_ResetCurIndex; TW_UINT32 m_ResetDefIndex; BYTE *m_ItemList; BYTE *m_ResetItemList; BYTE *m_pStrData; // // debug helpers // void Debug_DumpEnumerationValues(TW_ENUMERATION *ptwEnumeration = NULL); }; #endif // #ifndef __CAP_H_