|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*max@home*/
|
|
Toshihiro Shimizu |
890ddd |
#ifdef __cplusplus
|
|
Toshihiro Shimizu |
890ddd |
extern "C" {
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef NOTE
|
|
Shinya Kitaoka |
120a6e |
ConvertOneValue2Enum() potrebbe essere fonte di errore se
|
|
Shinya Kitaoka |
120a6e |
DCItemSize[one_value.ItemType] >
|
|
Shinya Kitaoka |
120a6e |
DCItemSize[TW_INT8] e si utilizzano i bit piu significativi di one_value
|
|
Shinya Kitaoka |
120a6e |
.Item
|
|
Shinya Kitaoka |
120a6e |
ConvertEnumeration2Range() potrebbe restituire valori di StepSize non
|
|
Shinya Kitaoka |
120a6e |
appropriati se enumeration.ItemType e TW_FIX32 potrebbe
|
|
Shinya Kitaoka |
120a6e |
restituire valori MinValue non corretti se DCItemSize[xxx.ItemType] >
|
|
Shinya Kitaoka |
120a6e |
DCItemSize[TW_INT8] e si utilizzano i bit piu significativi di xxx.Item
|
|
Shinya Kitaoka |
120a6e |
ConvertEnum2OneValue ritorna(ovviamente) solo il valore corrente
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <assert.h></assert.h>
|
|
Toshihiro Shimizu |
890ddd |
#include <string.h></string.h>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "ttwain_capability.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttwain_conversion.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttwain_error.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttwain_state.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "ttwain_global_def.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static const size_t DCItemSize[13] = {
|
|
Shinya Kitaoka |
120a6e |
sizeof(TW_INT8), sizeof(TW_INT16), sizeof(TW_INT32), sizeof(TW_UINT8),
|
|
Shinya Kitaoka |
120a6e |
sizeof(TW_UINT16), sizeof(TW_UINT32), sizeof(TW_BOOL), sizeof(TW_FIX32),
|
|
Shinya Kitaoka |
120a6e |
sizeof(TW_FRAME), sizeof(TW_STR32), sizeof(TW_STR64), sizeof(TW_STR128),
|
|
Shinya Kitaoka |
120a6e |
sizeof(TW_STR255),
|
|
Toshihiro Shimizu |
890ddd |
}; /* see twain.h */
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
#define TWON_TWON(TYPE1, TYPE2) (((TYPE1) << 8) | (TYPE2))
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
static int ConvertOneValue2Range(TW_ONEVALUE one_value, TW_RANGE *range);
|
|
Shinya Kitaoka |
120a6e |
static int ConvertEnumeration2Range(TW_ENUMERATION enumeration,
|
|
Shinya Kitaoka |
120a6e |
TW_RANGE *range);
|
|
Toshihiro Shimizu |
890ddd |
static int ConvertOneValue2Enum(TW_ONEVALUE one_value, TW_ENUMERATION *tw_enum);
|
|
Toshihiro Shimizu |
890ddd |
static int ConvertEnum2OneValue(TW_ENUMERATION tw_enum, TW_ONEVALUE *one_value);
|
|
Toshihiro Shimizu |
890ddd |
static int ConvertEnum2Array(TW_ENUMERATION tw_enum, TW_ARRAY *array);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
static TUINT32 GetContainerSize(int nFormat, unsigned twty, TW_UINT32 nItems);
|
|
Shinya Kitaoka |
120a6e |
static int TTWAIN_GetCapability(TW_INT16 msgType, TW_UINT16 cap_id,
|
|
Shinya Kitaoka |
120a6e |
TW_UINT16 conType, void *data,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 *cont_size);
|
|
Toshihiro Shimizu |
890ddd |
/*------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
int TTWAIN_GetCap(TW_UINT16 cap_id, TW_UINT16 conType, void *data,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 *cont_size) {
|
|
Shinya Kitaoka |
120a6e |
return TTWAIN_GetCapability(MSG_GET, cap_id, conType, data, cont_size);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
int TTWAIN_GetCapCurrent(TW_UINT16 cap_id, TW_UINT16 conType, void *data,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 *cont_size) {
|
|
Shinya Kitaoka |
120a6e |
return TTWAIN_GetCapability(MSG_GETCURRENT, cap_id, conType, data, cont_size);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
int TTWAIN_GetCapQuery(TW_UINT16 cap_id, TW_UINT16 *pattern) {
|
|
Shinya Kitaoka |
120a6e |
int rc;
|
|
Rozhuk Ivan |
823a31 |
/* GCC9 during compilation shows that this code possible call
|
|
Rozhuk Ivan |
823a31 |
* TTWAIN_GetCapability() with case TWON_TWON(TWON_RANGE, TWON_RANGE)
|
|
Rozhuk Ivan |
823a31 |
* whitch cause stack corruption, so make 'data' big enough to store
|
|
Rozhuk Ivan |
823a31 |
* TW_ONEVALUE. */
|
|
Rozhuk Ivan |
823a31 |
TW_ONEVALUE data[1 + (sizeof(TW_RANGE) / sizeof(TW_ONEVALUE))];
|
|
Shinya Kitaoka |
120a6e |
rc = TTWAIN_GetCapability(MSG_QUERYSUPPORT, cap_id, TWON_ONEVALUE, &data, 0);
|
|
Shinya Kitaoka |
120a6e |
if (!rc) return FALSE;
|
|
Rozhuk Ivan |
823a31 |
*pattern = (TW_UINT16)data[0].Item;
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int TTWAIN_GetCapability(TW_INT16 msgType, TW_UINT16 cap_id,
|
|
Shinya Kitaoka |
120a6e |
TW_UINT16 conType, void *data,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 *cont_size) {
|
|
Shinya Kitaoka |
120a6e |
TW_CAPABILITY cap;
|
|
Shinya Kitaoka |
120a6e |
void *pv;
|
|
Shinya Kitaoka |
120a6e |
TW_ENUMERATION *my_enum;
|
|
Shinya Kitaoka |
120a6e |
TW_ARRAY *my_array;
|
|
Shinya Kitaoka |
120a6e |
TW_ONEVALUE *my_one;
|
|
Shinya Kitaoka |
120a6e |
TW_RANGE *my_range;
|
|
Shinya Kitaoka |
120a6e |
TUINT32 size = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!data && !cont_size) return FALSE;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TTWAIN_GetState() < TWAIN_SOURCE_OPEN) {
|
|
Shinya Kitaoka |
120a6e |
TTWAIN_ErrorBox("Attempt to get capability value below State 4.");
|
|
Shinya Kitaoka |
120a6e |
return FALSE;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
/* Fill in capability structure */
|
|
Shinya Kitaoka |
120a6e |
cap.Cap = cap_id; /* capability id */
|
|
Shinya Kitaoka |
120a6e |
cap.ConType =
|
|
Shinya Kitaoka |
120a6e |
TWON_DONTCARE16; /* favorite type of container (should be ignored...) */
|
|
Shinya Kitaoka |
120a6e |
cap.hContainer = NULL;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TTWAIN_DS(DG_CONTROL, DAT_CAPABILITY, msgType, (TW_MEMREF)&cap) !=
|
|
Shinya Kitaoka |
120a6e |
TWRC_SUCCESS)
|
|
Shinya Kitaoka |
120a6e |
return FALSE;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!cap.hContainer) return FALSE;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (msgType == MSG_QUERYSUPPORT) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pv = GLOBAL_LOCK(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
my_enum = (TW_ENUMERATION *)pv;
|
|
Shinya Kitaoka |
120a6e |
my_array = (TW_ARRAY *)pv;
|
|
Shinya Kitaoka |
120a6e |
my_one = (TW_ONEVALUE *)pv;
|
|
Shinya Kitaoka |
120a6e |
my_range = (TW_RANGE *)pv;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (cont_size) {
|
|
Shinya Kitaoka |
120a6e |
switch (TWON_TWON(cap.ConType, conType)) {
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_ENUMERATION):
|
|
Shinya Kitaoka |
120a6e |
*cont_size = GetContainerSize(TWON_ENUMERATION, my_enum->ItemType,
|
|
Shinya Kitaoka |
120a6e |
my_enum->NumItems);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ONEVALUE, TWON_ENUMERATION):
|
|
Shinya Kitaoka |
120a6e |
*cont_size = GetContainerSize(TWON_ENUMERATION, my_one->ItemType, 1);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ARRAY, TWON_ARRAY):
|
|
Shinya Kitaoka |
120a6e |
*cont_size =
|
|
Shinya Kitaoka |
120a6e |
GetContainerSize(TWON_ARRAY, my_array->ItemType, my_array->NumItems);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ONEVALUE, TWON_ONEVALUE):
|
|
Shinya Kitaoka |
120a6e |
*cont_size = GetContainerSize(TWON_ONEVALUE, my_one->ItemType, 1);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_ARRAY):
|
|
Shinya Kitaoka |
120a6e |
*cont_size =
|
|
Shinya Kitaoka |
120a6e |
GetContainerSize(TWON_ARRAY, my_enum->ItemType, my_enum->NumItems);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
default:
|
|
Shinya Kitaoka |
120a6e |
/* tmsg_error("Unable to convert type %d to %d (cap 0x%x)\n",
|
|
Shinya Kitaoka |
120a6e |
* cap.ConType, conType,cap_id);*/
|
|
Shinya Kitaoka |
120a6e |
assert(0);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
return FALSE;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
switch (TWON_TWON(cap.ConType, conType)) {
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_ENUMERATION):
|
|
Shinya Kitaoka |
120a6e |
size = GetContainerSize(cap.ConType, my_enum->ItemType, my_enum->NumItems);
|
|
Shinya Kitaoka |
120a6e |
memcpy(data, my_enum, size);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_RANGE):
|
|
Shinya Kitaoka |
120a6e |
ConvertEnumeration2Range(*my_enum, (TW_RANGE *)data);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_ONEVALUE):
|
|
Shinya Kitaoka |
120a6e |
ConvertEnum2OneValue(*my_enum, (TW_ONEVALUE *)data);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ARRAY, TWON_ARRAY):
|
|
Shinya Kitaoka |
120a6e |
size =
|
|
Shinya Kitaoka |
120a6e |
GetContainerSize(cap.ConType, my_array->ItemType, my_array->NumItems);
|
|
Shinya Kitaoka |
120a6e |
memcpy(data, my_array, size);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ONEVALUE, TWON_ONEVALUE):
|
|
Shinya Kitaoka |
120a6e |
memcpy(data, my_one, sizeof(TW_ONEVALUE));
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ONEVALUE, TWON_RANGE):
|
|
Shinya Kitaoka |
120a6e |
ConvertOneValue2Range(*my_one, (TW_RANGE *)data);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ONEVALUE, TWON_ENUMERATION):
|
|
Shinya Kitaoka |
120a6e |
ConvertOneValue2Enum(*my_one, (TW_ENUMERATION *)data);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_RANGE, TWON_RANGE):
|
|
Shinya Kitaoka |
120a6e |
memcpy(data, my_range, sizeof(TW_RANGE));
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_TWON(TWON_ENUMERATION, TWON_ARRAY):
|
|
Shinya Kitaoka |
120a6e |
ConvertEnum2Array(*my_enum, (TW_ARRAY *)data);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
default:
|
|
Shinya Kitaoka |
120a6e |
assert(0);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
return FALSE;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(cap.hContainer);
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int ConvertOneValue2Range(TW_ONEVALUE one_value, TW_RANGE *range) {
|
|
Shinya Kitaoka |
120a6e |
range->ItemType = one_value.ItemType;
|
|
Shinya Kitaoka |
120a6e |
range->MinValue = one_value.Item;
|
|
Shinya Kitaoka |
120a6e |
range->MaxValue = one_value.Item;
|
|
Shinya Kitaoka |
120a6e |
range->StepSize = 0;
|
|
Shinya Kitaoka |
120a6e |
range->DefaultValue = one_value.Item;
|
|
Shinya Kitaoka |
120a6e |
range->CurrentValue = one_value.Item;
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int ConvertEnumeration2Range(TW_ENUMERATION enumeration,
|
|
Shinya Kitaoka |
120a6e |
TW_RANGE *range) {
|
|
Shinya Kitaoka |
120a6e |
range->ItemType = enumeration.ItemType;
|
|
Shinya Kitaoka |
120a6e |
range->MinValue = enumeration.ItemList[0];
|
|
Shinya Kitaoka |
120a6e |
range->MaxValue = enumeration.ItemList[enumeration.NumItems - 1];
|
|
Shinya Kitaoka |
120a6e |
range->StepSize = (range->MaxValue - range->MinValue) / enumeration.NumItems;
|
|
Shinya Kitaoka |
120a6e |
if (range->MaxValue < range->MinValue) {
|
|
Shinya Kitaoka |
120a6e |
range->MaxValue = range->MinValue;
|
|
Shinya Kitaoka |
120a6e |
range->StepSize = 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
range->DefaultValue = enumeration.ItemList[enumeration.DefaultIndex];
|
|
Shinya Kitaoka |
120a6e |
range->CurrentValue = enumeration.ItemList[enumeration.CurrentIndex];
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int ConvertOneValue2Enum(TW_ONEVALUE one_value,
|
|
Shinya Kitaoka |
120a6e |
TW_ENUMERATION *tw_enum) {
|
|
Shinya Kitaoka |
120a6e |
tw_enum->ItemType = one_value.ItemType;
|
|
Shinya Kitaoka |
120a6e |
tw_enum->NumItems = 1;
|
|
Shinya Kitaoka |
120a6e |
tw_enum->CurrentIndex = 0; /* Current value is in ItemList[CurrentIndex] */
|
|
Shinya Kitaoka |
120a6e |
tw_enum->DefaultIndex = 0; /* Powerup value is in ItemList[DefaultIndex] */
|
|
Shinya Kitaoka |
120a6e |
tw_enum->ItemList[0] = (TW_UINT8)one_value.Item;
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int ConvertEnum2OneValue(TW_ENUMERATION tw_enum,
|
|
Shinya Kitaoka |
120a6e |
TW_ONEVALUE *one_value) {
|
|
Shinya Kitaoka |
120a6e |
unsigned char *base;
|
|
shun-iwasawa |
443318 |
size_t ofs;
|
|
shun-iwasawa |
443318 |
size_t itemSize;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
itemSize = DCItemSize[tw_enum.ItemType];
|
|
Shinya Kitaoka |
120a6e |
base = tw_enum.ItemList;
|
|
Shinya Kitaoka |
120a6e |
ofs = tw_enum.CurrentIndex * itemSize;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
one_value->ItemType = tw_enum.ItemType;
|
|
Shinya Kitaoka |
120a6e |
one_value->Item = 0;
|
|
Shinya Kitaoka |
120a6e |
memcpy(&(one_value->Item), &(base[ofs]), itemSize);
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static int ConvertEnum2Array(TW_ENUMERATION tw_enum, TW_ARRAY *array) {
|
|
shun-iwasawa |
443318 |
size_t itemSize;
|
|
shun-iwasawa |
443318 |
size_t listSize;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
itemSize = DCItemSize[tw_enum.ItemType];
|
|
Shinya Kitaoka |
120a6e |
listSize = itemSize * tw_enum.NumItems;
|
|
Shinya Kitaoka |
120a6e |
array->ItemType = tw_enum.ItemType;
|
|
Shinya Kitaoka |
120a6e |
array->NumItems = tw_enum.NumItems;
|
|
Shinya Kitaoka |
120a6e |
memcpy(&(array->ItemList), &(tw_enum.ItemList), listSize);
|
|
Shinya Kitaoka |
120a6e |
return TRUE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
/* SET CAP */
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
int TTWAIN_SetCap(TW_UINT16 cap_id, TW_UINT16 conType, TW_UINT16 itemType,
|
|
Shinya Kitaoka |
120a6e |
TW_UINT32 *value) {
|
|
Shinya Kitaoka |
120a6e |
int rc = FALSE;
|
|
Shinya Kitaoka |
120a6e |
TUINT32 size;
|
|
Shinya Kitaoka |
120a6e |
TW_CAPABILITY *capability = 0;
|
|
Shinya Kitaoka |
120a6e |
TW_HANDLE capabilityH = 0;
|
|
Shinya Kitaoka |
120a6e |
TW_ONEVALUE *container = 0;
|
|
Shinya Kitaoka |
120a6e |
TW_HANDLE containerH = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
size = GetContainerSize(conType, itemType, 1);
|
|
Shinya Kitaoka |
120a6e |
containerH = GLOBAL_ALLOC(GMEM_FIXED, size);
|
|
Shinya Kitaoka |
120a6e |
if (!containerH) goto done;
|
|
Shinya Kitaoka |
120a6e |
container = (TW_ONEVALUE *)GLOBAL_LOCK(containerH);
|
|
shun-iwasawa |
443318 |
if (!container) goto done;
|
|
Shinya Kitaoka |
120a6e |
container->ItemType = itemType;
|
|
Shinya Kitaoka |
120a6e |
container->Item = *value;
|
|
Shinya Kitaoka |
120a6e |
capabilityH = GLOBAL_ALLOC(GMEM_FIXED, sizeof(TW_CAPABILITY));
|
|
Shinya Kitaoka |
120a6e |
if (!capabilityH) {
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(containerH);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(containerH);
|
|
MichaĆ Janiszewski |
1d0596 |
containerH = NULL;
|
|
Shinya Kitaoka |
120a6e |
goto done;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
443318 |
capability = (TW_CAPABILITY *)GLOBAL_LOCK(capabilityH);
|
|
shun-iwasawa |
443318 |
if (!capability) goto done;
|
|
Shinya Kitaoka |
120a6e |
capability->ConType = conType;
|
|
Shinya Kitaoka |
120a6e |
capability->hContainer = containerH;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TTWAIN_GetState() < TWAIN_SOURCE_OPEN) {
|
|
Shinya Kitaoka |
120a6e |
/*TTWAIN_ErrorBox("Setting capability in State < 4.");*/
|
|
Shinya Kitaoka |
120a6e |
TTWAIN_OpenSourceManager(0); /* Bring up to state 4 */
|
|
Shinya Kitaoka |
120a6e |
/*goto done;*/
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
capability->Cap = cap_id; /* capability id */
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
rc = (TTWAIN_DS(DG_CONTROL, DAT_CAPABILITY, MSG_SET, (TW_MEMREF)capability) ==
|
|
Shinya Kitaoka |
120a6e |
TWRC_SUCCESS);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
done:
|
|
Shinya Kitaoka |
120a6e |
if (containerH) {
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(containerH);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(containerH);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (capabilityH) {
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_UNLOCK(capabilityH);
|
|
Shinya Kitaoka |
120a6e |
GLOBAL_FREE(capabilityH);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return rc;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Shinya Kitaoka |
120a6e |
static TUINT32 GetContainerSize(int nFormat, unsigned twty, TW_UINT32 nItems) {
|
|
shun-iwasawa |
443318 |
size_t size;
|
|
Shinya Kitaoka |
120a6e |
switch (nFormat) {
|
|
Shinya Kitaoka |
120a6e |
case TWON_ONEVALUE:
|
|
Shinya Kitaoka |
120a6e |
size = sizeof(TW_ONEVALUE);
|
|
Shinya Kitaoka |
120a6e |
if (DCItemSize[twty] > sizeof(TW_UINT32)) {
|
|
Shinya Kitaoka |
120a6e |
size += DCItemSize[twty] - sizeof(TW_UINT32);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_RANGE:
|
|
Shinya Kitaoka |
120a6e |
size = sizeof(TW_RANGE);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_ENUMERATION:
|
|
Shinya Kitaoka |
120a6e |
size =
|
|
Shinya Kitaoka |
120a6e |
sizeof(TW_ENUMERATION) + DCItemSize[twty] * nItems - sizeof(TW_UINT8);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TWON_ARRAY:
|
|
Shinya Kitaoka |
120a6e |
size = sizeof(TW_ARRAY) + DCItemSize[twty] * nItems - sizeof(TW_UINT8);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
default:
|
|
Shinya Kitaoka |
120a6e |
size = 0;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
} /* switch */
|
|
shun-iwasawa |
443318 |
return (TUINT32)size;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
/*---------------------------------------------------------------------------*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef __cplusplus
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
#endif
|