Jeremy White : sane.ds: More completely implement ICAP_XFERMECH, with helper functions.

Alexandre Julliard julliard at winehq.org
Fri Feb 6 09:56:22 CST 2009


Module: wine
Branch: master
Commit: 0639904cc2edac05c9619ce2fd1b2769a850fe00
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0639904cc2edac05c9619ce2fd1b2769a850fe00

Author: Jeremy White <jwhite at codeweavers.com>
Date:   Thu Feb  5 16:23:29 2009 -0600

sane.ds: More completely implement ICAP_XFERMECH, with helper functions.

---

 dlls/sane.ds/capability.c |  168 +++++++++++++++++++++++++++++++--------------
 1 files changed, 117 insertions(+), 51 deletions(-)

diff --git a/dlls/sane.ds/capability.c b/dlls/sane.ds/capability.c
index 1c71b7d..6ecabb3 100644
--- a/dlls/sane.ds/capability.c
+++ b/dlls/sane.ds/capability.c
@@ -183,6 +183,98 @@ TW_UINT16 SANE_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action)
     return twCC;
 }
 
+
+static TW_UINT16 get_onevalue(pTW_CAPABILITY pCapability, TW_UINT16 *type, TW_UINT32 *value)
+{
+    if (pCapability->hContainer)
+    {
+        pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
+        if (pVal)
+        {
+            *value = pVal->Item;
+            if (type)
+                *type = pVal->ItemType;
+            GlobalUnlock (pCapability->hContainer);
+            return TWCC_SUCCESS;
+        }
+    }
+    return TWCC_BUMMER;
+}
+
+
+static TW_UINT16 set_onevalue(pTW_CAPABILITY pCapability, TW_UINT16 type, TW_UINT32 value)
+{
+    pCapability->hContainer = GlobalAlloc (0, sizeof(TW_ONEVALUE));
+
+    if (pCapability->hContainer)
+    {
+        pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
+        if (pVal)
+        {
+            pCapability->ConType = TWON_ONEVALUE;
+            pVal->ItemType = type;
+            pVal->Item = value;
+            GlobalUnlock (pCapability->hContainer);
+            return TWCC_SUCCESS;
+        }
+    }
+   return TWCC_LOWMEMORY;
+}
+
+static TW_UINT16 msg_set(pTW_CAPABILITY pCapability, TW_UINT32 *val)
+{
+    if (pCapability->ConType == TWON_ONEVALUE)
+        return get_onevalue(pCapability, NULL, val);
+
+    FIXME("Partial Stub:  MSG_SET only supports TW_ONEVALUE\n");
+    return TWCC_BADCAP;
+}
+
+
+static TW_UINT16 msg_get_enum(pTW_CAPABILITY pCapability, const TW_UINT32 *values, int value_count,
+                              TW_UINT16 type, TW_UINT32 current, TW_UINT32 default_value)
+{
+    TW_ENUMERATION *enumv = NULL;
+    TW_UINT32 *p32;
+    TW_UINT16 *p16;
+    int i;
+
+    pCapability->ConType = TWON_ENUMERATION;
+    pCapability->hContainer = 0;
+
+    if (type == TWTY_INT16 || type == TWTY_UINT16)
+        pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ENUMERATION, ItemList[value_count * sizeof(TW_UINT16)]));
+
+    if (type == TWTY_INT32 || type == TWTY_UINT32)
+        pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ENUMERATION, ItemList[value_count * sizeof(TW_UINT32)]));
+
+    if (pCapability->hContainer)
+        enumv = GlobalLock(pCapability->hContainer);
+
+    if (! enumv)
+        return TWCC_LOWMEMORY;
+
+    enumv->ItemType = type;
+    enumv->NumItems = value_count;
+
+    p16 = (TW_UINT16 *) enumv->ItemList;
+    p32 = (TW_UINT32 *) enumv->ItemList;
+    for (i = 0; i < value_count; i++)
+    {
+        if (values[i] == current)
+            enumv->CurrentIndex = i;
+        if (values[i] == default_value)
+            enumv->DefaultIndex = i;
+        if (type == TWTY_INT16 || type == TWTY_UINT16)
+            p16[i] = values[i];
+        if (type == TWTY_INT32 || type == TWTY_UINT32)
+            p32[i] = values[i];
+    }
+
+    GlobalUnlock(pCapability->hContainer);
+    return TWCC_SUCCESS;
+}
+
 static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
 {
     TW_ARRAY *a;
@@ -209,74 +301,48 @@ static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
 }
 
 
