Salome HOME
Splash screen was implemented. Changes in packages SUIT and Session are integrated.
[modules/gui.git] / src / Session / Session_ServerLauncher.cxx
1 //  SALOME Session : implementation of Session_ServerLauncher.cxx
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : Session_ServerLauncher.xx
25 //  Author : Paul RASCLE, EDF
26 //  Module : SALOME
27 //  $Header$
28
29 #include "Session_ServerLauncher.hxx"
30
31 #include "Utils_SALOME_Exception.hxx"
32 #include "utilities.h"
33 using namespace std;
34 //=============================================================================
35 /*! 
36  *  default constructor not for use
37  */
38 //=============================================================================
39
40 Session_ServerLauncher::Session_ServerLauncher()
41 {
42   ASSERT(0); // must not be called
43 }
44
45 //=============================================================================
46 /*! 
47  *  constructor
48  */
49 //=============================================================================
50
51 Session_ServerLauncher::Session_ServerLauncher(int argc,
52                                                char ** argv, 
53                                                CORBA::ORB_ptr orb, 
54                                                PortableServer::POA_ptr poa,
55                                                QMutex *GUIMutex,
56                                                QWaitCondition *ServerLaunch)
57 {
58   _argc = argc;
59   _argv = argv;
60   _orb = CORBA::ORB::_duplicate(orb);
61   _root_poa = PortableServer::POA::_duplicate(poa);
62   _GUIMutex = GUIMutex;
63   _ServerLaunch = ServerLaunch;
64 }
65
66 //=============================================================================
67 /*! 
68  *  destructor
69  */
70 //=============================================================================
71
72 Session_ServerLauncher::~Session_ServerLauncher()
73 {
74 }
75
76 //=============================================================================
77 /*! 
78  *  Check args and activate servers
79  */
80 //=============================================================================
81
82 void Session_ServerLauncher::run()
83 {
84   MESSAGE("****>>> Session_ServerLauncher::run");
85   _GUIMutex->lock(); // lock released by calling thread when ready: wait(mutex)
86   MESSAGE("****>>> Server Launcher thread free to go...");
87    _GUIMutex->unlock();
88    _ServerLaunch->wakeAll();
89   CheckArgs();
90   ActivateAll();
91
92   _orb->run();       // this thread wait, during omniORB process events
93 }
94
95 //=============================================================================
96 /*! 
97  *  controls and dispatchs arguments given with command
98  */
99 //=============================================================================
100
101 void Session_ServerLauncher::CheckArgs()
102 {
103   int argState = 0;
104   ServArg aServArg(0,0,0);
105   _argCopy.reserve(_argc);
106   for (int iarg=0; iarg <_argc; iarg++)
107     {
108       SCRUTE(iarg);
109       SCRUTE(_argv[iarg]);
110       _argCopy.push_back(_argv[iarg]);
111       switch (argState)
112         {
113         case 0: // looking for "--with"
114           {
115             if (strcmp(_argv[iarg],"--with")==0)
116               argState = 1;
117             break;
118           }
119         case 1: // looking for server type
120           {
121             for (int i=0; i<Session_ServerThread::NB_SRV_TYP; i++)
122                 if (strcmp(_argv[iarg],Session_ServerThread::_serverTypes[i])==0)
123                   {
124                     aServArg._servType = i;
125                     argState = 2;
126                     break;
127                   }
128             break;
129           }
130         case 2: // looking for "("
131           {
132             if (strcmp(_argv[iarg],"(")!=0)
133               {
134                 INFOS("parenthesis '(' is required here...");
135                 for (int i=0; i<iarg; i++)
136                   cerr << _argv[i] << " ";
137                 cerr << endl;
138                 throw SALOME_Exception(LOCALIZED("Error in command arguments, missing prenthesis"));
139               } 
140             else
141               {
142                 aServArg._firstArg=iarg+1;    // arg after '('
143                 argState = 3;
144               }
145             break;
146           }
147         case 3: // looking for arguments
148           {
149             if (strcmp(_argv[iarg],")")==0)   // end of arguments = ')'
150               {
151                 aServArg._lastArg=iarg-1;     // arg before ')'
152                 MESSAGE("server : "<< Session_ServerThread::_serverTypes[aServArg._servType]);
153                 for (int i=aServArg._firstArg; i<=aServArg._lastArg; i++)
154                   MESSAGE("  arg : " << _argCopy[i]);
155                 _argServToLaunch.push_back(aServArg);
156                 argState = 0;
157               } 
158             break;
159           }
160         default:
161           {
162             ASSERT(0);
163             break;
164           }
165         }
166     }
167   if (argState == 1)
168     throw SALOME_Exception(LOCALIZED("Error in command arguments, missing server type"));
169   if (argState == 2)
170     throw SALOME_Exception(LOCALIZED("Error in command arguments, missing parenthesis '('"));
171   if (argState == 3)
172     throw SALOME_Exception(LOCALIZED("Error in command arguments, missing parenthesis ')'"));
173 }
174
175 //=============================================================================
176 /*! 
177  *  
178  */
179 //=============================================================================
180
181 void Session_ServerLauncher::ActivateAll()
182 {
183   list<ServArg>::iterator itServ;
184   for (itServ = _argServToLaunch.begin(); itServ !=_argServToLaunch.end(); itServ++)
185   {
186     int argc = 2 + (*itServ)._lastArg - (*itServ)._firstArg;
187     char** argv = new char*[argc+1];
188     argv[argc]=0; // for Engines_Container_i constructor...
189     int servType = (*itServ)._servType;
190     argv[0]=strdup(Session_ServerThread::_serverTypes[servType]);
191     if (argc>1)
192     {
193       for (int i=0; i<argc-1; i++)
194         //argv[i+1] = _argCopy[(*itServ)._firstArg + i].c_str();
195         argv[i+1] = _argv[(*itServ)._firstArg + i];
196     }
197
198 std::cout << "*** activating [" << argc << "] : " << argv[0] << std::endl;
199
200     Session_ServerThread* aServerThread
201       = new Session_ServerThread(argc, argv, _orb,_root_poa,_GUIMutex);
202     _serverThreads.push_front(aServerThread);
203     
204     aServerThread->Init();
205   }
206
207   // Always launch Session Server
208
209 std::cout << "*** activating [ SESSION ] " << std::endl;
210
211   int argc=1;
212   char** argv = new char*[argc];
213   argv[0] = "Session";
214   Session_SessionThread* aServerThread
215     = new Session_SessionThread(argc, argv, _orb,_root_poa,_GUIMutex,_ServerLaunch);
216   _serverThreads.push_front(aServerThread);
217
218   aServerThread->Init();
219 }
220
221 //=============================================================================
222 /*! 
223  *  Destruction des classes serveur dans l'ordre inverse de creation
224  */
225 //=============================================================================
226
227 void Session_ServerLauncher::KillAll()
228 {
229   MESSAGE("Session_ServerLauncher::KillAll()");
230   list<Session_ServerThread*>::reverse_iterator itServ;
231   for (itServ = _serverThreads.rbegin(); itServ !=_serverThreads.rend(); itServ++)
232     {
233       delete (*itServ);
234     }
235 }