You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
340 lines
10 KiB
340 lines
10 KiB
#ifndef _KPILOT_PILOTADDRESS_H
|
|
#define _KPILOT_PILOTADDRESS_H
|
|
/* pilotAddress.h KPilot
|
|
**
|
|
** Copyright (C) 1998-2001 by Dan Pilone
|
|
** Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
|
|
** Copyright (C) 2007 by Adriaan de Groot <groot@kde.org>
|
|
**
|
|
** This is a wrapper for pilot-link's address structures.
|
|
*/
|
|
|
|
/*
|
|
** 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 <pi-macros.h>
|
|
#include <pi-address.h>
|
|
|
|
#include <qnamespace.h>
|
|
|
|
#include "pilotRecord.h"
|
|
#include "pilotAppInfo.h"
|
|
|
|
/** Interpreted form of the AppInfo block in the address database. */
|
|
typedef PilotAppInfo<
|
|
AddressAppInfo,
|
|
unpack_AddressAppInfo,
|
|
pack_AddressAppInfo> PilotAddressInfo_;
|
|
|
|
/** This class exists @em only to clear up the type mess that
|
|
* is the field-numbers-and-indexes for phone numbers in the
|
|
* handheld records. The standard address record has 19 fields,
|
|
* five of which are phone fields. Those are fields 3..7 and they
|
|
* are referred to as fields Phone1 .. Phone5. Sometimes we
|
|
* need to act as if the phone field numbers are indeed the field
|
|
* numbers (3..7) and sometimes we need to use those same field
|
|
* numbers to index into a C array (0 based!) so then we map
|
|
* field number 3 (Phone1) to a 0 index.
|
|
*
|
|
* Also handles iteration nicely.
|
|
*
|
|
* A phone slot value may be invalid. If so, operations on it will
|
|
* fail (yielding invalid again) and isValid() will return @c false.
|
|
*/
|
|
class PhoneSlot
|
|
{
|
|
friend class PilotAddress;
|
|
protected:
|
|
/** Constructor. Use the specified value for the phone slot.
|
|
* @p v is a field number (3..8).
|
|
*/
|
|
explicit PhoneSlot( const int v );
|
|
|
|
/** Assignment operator. Set the value of the slot to
|
|
* the specified value @p v . This may yield an invalid
|
|
* phone slot.
|
|
*/
|
|
const PhoneSlot &operator=(const int &v);
|
|
|
|
/** Map the slot to an offset (for use in finding the phone type
|
|
* for a given slot).
|
|
* @return Offset of this slot within the phone fields.
|
|
*/
|
|
unsigned int toOffset() const;
|
|
|
|
/** Map the slot to a field number. */
|
|
unsigned int toField() const;
|
|
|
|
public:
|
|
static const int invalid = -1; ///< Value for invalid slots. */
|
|
|
|
/** Constructor. The slot is invalid. */
|
|
PhoneSlot()
|
|
{
|
|
i = invalid;
|
|
}
|
|
|
|
/** Comparison operator. */
|
|
bool operator ==( const PhoneSlot &v ) const
|
|
{
|
|
return v.i == i;
|
|
}
|
|
|
|
/** Iterator operation. Go to the next slot (or invalid when
|
|
* the range runs out).
|
|
*/
|
|
const PhoneSlot &operator++();
|
|
|
|
/** Begin value of an iteration through the phone slots. */
|
|
static const PhoneSlot begin();
|
|
|
|
/** When the slot range runs out (past entryPhone5) it
|
|
* is invalid, so the end compares with that.
|
|
*/
|
|
static const PhoneSlot end();
|
|
|
|
/** Valid slots are entryPhone1 (3) through entryPhone5 (7).
|
|
* @return @c true if the slot is valid.
|
|
*/
|
|
bool isValid() const
|
|
{
|
|
return (entryPhone1 <= i) && (i <= entryPhone5);
|
|
}
|
|
|
|
operator QString() const;
|
|
private:
|
|
int i;
|
|
} ;
|
|
|
|
|
|
class PilotAddressInfo : public PilotAddressInfo_
|
|
{
|
|
public:
|
|
PilotAddressInfo(PilotDatabase *d) : PilotAddressInfo_(d)
|
|
{
|
|
}
|
|
|
|
/** This resets the entire AppInfo block to one as it would be
|
|
* in an English-language handheld, with 3 categories and
|
|
* default field labels for everything.
|
|
*/
|
|
void resetToDefault();
|
|
|
|
enum EPhoneType {
|
|
eWork=0,
|
|
eHome,
|
|
eFax,
|
|
eOther,
|
|
eEmail,
|
|
eMain,
|
|
ePager,
|
|
eMobile,
|
|
eNone=-1
|
|
} ;
|
|
|
|
QString phoneLabel(EPhoneType i) const;
|
|
} ;
|
|
|
|
/** @brief A wrapper class around the Address struct provided by pi-address.h
|
|
*
|
|
* This class allows the user to set and get address field values.
|
|
* For everything but phone fields, the user can simply pass the
|
|
* the pi-address enum for the index for setField() and getField() such
|
|
* as entryLastname.
|
|
*
|
|
* Phone fields are a bit trickier. The structure allows for 8 possible
|
|
* phone fields with 5 possible slots. That means there could be three
|
|
* fields that don't have available storage. The setPhoneField() method
|
|
* will attempt to store the extra fields in a custom field if there
|
|
* is an overflow.
|
|
*
|
|
* There are eight possible fields for 5 view slots:
|
|
* - fields: Work, Home, Fax, Other, Pager, Mobile, E-mail, Main
|
|
* - slots: entryPhone1, entryPhone2, entryPhone3, entryPhone4, entryPhone5
|
|
*
|
|
* Internally in the pilot-link library, the AddressAppInfo phone
|
|
* array stores the strings for the eight possible phone values.
|
|
* Their English string values are :
|
|
* - phone[0] = Work
|
|
* - phone[1] = Home
|
|
* - phone[2] = Fax
|
|
* - phone[3] = Other
|
|
* - phone[4] = E-mail
|
|
* - phone[5] = Main
|
|
* - phone[6] = Pager
|
|
* - phone[7] = Mobile
|
|
*
|
|
* Apparently, this order is kept for all languages, just with localized
|
|
* strings. The implementation of the internal methods will assume
|
|
* this order is kept. In other languages, main can replaced with
|
|
* Corporation.
|
|
*/
|
|
class KDE_EXPORT PilotAddress : public PilotRecordBase
|
|
{
|
|
public:
|
|
PilotAddress(PilotRecord *rec = 0L);
|
|
PilotAddress(const PilotAddress ©From);
|
|
PilotAddress& operator=( const PilotAddress &r );
|
|
bool operator==(const PilotAddress &r);
|
|
|
|
virtual ~PilotAddress();
|
|
|
|
/** Returns a text representation of the address. If @p richText is true, the
|
|
* text will be formatted with Qt-HTML tags. The AppInfo structure @p info
|
|
* is used to figure out the phone labels; if it is NULL then bogus labels are
|
|
* used to identify phone types.
|
|
*/
|
|
QString getTextRepresentation(const PilotAddressInfo *info, Qt::TextFormat richText) const;
|
|
|
|
/**
|
|
* @param text set the field value
|
|
* @param field int values associated with the enum defined in
|
|
* pi-address.h.
|
|
* The copied possible enum's are: (copied from pi-address.h on 1/12/01)
|
|
* enum { entryLastname, entryFirstname, entryCompany,
|
|
* entryPhone1, entryPhone2, entryPhone3, entryPhone4, entryPhone5,
|
|
* entryAddress, entryCity, entryState, entryZip, entryCountry,
|
|
* entryTitle, entryCustom1, entryCustom2, entryCustom3, entryCustom4,
|
|
* entryNote };
|
|
*/
|
|
void setField(int field, const QString &text);
|
|
/** Set a field @p i to a given text value. Uses the phone slots only. */
|
|
void setField(const PhoneSlot &i, const QString &t)
|
|
{
|
|
if (i.isValid())
|
|
{
|
|
setField(i.toField(),t);
|
|
}
|
|
}
|
|
|
|
/** Returns the text value of a given field @p field (or QString::null
|
|
* if there is no such field).
|
|
*/
|
|
QString getField(int field) const;
|
|
/** Returns the value of the phone field @p i . */
|
|
QString getField(const PhoneSlot &i) const
|
|
{
|
|
return i.isValid() ? getField(i.toField()) : QString();
|
|
}
|
|
|
|
/**
|
|
* Return list of all email addresses. This will search through our "phone"
|
|
* fields and will return only those which are e-mail addresses.
|
|
*/
|
|
QStringList getEmails() const;
|
|
void setEmails(const QStringList &emails);
|
|
|
|
enum PhoneHandlingFlags
|
|
{
|
|
NoFlags=0, ///< No special handling
|
|
Replace ///< Replace existing entries of same type
|
|
} ;
|
|
|
|
/**
|
|
* @param type is the type of phone
|
|
* @param checkCustom4 flag if true, checks the entryCustom4 field
|
|
* for extra phone fields
|
|
* @return the field associated with the type
|
|
*/
|
|
QString getPhoneField(PilotAddressInfo::EPhoneType type) const;
|
|
|
|
/**
|
|
* @param type is the type of phone
|
|
* @param field is value to store
|
|
* @param overflowCustom is true, and entryPhone1 to entryPhone5 is full
|
|
* it will use entryCustom4 field to store the field
|
|
* @param overwriteExisting is true, it will overwrite an existing record-type
|
|
* with the field, else it will always search for the first available slot
|
|
* @return index of the field that this information was set to
|
|
*/
|
|
PhoneSlot setPhoneField(PilotAddressInfo::EPhoneType type, const QString &value, PhoneHandlingFlags flags);
|
|
|
|
/**
|
|
* Returns the slot of the phone number
|
|
* selected by the user to be shown in the
|
|
* overview of addresses.
|
|
*
|
|
* @return Slot of phone entry (between entryPhone1 and entryPhone5)
|
|
*/
|
|
PhoneSlot getShownPhone() const;
|
|
|
|
/**
|
|
* Set the shown phone (the one preferred by the user for display
|
|
* on the handheld's overview page) to the @em type (not index)
|
|
* indicated. Looks through the phone entries of this record to
|
|
* find the first one one of this type.
|
|
*
|
|
* @return Slot of phone entry.
|
|
*
|
|
* @note Sets the shown phone to the first entry if no field of
|
|
* type @p phoneType can be found @em and no Home phone
|
|
* field (the fallback) can be found either.
|
|
*/
|
|
PhoneSlot setShownPhone(PilotAddressInfo::EPhoneType phoneType);
|
|
|
|
/**
|
|
* Set the shown phone (the one preferred by the user for display
|
|
* on the handheld's overview page) to the given @p slot .
|
|
*
|
|
* @return @p v
|
|
*/
|
|
const PhoneSlot &setShownPhone(const PhoneSlot &v);
|
|
|
|
/** Get the phone type (label) for a given field @p field
|
|
* in the record. The @p field must be within the
|
|
* phone range (entryPhone1 .. entryPhone5).
|
|
*
|
|
* @return Phone type for phone field @p field .
|
|
* @return @c eNone (fake phone type) if @p field is invalid.
|
|
*/
|
|
PilotAddressInfo::EPhoneType getPhoneType(const PhoneSlot &field) const;
|
|
|
|
PilotRecord *pack() const;
|
|
|
|
const struct Address *address() const { return &fAddressInfo; } ;
|
|
|
|
|
|
protected:
|
|
// Get the pointers in cases where no conversion to
|
|
// unicode is desired.
|
|
//
|
|
const char *getFieldP(int field) const
|
|
{
|
|
return fAddressInfo.entry[field];
|
|
}
|
|
|
|
private:
|
|
void _copyAddressInfo(const struct Address ©From);
|
|
PhoneSlot _getNextEmptyPhoneSlot() const;
|
|
|
|
/** @return entryPhone1 to entryPhone5 if the appTypeNum number is
|
|
* found in the phoneLabel array; return -1 if not found
|
|
*/
|
|
PhoneSlot _findPhoneFieldSlot(PilotAddressInfo::EPhoneType t) const;
|
|
|
|
struct Address fAddressInfo;
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|