source: tags/arb_5.1/PGT/main.cxx

Last change on this file was 3969, checked in by baderk, 18 years ago

Only small changes concerning the runtime stability. A bit code cleanup.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.6 KB
Line 
1// COPYRIGHT (C) 2004 - 2005
2//         KAI BADER <BADERK@IN.TUM.DE>
3//         DEPARTMENT OF MICROBIOLOGY (TECHNICAL UNIVERSITY MUNICH)
4//
5// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
8// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
9// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
10// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11//
12// CVS REVISION TAG  --  $Revision: 3969 $
13
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <stdarg.h>
18#include <Xm/XmAll.h>
19#include "arb_interface.hxx"
20#include "main_dialog.hxx"
21
22
23/****************************************************************************
24*  MAIN EVENT HANDLER CLASS
25****************************************************************************/
26class CMain
27{
28    public:
29        CMain();
30        ~CMain();
31        //
32        bool DB_Connect();
33        void DB_Disconnect();
34        int Run(int, char **);
35    protected:
36        void MainLoop();
37        //
38        bool m_connected;
39        XEvent m_event;
40        XDestroyWindowEvent m_dw_event;
41        XtAppContext m_xapp;
42        mainDialog *m_maindialog;
43        Widget m_topwidget;
44        Window m_topwindow;
45};
46
47
48/****************************************************************************
49*  MAIN EVENT HANDLER CLASS -- CONSTRUCTOR
50****************************************************************************/
51CMain::CMain()
52{
53    m_connected= false;
54    m_maindialog= NULL;
55}
56
57
58/****************************************************************************
59*  MAIN EVENT HANDLER CLASS -- DESTRUCTOR
60****************************************************************************/
61CMain::~CMain()
62{
63    // CLOSE CONNECTIONS IF THEY ARE STILL OPEN
64    DB_Disconnect();
65
66    // DESTRUCT MAIN DIALOG CLASS (IF NOT ALREADY HAPPENED!?)
67    if(m_maindialog) delete m_maindialog;
68
69    // DESTROY TOP WIDGET
70    if(m_topwidget) XtDestroyWidget(m_topwidget);
71}
72
73
74/****************************************************************************
75*  MAIN EVENT HANDLER CLASS -- CONNECT ALL DATABASES
76*
77*  RETURNVALUE:
78*       TRUE = AN ARB CONNECTION IS ESTABLISHED
79*       FALSE = AN ARB CONNECTION COULD NOT BE ESTABLISHED
80****************************************************************************/
81bool CMain::DB_Connect()
82{
83    // CHECK CONNECTION FLAG (ALREADY CONNECTED?)
84    if(!m_connected)
85    {
86        // TRY TO CONNECT TO THE DEFAULT ARB DATABASE; EXIT IF AN ERROR OCCURS
87        if(ARB_connect(NULL))
88        {
89            // IF A CONNECTON IS ESTABLISHED: ALSO CONNECT TO THE CONFIG DB
90            // (NO 'ACCESS-FAILED' CHECK HERE AT THE MOMENT)
91            CONFIG_connect();
92
93            m_connected= true;
94        }
95    }
96
97    return m_connected;
98}
99
100
101/****************************************************************************
102*  MAIN EVENT HANDLER CLASS -- DISCONNECT ALL DATABASES
103****************************************************************************/
104void CMain::DB_Disconnect()
105{
106    // IS THERE AN OPEN CONNECTION?
107    if(!m_connected) return;
108
109    // DISCONNECT ALL OPENED DATABASES (AVOIDS UNSTABLE ARB CONDITIONS)
110    CONFIG_disconnect();
111    ARB_disconnect();
112
113    // SET CONNECTION FLAG -> FALSE
114    m_connected= false;
115}
116
117
118/****************************************************************************
119*  MAIN EVENT HANDLER CLASS -- MAIN EVENT LOOP (CATCHES X11 EXIT EVENTS)
120****************************************************************************/
121void CMain::MainLoop()
122{
123    // EVENT LOOP (BREAKS ON A WINDOW DESTROY EVENT)
124    for(;;)
125    {
126        XtAppNextEvent(m_xapp, &m_event);
127
128        if(m_event.type == DestroyNotify)
129        {
130            m_dw_event= m_event.xdestroywindow;
131            if(m_dw_event.window == m_topwindow) break;
132        }
133
134        XtDispatchEvent(&m_event);
135    }
136}
137
138
139/****************************************************************************
140*  MAIN EVENT HANDLER CLASS -- INITS THE CLASS AND RUN EVENT LOOP
141*
142*  RETURNVALUE:
143*        0 = EVERYTHING IS FINE
144        -1 = AN ERROR OCCURED (UNABLE TO ESTABLISH DB CONNECTION)
145****************************************************************************/
146int CMain::Run(int argc, char **argv)
147{
148    // TRY TO ESTABLISH THE DATABASE CONNECTIONS
149    if(!m_connected)
150        if(!DB_Connect())
151        {
152            printf("PGT-ERROR: Unable to connect to the database. Make sure ARB is already running.\n");
153            return -1;
154        }
155
156    // CALL DEFAULT LANGUAGE PROCEDURE
157    XtSetLanguageProc(NULL, NULL, NULL);
158
159    // CREATE THE TOP LEVEL WIDGET (APPLICATION WIDGET)
160    m_topwidget= XtVaOpenApplication(&m_xapp, "PGTApp", NULL, 0,
161        &argc, argv, NULL,
162        sessionShellWidgetClass,
163        NULL);
164
165    // CREATE THE PGT MAIN DIALOG WINDOW
166    m_maindialog= new mainDialog(m_topwidget);
167
168    // FETCH THE TOP WINDOW
169    m_topwindow= XtWindow(m_maindialog->shellWidget());
170
171    // ENTER THE MAIN APPLICATION LOOP (WAIT FOR EVENTS)
172    MainLoop();
173
174    // DISCONNECT THE ARB CONNECTION
175    DB_Disconnect();
176
177    return 0;
178}
179
180
181/****************************************************************************
182*  MAIN FUNCTION - NO FURTHER COMMENT NECESSARY... ;-)
183****************************************************************************/
184int main(int argc, char **argv)
185{
186    // CREATE THE PGT MAIN EVENT HANDLER
187    CMain *cmain= new CMain();
188
189    // RUN PGT MAIN EVENT HANDLER
190    int retVal= cmain->Run(argc, argv);
191
192    // DELETE MAIN HANDLER CLASS AND EXIT WITH RETURN VALUE 'retVal'
193    delete cmain;
194    return retVal;
195}
Note: See TracBrowser for help on using the repository browser.