diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/inc/CNTITEM.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/inc/CNTITEM.H Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,570 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Persistence layer exports +// +// + +#if !defined(__CNTITEM_H__) +#define __CNTITEM_H__ + +#if !defined(__E32BASE_H__) +#include +#endif + +#if !defined(__CNTDEF_H__) +#include +#endif + +#if !defined(__CNTFIELD_H__) +#include +#endif + +#include + +/** Maximum length of UID string. +@publishedAll +@released +*/ +const TInt KUidStringLength =244; + +/** UID string separator character +@publishedAll +@released +*/ +#define KUidStringSeparator '-' + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +/** Constant used by vCard import/export. +@internalComponent +*/ +#define KContactMaxFieldNumber 32 +#endif + +class CContactItemField; +class CContactItemViewDef; +class CContactItem; + +/** Constant to indicate that all fields in the fieldset should be searched. +@publishedAll +@released +*/ +const TInt KContactFieldSetSearchAll=-1; + +class CContactItemFieldSet : public CBase +/** A contact item's field set. The field set owns an array of contact item fields +(CContactItemFields). The field set is owned by a contact item, and can be +retrieved using CContactItem::CardFields(). Use functions in class +CContactItem to add and remove fields to/from the field set. + +A field set can contain more than one field of the same type, but this is +not advisable as it may cause problems when synchronising the contacts database. +@publishedAll +@released +*/ + { + friend class CContactItemField; + friend class CContactDatabase; + friend class CContactTables; + friend class RPplContactTable; + friend class TCntPersistenceUtility; + +public: + IMPORT_C static CContactItemFieldSet* NewL(); + IMPORT_C static CContactItemFieldSet* NewLC(); + IMPORT_C ~CContactItemFieldSet(); + inline const CContactItemField& operator[](TInt aIndex) const; + inline CContactItemField& operator[](TInt aIndex); + inline TInt Find(TFieldType aFieldType) const; // will only find the first such occurence + inline TInt Find(TFieldType aFieldType,TUid aMapping) const; + IMPORT_C TInt FindNext(TFieldType aFieldType,TInt aStartPos=KContactFieldSetSearchAll) const; + IMPORT_C TInt FindNext(TFieldType aFieldType,TUid aMapping,TInt aStartPos=KContactFieldSetSearchAll) const; + inline TInt Count() const; + inline void Reset(); + IMPORT_C void UpdateFieldL(const CContactItemField& aField, TInt aMatchCount); + IMPORT_C void UpdateFieldSyncL(const CContactItemField& aField, TInt aMatchCount); + IMPORT_C CContactItemFieldSet& AddL(CContactItemField& aField); + IMPORT_C void Remove(TInt aIndex); + IMPORT_C void InsertL(TInt aIndex,CContactItemField& aField); + IMPORT_C void Move(TInt aFrom, TInt aTo); + IMPORT_C TStreamId StoreL(CStreamStore& aStore,RWriteStream& aTextStream,CStreamStore& aBlobStore); + TStreamId StoreL(CStreamStore& aStore,RWriteStream& aTextStream,CStreamStore& aBlobStore,CContactTables* aTables); + IMPORT_C void RestoreL(CStreamStore& aStore, TStreamId anId,CStreamStore* aBlobStore,const CContactItemViewDef& aViewDef,RReadStream& aReadStream); + IMPORT_C void RestoreL(CStreamStore& aStore, TStreamId anId,CStreamStore* aBlobStore,const CContactItemViewDef& aViewDef,const CContactItem* aTemplate, HBufC* aTextBuf); + TInt FieldText(TFieldType aFieldType, TDes &aText, TInt aStartPosition) const; + CArrayFix* ConstructFieldHeaderArrayLC(RWriteStream& aTextStream, CStreamStore& aBlobStore); + TInt FieldTypeCount(const CContactItemFieldSet& aSystemTemplateFields, TInt aStartIndex, const CContactItemField& aField) const; + TBool ContainsFieldTypeMapping(const CContentType& aBaseFieldContentType, const TFieldType& aContactFieldType) const; + void ExternalizeL(RWriteStream& aStream) const; + void InternalizeL(RReadStream& aStream); + +private: + CContactItemFieldSet(); + void ConstructL(); + void SetFieldId(CContactItemField& aField); + const CContactItemField* FindById(TInt aId) const; + IMPORT_C TStreamId StoreL(CStreamStore& aStore,const CContactItem* aTemplate,RWriteStream& aStream,CStreamStore& aBlobStore,CContactTables* aTables); + void RestoreL(CStreamStore& aStore, TStreamId anId, CStreamStore* aBlobStore,const CContactItemViewDef& aViewDef,const CContactItem* aTemplate,RReadStream& aReadStream,CContactTables* aContactsTable, RArray* aEmailIdArray); + void RestoreAndAddTemplateL(CStreamStore& aStore, TStreamId aId,CStreamStore* aBlobStore,const CContactItemViewDef& aViewDef,const CContactItem* aTemplate, RReadStream& aReadStream,CContactTables* aContactsTable,RArray* aEmailIdArray); + TInt MatchTemplateField(const CContentType& aContentType,TUint aUserFlags,TBool &aExactMatch) const; + static HBufC* LoadTextStreamLC(RReadStream& aStream); + void NonZeroFieldText(TFieldType aFieldType, TDes &aText) const; + +private: + CArrayPtr* iFields; + }; + +class CContactDatabase; +class RCntModel; +class CContactItem : public CBase +/** The abstract base class for contact cards, templates and groups. All contact +items are identified by a contact ID, (TContactItemId), have a last modified +date/time and own one or more fields (the field set). Contact items also +have an access count and attributes (e.g. hidden). Note that fields in a contact +item also have attributes. Attribute values specified in the contact item +override those in the contained fields. The access count is a record of the +number of objects referencing a contact item. A contact item cannot be fully +deleted until its access count is zero. +@publishedAll +@released +*/ + { + friend class CContactCardTemplate; + friend class CContactItemPlusGroup; + friend class CContactCard; + friend class CContactTemplate; + friend class CContactGroup; + friend class CContactOwnCard; + friend class CVCardToContactsAppConverter; + friend class CContactICCEntry; + friend class RPplContactTable; + friend class RPplIdentityTable; + friend class RPplPreferencesTable; + friend class CPackagerTests; //Comparison test + friend class CPackagerCntComparator; + friend class CContactDatabase; + friend class CPplContactItemManager; +public: + IMPORT_C ~CContactItem(); + /** Gets the contact item's type. + + @return The contact item's type. */ + virtual TUid Type() const=0; + static CContactItem* NewLC(RReadStream& aStream); + IMPORT_C static CContactItem* NewLC(TUid aType); + IMPORT_C TContactItemId Id() const; + IMPORT_C TContactItemId TemplateRefId() const; + IMPORT_C TTime LastModified() const; + IMPORT_C void SetLastModified(const TTime& aLastModified); + IMPORT_C void AddFieldL(CContactItemField& aField); + IMPORT_C void RemoveField(TInt aFieldPos); + IMPORT_C void InsertFieldL(CContactItemField& aField,TInt aFieldPos); + IMPORT_C CContactItemFieldSet& CardFields() const; + IMPORT_C void SetHidden(TBool aHidden); + IMPORT_C void SetSystem(TBool aSystem); + IMPORT_C TBool IsHidden(); + IMPORT_C TBool IsSystem(); + IMPORT_C void UpdateFieldSet(CContactItemFieldSet* aNewFieldSet); + IMPORT_C void SetDeleted(TBool aDeleted); + IMPORT_C TBool IsDeleted() const; + IMPORT_C void SetTemplateRefId(TContactItemId aUid); + TContactItemId Agent(); + inline TBool IsDeletable(); + inline void IncAccessCount(); + inline void DecAccessCount(); + inline TInt AccessCount() const; + IMPORT_C void SetUidStringL(TDesC& aString); + IMPORT_C TPtrC UidStringL(TInt64 aMachineUniqueId) const; + TStreamId PopulateStoreL(CStreamStore& aStore, CArrayFix& aFieldHeaderArray) const; + void AddLabelFieldL(); + IMPORT_C void RestoreTemplateFieldsL(const CContactItemFieldSet& aSystemTemplateFields, const CContactItemFieldSet& aTemplateFields, const CContactItemViewDef& aViewDef); + void ClearFieldContent(); + inline TPtrC Guid(); + virtual void ExternalizeL(RWriteStream& aStream) const; + virtual void InternalizeL(RReadStream& aStream); + + IMPORT_C void SetId(TContactItemId aId); + IMPORT_C TUint32 Attributes() const; + IMPORT_C void SetAttributes(TUint32 aAttributes); + IMPORT_C void SetAccessCount(TUint32 aAccessCount); + IMPORT_C void SetCreationDate(const TTime& aTime); + +public: + /** Contact item's attribute flags + + These flags can be used to set the various attributes of a contact item. */ + enum + { + /** To set the contact item's system attribute. */ + ESystem=0x01, + /** To set the contact item's hidden attribute. */ + EHidden=0x02, + /** To set the contact item's hidden attribute. */ + ECompressedGuid=0x04, + /** To set the contact item's Is deleted attribute. */ + EDeleted=0x08 + }; + +private: + CContactItem(); + void ConstructL(); + void ConstructL(const CContactItem *aTemplate); + void MakeUidStringL(TInt64 aMachineUniqueId); + IMPORT_C void SetHasCompressedGuid(TBool aCompressed); + TBool GuidIsCompressed() const; + TInt NumberOfFieldsToStore() const; + +private: + CContactItemFieldSet* iFieldSet; + TUint32 iAttributes; + TContactItemId iId; + TContactItemId iTemplateRefId; + TTime iLastModified; + TTime iCreationDate; + TUint32 iAccessCount; + HBufC* iGuid; + }; + +class CContactItemPlusGroup : public CContactItem +/** Abstract base class for CContactGroup, CContactCard and CContactOwnCard. + +The purpose of this class is to avoid duplication of group functionality +in its derived classes. +@publishedAll +@released +*/ + { +public: + IMPORT_C const CContactIdArray* GroupsJoined() const; + IMPORT_C CContactIdArray* GroupsJoinedLC() const; +protected: + CContactItemPlusGroup(); + IMPORT_C ~CContactItemPlusGroup(); +public: + virtual void ExternalizeL(RWriteStream& aStream) const; + virtual void InternalizeL(RReadStream& aStream); + + IMPORT_C void ResetGroups(); + IMPORT_C void SetGroups(CContactIdArray* aGroups); + +private: + CContactIdArray* iGroups; + friend class CContactDatabase; + friend class RPplLookupGroupsTable; + friend class RPplGroupMembershipTable; + }; + +class CContactGroup : public CContactItemPlusGroup +/** A contact group. + +A contact group is a contact item which holds a set of associated contact +item IDs. The members of the group may be contact cards, own cards, or even +other groups. The group has a label which identifies the group to users, e.g. +"family", or "colleagues". The type of a contact group is KUidContactGroup, +as returned by Type(). + +Objects of this class are constructed using CContactDatabase::CreateContactGroupL() +or CreateContactGroupLC(). These functions create the group, optionally with +a label, add it to the database, and return a pointer to it. + +To create an association between a card and a group, use CContactDatabase::AddContactToGroupL() +and to remove the association, use RemoveContactFromGroupL(). To find out +which groups a card belongs to, use CContactCard::GroupsJoinedLC() or CContactOwnCard::GroupsJoinedLC(). + +The function CContactDatabase::GetGroupIdListL() may be used to retrieve a +list of IDs for all groups in the database. +@publishedAll +@released +*/ + { +public: + IMPORT_C static CContactGroup* NewL(); + IMPORT_C static CContactGroup* NewLC(); + IMPORT_C ~CContactGroup(); +public: // from CContactItem + IMPORT_C TUid Type() const; +public: + // default sorted item array is ascending + IMPORT_C CContactIdArray* ItemsContainedLC() const; + IMPORT_C const CContactIdArray* ItemsContained() const; + IMPORT_C TBool IsSystem() const; + IMPORT_C void SetSystem(TBool aSystem); + IMPORT_C TBool ContainsItem(TContactItemId aContactId); + IMPORT_C void SetGroupLabelL(const TDesC& aLabel); + IMPORT_C TPtrC GetGroupLabelL(); + IMPORT_C TBool HasItemLabelField(); + IMPORT_C CContactIdArray* GroupsJoinedLC() const; + + IMPORT_C void AddContactL(TContactItemId aContactId); + IMPORT_C void RemoveContactL(TContactItemId aContactId); + virtual void ExternalizeL(RWriteStream& aStream) const; + virtual void InternalizeL(RReadStream& aStream); + + IMPORT_C void ResetItems(); + IMPORT_C void SetItems(CContactIdArray* aItems); + +private: + CContactGroup(); + +private: + CContactIdArray* iItems; + friend class CContactDatabase; + friend class RPplGroupMembershipTable; + }; + +class CContactCardTemplate : public CContactItem +/** A contact card template. + +This is a contact item containing a set of fields on which new contact items can +be based. Templates have a label which is a string which identifies the template +to a user. For instance, 'work template' could indicate a template used +to create contact cards in the style of a work colleague. Contact card templates +have a type of KUidContactCardTemplate, as returned by Type(). + +Objects of this class cannot be constructed directly because its constructors +are protected. Instead, use either CContactDatabase::CreateContactCardTemplateL() +or CreateContactCardTemplateLC(). These functions create a contact card template, +add it to the database, and return a pointer to it. + +The function CContactDatabase::GetCardTemplateIdListL() gets a list of the +IDs of all contact card templates in the database. +@publishedAll +@released +*/ + { + friend class CContactDatabase; + friend class CContactTables; + friend class RPplContactTable; + friend class CContactItem; +public: + IMPORT_C void SetTemplateLabelL(const TDesC& aLabel); + IMPORT_C TPtrC GetTemplateLabelL(); +protected: + IMPORT_C static CContactCardTemplate* NewL(); + IMPORT_C static CContactCardTemplate* NewLC(); + IMPORT_C static CContactCardTemplate* NewL(const CContactItem *aTemplate); + IMPORT_C static CContactCardTemplate* NewLC(const CContactItem *aTemplate); + IMPORT_C TBool HasItemLabelField(); + +/** Intended usage: Reserved to preserve future BC */ + IMPORT_C void ReservedFunction1(); +/** Intended usage: Reserved to preserve future BC */ + IMPORT_C void ReservedFunction2(); + +protected: // from CContactItem + IMPORT_C TUid Type() const; + +private: + CContactCardTemplate(); + }; + +class CContactCard : public CContactItemPlusGroup +/** A contact card. + +Implements the Type() function declared in class CContactItem. +Contact cards may optionally be constructed from a template. +@publishedAll +@released +*/ + { +public: + IMPORT_C ~CContactCard(); + IMPORT_C static CContactCard* NewL(); + IMPORT_C static CContactCard* NewLC(); + IMPORT_C static CContactCard* NewL(const CContactItem *aTemplate); + IMPORT_C static CContactCard* NewLC(const CContactItem *aTemplate); +public: // from CContactItem + IMPORT_C TUid Type() const; +public: + IMPORT_C CContactIdArray* GroupsJoinedLC() const; +private: + CContactCard(); +private: + friend class CContactDatabase; + }; + +class CContactOwnCard : public CContactItemPlusGroup +/** Own card. + +An own card is a contact card which contains information about the device's +owner. This can be sent to another compatible electronic device as a vCard. +The contact database recognises a single own card, referred to as the +current own card; its ID is returned by CContactDatabase::OwnCardId(). Like +a contact card, an own card can be a member of one or more contact card groups. +The own card type is identified by a UID of KUidContactOwnCard. + +Own cards can be constructed using either CContactDatabase::CreateOwnCardLC() +or CreateOwnCardL(). These functions create an own card, based on the system +template, add it to the database, set it as the database's current own card +and return a pointer to it. To change the database's current own card, use +CContactDatabase::SetOwnCardL(). +@publishedAll +@released +*/ + { +public: + IMPORT_C ~CContactOwnCard(); + IMPORT_C static CContactOwnCard* NewL(); + IMPORT_C static CContactOwnCard* NewLC(); + IMPORT_C static CContactOwnCard* NewL(const CContactItem *aTemplate); + IMPORT_C static CContactOwnCard* NewLC(const CContactItem *aTemplate); +public: // from CContactItem + IMPORT_C TUid Type() const; +public: + IMPORT_C CContactIdArray* GroupsJoinedLC() const; +private: + CContactOwnCard(); +private: + friend class CContactDatabase; + }; + +class CContactTemplate : public CContactItem +/** A contact item template. + +This is a contact item which is used to seed the initial field set for +other contact items. + +Non-system (i.e. user-defined) templates are implemented +by the CContactCardTemplate class. CContactCardTemplate should be +used in preference to CContactTemplate. +@publishedAll +@released +*/ + { +public: + IMPORT_C static CContactTemplate* NewL(); + IMPORT_C static CContactTemplate* NewLC(); + IMPORT_C static CContactTemplate* NewL(const CContactItem *aTemplate); + IMPORT_C static CContactTemplate* NewLC(const CContactItem *aTemplate); +public: // from CContactItem + IMPORT_C TUid Type() const; +private: + CContactTemplate(); + }; + + +class CContactICCEntry : public CContactItemPlusGroup +/** A contact ICC entry. +@publishedAll +@released +*/ + { +public: + IMPORT_C ~CContactICCEntry(); + IMPORT_C static CContactICCEntry* NewL(const CContactItem& aTemplate); + static CContactICCEntry* NewL(); +public: //from CContactItem + TUid Type() const; +private: + CContactICCEntry(); + }; + + +class ContactGuid +/** A globally unique identifier enquiry utility. + +Each contact item has a unique identifier, stored as a descriptor. It is +referred to as the 'UID string'. This is a combination of the unique +identifier of the database in which the contact item was created, the +contact item ID and the date/time of the contact item's creation. ContactGuid +provides a single static exported function to enquire whether an item was +created in a specified database. +@publishedAll +@released +*/ + { +public: + IMPORT_C static TContactItemId IsLocalContactUidString(const TDesC& aString, TInt64 aMachineUniqueId); + IMPORT_C static TBool GetCreationDate(TDes& aString, TInt64 aMachineUniqueId); + static HBufC* CreateGuidLC(const TDesC& aCreationDate,TContactItemId aId, TInt64 aMachineUniqueId); + static HBufC* CreateGuidLC(const TTime& aCreationDate,TContactItemId aId, TInt64 aMachineUniqueId); + static HBufC* CreateGuidLC(TContactItemId aId, TInt64 aMachineUniqueId); + }; + +inline const CContactItemField& CContactItemFieldSet::operator[](TInt aIndex) const +/** Gets the field located at a specified position in the field set. + +@param aIndex The position of the field in the field set. This is relative to zero. +It must be non-negative and less than the number of objects in the array, otherwise +the operator raises a panic. + +@return A const reference to an element in the array. */ + { return *(*iFields)[aIndex]; } + +inline CContactItemField& CContactItemFieldSet::operator[](TInt aIndex) +/** Gets the field located at a specified position in the field set. + +@param aIndex The position of the field in the field set. This is relative to zero. +It must be non-negative and less than the number of objects in the array, otherwise +the operator raises a panic. + +@return A non-const reference to an element in the array. */ + { return *(*iFields)[aIndex]; } + +inline TInt CContactItemFieldSet::Find(TFieldType aFieldType) const +/** Finds the first field in the field set with the specified field type. + +@param aFieldType The field type of interest. +@return If found, the index of the field within the field set, or KErrNotFound +if not found. */ + { return FindNext(aFieldType,KContactFieldSetSearchAll); } + +inline TInt CContactItemFieldSet::Find(TFieldType aFieldType,TUid aMapping) const +/** Finds the first field in the field set containing both the content type mapping +and the field type specified. + +@param aFieldType The field type of interest. +@param aMapping The content type mapping of interest. +@return If found, the index of the field within the field set, or KErrNotFound +if not found. */ + { return FindNext(aFieldType,aMapping,KContactFieldSetSearchAll); } + +inline TInt CContactItemFieldSet::Count() const +/** Gets the number of fields in the field set. + +@return The number of fields in the field set. */ + { return iFields->Count(); } + +inline void CContactItemFieldSet::Reset() +/** Deletes all fields in the field set. */ + { iFields->ResetAndDestroy(); } + +inline TBool CContactItem::IsDeletable() +/** Tests whether the contact item is deletable. + +This is true if the item's access count is zero. + +@return ETrue if deletable, EFalse if not deletable. */ + {return (iAccessCount == 0);} + +inline void CContactItem::IncAccessCount() +/** Increments the contact item's access count. */ + {iAccessCount++;} + +inline void CContactItem::DecAccessCount() +/** Decrements the contact item's access count. */ + {if(iAccessCount) iAccessCount--;} + +inline TInt CContactItem::AccessCount() const +/** Gets the contact item's access count. + +@return The item's access count. */ + {return(iAccessCount);} + +inline TPtrC CContactItem::Guid() +/** Accessor function for Contact Guid. + * This is used to cache contact items that are added during a sync. + @return Guid */ + { return iGuid ? *iGuid : TPtrC(KNullDesC); } + +#endif