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