[Kst] [Bug 111571] dirfile data source poorly handles error conditions.

Andrew Walker arwalker at sumusltd.com
Tue May 22 21:57:13 CEST 2007


------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=111571         
arwalker sumusltd com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From arwalker sumusltd com  2007-05-22 21:57 -------
SVN commit 667431 by arwalker:

BUG:111571 Produce a debug log message when we fail to read in data from a dirfile. A record is kept of past errors so that we don't produce a continuous stream of errors when the dirfile has a format error.

 M  +53 -8     dirfile.cpp  
 M  +1 -0      dirfile.h  


--- branches/work/kst/1.5/kst/src/datasources/dirfile/dirfile.cpp #667430:667431
 @ -18,8 +18,8  @
 #include "dirfile.h"
 #include "getdata.h"
 #include "getdata_struct.h"
+#include "kstdebug.h"
 
-
 DirFileSource::DirFileSource(KConfig *cfg, const QString& filename, const QString& type)
 : KstDataSource(cfg, filename, type) {
   if (init()) {
 @ -72,7 +72,13  @
     }
 
     _writable = true;
+  } else {
+    char error[200];
+
+    GetDataErrorString(error, 200);
+    KstDebug::self()->log(error, KstDebug::Error);
   }
+
   return update() == KstObject::UPDATE;
 }
 
 @ -94,21 +100,35  @
 
 
 int DirFileSource::readField(double *v, const QString& field, int s, int n) {
-  int err = 0;
+  int err = GD_E_OK;
+  int read;
 
   if (n < 0) {
-    return GetData(_filename.latin1(), field.left(FIELD_LENGTH).latin1(),
+    read = GetData(_filename.latin1(), field.left(FIELD_LENGTH).latin1(),
                    s, 0, /* 1st sframe, 1st samp */
                    0, 1, /* num sframes, num samps */
                    'd', (void*)v,
                    &err);
   } else {
-    return GetData(_filename.latin1(), field.left(FIELD_LENGTH).latin1(),
+    read = GetData(_filename.latin1(), field.left(FIELD_LENGTH).latin1(),
                    s, 0, /* 1st sframe, 1st samp */
                    n, 0, /* num sframes, num samps */
                    'd', (void*)v,
                    &err);
   }
+
+  if (err != GD_E_OK) {
+    if (_errors.find(field) == 0L) {
+      char error[200];
+
+      _errors.insert(field, (int*)1L);
+
+      GetDataErrorString(error, 200);
+      KstDebug::self()->log(error, KstDebug::Error);
+    }
+  }
+
+  return read;
 }
 
 
 @ -124,15 +144,34  @
 
 
 bool DirFileSource::isValidField(const QString& field) const {
-  int err = 0;
+  int err = GD_E_OK;
   GetSamplesPerFrame(_filename.latin1(), field.left(FIELD_LENGTH).latin1(), &err);
-  return err == 0;
+
+  if (err != GD_E_OK) {
+    char error[200];
+
+    GetDataErrorString(error, 200);
+    KstDebug::self()->log(error, KstDebug::Error);
+  }
+
+  return err == GD_E_OK;
 }
 
 
 int DirFileSource::samplesPerFrame(const QString &field) {
-  int err = 0;
-  return GetSamplesPerFrame(_filename.latin1(), field.left(FIELD_LENGTH).latin1(), &err);
+  int samples = 0;
+  int err = GD_E_OK;
+
+  samples = GetSamplesPerFrame(_filename.latin1(), field.left(FIELD_LENGTH).latin1(), &err);
+
+  if (err != GD_E_OK) {
+    char error[200];
+
+    GetDataErrorString(error, 200);
+    KstDebug::self()->log(error, KstDebug::Error);
+  }
+
+  return samples;
 }
 
 
 @ -222,7 +261,13  @
     for (int i = 0; i < ft->n_raw; i++) {
       fieldList.append(ft->rawEntries[i].field);
     }
+  } else {
+    char error[200];
+
+    GetDataErrorString(error, 200);
+    KstDebug::self()->log(error, KstDebug::Error);
   }
+
   return fieldList;
 }
 
--- branches/work/kst/1.5/kst/src/datasources/dirfile/dirfile.h #667430:667431
 @ -50,6 +50,7  @
     bool reset();
 
   private:
+    QDict<int>  _errors;
     int _frameCount;
 };


More information about the Kst mailing list