Previus/next scan buttons in scan.
[egate.git] / www / z39util.tcl
index 216784c..9413385 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: z39util.tcl,v 1.11 1995/11/14 16:01:52 adam Exp $
+# $Id: z39util.tcl,v 1.16 1996/01/03 08:59:45 adam Exp $
 #
 proc saveState {} {
     uplevel #0 {
@@ -43,6 +43,18 @@ proc search-response {zz} {
     }
 }
 
+proc scan-response {zz} {
+    global sessionWait
+
+    set status [$zz scanStatus]
+    if {$status == 6} {
+        displayError "Scan fail" ""
+        set sessionWait -2
+    } else {
+        set sessionWait 1
+    }
+}
+
 proc ok-response {} {
     global sessionWait
     set sessionWait 1
@@ -118,7 +130,7 @@ proc display-raw {zset no tno} {
         set indicator [lindex $line 1]
         set fields [lindex $line 2]
         set l [string length $indicator]
-        html "$tag "
+        html "<tt>$tag "
         if {$l > 0} {
             for {set i 0} {$i < $l} {incr i} {
                 if {[string index $indicator $i] == " "} {
@@ -128,6 +140,7 @@ proc display-raw {zset no tno} {
                 }
             }
         }
+        html "</tt>"
         foreach field $fields {
             set id [lindex $field 0]
             set data [lindex $field 1]
@@ -155,7 +168,7 @@ proc put-marc-contents {cc} {
     }
     html $cc
     if {$ref != ""} {
-        html {">} $urltype { reference</a>}
+        html {">} $cc {</a>}
     }
 }
 
@@ -318,7 +331,7 @@ proc display-full {zset no tno} {
     if {"x$url" != "x"} {
         html "<dt><b>URL</b>\n"
         if {"x$sp" == "x"} {
-            set sp reference
+            set sp $url
         }
         html {<dd><a href="} $url {">} [join $sp] "</a>\n"
     }
@@ -348,12 +361,28 @@ proc display-rec {from to dfunc tno} {
     }
 }
 
-proc build-query {t} {
+proc build-scan {t i} {
+    global targets
+
+    set term [wform entry$i]
+    if {$term != ""} {
+        set field [wform menu$i]
+        foreach x [lindex $targets($t) 2] {
+            if {[lindex $x 0] == $field} {
+                set attr [lindex $x 1]
+            }
+        }
+        return [list $term $attr]
+    }
+    return ""
+}
+
+proc build-query {t ilines} {
     global targets
 
     set op {}
     set q {}
-    for {set i 1} {$i < 4} {incr i} {
+    for {set i 1} {$i <= $ilines} {incr i} {
         set term [wform entry$i]
         if {$term != ""} {
             set field [wform menu$i]
@@ -378,6 +407,150 @@ proc build-query {t} {
     return $q
 }
 
+proc z39scan {setNo scanNo tno scanLines scanPos cache} {
+    global hist
+    global sessionWait
+    global targets
+
+    if {$tno > 0} {
+        set zz z39$tno
+        set host $hist($setNo,$tno,host)
+        set idAuth $hist($setNo,$tno,idAuthentication)
+        set database $hist($setNo,$tno,database)
+        set scanAttr $hist($setNo,$tno,scanAttr)
+        set scanTerm $hist($setNo,$tno,$scanNo,scanTerm)
+    } else {
+        set zz z39
+        set host $hist($setNo,host)
+        set idAuth $hist($setNo,idAuthentication)
+        set database $hist($setNo,database)
+        set scanAttr $hist($setNo,scanAttr)
+        set scanTerm $hist($setNo,$scanNo,scanTerm)
+    }
+    if {[catch [list $zz failback fail-response]]} {
+        ir $zz
+    }
+    if {[catch [list set oldHost [$zz connect]]]} {
+        set oldHost ""
+    }
+    set zs $zz.s$scanNo.$setNo
+    $zz callback ok-response
+    $zz failback fail-response
+    if {$oldHost != $host} {
+        catch [list $zz disconnect]
+
+        set sessionWait 0
+        if {[catch [list $zz connect $host]]} {
+            displayError "Cannot connect to target" $host
+            return 0
+        } elseif {$sessionWait == 0} {
+            if {[catch {zwait sessionWait 300}]} {
+               $zz disconnect
+                displayError "Cannot connect to target" $host
+                return 0
+            }
+            if {$sessionWait != 1} {
+                displayError "Cannot connect to target" $host
+                return 0
+            }
+        }
+        $zz idAuthentication $idAuth
+        set sessionWait 0
+        if {[catch {$zz init}]} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {[catch {zwait sessionWait 60}]} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {$sessionWait != "1"} {
+            displayError "Cannot initialize target" $host
+           $zz disconnect
+            return 0
+        }
+        if {![$zz initResult]} {
+            set u [$zz userInformationField]
+            $zz disconnect
+            displayError "Cannot initialize target $host" $u
+            return 0
+        }
+    } else {
+        if {$cache && ![catch [list $zs numberOfTermsRequested 5]]} {
+            return 1
+        }
+    }
+    eval $zz databaseNames $database
+
+    ir-scan $zs $zz
+
+    $zs numberOfTermsRequested $scanLines
+    $zs preferredPositionInResponse $scanPos
+
+    $zz callback [list scan-response $zs]
+
+    set sessionWait 0
+    $zs scan "${scanAttr} ${scanTerm}"
+
+    if {[catch {zwait sessionWait 600}]} {
+        wlog debug "timeout/cancel in scan"
+        displayError "Timeout in scan" {}
+        html "</body></html>\n"
+        $zz disconnect
+        return 0
+    }
+    if {$sessionWait == -1} {
+        displayError "Scan fail" "Connection closed"
+        html "</body></html>\n"
+        $zz disconnect
+    }
+    if {$sessionWait != 1} {
+       return 0
+    }
+    return 1
+}
+
+proc display-scan {setNo scanNo tno} {
+    global hist
+    global targets
+    global env
+    global sessionId
+
+    if {$tno > 0} {
+        set zz z39$tno
+    } else {
+        set zz z39
+    }
+    set zs $zz.s$scanNo.$setNo
+    set m [$zs numberOfEntriesReturned]
+        
+    if {$m > 0} {
+        set t [lindex [$zs scanLine 0] 1]
+        if {$tno > 0} {
+            set hist($setNo,$tno,[expr $scanNo - 1],scanTerm) $t
+        } else {
+            set hist($setNo,[expr $scanNo - 1],scanTerm) $t
+        }
+        set t [lindex [$zs scanLine [expr $m - 1]] 1]
+        if {$tno > 0} {
+            set hist($setNo,$tno,[expr $scanNo + 1],scanTerm) $t
+        } else {
+            set hist($setNo,[expr $scanNo + 1],scanTerm) $t
+        }
+    }
+    for {set i 0} {$i < $m} {incr i} {
+        html {<a href="http:} $env(SCRIPT_NAME)
+        html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo +
+        html $hist($setNo,scan) + [lindex [$zs scanLine $i] 1] {">}
+        html [lindex [$zs scanLine $i] 1]
+        html {</a>: <em>}
+        html [lindex [$zs scanLine $i] 2]
+        html "</em><br>\n"
+    }
+}
+
 proc z39search {setNo piggy tno elements} {
     global hist
     global sessionWait
@@ -446,9 +619,11 @@ proc z39search {setNo piggy tno elements} {
             return 0
         }
     } else {
-        if {![catch [list $zz.$setNo smallSetUpperBound 0]]} {
+        if {[info exists hist($setNo,hits)] && \
+                ![catch [list $zz.$setNo smallSetUpperBound 0]]} {
             return 1
         }
+        
     }
     ir-set $zz.$setNo $zz
     
@@ -697,7 +872,7 @@ proc z39history {} {
     if {![info exists nextSetNo]} {
         return
     }
-    html "<hr><h3>History</h3><dl>\n"
+    html "<hr><h2>History</h2><dl><br>\n"
     for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} {
         html {<dt> <a href="http:} $env(SCRIPT_NAME)
         html / $sessionId {/search.egw/} $setNo + 1
@@ -723,10 +898,12 @@ proc z39history {} {
 
 proc displayError {msga msgb} {
     html "<p><center>\n"
-    html {<img src="/gif/noway.gif">}
+    html {<img src="/gif/noway.gif" alt="Error">}
     html "<h2>" $msga "</h2>\n"
     if {$msgb != ""} {
         html "<h3>" $msgb "</h3>\n"
     }
     html "</center><p>\n"
 }
+
+set useIcons 1