SW1_GUIApp.cpp 6.11 KB
/////////////////////////////////////////////////////////////////////////////////
//
// This file is part of SACAMOS, cable models for EMI simulations in SPICE.
// It was developed by the University of Nottingham and the Netherlands Aerospace
// Centre (NLR) for ESA under contract number 4000112765/14/NL/HK.
//
// Copyright (C) 2015 - 2018 University of Nottingham
//
// SACAMOS is free software: you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// SACAMOS is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// A copy of the GNU General Public License version 3 can be found in the
// file GNU_GPL_v3 in the root or at <http://www.gnu.org/licenses/>.
//
// wxWidgets is currently licenced under the "wxWindows Library Licence".
// A copy of the wxWindows Library Licence, Version 3.1 can be found in the file
// wxWindows_Library_Licence_v3-1 in the root or at:
// <https://www.wxwidgets.org/about/licence/>
//
//
// The University of Nottingham can be contacted at: ggiemr@nottingham.ac.uk
//
// File Contents:
//
// NAME
//     SW1_GUIApp.cpp
//
// DESCRIPTIONbre
//     Main application GUI for SACAMOS
//
// AUTHOR(S)
//     Steve Greedy
//
/////////////////////////////////////////////////////////////////////////////////

#include "SW1_GUIApp.h"

//(*AppHeaders
#include "SW1_GUIMain.h"
#include <wx/image.h>
//*)

IMPLEMENT_APP(SW1_GUIApp);

bool SW1_GUIApp::OnInit()
{

    wxTextFile BuildFile;

    wxString systeminfo, buildtext, guiversion, cmdversion;

    wxDateTime DateToday = wxDateTime::Now();

    wxString   str = DateToday.Format(wxT("%d-%m-%y"), wxDateTime::Local );

    string Date = str.ToStdString();

    string updatemessage;


    Logger::instance().log(Date, Logger::kLogLevelHeader);
    Logger::instance().log("", Logger::kLogLevelHeader);
    Logger::instance().log("SACAMOS STARTED", Logger::kLogLevelHeader);
    Logger::instance().log("===============", Logger::kLogLevelHeader);

    Logger::instance().log("Host Information:", Logger::kLogLevelHeader);
    Logger::instance().log("", Logger::kLogLevelHeader);

    systeminfo = wxGetHostName();
    Logger::instance().log(systeminfo.ToStdString(), Logger::kLogLevelHeader);

    systeminfo =  wxPlatformInfo::Get().GetOperatingSystemDescription();
    Logger::instance().log(systeminfo.ToStdString(), Logger::kLogLevelHeader);

    Logger::instance().log("", Logger::kLogLevelHeader);
    Logger::instance().log("SACAMOS Build:", Logger::kLogLevelHeader);

    if (BuildFile.Open("resources/Build"))
    {
        for (int i = 0; i<8; i++)
        {
            buildtext = BuildFile[i];

            if (i==1) guiversion = BuildFile[i];

            if (i==5) cmdversion = BuildFile[i];

            Logger::instance().log(buildtext.ToStdString(), Logger::kLogLevelHeader);
        }
    }

    BuildFile.Close();

    // Compare current version against latest release version
    Logger::instance().log("Checking for Software Update...", Logger::kLogLevelHeader);

    wxHTTP checkupdate;

    wxInputStream *latest_versioninfo;

    wxString version_temp = "";

    wxStringOutputStream out_stream(&version_temp);

    checkupdate.SetHeader(_T("Content-type"), _T("text/html; charset=utf-8"));

    std::string latest_version,latest_version_number, latest_version_date;
    std::string current_version,current_version_number, current_version_date;

    if (checkupdate.Connect(_T("128.243.70.77")))  // only the server, no pages here yet ...
    {
        Logger::instance().log("Connected to SACAMOS Repository", Logger::kLogLevelInfo);

        latest_versioninfo = checkupdate.GetInputStream(_T("/UoN/SACAMOS/raw/master/version_information.inc"));

        latest_versioninfo->Read(out_stream);

        latest_version = version_temp.ToStdString();

        wxDELETE(latest_versioninfo);
    }
    else
    {
        //fail silently & log event
        Logger::instance().log("Could not connect to SACAMOS Repository", Logger::kLogLevelError);
    }

    checkupdate.Close();

    std::istringstream stream{latest_version};

    if (latest_version != "")
    {
        std::getline(stream, latest_version_number);

        if (latest_version_number != SACAMOS_V_NUMBER)
        {
            size_t pos;

            string latest_version_number_trimmed;
            pos = latest_version_number.find("=");
            latest_version_number_trimmed = latest_version_number.substr(pos+2);
            latest_version_number_trimmed = latest_version_number_trimmed.substr(0,latest_version_number_trimmed.size()-1);

            string current_version_number_trimmed;
            pos = SACAMOS_V_NUMBER.find("=");
            current_version_number_trimmed = SACAMOS_V_NUMBER.substr(pos+2);
            current_version_number_trimmed = current_version_number_trimmed.substr(0,latest_version_number_trimmed.size());

            updatemessage = "You are running SACAMOS " + current_version_number_trimmed + "\n\n";
            updatemessage+= "The latest version is  " + latest_version_number_trimmed + "\n\n";
            updatemessage+= "Please visit www.sacamos.org to download the latest version.";

            wxString myString(updatemessage);
            wxMessageBox(updatemessage,"Please Update");

        }
    }

    // Display splash screen
    wxBitmap splashimage;

    wxImage::AddHandler(new wxPNGHandler);

    splashimage.LoadFile(_T("resources/Sacamos_About.png"), wxBITMAP_TYPE_PNG);

    wxSplashScreen *splashscrn = new wxSplashScreen(splashimage,
        wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT,
        0, NULL, -1, wxDefaultPosition, wxDefaultSize,
        wxSIMPLE_BORDER|wxSTAY_ON_TOP);

    wxYield();
    wxSleep(2);
    splashscrn->Destroy();

    //(*AppInitialize
    bool wxsOK = true;
    wxInitAllImageHandlers();


    if ( wxsOK )
    {
    	SW1_GUIFrame* Frame = new SW1_GUIFrame(0);
    	Frame->Show();
    	SetTopWindow(Frame);
    }
    //*)

    return wxsOK;

}