Started TWAIN implementation.
Marcus Meissner <marcus@jet.franken.de>
Merged into WineHQ, made sure it works without SANE.
diff --git a/dlls/twain/capability.c b/dlls/twain/capability.c
new file mode 100644
index 0000000..6ac5845
--- /dev/null
+++ b/dlls/twain/capability.c
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2000 Corel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "winbase.h"
+#include "twain.h"
+#include "twain_i.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(twain);
+
+TW_UINT16 TWAIN_SaneCapability (activeDS *pSource, pTW_CAPABILITY pCapability,
+ TW_UINT16 action)
+{
+ TW_UINT16 twCC = TWCC_SUCCESS;
+
+ TRACE("capability=%d action=%d\n", pCapability->Cap, action);
+
+ switch (pCapability->Cap)
+ {
+ case CAP_DEVICEEVENT:
+ case CAP_ALARMS:
+ case CAP_ALARMVOLUME:
+ case ACAP_AUDIOFILEFORMAT:
+ case ACAP_XFERMECH:
+ case ICAP_AUTOMATICBORDERDETECTION:
+ case ICAP_AUTOMATICDESKEW:
+ case ICAP_AUTODISCARDBLANKPAGES:
+ case ICAP_AUTOMATICROTATE:
+ case ICAP_FLIPROTATION:
+ case CAP_AUTOMATICCAPTURE:
+ case CAP_TIMEBEFOREFIRSTCAPTURE:
+ case CAP_TIMEBETWEENCAPTURES:
+ case CAP_AUTOSCAN:
+ case CAP_CLEARBUFFERS:
+ case CAP_MAXBATCHBUFFERS:
+ case ICAP_BARCODEDETECTIONENABLED:
+ case ICAP_SUPPORTEDBARCODETYPES:
+ case ICAP_BARCODEMAXSEARCHPRIORITIES:
+ case ICAP_BARCODESEARCHPRIORITIES:
+ case ICAP_BARCODESEARCHMODE:
+ case ICAP_BARCODEMAXRETRIES:
+ case ICAP_BARCODETIMEOUT:
+ case CAP_EXTENDEDCAPS:
+ case CAP_SUPPORTEDCAPS:
+ case ICAP_FILTER:
+ case ICAP_GAMMA:
+ case ICAP_PLANARCHUNKY:
+ case ICAP_BITORDERCODES:
+ case ICAP_CCITTKFACTOR:
+ case ICAP_COMPRESSION:
+ case ICAP_JPEGPIXELTYPE:
+ /*case ICAP_JPEGQUALITY:*/
+ case ICAP_PIXELFLAVORCODES:
+ case ICAP_TIMEFILL:
+ case CAP_DEVICEONLINE:
+ case CAP_DEVICETIMEDATE:
+ case CAP_SERIALNUMBER:
+ case ICAP_EXPOSURETIME:
+ case ICAP_FLASHUSED2:
+ case ICAP_IMAGEFILTER:
+ case ICAP_LAMPSTATE:
+ case ICAP_LIGHTPATH:
+ case ICAP_NOISEFILTER:
+ case ICAP_OVERSCAN:
+ case ICAP_PHYSICALHEIGHT:
+ case ICAP_PHYSICALWIDTH:
+ case ICAP_UNITS:
+ case ICAP_ZOOMFACTOR:
+ case CAP_PRINTER:
+ case CAP_PRINTERENABLED:
+ case CAP_PRINTERINDEX:
+ case CAP_PRINTERMODE:
+ case CAP_PRINTERSTRING:
+ case CAP_PRINTERSUFFIX:
+ case CAP_AUTHOR:
+ case CAP_CAPTION:
+ case CAP_TIMEDATE:
+ case ICAP_AUTOBRIGHT:
+ case ICAP_BRIGHTNESS:
+ case ICAP_CONTRAST:
+ case ICAP_HIGHLIGHT:
+ case ICAP_ORIENTATION:
+ case ICAP_ROTATION:
+ case ICAP_SHADOW:
+ case ICAP_XSCALING:
+ case ICAP_YSCALING:
+ case ICAP_BITDEPTH:
+ case ICAP_BITDEPTHREDUCTION:
+ case ICAP_BITORDER:
+ case ICAP_CUSTHALFTONE:
+ case ICAP_HALFTONES:
+ case ICAP_PIXELFLAVOR:
+ case ICAP_PIXELTYPE:
+ case ICAP_THRESHOLD:
+ case CAP_LANGUAGE:
+ case ICAP_FRAMES:
+ case ICAP_MAXFRAMES:
+ case ICAP_SUPPORTEDSIZES:
+ case CAP_AUTOFEED:
+ case CAP_CLEARPAGE:
+ case CAP_FEEDERALIGNMENT:
+ case CAP_FEEDERENABLED:
+ case CAP_FEEDERLOADED:
+ case CAP_FEEDERORDER:
+ case CAP_FEEDPAGE:
+ case CAP_PAPERBINDING:
+ case CAP_PAPERDETECTABLE:
+ case CAP_REACQUIREALLOWED:
+ case CAP_REWINDPAGE:
+ case ICAP_PATCHCODEDETECTIONENABLED:
+ case ICAP_SUPPORTEDPATCHCODETYPES:
+ case ICAP_PATCHCODEMAXSEARCHPRIORITIES:
+ case ICAP_PATCHCODESEARCHPRIORITIES:
+ case ICAP_PATCHCODESEARCHMODE:
+ case ICAP_PATCHCODEMAXRETRIES:
+ case ICAP_PATCHCODETIMEOUT:
+ case CAP_BATTERYMINUTES:
+ case CAP_BATTERYPERCENTAGE:
+ case CAP_POWERDOWNTIME:
+ case CAP_POWERSUPPLY:
+ case ICAP_XNATIVERESOLUTION:
+ case ICAP_XRESOLUTION:
+ case ICAP_YNATIVERESOLUTION:
+ case ICAP_YRESOLUTION:
+ twCC = TWCC_CAPUNSUPPORTED;
+ break;
+ case CAP_XFERCOUNT:
+ /* This is a required capability that every source need to
+ support but we havev't implemented yet. */
+ twCC = TWCC_SUCCESS;
+ break;
+ /*case ICAP_COMPRESSION:*/
+ case ICAP_IMAGEFILEFORMAT:
+ case ICAP_TILES:
+ twCC = TWCC_CAPUNSUPPORTED;
+ break;
+ case ICAP_XFERMECH:
+ twCC = TWAIN_ICAPXferMech (pSource, pCapability, action);
+ break;
+ case ICAP_UNDEFINEDIMAGESIZE:
+ case CAP_CAMERAPREVIEWUI:
+ case CAP_ENABLEDSUIONLY:
+ case CAP_INDICATORS:
+ case CAP_UICONTROLLABLE:
+ twCC = TWCC_CAPUNSUPPORTED;
+ break;
+ default:
+ twCC = TWRC_FAILURE;
+
+ }
+
+ return twCC;
+}
+
+TW_BOOL TWAIN_OneValueSet (pTW_CAPABILITY pCapability, TW_UINT32 value)
+{
+ pCapability->hContainer = (TW_HANDLE)GlobalAlloc (0, sizeof(TW_ONEVALUE));
+
+ if (pCapability->hContainer)
+ {
+ pTW_ONEVALUE pVal = GlobalLock ((HGLOBAL) pCapability->hContainer);
+ pVal->ItemType = TWTY_UINT32;
+ pVal->Item = value;
+ GlobalUnlock ((HGLOBAL) pCapability->hContainer);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+TW_BOOL TWAIN_OneValueGet (pTW_CAPABILITY pCapability, TW_UINT32 *pValue)
+{
+ pTW_ONEVALUE pVal = GlobalLock ((HGLOBAL) pCapability->hContainer);
+
+ if (pVal)
+ {
+ *pValue = pVal->Item;
+ GlobalUnlock ((HGLOBAL) pCapability->hContainer);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+/* ICAP_XFERMECH */
+TW_UINT16 TWAIN_ICAPXferMech (activeDS *pSource, pTW_CAPABILITY pCapability,
+ TW_UINT16 action)
+{
+ TRACE("ICAP_XFERMECH\n");
+
+ switch (action)
+ {
+ case MSG_GET:
+ if (pCapability->ConType == TWON_ONEVALUE)
+ {
+ if (!TWAIN_OneValueSet (pCapability, pSource->capXferMech))
+ return TWCC_LOWMEMORY;
+ }
+ break;
+ case MSG_SET:
+ if (pCapability->ConType == TWON_ONEVALUE)
+ {
+ TW_UINT32 xfermechtemp;
+ if (!TWAIN_OneValueGet (pCapability, &xfermechtemp))
+ return TWCC_LOWMEMORY;
+ pSource->capXferMech = xfermechtemp;
+ }
+ else if (pCapability->ConType == TWON_ENUMERATION)
+ {
+
+ }
+ break;
+ case MSG_GETCURRENT:
+ if (!TWAIN_OneValueSet (pCapability, pSource->capXferMech))
+ return TWCC_LOWMEMORY;
+ break;
+ case MSG_GETDEFAULT:
+ if (!TWAIN_OneValueSet (pCapability, TWSX_NATIVE))
+ return TWCC_LOWMEMORY;
+ break;
+ case MSG_RESET:
+ pSource->capXferMech = TWSX_NATIVE;
+ break;
+ }
+ return TWCC_SUCCESS;
+}