Salome HOME
import SalomePro v1.2c
[modules/yacs.git] / src / Logger / SALOME_Logger_Server.cxx
1 //  SALOME Logger : CORBA server managing trace output
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : SALOME_Logger_Server.cxx
8 //  Author : Vasily Rusyaev
9 //  Module : SALOME
10
11 using namespace std;
12 #include <iostream>
13 #include "SALOME_Logger_Server.hxx"
14 #include <SALOMEconfig.h>
15 #include <sys/types.h>
16 #include <unistd.h>
17 omni_mutex Logger::myLock;
18
19 /////////////////////////////////////////////////////////////////////
20 // Construction/Destruction
21 //////////////////////////////////////////////////////////////////////
22
23 Logger::Logger()
24 {
25   m_putIntoFile = false;
26 }
27
28 Logger::Logger(const char *filename)
29 {
30   //  m_outputFile.open( filename, ios::out | ios::trunc , filebuf::openprot);
31   m_outputFile.open( filename, ios::out | ios::trunc);
32   if (m_outputFile.is_open())
33     m_putIntoFile = true;
34   else
35     m_putIntoFile = false;
36 }
37
38 Logger::~Logger()
39 {
40   if (m_putIntoFile)
41     m_outputFile.close();
42 }
43
44 void Logger::putMessage(const char* message)
45 {
46   myLock.lock();
47   if (m_putIntoFile)
48     m_outputFile << message << flush;
49   else
50     cout << message;
51   myLock.unlock();
52 }
53
54 void Logger::ping()
55 {
56   cout<<" Logger::ping() pid "<< getpid()<<endl;
57 }
58
59 int main(int argc, char **argv)
60 {
61   if (argc > 2)
62     {
63       cout << "usage: SALOME_Logger_Server [output_file]" << endl;
64       exit(1);
65     }
66   try
67     {
68       //Initialize the ORB
69       long TIMESleep = 250000000;
70       int NumberOfTries = 40;
71       int a;
72       timespec ts_req;
73       ts_req.tv_nsec=TIMESleep;
74       ts_req.tv_sec=0;
75       timespec ts_rem;
76       ts_rem.tv_nsec=0;
77       ts_rem.tv_sec=0;
78       CosNaming::NamingContext_var inc;
79       CORBA::ORB_var orb; 
80       SALOME_Logger::Logger_var myLoggerRef;
81       CORBA::Object_var theObj;
82       Logger* myLogger;
83       CORBA::Object_var obj;
84       PortableServer::POA_var poa;
85       PortableServer::POAManager_var pman;   
86       orb = CORBA::ORB_init(argc,argv) ;     
87       for (int i = 1; i<=NumberOfTries; i++){        
88         if (i!=1) 
89           a=nanosleep(&ts_req,&ts_rem);  
90         obj = orb->resolve_initial_references("RootPOA") ;
91         if(!CORBA::is_nil(obj))
92           poa = PortableServer::POA::_narrow(obj) ;
93         pman = poa->the_POAManager();
94         // NB. You can activate the POA before or after
95         // activating objects in that POA.
96         
97         // This activates the object in the root POA (by default), and
98         // returns a reference to it.
99         //NB. You can't use SALOME_NamingService class because it uses MESSAGE macro
100         //Otherwise, you will get segmentation fault.   
101         //Get initial naming context
102         try{
103       if(!CORBA::is_nil(orb)) 
104         theObj = orb->resolve_initial_references("NameService");
105       //Narrow to NamingContext
106       if (!CORBA::is_nil(theObj)){
107         inc = CosNaming::NamingContext::_narrow(theObj);
108       }
109       }catch(CORBA::COMM_FAILURE&)
110        {
111          cout<<"Logger Server: CORBA::COMM_FAILURE: Unable to contact the Naming Service"<<endl;
112            }
113       catch(...){ cout<<"Logger Server: Unknown exception dealed with Naming Service" <<endl; } 
114         if (!CORBA::is_nil(inc)){
115           cout<<"Logger Server: Naming Service was found"<<endl; 
116           break;}
117       }
118       if (argc == 1)
119         myLogger = new Logger();
120       else
121         myLogger = new Logger(argv[1]);
122       myLoggerRef = myLogger->_this();
123       CosNaming::Name name;
124       name.length(1);
125       name[0].id = CORBA::string_dup("Logger");
126       inc->bind(name,myLoggerRef);
127       myLogger->_remove_ref();
128       pman->activate();   
129       orb->run() ;
130       orb->destroy() ;
131     }
132   catch(CORBA::COMM_FAILURE& ex) 
133     {
134       cerr << "Caught system exception COMM_FAILURE -- unable to contact the "
135            << "object." << endl;
136     }
137   catch(CORBA::SystemException&) 
138     {
139       cerr << "Caught CORBA::SystemException." << endl;
140     }
141   catch(CORBA::Exception&) 
142     {
143       cerr << "Caught CORBA::Exception." << endl;
144     }
145   catch(omniORB::fatalException& fe) 
146     {
147       cerr << "Caught omniORB::fatalException:" << endl;
148       cerr << "  file: " << fe.file() << endl;
149       cerr << "  line: " << fe.line() << endl;
150       cerr << "  mesg: " << fe.errmsg() << endl;
151     }
152   catch(...) 
153     {
154       cerr << "Caught unknown exception." << endl;
155     }
156 }