00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
#include "options.h"
00030
00031
#include <time.h>
00032
00033
#include <pi-dlp.h>
00034
00035
#include <qfile.h>
00036
00037
#include <klocale.h>
00038
#include <kdebug.h>
00039
00040
#include "pilotSerialDatabase.h"
00041
00042
static const char *pilotSerialDatabase_id =
00043
"$Id: pilotSerialDatabase.cc,v 1.18 2003/08/12 18:11:52 mueller Exp $";
00044
00045 PilotSerialDatabase::PilotSerialDatabase(
int linksocket,
00046
const QString &dbName,
00047 QObject *p,
const char *n) :
00048
PilotDatabase(p,n),
00049 fDBName(QString::null),
00050 fDBHandle(-1),
00051 fDBSocket(linksocket)
00052 {
00053 FUNCTIONSETUP;
00054 fDBName = dbName;
00055
00056 openDatabase();
00057
00058
00059 (
void) pilotSerialDatabase_id;
00060 }
00061
00062 PilotSerialDatabase::~PilotSerialDatabase()
00063 {
00064 FUNCTIONSETUP;
00065 closeDatabase();
00066 }
00067
00068 QString PilotSerialDatabase::dbPathName()
const
00069
{
00070 QString s = CSL1(
"Pilot:");
00071 s.append(fDBName);
00072
return s;
00073 }
00074
00075
00076
int PilotSerialDatabase::readAppBlock(
unsigned char *buffer,
int maxLen)
00077 {
00078 FUNCTIONSETUP;
00079
if (isDBOpen() ==
false)
00080 {
00081 kdError() << k_funcinfo <<
": DB not open" << endl;
00082
return -1;
00083 }
00084
return dlp_ReadAppBlock(fDBSocket, getDBHandle(), 0, (
void *) buffer,
00085 maxLen);
00086 }
00087
00088
00089
int PilotSerialDatabase::writeAppBlock(
unsigned char *buffer,
int len)
00090 {
00091 FUNCTIONSETUP;
00092
if (isDBOpen() ==
false)
00093 {
00094 kdError() << k_funcinfo <<
": DB not open" << endl;
00095
return -1;
00096 }
00097
return dlp_WriteAppBlock(fDBSocket, getDBHandle(), buffer, len);
00098 }
00099
00100
00101
int PilotSerialDatabase::recordCount()
00102 {
00103
int idlen;
00104
00105
if (isDBOpen() && dlp_ReadOpenDBInfo(fDBSocket, getDBHandle(), &idlen)>0)
00106 {
00107
return idlen;
00108 }
00109
else return -1;
00110 }
00111
00112
00113
00114 QValueList<recordid_t> PilotSerialDatabase::idList()
00115 {
00116 QValueList<recordid_t> idlist;
00117
int idlen=
recordCount();
00118
if (idlen<=0)
return idlist;
00119
00120 recordid_t *idarr=
new recordid_t[idlen];
00121
int idlenread;
00122 dlp_ReadRecordIDList (fDBSocket, getDBHandle(), 0, 0, idlen, idarr, &idlenread);
00123
00124
00125
for (idlen=0; idlen<idlenread; idlen++)
00126 {
00127 idlist.append(idarr[idlen]);
00128 }
00129
delete[] idarr;
00130
return idlist;
00131 }
00132
00133
00134
00135 PilotRecord *PilotSerialDatabase::readRecordById(recordid_t
id)
00136 {
00137 FUNCTIONSETUP;
00138
char *buffer[0xffff];
00139
int index, size, attr, category;
00140
00141
if (isDBOpen() ==
false)
00142 {
00143 kdError() << k_funcinfo <<
": DB not open" << endl;
00144
return 0L;
00145 }
00146
if (
id>0xFFFFFF)
00147 {
00148 kdError() << k_funcinfo <<
" Encountered an invalid record id "
00149 <<
id<<endl;;
00150
return 0L;
00151 }
00152
if (dlp_ReadRecordById(fDBSocket, getDBHandle(),
id, buffer, &index,
00153 &size, &attr, &category) >= 0)
00154
return new PilotRecord(buffer, size, attr, category,
id);
00155
return 0L;
00156 }
00157
00158
00159 PilotRecord *PilotSerialDatabase::readRecordByIndex(
int index)
00160 {
00161 FUNCTIONSETUP;
00162
char *buffer[0xffff];
00163
int size, attr, category;
00164 recordid_t
id;
00165
00166
if (isDBOpen() ==
false)
00167 {
00168 kdError() << k_funcinfo <<
": DB not open" << endl;
00169
return 0L;
00170 }
00171
if (dlp_ReadRecordByIndex(fDBSocket, getDBHandle(), index,
00172 (
void *) buffer, &
id, &size, &attr, &category) >= 0)
00173
return new PilotRecord(buffer, size, attr, category,
id);
00174
return 0L;
00175 }
00176
00177
00178 PilotRecord *PilotSerialDatabase::readNextRecInCategory(
int category)
00179 {
00180 FUNCTIONSETUP;
00181
char *buffer[0xffff];
00182
int index, size, attr;
00183 recordid_t
id;
00184
00185
if (isDBOpen() ==
false)
00186 {
00187 kdError() << k_funcinfo <<
": DB not open" << endl;
00188
return 0L;
00189 }
00190
if (dlp_ReadNextRecInCategory(fDBSocket, getDBHandle(),
00191 category, buffer, &
id, &index, &size, &attr) >= 0)
00192
return new PilotRecord(buffer, size, attr, category,
id);
00193
return 0L;
00194 }
00195
00196
00197 PilotRecord *PilotSerialDatabase::readNextModifiedRec(
int *ind)
00198 {
00199 FUNCTIONSETUP;
00200
char *buffer[0xffff];
00201
int index, size, attr, category;
00202 recordid_t
id;
00203
00204
if (isDBOpen() ==
false)
00205 {
00206 kdError() << k_funcinfo <<
": DB not open" << endl;
00207
return 0L;
00208 }
00209
if (dlp_ReadNextModifiedRec(fDBSocket, getDBHandle(), (
void *) buffer,
00210 &
id, &index, &size, &attr, &category) >= 0)
00211 {
00212
if (ind) *ind=index;
00213
return new PilotRecord(buffer, size, attr, category,
id);
00214 }
00215
return 0L;
00216 }
00217
00218
00219 recordid_t PilotSerialDatabase::writeRecord(PilotRecord * newRecord)
00220 {
00221 FUNCTIONSETUP;
00222 recordid_t newid;
00223
int success;
00224
00225
if (isDBOpen() ==
false)
00226 {
00227 kdError() << k_funcinfo <<
": DB not open" << endl;
00228
return 0;
00229 }
00230
00231
00232
00233
00234
if (newRecord->getID()>0xFFFFFF)
00235 {
00236 kdError() << k_funcinfo <<
"Encountered an invalid record id "
00237 <<newRecord->getID()<<
", resetting it to zero.";
00238 newRecord->setID(0);
00239 }
00240 success =
00241 dlp_WriteRecord(fDBSocket, getDBHandle(),
00242 newRecord->getAttrib(), newRecord->getID(),
00243 newRecord->getCat(), newRecord->getData(),
00244 newRecord->getLen(), &newid);
00245
if ( (newRecord->getID() != newid) && (newid!=0) )
00246 newRecord->setID(newid);
00247
return newid;
00248 }
00249
00250
00251
int PilotSerialDatabase::deleteRecord(recordid_t
id,
bool all)
00252 {
00253 FUNCTIONSETUP;
00254
if (isDBOpen() ==
false)
00255 {
00256 kdError() << k_funcinfo <<
": DB not open"<<endl;
00257
return -1;
00258 }
00259
return dlp_DeleteRecord(fDBSocket, getDBHandle(), all?1:0,
id);
00260 }
00261
00262
00263
00264
int PilotSerialDatabase::resetSyncFlags()
00265 {
00266 FUNCTIONSETUP;
00267
if (isDBOpen() ==
false)
00268 {
00269 kdError() << k_funcinfo <<
": DB not open" << endl;
00270
return -1;
00271 }
00272
return dlp_ResetSyncFlags(fDBSocket, getDBHandle());
00273 }
00274
00275
00276
int PilotSerialDatabase::resetDBIndex()
00277 {
00278 FUNCTIONSETUP;
00279
if (isDBOpen() ==
false)
00280 {
00281 kdError() << k_funcinfo <<
": DB not open" << endl;
00282
return -1;
00283 }
00284
return dlp_ResetDBIndex(fDBSocket, getDBHandle());
00285 }
00286
00287
00288
int PilotSerialDatabase::cleanup()
00289 {
00290 FUNCTIONSETUP;
00291
if (isDBOpen() ==
false)
00292 {
00293 kdError() << k_funcinfo <<
": DB not open" << endl;
00294
return -1;
00295 }
00296
return dlp_CleanUpDatabase(fDBSocket, getDBHandle());
00297 }
00298
00299
void PilotSerialDatabase::openDatabase()
00300 {
00301 FUNCTIONSETUP;
00302
int db;
00303
00304
if (dlp_OpenDB(fDBSocket, 0, dlpOpenReadWrite,
00305 QFile::encodeName(getDBName()).data(), &db) < 0)
00306 {
00307 kdError() << k_funcinfo
00308 << i18n(
"Cannot open database")
00309 << i18n(
"Pilot database error") << endl;
00310
return;
00311 }
00312 setDBHandle(db);
00313 setDBOpen(
true);
00314 }
00315
00316
bool PilotSerialDatabase::createDatabase(
long creator,
long type,
int cardno,
int flags,
int version)
00317 {
00318 FUNCTIONSETUP;
00319
int db;
00320
00321
00322
if (isDBOpen())
return true;
00323
00324
int res=dlp_CreateDB(fDBSocket,
00325 creator, type, cardno, flags, version,
00326 getDBName().latin1(), &db);
00327
if (res<0) {
00328 kdError() <<k_funcinfo
00329 << i18n(
"Cannot create database %1 on the handheld").arg(getDBName())<<endl;
00330
return false;
00331 }
00332
00333 setDBHandle(db);
00334 setDBOpen(
true);
00335
return true;
00336 }
00337
00338
void PilotSerialDatabase::closeDatabase()
00339 {
00340 FUNCTIONSETUP;
00341
if (!isDBOpen() )
return;
00342
00343 dlp_CloseDB(fDBSocket, getDBHandle());
00344 setDBOpen(
false);
00345 }
00346
00347
int PilotSerialDatabase::deleteDatabase()
00348 {
00349 FUNCTIONSETUP;
00350
00351
if (isDBOpen()) closeDatabase();
00352
00353
return dlp_DeleteDB(fDBSocket, 0, fDBName.latin1());
00354 }
00355
00356