update for HEAD-2003091401
[reactos.git] / lib / twain / capability.c
diff --git a/lib/twain/capability.c b/lib/twain/capability.c
new file mode 100644 (file)
index 0000000..fb0fdfa
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * 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
+ */
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include <stdarg.h>
+
+#include "windef.h"
+#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;
+}