@ISA
=
qw(SOAP::Server::Parameters)
;
use
lib
'/home/piers/code/saprfc/lib'
;
use
vars
qw($VERSION $AUTOLOAD)
;
my
$times
= 0;
sub
AUTOLOAD {
my
$self
=
shift
;
my
@parms
=
@_
;
my
$name
=
$AUTOLOAD
;
$name
=~ s/.*://;
$self
->method(
$name
,
@parms
);
}
my
%config
= SAP::Config::get();
check_connect(
$config
{
'sap'
} );
die
"SAPSOAP: Cannot connect to SAP System: $config{sap}->{ashost} \n"
unless
$rfc
;
sub
method {
my
(
$package
,
$method
,
@parms
) =
@_
;
my
$request
=
pop
(
@parms
);
die
SOAP::Fault->faultcode(
"SAPSOAP.ForbiddenRFC"
)
->faultstring(
"RFC Call Forbidden"
)
->faultdetail(
bless
{
code
=> 1} =>
"RFC $method is Forbidden due to configuration"
)
if
!
exists
$config
{
'rfc'
}->{
$method
};
$SAP::SOAP::SOAPLiteMode
= 1;
print
STDERR
"Doing the call ...\n"
;
check_connect(
$config
{
'sap'
} );
print
STDERR
"Connection is fine ...\n"
;
my
$response
=
$rfc
->soapCall(
$request
);
print
STDERR
"Done SAP RFC SOAP Call "
.
$times
++ .
"...\n"
;
my
@parms
= ();
eval
{
import
SOAP::Data
'name'
;
map
{
my
$p
=
$_
;
if
(
$p
->structure ){
my
$flds
=
$p
->value();
push
(
@parms
, name(
$p
->
name
=>
$flds
) );
}
else
{
push
(
@parms
, name(
$p
->
name
=>
$p
->value ) );
};
} (
$response
->parms );
map
{
my
$tab
=
$_
;
push
(
@parms
, SOAP::Data->name(
$tab
->name )->type(
'array'
)->value(
\name(
'item'
=>
(
$tab
->hashRows )
)
)
)
} (
$response
->tabs );
};
$response
->
reset
;
return
@parms
;
}
sub
check_connect {
my
$config
=
shift
;
if
( !
$rfc
){
print
STDERR
"SAPSOAP: Creating a new connection to: "
.
$config
->{
'ashost'
}.
"\n"
;
$rfc
= new SAP::SOAP(
ASHOST
=>
$config
->{
'ashost'
},
USER
=>
$config
->{
'user'
},
PASSWD
=>
$config
->{
'passwd'
},
LANG
=>
$config
->{
'lang'
},
CLIENT
=>
$config
->{
'client'
},
SYSNR
=>
$config
->{
'sysnr'
},
);
}
elsif
( !
$rfc
->is_connected ){
print
STDERR
"SAPSOAP: Restarting connection to: "
.
$config
->{
'ashost'
}.
"\n"
;
$rfc
= new SAP::SOAP(
ASHOST
=>
$config
->{
'ashost'
},
USER
=>
$config
->{
'user'
},
PASSWD
=>
$config
->{
'passwd'
},
LANG
=>
$config
->{
'lang'
},
CLIENT
=>
$config
->{
'client'
},
SYSNR
=>
$config
->{
'sysnr'
},
);
}
else
{
};
die
"SAPSOAP: Cannot connect to SAP System: $config->{ashost} \n"
unless
$rfc
;
}
1;