• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
binfilehelper.cpp
Go to the documentation of this file.
1 
2 /***************************************************************************
3  binfilehelper.cpp - K Desktop Planetarium
4  -------------------
5  begin : Sat May 31 2008
6  copyright : (C) 2008 by Akarsh Simha
7  email : akarshsimha@gmail.com
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 #include "binfilehelper.h"
20 
21 #include <kstandarddirs.h>
22 #include <kde_file.h>
23 #include "byteorder.h"
24 
25 class BinFileHelper;
26 
27 BinFileHelper::BinFileHelper() {
28  fileHandle = NULL;
29  init();
30 }
31 
32 BinFileHelper::~BinFileHelper() {
33  qDeleteAll( fields );
34  if( fileHandle )
35  closeFile();
36 }
37 
38 void BinFileHelper::init() {
39  if(fileHandle)
40  fclose(fileHandle);
41  fileHandle = NULL;
42  indexUpdated = false;
43  FDUpdated = false;
44  RSUpdated = false;
45  preambleUpdated = false;
46  byteswap = false;
47  errnum = ERR_NULL;
48  recordCount = 0;
49 }
50 
51 void BinFileHelper::clearFields() {
52  qDeleteAll( fields );
53  fields.clear();
54 }
55 
56 bool BinFileHelper::testFileExists( const QString &fileName ) {
57  QString FilePath = KStandardDirs::locate( "appdata", fileName );
58  QByteArray b = FilePath.toAscii();
59  const char *filepath = b.data();
60  FILE *f = KDE_fopen(filepath, "rb");
61  if( f ) {
62  fclose( f );
63  return true;
64  }
65  else
66  return false;
67 }
68 
69 FILE *BinFileHelper::openFile(const QString &fileName) {
70  QString FilePath = KStandardDirs::locate( "appdata", fileName );
71  init();
72  QByteArray b = FilePath.toAscii();
73  const char *filepath = b.data();
74 
75  fileHandle = KDE_fopen(filepath, "rb");
76 
77  if(!fileHandle) {
78  errnum = ERR_FILEOPEN;
79  return NULL;
80  }
81  return fileHandle;
82 }
83 
84 enum BinFileHelper::Errors BinFileHelper::__readHeader() {
85  int i;
86  qint16 endian_id;
87  char ASCII_text[125];
88  dataElement *de;
89 
90  // Read the preamble
91  if(!fileHandle)
92  return ERR_FILEOPEN;
93 
94  rewind(fileHandle);
95 
96  fread(ASCII_text, 124, 1, fileHandle);
97  ASCII_text[124] = '\0';
98  headerText = ASCII_text;
99 
100  fread(&endian_id, 2, 1, fileHandle);
101  if(endian_id != 0x4B53)
102  byteswap = 1;
103  else
104  byteswap = 0;
105 
106  fread( &versionNumber, 1, 1, fileHandle );
107 
108  preambleUpdated = true;
109  // Read the field descriptor table
110  fread(&nfields, 2, 1, fileHandle);
111  if( byteswap ) nfields = bswap_16( nfields );
112  fields.clear();
113  for(i = 0; i < nfields; ++i) {
114  de = new dataElement;
115  if(!fread(de, sizeof(dataElement), 1, fileHandle)) {
116  delete de;
117  return ERR_FD_TRUNC;
118  }
119  if( byteswap ) de->scale = bswap_32( de->scale );
120  fields.append( de );
121  }
122 
123  if(!RSUpdated) {
124  recordSize = 0;
125  for(i = 0; i < fields.size(); ++i)
126  recordSize += fields[i] -> size;
127  RSUpdated = true;
128  }
129 
130  FDUpdated = true;
131 
132  // Read the index table
133  fread(&indexSize, 4, 1, fileHandle);
134  if( byteswap ) indexSize = bswap_32( indexSize );
135 
136  quint32 ID;
137  quint32 offset;
138  quint32 prev_offset;
139  quint32 nrecs;
140  quint32 prev_nrecs;
141 
142  itableOffset = KDE_ftell(fileHandle);
143 
144  prev_offset = 0;
145  prev_nrecs = 0;
146  recordCount = 0;
147 
148  indexCount.clear();
149  indexOffset.clear();
150 
151  if( indexSize == 0 ) {
152  errorMessage.sprintf( "Zero index size!" );
153  return ERR_INDEX_TRUNC;
154  }
155  for(i = 0; i < indexSize; ++i) {
156  if(!fread(&ID, 4, 1, fileHandle)) {
157  errorMessage.sprintf("Table truncated before expected! Read i = %d index entries so far", i);
158  return ERR_INDEX_TRUNC;
159  }
160  if( byteswap ) ID = bswap_32( ID );
161  if(ID >= indexSize) {
162  errorMessage.sprintf("ID %u is greater than the expected number of expected entries (%u)", ID, indexSize);
163  return ERR_INDEX_BADID;
164  }
165  if(ID != i) {
166  errorMessage.sprintf("Found ID %u, at the location where ID %u was expected", ID, i);
167  return ERR_INDEX_IDMISMATCH;
168  }
169  if(!fread(&offset, 4, 1, fileHandle)) {
170  errorMessage.sprintf("Table truncated before expected! Read i = %d index entries so far", i);
171  return ERR_BADSEEK;
172  }
173  if( byteswap ) offset = bswap_32( offset );
174  if(!fread(&nrecs, 4, 1, fileHandle)) {
175  errorMessage.sprintf("Table truncated before expected! Read i = %d index entries so far", i);
176  return ERR_BADSEEK;
177  }
178  if( byteswap ) nrecs = bswap_32( nrecs );
179  if(prev_offset != 0 && prev_nrecs != (-prev_offset + offset)/recordSize) {
180  errorMessage.sprintf("Expected %u = (%X - %x) / %x records, but found %u, in index entry %u",
181  (offset - prev_offset) / recordSize, offset, prev_offset, recordSize, prev_nrecs, i - 1);
182  return ERR_INDEX_BADOFFSET;
183  }
184 
185  indexOffset.append( offset );
186  indexCount.append( nrecs );
187 
188  recordCount += nrecs;
189  prev_offset = offset;
190  prev_nrecs = nrecs;
191  }
192 
193  dataOffset = KDE_ftell(fileHandle);
194 
195  indexUpdated = true;
196 
197  return ERR_NULL;
198 }
199 
200 bool BinFileHelper::readHeader() {
201  switch( (errnum = __readHeader()) ) {
202  case ERR_NULL:
203  return true;
204  break;
205  case ERR_FILEOPEN:
206  return false;
207  break;
208  case ERR_FD_TRUNC:
209  clearFields();
210  break;
211  case ERR_INDEX_TRUNC:
212  case ERR_INDEX_BADID:
213  case ERR_INDEX_IDMISMATCH:
214  case ERR_BADSEEK:
215  case ERR_INDEX_BADOFFSET: {
216  indexOffset.clear();
217  indexCount.clear();
218  }
219  }
220  return false;
221 }
222 
223 void BinFileHelper::closeFile() {
224  fclose(fileHandle);
225  fileHandle = NULL;
226 }
227 
228 int BinFileHelper::getErrorNumber() {
229  int err = errnum;
230  errnum = ERR_NULL;
231  return err;
232 }
233 
234 QString BinFileHelper::getError() {
235  QString erm = errorMessage;
236  errorMessage = "";
237  return erm;
238 }
239 
240 struct dataElement BinFileHelper::getField(const QString &fieldName) {
241  dataElement de;
242  for(int i = 0; i < fields.size(); ++i) {
243  if(fields[i] -> name == fieldName) {
244  de = *fields[i];
245  return de;
246  }
247  }
248  return de; // Returns junk!
249 }
250 
251 bool BinFileHelper::isField(const QString &fieldName) {
252  for(int i = 0; i < fields.size(); ++i) {
253  if(fields[i] -> name == fieldName)
254  return true;
255  }
256  return false;
257 }
258 
259 int BinFileHelper::unsigned_KDE_fseek( FILE *stream, quint32 offset, int whence ) {
260  Q_ASSERT( stream );
261  int ret = 0;
262  if( offset <= ((quint32)1 << 31) - 1 ) {
263  ret = fseek( stream, offset, whence );
264  }
265  else {
266  // Do the fseek in two steps
267  ret = fseek( stream, ((quint32)1 << 31) - 1, whence );
268  if( !ret )
269  ret = fseek( stream, offset - ((quint32)1 << 31) + 1, SEEK_CUR );
270  }
271  return ret;
272 }
273 
BinFileHelper::closeFile
void closeFile()
Close the binary data file.
Definition: binfilehelper.cpp:223
BinFileHelper::ERR_FILEOPEN
Definition: binfilehelper.h:224
BinFileHelper::isField
bool isField(const QString &FieldName)
Check whether a field exists.
Definition: binfilehelper.cpp:251
BinFileHelper::ERR_NULL
Definition: binfilehelper.h:223
BinFileHelper::ERR_INDEX_BADID
Definition: binfilehelper.h:227
BinFileHelper::getError
QString getError()
Get error string.
Definition: binfilehelper.cpp:234
NaN::f
const float f
Definition: nan.h:36
BinFileHelper::testFileExists
static bool testFileExists(const QString &fileName)
Checks if a file exists.
Definition: binfilehelper.cpp:56
BinFileHelper::ERR_INDEX_BADOFFSET
Definition: binfilehelper.h:229
BinFileHelper
This class provides utility functions to handle binary data files in the format prescribed by KStars...
Definition: binfilehelper.h:52
BinFileHelper::openFile
FILE * openFile(const QString &fileName)
WARNING: This function may not be compatible in other locales, because it calls QString::toAscii.
Definition: binfilehelper.cpp:69
dataElement
A structure describing a data field in the file.
Definition: binfilehelper.h:33
BinFileHelper::getErrorNumber
int getErrorNumber()
Get error number.
Definition: binfilehelper.cpp:228
bswap_32
#define bswap_32(x)
Definition: byteorder.h:52
dataElement
struct dataElement dataElement
A structure describing a data field in the file.
dataElement::scale
qint32 scale
Definition: binfilehelper.h:37
BinFileHelper::~BinFileHelper
~BinFileHelper()
Destructor.
Definition: binfilehelper.cpp:32
BinFileHelper::ERR_FD_TRUNC
Definition: binfilehelper.h:225
BinFileHelper::ERR_INDEX_TRUNC
Definition: binfilehelper.h:226
byteorder.h
dataElement::name
char name[10]
Definition: binfilehelper.h:34
BinFileHelper::readHeader
bool readHeader()
Read the header and index table from the file and fill up the QVector s with the entries.
Definition: binfilehelper.cpp:200
binfilehelper.h
BinFileHelper::ERR_INDEX_IDMISMATCH
Definition: binfilehelper.h:228
BinFileHelper::unsigned_KDE_fseek
static int unsigned_KDE_fseek(FILE *stream, quint32 offset, int whence)
Wrapper around fseek for large offsets.
Definition: binfilehelper.cpp:259
BinFileHelper::Errors
Errors
An enum providing user-friendly names for errors encountered.
Definition: binfilehelper.h:222
BinFileHelper::BinFileHelper
BinFileHelper()
Constructor.
Definition: binfilehelper.cpp:27
bswap_16
#define bswap_16(x)
Definition: byteorder.h:47
BinFileHelper::ERR_BADSEEK
Definition: binfilehelper.h:230
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal