diff options
Diffstat (limited to 'kpilot/lib/pilotSerialDatabase.cc')
-rw-r--r-- | kpilot/lib/pilotSerialDatabase.cc | 432 |
1 files changed, 0 insertions, 432 deletions
diff --git a/kpilot/lib/pilotSerialDatabase.cc b/kpilot/lib/pilotSerialDatabase.cc deleted file mode 100644 index f57cac934..000000000 --- a/kpilot/lib/pilotSerialDatabase.cc +++ /dev/null @@ -1,432 +0,0 @@ -/* KPilot -** -** Copyright (C) 1998-2001 by Dan Pilone -** Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> -** -** Databases approached through DLP / Pilot-link look different, -** so this file defines an API for them. -*/ - -/* -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU Lesser General Public License as published by -** the Free Software Foundation; either version 2.1 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public License -** along with this program in a file called COPYING; if not, write to -** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -** MA 02110-1301, USA. -*/ - -/* -** Bug reports and questions can be sent to kde-pim@kde.org -*/ -#include "options.h" - -#include <time.h> -#include <iostream> - -#include <pi-dlp.h> - -#include <tqfile.h> - -#include <klocale.h> -#include <kdebug.h> -#include <kglobal.h> - -#include "pilotRecord.h" -#include "pilotSerialDatabase.h" -#include "kpilotdevicelink.h" - -PilotSerialDatabase::PilotSerialDatabase(KPilotDeviceLink *l, - const TQString &dbName) : - PilotDatabase(dbName), - fDBName( dbName ), - fDBHandle(-1), - fDBSocket(l->pilotSocket()) -{ - FUNCTIONSETUP; - openDatabase(); -} - -PilotSerialDatabase::PilotSerialDatabase( KPilotDeviceLink *l, const DBInfo *info ) : - PilotDatabase( info ? Pilot::fromPilot( info->name ) : TQString::null ), - fDBName( TQString::null ), - fDBHandle( -1 ), - fDBSocket( l->pilotSocket() ) -{ - // Rather unclear why both the base class and this one have separate names. - fDBName = name(); - setDBOpen(false); - if (fDBName.isEmpty() || !info) - { - WARNINGKPILOT << "Bad database name requested." << endl; - return; - } - - int db; - if (dlp_OpenDB(fDBSocket, 0, dlpOpenReadWrite, info->name, &db) < 0) - { - WARNINGKPILOT << "Cannot open database on handheld." << endl; - return; - } - setDBHandle(db); - setDBOpen(true); -} - -PilotSerialDatabase::~PilotSerialDatabase() -{ - FUNCTIONSETUP; - closeDatabase(); -} - -TQString PilotSerialDatabase::dbPathName() const -{ - TQString s = CSL1("Pilot:"); - s.append(fDBName); - return s; -} - -// Reads the application block info -int PilotSerialDatabase::readAppBlock(unsigned char *buffer, int maxLen) -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return -1; - } - pi_buffer_t *buf = pi_buffer_new(maxLen); - int r = dlp_ReadAppBlock(fDBSocket, getDBHandle(), 0 /* offset */, maxLen, buf); - if (r>=0) - { - memcpy(buffer, buf->data, KMAX(maxLen, r)); - } - pi_buffer_free(buf); - return r; -} - -// Writes the application block info. -int PilotSerialDatabase::writeAppBlock(unsigned char *buffer, int len) -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return -1; - } - return dlp_WriteAppBlock(fDBSocket, getDBHandle(), buffer, len); -} - - // returns the number of records in the database -unsigned int PilotSerialDatabase::recordCount() const -{ - int idlen; - // dlp_ReadOpenDBInfo returns the number of bytes read and sets idlen to the # of recs - if (isOpen() && dlp_ReadOpenDBInfo(fDBSocket, getDBHandle(), &idlen)>0) - { - return idlen; - } - else - { - return 0; - } -} - - -// Returns a TQValueList of all record ids in the database. -TQValueList<recordid_t> PilotSerialDatabase::idList() -{ - TQValueList<recordid_t> idlist; - int idlen=recordCount(); - if (idlen<=0) return idlist; - - recordid_t *idarr=new recordid_t[idlen]; - int idlenread; - int r = dlp_ReadRecordIDList (fDBSocket, getDBHandle(), 0, 0, idlen, idarr, &idlenread); - - if ( (r<0) || (idlenread<1) ) - { - WARNINGKPILOT << "Failed to read ID list from database." << endl; - return idlist; - } - - // now create the QValue list from the idarr: - for (idlen=0; idlen<idlenread; idlen++) - { - idlist.append(idarr[idlen]); - } - delete[] idarr; - return idlist; -} - - -// Reads a record from database by id, returns record length -PilotRecord *PilotSerialDatabase::readRecordById(recordid_t id) -{ - FUNCTIONSETUPL(3); - int index, attr, category; - - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return 0L; - } - if (id>0xFFFFFF) - { - WARNINGKPILOT << "Encountered an invalid record id " - << id << endl; - return 0L; - } - pi_buffer_t *b = pi_buffer_new(InitialBufferSize); - if (dlp_ReadRecordById(fDBSocket,getDBHandle(),id,b,&index,&attr,&category) >= 0) - { - return new PilotRecord(b, attr, category, id); - } - return 0L; -} - -// Reads a record from database, returns the record length -PilotRecord *PilotSerialDatabase::readRecordByIndex(int index) -{ - FUNCTIONSETUPL(3); - - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return 0L; - } - - int attr, category; - recordid_t id; - PilotRecord *rec = 0L; - - pi_buffer_t *b = pi_buffer_new(InitialBufferSize); - if (dlp_ReadRecordByIndex(fDBSocket, getDBHandle(), index, - b, &id, &attr, &category) >= 0) - { - rec = new PilotRecord(b, attr, category, id); - } - - - return rec; -} - -// Reads the next record from database in category 'category' -PilotRecord *PilotSerialDatabase::readNextRecInCategory(int category) -{ - FUNCTIONSETUP; - int index, attr; - recordid_t id; - - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return 0L; - } - pi_buffer_t *b = pi_buffer_new(InitialBufferSize); - if (dlp_ReadNextRecInCategory(fDBSocket, getDBHandle(), - category,b,&id,&index,&attr) >= 0) - return new PilotRecord(b, attr, category, id); - return 0L; -} - -// Reads the next record from database that has the dirty flag set. -PilotRecord *PilotSerialDatabase::readNextModifiedRec(int *ind) -{ - FUNCTIONSETUP; - int index, attr, category; - recordid_t id; - - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return 0L; - } - pi_buffer_t *b = pi_buffer_new(InitialBufferSize); - if (dlp_ReadNextModifiedRec(fDBSocket, getDBHandle(), b, &id, &index, &attr, &category) >= 0) - { - if (ind) *ind=index; - return new PilotRecord(b, attr, category, id); - } - return 0L; -} - -// Writes a new record to database (if 'id' == 0 or id>0xFFFFFF, one will be assigned and returned in 'newid') -recordid_t PilotSerialDatabase::writeRecord(PilotRecord * newRecord) -{ - FUNCTIONSETUP; - recordid_t newid; - int success; - - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return 0; - } - // Do some sanity checking to prevent invalid UniqueIDs from being written - // to the handheld (RecordIDs are only 3 bytes!!!). Under normal conditions - // this check should never yield true, so write out an error to indicate - // someone messed up full time... - if (newRecord->id()>0xFFFFFF) - { - WARNINGKPILOT << "Encountered an invalid record id " - << newRecord->id() << ", resetting it to zero." << endl; - newRecord->setID(0); - } - success = - dlp_WriteRecord(fDBSocket, getDBHandle(), - newRecord->attributes(), newRecord->id(), - newRecord->category(), newRecord->data(), - newRecord->size(), &newid); - if ( (newRecord->id() != newid) && (newid!=0) ) - newRecord->setID(newid); - return newid; -} - -// Deletes a record with the given recordid_t from the database, or all records, if all is set to true. The recordid_t will be ignored in this case -int PilotSerialDatabase::deleteRecord(recordid_t id, bool all) -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT <<"DB not open"<<endl; - return -1; - } - return dlp_DeleteRecord(fDBSocket, getDBHandle(), all?1:0, id); -} - - -// Resets all records in the database to not dirty. -int PilotSerialDatabase::resetSyncFlags() -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return -1; - } - return dlp_ResetSyncFlags(fDBSocket, getDBHandle()); -} - -// Resets next record index to beginning -int PilotSerialDatabase::resetDBIndex() -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return -1; - } - return dlp_ResetDBIndex(fDBSocket, getDBHandle()); -} - -// Purges all Archived/Deleted records from Palm Pilot database -int PilotSerialDatabase::cleanup() -{ - FUNCTIONSETUP; - if (!isOpen()) - { - WARNINGKPILOT << "DB not open" << endl; - return -1; - } - return dlp_CleanUpDatabase(fDBSocket, getDBHandle()); -} - -void PilotSerialDatabase::openDatabase() -{ - FUNCTIONSETUP; - int db; - - setDBOpen(false); - - TQString s = getDBName(); - if (s.isEmpty()) - { - WARNINGKPILOT << "Bad DB name, " << s << " string given." << endl; - return; - } - - TQCString encodedName = TQFile::encodeName(s); - if (encodedName.isEmpty()) - { - WARNINGKPILOT << "Bad DB name, " - << (encodedName.isNull() ? "null" : "empty") - << " string given." - << endl; - return; - } - - char encodedNameBuffer[PATH_MAX]; - strlcpy(encodedNameBuffer,(const char *)encodedName,PATH_MAX); - - DEBUGKPILOT << fname << ": opening database: [" - << encodedNameBuffer << "]" << endl; - - if (dlp_OpenDB(fDBSocket, 0, dlpOpenReadWrite, - encodedNameBuffer, &db) < 0) - { - WARNINGKPILOT << "Cannot open database on handheld." << endl; - return; - } - setDBHandle(db); - setDBOpen(true); -} - -bool PilotSerialDatabase::createDatabase(long creator, long type, int cardno, int flags, int version) -{ - FUNCTIONSETUP; - int db; - - // if the database is already open, we cannot create it again. How about completely resetting it? (i.e. deleting it and the createing it again) - if (isOpen()) return true; - // The latin1 seems ok, database names are latin1. - int res=dlp_CreateDB(fDBSocket, - creator, type, cardno, flags, version, - Pilot::toPilot(getDBName()), &db); - if (res<0) { - WARNINGKPILOT << "Cannot create database " << getDBName() << " on the handheld" << endl; - return false; - } - // TODO: Do I have to open it explicitly??? - setDBHandle(db); - setDBOpen(true); - return true; -} - -void PilotSerialDatabase::closeDatabase() -{ - FUNCTIONSETUP; - if (!isOpen() ) - { - return; - } - - DEBUGKPILOT << fname << ": Closing DB handle #" << getDBHandle() << endl; - dlp_CloseDB(fDBSocket, getDBHandle()); - DEBUGKPILOT << fname << ": after closing" << endl; - setDBOpen(false); -} - -int PilotSerialDatabase::deleteDatabase() -{ - FUNCTIONSETUP; - - if (isOpen()) closeDatabase(); - - return dlp_DeleteDB(fDBSocket, 0, Pilot::toPilot(fDBName)); -} - - - -/* virtual */ PilotDatabase::DBType PilotSerialDatabase::dbType() const -{ - return eSerialDB; -} - |