28#include <tqdatastream.h>
29#include <tqdatetime.h>
31#include <tqmemarray.h>
41 setCreationDate( TQDateTime::currentDateTime() );
42 setModificationDate( TQDateTime::currentDateTime() );
43 setLastBackupDate( TQDateTime::currentDateTime() );
44 setType( TQString() );
45 setCreator( TQString() );
48 records.setAutoDelete(
true );
56bool PalmDB::load(
const char* filename )
60 if (!in.open (IO_ReadOnly))
64 stream.setDevice (&in);
66 unsigned filesize = stream.device()->size();
67 if( filesize < 72 )
return false;
70 stream.setByteOrder (TQDataStream::BigEndian);
78 for(
int k = 0; k < 32; k++)
80 m_name = TQString::fromLatin1( (
char*) name, 31 );
95 const int adjust = 2082844800;
100 m_creationDate.setTime_t( creation - adjust );
103 TQ_UINT32 modification;
104 stream >> modification;
105 m_modificationDate.setTime_t( modification - adjust );
108 TQ_UINT32 lastbackup;
109 stream >> lastbackup;
110 m_lastBackupDate.setTime_t( lastbackup - adjust );
117 TQ_UINT32 appid, sortid;
123 stream >> dbt[0] >> dbt[1] >> dbt[2] >> dbt[3];
124 m_type = TQString::fromLatin1( (
char*) dbt, 4 );
128 stream >> dbc[0] >> dbc[1] >> dbc[2] >> dbc[3];
129 m_creator = TQString::fromLatin1( (
char*) dbc, 4 );
134 m_uniqueIDSeed = idseed;
149 TQMemArray<unsigned> recpos( numrec );
150 TQMemArray<int> recsize( numrec );
153 for(
int r = 0; r < numrec; r++ )
156 TQ_UINT8 flag, dummy;
157 stream >> pos >> flag >> dummy >> dummy >> dummy;
158 recpos[r] = pos; recsize[r] = filesize - pos;
159 if( r> 0 ) recsize[r-1] = pos - recpos[r-1];
164 tqDebug(
"name: \"%s\"", m_name.latin1() );
165 tqDebug(
"type: \"%s\"", m_type.latin1() );
166 tqDebug(
"creator: \"%s\"", m_creator.latin1() );
167 tqDebug(
"attributes: 0x%04X", m_attributes );
168 tqDebug(
"version: 0x%04X", m_version );
169 tqDebug(
"creation date: %s", m_creationDate.toString().latin1() );
170 tqDebug(
"modification date: %s", m_modificationDate.toString().latin1() );
171 tqDebug(
"last backup date: %s", m_lastBackupDate.toString().latin1() );
172 tqDebug(
"number of records: %d", numrec );
173 for(
int r = 0; r < numrec; r++ )
174 tqDebug(
" rec %d at 0x%X size %d", r, recpos[r], recsize[r] );
179 for(
int r = 0; r < numrec; r++ )
181 TQByteArray* data =
new TQByteArray;
183 if( recpos[r] < filesize )
184 if( recsize[r] >= 0 )
186 data->resize( recsize[r] );
187 stream.device()->at( recpos[r] );
188 for(
int q = 0; q < recsize[r]; q++ )
189 { TQ_UINT8 c; stream >> c; data->at(q) = c; }
191 records.append( data );
200bool PalmDB::save(
const char* filename )
203 TQFile out( filename );
204 if( !out.open( IO_WriteOnly ) )
208 stream.setDevice( &out );
211 stream.setByteOrder (TQDataStream::BigEndian);
217 const char *dbname = m_name.latin1();
218 for(
unsigned k=0; k<31; k++ )
220 TQ_UINT8 c = (k<m_name.length()) ? dbname[k] : 0;
232 TQ_UINT16 attr = m_attributes;
236 TQ_UINT16 ver = m_version;
241 TQDateTime ref = TQDate( 1904, 1, 1 );
244 TQ_UINT32 creation = -m_creationDate.secsTo( ref );
248 TQ_UINT32 modification = -m_modificationDate.secsTo( ref );
249 stream << modification;
252 TQ_UINT32 lastbackup = -m_lastBackupDate.secsTo( ref );
253 stream << lastbackup;
256 TQ_UINT32 modnum = 0;
260 TQ_UINT32 appid = 0, sortid = 0;
266 const char *dbtype = m_type.latin1();
267 for(
int p=0; p<4; p++ ) dbt[p]=dbtype[p];
268 stream << dbt[0] << dbt[1] << dbt[2] << dbt[3];
272 const char *dbcreator = m_creator.latin1();
273 for(
int p=0; p<4; p++ ) dbc[p]=dbcreator[p];
274 stream << dbc[0] << dbc[1] << dbc[2] << dbc[3];
277 TQ_UINT32 idseed = 0;
283 TQ_UINT32 nextlist = 0;
287 TQ_UINT16 numrec = records.count();
292 TQ_UINT32 pos = 78 + 2;
293 pos += records.count()*8;
296 for(
unsigned r = 0; r < records.count(); r++ )
298 TQ_UINT8 flag = 0, dummy = 0;
301 stream << dummy << dummy << dummy;
302 pos += records.at(r)->count();
306 TQ_UINT16 filler = 0;
310 for(
unsigned r = 0; r < records.count(); r++ )
312 TQByteArray *data = records.at( r );
313 if( !data )
continue;
314 for(
unsigned j=0; j<data->count(); j++ )
316 TQ_UINT8 c = data->at( j );
327void PalmDB::setType(
const TQString& t )
330 if( m_type.length() > 4 )
331 m_type = m_type.left( 4 );
332 while( m_type.length() < 4 )
337void PalmDB::setCreator(
const TQString& c )
340 if( m_creator.length() > 4 )
341 m_type = m_creator.left( 4 );
342 while( m_creator.length() < 4 )
343 m_creator.append( 32 );