/[cvs]/joko/Scripts/psh/lib/RPC/XML.pm
ViewVC logotype

Contents of /joko/Scripts/psh/lib/RPC/XML.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Fri Jun 14 21:22:11 2002 UTC (22 years, 3 months ago) by cvsjoko
Branch: nfo, MAIN
CVS Tags: r001, HEAD
Changes since 1.1: +0 -0 lines
first import

1 ###############################################################################
2 #
3 # This file copyright (c) 2001 by Randy J. Ray <rjray@blackperl.com>,
4 # all rights reserved
5 #
6 # Copying and distribution are permitted under the terms of the Artistic
7 # License as distributed with Perl versions 5.005 and later. See
8 # http://language.perl.com/misc/Artistic.html
9 #
10 ###############################################################################
11 #
12 # $Id: XML.pm,v 1.13 2002/05/22 09:43:49 rjray Exp $
13 #
14 # Description: This module provides the core XML <-> RPC conversion and
15 # structural management.
16 #
17 # Functions: This module contains many, many subclasses. Better to
18 # examine them individually.
19 #
20 # Libraries: RPC::XML::base64 uses MIME::Base64
21 #
22 # Global Consts: $VERSION
23 #
24 ###############################################################################
25
26 package RPC::XML;
27
28 use 5.005;
29 use strict;
30 use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS @ISA $VERSION $ERROR);
31 use subs qw(time2iso8601 smart_encode);
32
33 require Exporter;
34
35 @ISA = qw(Exporter);
36 @EXPORT_OK = qw(time2iso8601 smart_encode
37 RPC_BOOLEAN RPC_INT RPC_DOUBLE RPC_NIL RPC_DATETIME_ISO8601
38 RPC_DATETIME_INT RPC_BASE64 RPC_REFERENCE RPC_STRING);
39 %EXPORT_TAGS = (types => [ qw(RPC_BOOLEAN RPC_INT RPC_DOUBLE RPC_STRING
40 RPC_DATETIME_ISO8601 RPC_BASE64) ],
41 all => [ @EXPORT_OK ]);
42
43 $VERSION = do { my @r=(q$Revision: 1.13 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r };
44
45 # Global error string
46 $ERROR = '';
47
48 1;
49
50 # All of the RPC_* functions are convenience-encoders
51 sub RPC_STRING ( $ ) { RPC::XML::string->new($_[0]) }
52 sub RPC_BOOLEAN ( $ ) { RPC::XML::boolean->new($_[0]) }
53 sub RPC_INT ( $ ) { RPC::XML::int->new($_[0]) }
54 sub RPC_DOUBLE ( $ ) { RPC::XML::double->new($_[0]) }
55 sub RPC_DATETIME_ISO8601 ( $ ) { RPC::XML::datetime_iso8601->new($_[0]) }
56 sub RPC_BASE64 ( $ ) { RPC::XML::base64->new($_[0]) }
57
58 # This is a dead-simple ISO8601-from-UNIX-time stringifier. Always expresses
59 # time in UTC.
60 sub time2iso8601
61 {
62 my $time = shift;
63 my $zone = shift || '';
64
65 my @time = gmtime($time);
66 $time = sprintf("%4d%02d%02dT%02d:%02d:%02dZ",
67 $time[5] + 1900, $time[4] + 1, @time[3, 2, 1, 0]);
68 if ($zone)
69 {
70 my $char = $zone > 0 ? '+' : '-';
71 chop $time; # Lose the Z if we're specifying a zone
72 $time .= $char . sprintf('%02d:00', abs($zone));
73 }
74
75 $time;
76 }
77
78 # This is a (futile?) attempt to provide a "smart" encoding method that will
79 # take a Perl scalar and promote it to the appropriate RPC::XML::_type_.
80 sub smart_encode
81 {
82 my @values = @_;
83
84 my $type;
85
86 @values = map
87 {
88 if ($type = ref($_))
89 {
90 # Skip any that have already been encoded
91 if (UNIVERSAL::isa($_, 'RPC::XML::datatype'))
92 {
93 $type = $_;
94 }
95 elsif ($type eq 'HASH')
96 {
97 $type = RPC::XML::struct->new($_);
98 }
99 elsif ($type eq 'ARRAY')
100 {
101 $type = RPC::XML::array->new($_);
102 }
103 else
104 {
105 # ??? Don't know what else to do
106 next;
107 }
108 }
109 # You have to check ints first, because they match the next pattern too
110 elsif (/^[-+]?\d+$/)
111 {
112 $type = RPC::XML::int->new($_);
113 }
114 # Pattern taken from perldata(1)
115 elsif (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
116 {
117 $type = RPC::XML::double->new($_);
118 }
119 else
120 {
121 $type = RPC::XML::string->new($_);
122 }
123
124 $type;
125 } @values;
126
127 return (wantarray ? @values : $values[0]);
128 }
129
130 # This is a (mostly) empty class used as a common superclass for simple and
131 # complex types, so that their derivatives may be universally type-checked.
132 package RPC::XML::datatype;
133 use vars qw(@ISA);
134 @ISA = ();
135
136 sub type { my $class = ref($_[0]) || $_[0]; $class =~ s/.*://; $class }
137 sub is_fault { 0 }
138
139 ###############################################################################
140 #
141 # Package: RPC::XML::simple_type
142 #
143 # Description: A base class for the simpler type-classes to inherit from,
144 # for default constructor, stringification, etc.
145 #
146 ###############################################################################
147 package RPC::XML::simple_type;
148
149 use strict;
150 use vars qw(@ISA);
151
152 @ISA = qw(RPC::XML::datatype);
153
154 # new - a generic constructor that presumes the value being stored is scalar
155 sub new
156 {
157 my $class = shift;
158 my $value = shift;
159
160 $RPC::XML::ERROR = '';
161 $class = ref($class) || $class;
162 bless \$value, $class;
163 }
164
165 # value - a generic accessor
166 sub value
167 {
168 my $self = shift;
169
170 $$self;
171 }
172
173 # as_string - return the value as an XML snippet
174 sub as_string
175 {
176 my $self = shift;
177
178 my $class;
179 return unless ($class = ref($self));
180 $class =~ s/^.*\://;
181 $class =~ s/_/./g;
182 substr($class, 0, 8) = 'dateTime' if (substr($class, 0, 8) eq 'datetime');
183
184 "<$class>$$self</$class>";
185 }
186
187 ###############################################################################
188 #
189 # Package: RPC::XML::int
190 #
191 # Description: Data-type class for integers
192 #
193 ###############################################################################
194 package RPC::XML::int;
195
196 use strict;
197 use vars qw(@ISA);
198
199 @ISA = qw(RPC::XML::simple_type);
200
201 ###############################################################################
202 #
203 # Package: RPC::XML::i4
204 #
205 # Description: Data-type class for i4. Forces data into an int object.
206 #
207 ###############################################################################
208 package RPC::XML::i4;
209
210 use strict;
211 use vars qw(@ISA);
212
213 @ISA = qw(RPC::XML::simple_type);
214
215 ###############################################################################
216 #
217 # Package: RPC::XML::double
218 #
219 # Description: The "double" type-class
220 #
221 ###############################################################################
222 package RPC::XML::double;
223
224 use strict;
225 use vars qw(@ISA);
226
227 @ISA = qw(RPC::XML::simple_type);
228
229 ###############################################################################
230 #
231 # Package: RPC::XML::string
232 #
233 # Description: The "string" type-class
234 #
235 ###############################################################################
236 package RPC::XML::string;
237
238 use strict;
239 use vars qw(@ISA);
240
241 @ISA = qw(RPC::XML::simple_type);
242
243 # as_string - return the value as an XML snippet
244 sub as_string
245 {
246 my $self = shift;
247
248 my ($class, $value);
249
250 return unless ($class = $self->type);
251
252 ($value = $$self) =~ s/&/&amp;/g;
253 $value =~ s/</&lt;/g;
254 $value =~ s/>/&gt;/g;
255
256 "<$class>$value</$class>";
257 }
258
259 ###############################################################################
260 #
261 # Package: RPC::XML::boolean
262 #
263 # Description: The type-class for boolean data. Handles some "extra" cases
264 #
265 ###############################################################################
266 package RPC::XML::boolean;
267
268 use strict;
269 use vars qw(@ISA);
270
271 @ISA = qw(RPC::XML::simple_type);
272
273 # This constructor allows any of true, false, yes or no to be specified
274 sub new
275 {
276 my $class = shift;
277 my $value = shift || 0;
278
279 $RPC::XML::ERROR = '';
280 if ($value =~ /true|yes|1/i)
281 {
282 $value = 1;
283 }
284 elsif ($value =~ /false|no|0/i)
285 {
286 $value = 0;
287 }
288 else
289 {
290 $class = ref($class) || $class;
291 $RPC::XML::ERROR = "${class}::new: Value must be one of yes, no, " .
292 'true, false, 1, 0 (case-insensitive)';
293 return undef;
294 }
295
296 bless \$value, $class;
297 }
298
299 ###############################################################################
300 #
301 # Package: RPC::XML::datetime_iso8601
302 #
303 # Description: This is the class to manage ISO8601-style date/time values
304 #
305 ###############################################################################
306 package RPC::XML::datetime_iso8601;
307
308 use strict;
309 use vars qw(@ISA);
310
311 @ISA = qw(RPC::XML::simple_type);
312
313 sub type { 'dateTime.iso8601' };
314
315 ###############################################################################
316 #
317 # Package: RPC::XML::array
318 #
319 # Description: This class encapsulates the array data type. Each element
320 # within the array should be one of the datatype classes.
321 #
322 ###############################################################################
323 package RPC::XML::array;
324
325 use strict;
326 use vars qw(@ISA);
327
328 @ISA = qw(RPC::XML::datatype);
329
330 # The constructor for this class mainly needs to sanity-check the value data
331 sub new
332 {
333 my $class = shift;
334 my @args = (ref($_[0]) eq 'ARRAY') ? @{$_[0]} : @_;
335
336 # First ensure that each argument passed in is itself one of the data-type
337 # class instances.
338 for (@args)
339 {
340 $_ = RPC::XML::smart_encode($_)
341 unless (UNIVERSAL::isa($_, 'RPC::XML::datatype'));
342 }
343
344 bless \@args, $class;
345 }
346
347 # This became more complex once it was shown that there may be a need to fetch
348 # the value while preserving the underlying objects.
349 sub value
350 {
351 my $self = shift;
352 my $no_recurse = shift || 0;
353 my $ret;
354
355 if ($no_recurse)
356 {
357 $ret = [ @$self ];
358 }
359 else
360 {
361 $ret = [ map { $_->value } @$self ];
362 }
363
364 $ret;
365 }
366
367 sub as_string
368 {
369 my $self = shift;
370
371 join('',
372 '<array><data>',
373 (map { ('<value>', $_->as_string(), '</value>') } (@$self)),
374 '</data></array>');
375 }
376
377 ###############################################################################
378 #
379 # Package: RPC::XML::struct
380 #
381 # Description: This is the "struct" data class. The struct is like Perl's
382 # hash, with the constraint that all values are instances
383 # of the datatype classes.
384 #
385 ###############################################################################
386 package RPC::XML::struct;
387
388 use strict;
389 use vars qw(@ISA);
390
391 @ISA = qw(RPC::XML::datatype);
392
393 # The constructor for this class mainly needs to sanity-check the value data
394 sub new
395 {
396 my $class = shift;
397 my %args = (ref($_[0]) eq 'HASH') ? %{$_[0]} : @_;
398
399 # First ensure that each argument passed in is itself one of the data-type
400 # class instances.
401 for (keys %args)
402 {
403 $args{$_} = RPC::XML::smart_encode($args{$_})
404 unless (UNIVERSAL::isa($args{$_}, 'RPC::XML::datatype'));
405 }
406
407 bless \%args, $class;
408 }
409
410 # This became more complex once it was shown that there may be a need to fetch
411 # the value while preserving the underlying objects.
412 sub value
413 {
414 my $self = shift;
415 my $no_recurse = shift || 0;
416 my %value;
417
418 if ($no_recurse)
419 {
420 %value = map { $_, $self->{$_} } (keys %$self);
421 }
422 else
423 {
424 %value = map { $_, $self->{$_}->value } (keys %$self);
425 }
426
427 \%value;
428 }
429
430 sub as_string
431 {
432 my $self = shift;
433
434 join('',
435 '<struct>',
436 (map {
437 ("<member><name>$_</name><value>",
438 $self->{$_}->as_string,
439 '</value></member>')
440 } (keys %$self)),
441 '</struct>');
442 }
443
444 ###############################################################################
445 #
446 # Package: RPC::XML::base64
447 #
448 # Description: This is the base64-encoding type. Plain data is passed in,
449 # plain data is returned. Plain is always returned. All the
450 # encoding/decoding is done behind the scenes.
451 #
452 ###############################################################################
453 package RPC::XML::base64;
454
455 use strict;
456 use vars qw(@ISA);
457
458 @ISA = qw(RPC::XML::simple_type);
459
460 use MIME::Base64;
461
462 sub new
463 {
464 my ($class, $value, $encoded) = @_;
465
466 $RPC::XML::ERROR = '';
467 $value = $$value if (ref $value);
468 unless (defined $value and length $value)
469 {
470 $class = ref($class) || $class;
471 $RPC::XML::ERROR = "${class}::new: Must be called with non-null data";
472 return undef;
473 }
474 if ($encoded)
475 {
476 $value = MIME::Base64::decode_base64 $value;
477 }
478
479 bless \$value, $class;
480 }
481
482 # The value needs to be encoded before being output
483 sub as_string
484 {
485 my $self = shift;
486
487 '<base64>' . MIME::Base64::encode_base64($$self) . '</base64>';
488 }
489
490 ###############################################################################
491 #
492 # Package: RPC::XML::fault
493 #
494 # Description: This is the class that encapsulates the data for a RPC
495 # fault-response. Like the others, it takes the relevant
496 # information and maintains it internally. This is put
497 # at the end of the datum types, though it isn't really a
498 # data type in the sense that it cannot be passed in to a
499 # request. But it is separated so as to better generalize
500 # responses.
501 #
502 ###############################################################################
503 package RPC::XML::fault;
504
505 use strict;
506 use vars qw(@ISA);
507
508 @ISA = qw(RPC::XML::struct);
509
510 # For our new(), we only need to ensure that we have the two required members
511 sub new
512 {
513 my $class = shift;
514 my @args = @_;
515
516 my ($self, %args);
517
518 $RPC::XML::ERROR = '';
519 if (ref($args[0]) and UNIVERSAL::isa($args[0], 'RPC::XML::struct'))
520 {
521 # Take the keys and values from the struct object as our own
522 %args = %{$args[0]->value('shallow')};
523 }
524 elsif (@args == 2)
525 {
526 # This is a special convenience-case to make simple new() calls clearer
527 %args = (faultCode => RPC::XML::int->new($args[0]),
528 faultString => RPC::XML::string->new($args[1]));
529 }
530 else
531 {
532 %args = @args;
533 }
534
535 unless ($args{faultCode} and $args{faultString})
536 {
537 $class = ref($class) || $class;
538 $RPC::XML::ERROR = "${class}::new: Missing required struct fields";
539 return undef;
540 }
541 if (scalar(keys %args) > 2)
542 {
543 $class = ref($class) || $class;
544 $RPC::XML::ERROR = "${class}::new: Extra struct fields not allowed";
545 return undef;
546 }
547
548 $self = $class->SUPER::new(%args);
549 }
550
551 # This only differs from the display of a struct in that it has some extra
552 # wrapped around it. Let the superclass as_string method do most of the work.
553 sub as_string
554 {
555 my $self = shift;
556
557 '<fault><value>' . $self->SUPER::as_string . '</value></fault>';
558 }
559
560 # Convenience methods:
561 sub code { $_[0]->{faultCode}->value }
562 sub string { $_[0]->{faultString}->value }
563
564 # This is the only one to override this method, for obvious reasons
565 sub is_fault { 1 }
566
567 ###############################################################################
568 #
569 # Package: RPC::XML::request
570 #
571 # Description: This is the class that encapsulates the data for a RPC
572 # request. It takes the relevant information and maintains
573 # it internally until asked to stringify. Only then is the
574 # XML generated, encoding checked, etc. This allows for
575 # late-selection of <methodCall> or <methodCallSet> as a
576 # containing tag.
577 #
578 # This class really only needs a constructor and a method
579 # to stringify.
580 #
581 ###############################################################################
582 package RPC::XML::request;
583
584 use strict;
585 use vars qw(@ISA);
586
587 ###############################################################################
588 #
589 # Sub Name: new
590 #
591 # Description: Creating a new request object, in this (reference) case,
592 # means checking the list of arguments for sanity and
593 # packaging it up for later use.
594 #
595 # Arguments: NAME IN/OUT TYPE DESCRIPTION
596 # $class in scalar Class/ref to bless into
597 # @argz in list The exact disposition of the
598 # arguments is based on the
599 # type of the various elements
600 #
601 # Returns: Success: object ref
602 # Failure: undef, error in $RPC::XML::ERROR
603 #
604 ###############################################################################
605 sub new
606 {
607 my $class = shift;
608 my @argz = @_;
609
610 my ($self, $name);
611
612 $class = ref($class) || $class;
613 $RPC::XML::ERROR = '';
614
615 unless (@argz)
616 {
617 $RPC::XML::ERROR = 'RPC::XML::request::new: At least a method name ' .
618 'must be specified';
619 return undef;
620 }
621
622 if (UNIVERSAL::isa($argz[0], 'RPC::XML::request'))
623 {
624 # Maybe this will be a clone operation
625 }
626 else
627 {
628 # This is the method name to be called
629 $name = shift(@argz);
630 # All the remaining args must be data.
631 @argz = RPC::XML::smart_encode(@argz);
632 $self = { args => [ @argz ], name => $name };
633 bless $self, $class;
634 }
635
636 $self;
637 }
638
639 # Accessor methods
640 sub name { shift->{name} }
641 sub args { shift->{args} || [] }
642
643 ###############################################################################
644 #
645 # Sub Name: as_string
646 #
647 # Description: This is a fair bit more complex than the simple as_string
648 # methods for the datatypes. Express the invoking object as
649 # a well-formed XML document.
650 #
651 # Arguments: NAME IN/OUT TYPE DESCRIPTION
652 # $self in ref Invoking object
653 # $indent in scalar Indention level for output
654 #
655 # Returns: Success: text
656 # Failure: undef
657 #
658 ###############################################################################
659 sub as_string
660 {
661 my $self = shift;
662
663 my $text;
664
665 $RPC::XML::ERROR = '';
666
667 $text = qq(<?xml version="1.0"?>\n);
668
669 $text .= "<methodCall><methodName>$self->{name}</methodName><params>";
670 for (@{$self->{args}})
671 {
672 $text .= '<param><value>' . $_->as_string . '</value></param>';
673 }
674 $text .= '</params></methodCall>';
675
676 $text;
677 }
678
679 ###############################################################################
680 #
681 # Package: RPC::XML::response
682 #
683 # Description: This is the class that encapsulates the data for a RPC
684 # response. As above, it takes the information and maintains
685 # it internally until asked to stringify. Only then is the
686 # XML generated, encoding checked, etc. This allows for
687 # late-selection of <methodResponse> or <methodResponseSet>
688 # as above.
689 #
690 ###############################################################################
691 package RPC::XML::response;
692
693 use strict;
694 use vars qw(@ISA);
695
696 ###############################################################################
697 #
698 # Sub Name: new
699 #
700 # Description: Creating a new response object, in this (reference) case,
701 # means checking the outgoing parameter(s) for sanity.
702 #
703 # Arguments: NAME IN/OUT TYPE DESCRIPTION
704 # $class in scalar Class/ref to bless into
705 # @argz in list The exact disposition of the
706 # arguments is based on the
707 # type of the various elements
708 #
709 # Returns: Success: object ref
710 # Failure: undef, error in $RPC::XML::ERROR
711 #
712 ###############################################################################
713 sub new
714 {
715 my $class = shift;
716 my @argz = @_;
717
718 my ($self, %extra, %attr);
719
720 $class = ref($class) || $class;
721
722 $RPC::XML::ERROR = '';
723 if (! @argz)
724 {
725 $RPC::XML::ERROR = 'RPC::XML::response::new: One of a datatype, ' .
726 'value or a fault object must be specified';
727 }
728 elsif (UNIVERSAL::isa($argz[0], 'RPC::XML::response'))
729 {
730 # This will eventually be a clone-operation. For now, just return in
731 $self = $argz[0];
732 }
733 elsif (@argz > 1)
734 {
735 $RPC::XML::ERROR = 'RPC::XML::response::new: Responses may take ' .
736 'only one argument';
737 }
738 else
739 {
740 $argz[0] = RPC::XML::smart_encode($argz[0]);
741
742 $self = { value => $argz[0] };
743 bless $self, $class;
744 }
745
746 $self;
747 }
748
749 # Accessor/status methods
750 sub value { $_[0]->{value} }
751 sub is_fault { $_[0]->{value}->is_fault }
752
753 ###############################################################################
754 #
755 # Sub Name: as_string
756 #
757 # Description: This is a fair bit more complex than the simple as_string
758 # methods for the datatypes. Express the invoking object as
759 # a well-formed XML document.
760 #
761 # Arguments: NAME IN/OUT TYPE DESCRIPTION
762 # $self in ref Invoking object
763 # $indent in scalar Indention level for output
764 #
765 # Returns: Success: text
766 # Failure: undef
767 #
768 ###############################################################################
769 sub as_string
770 {
771 my $self = shift;
772
773 my $text;
774
775 $RPC::XML::ERROR = '';
776
777 $text = qq(<?xml version="1.0"?>\n);
778
779 $text .= '<methodResponse>';
780 if ($self->{value}->isa('RPC::XML::fault'))
781 {
782 $text .= $self->{value}->as_string;
783 }
784 else
785 {
786 $text .= '<params><param><value>' . $self->{value}->as_string .
787 '</value></param></params>';
788 }
789 $text .= '</methodResponse>';
790
791 $text;
792 }
793
794
795 __END__
796
797 =head1 NAME
798
799 RPC::XML - A set of classes for core data, message and XML handling
800
801 =head1 SYNOPSIS
802
803 use RPC::XML;
804
805 $req = RPC::XML::request->new('fetch_prime_factors',
806 RPC::XML::int->new(985120528));
807 ...
808 $resp = RPC::XML::Parser->new()->parse(STREAM);
809 if (ref($resp))
810 {
811 return $resp->value->value;
812 }
813 else
814 {
815 die $resp;
816 }
817
818 =head1 DESCRIPTION
819
820 The B<RPC::XML> package is a reference implementation of the XML-RPC
821 standard. As a reference implementation, it is geared more towards clarity and
822 readability than efficiency.
823
824 The package provides a set of classes for creating values to pass to the
825 constructors for requests and responses. These are lightweight objects, most
826 of which are implemented as tied scalars so as to associate specific type
827 information with the value. Classes are also provided for requests, responses,
828 faults (errors) and a parser based on the L<XML::Parser> package from CPAN.
829
830 This module does not actually provide any transport implementation or
831 server basis. For these, see L<RPC::XML::Client> and L<RPC::XML::Server>,
832 respectively.
833
834 =head1 EXPORTABLE FUNCTIONS
835
836 At present, only two functions are available for import. They must be
837 explicitly imported as part of the C<use> statement, or with a direct call to
838 C<import>:
839
840 =over 4
841
842 =item time2iso8601($time)
843
844 Convert the integer time value in C<$time> to a ISO 8601 string in the UTC
845 time zone. This is a convenience function for occassions when the return value
846 needs to be of the B<dateTime.iso8601> type, but the value on hand is the
847 return from the C<time> built-in.
848
849 =item smart_encode(@args)
850
851 Converts the passed-in arguments to datatype objects. Any that are already
852 encoded as such are passed through unchanged. The routine is called recursively
853 on hash and array references. Note that this routine can only deduce a certain
854 degree of detail about the values passed. Boolean values will be wrongly
855 encoded as integers. Pretty much anything not specifically recognizable will
856 get encoded as a string object. Thus, for types such as C<fault>, the ISO
857 time value, base-64 data, etc., the program must still explicitly encode it.
858 However, this routine will hopefully simplify things a little bit for a
859 majority of the usage cases.
860
861 =back
862
863 =head1 CLASSES
864
865 The classes provided by this module are broken into two groups: I<datatype>
866 classes and I<message> classes.
867
868 =head2 Data Classes
869
870 The following data classes are provided by this library. Each of these provide
871 at least C<new>, C<value>, C<as_string> and C<is_fault> methods. Note that
872 these classes are designed to create throw-away objects. There is currently no
873 mechanism for changing the value stored within one of these object after the
874 constructor returns. It is assumed that a new object would be created,
875 instead.
876
877 The C<new> methods are constructors, C<value> returns the value stored within
878 the object (processed recursively for arrays and structs), and C<as_string>
879 stringifies the object as a chunk of XML. The C<is_fault> method always
880 returns a false value (0), except when the object itself is of type
881 B<RPC::XML::fault>. In that case, the return value is true (1). indention
882 level which is applied as a base indention for output. Other arguments are
883 specified with the classes.
884
885 =over 4
886
887 =item RPC::XML::int
888
889 Creates an integer value. Constructor expects the integer value as an
890 argument.
891
892 =item RPC::XML::i4
893
894 This is like the C<int> class.
895
896 =item RPC::XML::double
897
898 Creates a floating-point value.
899
900 =item RPC::XML::string
901
902 Creates an arbitrary string. No special encoding is done to the string (aside
903 from XML document encoding, covered later) with the exception of the C<E<lt>>,
904 C<E<gt>> and C<&> characters, which are XML-escaped during object creation,
905 and then reverted when the C<value> method is called.
906
907 =item RPC::XML::boolean
908
909 Creates a boolean value. The value returned will always be either of B<1>
910 or B<0>, for true or false, respectively. When calling the constructor, the
911 program may specify any of: C<0>, C<no>, C<false>, C<1>, C<yes>, C<true>.
912
913 =item RPC::XML::datetime_iso8601
914
915 Creates an instance of the XML-RPC C<dateTime.iso8601> type. The specification
916 for ISO 8601 may be found elsewhere. No processing is done to the data.
917
918 =item RPC::XML::base64
919
920 Creates an object that encapsulates a chunk of data that will be treated as
921 base-64 for transport purposes. The value may be passed in as either a string
922 or as a scalar reference. Additionally, a second (optional) parameter may be
923 passed, that if true identifies the data as already base-64 encoded. If so,
924 the data is decoded before storage. The C<value> method returns decoded data,
925 and the C<as_string> method encodes it before stringification.
926
927 =item RPC::XML::array
928
929 Creates an array object. The constructor takes zero or more data-type
930 instances as arguments, which are inserted into the array in the order
931 specified. C<value> returns an array reference of native Perl types. If a
932 non-null value is passed as an argument to C<value()>, then the array
933 reference will contain the datatype objects (a shallow copy rather than a deep
934 one).
935
936 =item RPC::XML::struct
937
938 Creates a struct object, the analogy of a hash table in Perl. The keys are
939 ordinary strings, and the values must all be data-type objects. The C<value>
940 method returns a hash table reference, with native Perl types in the values.
941 Key order is not preserved. Key strings are not encoded for special XML
942 characters, so the use of such (C<E<lt>>, C<E<gt>>, etc.) is discouraged. If a
943 non-null value is passed as an argument to C<value()>, then the hash
944 reference will contain the datatype objects (a shallow copy rather than a deep
945 one).
946
947 =item RPC::XML::fault
948
949 A fault object is a special case of the struct object that checks to ensure
950 that there are two keys, C<faultCode> and C<faultString>.
951
952 As a matter of convenience, since the contents of a B<RPC::XML::fault>
953 structure are specifically defined, the constructor may be called with exactly
954 two arguments, the first of which will be taken as the code, and the second
955 as the string. They will be converted to RPC::XML types automatically and
956 stored by the pre-defined key names.
957
958 Also as a matter of convenience, the fault class provides the following
959 accessor methods for directly retrieving the integer code and error string
960 from a fault object:
961
962 =over 4
963
964 =item code
965
966 =item string
967
968 =back
969
970 Both names should be self-explanatory. The values returned are Perl values,
971 not B<RPC::XML> class instances.
972
973 =back
974
975 =head2 Message Classes
976
977 The message classes are used both for constructing messages for outgoing
978 communication as well as representing the parsed contents of a received
979 message. Both implement the following methods:
980
981 =over 4
982
983 =item new
984
985 This is the constructor method for the two message classes. The response class
986 may have only a single value (as a response is currently limited to a single
987 return value), and requests may have as many arguments as appropriate. In both
988 cases, the arguments are passed to the exported C<smart_encode> routine
989 described earlier.
990
991 =item as_string
992
993 Returns the message object expressed as an XML document. The document will be
994 lacking in linebreaks and indention, as it is not targeted for human reading.
995
996 =back
997
998 The two message-object classes are:
999
1000 =over 4
1001
1002 =item RPC::XML::request
1003
1004 This creates a request object. A request object expects the first argument to
1005 be the name of the remote routine being called, and all remaining arguments
1006 are the arguments to that routine. Request objects have the following methods
1007 (besides C<new> and C<as_string>):
1008
1009 =over 4
1010
1011 =item name
1012
1013 The name of the remote routine that the request will call.
1014
1015 =item args
1016
1017 Returns a list reference with the arguments that will be passed. No arguments
1018 will result in a reference to an empty list.
1019
1020 =back
1021
1022 =item RPC::XML::response
1023
1024 The response object is much like the request object in most ways. They may
1025 take only one argument, as that is all the specification allows for in a
1026 response. Responses have the following methods (in addition to C<new> and
1027 C<as_string>):
1028
1029 =over 4
1030
1031 =item value
1032
1033 The value the response is returning. It will be a RPC::XML data-type.
1034
1035 =item is_fault
1036
1037 A boolean test whether or not the response is signalling a fault. This is
1038 the same as taking the C<value> method return value and testing it, but is
1039 provided for clarity and simplicity.
1040
1041 =back
1042
1043 =back
1044
1045 =head1 DIAGNOSTICS
1046
1047 All constructors return C<undef> upon failure, with the error message available
1048 in the package-global variable B<C<$RPC::XML::ERROR>>.
1049
1050 =head1 CAVEATS
1051
1052 This began as a reference implementation in which clarity of process and
1053 readability of the code took precedence over general efficiency. It is now
1054 being maintained as production code, but may still have parts that could be
1055 written more efficiently.
1056
1057 =head1 CREDITS
1058
1059 The B<XML-RPC> standard is Copyright (c) 1998-2001, UserLand Software, Inc.
1060 See <http://www.xmlrpc.com> for more information about the B<XML-RPC>
1061 specification.
1062
1063 =head1 LICENSE
1064
1065 This module is licensed under the terms of the Artistic License that covers
1066 Perl. See <http://language.perl.com/misc/Artistic.html> for the
1067 license itself.
1068
1069 =head1 SEE ALSO
1070
1071 L<RPC::XML::Client>, L<RPC::XML::Server>, L<RPC::XML::Parser>, L<XML::Parser>
1072
1073 =head1 AUTHOR
1074
1075 Randy J. Ray <rjray@blackperl.com>
1076
1077 =cut

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed