]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/SOAP.pm
use data walk and encode to only hand out utf8 octets in SOAP
[debbugs.git] / Debbugs / SOAP.pm
index 6b80dae45962c925a02c2a103826841efb7e8e59..66de901d0787796741a0e136cb66bfa431d05737 100644 (file)
@@ -42,11 +42,14 @@ BEGIN{
 use IO::File;
 use Debbugs::Status qw(get_bug_status);
 use Debbugs::Common qw(make_list getbuglocation getbugcomponent);
+use Debbugs::Packages;
+use Data::Walk;
+use Encode qw(encode_utf8);
 use Storable qw(nstore retrieve);
 use Scalar::Util qw(looks_like_number);
 
 
-our $CURRENT_VERSION = 1;
+our $CURRENT_VERSION = 2;
 
 =head2 get_usertag
 
@@ -74,7 +77,7 @@ sub get_usertag {
               delete $ut{$tag} unless exists $tags{$tag};
          }
      }
-     return \%ut;
+     return encode_utf8_structure(\%ut);
 }
 
 
@@ -127,6 +130,8 @@ sub get_status {
          my $bug_status;
          if (ref($bug)) {
               my %param = __collapse_params(@{$bug});
+              next unless defined $param{bug};
+              $bug = $param{bug};
               $bug_status = get_bug_status(map {(exists $param{$_})?($_,$param{$_}):()}
                                            qw(bug dist arch bugusertags sourceversions version indicatesource)
                                           );
@@ -139,7 +144,7 @@ sub get_status {
          }
      }
 #     __prepare_response($self);
-     return \%status;
+     return encode_utf8_structure(\%status);
 }
 
 =head2 get_bugs
@@ -169,7 +174,7 @@ sub get_bugs{
      my %params = __collapse_params(@params);
      my @bugs;
      @bugs = Debbugs::Bugs::get_bugs(%params);
-     return \@bugs;
+     return encode_utf8_structure(\@bugs);
 }
 
 =head2 newest_bugs
@@ -185,7 +190,7 @@ sub newest_bugs{
      my $VERSION = __populate_version(pop);
      my ($self,$num) = @_;
      my $newest_bug = Debbugs::Bugs::newest_bug();
-     return [($newest_bug - $num + 1) .. $newest_bug];
+     return encode_utf8_structure([($newest_bug - $num + 1) .. $newest_bug]);
 
 }
 
@@ -222,13 +227,7 @@ sub get_bug_log{
      my $VERSION = __populate_version(pop);
      my ($self,$bug,$msg_num) = @_;
 
-     my $location = getbuglocation($bug,'log');
-     my $bug_log = getbugcomponent($bug,'log',$location);
-
-     my $log_fh = IO::File->new($bug_log, 'r') or
-         die "Unable to open bug log $bug_log for reading: $!";
-
-     my $log = Debbugs::Log->new($log_fh) or
+     my $log = Debbugs::Log->new(bug_num => $bug) or
          die "Debbugs::Log was unable to be initialized";
 
      my %seen_msg_ids;
@@ -252,7 +251,7 @@ sub get_bug_log{
                          msg_num => $current_msg,
                         };
      }
-     return \@messages;
+     return encode_utf8_structure(\@messages);
 }
 
 =head2 binary_to_source
@@ -265,14 +264,28 @@ architecture. If undef is passed as the architecture, returns a list
 of references to all possible pairs of source package names and
 versions for all architectures, with any duplicates removed.
 
-(This function corresponds to L<Debbugs::Packages::binarytosource>)
+As of comaptibility version 2, this has changed to use the more
+powerful binary_to_source routine, which allows returning source only,
+concatenated scalars, and other useful features.
+
+See the documentation of L<Debbugs::Packages::binary_to_source> for
+details.
 
 =cut
 
 sub binary_to_source{
      my $VERSION = __populate_version(pop);
+     my ($self,@params) = @_;
 
-     return [binarytosource(@_)];
+     if ($VERSION <= 1) {
+        return encode_utf8_structure([Debbugs::Packages::binary_to_source(binary => $params[0],
+                                                    (@params > 1)?(version => $params[1]):(),
+                                                    (@params > 2)?(arch    => $params[2]):(),
+                                                   )]);
+     }
+     else {
+        return encode_utf8_structure([Debbugs::Packages::binary_to_source(@params)]);
+     }
 }
 
 =head2 source_to_binary
@@ -291,8 +304,9 @@ architecture is not returned.
 
 sub source_to_binary {
      my $VERSION = __populate_version(pop);
+     my ($self,@params) = @_;
 
-     return [source_to_binary(@_)];
+     return encode_utf8_structure([Debbugs::Packages::sourcetobinary(@params)]);
 }
 
 =head2 get_versions
@@ -335,8 +349,9 @@ This function correponds to L<Debbugs::Packages::get_versions>
 
 sub get_versions{
      my $VERSION = __populate_version(pop);
+     my ($self,@params) = @_;
 
-     return scalar get_versions(@_);
+     return encode_utf8_structure(scalar Debbugs::Packages::get_versions(@params));
 }
 
 =head1 VERSION COMPATIBILITY
@@ -374,6 +389,14 @@ sub __collapse_params{
      return %params;
 }
 
+sub encode_utf8_structure {
+    return walk \&__encode_utf8, @_;
+}
+
+sub __encode_utf8 {
+    $_ = encode_utf8($_) unless ref $_ or not is_utf8($_);
+}
+
 
 1;