/usr/local/CPAN/CORBA-Python/CORBA/Python/ClassVisitor.pm
#
# Interface Definition Language (OMG IDL CORBA v3.0)
#
# Python Language Mapping Specification, Version 1.2 November 2002
#
package CORBA::Python::ClassVisitor;
use strict;
use warnings;
our $VERSION = '2.66';
use File::Basename;
use IO::File;
use File::Path;
use POSIX qw(ctime);
# needs $node->{py_name} $node->{py_literal}
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless $self, $class;
my ($parser) = @_;
$self->{srcname} = $parser->YYData->{srcname};
$self->{srcname_size} = $parser->YYData->{srcname_size};
$self->{srcname_mtime} = $parser->YYData->{srcname_mtime};
$self->{symbtab} = $parser->YYData->{symbtab};
if (exists $parser->YYData->{opt_J}) {
$self->{base_package} = $parser->YYData->{opt_J};
}
else {
$self->{base_package} = q{};
}
$self->{done_hash} = {};
$self->{marshal} = 1;
$self->{stringify} = 1;
$self->{compare} = 1;
$self->{id} = 1;
$self->{old_object} = exists $parser->YYData->{opt_O};
$self->{indent} = q{};
$self->{out} = undef;
$self->{import} = "import PyIDL as CORBA\n"
. "\n";
$self->{import_substitution} = {};
return $self;
}
sub open_stream {
my $self = shift;
my ($filename, $node, $doc_string) = @_;
my $dirname = dirname($filename);
if ($dirname ne '.') {
unless (-d $dirname) {
mkpath($dirname)
or die "can't create $dirname ($!).\n";
}
}
my $py_module = $filename;
$py_module =~ s/\.py$//;
$py_module =~ s/\//\./g;
$self->{module} = $py_module;
$self->{out} = new IO::File "> $filename"
or die "can't open $filename ($!).\n";
$self->{filename} = $filename;
my $FH = $self->{out};
print $FH "# ex: set ro:\n";
print $FH "# This file was generated (by ",basename($0),"). DO NOT modify it.\n";
print $FH "# From file : ",$self->{srcname},", ",$self->{srcname_size}," octets, ",POSIX::ctime($self->{srcname_mtime});
print $FH "\n";
if (defined $doc_string) {
print $FH $doc_string,"\n";
print $FH "\n";
}
print $FH $self->{import};
foreach my $name (sort keys %{$node->{py_import}}) {
if ($name eq '::CORBA') {
print $FH "import PyIDL as CORBA\n";
next;
}
if ($name eq '::IOP') {
print $FH "import PyIDL.iop as IOP\n";
next;
}
if ($name eq '::GIOP') {
print $FH "import PyIDL.giop as GIOP\n";
next;
}
if ( $name eq '::' or $name eq q{} ) {
if ($self->{base_package}) {
if (exists $self->{server}) {
$name = $self->{base_package} . '_skel';
}
else {
$name = $self->{base_package};
}
$name =~ s/\//\./g;
}
else {
my $basename = basename($self->{srcname}, '.idl');
$basename =~ s/\./_/g;
if (exists $self->{server}) {
$name = '_' . $basename . '_skel';
}
else {
$name = '_' . $basename;
}
}
}
else {
$name =~ s/^:://;
if (exists $self->{server}) {
$name =~ s/::/_skel\./g;
$name .= '_skel';
}
else {
$name =~ s/::/\./g;
}
if ($self->{base_package}) {
my $full_import_name = $self->{base_package} . '.' . $name;
$full_import_name =~ s/\//\./g;
$self->{import_substitution}->{$name} = $full_import_name;
$name = $full_import_name;
}
}
print $FH "import ",$name,"\n";
}
print $FH "\n";
}
sub _get_defn {
my $self = shift;
my $defn = shift;
if (ref $defn) {
return $defn;
}
else {
return $self->{symbtab}->Lookup($defn);
}
}
sub _get_scoped_name {
my $self = shift;
my ($node, $scope, $flag) = @_;
my $scope_full = $scope->{full};
$scope_full =~ s/::[0-9A-Z_a-z]+$//;
my $name = $node->{full};
if ($name eq $scope_full) {
$name = $node->{py_name};
}
elsif ($name =~ /^::[0-9A-Z_a-z]+$/) {
if ($scope_full) {
my $basename = basename($self->{srcname}, '.idl');
$basename =~ s/\./_/g;
if (exists $self->{server}) {
$name = '_' . $basename . '_skel.' . $node->{py_name};
}
else {
$name = '_' . $basename . '.' . $node->{py_name};
}
}
else {
$name = $node->{py_name};
}
}
else {
if ($scope_full) {
my $defn = $self->{symbtab}->Lookup($scope_full);
while (!$defn->isa('Modules') and !$flag) {
$scope_full =~ s/::[0-9A-Z_a-z]+$//;
last unless ($scope_full);
$defn = $self->{symbtab}->Lookup($scope_full);
}
$name =~ s/^$scope_full//;
$name =~ s/^:://;
if (exists $self->{server}) {
$name =~ s/::/_skel\./;
}
$name =~ s/::/\./g;
if ($self->{base_package}) {
my $import_name = $name;
$import_name =~ s/\.[0-9A-Z_a-z]+$//;
if (exists $self->{import_substitution}->{$import_name}) {
$name =~ s/$import_name/$self->{import_substitution}->{$import_name}/;
}
}
}
else {
my $name2 = $node->{py_name};
$name =~ s/::[0-9A-Z_a-z]+$//;
while ($name) {
my $defn = $self->{symbtab}->Lookup($name);
if ($defn->isa('Interface') and exists $self->{server}) {
$name2 = $defn->{py_name} . '_skel.' . $name2;
}
else {
$name2 = $defn->{py_name} . '.' . $name2;
}
$name =~ s/::[0-9A-Z_a-z]+$//;
}
$name = $name2;
}
}
return $name;
}
sub _setup_py {
my $self = shift;
my $filename = (exists $self->{server}) ? 'setup_skel.py' : 'setup.py';
open my $FH, '>', $filename
or die "can't open $filename ($!).\n";
print $FH "# This file was generated (by ",basename($0),"). DO NOT modify it.\n";
print $FH "# From file : ",$self->{srcname},", ",$self->{srcname_size}," octets, ",POSIX::ctime($self->{srcname_mtime});
print $FH "\n";
print $FH "from distutils.core import setup\n";
print $FH "\n";
print $FH "setup(\n";
print $FH " name = '",$self->{setup_name},"',\n";
print $FH " py_modules = [ '",$self->{setup_py_modules},"' ],\n"
if ($self->{setup_py_modules});
print $FH " packages = [ '",join("', '", @{$self->{setup_packages}}),"' ],\n"
if (scalar @{$self->{setup_packages}});
print $FH ")\n";
print $FH "\n";
close $FH;
}
sub empty_modules {
my $self = shift;
return unless ($self->{base_package});
my $dirname = $self->{base_package};
unless (-d $dirname) {
mkpath($dirname)
or die "can't create $dirname ($!).\n";
}
while ($dirname ne '.') {
my $filename = $dirname . '/__init__.py';
unless (-e $filename) {
open my $FH, '>', $filename
or die "can't open $filename ($!).\n";
close $FH;
}
$dirname = dirname($dirname);
}
}
#
# 3.5 OMG IDL Specification (could be specialized)
#
sub visitSpecification {
my $self = shift;
my ($node) = @_;
my $setup_name;
my $filename;
my $empty;
$self->empty_modules();
$self->{setup_packages} = [];
if ($self->{base_package}) {
$setup_name = $self->{base_package};
if (exists $self->{server}) {
$setup_name .= '_skel';
}
$filename = $setup_name . '/__init__.py';
$self->{setup_name} = $setup_name;
push @{$self->{setup_packages}}, $setup_name;
}
else {
my $basename = basename($self->{srcname}, '.idl');
$basename =~ s/\./_/g;
$setup_name = '_' . $basename;
if (exists $self->{server}) {
$setup_name .= '_skel';
}
$filename = $setup_name . '.py';
$empty = 1;
foreach (@{$node->{list_decl}}) {
my $defn = $self->_get_defn($_);
unless ( $defn->isa('Modules')
or $defn->isa('Import') ) {
$empty = 0;
}
}
unless ($empty) {
$self->{setup_name} = $setup_name;
$self->{setup_py_modules} = $setup_name;
}
}
unless ($empty) {
$self->open_stream($filename, $node);
}
foreach (@{$node->{list_decl}}) {
$self->_get_defn($_)->visit($self);
}
unless ($empty) {
my $FH = $self->{out};
print $FH "\n";
print $FH "# Local variables:\n";
print $FH "# buffer-read-only: t\n";
print $FH "# End:\n";
close $FH;
}
$self->_setup_py();
}
#
# 3.7 Module Declaration
#
sub visitModules {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
return if (exists $self->{done_hash}->{$name});
$self->{done_hash}->{$name} = 1;
my $save_out = $self->{out};
my $defn = $self->{symbtab}->Lookup($node->{full});
my $setup_name = $node->{full};
$setup_name =~ s/^:://;
if (exists $self->{server}) {
$setup_name =~ s/::/_skel\//g;
$setup_name .= '_skel';
}
else {
$setup_name =~ s/::/\//g;
}
if ($self->{base_package}) {
$setup_name = $self->{base_package} . '/' . $setup_name;
}
$self->{setup_name} = $setup_name unless ($self->{setup_name});
push @{$self->{setup_packages}}, $setup_name;
my $filename = $setup_name . '/__init__.py';
my $doc_string = "\"\"\" Module " . $defn->{repos_id} . " \"\"\"";
$self->open_stream($filename, $node, $doc_string);
my $FH = $self->{out};
foreach (@{$node->{list_decl}}) {
$_->visit($self);
}
print $FH "\n";
print $FH "# Local variables:\n";
print $FH "# buffer-read-only: t\n";
print $FH "# End:\n";
close $FH;
$self->{out} = $save_out;
}
sub visitModule {
my $self = shift;
my ($node) = @_;
foreach (@{$node->{list_decl}}) {
$self->_get_defn($_)->visit($self);
}
}
#
# 3.8 Interface Declaration (could be specialized)
#
sub visitBaseInterface {
my $self = shift;
my($node) = @_;
my $FH = $self->{out};
$self->{indent} = q{ } x 4;
print $FH "\n";
print $FH "class ",$node->{py_name};
if ($self->{old_object}) {
print $FH ":\n";
}
else {
print $FH "(object):\n";
}
print $FH " \"\"\" ",ref $node,": ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
foreach (@{$node->{list_decl}}) {
my $defn = $self->_get_defn($_);
if ( $defn->isa('Operation')
or $defn->isa('Attributes')
or $defn->isa('Initializer')
or $defn->isa('StateMembers') ) {
next;
}
$defn->visit($self);
}
print $FH " def __init__(self):\n";
print $FH " pass\n";
print $FH "\n";
if ($self->{id}) {
print $FH " def _get_id(cls):\n";
print $FH " return '",$node->{repos_id},"'\n";
print $FH " corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
$self->{indent} = q{};
}
sub visitForwardBaseInterface {
# empty
}
sub visitRegularInterface {
my $self = shift;
my($node) = @_;
my $FH = $self->{out};
$self->{indent} = q{ } x 4;
print $FH "\n";
if ($self->{old_object}) {
print $FH "class ",$node->{py_name};
if (exists $node->{inheritance} and exists $node->{inheritance}->{list_interface}) {
print $FH "(";
my $first = 1;
foreach (@{$node->{inheritance}->{list_interface}}) {
print $FH ", " unless ($first);
my $base = $self->_get_defn($_);
print $FH $self->_get_scoped_name($base, $node);
$first = 0;
}
print $FH ")";
}
print $FH ":\n";
}
else {
print $FH "class ",$node->{py_name},"(";
if (exists $node->{inheritance} and exists $node->{inheritance}->{list_interface}) {
my $first = 1;
foreach (@{$node->{inheritance}->{list_interface}}) {
print $FH ", " unless ($first);
my $base = $self->_get_defn($_);
print $FH $self->_get_scoped_name($base, $node);
$first = 0;
}
}
else {
print $FH "object";
}
print $FH "):\n";
}
print $FH " \"\"\" Interface: ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH " def __init__(self):\n";
print $FH " pass\n";
print $FH "\n";
$self->{repos_id} = $node->{repos_id};
foreach (@{$node->{list_decl}}) {
my $defn = $self->_get_defn($_);
if ( $defn->isa('Operation')
or $defn->isa('Attributes') ) {
next;
}
$defn->visit($self);
}
if ($self->{id}) {
print $FH " def _get_id(cls):\n";
print $FH " return '",$node->{repos_id},"'\n";
print $FH " corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
foreach (sort keys %{$node->{hash_attribute_operation}}) {
my $defn = $self->_get_defn(${$node->{hash_attribute_operation}}{$_});
$defn->visit($self);
}
print $FH "\n";
$self->{indent} = q{};
}
sub visitAbstractInterface {
my $self = shift;
my($node) = @_;
my $FH = $self->{out};
$self->{indent} = q{ } x 4;
print $FH "\n";
if ($self->{old_object}) {
print $FH "class ",$node->{py_name};
if (exists $node->{inheritance} and exists $node->{inheritance}->{list_interface}) {
print $FH "(";
my $first = 1;
foreach (@{$node->{inheritance}->{list_interface}}) {
print $FH ", " unless ($first);
my $base = $self->_get_defn($_);
print $FH $self->_get_scoped_name($base, $node);
$first = 0;
}
print $FH ")";
}
print $FH ":\n";
}
else {
print $FH "class ",$node->{py_name},"(";
if (exists $node->{inheritance} and exists $node->{inheritance}->{list_interface}) {
my $first = 1;
foreach (@{$node->{inheritance}->{list_interface}}) {
print $FH ", " unless ($first);
my $base = $self->_get_defn($_);
print $FH $self->_get_scoped_name($base, $node);
$first = 0;
}
}
else {
print $FH "object";
}
print $FH "):\n";
}
print $FH " \"\"\" Abstract Interface: ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH " def __init__(self):\n";
print $FH " pass\n";
print $FH "\n";
$self->{repos_id} = $node->{repos_id};
foreach (@{$node->{list_decl}}) {
my $defn = $self->_get_defn($_);
if ( $defn->isa('Operation')
or $defn->isa('Attributes') ) {
next;
}
$defn->visit($self);
}
foreach (sort keys %{$node->{hash_attribute_operation}}) {
my $defn = $self->_get_defn(${$node->{hash_attribute_operation}}{$_});
$defn->visit($self);
}
$self->{indent} = q{};
}
#
# 3.10 Constant Declaration
#
sub visitConstant {
my $self = shift;
my ($node) = @_;
my $FH = $self->{out};
print $FH $self->{indent},"# Constant: ",$node->{repos_id},"\n";
print $FH $self->{indent},$node->{py_name}," = ",$node->{value}->{py_literal},"\n";
print $FH "\n";
}
#
# 3.11 Type Declaration
#
sub visitTypeDeclarators {
my $self = shift;
my ($node) = @_;
foreach (@{$node->{list_decl}}) {
$self->_get_defn($_)->visit($self);
}
}
sub visitTypeDeclarator {
my $self = shift;
my ($node) = @_;
my $type = $self->_get_defn($node->{type});
if ( $type->isa('StructType')
or $type->isa('UnionType')
or $type->isa('EnumType')
or $type->isa('FixedPtType') ) {
$type->visit($self);
}
my $FH = $self->{out};
my $type2 = $type;
while ($type2->isa('TypeDeclarator')) {
$type2 = $self->_get_defn($type2->{type});
}
if ($type2->isa('EnumType')) {
print $FH $self->{indent},"# Typedef: ",$node->{repos_id},"\n";
print $FH $self->{indent},$node->{py_name}," = ",$self->_get_scoped_name($type, $node, 1),"\n";
print $FH "\n";
return;
}
if (exists $node->{array_size}) {
if ( ( $type->isa('OctetType') or $type->isa('CharType') )
and scalar(@{$node->{array_size}}) == 1 ) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = str(val)\n";
print $FH $self->{indent}," if len(self._value) != ",${$node->{array_size}}[0]->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'string', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(str):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," if not isinstance(val, str):\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH $self->{indent}," if len(val) != ",${$node->{array_size}}[0]->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH $self->{indent}," str.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," for elt in self:\n";
if ($type->isa('OctetType')) {
print $FH $self->{indent}," CORBA.marshal(output, 'octet', ord(elt))\n";
}
else {
print $FH $self->{indent}," CORBA.marshal(output, 'char', elt)\n";
}
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," lst = []\n";
print $FH $self->{indent}," for _ in xrange(",${$node->{array_size}}[0]->{py_literal},"):\n";
print $FH $self->{indent}," lst.append(CORBA.demarshal(input_, '",$type->{value},"'))\n";
if ($type->isa('OctetType')) {
print $FH $self->{indent}," val = ''.join(map(chr, lst))\n";
}
else {
print $FH $self->{indent}," val = ''.join(lst)\n";
}
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
else {
my @array_max = ();
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
push @array_max, $type->{max};
}
else {
push @array_max, undef;
}
$type = $self->_get_defn($type->{type});
}
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def __init__(self, *params):\n";
print $FH $self->{indent}," self._value = list(*params)\n";
print $FH $self->{indent},@tab,"_e",$n," = self._value\n";
foreach (@{$node->{array_size}}) {
print $FH $self->{indent},@tab,"if len(_e",$n,") != ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
foreach (@array_max) {
if (defined $_) {
print $FH $self->{indent},@tab,"if len(_e",$n,") > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", _e",$n,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __contains__(self, elt):\n";
print $FH $self->{indent}," return elt in self._value, val\n";
print $FH "\n";
print $FH $self->{indent}," def __len__(self):\n";
print $FH $self->{indent}," return len(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __getitem__(self, key):\n";
print $FH $self->{indent}," return self._value[key]\n";
print $FH "\n";
print $FH $self->{indent}," def __setitem__(self, key, val):\n";
print $FH $self->{indent}," self._value[key] = val\n";
print $FH "\n";
if ($self->{marshal}) {
$n = 0;
@tab = (q{ } x 8);
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent},@tab,"_e",$n," = self._value\n";
foreach (@{$node->{array_size}}) {
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"_e",$n,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(list):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def __init__(self, *params):\n";
print $FH $self->{indent}," list.__init__(self, *params)\n";
print $FH $self->{indent},@tab,"_e",$n," = list(*params)\n";
foreach (@{$node->{array_size}}) {
print $FH $self->{indent},@tab,"if len(_e",$n,") != ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
foreach (@array_max) {
if (defined $_) {
print $FH $self->{indent},@tab,"if len(_e",$n,") > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", _e",$n,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
if ($self->{marshal}) {
$n = 0;
@tab = (q{ } x 8);
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent},@tab,"_e",$n," = self\n";
foreach (@{$node->{array_size}}) {
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"_e",$n,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
}
}
if ($self->{marshal}) {
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def demarshal(cls, input_):\n";
foreach (@{$node->{array_size}}) {
print $FH $self->{indent},@tab,"_lst",$n," = []\n";
print $FH $self->{indent},@tab,"for _i",$n," in xrange(",$_->{py_literal},"):\n";
$n ++;
push @tab, q{ } x 4;
}
foreach (@array_max) {
print $FH $self->{indent},@tab,"_len",$n," = CORBA.demarshal(input_, 'long')\n";
if (defined $_) {
print $FH $self->{indent},@tab,"if _len",$n," > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/MARSHAL:1.0', 9, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"_lst",$n," = []\n";
print $FH $self->{indent},@tab,"for _i",$n," in xrange(_len",$n,"):\n";
$n ++;
push @tab, q{ } x 4;
}
$n --;
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"_lst",$n,".append(",$self->_get_scoped_name($type, $node),".demarshal(input_))\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"_lst",$n,".append(CORBA.demarshal(input_, '",$type_name,"'))\n";
}
pop @tab;
if ($type->isa('CharType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(_lst",$n,")\n";
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(map(chr, _lst",$n,"))\n";
}
while ($n > 0) {
print $FH $self->{indent},@tab,"_lst",$n - 1,".append(_lst",$n,")\n";
$n --;
pop @tab;
}
print $FH $self->{indent},@tab,"return cls(_lst0)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
}
elsif ($type->isa('SequenceType')) {
my @array_max = ();
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
push @array_max, $type->{max};
}
else {
push @array_max, undef;
}
$type = $self->_get_defn($type->{type});
}
if ( ( $type->isa('OctetType') or $type->isa('CharType') )
and scalar(@array_max) == 1 ) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = str(val)\n";
if (defined $array_max[0]) {
print $FH $self->{indent}," if len(self._value) > ",$array_max[0]->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'string', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(str):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," if val != None:\n";
print $FH $self->{indent}," if not isinstance(val, str):\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
if (defined $array_max[0]) {
print $FH $self->{indent}," if len(val) > ",$array_max[0]->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent}," str.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'long', len(self))\n";
print $FH $self->{indent}," for elt in self:\n";
if ($type->isa('OctetType')) {
print $FH $self->{indent}," CORBA.marshal(output, 'octet', ord(elt))\n";
}
else {
print $FH $self->{indent}," CORBA.marshal(output, 'char', elt)\n";
}
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," length = CORBA.demarshal(input_, 'long')\n";
print $FH $self->{indent}," lst = []\n";
print $FH $self->{indent}," for _ in xrange(length):\n";
print $FH $self->{indent}," lst.append(CORBA.demarshal(input_, '",$type->{value},"'))\n";
if ($type->isa('OctetType')) {
print $FH $self->{indent}," val = ''.join(map(chr, lst))\n";
}
else {
print $FH $self->{indent}," val = ''.join(lst)\n";
}
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
else {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def __init__(self, *params):\n";
print $FH $self->{indent}," self._value = list(*params)\n";
print $FH $self->{indent},@tab,"_e",$n," = self._value\n";
foreach (@array_max) {
if (defined $_) {
print $FH $self->{indent},@tab,"if len(_e",$n,") > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", _e",$n,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __contains__(self, elt):\n";
print $FH $self->{indent}," return elt in self._value, val\n";
print $FH "\n";
print $FH $self->{indent}," def __len__(self):\n";
print $FH $self->{indent}," return len(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __getitem__(self, key):\n";
print $FH $self->{indent}," return self._value[key]\n";
print $FH "\n";
print $FH $self->{indent}," def __setitem__(self, key, val):\n";
print $FH $self->{indent}," self._value[key] = val\n";
print $FH "\n";
if ($self->{marshal}) {
$n = 0;
@tab = (q{ } x 8);
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent},@tab,"_e",$n," = self._value\n";
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"_e",$n,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(list):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def __init__(self, *params):\n";
print $FH $self->{indent}," list.__init__(self, *params)\n";
print $FH $self->{indent},@tab,"_e",$n," = list(*params)\n";
foreach (@array_max) {
if (defined $_) {
print $FH $self->{indent},@tab,"if len(_e",$n,") > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", _e",$n,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
if ($self->{marshal}) {
$n = 0;
@tab = (q{ } x 8);
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent},@tab,"_e",$n," = self\n";
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
}
elsif (exists $type->{full}) {
print $FH $self->{indent},@tab,"_e",$n,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', _e",$n,")\n";
}
print $FH "\n";
}
}
if ($self->{marshal}) {
my $n = 0;
my @tab = (q{ } x 8);
print $FH $self->{indent}," def demarshal(cls, input_):\n";
foreach (@array_max) {
print $FH $self->{indent},@tab,"_len",$n," = CORBA.demarshal(input_, 'long')\n";
if (defined $_) {
print $FH $self->{indent},@tab,"if _len",$n," > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/MARSHAL:1.0', 9, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"_lst",$n," = []\n";
print $FH $self->{indent},@tab,"for _i",$n," in xrange(_len",$n,"):\n";
$n ++;
push @tab, q{ } x 4;
}
$n --;
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"_lst",$n,".append(",$self->_get_scoped_name($type, $node),".demarshal(input_))\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"_lst",$n,".append(CORBA.demarshal(input_, '",$type_name,"'))\n";
}
pop @tab;
if ($type->isa('CharType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(_lst",$n,")\n";
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(map(chr, _lst",$n,"))\n";
}
while ($n > 0) {
print $FH $self->{indent},@tab,"_lst",$n - 1,".append(_lst",$n,")\n";
$n --;
pop @tab;
}
print $FH $self->{indent},@tab,"return cls(_lst0)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
}
elsif ($type->isa('FixedPtType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(object):\n";
}
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," # TODO\n";
print $FH $self->{indent}," pass\n";
print $FH "\n";
}
elsif ($type->isa('StringType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = str(val)\n";
if (exists $type->{max}) {
print $FH $self->{indent}," if len(self._value) > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'string', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(str):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," if not isinstance(val, str):\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
if (exists $type->{max}) {
print $FH $self->{indent}," if len(val) > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent}," str.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'string', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'string')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('WideStringType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
# TODO
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = str(val)\n";
if (exists $type->{max}) {
print $FH $self->{indent}," if len(self._value) > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'wstring', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(unicode):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," if not isinstance(val, basestring):\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
if (exists $type->{max}) {
print $FH $self->{indent}," if len(val) > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent}," unicode.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'wstring', self)\n";
print $FH "\n";
}
}
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'wstring')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ( $type->isa('StructType')
or $type->isa('UnionType')) {
print $FH $self->{indent},"class ",$node->{py_name},"(",$self->_get_scoped_name($type, $node, 1),"):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, *args, **kwargs):\n";
print $FH $self->{indent}," if len(args) == 1 and isinstance(args[0], ",$self->_get_scoped_name($type, $node),"):\n";
print $FH $self->{indent}," self.__dict__ = dict(args[0].__dict__)\n";
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," super(",$self->_get_scoped_name($node, $node),", self).__init__(*args, **kwargs)\n";
print $FH "\n";
}
elsif ( $type->isa('TypeDeclarator')
or $type->isa('BaseInterface') ) {
print $FH $self->{indent},"class ",$node->{py_name},"(",$self->_get_scoped_name($type, $node, 1),"):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
}
elsif ($type->isa('FloatingPtType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = float(val)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
my $value = $type->{value};
$value =~ s/ /_/g;
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, '",$value,"', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(float):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
if ($self->{marshal}) {
my $value = $type->{value};
$value =~ s/ /_/g;
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, '",$value,"', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
my $value = $type->{value};
$value =~ s/ /_/g;
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, '",$value,"')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('IntegerType')) {
my $value = $type->{value};
$value =~ s/ /_/g;
my $py_type;
if ( $value eq 'short'
or $value eq 'unsigned_short'
or $value eq 'long' ) {
$py_type = 'int';
}
else {
$py_type = 'long';
}
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = ",$py_type,"(val)\n";
print $FH $self->{indent}," CORBA.check('",$value,"', self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, '",$value,"', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(",$py_type,"):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," CORBA.check('",$value,"', val)\n";
print $FH $self->{indent}," ",$py_type,".__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, '",$value,"', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, '",$value,"')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('CharType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = str(val)\n";
print $FH $self->{indent}," CORBA.check('char', val)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'char', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(str):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," CORBA.check('char', val)\n";
print $FH $self->{indent}," str.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'char', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'char')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('WideCharType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," CORBA.check('wchar', self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'wchar', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(unicode):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," CORBA.check('wchar', val)\n";
print $FH $self->{indent}," unicode.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'wchar', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'wchar')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('BooleanType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = bool(val)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'boolean', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(int):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," int.__init__(bool(val))\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'boolean', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'boolean')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
elsif ($type->isa('OctetType')) {
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," self._value = int(val)\n";
print $FH $self->{indent}," CORBA.check('octet', self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __cmp__(self, val):\n";
print $FH $self->{indent}," return cmp(self._value, val)\n";
print $FH "\n";
print $FH $self->{indent}," def __nonzero__(self):\n";
print $FH $self->{indent}," return bool(self._value)\n";
print $FH "\n";
print $FH $self->{indent}," def __str__(self):\n";
print $FH $self->{indent}," return str(self._value)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'octet', self._value)\n";
print $FH "\n";
}
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(int):\n";
print $FH $self->{indent}," \"\"\" Typedef ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," def __init__(self, val):\n";
print $FH $self->{indent}," CORBA.check('octet', val)\n";
print $FH $self->{indent}," int.__init__(val)\n";
print $FH "\n";
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
print $FH $self->{indent}," CORBA.marshal(output, 'octet', self)\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def demarshal(cls, input_):\n";
print $FH $self->{indent}," val = CORBA.demarshal(input_, 'octet')\n";
print $FH $self->{indent}," return cls(val)\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
}
else {
warn __PACKAGE__,"::visitTypeDeclarator (",ref $type,").\n";
return;
}
if ($self->{id}) {
print $FH $self->{indent}," def _get_id(cls):\n";
print $FH $self->{indent}," return '",$node->{repos_id},"'\n";
print $FH $self->{indent}," corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
if (exists $node->{serial_uid}) {
print $FH $self->{indent}," def _get_uid(cls):\n";
print $FH $self->{indent}," return 0x",$node->{serial_uid},"L\n";
print $FH $self->{indent}," serial_uid = classmethod(_get_uid)\n";
print $FH "\n";
}
}
sub visitNativeType {
# empty
}
#
# 3.11.2 Constructed Types
#
# 3.11.2.1 Structures
#
sub visitStructType {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
return if (exists $self->{done_hash}->{$name});
$self->{done_hash}->{$name} = 1;
my $FH = $self->{out};
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(object):\n";
}
print $FH $self->{indent}," \"\"\" Struct ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
foreach (@{$node->{list_expr}}) {
my $indent = $self->{indent};
$self->{indent} .= ' ';
my $type = $self->_get_defn($_->{type});
if ( $type->isa('StructType')
or $type->isa('UnionType')
or $type->isa('FixedPtType') ) {
$type->visit($self);
}
$self->{indent} = $indent;
}
print $FH $self->{indent}," def __init__(self";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH ", ",$member->{py_name};
}
print $FH "):\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH $self->{indent}," self._set",$member->{py_name},"(",$member->{py_name},")\n";
}
print $FH "\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH $self->{indent}," def _set",$member->{py_name},"(self, ",$member->{py_name},"):\n";
$self->_member_check($member, $member->{py_name}, " ", $node);
print $FH $self->{indent}," self._",$member->{py_name}," = ",$member->{py_name},"\n";
print $FH "\n";
print $FH $self->{indent}," def _get",$member->{py_name},"(self):\n";
print $FH $self->{indent}," return self._",$member->{py_name},"\n";
print $FH "\n";
print $FH $self->{indent}," ",$member->{py_name}," = property(fset=_set",$member->{py_name},", fget=_get",$member->{py_name},")\n";
print $FH "\n";
}
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_marshal($member, "self." . $member->{py_name});
}
print $FH "\n";
print $FH $self->{indent}," def demarshal(cls, input_):\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_demarshal($member, $node);
}
print $FH $self->{indent}," return cls(";
my $first = 1;
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
if ($first) {
$first = 0;
}
else {
print $FH ", ";
}
print $FH $member->{py_name};
}
print $FH ")\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
if ($self->{compare}) {
print $FH $self->{indent}," def __eq__(self, obj):\n";
print $FH $self->{indent}," if obj == None:\n";
print $FH $self->{indent}," return False\n";
print $FH $self->{indent}," if not isinstance(obj, type(self)):\n";
print $FH $self->{indent}," return False\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
print $FH $self->{indent}," if self.",$member->{py_name}," != obj.",$member->{py_name},":\n";
print $FH $self->{indent}," return False\n";
}
print $FH $self->{indent}," return True\n";
print $FH "\n";
print $FH $self->{indent}," def __ne__(self, obj):\n";
print $FH $self->{indent}," return not self.__eq__(obj)\n";
print $FH "\n";
}
if ($self->{stringify}) {
if ($self->{old_object}) {
print $FH $self->{indent}," def __str__(self):\n";
}
else {
print $FH $self->{indent}," def __repr__(self):\n";
}
print $FH $self->{indent}," lst = []\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_stringify($member);
}
print $FH $self->{indent}," inner = ',\\n'.join(lst)\n";
print $FH $self->{indent}," inner = '\\n'.join([' ' + line for line in inner.split('\\n')])\n";
print $FH $self->{indent}," return 'struct ",$node->{py_name}," {\\n' + inner + '\\n}'\n";
print $FH "\n";
}
if ($self->{id}) {
print $FH $self->{indent}," def _get_id(cls):\n";
print $FH $self->{indent}," return '",$node->{repos_id},"'\n";
print $FH $self->{indent}," corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
if (exists $node->{serial_uid}) {
print $FH $self->{indent}," def _get_uid(cls):\n";
print $FH $self->{indent}," return 0x",$node->{serial_uid},"L\n";
print $FH $self->{indent}," serial_uid = classmethod(_get_uid)\n";
print $FH "\n";
}
}
sub _member_check {
my $self = shift;
my ($member, $label, $tab, $node) = @_;
my $type = $self->_get_defn($member->{type});
my $FH = $self->{out};
my @tab = ($tab);
my $n = 0;
my $m = 0;
my $idx = q{};
if (exists $member->{array_size}) {
print $FH $self->{indent},@tab,"_e",$n," = ",$label,"\n";
foreach (@{$member->{array_size}}) {
print $FH $self->{indent},@tab,"if len(_e",$n,") != ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
if ($n == scalar(@{$member->{array_size}})) {
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
return;
}
}
}
$m = $n;
}
my @array_max = ();
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
push @array_max, $type->{max};
}
else {
push @array_max, undef;
}
$type = $self->_get_defn($type->{type});
}
if (scalar @array_max) {
print $FH $self->{indent},@tab,"_e",$n," = ",$label,"\n" unless ($n);
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.check('long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
if ($n == $m + scalar(@array_max)) {
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.check('octet', ord(_e",$n,"))\n";
return;
}
}
}
}
if ($n) {
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", _e",$n,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', _e",$n,")\n";
}
}
else {
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"CORBA.check(",$self->_get_scoped_name($type, $node),", ",$label,")\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.check('",$type_name,"', ",$label,")\n";
}
if ( ($type->isa('StringType') or $type->isa('WideStringType'))
and exists $type->{max} ) {
print $FH $self->{indent},@tab,"if len(",$label,") > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
}
}
sub _member_marshal {
my $self = shift;
my ($member, $label) = @_;
my $FH = $self->{out};
my $type = $self->_get_defn($member->{type});
my @tab = (q{ } x 12);
my $n = 0;
my $m = 0;
my $idx = q{};
if (exists $member->{array_size}) {
print $FH $self->{indent},@tab,"_e",$n," = ",$label,"\n";
foreach (@{$member->{array_size}}) {
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
if ($n == scalar(@{$member->{array_size}})) {
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
return;
}
}
}
$m = $n;
}
my @array_max = ();
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
push @array_max, $type->{max};
}
else {
push @array_max, undef;
}
$type = $self->_get_defn($type->{type});
}
if (scalar @array_max) {
print $FH $self->{indent},@tab,"_e",$n," = ",$label,"\n" unless ($n);
foreach (@array_max) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'long', len(_e",$n,"))\n";
print $FH $self->{indent},@tab,"for _e",$n + 1," in _e",$n,":\n";
$n ++;
push @tab, q{ } x 4;
if ($n == $m + scalar(@array_max)) {
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"CORBA.marshal(output, 'octet', ord(_e",$n,"))\n";
return;
}
}
}
}
if ($n) {
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"_e",$n,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', _e",$n,")\n";
}
}
else {
if (exists $type->{full}) {
print $FH $self->{indent},@tab,$label,".marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"CORBA.marshal(output, '",$type_name,"', ",$label,")\n";
}
}
}
sub _member_demarshal {
my $self = shift;
my ($member, $node) = @_;
my $FH = $self->{out};
my $type = $self->_get_defn($member->{type});
my @tab = (q{ } x 12);
my $n = 0;
if (exists $member->{array_size}) {
foreach (@{$member->{array_size}}) {
print $FH $self->{indent},@tab,"_lst",$n," = []\n";
print $FH $self->{indent},@tab,"for _i",$n," in xrange(",$_->{py_literal},"):\n";
$n ++;
push @tab, q{ } x 4;
}
}
my @array_max = ();
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
push @array_max, $type->{max};
}
else {
push @array_max, undef;
}
$type = $self->_get_defn($type->{type});
}
my $name = $member->{py_name};
foreach (@array_max) {
print $FH $self->{indent},@tab,"_len",$n," = CORBA.demarshal(input_, 'long')\n";
if (defined $_) {
print $FH $self->{indent},@tab,"if _len",$n," > ",$_->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/MARSHAL:1.0', 9, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent},@tab,"_lst",$n," = []\n";
print $FH $self->{indent},@tab,"for _i",$n," in xrange(_len",$n,"):\n";
$n ++;
push @tab, q{ } x 4;
}
if ($n) {
$n --;
if (exists $type->{full}) {
print $FH $self->{indent},@tab,"_lst",$n,".append(",$self->_get_scoped_name($type, $node),".demarshal(input_))\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,"_lst",$n,".append(CORBA.demarshal(input_, '",$type_name,"'))\n";
}
pop @tab;
if ($type->isa('CharType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(_lst",$n,")\n";
}
if ($type->isa('OctetType')) {
print $FH $self->{indent},@tab,"_lst",$n," = ''.join(map(chr, _lst",$n,"))\n";
}
while ($n > 0) {
print $FH $self->{indent},@tab,"_lst",$n - 1,".append(_lst",$n,")\n";
$n --;
pop @tab;
}
print $FH $self->{indent},@tab,$name," = _lst0\n";
}
else {
if (exists $type->{full}) {
print $FH $self->{indent},@tab,$name," = ",$self->_get_scoped_name($type, $node),".demarshal(input_)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent},@tab,$name," = CORBA.demarshal(input_, '",$type_name,"')\n";
}
if ( ($type->isa('StringType') or $type->isa('WideStringType'))
and exists $type->{max} ) {
print $FH $self->{indent},@tab,"if len(",$name,") > ",$type->{max}->{py_literal},":\n";
print $FH $self->{indent},@tab," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
}
}
sub _member_stringify {
my $self = shift;
my ($member) = @_;
my $array = q{};
if (exists $member->{array_size}) {
foreach (@{$member->{array_size}}) {
$array .= '[' . $_->{py_literal} . ']';
}
}
my $type = $self->_get_defn($member->{type});
while ($type->isa('SequenceType')) {
if (exists $type->{max}) {
$array .= '<' . $type->{max}->{py_literal} . '>';
}
else {
$array .= '<>';
}
$type = $self->_get_defn($type->{type});
}
my $FH = $self->{out};
print $FH $self->{indent}," lst.append('",$type->{py_name},$array," ",$member->{py_name},"=' + repr(self.",$member->{py_name},"))\n";
}
# 3.11.2.2 Discriminated Unions
#
sub visitUnionType {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
return if (exists $self->{done_hash}->{$name});
$self->{done_hash}->{$name} = 1;
my $type = $self->_get_defn($node->{type});
my $default = undef;
foreach my $case (@{$node->{list_expr}}) { # case
foreach (@{$case->{list_label}}) { # default or expression
$default = $case if ($_->isa('Default'));
}
}
my $FH = $self->{out};
if ($self->{old_object}) {
print $FH $self->{indent},"class ",$node->{py_name},":\n";
}
else {
print $FH $self->{indent},"class ",$node->{py_name},"(object):\n";
}
print $FH $self->{indent}," \"\"\" Union ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
my $indent = $self->{indent};
$self->{indent} .= q{ } x 4;
if ($type->isa('EnumType')) {
$type->visit($self);
}
foreach (@{$node->{list_expr}}) {
my $type = $self->_get_defn($_->{element}->{type});
if ( $type->isa('StructType')
or $type->isa('UnionType')
or $type->isa('FixedPtType') ) {
$type->visit($self);
}
}
$self->{indent} = $indent;
print $FH $self->{indent}," def __init__(self, *args, **kwargs):\n";
print $FH $self->{indent}," if len(args) == 2:\n";
print $FH $self->{indent}," _d, _v = args\n";
if (exists $type->{full}) {
print $FH $self->{indent}," CORBA.check(",$self->_get_scoped_name($type, $node),", _d)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent}," CORBA.check('",$type_name,"', _d)\n";
}
my $elif = 'if';
foreach my $case (@{$node->{list_expr}}) { # case
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
print $FH $self->{indent}," ",$elif," _d == ",$_->{py_literal},":\n";
my $member = $self->_get_defn($case->{element}->{value});
$self->_member_check($member, '_v', ' ', $node);
$elif = 'elif';
}
}
}
if ($elif eq 'if') {
print $FH $self->{indent}," if False: pass\n";
}
if (defined $default) {
print $FH $self->{indent}," else: # default\n";
my $member = $self->_get_defn($default->{element}->{value});
$self->_member_check($member, '_v', ' ', $node);
}
else {
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent}," self.__d = _d\n";
print $FH $self->{indent}," self.__v = _v\n";
foreach my $case (@{$node->{list_expr}}) { # case
if (scalar(@{$case->{list_label}}) == 1) {
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
my $elt = $self->_get_defn($case->{element});
my $label = ${$elt->{list_expr}}[0];
print $FH $self->{indent}," elif '",$label,"' in kwargs:\n";
print $FH $self->{indent}," self._set",$label,"(kwargs['",$label,"'])\n";
}
}
}
}
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
print $FH "\n";
print $FH $self->{indent}," def _get_d(self):\n";
print $FH $self->{indent}," return self.__d\n";
print $FH "\n";
print $FH $self->{indent}," _d = property(fget=_get_d)\n";
print $FH "\n";
print $FH $self->{indent}," def _get_v(self):\n";
$elif = 'if';
foreach my $case (@{$node->{list_expr}}) { # case
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
print $FH $self->{indent}," ",$elif," self.__d == ",$_->{py_literal},":\n";
my $member = $self->_get_defn($case->{element}->{value});
print $FH $self->{indent}," return self.__v\n";
$elif = 'elif';
}
}
}
if ($elif eq 'if') {
print $FH $self->{indent}," if False: pass\n";
}
if (defined $default) {
print $FH $self->{indent}," else: # default\n";
my $member = $self->_get_defn($default->{element}->{value});
print $FH $self->{indent}," return self.__v\n";
}
else {
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," return None\n";
}
print $FH "\n";
print $FH $self->{indent}," _v = property(fget=_get_v)\n";
print $FH "\n";
foreach my $case (@{$node->{list_expr}}) { # case
if (scalar(@{$case->{list_label}}) == 1) {
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
my $elt = $self->_get_defn($case->{element});
my $label = ${$elt->{list_expr}}[0];
print $FH $self->{indent}," def _set",$label,"(self, ",$label,"):\n";
my $member = $self->_get_defn($case->{element}->{value});
$self->_member_check($member, $label, " ", $node);
print $FH $self->{indent}," self.__d = ",$_->{py_literal},"\n";
print $FH $self->{indent}," self.__v = ",$label,"\n";
print $FH "\n";
print $FH $self->{indent}," def _get",$label,"(self):\n";
print $FH $self->{indent}," if self.__d == ",$_->{py_literal},":\n";
print $FH $self->{indent}," return self.__v\n";
print $FH $self->{indent}," return None\n";
print $FH "\n";
print $FH $self->{indent}," ",$label," = property(fset=_set",$label,", fget=_get",$label,")\n";
print $FH "\n";
}
}
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
if (exists $type->{full}) {
print $FH $self->{indent}," self._d.marshal(output)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent}," CORBA.marshal(output, '",$type_name,"', self._d)\n";
}
$elif = 'if';
foreach my $case (@{$node->{list_expr}}) { # case
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
print $FH $self->{indent}," ",$elif," self._d == ",$_->{py_literal},":\n";
my $member = $self->_get_defn($case->{element}->{value});
$self->_member_marshal($member, 'self.__v');
$elif = 'elif';
}
}
}
if ($elif eq 'if') {
print $FH $self->{indent}," if False: pass\n";
}
if (defined $default) {
print $FH $self->{indent}," else: # default\n";
my $member = $self->_get_defn($default->{element}->{value});
$self->_member_marshal($member, "self.__v");
}
else {
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/BAD_PARAM:1.0', 2, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH "\n";
print $FH $self->{indent}," def demarshal(cls, input_):\n";
if (exists $type->{full}) {
print $FH $self->{indent}," _d = ",$self->_get_scoped_name($type, $node),".demarshal(input_)\n";
}
else {
my $type_name = $type->{value};
$type_name =~ s/ /_/g;
print $FH $self->{indent}," _d = CORBA.demarshal(input_, '",$type_name,"')\n";
}
$elif = 'if';
foreach my $case (@{$node->{list_expr}}) { # case
foreach (@{$case->{list_label}}) { # default or expression
unless ($_->isa('Default')) {
print $FH $self->{indent}," ",$elif," _d == ",$_->{py_literal},":\n";
my $member = $self->_get_defn($case->{element}->{value});
$self->_member_demarshal($member, $node);
print $FH $self->{indent}," return cls(_d, ",$member->{py_name},")\n";
$elif = 'elif';
}
}
}
if ($elif eq 'if') {
print $FH $self->{indent}," if False: pass\n";
}
if (defined $default) {
print $FH $self->{indent}," else: # default\n";
my $member = $self->_get_defn($default->{element}->{value});
$self->_member_demarshal($member, $node);
print $FH $self->{indent}," return cls(_d, ",$member->{py_name},")\n";
}
else {
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," raise CORBA.SystemException('IDL:CORBA/MARSHAL:1.0', 9, CORBA.CORBA_COMPLETED_MAYBE)\n";
}
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
if ($self->{compare}) {
print $FH $self->{indent}," def __eq__(self, obj):\n";
print $FH $self->{indent}," if obj == None:\n";
print $FH $self->{indent}," return False\n";
print $FH $self->{indent}," if isinstance(obj, type(self)):\n";
print $FH $self->{indent}," if self._d == obj._d:\n";
print $FH $self->{indent}," return self._v == obj._v\n";
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," return False\n";
print $FH $self->{indent}," else:\n";
print $FH $self->{indent}," return False\n";
print $FH "\n";
print $FH $self->{indent}," def __ne__(self, obj):\n";
print $FH $self->{indent}," return not self.__eq__(obj)\n";
print $FH "\n";
}
if ($self->{stringify}) {
if ($self->{old_object}) {
print $FH $self->{indent}," def __str__(self):\n";
}
else {
print $FH $self->{indent}," def __repr__(self):\n";
}
print $FH $self->{indent}," lst = []\n";
print $FH $self->{indent}," lst.append('_d=' + repr(self._d))\n";
print $FH $self->{indent}," lst.append('_v=' + repr(self._v))\n";
print $FH $self->{indent}," inner = ',\\n'.join(lst)\n";
print $FH $self->{indent}," inner = '\\n'.join([' ' + line for line in inner.split('\\n')])\n";
print $FH $self->{indent}," return 'union ",$node->{py_name}," {\\n' + inner + '\\n}'\n";
print $FH "\n";
}
if ($self->{id}) {
print $FH $self->{indent}," def _get_id(cls):\n";
print $FH $self->{indent}," return '",$node->{repos_id},"'\n";
print $FH $self->{indent}," corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
if (exists $node->{serial_uid}) {
print $FH $self->{indent}," def _get_uid(cls):\n";
print $FH $self->{indent}," return 0x",$node->{serial_uid},"L\n";
print $FH $self->{indent}," serial_uid = classmethod(_get_uid)\n";
print $FH "\n";
}
}
# 3.11.2.3 Constructed Recursive Types and Forward Declarations
#
sub visitForwardStructType {
# empty
}
sub visitForwardUnionType {
# empty
}
# 3.11.2.4 Enumerations
#
sub visitEnumType {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
return if (exists $self->{done_hash}->{$name});
$self->{done_hash}->{$name} = 1;
my $FH = $self->{out};
print $FH $self->{indent},"class ",$node->{py_name},"(CORBA.Enum):\n";
print $FH $self->{indent}," \"\"\" Enum ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
print $FH $self->{indent}," _enum_str = dict()\n";
print $FH $self->{indent}," _enum = dict()\n";
print $FH "\n";
if ($self->{id}) {
print $FH $self->{indent}," def _get_id(cls):\n";
print $FH $self->{indent}," return '",$node->{repos_id},"'\n";
print $FH $self->{indent}," corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
if (exists $node->{serial_uid}) {
print $FH $self->{indent}," def _get_uid(cls):\n";
print $FH $self->{indent}," return 0x",$node->{serial_uid},"L\n";
print $FH $self->{indent}," serial_uid = classmethod(_get_uid)\n";
print $FH "\n";
}
my $value = 0;
foreach (@{$node->{list_expr}}) {
print $FH $self->{indent},$_->{py_name}," = ",$node->{py_name},"('",$_->{py_name},"', ",$value,")\n";
$value ++;
}
print $FH "\n";
}
#
# 3.11.3 Template Types
#
sub visitFixedPtType {
# empty
}
sub visitFixedPtConstType {
# empty
}
#
# 3.12 Exception Declaration
#
sub visitException {
my $self = shift;
my ($node) = @_;
my $name = $node->{full};
return if (exists $self->{done_hash}->{$name});
$self->{done_hash}->{$name} = 1;
my $FH = $self->{out};
print $FH $self->{indent},"class ",$node->{py_name},"(CORBA.UserException):\n";
print $FH $self->{indent}," \"\"\" Exception ",$node->{repos_id}," \"\"\"\n";
print $FH "\n";
if (exists $node->{list_expr}) {
warn __PACKAGE__,"::visitException $node->{idf} : empty list_expr.\n"
unless (@{$node->{list_expr}});
foreach (@{$node->{list_expr}}) {
my $indent = $self->{indent};
$self->{indent} .= q{ } x 4;
my $type = $self->_get_defn($_->{type});
if ( $type->isa('StructType')
or $type->isa('UnionType')
or $type->isa('FixedPtType') ) {
$type->visit($self);
}
$self->{indent} = $indent;
}
}
print $FH $self->{indent}," def __init__(self";
if (exists $node->{list_expr}) {
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH ", ",$member->{py_name};
}
}
print $FH "):\n";
print $FH $self->{indent}," CORBA.UserException.__init__(self)\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH $self->{indent}," self._set",$member->{py_name},"(",$member->{py_name},")\n";
}
print $FH "\n";
if (exists $node->{list_expr}) {
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_); # member
print $FH $self->{indent}," def _set",$member->{py_name},"(self, ",$member->{py_name},"):\n";
$self->_member_check($member, $member->{py_name}, " ", $node);
print $FH $self->{indent}," self._",$member->{py_name}," = ",$member->{py_name},"\n";
print $FH "\n";
print $FH $self->{indent}," def _get",$member->{py_name},"(self):\n";
print $FH $self->{indent}," return self._",$member->{py_name},"\n";
print $FH "\n";
print $FH $self->{indent}," ",$member->{py_name}," = property(fset=_set",$member->{py_name},", fget=_get",$member->{py_name},")\n";
print $FH "\n";
}
}
if ($self->{marshal}) {
print $FH $self->{indent}," def marshal(self, output):\n";
if (exists $node->{list_expr}) {
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_marshal($member, "self." . $member->{py_name});
}
}
else {
print $FH $self->{indent}," pass\n";
}
print $FH "\n";
print $FH $self->{indent}," def demarshal(cls, input_):\n";
if (exists $node->{list_expr}) {
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_demarshal($member, $node);
}
}
print $FH $self->{indent}," return cls(";
my $first = 1;
if (exists $node->{list_expr}) {
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
if ($first) {
$first = 0;
}
else {
print $FH ", ";
}
print $FH $member->{py_name};
}
}
print $FH ")\n";
print $FH $self->{indent}," demarshal = classmethod(demarshal)\n";
print $FH "\n";
}
if ($self->{compare}) {
print $FH $self->{indent}," def __eq__(self, obj):\n";
print $FH $self->{indent}," if obj == None:\n";
print $FH $self->{indent}," return False\n";
print $FH $self->{indent}," if not isinstance(obj, type(self)):\n";
print $FH $self->{indent}," return False\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
print $FH $self->{indent}," if self.",$member->{py_name}," != obj.",$member->{py_name},":\n";
print $FH $self->{indent}," return False\n";
}
print $FH $self->{indent}," return True\n";
print $FH "\n";
print $FH $self->{indent}," def __ne__(self, obj):\n";
print $FH $self->{indent}," return not self.__eq__(obj)\n";
print $FH "\n";
}
if ($self->{stringify}) {
print $FH $self->{indent}," def __str__(self):\n";
if (exists $node->{list_expr}) {
print $FH $self->{indent}," lst = []\n";
foreach (@{$node->{list_member}}) {
my $member = $self->_get_defn($_);
$self->_member_stringify($member);
}
print $FH $self->{indent}," inner = ',\\n'.join(lst)\n";
print $FH $self->{indent}," inner = '\\n'.join([' ' + line for line in inner.split('\\n')])\n";
print $FH $self->{indent}," return 'exception ",$node->{py_name}," {\\n' + inner + '\\n}'\n";
}
else {
print $FH $self->{indent}," return 'exception ",$node->{py_name}," {}'\n";
}
print $FH "\n";
}
if ($self->{id}) {
print $FH $self->{indent}," def _get_id(cls):\n";
print $FH $self->{indent}," return '",$node->{repos_id},"'\n";
print $FH $self->{indent}," corba_id = classmethod(_get_id)\n";
print $FH "\n";
}
if (exists $node->{serial_uid}) {
print $FH $self->{indent}," def _get_uid(cls):\n";
print $FH $self->{indent}," return 0x",$node->{serial_uid},"L\n";
print $FH $self->{indent}," serial_uid = classmethod(_get_uid)\n";
print $FH "\n";
}
}
#
# 3.13 Operation Declaration
#
sub visitOperation {
my $self = shift;
my ($node) = @_;
my $FH = $self->{out};
print $FH "# def ",$node->{py_name},"(self";
foreach (@{$node->{list_param}}) { # paramater
if ( $_->{attr} eq 'in' or $_->{attr} eq 'inout') {
print $FH ", ",$_->{py_name};
}
}
print $FH "): ";
my @out = ();
my $type = $self->_get_defn($node->{type});
unless ($type->isa('VoidType')) {
push @out, '_ret';
}
foreach (@{$node->{list_param}}) { # paramater
if ( $_->{attr} eq 'inout' or $_->{attr} eq 'out') {
push @out, $_->{py_name};
}
}
if (scalar(@out)) {
print $FH "return ", join(', ', @out);
}
else {
print $FH "pass";
}
print $FH "\n";
}
#
# 3.14 Attribute Declaration
#
sub visitAttributes {
my $self = shift;
my ($node) = @_;
foreach (@{$node->{list_decl}}) {
$self->_get_defn($_)->visit($self);
}
}
sub visitAttribute {
my $self = shift;
my ($node) = @_;
$node->{_get}->visit($self);
$node->{_set}->visit($self) if (exists $node->{_set});
}
#
# 3.15 Repository Identity Related Declarations
#
sub visitTypeId {
# empty
}
sub visitTypePrefix {
# empty
}
#
# XPIDL
#
sub visitCodeFragment {
# empty
}
1;