]> SALOME platform Git repositories - modules/kernel.git/blob - src/Communication/ReceiverFactory.cxx
Salome HOME
PR: merge from branch BR_UT_V310a3 tag mergeto_trunk_05dec05
[modules/kernel.git] / src / Communication / ReceiverFactory.cxx
1 #ifdef HAVE_MPI2
2 #include "mpi.h"
3 #endif
4 #include "ReceiverFactory.hxx"
5 #include "Receivers.hxx"
6 using namespace std;
7
8 #ifdef COMP_CORBA_DOUBLE
9 #define CorbaDNoCopyReceiver CorbaNCNoCopyReceiver
10 #define CorbaDWithCopyReceiver CorbaNCWithCopyReceiver
11 #else
12 #define CorbaDNoCopyReceiver CorbaWCNoCopyReceiver
13 #define CorbaDWithCopyReceiver CorbaWCWithCopyReceiver
14 #endif
15
16 #ifdef COMP_CORBA_LONG
17 #define CorbaINoCopyReceiver CorbaNCNoCopyReceiver
18 #define CorbaIWithCopyReceiver CorbaNCWithCopyReceiver
19 #else
20 #define CorbaINoCopyReceiver CorbaWCNoCopyReceiver
21 #define CorbaIWithCopyReceiver CorbaWCWithCopyReceiver
22 #endif
23
24 #ifdef HAVE_SOCKET
25 #include <rpc/xdr.h>
26 #endif
27
28 /*!
29   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).
30  */
31 double *ReceiverFactory::getValue(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException)
32 {
33   double *ret;
34   try{
35     ret=getValueOneShot(sender,size);
36   }
37   catch(MultiCommException&)
38     {
39       SALOME::SenderDouble_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_);
40       MESSAGE("PROTOCOL CHANGED TO CORBA");
41       sender->release();
42       ret=getValueOneShot(newSender,size);
43       CORBA::release(newSender);
44     }
45   return ret;
46 }
47
48 /*!
49   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).
50  */
51 int *ReceiverFactory::getValue(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException)
52 {
53   int *ret;
54   try{
55     ret=getValueOneShot(sender,size);
56   }
57   catch(MultiCommException&)
58     {
59       SALOME::SenderInt_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_);
60       MESSAGE("PROTOCOL CHANGED TO CORBA");
61       sender->release();
62       ret=getValueOneShot(newSender,size);
63       CORBA::release(newSender);
64     }
65   return ret;
66 }
67
68 /*!
69   This method performs the transfert with the remote SenderDouble given. If it fails an exception is thrown.
70  */
71 double *ReceiverFactory::getValueOneShot(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException)
72 {
73   SALOME::CorbaDoubleNCSender_ptr cncD_ptr;
74   SALOME::CorbaDoubleCSender_ptr cwcD_ptr;
75 #ifdef HAVE_MPI2
76   SALOME::MPISenderDouble_ptr mpi_ptr=SALOME::MPISenderDouble::_narrow(sender);
77 #endif
78 #ifdef HAVE_SOCKET
79   SALOME::SocketSenderDouble_ptr sock_ptr=SALOME::SocketSenderDouble::_narrow(sender);
80 #endif
81   cncD_ptr=SALOME::CorbaDoubleNCSender::_narrow(sender);
82   cwcD_ptr=SALOME::CorbaDoubleCSender::_narrow(sender);
83   if(!CORBA::is_nil(cncD_ptr))
84     {
85       CORBA::release(sender);
86       CorbaDNoCopyReceiver<double,CORBA::Double,SALOME::vectorOfDouble_var,SALOME::CorbaDoubleNCSender_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(cncD_ptr);
87       return rec.getValue(size);
88     }
89   else if(!CORBA::is_nil(cwcD_ptr))
90     {
91       CORBA::release(sender);
92       CorbaDWithCopyReceiver<double,CORBA::Double,SALOME::vectorOfDouble_var,SALOME::CorbaDoubleCSender_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(cwcD_ptr);
93       return rec.getValue(size);
94     }
95 #ifdef HAVE_MPI2
96   else if(!CORBA::is_nil(mpi_ptr))
97     {
98       CORBA::release(sender);
99       MPIReceiver<double,MPI_DOUBLE,SALOME::MPISenderDouble_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(mpi_ptr);
100       return rec.getValue(size);
101     }
102 #endif
103 #ifdef HAVE_SOCKET
104   else if(!CORBA::is_nil(sock_ptr))
105     {
106       CORBA::release(sender);
107       SocketReceiver<double,xdr_double,SALOME::SocketSenderDouble_ptr,SALOME::SenderDouble_ptr,SALOME_SenderDouble_i> rec(sock_ptr);
108       return rec.getValue(size);
109     }
110 #endif
111   else
112     {
113       throw MultiCommException("Unknown sender protocol");
114       return 0;
115     }
116 }
117
118 /*!
119   This method performs the transfert with the remote SenderInt given. If it fails an exception is thrown.
120  */
121 int *ReceiverFactory::getValueOneShot(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException)
122 {
123   SALOME::CorbaLongNCSender_ptr cncL_ptr;
124   SALOME::CorbaLongCSender_ptr cwcL_ptr;
125 #ifdef HAVE_MPI2
126   SALOME::MPISenderInt_ptr mpi_ptr=SALOME::MPISenderInt::_narrow(sender);
127 #endif
128 #ifdef HAVE_SOCKET
129   SALOME::SocketSenderInt_ptr sock_ptr=SALOME::SocketSenderInt::_narrow(sender);
130 #endif
131   cncL_ptr=SALOME::CorbaLongNCSender::_narrow(sender);
132   cwcL_ptr=SALOME::CorbaLongCSender::_narrow(sender);
133   if(!CORBA::is_nil(cncL_ptr))
134     {
135       CORBA::release(sender);
136       CorbaINoCopyReceiver<int,CORBA::Long,SALOME::vectorOfLong_var,SALOME::CorbaLongNCSender_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(cncL_ptr);
137       return rec.getValue(size);
138     }
139   else if(!CORBA::is_nil(cwcL_ptr))
140     {
141       CORBA::release(sender);
142       CorbaIWithCopyReceiver<int,CORBA::Long,SALOME::vectorOfLong_var,SALOME::CorbaLongCSender_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(cwcL_ptr);
143       return rec.getValue(size);
144     }
145 #ifdef HAVE_MPI2
146   else if(!CORBA::is_nil(mpi_ptr))
147     {
148       CORBA::release(sender);
149       MPIReceiver<int,MPI_INT,SALOME::MPISenderInt_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(mpi_ptr);
150       return rec.getValue(size);
151     }
152 #endif
153 #ifdef HAVE_SOCKET
154   else if(!CORBA::is_nil(sock_ptr))
155     {
156       CORBA::release(sender);
157       SocketReceiver<int,xdr_int,SALOME::SocketSenderInt_ptr,SALOME::SenderInt_ptr,SALOME_SenderInt_i> rec(sock_ptr);
158       return rec.getValue(size);
159     }
160 #endif
161   else
162     {
163       throw MultiCommException("Unknown sender protocol");
164       return 0;
165     }
166 }
167