Jeremy White wrote:

libsane can return arbitrarily long names, but TWAIN supports only a maximum of 
32.
Further, the name is a unique identifier, and so must be returned to libsane 
for processing.

This algorithm tries to convert a long libsane name into a more reasonable 
short name,
but adds a crude signature process in an attempt to ensure a unique short 
identifier.

------------------------------------------------------------------------


dlls/twain/dsm_ctrl.c |   85 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 73 insertions(+), 12 deletions(-)

eabadf1c3584adda1a36b199f82bc6bbb17b71da
diff --git a/dlls/twain/dsm_ctrl.c b/dlls/twain/dsm_ctrl.c
index f744939..6d1318d 100644
--- a/dlls/twain/dsm_ctrl.c
+++ b/dlls/twain/dsm_ctrl.c
@@ -22,6 +22,7 @@

#include <stdlib.h>
#include <stdarg.h>
+#include <stdio.h>

#define NONAMELESSUNION
#define NONAMELESSSTRUCT
@@ -33,6 +34,14 @@

WINE_DEFAULT_DEBUG_CHANNEL(twain);

+inline static LPSTR TWAIN_strdup( LPCSTR str )
+{
+    LPSTR ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
+    if (ret) strcpy( ret, str );
+    return ret;
+}
+
+
/* DG_CONTROL/DAT_IDENTITY/MSG_CLOSEDS */
TW_UINT16 TWAIN_CloseDS (pTW_IDENTITY pOrigin, TW_MEMREF pData)
{
@@ -83,6 +92,38 @@ TW_UINT16 TWAIN_CloseDS (pTW_IDENTITY pO
#endif
}

+/* Sane returns device names that are longer than the 32 bytes allowed
+   by TWAIN.  However, it colon separates them, and the last bit is
+   the most interesting.  So we use the last bit, and add a signature
+   to ensure uniqueness */
+static char * get_sane_short_name(const char *in)
+{
+    char *p;
+    LPSTR ret;
+    int  signature = 0;
+
+    if (strlen(in) <= 32)
+        return TWAIN_strdup((char *) in);
+
+    for (p = (char *) in; *p; p++)
+        signature += *p;

These casts from const char * to char * shouldn't be necessary.

--
Rob Shearman



Reply via email to