1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/
23 #include "ReceiverFactory.hxx"
24 #include "Receivers.hxx"
27 #ifdef COMP_CORBA_DOUBLE
28 #define CorbaDNoCopyReceiver CorbaNCNoCopyReceiver
29 #define CorbaDWithCopyReceiver CorbaNCWithCopyReceiver
31 #define CorbaDNoCopyReceiver CorbaWCNoCopyReceiver
32 #define CorbaDWithCopyReceiver CorbaWCWithCopyReceiver
35 #ifdef COMP_CORBA_LONG
36 #define CorbaINoCopyReceiver CorbaNCNoCopyReceiver
37 #define CorbaIWithCopyReceiver CorbaNCWithCopyReceiver
39 #define CorbaINoCopyReceiver CorbaWCNoCopyReceiver
40 #define CorbaIWithCopyReceiver CorbaWCWithCopyReceiver
48 This method performs the transfert of double array with the remote SenderDouble given. If it fails with this SenderDouble it tries with an another protocol (CORBA by default).
50 double *ReceiverFactory::getValue(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException)
54 ret=getValueOneShot(sender,size);
56 catch(MultiCommException&)
58 SALOME::SenderDouble_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_);
59 MESSAGE("PROTOCOL CHANGED TO CORBA");
61 ret=getValueOneShot(newSender,size);
62 CORBA::release(newSender);
68 This method performs the transfert of int array with the remote SenderInt given. If it fails with this SenderInt it tries with an another protocol (CORBA by default).
70 int *ReceiverFactory::getValue(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException)
74 ret=getValueOneShot(sender,size);
76 catch(MultiCommException&)
78 SALOME::SenderInt_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_);
79 MESSAGE("PROTOCOL CHANGED TO CORBA");
81 ret=getValueOneShot(newSender,size);
82 CORBA::release(newSender);
88 This method performs the transfert with the remote SenderDouble given. If it fails an exception is thrown.
90 double *ReceiverFactory::getValueOneShot(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException)
92 SALOME::CorbaDoubleNCSender_ptr cncD_ptr;
93 SALOME::CorbaDoubleCSender_ptr cwcD_ptr;
95 SALOME::MPISenderDouble_ptr mpi_ptr=SALOME::MPISenderDouble::_narrow(sender);
98 SALOME::SocketSenderDouble_ptr sock_ptr=SALOME::SocketSenderDouble::_narrow(sender);
100 cncD_ptr=SALOME::CorbaDoubleNCSender::_narrow(sender);
101 cwcD_ptr=SALOME::CorbaDoubleCSender::_narrow(sender);
102 if(!CORBA::is_nil(cncD_ptr))
104 CORBA::release(sender);
105 CorbaDNoCopyReceiver<double,CORBA::Double,SALOME::vectorOfDouble_var,SALOME::CorbaDoubleNCSender_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(cncD_ptr);
106 return rec.getValue(size);
108 else if(!CORBA::is_nil(cwcD_ptr))
110 CORBA::release(sender);
111 CorbaDWithCopyReceiver<double,CORBA::Double,SALOME::vectorOfDouble_var,SALOME::CorbaDoubleCSender_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(cwcD_ptr);
112 return rec.getValue(size);
115 else if(!CORBA::is_nil(mpi_ptr))
117 CORBA::release(sender);
118 MPIReceiver<double,MPI_DOUBLE,SALOME::MPISenderDouble_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(mpi_ptr);
119 return rec.getValue(size);
123 else if(!CORBA::is_nil(sock_ptr))
125 CORBA::release(sender);
126 SocketReceiver<double,xdr_double,SALOME::SocketSenderDouble_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(sock_ptr);
127 return rec.getValue(size);
132 throw MultiCommException("Unknown sender protocol");
138 This method performs the transfert with the remote SenderInt given. If it fails an exception is thrown.
140 int *ReceiverFactory::getValueOneShot(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException)
142 SALOME::CorbaLongNCSender_ptr cncL_ptr;
143 SALOME::CorbaLongCSender_ptr cwcL_ptr;
145 SALOME::MPISenderInt_ptr mpi_ptr=SALOME::MPISenderInt::_narrow(sender);
148 SALOME::SocketSenderInt_ptr sock_ptr=SALOME::SocketSenderInt::_narrow(sender);
150 cncL_ptr=SALOME::CorbaLongNCSender::_narrow(sender);
151 cwcL_ptr=SALOME::CorbaLongCSender::_narrow(sender);
152 if(!CORBA::is_nil(cncL_ptr))
154 CORBA::release(sender);
155 CorbaINoCopyReceiver<int,CORBA::Long,SALOME::vectorOfLong_var,SALOME::CorbaLongNCSender_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(cncL_ptr);
156 return rec.getValue(size);
158 else if(!CORBA::is_nil(cwcL_ptr))
160 CORBA::release(sender);
161 CorbaIWithCopyReceiver<int,CORBA::Long,SALOME::vectorOfLong_var,SALOME::CorbaLongCSender_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(cwcL_ptr);
162 return rec.getValue(size);
165 else if(!CORBA::is_nil(mpi_ptr))
167 CORBA::release(sender);
168 MPIReceiver<int,MPI_INT,SALOME::MPISenderInt_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(mpi_ptr);
169 return rec.getValue(size);
173 else if(!CORBA::is_nil(sock_ptr))
175 CORBA::release(sender);
176 SocketReceiver<int,xdr_int,SALOME::SocketSenderInt_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(sock_ptr);
177 return rec.getValue(size);
182 throw MultiCommException("Unknown sender protocol");