Define and honor repeatable fields, such as /hold items/ in a patron info response collab/miker/client-capabilities
authorMike Rylander <mrylander@gmail.com>
Tue, 5 Jun 2012 15:55:47 +0000 (11:55 -0400)
committerMike Rylander <mrylander@gmail.com>
Tue, 5 Jun 2012 15:55:47 +0000 (11:55 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Sip/MsgType.pm

index c308a4e..7809f9f 100644 (file)
@@ -221,6 +221,26 @@ my %handlers = (
                        }
                    }
                },
+               (PATRON_INFO_RESP) => {
+                   name => "Patron Info Response",
+                   protocol => {
+                       2 => {
+                           template => "A14A3A18A4A4A4A4A4A4",
+                           template_len => 59,
+                           fields => [(FID_INST_ID), (FID_PATRON_ID),
+                                      (FID_PERSONAL_NAME), (FID_HOLD_ITEMS),
+                                      (FID_VALID_PATRON), (FID_VALID_PATRON_PWD),
+                                      (FID_CURRENCY), (FID_HOME_ADDR),
+                                      (FID_FEE_TYPE), (FID_FEE_AMT),
+                                      (FID_HOLD_ITEMS), (FID_OVERDUE_ITEMS),
+                                      (FID_CHARGED_ITEMS), (FID_FINE_ITEMS),
+                                      (FID_UNAVAILABLE_HOLD_ITEMS),(FID_RECALL_ITEMS)],
+                           repeatable => [(FID_HOLD_ITEMS), (FID_OVERDUE_ITEMS),
+                                      (FID_CHARGED_ITEMS), (FID_FINE_ITEMS),
+                                      (FID_UNAVAILABLE_HOLD_ITEMS),(FID_RECALL_ITEMS)],
+                       }
+                   }
+               },
                (END_PATRON_SESSION) => {
                    name => "End Patron Session",
                    handler => \&handle_end_patron_session,
@@ -338,6 +358,11 @@ sub _handler_fixup {
                $handlers{$i}->{protocol}->{2} = $handlers{$i}->{protocol}->{1};
        }
 
+    for my $proto ( 1 .. 2 ) {
+           $handlers{$i}->{protocol}->{$proto2}->{repeatable} = []
+           if (!exists($handlers{$i}->{protocol}->{$proto}->{repeatable}));
+    }
+
        $handlers{$i}->{handler} ||= \&stub_handler
 }
 
@@ -435,9 +460,14 @@ sub _initialize {
                   "Unsupported field '%s' in %s message '%s'",
                   $fn, $self->{name}, $msg);
        } elsif (defined($self->{fields}->{$fn})) {
-           syslog("LOG_WARNING",
-                  "Duplicate field '%s' (previous value '%s') in %s message '%s'",
-                  $fn, $self->{fields}->{$fn}, $self->{name}, $msg);
+               if (grep /$fn/ @{$proto->{repeatable}}) {
+                       $self->{fields}->{$fn} = [$self->{fields}->{$fn}] if (!ref($self->{fields}->{$fn}));
+                       push @{ $self->{fields}->{$fn} }, substr($field, 2);
+               } else {
+                       syslog("LOG_WARNING",
+                          "Duplicate field '%s' (previous value '%s') in %s message '%s'",
+                          $fn, $self->{fields}->{$fn}, $self->{name}, $msg);
+               }
        } else {
            $self->{fields}->{$fn} = substr($field, 2);
        }