Subversion Repositories svn1

Rev

Rev 174 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "qmconfig.h"
#include "mainwindow.h"
#include <QFileDialog>
#include <QObject>
#include <QMessageBox>

// Global Data
MARA_CFG    config;


QmConfig::QmConfig(const QString &cnfFile)
{
    fileName = cnfFile;
    if ( !fileName.endsWith(".cnf",Qt::CaseInsensitive))
    {
        fileName.append(".cnf");
    }
    if (cnfFile.isEmpty())
    {
        fileName = QFileDialog::getOpenFileName(0, "Select Config File",
                                                         QDir::currentPath(),
                                                         "Data (*.cnf);;All (*.*)",
                                                         0,
                                                         0
                                                         );
    }

    //  No file selected
    //  Just exit
    if (fileName.isEmpty())
    {
        qDebug("No Confog file selected");
        exit(1);
    }

    if ( !open_read_config() )
    {
        if (QMessageBox::Cancel == QMessageBox::question ( 0,
                                                       "Config Load Error",
                                                       "Cannot load or read configuration file.\n"
                                                       "If you continue a new configuration will be created\n"
                                                       "If you cancel then the application will terminate.",
                                                       QMessageBox::Ok | QMessageBox::Cancel
                                                       ) )
        {
            qDebug("Canel to bad config");
            exit(2);
        }
    }
}


bool QmConfig::open_read_config( void )
{
    bool result;
    // Open the file
    configFile.setFileName(fileName);
    if ( ! configFile.open(QIODevice::ReadOnly) )
    {
        MainWindow::showMessage("Cannot open config File");
        return (false );
    }

    result = read_config();
    configFile.close();

    if ( result )
    {
        /*
         **  Post read calculations and fixups
         */
        if( config.datafilename[0] )
        {
            strcpy( datfile, config.datafilename );
            strcat( datfile, ".dat" );
        }
        config.nonequestrian_class = lookup_class( config.nonequestrian_class_abr, &config );
    }
    return result;
}

/*========================================================================
 *
 *  Read in the configuration file
 *
 *  Purpose:
 *      This function is called to read in the configuration file
 *      NOTE: Must be maintained with the Writer function
 *
 *  Parameters:
 *      fcon        File number of the config file
 *
 *  Returns:
 *      FALSE if an error is encountered
 *
 *========================================================================*/

bool QmConfig::read_config( void )
{
    int         len;                            /* Length of data read */
    int         fsize;                          /* Length of desired data */

    /*
     * Event name
     */
qDebug( "Reading: Event Name" );
    fsize = sizeof( config.event_name );
    len = configFile.read( config.event_name, fsize );
    if( len != fsize )
        return ( FALSE );

    /*
     * Leg names
     */
qDebug( "Reading: Leg Names" );
    fsize = sizeof( config.leg_name );
    len = configFile.read( (char *)config.leg_name, fsize );
    if( len != fsize )
        return ( FALSE );

    /*
     * Team definitions
     */
qDebug( "Reading: Team Defs" );
    fsize = sizeof( config.t_def  );
    len = configFile.read( (char *)config.t_def, fsize );
    if( len != fsize )
        return ( FALSE );

    /*
     * Number of legs
     */

qDebug( "Reading: Leg Nums" );
    fsize = sizeof( config.num_legs  );
    len = configFile.read( (char *)&config.num_legs, fsize );
    if( len != fsize)
        return ( FALSE );

    /*
     * Number of team splits
     */

qDebug( "Reading: Team Splits" );
    fsize = sizeof( config.num_teams  );
    len = configFile.read( (char *)&config.num_teams, fsize );
    if( len != fsize )
        return ( FALSE );

    config.min_team = config.t_def[0].start;
    config.max_team = config.t_def[config.num_teams - 1].end;

    /*
     * Class information
     */
qDebug( "Reading: Class Data" );
    fsize = sizeof( config.team_class  );
    len = configFile.read( (char *)config.team_class, fsize );
    if( len != fsize )
        return ( FALSE );
    fsize = sizeof( config.num_class  );
    len = configFile.read( (char *)&config.num_class, fsize);
    if( len != fsize )
        return ( FALSE );

    /*
     * Country list
     */

qDebug( "Reading: Country Data, Name" );
    fsize = sizeof( config.country_name  );
    len = configFile.read( (char *)config.country_name, fsize );
    if( len != fsize )
        return ( FALSE );

qDebug( "Reading: Country Data, Number" );
    fsize = sizeof( config.num_countries  );
    len = configFile.read( (char *)&config.num_countries, fsize );
    if( len != fsize )
        return ( FALSE );

    /*
     * Addendum file
     */

qDebug( "Reading: Addendum File" );
    fsize = sizeof( config.addendum );
    len = configFile.read( config.addendum, fsize );
    if( len != fsize )
        return ( configFile.atEnd() );

    /*
     * Name of the data file
     */

qDebug( "Reading: Name of data file" );
    fsize = sizeof( config.datafilename );
    len = configFile.read( config.datafilename, fsize );
    if( len != fsize )
        return ( configFile.atEnd() );

    /*
     **  Non-equestrian configuration information
     */
qDebug( "Reading: NonEquest" );
    fsize = sizeof( config.nonequestrian_class_abr );
    len = configFile.read( config.nonequestrian_class_abr, fsize );
    if( len != fsize )
        return ( configFile.atEnd() );

qDebug( "Reading: NonEquest-2" );
    fsize = sizeof( config.equestrian_leg );
    len = configFile.read( (char *)&config.equestrian_leg, fsize );
    if( len != fsize )
        return ( FALSE );

    /*
    **  .txt file output control. Lines per page and perf-skipping
    */
qDebug( "Reading: Output Control" );
    fsize = sizeof( config.lines_per_page );
    len = configFile.read( (char *)&config.lines_per_page, fsize );
    if( len != fsize )
        return ( configFile.atEnd() );

qDebug( "Reading: Output Control-2" );
    fsize = sizeof( config.perf_skip );
    len = configFile.read( (char *)&config.perf_skip, fsize );
    if( len != fsize )
        return ( FALSE );

qDebug( "Reading: Winners Info" );
    fsize = sizeof( config.class_winners );
    len = configFile.read( (char *)&config.class_winners, fsize );
    if( len != fsize )
        return ( FALSE );

qDebug( "Reading: Hall of Fame Info" );
    fsize = sizeof( config.hall_fame );
    len = configFile.read( (char *)&config.hall_fame, fsize );
    if( len != fsize )
        return ( FALSE );

qDebug( "Reading: Hall of Fame Numbers" );
    fsize = sizeof( config.hall_fame );
    len = configFile.read( (char *)&config.num_fame, fsize );
    if( len != fsize )
        return ( configFile.atEnd() );


    return ( TRUE );
}


/*========================================================================
 *
 *  Write out the configuration file
 *
 *  Purpose:
 *      This function is called to write the configuration file
 *      NOTE: Must be maintained with the Reader function
 *
 *  Parameters:
 *      None
 *
 *  Returns:
 *      FALSE   : Error encountered
 *
 *========================================================================*/

bool QmConfig::write_config( void )
{
    /*
     **  Open as a binary file
     */
    QFile file(fileName);
    if ( ! file.open(QIODevice::WriteOnly | QIODevice::Truncate) )
    {
        MainWindow::showMessage("Cannot opne config file");
        return (false);
    }

     /*
     **  Write out multiple structures
     **     Event name
     **     Leg names
     **     Team definitions
     **     Number of legs
     **     Number fo team splits
     **     Class information
     **     Number of defined classes
     **     Country list
     **     Number of defined countries
     **     Legend config.addendum file name
     **     Data file name
     */

    file.write( (const char *) config.event_name, sizeof( config.event_name ) );
    file.write( (const char *) config.leg_name, sizeof( config.leg_name ) );
    file.write( (const char *) config.t_def, sizeof( config.t_def ) );
    file.write( (const char *) &config.num_legs, sizeof( config.num_legs ) );
    file.write( (const char *) &config.num_teams, sizeof( config.num_teams ) );
    file.write( (const char *) config.team_class, sizeof( config.team_class ) );
    file.write( (const char *) &config.num_class, sizeof( config.num_class ) );
    file.write( (const char *) config.country_name, sizeof( config.country_name ) );
    file.write( (const char *) &config.num_countries, sizeof( config.num_countries ) );
    file.write( (const char *) config.addendum, sizeof( config.addendum ) );
    file.write( (const char *) config.datafilename, sizeof( config.datafilename ) );
    file.write( (const char *) config.nonequestrian_class_abr, sizeof( config.nonequestrian_class_abr ) );
    file.write( (const char *) &config.equestrian_leg, sizeof( config.equestrian_leg ) );
    file.write( (const char *) &config.lines_per_page, sizeof( config.lines_per_page ) );
    file.write( (const char *) &config.perf_skip, sizeof( config.perf_skip ) );
    file.write( (const char *) &config.class_winners, sizeof( config.class_winners ) );
    file.write( (const char *) &config.hall_fame, sizeof( config.hall_fame ) );
    file.write( (const char *) &config.num_fame, sizeof( config.num_fame ) );

    file.close();
    return ( TRUE );
}