Changeset 35 in tspsg-svn for trunk/src/tspmodel.cpp


Ignore:
Timestamp:
Jul 1, 2009, 7:01:23 PM (15 years ago)
Author:
laleppa
Message:

+ Error handling when loading/saving files.

  • Translation updates (not finished).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/tspmodel.cpp

    r34 r35  
    3030}
    3131
    32 int CTSPModel::rand(int min, int max)
     32inline int CTSPModel::rand(int min, int max) const
    3333{
    3434        return min + (int)(((float)qrand() / RAND_MAX) * max);
    3535}
    3636
    37 int CTSPModel::rowCount(const QModelIndex &) const
     37inline int CTSPModel::rowCount(const QModelIndex &) const
    3838{
    3939        return nCities;
    4040}
    4141
    42 int CTSPModel::columnCount(const QModelIndex &) const
     42inline int CTSPModel::columnCount(const QModelIndex &) const
    4343{
    4444        return nCities;
     
    116116void CTSPModel::setNumCities(int n)
    117117{
    118 // int randMin = settings->value("MinCost",DEF_RAND_MIN).toInt();
    119 // int randMax = settings->value("MaxCost",DEF_RAND_MAX).toInt();
    120118        if (n == nCities)
    121119                return;
     
    127125                                        table[r][c] = INFINITY;
    128126                                else
    129                                         table[r][c] = 0; // rand(randMin,randMax);
     127                                        table[r][c] = 0;
    130128                }
    131129                for (int r = nCities; r < n; r++) {
     
    134132                                        table[r][c] = INFINITY;
    135133                                else
    136                                         table[r][c] = 0; // rand(randMin,randMax);
     134                                        table[r][c] = 0;
    137135                }
    138136        }
     
    150148}
    151149
     150inline bool CTSPModel::loadError(QDataStream::Status status) const
     151{
     152QString err;
     153        if (status == QDataStream::Ok)
     154                return false;
     155        else if (status == QDataStream::ReadPastEnd)
     156                err = trUtf8("Unexpected end of file.");
     157        else if (status == QDataStream::ReadCorruptData)
     158                err = trUtf8("Corrupt data read. File possibly corrupted.");
     159        else
     160                err = trUtf8("Unknown error.");
     161        QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + err,QMessageBox::Ok).exec();
     162        return true;
     163}
     164
    152165void CTSPModel::loadTask(QString fname)
    153166{
    154167QFile f(fname);
    155         f.open(QIODevice::ReadOnly);
     168        if (!f.open(QIODevice::ReadOnly)) {
     169                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),QString(trUtf8("Unable to open task file.\nError: %1")).arg(f.errorString()),QMessageBox::Ok).exec();
     170                return;
     171        }
    156172QDataStream ds(&f);
    157173        ds.setVersion(QDataStream::Qt_4_4);
    158174quint32 sig;
    159175        ds >> sig;
     176        if (loadError(ds.status()))
     177                return;
    160178        ds.device()->reset();
    161179        if (sig == TSPT)
     
    164182                loadZKT(&ds);
    165183        else
    166                 QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:\nUnknown file format or file is corrupted."),QMessageBox::Ok).exec();
     184                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unknown file format or file is corrupted."),QMessageBox::Ok).exec();
    167185        f.close();
    168186}
     
    172190        // Skipping signature
    173191        ds->skipRawData(sizeof(TSPT));
     192        if (loadError(ds->status()))
     193                return;
    174194        // File version
    175195quint8 version;
    176196        *ds >> version;
     197        if (loadError(ds->status()))
     198                return;
    177199        if (version > TSPT_VERSION) {
    178                 QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:\nFile version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
     200                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("File version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
    179201                return;
    180202        }
    181203        // Skipping metadata
    182204        ds->skipRawData(TSPT_META_SIZE);
     205        if (loadError(ds->status()))
     206                return;
    183207        // Cities number
    184208quint16 size;
    185209        *ds >> size;
     210        if (loadError(ds->status()))
     211                return;
     212        if (size < 3) {
     213                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unexpected data read.\nFile is possibly corrupted."),QMessageBox::Ok).exec();
     214                return;
     215        }
    186216        if (nCities != size)
    187217                emit numCitiesChanged(size);
     
    189219        for (int r = 0; r < size; r++)
    190220                for (int c = 0; c < size; c++)
    191                         if (r != c)
     221                        if (r != c) {
    192222                                *ds >> table[r][c];
     223                                if (loadError(ds->status())) {
     224                                        clear();
     225                                        return;
     226                                }
     227                        }
    193228        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
    194229}
     
    198233        // Skipping signature
    199234        ds->skipRawData(sizeof(ZKT));
     235        if (loadError(ds->status()))
     236                return;
    200237        // File version
    201238quint16 version;
    202239        ds->readRawData(reinterpret_cast<char *>(&version),2);
     240        if (loadError(ds->status()))
     241                return;
    203242        if (version > ZKT_VERSION) {
    204                 QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:\nFile version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
     243                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("File version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
    205244                return;
    206245        }
     
    208247quint8 size;
    209248        ds->readRawData(reinterpret_cast<char *>(&size),1);
     249        if (loadError(ds->status()))
     250                return;
     251        if ((size < 3) || (size > 5)) {
     252                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unexpected data read.\nFile is possibly corrupted."),QMessageBox::Ok).exec();
     253                return;
     254        }
    210255        if (nCities != size)
    211256                emit numCitiesChanged(size);
     
    216261                        if (r != c) {
    217262                                ds->readRawData(reinterpret_cast<char *>(&val),8);
     263                                if (loadError(ds->status())) {
     264                                        clear();
     265                                        return;
     266                                }
    218267                                table[r][c] = val;
    219                         } else
     268                        } else {
    220269                                ds->skipRawData(8);
     270                                if (loadError(ds->status())) {
     271                                        clear();
     272                                        return;
     273                                }
     274                        }
    221275        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
    222276}
     
    225279{
    226280QFile f(fname);
    227         f.open(QIODevice::WriteOnly);
     281        if (!f.open(QIODevice::WriteOnly)) {
     282                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),QString(trUtf8("Unable to create task file.\nError: %1\nMaybe, file is read-only?")).arg(f.errorString()),QMessageBox::Ok).exec();
     283                return;
     284        }
    228285QDataStream ds(&f);
    229286        ds.setVersion(QDataStream::Qt_4_4);
     287        if (f.error() != QFile::NoError) {
     288                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     289                f.close();
     290                return;
     291        }
    230292        // File signature
    231293        ds << TSPT;
     294        if (f.error() != QFile::NoError) {
     295                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     296                f.close();
     297                return;
     298        }
    232299        // File version
    233300        ds << TSPT_VERSION;
     301        if (f.error() != QFile::NoError) {
     302                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     303                f.close();
     304                return;
     305        }
    234306        // File metadata version
    235307        ds << TSPT_META_VERSION;
     308        if (f.error() != QFile::NoError) {
     309                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     310                f.close();
     311                return;
     312        }
    236313        // Metadata
    237314        ds << OSID;
     315        if (f.error() != QFile::NoError) {
     316                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     317                f.close();
     318                return;
     319        }
    238320        // Number of cities
    239321        ds << nCities;
     322        if (f.error() != QFile::NoError) {
     323                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     324                f.close();
     325                return;
     326        }
    240327        // Costs
    241328        for (int r = 0; r < nCities; r++)
    242329                for (int c = 0; c < nCities; c++)
    243                         if (r != c)
     330                        if (r != c) {
    244331                                ds << table[r][c];
     332                                if (f.error() != QFile::NoError) {
     333                                        QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     334                                        f.close();
     335                                        return;
     336                                }
     337                        }
    245338        f.close();
    246339}
Note: See TracChangeset for help on using the changeset viewer.