summaryrefslogtreecommitdiffstats
path: root/kpilot/lib/pilotAppInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'kpilot/lib/pilotAppInfo.h')
-rw-r--r--kpilot/lib/pilotAppInfo.h216
1 files changed, 216 insertions, 0 deletions
diff --git a/kpilot/lib/pilotAppInfo.h b/kpilot/lib/pilotAppInfo.h
new file mode 100644
index 000000000..d5db9e358
--- /dev/null
+++ b/kpilot/lib/pilotAppInfo.h
@@ -0,0 +1,216 @@
+#ifndef _KPILOT_PILOTAPPINFO_H
+#define _KPILOT_PILOTAPPINFO_H
+/* pilotAppInfo.h KPilot
+**
+** Copyright (C) 2005-2006 Adriaan de Groot <[email protected]>
+**
+*/
+
+/*
+** 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 [email protected]
+*/
+
+#include "pilotLinkVersion.h"
+
+#include "pilot.h"
+#include "pilotDatabase.h"
+
+/**
+* A database on the handheld has an "AppInfo" block at the beginning
+* with some database-specific information and a common part.
+* This base class deals with the common part, the categories.
+*
+* Most data in the handheld is stored in @em categories ; every
+* record in every database, for instance, has a category assigned
+* to it (perhaps "Unfiled", but that's just another category).
+*
+* Every database has a category table assigning labels to the
+* categories that exist. There are CATEGORY_COUNT (16) categories
+* available for each database; labels may vary per database.
+*
+* This class encapsulates the basic category table manipulations.
+*/
+class KDE_EXPORT PilotAppInfoBase
+{
+protected:
+ /** Initialize class members after reading header, to alias data elsewhere.
+ * Only for use by the (derived) template classes below.
+ */
+ void init(struct CategoryAppInfo *c, int len)
+ {
+ fC = c;
+ fLen = len ;
+ } ;
+
+public:
+ /** Constructor. This is for use by derived classes (using the template below
+ * only, and says that the category info in the base class aliases data in
+ * the derived class. Remember to call init()!
+ */
+ PilotAppInfoBase() : fC(0L), fLen(0), fOwn(false) { } ;
+
+ /** Constructor, intended for untyped access to the AppInfo only. This throws
+ * away everything but the category information. In this variety, the
+ * CategoryAppInfo structure is owned by the PilotAppInfoBase object.
+ */
+ PilotAppInfoBase(PilotDatabase *d);
+
+ /** Destructor. */
+ virtual ~PilotAppInfoBase();
+
+ /** Retrieve the most basic part of the AppInfo block -- the category
+ * information which is guaranteed to be the first 240-odd bytes of
+ * a database.
+ */
+ struct CategoryAppInfo *categoryInfo()
+ {
+ return fC;
+ } ;
+
+ /** Const version of the above function. */
+ inline const struct CategoryAppInfo *categoryInfo() const
+ {
+ return fC;
+ } ;
+
+ /** Returns the length of the (whole) AppInfo block. */
+ inline PI_SIZE_T length() const
+ {
+ return fLen;
+ } ;
+
+ /** @see findCategory(const QString &name, bool unknownIsUnfiled, struct CategoryAppInfo *info). */
+ inline int findCategory(const QString &name, bool unknownIsUnfiled = false) const
+ {
+ return Pilot::findCategory(fC,name,unknownIsUnfiled);
+ } ;
+
+ /** Gets a single category name. Returns QString::null if there is no
+ * such category number @p i . */
+ inline QString categoryName(unsigned int i) const
+ {
+ return Pilot::categoryName(fC,i);
+ }
+
+ /** Sets a category name. @return true if this succeeded. @return false
+ * on failure, e.g. the index @p i was out of range or the category name
+ * was invalid. Category names that are too long are truncated to 15 characters.
+ */
+ bool setCategoryName(unsigned int i, const QString &s);
+
+ /** For debugging, display all the category names */
+ inline void dump() const
+ {
+ Pilot::dumpCategories(fC);
+ };
+
+protected:
+ struct CategoryAppInfo *fC;
+ PI_SIZE_T fLen;
+
+ bool fOwn;
+} ;
+
+/** A template class for reading and interpreting AppInfo blocks;
+* the idea is that it handles all the boilerplate code for reading
+* the app block, converting it to the right kind, and then unpacking
+* it. Template parameters are the type (struct, from pilot-link probably)
+* of the interpreted appinfo, and the pack and unpack functions for it
+* (again, from pilot-link).
+*/
+template <typename appinfo,
+#if PILOT_LINK_IS(0,12,2)
+ /* There are additional consts introduced in 0.12.2 */
+ int(*unpack)(appinfo *, const unsigned char *, PI_SIZE_T),
+ int(*pack)(const appinfo *, unsigned char *, PI_SIZE_T)
+#else
+ int(*unpack)(appinfo *, unsigned char *, PI_SIZE_T),
+ int(*pack)(appinfo *, unsigned char *, PI_SIZE_T)
+#endif
+ >
+class PilotAppInfo : public PilotAppInfoBase
+{
+public:
+ /** Constructor. Read the appinfo from database @p d and
+ * interpret it.
+ */
+ PilotAppInfo(PilotDatabase *d) : PilotAppInfoBase()
+ {
+ int appLen = Pilot::MAX_APPINFO_SIZE;
+ unsigned char buffer[Pilot::MAX_APPINFO_SIZE];
+
+ memset(&fInfo,0,sizeof(fInfo));
+ if (d && d->isOpen())
+ {
+ appLen = d->readAppBlock(buffer,appLen);
+ (*unpack)(&fInfo, buffer, appLen);
+ // fInfo is just a struct, so we can point to it anyway.
+ init(&fInfo.category,appLen);
+ }
+ else
+ {
+ delete fC;
+ fC = 0L;
+ fLen = 0;
+ init(&fInfo.category,sizeof(fInfo));
+ }
+ } ;
+
+ PilotAppInfo()
+ {
+ memset(&fInfo,0,sizeof(fInfo));
+ init(&fInfo.category,sizeof(fInfo));
+ }
+
+
+ /** Write this appinfo block to the database @p d; returns
+ * the number of bytes written or -1 on failure. This
+ * function is robust when called with a NULL database @p d.
+ */
+ int writeTo(PilotDatabase *d)
+ {
+ unsigned char buffer[Pilot::MAX_APPINFO_SIZE];
+ if (!d || !d->isOpen())
+ {
+ return -1;
+ }
+ int appLen = (*pack)(&fInfo, buffer, length());
+ if (appLen > 0)
+ {
+ d->writeAppBlock(buffer,appLen);
+ }
+ return appLen;
+ } ;
+
+ /** Returns a (correctly typed) pointer to the interpreted
+ * appinfo block.
+ */
+ appinfo *info() { return &fInfo; } ;
+ /** Returns a const (correctly typed) pointer to the interpreted
+ * appinfo block.
+ */
+ const appinfo *info() const { return &fInfo; } ;
+
+protected:
+ appinfo fInfo;
+} ;
+
+
+#endif