filters
palmdb.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "palmdb.h"
00026
00027 #include <qcstring.h>
00028 #include <qdatastream.h>
00029 #include <qdatetime.h>
00030 #include <qfile.h>
00031 #include <qmemarray.h>
00032 #include <qptrlist.h>
00033 #include <qstring.h>
00034
00035 PalmDB::PalmDB()
00036 {
00037
00038 setName( "Unnamed" );
00039 setAttributes( 0 );
00040 setVersion( 0 );
00041 setCreationDate( QDateTime::currentDateTime() );
00042 setModificationDate( QDateTime::currentDateTime() );
00043 setLastBackupDate( QDateTime::currentDateTime() );
00044 setType( QString::null );
00045 setCreator( QString::null );
00046
00047
00048 records.setAutoDelete( TRUE );
00049 }
00050
00051 PalmDB::~PalmDB()
00052 {
00053 records.clear();
00054 }
00055
00056 bool PalmDB::load( const char* filename )
00057 {
00058
00059 QFile in (filename);
00060 if (!in.open (IO_ReadOnly))
00061 return FALSE;
00062
00063 QDataStream stream;
00064 stream.setDevice (&in);
00065
00066 unsigned filesize = stream.device()->size();
00067 if( filesize < 72 ) return FALSE;
00068
00069
00070 stream.setByteOrder (QDataStream::BigEndian);
00071
00072
00073
00074
00075
00076
00077 Q_UINT8 name[32];
00078 for(int k = 0; k < 32; k++)
00079 stream >> name[k];
00080 m_name = QString::fromLatin1( (char*) name, 31 );
00081
00082
00083 Q_UINT16 attr;
00084 stream >> attr;
00085 m_attributes = attr;
00086
00087
00088 Q_UINT16 ver;
00089 stream >> ver;
00090 m_version = ver;
00091
00092
00093
00094
00095 const int adjust = 2082844800;
00096
00097
00098 Q_UINT32 creation;
00099 stream >> creation;
00100 m_creationDate.setTime_t( creation - adjust );
00101
00102
00103 Q_UINT32 modification;
00104 stream >> modification;
00105 m_modificationDate.setTime_t( modification - adjust );
00106
00107
00108 Q_UINT32 lastbackup;
00109 stream >> lastbackup;
00110 m_lastBackupDate.setTime_t( lastbackup - adjust );
00111
00112
00113 Q_UINT32 modnum;
00114 stream >> modnum;
00115
00116
00117 Q_UINT32 appid, sortid;
00118 stream >> appid;
00119 stream >> sortid;
00120
00121
00122 Q_UINT8 dbt[4];
00123 stream >> dbt[0] >> dbt[1] >> dbt[2] >> dbt[3];
00124 m_type = QString::fromLatin1( (char*) dbt, 4 );
00125
00126
00127 Q_UINT8 dbc[4];
00128 stream >> dbc[0] >> dbc[1] >> dbc[2] >> dbc[3];
00129 m_creator = QString::fromLatin1( (char*) dbc, 4 );
00130
00131
00132 Q_UINT32 idseed;
00133 stream >> idseed;
00134 m_uniqueIDSeed = idseed;
00135
00136
00137
00138
00139
00140 Q_UINT32 nextlist;
00141 stream >> nextlist;
00142
00143
00144 Q_UINT16 numrec;
00145 stream >> numrec;
00146
00147
00148
00149 QMemArray<unsigned> recpos( numrec );
00150 QMemArray<int> recsize( numrec );
00151
00152
00153 for( int r = 0; r < numrec; r++ )
00154 {
00155 Q_UINT32 pos;
00156 Q_UINT8 flag, dummy;
00157 stream >> pos >> flag >> dummy >> dummy >> dummy;
00158 recpos[r] = pos; recsize[r] = filesize - pos;
00159 if( r> 0 ) recsize[r-1] = pos - recpos[r-1];
00160 }
00161
00162
00163 #ifdef PDB_DEBUG
00164 qDebug( "name: \"%s\"", m_name.latin1() );
00165 qDebug( "type: \"%s\"", m_type.latin1() );
00166 qDebug( "creator: \"%s\"", m_creator.latin1() );
00167 qDebug( "attributes: 0x%04X", m_attributes );
00168 qDebug( "version: 0x%04X", m_version );
00169 qDebug( "creation date: %s", m_creationDate.toString().latin1() );
00170 qDebug( "modification date: %s", m_modificationDate.toString().latin1() );
00171 qDebug( "last backup date: %s", m_lastBackupDate.toString().latin1() );
00172 qDebug( "number of records: %d", numrec );
00173 for( int r = 0; r < numrec; r++ )
00174 qDebug( " rec %d at 0x%X size %d", r, recpos[r], recsize[r] );
00175 #endif
00176
00177
00178 records.clear();
00179 for( int r = 0; r < numrec; r++ )
00180 {
00181 QByteArray* data = new QByteArray;
00182
00183 if( recpos[r] < filesize )
00184 if( recsize[r] >= 0 )
00185 {
00186 data->resize( recsize[r] );
00187 stream.device()->at( recpos[r] );
00188 for( int q = 0; q < recsize[r]; q++ )
00189 { Q_UINT8 c; stream >> c; data->at(q) = c; }
00190 }
00191 records.append( data );
00192 }
00193
00194
00195 in.close();
00196
00197 return TRUE;
00198 }
00199
00200 bool PalmDB::save( const char* filename )
00201 {
00202
00203 QFile out( filename );
00204 if( !out.open( IO_WriteOnly ) )
00205 return FALSE;
00206
00207 QDataStream stream;
00208 stream.setDevice( &out );
00209
00210
00211 stream.setByteOrder (QDataStream::BigEndian);
00212
00213
00214
00215
00216 setName( name() );
00217 const char *dbname = m_name.latin1();
00218 for( unsigned k=0; k<31; k++ )
00219 {
00220 Q_UINT8 c = (k<m_name.length()) ? dbname[k] : 0;
00221 stream << c;
00222 }
00223 {
00224
00225 Q_UINT8 c = 0;
00226 stream << c;
00227 }
00228
00229
00230
00231
00232 Q_UINT16 attr = m_attributes;
00233 stream << attr;
00234
00235
00236 Q_UINT16 ver = m_version;
00237 stream << ver;
00238
00239
00240
00241 QDateTime ref = QDate( 1904, 1, 1 );
00242
00243
00244 Q_UINT32 creation = -m_creationDate.secsTo( ref );
00245 stream << creation;
00246
00247
00248 Q_UINT32 modification = -m_modificationDate.secsTo( ref );
00249 stream << modification;
00250
00251
00252 Q_UINT32 lastbackup = -m_lastBackupDate.secsTo( ref );
00253 stream << lastbackup;
00254
00255
00256 Q_UINT32 modnum = 0;
00257 stream << modnum;
00258
00259
00260 Q_UINT32 appid = 0, sortid = 0;
00261 stream << appid;
00262 stream << sortid;
00263
00264
00265 Q_UINT8 dbt[4];
00266 const char *dbtype = m_type.latin1();
00267 for( int p=0; p<4; p++ ) dbt[p]=dbtype[p];
00268 stream << dbt[0] << dbt[1] << dbt[2] << dbt[3];
00269
00270
00271 Q_UINT8 dbc[4];
00272 const char *dbcreator = m_creator.latin1();
00273 for( int p=0; p<4; p++ ) dbc[p]=dbcreator[p];
00274 stream << dbc[0] << dbc[1] << dbc[2] << dbc[3];
00275
00276
00277 Q_UINT32 idseed = 0;
00278 stream << idseed;
00279
00280
00281
00282
00283 Q_UINT32 nextlist = 0;
00284 stream << nextlist;
00285
00286
00287 Q_UINT16 numrec = records.count();
00288 stream << numrec;
00289
00290
00291
00292 Q_UINT32 pos = 78 + 2;
00293 pos += records.count()*8;
00294
00295
00296 for( unsigned r = 0; r < records.count(); r++ )
00297 {
00298 Q_UINT8 flag = 0, dummy = 0;
00299 stream << pos;
00300 stream << flag;
00301 stream << dummy << dummy << dummy;
00302 pos += records.at(r)->count();
00303 }
00304
00305
00306 Q_UINT16 filler = 0;
00307 stream << filler;
00308
00309
00310 for( unsigned r = 0; r < records.count(); r++ )
00311 {
00312 QByteArray *data = records.at( r );
00313 if( !data ) continue;
00314 for( unsigned j=0; j<data->count(); j++ )
00315 {
00316 Q_UINT8 c = data->at( j );
00317 stream << c;
00318 }
00319 }
00320
00321
00322 out.close();
00323
00324 return TRUE;
00325 }
00326
00327 void PalmDB::setType( const QString& t )
00328 {
00329 m_type = t;
00330 if( m_type.length() > 4 )
00331 m_type = m_type.left( 4 );
00332 while( m_type.length() < 4 )
00333 m_type.append( 32 );
00334 }
00335
00336
00337 void PalmDB::setCreator( const QString& c )
00338 {
00339 m_creator = c;
00340 if( m_creator.length() > 4 )
00341 m_type = m_creator.left( 4 );
00342 while( m_creator.length() < 4 )
00343 m_creator.append( 32 );
00344 }
|