+sub rfid_borrower {
+ my $hash = shift;
+ if ( my $json = $rfid_sid_cache->{ $hash->{sid} } ) {
+ return $json;
+ }
+ my $ua = LWP::UserAgent->new;
+ my $url = URI->new( $koha_url . '/cgi-bin/koha/ffzg/rfid/borrower.pl');
+ $url->query_form(
+ RFID_SID => $hash->{sid}
+ , OIB => $hash->{OIB}
+ , JMBAG => $hash->{JMBAG}
+ );
+ warn "GET ",$url->as_string;
+ my $response = $ua->get($url);
+ if ( $response->is_success ) {
+ my $json = decode_json $response->decoded_content;
+ $rfid_sid_cache->{ $hash->{sid} } = $json;
+ return $json;
+ } else {
+ warn "ERROR ", $response->status_line;
+ }
+}
+
+
+sub sip2_socket {
+
+ return $sip2->{sock} if exists $sip2->{sock} && $sip2->{sock}->connected;
+
+ if ( my $server = $sip2->{server} ) {
+ my $sock = $sip2->{sock} = IO::Socket::INET->new( $server ) || die "can't connect to $server: $!";
+ warn "SIP2 server ", $sock->peerhost, ":", $sock->peerport, "\n";
+
+ # login
+ if ( sip2_message("9300CN$sip2->{user}|CO$sip2->{password}|")->{fixed} !~ m/^941/ ) {
+ die "SIP2 login failed";
+ }
+
+ }
+ return $sip2->{sock};
+}
+
+sub sip2_message {
+ my $send = shift;
+
+ my $retry = 0;
+
+send_again:
+ my $sock = sip2_socket || die "no sip2 socket";
+
+ local $/ = "\r";
+
+ $send .= "\r" unless $send =~ m/\r$/;
+ $send .= "\n" unless $send =~ m/\n$/;
+
+ warn "SIP2 >>>> ",dump($send), "\n";
+ print $sock $send;
+ $sock->flush;
+
+ my $expect = substr($send,0,2) | 0x01;
+
+ my $in = <$sock>;
+ warn "SIP2 <<<< ",dump($in), "\n";
+
+ $in =~ s/^\n//;
+ $in =~ s/\r$//;
+
+ if ( ! $in ) {
+ $retry++;
+ warn "empty read from SIP server, retry: $retry\n";
+ if ( $retry < 10 ) {
+ close( $sip2->{sock} );
+ goto send_again;
+ }
+ die "aborted";
+ }
+
+
+ die "expected $expect" unless substr($in,0,2) != $expect;
+
+ my $hash;
+ if ( $in =~ s/^([0-9\s]+)// ) {
+ $hash->{fixed} = $1;
+ }
+ foreach ( split(/\|/, $in ) ) {
+ my ( $f, $v ) = ( $1, $2 ) if m/([A-Z]{2})(.+)/;
+ $hash->{$f} = decode('utf-8',$v);
+ }
+
+ warn "# sip2 hash response ",dump($hash);
+
+ return $hash;
+}