All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Public Attributes
GeopsyCore::GeopsySignalHeader Class Reference

Brief description of class still missing. More...

#include <GeopsySignalHeader.h>

List of all members.

Public Member Functions

bool isValid ()

Public Attributes

union {
   struct {
      qint32   nSignals
      qint32   offset
      char   tag [10]
      qint32   version
   }   compat1
   struct {
      double   magicFloat
      qint32   magicInt
      qint32   nSignals
      qint32   offset
      char   tag [16]
      qint32   version
   }   field
   char   raw [GEOPSYSIGNAL_HEADERSIZE]
}; 

Detailed Description

Brief description of class still missing.

Full description of class still missing


Member Function Documentation

Returns true if header is valid

References compat1, QGpCoreTools::endl(), field, GEOPSYSIGNAL_HEADERSIZE, GEOPSYSIGNAL_MAGICFLOAT, GEOPSYSIGNAL_MAGICINT, GEOPSYSIGNAL_TAG, GEOPSYSIGNAL_VERSION, QGpCoreTools::tr(), and TRACE.

Referenced by GeopsyCore::SignalFileFormat::fromContent(), and GeopsyCore::SignalFile::loadGeopsySignal().

{
  TRACE;
  if(strcmp( field.tag, GEOPSYSIGNAL_TAG)!=0) {
    // Trying compatibility with version 1
    if(strcmp( compat1.tag, "DBSignals" )!=0) {
      App::stream() << tr("Cannot read Geopsy Signal file: wrong tag.") << endl;
      return false;
    } else { // Compatibility with version 1
      App::stream() << tr("Compatibility with Geopsy Signal version 1...") << endl;
      if(compat1.version==1) {
        if(compat1.offset < 10 + 3 * 4 + compat1.nSignals * (4 + 8) ) {
          App::stream() << tr("Cannot read Geopsy Signal file: bad offset to first signal.") << endl;
          return false;
        }
        // Translate header compat1 to field
        field.nSignals=compat1.nSignals;
        field.offset=compat1.offset;
        field.version=1;
      } else {
        App::stream() << tr("Cannot read Geopsy Signal file: bad version number.") << endl;
        return false;
      }
    }
  } else {
    // Check magic numbers
    if(field.magicFloat!=GEOPSYSIGNAL_MAGICFLOAT  ||
         field.magicInt!=GEOPSYSIGNAL_MAGICINT) {
      // This is the place to implement compatibility checks (e.g. Big/Little endian) if requested.
      App::stream() << tr("Cannot read Geopsy Signal file: bad magic float. This happens because\n"
                          "the file has been generated with another machine with different number representations.\n"
                          "Please send a request to bug@geopsy.org to improve compatibilty.") << endl;
      return false;
    }
    if(field.version==GEOPSYSIGNAL_VERSION) {
      if(field.offset < GEOPSYSIGNAL_HEADERSIZE + field.nSignals * 4) {
        App::stream() << tr("Cannot read Geopsy Signal file: bad offset to first signal.") << endl;
        return false;
      }
    } else {
      App::stream() << tr("Cannot read Geopsy Signal file with version > %1. File version=%2")
                  .arg(GEOPSYSIGNAL_VERSION).arg(field.version) << endl;
      return false;
    }
  }
  if(field.nSignals<0) {
    App::stream() << tr("Cannot read Geopsy Signal file: no signals specified.") << endl;
    return false;
  }
  return true;
}

Member Data Documentation

union { ... }

Referenced by isValid().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines