source: ogBrowser-Git/src/mainwindow.cpp @ 987869c

jenkinsmain
Last change on this file since 987869c was 987869c, checked in by adelcastillo <adelcastillo@…>, 15 years ago

Nuevo browser compilado.

git-svn-id: https://opengnsys.es/svn/trunk@519 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 10.8 KB
RevLine 
[050d67a]1#include "mainwindow.h"
2#include <QtWebKit>
3#include <QStringList>
4#include <QWebView>
5#include <QDockWidget>
6#include <QtDebug>
7#include <QWebPage>
8#include <QProcess>
9#include <QTextEdit>
10#include <QMessageBox>
11#include <QPushButton>
12#include <QDateTime>
[23de05d]13#include <QProgressBar>
14#include <QTabWidget>
[2e2ba31]15#include <QLineEdit>
[050d67a]16
17#include "qtermwidget.h"
18
19#define BUFFERSIZE 2048
[9d8d163]20#define EXPREG_RESET "^\\[(\\d+),(\\d+)\\]\\n"
21#define EXPREG_A_PASS "^\\[(\\d+)\\]\\s"
[050d67a]22
23#define CURRENT_TIME() QDateTime::currentDateTime().toString("dd/MM/yy hh:mm:ss")
24
25MainWindow::MainWindow(QWidget *parent)
[b93c220]26    : QMainWindow(parent),m_web(new QWebView()),m_output(new QTextEdit()),
27      m_process(new QProcess(this)),
28      m_logfile(0),m_logstream(0),m_numberTerminal(0)
[050d67a]29{
30    // Graphic
[987869c]31    showFullScreen();
[23de05d]32
33    setWindowTitle(tr("OpenGNSys Browser"));
34
[b93c220]35    setCentralWidget(m_web);
[050d67a]36
[23de05d]37    // Output
[b93c220]38    m_output->setReadOnly(true);
[23de05d]39
[2e2ba31]40    // Button Dock
[23de05d]41    QDockWidget* dock=new QDockWidget();
[050d67a]42    dock->setAllowedAreas(Qt::BottomDockWidgetArea);
[23de05d]43    QWidget* dummy=new QWidget();
44    dummy->setMaximumHeight(0);
45    dock->setTitleBarWidget(dummy);
[050d67a]46
[23de05d]47    // TabWidget
[b93c220]48    m_tabs=new QTabWidget(dock);
[55d467e]49    QPushButton *button=new QPushButton(tr("&New Term"));
[2e2ba31]50    button->setFocusPolicy(Qt::TabFocus);
[b93c220]51    m_tabs->setCornerWidget(button);
52    m_tabs->setFocusPolicy(Qt::NoFocus);
[23de05d]53
[b93c220]54    m_tabs->addTab(m_output,tr("Output"));
[55d467e]55    slotCreateTerminal();
[050d67a]56
[23de05d]57    // Las pestanyas al dock
[b93c220]58    dock->setWidget(m_tabs);
[23de05d]59
60    // Y el dock al mainwindow
[050d67a]61    addDockWidget(Qt::BottomDockWidgetArea,dock);
62
[2e2ba31]63    // Top Dock
64    dock=new QDockWidget();
65    dock->setAllowedAreas(Qt::TopDockWidgetArea);
66    QWidget* dummy2=new QWidget();
67    dummy2->setMaximumHeight(0);
68    dock->setTitleBarWidget(dummy2);
69
70    // WebBar
[b93c220]71    m_webBar=new QLineEdit(dock);
[2e2ba31]72
73    // WebBar al dock
[b93c220]74    dock->setWidget(m_webBar);
[2e2ba31]75
76    // dock al mainwindow
77    addDockWidget(Qt::TopDockWidgetArea,dock);
78
[23de05d]79    // Status bar
80    QStatusBar* st=statusBar();
81    st->setSizeGripEnabled(false);
[b93c220]82    m_progressBar=new QProgressBar(this);
[050d67a]83
[b93c220]84    m_web->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
[050d67a]85
86    // Web signals
[b93c220]87    connect(m_web,SIGNAL(linkClicked(const QUrl&)),this,
[050d67a]88            SLOT(slotLinkHandle(const QUrl&)));
[b93c220]89    connect(m_web,SIGNAL(loadStarted()),this,SLOT(slotWebLoadStarted()));
90    connect(m_web,SIGNAL(loadFinished(bool)),this,SLOT(slotWebLoadFinished(bool)));
91    connect(m_web,SIGNAL(loadProgress(int)),this,SLOT(slotWebLoadProgress(int)));
92    connect(m_web,SIGNAL(urlChanged(const QUrl&)),this,
[2e2ba31]93            SLOT(slotUrlChanged(const QUrl&)));
[050d67a]94
95    // Process signals
[b93c220]96    connect(m_process,SIGNAL(started()),this,SLOT(slotProcessStarted()));
97    connect(m_process,SIGNAL(finished(int,QProcess::ExitStatus)),
[050d67a]98            this,SLOT(slotProcessFinished(int,QProcess::ExitStatus)));
99
[b93c220]100    connect(m_process,SIGNAL(error(QProcess::ProcessError)),
[050d67a]101            this,SLOT(slotProcessError(QProcess::ProcessError)));
102
[b93c220]103    connect(m_process,SIGNAL(readyReadStandardOutput()),this,SLOT(slotProcessOutput()));
104    connect(m_process,SIGNAL(readyReadStandardError()),
[050d67a]105            this,SLOT(slotProcessErrorOutput()));
106
[2e2ba31]107    // Dock signals
[55d467e]108    connect(button,SIGNAL(clicked()),this,SLOT(slotCreateTerminal()));
[b93c220]109    connect(m_webBar,SIGNAL(returnPressed()),this,SLOT(slotWebBarReturnPressed()));
[55d467e]110
[050d67a]111    if(!readEnvironmentValues())
[b93c220]112        print(tr("Any environment variable/s didn't be setted."));
[050d67a]113
[b93c220]114    if(m_env.contains("OGLOGFILE") && m_env["OGLOGFILE"]!="")
[050d67a]115    {
[b93c220]116        QFile* file=new QFile(m_env["OGLOGFILE"]);
117        if(!file->open(QIODevice::WriteOnly | QIODevice::Text |
[050d67a]118                    QIODevice::Append))
119        {
[b93c220]120            delete file;
121            print(tr("The log file couldn't be opened: ")+m_env["OGLOGFILE"]+".");
[050d67a]122        }
123        else
[b93c220]124        {
125            m_logfile=file;
126            m_logstream=new QTextStream(m_logfile);
127        }
[050d67a]128    }
[2e2ba31]129
130    QStringList arguments=QCoreApplication::arguments();
[b93c220]131    m_webBar->setText(arguments[1]);
132    m_web->load(QUrl(arguments[1]));
[050d67a]133}
134
135MainWindow::~MainWindow()
136{
[b93c220]137    if(m_logfile)
[050d67a]138    {
[b93c220]139        m_logfile->close();
140        delete m_logfile;
[050d67a]141    }
[b93c220]142    if(m_logstream)
143        delete m_logstream;
[050d67a]144}
145
146void MainWindow::slotLinkHandle(const QUrl &url)
147{
[23de05d]148    // Si ya hay un proceso ejectuandose
[b93c220]149    if(m_process->state()!=QProcess::NotRunning)
[23de05d]150    {
[b93c220]151      print(tr("There is a process running. Please wait a moment."));
[23de05d]152      return;
153    }
[b93c220]154 
155    QString urlString = url.toString();
[050d67a]156    // Si es un link del tipo PROTOCOL lo ejecutamos
[b93c220]157    if(urlString.startsWith(PROTOCOL))
[050d67a]158    {
[b93c220]159        urlString=urlString.remove(0,QString(PROTOCOL).length());
160        QStringList list=urlString.split(" ",QString::SkipEmptyParts);
161        QString program=list.takeFirst();
162        m_process->setReadChannel(QProcess::StandardOutput);
[050d67a]163        // Le ponemos el mismo entorno que tiene el browser ahora mismo
[b93c220]164        m_process->setEnvironment(QProcess::systemEnvironment());
165        m_process->start(program,list);
166        print(tr("Launching the command: ")+program+" "+list.join(" ")+".");
[9d8d163]167        startProgressBar();
[050d67a]168    }
169    else
170    {
[b93c220]171        m_web->load(url);
[050d67a]172    }
173}
174
175void MainWindow::slotWebLoadStarted()
176{
[9d8d163]177    startProgressBar();
[b93c220]178    m_progressBar->setFormat("%p% Loading");
[9d8d163]179    m_progressBar->setMinimum(0);
180    m_progressBar->setMaximum(100);
[050d67a]181}
182
183void MainWindow::slotWebLoadProgress(int progress)
184{
[b93c220]185    m_progressBar->setValue(progress);
[050d67a]186}
187
188void MainWindow::slotWebLoadFinished(bool ok)
189{
190    // If any error ocurred, show a pop up
191    // Sometimes when the url hasn't got a dot, i.e /var/www/pageweb,
192    // the return value is always true so we check the bytes received too
[b93c220]193    if(ok == false || m_web->page()->totalBytes() == 0)
[050d67a]194    {
195        QMessageBox msgBox;
196        msgBox.setText(tr("The web page couldn't load. What do you want to do?"));
197
198        QPushButton *reloadButton = msgBox.addButton(tr("Reload"), QMessageBox::ActionRole);
199        msgBox.addButton(QMessageBox::Abort);
200
201        msgBox.exec();
202
203        if (msgBox.clickedButton() == reloadButton)
204        {
[b93c220]205            m_web->reload();
[050d67a]206        }
207        else
208        {
209            close();
210        }
211    }
212    else
[23de05d]213    {
[9d8d163]214        finishProgressBar();
[23de05d]215    }
[050d67a]216}
217
[2e2ba31]218void MainWindow::slotUrlChanged(const QUrl &url)
219{
[b93c220]220    m_webBar->setText(url.toString());
[2e2ba31]221}
222
[050d67a]223void MainWindow::slotProcessStarted()
224{
[b93c220]225    print(tr("Launched successfully."));
[9d8d163]226    startProgressBar();
227    m_progressBar->setMinimum(0);
228    m_progressBar->setMaximum(0);
[050d67a]229}
230
231void MainWindow::slotProcessOutput()
232{
[b93c220]233    m_process->setReadChannel(QProcess::StandardOutput);
[050d67a]234    char buf[BUFFERSIZE];
[b93c220]235    while((m_process->readLine(buf,BUFFERSIZE) > 0))
[050d67a]236    {
[b93c220]237        print(tr("Proc. Output: ")+buf,false);
[9d8d163]238        QString s(buf);
239        captureOutputForStatusBar(s);
[050d67a]240    }
241}
242
243void MainWindow::slotProcessErrorOutput()
244{
[b93c220]245    m_process->setReadChannel(QProcess::StandardError);
[050d67a]246    char buf[BUFFERSIZE];
[b93c220]247    while((m_process->readLine(buf,BUFFERSIZE) > 0))
[050d67a]248    {
[b93c220]249        print(tr("Proc. Error: ")+buf);
[050d67a]250    }
251}
252
253void MainWindow::slotProcessFinished(int code,QProcess::ExitStatus status)
254{
255    if(status==QProcess::NormalExit)
256    {
[b93c220]257        print(tr("Process fisnished correctly. Return value: ")+QString::number(code));
[050d67a]258    }
259    else
260    {
[b93c220]261        print(tr("Process crashed. Output: "+code));
[050d67a]262    }
[9d8d163]263    finishProgressBar();
[050d67a]264}
265
266void MainWindow::slotProcessError(QProcess::ProcessError error)
267{
268    switch(error)
269    {
270        case QProcess::FailedToStart:
[b93c220]271            print(tr("Impossible to launch the process."));
272            break;
273        case QProcess::WriteError:
274            print(tr("Write error happened in the process."));
275            break;
276        case QProcess::ReadError:
277            print(tr("Read error happened in the process."));
[050d67a]278            break;
279        // No capturo crashed porque la pillo por finished
280        case QProcess::Crashed:
281        case QProcess::Timedout:
[b93c220]282            break;
[050d67a]283        case QProcess::UnknownError:
284        default:
[b93c220]285            print(tr("Unknown error."));
[050d67a]286            break;
287    }
[9d8d163]288    startProgressBar();
[050d67a]289}
290
[55d467e]291void MainWindow::slotCreateTerminal()
292{
[2e2ba31]293    QTermWidget* console = new QTermWidget(1,this);
[55d467e]294    QFont font = QApplication::font();
295    font.setFamily("Terminus");
296    font.setPointSize(12);
297   
298    console->setTerminalFont(font);
[2e2ba31]299    console->setFocusPolicy(Qt::StrongFocus);
[55d467e]300   
301    //console->setColorScheme(COLOR_SCHEME_BLACK_ON_LIGHT_YELLOW);
302    console->setScrollBarPosition(QTermWidget::ScrollBarRight);
303
[b93c220]304    ++m_numberTerminal;
[55d467e]305
[2e2ba31]306    connect(console,SIGNAL(finished()),this,SLOT(slotDeleteTerminal()));
307
[b93c220]308    QString name=tr("Term ")+QString::number(m_numberTerminal);
309    m_tabs->addTab(console,name);
[55d467e]310}
311
[2e2ba31]312void MainWindow::slotDeleteTerminal()
313{
[b93c220]314    QWidget *widget = qobject_cast<QWidget *>(sender());
315    Q_ASSERT(widget);
316    m_tabs->removeTab(m_tabs->indexOf(widget));
317    delete widget;
[2e2ba31]318}
319
320void MainWindow::slotWebBarReturnPressed()
321{
[b93c220]322    QUrl url(m_webBar->text());
323    if(url.isValid())
324      slotLinkHandle(url);
[2e2ba31]325}
326
[050d67a]327int MainWindow::readEnvironmentValues()
328{
329    // The return value
330    int ret=true;
331
332    // Get all environment variables
333    QStringList environmentlist=QProcess::systemEnvironment();
334    // This is the list of the important variables
335    QStringList variablelist=QString(ENVIRONMENT).split(",");
336
337    // This is an auxiliar variable
338    QStringList stringlist;
339
340    foreach (QString str,variablelist)
341    {
342        // Look for the variable in the environment
343        stringlist=environmentlist.filter(str+"=");
344
345        if(stringlist.isEmpty())
346        {
[b93c220]347            m_env[str]="";
[050d67a]348            ret=false;
349        }
350        else
351        {
352            // Get the first element and get the value part
[b93c220]353            m_env[str]=(stringlist.first().split("="))[1];
[050d67a]354        }
355    }
356
357    return ret;
358}
[b93c220]359
360void MainWindow::print(QString s,bool newLine)
361{
[9d8d163]362  if(!s.endsWith("\n"))
[b93c220]363    s+="\n";
364  if(m_logstream)
365    *m_logstream<<CURRENT_TIME()<<": "<<s;
366  if(m_output)
367    m_output->insertPlainText(s);
368}
[9d8d163]369
370void MainWindow::captureOutputForStatusBar(QString output)
371{
372  // Capturar para modificar status bar
373
374  output.trimmed();
375
376  QRegExp rxReset(EXPREG_RESET);
377  QRegExp rxPass(EXPREG_A_PASS);
378  if(rxReset.exactMatch(output))
379  {
380    int minimum=rxReset.cap(1).toInt();
381    int maximum=rxReset.cap(2).toInt();
382    m_progressBar->setMinimum(minimum);
383    m_progressBar->setMaximum(maximum);
384    m_progressBar->setValue(minimum);
385  }
386  else if(rxPass.indexIn(output)!=-1)
387  {
388    print("goo");
389    int pass=rxPass.cap(1).toInt();
390    output.replace(rxPass,"");
391    qDebug()<<pass<<output;
392    m_progressBar->setValue(pass);
393    m_progressBar->setFormat("%p% "+output);
394  }
395}
396
397void MainWindow::startProgressBar()
398{
399    QStatusBar* st=statusBar();
400    st->clearMessage();
401    st->addWidget(m_progressBar,100);
402    m_progressBar->show();
403    m_web->setEnabled(false);
404}
405
406void MainWindow::finishProgressBar()
407{
408    QStatusBar* st=statusBar();
409    st->removeWidget(m_progressBar);
410    st->showMessage(tr("Ready"));
411    m_web->setEnabled(true);
412}
Note: See TracBrowser for help on using the repository browser.