SOAP
view release on metacpan or search on metacpan
lib/SOAP/Envelope.pm view on Meta::CPAN
########################################################################
# constructor
########################################################################
sub new {
my ($class, $print_fcn, $namespace_uris_to_preload, $type_mapper) = @_;
$type_mapper ||= SOAP::TypeMapper->defaultMapper();
my $self = {
print_fcn => $print_fcn || \&__default_print_fcn,
use_namespaces => 1,
header_count => 0,
soap_prefix => '',
cur_id => 0,
packager => undef,
type_mapper => $type_mapper,
};
bless $self, $class;
#
# calculating $self->{soap_prefix} should be done VERY EARLY
# because lots of objects (like the packager I create below)
# copies this value for their own use...
#
my $attrs = '';
if ($self->{use_namespaces}) {
$self->{soap_prefix} = $soap_prefix . ':';
$attrs .= $self->_preload_ns($soap_namespace, $soap_prefix);
$attrs .= $self->_preload_ns($xsd_namespace, $xsd_prefix);
$attrs .= $self->_preload_ns($xsi_namespace, $xsi_prefix);
}
$self->{packager} = $self->_create_new_packager();
if ($namespace_uris_to_preload) {
foreach my $uri (@$namespace_uris_to_preload) {
$attrs .= $self->_preload_ns($uri);
}
}
my $sp = $self->{soap_prefix};
$attrs .= qq[ $sp$soap_encoding_style="$soap_section5_encoding"];
$self->_print(qq[<$sp$soap_envelope$attrs>]);
$self;
}
sub header {
my ($self, $accessor_uri, $accessor_name,
$typeuri, $typename,
$must_understand, $is_package, $object) = @_;
my $sp = $self->{soap_prefix};
my $header_number = ++$self->{header_count};
if (1 == $header_number) {
#
# this is the first header, so print the SOAP::Header tag to
# delimit the headers
#
$self->_print(qq[<$sp$soap_header>]);
}
my $tag;
my $attrs = '';
if (defined $accessor_name) {
my $nsprefix = '';
if (defined $accessor_uri) {
(my $nsdecl, $nsprefix) = $self->_get_ns_decl_and_prefix($accessor_uri);
$attrs .= $nsdecl if $nsdecl;
}
$tag = qq[$nsprefix$accessor_name];
}
else {
$tag = qq[header$header_number];
}
if (defined $typename) {
my $nsprefix = '';
if (defined $typeuri) {
(my $nsdecl, $nsprefix) = $self->_get_ns_decl_and_prefix($typeuri);
$attrs .= $nsdecl if $nsdecl;
}
$attrs .= qq[ $xsi_prefix:type="${nsprefix}$typename"];
}
if ($must_understand) {
$attrs .= qq[ $sp$soap_must_understand="1"];
}
my $already_marshaled = 0;
my $packager = $self->{packager};
if ($object) {
#
# by passing in this optional parameter,
# the header may be used as a multi-reference root
#
my $id = $packager->is_registered($object);
if ($id) {
$attrs .= qq[ $soap_href="#$id"];
$already_marshaled = 1;
}
else {
$id = $packager->register($self, $object, 1);
$attrs .= qq[ $soap_id="$id"];
}
$attrs .= qq[ $sp$soap_root_with_id="1"];
}
if (!$already_marshaled && $is_package) {
$attrs .= qq[ $sp$soap_package="1"];
}
$self->_print(qq[<$tag$attrs>]);
my $stream = undef;
if ($already_marshaled) {
$self->_print(qq[</$tag>]);
}
( run in 2.032 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )