1 // SALOME Session : implementation of Session_ServerLauncher.cxx
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : Session_ServerLauncher.xx
25 // Author : Paul RASCLE, EDF
29 #include "Session_ServerLauncher.hxx"
31 #include "Utils_SALOME_Exception.hxx"
32 #include "utilities.h"
34 //=============================================================================
36 * default constructor not for use
38 //=============================================================================
40 Session_ServerLauncher::Session_ServerLauncher()
42 ASSERT(0); // must not be called
45 //=============================================================================
49 //=============================================================================
51 Session_ServerLauncher::Session_ServerLauncher(int argc,
54 PortableServer::POA_ptr poa,
56 QWaitCondition *ServerLaunch,
57 QWaitCondition *SessionStarted)
61 _orb = CORBA::ORB::_duplicate(orb);
62 _root_poa = PortableServer::POA::_duplicate(poa);
64 _ServerLaunch = ServerLaunch;
65 _SessionStarted = SessionStarted;
68 //=============================================================================
72 //=============================================================================
74 Session_ServerLauncher::~Session_ServerLauncher()
78 //=============================================================================
80 * Check args and activate servers
82 //=============================================================================
84 void Session_ServerLauncher::run()
86 _GUIMutex->lock(); // lock released by calling thread when ready: wait(mutex)
88 _ServerLaunch->wakeAll();
93 _SessionStarted->wakeAll(); // wake main thread
95 _orb->run(); // this thread wait, during omniORB process events
98 //=============================================================================
100 * controls and dispatchs arguments given with command
102 //=============================================================================
104 void Session_ServerLauncher::CheckArgs()
107 ServArg aServArg(0,0,0);
108 _argCopy.reserve(_argc);
109 for (int iarg=0; iarg <_argc; iarg++)
113 _argCopy.push_back(_argv[iarg]);
116 case 0: // looking for "--with"
118 if (strcmp(_argv[iarg],"--with")==0)
122 case 1: // looking for server type
124 for (int i=0; i<Session_ServerThread::NB_SRV_TYP; i++)
125 if (strcmp(_argv[iarg],Session_ServerThread::_serverTypes[i])==0)
127 aServArg._servType = i;
133 case 2: // looking for "("
135 if (strcmp(_argv[iarg],"(")!=0)
137 INFOS("parenthesis '(' is required here...");
138 for (int i=0; i<iarg; i++)
139 cerr << _argv[i] << " ";
141 throw SALOME_Exception(LOCALIZED("Error in command arguments, missing prenthesis"));
145 aServArg._firstArg=iarg+1; // arg after '('
150 case 3: // looking for arguments
152 if (strcmp(_argv[iarg],")")==0) // end of arguments = ')'
154 aServArg._lastArg=iarg-1; // arg before ')'
155 MESSAGE("server : "<< Session_ServerThread::_serverTypes[aServArg._servType]);
156 for (int i=aServArg._firstArg; i<=aServArg._lastArg; i++)
157 MESSAGE(" arg : " << _argCopy[i]);
158 _argServToLaunch.push_back(aServArg);
171 throw SALOME_Exception(LOCALIZED("Error in command arguments, missing server type"));
173 throw SALOME_Exception(LOCALIZED("Error in command arguments, missing parenthesis '('"));
175 throw SALOME_Exception(LOCALIZED("Error in command arguments, missing parenthesis ')'"));
178 //=============================================================================
182 //=============================================================================
184 void Session_ServerLauncher::ActivateAll()
186 list<ServArg>::iterator itServ;
187 for (itServ = _argServToLaunch.begin(); itServ !=_argServToLaunch.end(); itServ++)
189 int argc = 2 + (*itServ)._lastArg - (*itServ)._firstArg;
190 char** argv = new char*[argc+1];
191 argv[argc]=0; // for Engines_Container_i constructor...
192 int servType = (*itServ)._servType;
193 argv[0]=strdup(Session_ServerThread::_serverTypes[servType]);
196 for (int i=0; i<argc-1; i++)
197 //argv[i+1] = _argCopy[(*itServ)._firstArg + i].c_str();
198 argv[i+1] = _argv[(*itServ)._firstArg + i];
201 std::cout << "*** activating [" << argc << "] : " << argv[0] << std::endl;
203 Session_ServerThread* aServerThread
204 = new Session_ServerThread(argc, argv, _orb,_root_poa,_GUIMutex);
205 _serverThreads.push_front(aServerThread);
207 aServerThread->Init();
210 // Always launch Session Server
211 std::cout << "*** activating [ SESSION ] " << std::endl;
214 char** argv = new char*[argc];
216 Session_SessionThread* aServerThread
217 = new Session_SessionThread(argc, argv, _orb,_root_poa,_GUIMutex,_ServerLaunch);
218 _serverThreads.push_front(aServerThread);
220 aServerThread->Init();
223 //=============================================================================
225 * Destruction des classes serveur dans l'ordre inverse de creation
227 //=============================================================================
229 void Session_ServerLauncher::KillAll()
231 MESSAGE("Session_ServerLauncher::KillAll()");
232 list<Session_ServerThread*>::reverse_iterator itServ;
233 for (itServ = _serverThreads.rbegin(); itServ !=_serverThreads.rend(); itServ++)