-static TW_BOOL TWAIN_OneValueSet (pTW_CAPABILITY pCapability, TW_UINT32 value)
-{
-    pCapability->hContainer = GlobalAlloc (0, sizeof(TW_ONEVALUE));
-
-    if (pCapability->hContainer)
-    {
-        pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
-        pVal->ItemType = TWTY_UINT32;
-        pVal->Item = value;
-        GlobalUnlock (pCapability->hContainer);
-        return TRUE;
-    }
-    else
-        return FALSE;
-}
-
-static TW_BOOL TWAIN_OneValueGet (pTW_CAPABILITY pCapability, TW_UINT32 *pValue)
-{
-    pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
-
-    if (pVal)
-    {
-        *pValue = pVal->Item;
-        GlobalUnlock (pCapability->hContainer);
-        return TRUE;
-    }
-    else
-        return FALSE;
-}
-
 /* ICAP_XFERMECH */
 static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action)
 {
+    static const TW_UINT32 possible_values[] = { TWSX_NATIVE, TWSX_MEMORY };
+    TW_UINT32 val;
+    TW_UINT16 twCC = TWCC_BADCAP;
+
     TRACE("ICAP_XFERMECH\n");
 
     switch (action)
     {
+        case MSG_QUERYSUPPORT:
+            twCC = set_onevalue(pCapability, TWTY_INT32,
+                    TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET );
+            break;
+
         case MSG_GET:
-            if (pCapability->ConType == TWON_ONEVALUE)
-            {
-                if (!TWAIN_OneValueSet (pCapability, activeDS.capXferMech))
-                    return TWCC_LOWMEMORY;
-            }
+            twCC = msg_get_enum(pCapability, possible_values, sizeof(possible_values) / sizeof(possible_values[0]),
+                    TWTY_UINT16, activeDS.capXferMech, TWSX_NATIVE);
             break;
+
         case MSG_SET:
-            if (pCapability->ConType == TWON_ONEVALUE)
-            {
-		TW_UINT32 xfermechtemp = 0;
-                if (!TWAIN_OneValueGet (pCapability, &xfermechtemp))
-                    return TWCC_LOWMEMORY;
-		activeDS.capXferMech = xfermechtemp;
-            }
-            else if (pCapability->ConType == TWON_ENUMERATION)
+            twCC = msg_set(pCapability, &val);
+            if (twCC == TWCC_SUCCESS)
             {
-
+               activeDS.capXferMech = (TW_UINT16) val;
+               FIXME("Partial Stub:  XFERMECH set to %d, but ignored\n", val);
             }
             break;
-        case MSG_GETCURRENT:
-            if (!TWAIN_OneValueSet (pCapability, activeDS.capXferMech))
-                return TWCC_LOWMEMORY;
-            break;
+
         case MSG_GETDEFAULT:
-            if (!TWAIN_OneValueSet (pCapability, TWSX_NATIVE))
-                return TWCC_LOWMEMORY;
+            twCC = set_onevalue(pCapability, TWTY_UINT16, TWSX_NATIVE);
             break;
+
         case MSG_RESET:
             activeDS.capXferMech = TWSX_NATIVE;
+            /* .. fall through intentional .. */
+
+        case MSG_GETCURRENT:
+            twCC = set_onevalue(pCapability, TWTY_UINT16, activeDS.capXferMech);
+            FIXME("Partial Stub:  XFERMECH of %d not actually used\n", activeDS.capXferMech);
             break;
     }
-    return TWCC_SUCCESS;
+    return twCC;
 }




More information about the wine-cvs mailing list