#ifndef _KPILOT_PILOTLOCALDATABASE_H #define _KPILOT_PILOTLOCALDATABASE_H /* KPilot ** ** Copyright (C) 1998-2001 by Dan Pilone ** Copyright (C) 2003-2004 Reinhold Kainhofer ** Copyright (C) 2006 Adriaan de Groot ** */ /* ** 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 "pilotDatabase.h" /** @file * Defines the PilotLocalDatabase class, for databases stored * on disk (as opposed to in a handheld). */ /** * PilotLocalDatabase represents databases in the same binary format * as on the handheld but which are stored on local disk. */ class KDE_EXPORT PilotLocalDatabase : public PilotDatabase { public: /** * Opens the local database. If the database cannot be found at the * given position, a default path is used * ($KDEHOME/share/apps/kpilot/DBBackup) * and if the file is found there, it is opened. In some cases this should * not be done, so the parameter useDefaultPath controls this behavior. * If it is set to true, the default path is used if the file cannot be * found in the explicitly given location. If it is set to false and * the database cannot be found, no database is opened. It can then be * created explicitly at the specified location. */ PilotLocalDatabase( const TQString& path, const TQString& name, bool useDefaultPath=true); /** * Opens the local database. This is primarily for testing * purposes; only tries the given path. */ PilotLocalDatabase(const TQString &name); virtual ~PilotLocalDatabase(); /** Creates the database with the given creator, type and flags on * the given card (default is RAM). If the database already exists, * this function does nothing. */ virtual bool createDatabase(long creator=0, long type=0, int cardno=0, int flags=0, int version=0); /** Deletes the database (by name, as given in the constructor * and stored in the fDBName field. ) */ virtual int deleteDatabase(); // Reads the application block info virtual int readAppBlock(unsigned char* buffer, int maxLen); // Writes the application block info. virtual int writeAppBlock(unsigned char* buffer, int len); // returns the number of records in the database, 0 if not open virtual unsigned int recordCount() const; // Returns a TQValueList of all record ids in the database. virtual TQValueList idList(); // Reads a record from database by id, returns record virtual PilotRecord* readRecordById(recordid_t id); // Reads a record from database, returns the record virtual PilotRecord* readRecordByIndex(int index); // Reads the next record from database in category 'category' virtual PilotRecord* readNextRecInCategory(int category); /** * Returns the next "new" record, ie. the next record * that has not been synced yet. These records all have ID=0, so are * not easy to find with the other methods. The record is the one * contained in the database, not a copy like the read*() functions * give you -- so be careful with it. Don't delete it, in any case. * Casting it to non-const and marking it deleted is OK, though, * which is mostly its intended use. */ const PilotRecord *findNextNewRecord(); /** * Reads the next record from database that has the dirty flag set. * ind (if a valid pointer is given) will receive the index of the * returned record. */ virtual PilotRecord* readNextModifiedRec(int *ind=0L); // Writes a new record to database (if 'id' == 0, none is assigned, either) virtual recordid_t writeRecord(PilotRecord* newRecord); /** * 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. Return value is negative on error, 0 otherwise. */ virtual int deleteRecord(recordid_t id, bool all=false); // Resets all records in the database to not dirty. virtual int resetSyncFlags(); // Resets next record index to beginning virtual int resetDBIndex(); // Purges all Archived/Deleted records from Palm Pilot database virtual int cleanup(); /** Update the ID of the current record in the database with * the specified @param id . This is allowed only after * reading or writing a modified or new record. */ virtual recordid_t updateID(recordid_t id); /** Return the name of the database (as it would be on the handheld). */ TQString getDBName() const { return fDBName; } /** * Returns the full path of the current database, based on * the path and dbname passed to the constructor, and including * the .pdb extension. */ virtual TQString dbPathName() const; /** * Accessor functions for the application info block. */ int appInfoSize() const { if (isOpen()) return fAppLen; else return -1; } ; char *appInfo() { return fAppInfo; } ; const struct DBInfo &getDBInfo() const { return fDBInfo; } void setDBInfo(const struct DBInfo &dbi) {fDBInfo=dbi; } virtual DBType dbType() const; /** Reads local file @p path and fills in the DBInfo * structure @p d with the DBInfo from the file. * * @return @c false if d is NULL * @return @c false if the file @p path does not exist * @return @c true if reading the DBInfo succeeds * * @note Relatively expensive operation, since the pilot-link * library doesn't provide a cheap way of getting this * information. */ static bool infoFromFile( const TQString &path, DBInfo *d ); protected: // Changes any forward slashes to underscores void fixupDBName(); virtual void openDatabase(); virtual void closeDatabase(); private: struct DBInfo fDBInfo; TQString fPathName,fDBName; char* fAppInfo; size_t fAppLen; class Private; Private *d; public: /** * For databases opened by name only (constructor 2 -- which is the * preferred one, too) try this path first before the default path. * Set statically so it's shared for all local databases. */ static void setDBPath(const TQString &); /** * Accessor for the extra search path. */ static const TQString &getDBPath() { return *fPathBase; } ; private: static TQString *fPathBase; }; #endif